1/* eslint-disable */ 2this.BX = this.BX || {}; 3(function (exports) { 4 'use strict'; 5 6 /* 7 * Dexie.js - a minimalistic wrapper for IndexedDB 8 * =============================================== 9 * 10 * By David Fahlander, [email protected] 11 * 12 * Version 3.2.2, Wed Apr 27 2022 13 * 14 * https://dexie.org 15 * 16 * Apache License Version 2.0, January 2004, http://www.apache.org/licenses/ 17 */ 18 19 /** 20 * Modify list for integration with Bitrix Framework: 21 * - removed integration with third-party package builders; 22 * - add check variables before using them, see tags: 28122018; 23 * - add alternative Promise check for Bitrix Cli, see tags: 02032020; 24 * - add export for work in Bitrix CoreJS extensions; 25 * - add export BX.Dexie for backward compatibility; 26 */ 27 28 /*! ***************************************************************************** 29 Copyright (c) Microsoft Corporation. 30 Permission to use, copy, modify, and/or distribute this software for any 31 purpose with or without fee is hereby granted. 32 THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 33 REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 34 AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 35 INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 36 LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 37 OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 38 PERFORMANCE OF THIS SOFTWARE. 39 ***************************************************************************** */ 40 var _assign = function __assign() { 41 _assign = Object.assign || function __assign(t) { 42 for (var s, i = 1, n = arguments.length; i < n; i++) { 43 s = arguments[i]; 44 for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p]; 45 } 46 return t; 47 }; 48 return _assign.apply(this, arguments); 49 }; 50 function __spreadArray(to, from, pack) { 51 if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) { 52 if (ar || !(i in from)) { 53 if (!ar) ar = Array.prototype.slice.call(from, 0, i); 54 ar[i] = from[i]; 55 } 56 } 57 return to.concat(ar || Array.prototype.slice.call(from)); 58 } 59 var _global = typeof globalThis !== 'undefined' ? globalThis : typeof self !== 'undefined' ? self : typeof window !== 'undefined' ? window : global; 60 var keys = Object.keys; 61 var isArray = Array.isArray; 62 if (typeof Promise !== 'undefined' && !_global.Promise) { 63 _global.Promise = Promise; 64 } 65 function extend(obj, extension) { 66 if (babelHelpers["typeof"](extension) !== 'object') return obj; 67 keys(extension).forEach(function (key) { 68 obj[key] = extension[key]; 69 }); 70 return obj; 71 } 72 var getProto = Object.getPrototypeOf; 73 var _hasOwn = {}.hasOwnProperty; 74 function hasOwn(obj, prop) { 75 return _hasOwn.call(obj, prop); 76 } 77 function props(proto, extension) { 78 if (typeof extension === 'function') extension = extension(getProto(proto)); 79 // tag start 28122018 80 if (babelHelpers["typeof"](extension) !== 'object') return; 81 // tag end 28122018 82 (typeof Reflect === "undefined" ? keys : Reflect.ownKeys)(extension).forEach(function (key) { 83 setProp(proto, key, extension[key]); 84 }); 85 } 86 var defineProperty = Object.defineProperty; 87 function setProp(obj, prop, functionOrGetSet, options) { 88 defineProperty(obj, prop, extend(functionOrGetSet && hasOwn(functionOrGetSet, "get") && typeof functionOrGetSet.get === 'function' ? { 89 get: functionOrGetSet.get, 90 set: functionOrGetSet.set, 91 configurable: true 92 } : { 93 value: functionOrGetSet, 94 configurable: true, 95 writable: true 96 }, options)); 97 } 98 function derive(Child) { 99 return { 100 from: function from(Parent) { 101 Child.prototype = Object.create(Parent.prototype); 102 setProp(Child.prototype, "constructor", Child); 103 return { 104 extend: props.bind(null, Child.prototype) 105 }; 106 } 107 }; 108 } 109 var getOwnPropertyDescriptor = Object.getOwnPropertyDescriptor; 110 function getPropertyDescriptor(obj, prop) { 111 var pd = getOwnPropertyDescriptor(obj, prop); 112 var proto; 113 return pd || (proto = getProto(obj)) && getPropertyDescriptor(proto, prop
113); 114 } 115 var _slice = [].slice; 116 function slice(args, start, end) { 117 return _slice.call(args, start, end); 118 } 119 function override(origFunc, overridedFactory) { 120 return overridedFactory(origFunc); 121 } 122 function assert(b) { 123 if (!b) throw new Error("Assertion Failed"); 124 } 125 function asap$1(fn) { 126 if (_global.setImmediate) setImmediate(fn);else setTimeout(fn, 0); 127 } 128 function arrayToObject(array, extractor) { 129 return array.reduce(function (result, item, i) { 130 var nameAndValue = extractor(item, i); 131 if (nameAndValue) result[nameAndValue[0]] = nameAndValue[1]; 132 return result; 133 }, {}); 134 } 135 function tryCatch(fn, onerror, args) { 136 try { 137 fn.apply(null, args); 138 } catch (ex) { 139 onerror && onerror(ex); 140 } 141 } 142 function getByKeyPath(obj, keyPath) { 143 if (hasOwn(obj, keyPath)) return obj[keyPath]; 144 if (!keyPath) return obj; 145 if (typeof keyPath !== 'string') { 146 var rv = []; 147 for (var i = 0, l = keyPath.length; i < l; ++i) { 148 var val = getByKeyPath(obj, keyPath[i]); 149 rv.push(val); 150 } 151 return rv; 152 } 153 var period = keyPath.indexOf('.'); 154 if (period !== -1) { 155 var innerObj = obj[keyPath.substr(0, period)]; 156 return innerObj === undefined ? undefined : getByKeyPath(innerObj, keyPath.substr(period + 1)); 157 } 158 return undefined; 159 } 160 function setByKeyPath(obj, keyPath, value) { 161 if (!obj || keyPath === undefined) return; 162 if ('isFrozen' in Object && Object.isFrozen(obj)) return; 163 if (typeof keyPath !== 'string' && 'length' in keyPath) { 164 assert(typeof value !== 'string' && 'length' in value); 165 for (var i = 0, l = keyPath.length; i < l; ++i) { 166 setByKeyPath(obj, keyPath[i], value[i]); 167 } 168 } else { 169 var period = keyPath.indexOf('.'); 170 if (period !== -1) { 171 var currentKeyPath = keyPath.substr(0, period); 172 var remainingKeyPath = keyPath.substr(period + 1); 173 if (remainingKeyPath === "") { 174 if (value === undefined) { 175 if (isArray(obj) && !isNaN(parseInt(currentKeyPath))) obj.splice(currentKeyPath, 1);else delete obj[currentKeyPath]; 176 } else obj[currentKeyPath] = value; 177 } else { 178 var innerObj = obj[currentKeyPath]; 179 if (!innerObj || !hasOwn(obj, currentKeyPath)) innerObj = obj[currentKeyPath] = {}; 180 setByKeyPath(innerObj, remainingKeyPath, value); 181 } 182 } else { 183 if (value === undefined) { 184 if (isArray(obj) && !isNaN(parseInt(keyPath))) obj.splice(keyPath, 1);else delete obj[keyPath]; 185 } else obj[keyPath] = value; 186 } 187 } 188 } 189 function delByKeyPath(obj, keyPath) { 190 if (typeof keyPath === 'string') setByKeyPath(obj, keyPath, undefined);else if ('length' in keyPath) [].map.call(keyPath, function (kp) { 191 setByKeyPath(obj, kp, undefined); 192 }); 193 } 194 function shallowClone(obj) { 195 var rv = {}; 196 for (var m in obj) { 197 if (hasOwn(obj, m)) rv[m] = obj[m]; 198 } 199 return rv; 200 } 201 var concat = [].concat; 202 function flatten(a) { 203 return concat.apply([], a); 204 } 205 var intrinsicTypeNames = "Boolean,String,Date,RegExp,Blob,File,FileList,FileSystemFileHandle,ArrayBuffer,DataView,Uint8ClampedArray,ImageBitmap,ImageData,Map,Set,CryptoKey".split(',').concat(flatten([8, 16, 32, 64].map(function (num) { 206 return ["Int", "Uint", "Float"].map(function (t) { 207 return t + num + "Array"; 208 }); 209 }))).filter(function (t) { 210 return _global[t]; 211 }); 212 var intrinsicTypes = intrinsicTypeNames.map(function (t) { 213 return _global[t]; 214 }); 215 arrayToObject(intrinsicTypeNames, function (x) { 216 return [x, true]; 217 }); 218 var circularRefs = null; 219 function deepClone(any) { 220 circularRefs = typeof WeakMap !== 'undefined' && new WeakMap(); 221 var rv = innerDeepClone(any); 222 circularRefs = null; 223 return rv; 224 } 225 function innerDeepClone(any) { 226 if (!any || babelHelpers["typeof"](any) !== 'object') return any; 227 var rv = circularRefs && circularRefs.get(any); 228 if (rv) return rv; 229 if (isArray(any)) { 230 rv = []; 231 circularRefs && circularRefs.set(any, rv); 232 for (var i = 0, l = any.length; i < l; ++i) { 233 rv.push(innerDeepClone(any[i])); 234 } 235 } else if (intrinsicTypes.indexOf(any.constructor) >= 0) { 236 rv = any; 237 } else { 238 var proto = getProto(any); 239 rv = proto === Object.prototype ? {} : Object.create(proto); 240 circularRefs && circularRefs.set(any, rv); 241 for (var prop in any) { 242 if (hasOwn(any, prop)) { 243 rv[prop] = innerDeepClone(any[prop]); 244 } 245 } 246 } 247 return rv; 248 } 249 var toString = {}.toString; 250 function toStringTag(o) { 251 return toString.call(o).slice(8, -1); 252 } 253 var iteratorSymbol = typeof Symbol !== 'undefined' ? Symbol.iterator : '@@iterator'; 254 var getIteratorOf = babelHelpers["typeof"](iteratorSymbol) === "symbol" ? function (x) { 255 var i; 256 return x != null && (i = x[iteratorSymbol]) && i.apply(x); 257 } : function () { 258 return null; 259 }; 260 var NO_CHAR_ARRAY = {}; 261 function getArrayOf(arrayLike) { 262 var i, a, x, it;
263 if (arguments.length === 1) { 264 if (isArray(arrayLike)) return arrayLike.slice(); 265 if (this === NO_CHAR_ARRAY && typeof arrayLike === 'string') return [arrayLike]; 266 if (it = getIteratorOf(arrayLike)) { 267 a = []; 268 while (x = it.next(), !x.done) a.push(x.value); 269 return a; 270 } 271 if (arrayLike == null) return [arrayLike]; 272 i = arrayLike.length; 273 if (typeof i === 'number') { 274 a = new Array(i); 275 while (i--) a[i] = arrayLike[i]; 276 return a; 277 } 278 return [arrayLike]; 279 } 280 i = arguments.length; 281 a = new Array(i); 282 while (i--) a[i] = arguments[i]; 283 return a; 284 } 285 var isAsyncFunction = typeof Symbol !== 'undefined' ? function (fn) { 286 return fn[Symbol.toStringTag] === 'AsyncFunction'; 287 } : function () { 288 return false; 289 }; 290 var debug = typeof location !== 'undefined' && /^(http|https):\/\/(localhost|127\.0\.0\.1)/.test(location.href); 291 function setDebug(value, filter) { 292 debug = value; 293 libraryFilter = filter; 294 } 295 var libraryFilter = function libraryFilter() { 296 return true; 297 }; 298 var NEEDS_THROW_FOR_STACK = !new Error("").stack; 299 function getErrorWithStack() { 300 if (NEEDS_THROW_FOR_STACK) try { 301 throw new Error(); 302 } catch (e) { 303 return e; 304 } 305 return new Error(); 306 } 307 function prettyStack(exception, numIgnoredFrames) { 308 var stack = exception.stack; 309 if (!stack) return ""; 310 numIgnoredFrames = numIgnoredFrames || 0; 311 if (stack.indexOf(exception.name) === 0) numIgnoredFrames += (exception.name + exception.message).split('\n').length; 312 return stack.split('\n').slice(numIgnoredFrames).filter(libraryFilter).map(function (frame) { 313 return "\n" + frame; 314 }).join(''); 315 } 316 var dexieErrorNames = ['Modify', 'Bulk', 'OpenFailed', 'VersionChange', 'Schema', 'Upgrade', 'InvalidTable', 'MissingAPI', 'NoSuchDatabase', 'InvalidArgument', 'SubTransaction', 'Unsupported', 'Internal', 'DatabaseClosed', 'PrematureCommit', 'ForeignAwait']; 317 var idbDomErrorNames = ['Unknown', 'Constraint', 'Data', 'TransactionInactive', 'ReadOnly', 'Version', 'NotFound', 'InvalidState', 'InvalidAccess', 'Abort', 'Timeout', 'QuotaExceeded', 'Syntax', 'DataClone']; 318 var errorList = dexieErrorNames.concat(idbDomErrorNames); 319 var defaultTexts = { 320 VersionChanged: "Database version changed by other database connection", 321 DatabaseClosed: "Database has been closed", 322 Abort: "Transaction aborted", 323 TransactionInactive: "Transaction has already completed or failed", 324 MissingAPI: "IndexedDB API missing. Please visit https://tinyurl.com/y2uuvskb" 325 }; 326 function DexieError(name, msg) { 327 this._e = getErrorWithStack(); 328 this.name = name; 329 this.message = msg; 330 } 331 derive(DexieError).from(Error).extend({ 332 stack: { 333 get: function get() { 334 return this._stack || (this._stack = this.name + ": " + this.message + prettyStack(this._e, 2)); 335 } 336 }, 337 toString: function toString() { 338 return this.name + ": " + this.message; 339 } 340 }); 341 function getMultiErrorMessage(msg, failures) { 342 return msg + ". Errors: " + Object.keys(failures).map(function (key) { 343 return failures[key].toString(); 344 }).filter(function (v, i, s) { 345 return s.indexOf(v) === i; 346 }).join('\n'); 347 } 348 function ModifyError(msg, failures, successCount, failedKeys) { 349 this._e = getErrorWithStack(); 350 this.failures = failures; 351 this.failedKeys = failedKeys; 352 this.successCount = successCount; 353 this.message = getMultiErrorMessage(msg, failures); 354 } 355 derive(ModifyError).from(DexieError); 356 function BulkError(msg, failures) { 357 this._e = getErrorWithStack(); 358 this.name = "BulkError"; 359 this.failures = Object.keys(failures).map(function (pos) { 360 return failures[pos]; 361 }); 362 this.failuresByPos = failures; 363 this.message = getMultiErrorMessage(msg, failures); 364 } 365 derive(BulkError).from(DexieError); 366 var errnames = errorList.reduce(function (obj, name) { 367 return obj[name] = name + "Error", obj; 368 }, {}); 369 var BaseException = DexieError; 370 var exceptions = errorList.reduce(function (obj, name) { 371 var fullName = name + "Error"; 372 function DexieError(msgOrInner, inner) { 373 this._e = getErrorWithStack(); 374 this.name = fullName; 375 if (!msgOrInner) { 376 this.message = defaultTexts[name] || fullName; 377 this.inner = null; 378 } else if (typeof msgOrInner === 'string') { 379 this.message = "" + msgOrInner + (!inner ? '' : '\n ' + inner); 380 this.inner = inner || null; 381 } else if (babelHelpers["typeof"](msgOrInner) === 'object') { 382 this.message = msgOrInner.name + " " + msgOrInner.message; 383 this.inner = msgOrInner; 384 } 385 } 386 derive(DexieError).from(BaseException); 387 obj[name] = DexieError; 388 return obj; 389 }, {}); 390 exceptions.Syntax = SyntaxError; 391 exceptions.Type = TypeError; 392 exceptions.Range = RangeError; 393 var exceptionMap = idbDomErrorNames.reduce(function (obj, name) { 394 obj[name + "Error"] = exceptions[name]; 395 return obj; 396 }, {}); 397 function mapError(domError, message) { 398 if (!domError || domError instanceof DexieError || domError instanceof TypeError || domError instanceof SyntaxError || !domError.name || !exceptionMap[domError.name]) return domError; 399 var rv = new exceptionMap[domError.name](message || domError.message, domError); 400 if ("stack" in domError) { 401 setProp(rv, "stack", { 402 get: function get() { 403 return this.inner.stack; 404 } 405 }); 406 } 407 return rv; 408 } 409 var fullNameExceptions = errorList.reduce(function (obj, name) { 410 if (["Syntax", "Type", "Range"].indexOf(name) === -1) obj[name + "Error"] = exceptions[name]; 411 return obj; 412 }, {}); 413 fullNameExceptions.ModifyError = ModifyError; 414 fullNameExceptions.DexieError = DexieError; 415 fullNameExceptions.BulkError = BulkError; 416 function nop() {} 417 function mirror(val) { 418 return val; 419 } 420 function pureFunctionChain(f1, f2) { 421 if (f1 == null || f1 === mirror) return f2; 422 return function (val) { 423 return f2(f1(val)); 424 }; 425 } 426 function callBoth(on1, on2) { 427 return function () { 428 on1.apply(this, arguments); 429 on2.apply(this, arguments); 430 }; 431 } 432 function hookCreatingChain(f1, f2) { 433 if (f1 === nop) return f2; 434 return function () { 435 var res = f1.apply(this, arguments); 436 if (res !== undefined) arguments[0] = res; 437 var onsuccess = this.onsuccess, 438 onerror = this.onerror; 439 this.onsuccess = null; 440 this.onerror = null; 441 var res2 = f2.apply(this, arguments); 442 if (onsuccess) this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess;
443 if (onerror) this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror; 444 return res2 !== undefined ? res2 : res; 445 }; 446 } 447 function hookDeletingChain(f1, f2) { 448 if (f1 === nop) return f2; 449 return function () { 450 f1.apply(this, arguments); 451 var onsuccess = this.onsuccess, 452 onerror = this.onerror; 453 this.onsuccess = this.onerror = null; 454 f2.apply(this, arguments); 455 if (onsuccess) this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess; 456 if (onerror) this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror; 457 }; 458 } 459 function hookUpdatingChain(f1, f2) { 460 if (f1 === nop) return f2; 461 return function (modifications) { 462 var res = f1.apply(this, arguments); 463 extend(modifications, res); 464 var onsuccess = this.onsuccess, 465 onerror = this.onerror; 466 this.onsuccess = null; 467 this.onerror = null; 468 var res2 = f2.apply(this, arguments); 469 if (onsuccess) this.onsuccess = this.onsuccess ? callBoth(onsuccess, this.onsuccess) : onsuccess; 470 if (onerror) this.onerror = this.onerror ? callBoth(onerror, this.onerror) : onerror; 471 return res === undefined ? res2 === undefined ? undefined : res2 : extend(res, res2); 472 }; 473 } 474 function reverseStoppableEventChain(f1, f2) { 475 if (f1 === nop) return f2; 476 return function () { 477 if (f2.apply(this, arguments) === false) return false; 478 return f1.apply(this, arguments); 479 }; 480 } 481 function promisableChain(f1, f2) { 482 if (f1 === nop) return f2; 483 return function () { 484 var res = f1.apply(this, arguments); 485 if (res && typeof res.then === 'function') { 486 var thiz = this, 487 i = arguments.length, 488 args = new Array(i); 489 while (i--) args[i] = arguments[i]; 490 return res.then(function () { 491 return f2.apply(thiz, args); 492 }); 493 } 494 return f2.apply(this, arguments); 495 }; 496 } 497 var INTERNAL = {}; 498 var LONG_STACKS_CLIP_LIMIT = 100, 499 MAX_LONG_STACKS = 20, 500 ZONE_ECHO_LIMIT = 100, 501 _a$1 = typeof Promise === 'undefined' ? [] : function () { 502 var globalP = Promise.resolve(); 503 if (typeof crypto === 'undefined' || !crypto.subtle) return [globalP, getProto(globalP), globalP]; 504 var nativeP = crypto.subtle.digest("SHA-512", new Uint8Array([0])); 505 return [nativeP, getProto(nativeP), globalP]; 506 }(), 507 resolvedNativePromise = _a$1[0], 508 nativePromiseProto = _a$1[1], 509 resolvedGlobalPromise = _a$1[2], 510 nativePromiseThen = nativePromiseProto && nativePromiseProto.then; 511 var NativePromise = resolvedNativePromise && resolvedNativePromise.constructor; 512 var patchGlobalPromise = !!resolvedGlobalPromise; 513 var stack_being_generated = false; 514 var schedulePhysicalTick = resolvedGlobalPromise ? function () { 515 resolvedGlobalPromise.then(physicalTick); 516 } : _global.setImmediate ? setImmediate.bind(null, physicalTick) : _global.MutationObserver ? function () { 517 var hiddenDiv = document.createElement("div"); 518 new MutationObserver(function () { 519 physicalTick(); 520 hiddenDiv = null; 521 }).observe(hiddenDiv, { 522 attributes: true 523 }); 524 hiddenDiv.setAttribute('i', '1'); 525 } : function () { 526 setTimeout(physicalTick, 0); 527 }; 528 var asap = function asap(callback, args) { 529 microtickQueue.push([callback, args]); 530 if (needsNewPhysicalTick) { 531 schedulePhysicalTick(); 532 needsNewPhysicalTick = false; 533 } 534 }; 535 var isOutsideMicroTick = true, 536 needsNewPhysicalTick = true, 537 unhandledErrors = [], 538 rejectingErrors = [], 539 currentFulfiller = null, 540 rejectionMapper = mirror; 541 var globalPSD = { 542 id: 'global', 543 global: true, 544 ref: 0, 545 unhandleds: [], 546 onunhandled: globalError,
547 pgp: false, 548 env: {}, 549 finalize: function finalize() { 550 this.unhandleds.forEach(function (uh) { 551 try { 552 globalError(uh[0], uh[1]); 553 } catch (e) {} 554 }); 555 } 556 }; 557 var PSD = globalPSD; 558 var microtickQueue = []; 559 var numScheduledCalls = 0; 560 var tickFinalizers = []; 561 function DexiePromise(fn) { 562 if (babelHelpers["typeof"](this) !== 'object') throw new TypeError('Promises must be constructed via new'); 563 this._listeners = []; 564 this.onuncatched = nop; 565 this._lib = false; 566 var psd = this._PSD = PSD; 567 if (debug) { 568 this._stackHolder = getErrorWithStack(); 569 this._prev = null; 570 this._numPrev = 0; 571 } 572 if (typeof fn !== 'function') { 573 if (fn !== INTERNAL) throw new TypeError('Not a function'); 574 this._state = arguments[1]; 575 this._value = arguments[2]; 576 if (this._state === false) handleRejection(this, this._value); 577 return; 578 } 579 this._state = null; 580 this._value = null; 581 ++psd.ref; 582 executePromiseTask(this, fn); 583 } 584 var thenProp = { 585 get: function get() { 586 var psd = PSD, 587 microTaskId = totalEchoes; 588 function then(onFulfilled, onRejected) { 589 var _this = this; 590 var possibleAwait = !psd.global && (psd !== PSD || microTaskId !== totalEchoes); 591 var cleanup = possibleAwait && !decrementExpectedAwaits(); 592 var rv = new DexiePromise(function (resolve, reject) { 593 propagateToListener(_this, new Listener(nativeAwaitCompatibleWrap(onFulfilled, psd, possibleAwait, cleanup), nativeAwaitCompatibleWrap(onRejected, psd, possibleAwait, cleanup), resolve, reject, psd)); 594 }); 595 debug && linkToPreviousPromise(rv, this); 596 return rv; 597 } 598 then.prototype = INTERNAL; 599 return then; 600 }, 601 set: function set(value) { 602 setProp(this, 'then', value && value.prototype === INTERNAL ? thenProp : { 603 get: function get() { 604 return value; 605 }, 606 set: thenProp.set 607 }); 608 } 609 }; 610 props(DexiePromise.prototype, { 611 then: thenProp, 612 _then: function _then(onFulfilled, onRejected) { 613 propagateToListener(this, new Listener(null, null, onFulfilled, onRejected, PSD)); 614 }, 615 "catch": function _catch(onRejected) { 616 if (arguments.length === 1) return this.then(null, onRejected); 617 var type = arguments[0], 618 handler = arguments[1]; 619 return typeof type === 'function' ? this.then(null, function (err) { 620 return err instanceof type ? handler(err) : PromiseReject(err); 621 }) : this.then(null, function (err) { 622 return err && err.name === type ? handler(err) : PromiseReject(err); 623 }); 624 }, 625 "finally": function _finally(onFinally) { 626 return this.then(function (value) { 627 onFinally(); 628 return value; 629 }, function (err) { 630 onFinally(); 631 return PromiseReject(err); 632 }); 633 }, 634 stack: { 635 get: function get() { 636 if (this._stack) return this._stack; 637 try { 638 stack_being_generated = true; 639 var stacks = getStack(this, [], MAX_LONG_STACKS); 640 var stack = stacks.join("\nFrom previous: "); 641 if (this._state !== null) this._stack = stack; 642 return stack; 643 } finally { 644 stack_being_generated = false; 645 } 646 } 647 }, 648 timeout: function timeout(ms, msg) { 649 var _this = this; 650 return ms < Infinity ? new DexiePromise(function (resolve, reject) { 651 var handle = setTimeout(function () { 652 return reject(new exceptions.Timeout(msg)); 653 }, ms); 654 _this.then(resolve, reject)["finally"](clearTimeout.bind(null, handle)); 655 }) : this; 656 } 657 }); 658 if (typeof Symbol !== 'undefined' && Symbol.toStringTag) setProp(DexiePromise.prototype, Symbol.toStringTag, 'Dexie.Promise'); 659 globalPSD.env = snapShot(); 660 function Listener(onFulfilled, onRejected, resolve, reject, zone) { 661 this.onFulfilled = typeof onFulfilled === 'function' ? onFulfilled : null; 662 this.onRejected = typeof onRejected === 'function' ? onRejected : null; 663 this.resolve = resolve; 664 this.reject = reject; 665 this.psd = zone; 666 } 667 props(DexiePromise, { 668 all: function all() { 669 var values = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync); 670 return new DexiePromise(function (resolve, reject) { 671 if (values.length === 0) resolve([]); 672 var remaining = values.length;
673 values.forEach(function (a, i) { 674 return DexiePromise.resolve(a).then(function (x) { 675 values[i] = x; 676 if (! --remaining) resolve(values); 677 }, reject); 678 }); 679 }); 680 }, 681 resolve: function resolve(value) { 682 if (value instanceof DexiePromise) return value; 683 if (value && typeof value.then === 'function') return new DexiePromise(function (resolve, reject) { 684 value.then(resolve, reject); 685 }); 686 var rv = new DexiePromise(INTERNAL, true, value); 687 linkToPreviousPromise(rv, currentFulfiller); 688 return rv; 689 }, 690 reject: PromiseReject, 691 race: function race() { 692 var values = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync); 693 return new DexiePromise(function (resolve, reject) { 694 values.map(function (value) { 695 return DexiePromise.resolve(value).then(resolve, reject); 696 }); 697 }); 698 }, 699 PSD: { 700 get: function get() { 701 return PSD; 702 }, 703 set: function set(value) { 704 return PSD = value; 705 } 706 }, 707 totalEchoes: { 708 get: function get() { 709 return totalEchoes; 710 } 711 }, 712 newPSD: newScope, 713 usePSD: usePSD, 714 scheduler: { 715 get: function get() { 716 return asap; 717 }, 718 set: function set(value) { 719 asap = value; 720 } 721 }, 722 rejectionMapper: { 723 get: function get() { 724 return rejectionMapper; 725 }, 726 set: function set(value) { 727 rejectionMapper = value; 728 } 729 }, 730 follow: function follow(fn, zoneProps) { 731 return new DexiePromise(function (resolve, reject) { 732 return newScope(function (resolve, reject) { 733 var psd = PSD; 734 psd.unhandleds = []; 735 psd.onunhandled = reject; 736 psd.finalize = callBoth(function () { 737 var _this = this; 738 run_at_end_of_this_or_next_physical_tick(function () { 739 _this.unhandleds.length === 0 ? resolve() : reject(_this.unhandleds[0]); 740 }); 741 }, psd.finalize); 742 fn(); 743 }, zoneProps, resolve, reject); 744 }); 745 } 746 }); 747 if (NativePromise) { 748 if (NativePromise.allSettled) setProp(DexiePromise, "allSettled", function () { 749 var possiblePromises = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync); 750 return new DexiePromise(function (resolve) { 751 if (possiblePromises.length === 0) resolve([]); 752 var remaining = possiblePromises.length; 753 var results = new Array(remaining); 754 possiblePromises.forEach(function (p, i) { 755 return DexiePromise.resolve(p).then(function (value) { 756 return results[i] = { 757 status: "fulfilled", 758 value: value 759 }; 760 }, function (reason) { 761 return results[i] = { 762 status: "rejected", 763 reason: reason 764 }; 765 }).then(function () { 766 return --remaining || resolve(results); 767 }); 768 }); 769 }); 770 }); 771 if (NativePromise.any && typeof AggregateError !== 'undefined') setProp(DexiePromise, "any", function () { 772 var possiblePromises = getArrayOf.apply(null, arguments).map(onPossibleParallellAsync); 773 return new DexiePromise(function (resolve, reject) { 774 if (possiblePromises.length === 0) reject(new AggregateError([])); 775 var remaining = possiblePromises.length; 776 var failures = new Array(remaining); 777 possiblePromises.forEach(function (p, i) { 778 return DexiePromise.resolve(p).then(function (value) { 779 return resolve(value); 780 }, function (failure) { 781 failures[i] = failure; 782 if (! --remaining) reject(new AggregateError(failures)); 783 }); 784 }); 785 }); 786 }); 787 } 788 function executePromiseTask(promise, fn) { 789 try { 790 fn(function (value) { 791 if (promise._state !== null) return; 792 if (value === promise) throw new TypeError('A promise cannot be resolved with itself.'); 793 var shouldExecuteTick = promise._lib && beginMicroTickScope(); 794 if (value && typeof value.then === 'function') { 795 executePromiseTask(promise, function (resolve, reject) { 796 value instanceof DexiePromise ? value._then(resolve, reject) : value.then(resolve, reject); 797 }); 798 } else { 799 promise._state = true; 800 promise._value = value; 801 propagateAllListeners(promise); 802 } 803 if (shouldExecuteTick) endMicroTickScope(); 804 }, handleRejection.bind(null, promise)); 805 } catch (ex) { 806 handleRejection(promise, ex); 807 } 808 } 809 function handleRejection(promise, reason) { 810 rejectingErrors.push(reason); 811 if (promise._state !== null) return; 812 var shouldExecuteTick = promise._lib && beginMicroTickScope(); 813 reason = rejectionMapper(reason); 814 promise._state = false;
815 promise._value = reason; 816 debug && reason !== null && babelHelpers["typeof"](reason) === 'object' && !reason._promise && tryCatch(function () { 817 var origProp = getPropertyDescriptor(reason, "stack"); 818 reason._promise = promise; 819 setProp(reason, "stack", { 820 get: function get() { 821 return stack_being_generated ? origProp && (origProp.get ? origProp.get.apply(reason) : origProp.value) : promise.stack; 822 } 823 }); 824 }); 825 addPossiblyUnhandledError(promise); 826 propagateAllListeners(promise); 827 if (shouldExecuteTick) endMicroTickScope(); 828 } 829 function propagateAllListeners(promise) { 830 var listeners = promise._listeners; 831 promise._listeners = []; 832 for (var i = 0, len = listeners.length; i < len; ++i) { 833 propagateToListener(promise, listeners[i]); 834 } 835 var psd = promise._PSD; 836 --psd.ref || psd.finalize(); 837 if (numScheduledCalls === 0) { 838 ++numScheduledCalls; 839 asap(function () { 840 if (--numScheduledCalls === 0) finalizePhysicalTick(); 841 }, []); 842 } 843 } 844 function propagateToListener(promise, listener) { 845 if (promise._state === null) { 846 promise._listeners.push(listener); 847 return; 848 } 849 var cb = promise._state ? listener.onFulfilled : listener.onRejected; 850 if (cb === null) { 851 return (promise._state ? listener.resolve : listener.reject)(promise._value); 852 } 853 ++listener.psd.ref; 854 ++numScheduledCalls; 855 asap(callListener, [cb, promise, listener]); 856 } 857 function callListener(cb, promise, listener) { 858 try { 859 currentFulfiller = promise; 860 var ret, 861 value = promise._value; 862 if (promise._state) { 863 ret = cb(value); 864 } else { 865 if (rejectingErrors.length) rejectingErrors = []; 866 ret = cb(value); 867 if (rejectingErrors.indexOf(value) === -1) markErrorAsHandled(promise); 868 } 869 listener.resolve(ret); 870 } catch (e) { 871 listener.reject(e); 872 } finally { 873 currentFulfiller = null; 874 if (--numScheduledCalls === 0) finalizePhysicalTick(); 875 --listener.psd.ref || listener.psd.finalize(); 876 } 877 } 878 function getStack(promise, stacks, limit) { 879 if (stacks.length === limit) return stacks; 880 var stack = ""; 881 if (promise._state === false) { 882 var failure = promise._value, 883 errorName, 884 message; 885 if (failure != null) { 886 errorName = failure.name || "Error"; 887 message = failure.message || failure; 888 stack = prettyStack(failure, 0); 889 } else { 890 errorName = failure; 891 message = ""; 892 } 893 stacks.push(errorName + (message ? ": " + message : "") + stack); 894 } 895 if (debug) { 896 stack = prettyStack(promise._stackHolder, 2); 897 if (stack && stacks.indexOf(stack) === -1) stacks.push(stack); 898 if (promise._prev) getStack(promise._prev, stacks, limit); 899 } 900 return stacks; 901 } 902 function linkToPreviousPromise(promise, prev) { 903 var numPrev = prev ? prev._numPrev + 1 : 0; 904 if (numPrev < LONG_STACKS_CLIP_LIMIT) { 905 promise._prev = prev; 906 promise._numPrev = numPrev; 907 } 908 } 909 function physicalTick() { 910 beginMicroTickScope() && endMicroTickScope(); 911 } 912 function beginMicroTickScope() { 913 var wasRootExec = isOutsideMicroTick; 914 isOutsideMicroTick = false; 915 needsNewPhysicalTick = false; 916 return wasRootExec; 917 } 918 function endMicroTickScope() { 919 var callbacks, i, l; 920 do { 921 while (microtickQueue.length > 0) { 922 callbacks = microtickQueue; 923 microtickQueue = []; 924 l = callbacks.length; 925 for (i = 0; i < l; ++i) { 926 var item = callbacks[i]; 927 item[0].apply(null, item[1]); 928 } 929 } 930 } while (microtickQueue.length > 0); 931 isOutsideMicroTick = true; 932 needsNewPhysicalTick = true; 933 } 934 function finalizePhysicalTick() { 935 var unhandledErrs = unhandledErrors; 936 unhandledErrors = []; 937 unhandledErrs.forEach(function (p) { 938 p._PSD.onunhandled.call(null, p._value, p); 939 }); 940 var finalizers = tickFinalizers.slice(0); 941 var i = finalizers.length; 942 while (i) finalizers[--i](); 943 } 944 function run_at_end_of_this_or_next_physical_tick(fn) { 945 function finalizer() { 946 fn(); 947 tickFinalizers.splice(tickFinalizers.indexOf(finalizer), 1); 948 } 949 tickFinalizers.push(finalizer); 950 ++numScheduledCalls; 951 asap(function () { 952 if (--numScheduledCalls === 0) finalizePhysicalTick(); 953 }, []); 954 } 955 function addPossiblyUnhandledError(promise) { 956 if (!unhandledErrors.some(function (p) { 957 return p._value === promise._value; 958 })) unhandledErrors.push(promise); 959 } 960 function markErrorAsHandled(promise) { 961 var i = unhandledErrors.length;
962 while (i) if (unhandledErrors[--i]._value === promise._value) { 963 unhandledErrors.splice(i, 1); 964 return; 965 } 966 } 967 function PromiseReject(reason) { 968 return new DexiePromise(INTERNAL, false, reason); 969 } 970 function wrap(fn, errorCatcher) { 971 var psd = PSD; 972 return function () { 973 var wasRootExec = beginMicroTickScope(), 974 outerScope = PSD; 975 try { 976 switchToZone(psd, true); 977 return fn.apply(this, arguments); 978 } catch (e) { 979 errorCatcher && errorCatcher(e); 980 } finally { 981 switchToZone(outerScope, false); 982 if (wasRootExec) endMicroTickScope(); 983 } 984 }; 985 } 986 var task = { 987 awaits: 0, 988 echoes: 0, 989 id: 0 990 }; 991 var taskCounter = 0; 992 var zoneStack = []; 993 var zoneEchoes = 0; 994 var totalEchoes = 0; 995 var zone_id_counter = 0; 996 function newScope(fn, props, a1, a2) { 997 var parent = PSD, 998 psd = Object.create(parent); 999 psd.parent = parent; 1000 psd.ref = 0; 1001 psd.global = false; 1002 psd.id = ++zone_id_counter; 1003 var globalEnv = globalPSD.env; 1004 psd.env = patchGlobalPromise ? { 1005 Promise: DexiePromise, 1006 PromiseProp: { 1007 value: DexiePromise, 1008 configurable: true, 1009 writable: true 1010 }, 1011 all: DexiePromise.all, 1012 race: DexiePromise.race, 1013 allSettled: DexiePromise.allSettled, 1014 any: DexiePromise.any, 1015 resolve: DexiePromise.resolve, 1016 reject: DexiePromise.reject, 1017 nthen: getPatchedPromiseThen(globalEnv.nthen, psd), 1018 gthen: getPatchedPromiseThen(globalEnv.gthen, psd) 1019 } : {}; 1020 if (props) extend(psd, props); 1021 ++parent.ref; 1022 psd.finalize = function () { 1023 --this.parent.ref || this.parent.finalize(); 1024 }; 1025 var rv = usePSD(psd, fn, a1, a2); 1026 if (psd.ref === 0) psd.finalize(); 1027 return rv; 1028 } 1029 function incrementExpectedAwaits() { 1030 if (!task.id) task.id = ++taskCounter; 1031 ++task.awaits; 1032 task.echoes += ZONE_ECHO_LIMIT; 1033 return task.id; 1034 } 1035 function decrementExpectedAwaits() { 1036 if (!task.awaits) return false; 1037 if (--task.awaits === 0) task.id = 0; 1038 task.echoes = task.awaits * ZONE_ECHO_LIMIT; 1039 return true; 1040 } 1041 if (('' + nativePromiseThen).indexOf('[native code]') === -1) { 1042 incrementExpectedAwaits = decrementExpectedAwaits = nop; 1043 } 1044 function onPossibleParallellAsync(possiblePromise) { 1045 if (task.echoes && possiblePromise && possiblePromise.constructor === NativePromise) { 1046 incrementExpectedAwaits(); 1047 return possiblePromise.then(function (x) { 1048 decrementExpectedAwaits(); 1049 return x; 1050 }, function (e) { 1051 decrementExpectedAwaits(); 1052 return rejection(e); 1053 }); 1054 } 1055 return possiblePromise; 1056 } 1057 function zoneEnterEcho(targetZone) { 1058 ++totalEchoes; 1059 if (!task.echoes || --task.echoes === 0) { 1060 task.echoes = task.id = 0; 1061 } 1062 zoneStack.push(PSD); 1063 switchToZone(targetZone, true); 1064 } 1065 function zoneLeaveEcho() { 1066 var zone = zoneStack[zoneStack.length - 1]; 1067 zoneStack.pop(); 1068 switchToZone(zone, false); 1069 } 1070 function switchToZone(targetZone, bEnteringZone) { 1071 var currentZone = PSD; 1072 if (bEnteringZone ? task.echoes && (!zoneEchoes++ || targetZone !== PSD) : zoneEchoes && (! --zoneEchoes || targetZone !== PSD)) { 1073 enqueueNativeMicroTask(bEnteringZone ? zoneEnterEcho.bind(null, targetZone) : zoneLeaveEcho); 1074 } 1075 if (targetZone === PSD) return; 1076 PSD = targetZone; 1077 if (currentZone === globalPSD) globalPSD.env = snapShot(); 1078 if (patchGlobalPromise) { 1079 var GlobalPromise_1 = globalPSD.env.Promise; 1080 var targetEnv = targetZone.env; 1081 nativePromiseProto.then = targetEnv.nthen; 1082 GlobalPromise_1.prototype.then = targetEnv.gthen; 1083 if (currentZone.global || targetZone.global) { 1084 Object.defineProperty(_global, 'Promise', targetEnv.PromiseProp); 1085 GlobalPromise_1.all = targetEnv.all; 1086 GlobalPromise_1.race = targetEnv.race; 1087 GlobalPromise_1.resolve = targetEnv.resolve; 1088 GlobalPromise_1.reject = targetEnv.reject; 1089 if (targetEnv.allSettled) GlobalPromise_1.allSettled = targetEnv.allSettled; 1090 if (targetEnv.any) GlobalPromise_1.any = targetEnv.any; 1091 } 1092 } 1093 } 1094 function snapShot() { 1095 var GlobalPromise = _global.Promise || Promise; // tag 02032020 1096 return patchGlobalPromise ? { 1097 Promise: GlobalPromise, 1098 PromiseProp: Object.getOwnPropertyDescriptor(_global, "Promise"), 1099 all: GlobalPromise.all, 1100 race: GlobalPromise.race, 1101 allSettled: GlobalPromise.allSettled, 1102 any: GlobalPromise.any, 1103 resolve: GlobalPromise.resolve, 1104 reject: GlobalPromise.reject, 1105 nthen: nativePromiseProto.then, 1106 gthen: GlobalPromise.prototype.then 1107 } : {}; 1108 } 1109 function usePSD(psd, fn, a1, a2, a3) { 1110 var outerScope = PSD; 1111 try { 1112 switchToZone(psd, true); 1113 return fn(a1, a2, a3); 1114 } finally { 1115 switchToZone(outerScope, false); 1116 } 1117 } 1118 function enqueueNativeMicroTask(job) { 1119 nativePromiseThen.call(resolvedNativePromise, job); 1120 } 1121 function nativeAwaitCompatibleWrap(fn, zone, possibleAwait, cleanup) { 1122 return typeof fn !== 'function' ? fn : function () { 1123 var outerZone = PSD; 1124 if (possibleAwait) incrementExpectedAwaits(); 1125 switchToZone(zone, true); 1126 try { 1127 return fn.apply(this, arguments); 1128 } finally { 1129 switchToZone(outerZone, false); 1130 if (cleanup) enqueueNativeMicroTask(decrementExpectedAwaits); 1131 } 1132 }; 1133 } 1134 function getPatchedPromiseThen(origThen, zone) { 1135 return function (onResolved, onRejected) { 1136 return origThen.call(this, nativeAwaitCompatibleWrap(onResolved, zone), nativeAwaitCompatibleWrap(onRejected, zone)); 1137 }; 1138 } 1139 var UNHANDLEDREJECTION = "unhandledrejection"; 1140 function globalError(err, promise) { 1141 var rv; 1142 try { 1143 rv = promise.onuncatched(err); 1144 } catch (e) {} 1145 if (rv !== false) try { 1146 var event, 1147 eventData = { 1148 promise: promise, 1149 reason: err 1150 }; 1151 if (_global.document && document.createEvent) { 1152 event = document.createEvent('Event'); 1153 event.initEvent(UNHANDLEDREJECTION, true, true); 1154 extend(event, eventData); 1155 } else if (_global.CustomEvent) { 1156 event = new CustomEvent(UNHANDLEDREJECTION, { 1157 detail: eventData 1158 }); 1159 extend(event, eventData); 1160 } 1161 if (event && _global.dispatchEvent) { 1162 dispatchEvent(event); 1163 if (!_global.PromiseRejectionEvent && _global.onunhandledrejection) try { 1164 _global.onunhandledrejection(event); 1165 } catch (_) {} 1166 } 1167 if (debug && event && !event.defaultPrevented) { 1168 console.warn("Unhandled rejection: " + (err.stack || err)); 1169 } 1170 } catch (e) {} 1171 } 1172 var rejection = DexiePromise.reject; 1173 function tempTransaction(db, mode, storeNames, fn) { 1174 if (!db.idbdb || !db._state.openComplete && !PSD.letThrough && !db._vip) { 1175 if (db._state.openComplete) { 1176 return rejection(new exceptions.DatabaseClosed(db._state.dbOpenError)); 1177 } 1178 if (!db._state.isBeingOpened) { 1179 if (!db._options.autoOpen) return rejection(new exceptions.DatabaseClosed()); 1180 db.open()["catch"](nop); 1181 } 1182 return db._state.dbReadyPromise.then(function () { 1183 return tempTransaction(db, mode, storeNames, fn); 1184 }); 1185 } else { 1186 var trans = db._createTransaction(mode, storeNames, db._dbSchema); 1187 try { 1188 trans.create(); 1189 db._state.PR1398_maxLoop = 3; 1190 } catch (ex) { 1191 if (ex.name === errnames.InvalidState && db.isOpen() && --db._state.PR1398_maxLoop > 0) { 1192 console.warn('Dexie: Need to reopen db'); 1193 db._close(); 1194 return db.open().then(function () { 1195 return tempTransaction(db, mode, storeNames, fn); 1196 }); 1197 } 1198 return rejection(ex); 1199 } 1200 return trans._promise(mode, function (resolve, reject) { 1201 return newScope(function () { 1202 PSD.trans = trans; 1203 return fn(resolve, reject, trans); 1204 }); 1205 }).then(function (result) { 1206 return trans._completion.then(function () { 1207 return result; 1208 }); 1209 }); 1210 } 1211 } 1212 var DEXIE_VERSION = '3.2.2'; 1213 var maxString = String.fromCharCode(65535); 1214 var minKey = -Infinity; 1215 var INVALID_KEY_ARGUMENT = "Invalid key provided. Keys must be of type string, number, Date or Array<string | number | Date>."; 1216 var STRING_EXPECTED = "String expected."; 1217 var connections = []; 1218 var isIEOrEdge = typeof navigator !== 'undefined' && /(MSIE|Trident|Edge)/.test(navigator.userAgent); 1219 var hasIEDeleteObjectStoreBug = isIEOrEdge; 1220 var hangsOnDeleteLargeKeyRange = isIEOrEdge; 1221 var dexieStackFrameFilter = function dexieStackFrameFilter(frame) { 1222 return !/(dexie\.js|dexie\.min\.js)/.test(frame); 1223 }; 1224 var DBNAMES_DB = '__dbnames'; 1225 var READONLY = 'readonly'; 1226 var READWRITE = 'readwrite'; 1227 function combine(filter1, filter2) { 1228 return filter1 ? filter2 ? function () { 1229 return filter1.apply(this, arguments) && filter2.apply(this, arguments); 1230 } : filter1 : filter2; 1231 } 1232 var AnyRange = { 1233 type: 3, 1234 lower: -Infinity, 1235 lowerOpen: false, 1236 upper: [[]], 1237 upperOpen: false 1238 };
1239 function workaroundForUndefinedPrimKey(keyPath) { 1240 return typeof keyPath === "string" && !/\./.test(keyPath) ? function (obj) { 1241 if (obj[keyPath] === undefined && keyPath in obj) { 1242 obj = deepClone(obj); 1243 delete obj[keyPath]; 1244 } 1245 return obj; 1246 } : function (obj) { 1247 return obj; 1248 }; 1249 } 1250 var Table = function () { 1251 function Table() {} 1252 Table.prototype._trans = function (mode, fn, writeLocked) { 1253 var trans = this._tx || PSD.trans; 1254 var tableName = this.name; 1255 function checkTableInTransaction(resolve, reject, trans) { 1256 if (!trans.schema[tableName]) throw new exceptions.NotFound("Table " + tableName + " not part of transaction"); 1257 return fn(trans.idbtrans, trans); 1258 } 1259 var wasRootExec = beginMicroTickScope(); 1260 try { 1261 return trans && trans.db === this.db ? trans === PSD.trans ? trans._promise(mode, checkTableInTransaction, writeLocked) : newScope(function () { 1262 return trans._promise(mode, checkTableInTransaction, writeLocked); 1263 }, { 1264 trans: trans, 1265 transless: PSD.transless || PSD 1266 }) : tempTransaction(this.db, mode, [this.name], checkTableInTransaction); 1267 } finally { 1268 if (wasRootExec) endMicroTickScope(); 1269 } 1270 }; 1271 Table.prototype.get = function (keyOrCrit, cb) { 1272 var _this = this; 1273 if (keyOrCrit && keyOrCrit.constructor === Object) return this.where(keyOrCrit).first(cb); 1274 return this._trans('readonly', function (trans) { 1275 return _this.core.get({ 1276 trans: trans, 1277 key: keyOrCrit 1278 }).then(function (res) { 1279 return _this.hook.reading.fire(res); 1280 }); 1281 }).then(cb); 1282 }; 1283 Table.prototype.where = function (indexOrCrit) { 1284 if (typeof indexOrCrit === 'string') return new this.db.WhereClause(this, indexOrCrit); 1285 if (isArray(indexOrCrit)) return new this.db.WhereClause(this, "[" + indexOrCrit.join('+') + "]"); 1286 var keyPaths = keys(indexOrCrit); 1287 if (keyPaths.length === 1) return this.where(keyPaths[0]).equals(indexOrCrit[keyPaths[0]]); 1288 var compoundIndex = this.schema.indexes.concat(this.schema.primKey).filter(function (ix) { 1289 return ix.compound && keyPaths.every(function (keyPath) { 1290 return ix.keyPath.indexOf(keyPath) >= 0; 1291 }) && ix.keyPath.every(function (keyPath) { 1292 return keyPaths.indexOf(keyPath) >= 0; 1293 }); 1294 })[0]; 1295 if (compoundIndex && this.db._maxKey !== maxString) return this.where(compoundIndex.name).equals(compoundIndex.keyPath.map(function (kp) { 1296 return indexOrCrit[kp]; 1297 })); 1298 if (!compoundIndex && debug) console.warn("The query " + JSON.stringify(indexOrCrit) + " on " + this.name + " would benefit of a " + ("compound index [" + keyPaths.join('+') + "]")); 1299 var idxByName = this.schema.idxByName; 1300 var idb = this.db._deps.indexedDB; 1301 function equals(a, b) { 1302 try { 1303 return idb.cmp(a, b) === 0; 1304 } catch (e) { 1305 return false; 1306 } 1307 } 1308 var _a = keyPaths.reduce(function (_a, keyPath) { 1309 var prevIndex = _a[0], 1310 prevFilterFn = _a[1]; 1311 var index = idxByName[keyPath]; 1312 var value = indexOrCrit[keyPath]; 1313 return [prevIndex || index, prevIndex || !index ? combine(prevFilterFn, index && index.multi ? function (x) { 1314 var prop = getByKeyPath(x, keyPath); 1315 return isArray(prop) && prop.some(function (item) { 1316 return equals(value, item); 1317 }); 1318 } : function (x) { 1319 return equals(value, getByKeyPath(x, keyPath)); 1320 }) : prevFilterFn]; 1321 }, [null, null]), 1322 idx = _a[0], 1323 filterFunction = _a[1]; 1324 return idx ? this.where(idx.name).equals(indexOrCrit[idx.keyPath]).filter(filterFunction) : compoundIndex ? this.filter(filterFunction) : this.where(keyPaths).equals(''); 1325 }; 1326 Table.prototype.filter = function (filterFunction) { 1327 return this.toCollection().and(filterFunction); 1328 }; 1329 Table.prototype.count = function (thenShortcut) { 1330 return this.toCollection().count(thenShortcut); 1331 }; 1332 Table.prototype.offset = function (offset) { 1333 return this.toCollection().offset(offset); 1334 }; 1335 Table.prototype.limit = function (numRows) { 1336 return this.toCollection().limit(numRows); 1337 }; 1338 Table.prototype.each = function (callback) { 1339 return this.toCollection().each(callback); 1340 }; 1341 Table.prototype.toArray = function (thenShortcut) { 1342 return this.toCollection().toArray(thenShortcut); 1343 }; 1344 Table.prototype.toCollection = function () { 1345 return new this.db.Collection(new this.db.WhereClause(this)); 1346 }; 1347 Table.prototype.orderBy = function (index) { 1348 return new this.db.Collection(new this.db.WhereClause(this, isArray(index) ? "[" + index.join('+') + "]" : index)); 1349 }; 1350 Table.prototype.reverse = function () { 1351 return this.toCollection().reverse(); 1352 }; 1353 Table.prototype.mapToClass = function (constructor) { 1354 this.schema.mappedClass = constructor; 1355 var readHook = function readHook(obj) { 1356 if (!obj) return obj; 1357 var res = Object.create(constructor.prototype); 1358 for (var m in obj) if (hasOwn(obj, m)) try { 1359 res[m] = obj[m]; 1360 } catch (_) {} 1361 return res; 1362 }; 1363 if (this.schema.readHook) { 1364 this.hook.reading.unsubscribe(this.schema.readHook); 1365 } 1366 this.schema.readHook = readHook; 1367 this.hook("reading", readHook); 1368 return constructor; 1369 }; 1370 Table.prototype.defineClass = function () { 1371 function Class(content) { 1372 extend(this, content); 1373 } 1374 return this.mapToClass(Class); 1375 }; 1376 Table.prototype.add = function (obj, key) { 1377 var _this = this; 1378 var _a = this.schema.primKey, 1379 auto = _a.auto, 1380 keyPath = _a.keyPath; 1381 var objToAdd = obj; 1382 if (keyPath && auto) {
1383 objToAdd = workaroundForUndefinedPrimKey(keyPath)(obj); 1384 } 1385 return this._trans('readwrite', function (trans) { 1386 return _this.core.mutate({ 1387 trans: trans, 1388 type: 'add', 1389 keys: key != null ? [key] : null, 1390 values: [objToAdd] 1391 }); 1392 }).then(function (res) { 1393 return res.numFailures ? DexiePromise.reject(res.failures[0]) : res.lastResult; 1394 }).then(function (lastResult) { 1395 if (keyPath) { 1396 try { 1397 setByKeyPath(obj, keyPath, lastResult); 1398 } catch (_) {} 1399 } 1400 return lastResult; 1401 }); 1402 }; 1403 Table.prototype.update = function (keyOrObject, modifications) { 1404 if (babelHelpers["typeof"](keyOrObject) === 'object' && !isArray(keyOrObject)) { 1405 var key = getByKeyPath(keyOrObject, this.schema.primKey.keyPath); 1406 if (key === undefined) return rejection(new exceptions.InvalidArgument("Given object does not contain its primary key")); 1407 try { 1408 if (typeof modifications !== "function") { 1409 keys(modifications).forEach(function (keyPath) { 1410 setByKeyPath(keyOrObject, keyPath, modifications[keyPath]); 1411 }); 1412 } else { 1413 modifications(keyOrObject, { 1414 value: keyOrObject, 1415 primKey: key 1416 }); 1417 } 1418 } catch (_a) {} 1419 return this.where(":id").equals(key).modify(modifications); 1420 } else { 1421 return this.where(":id").equals(keyOrObject).modify(modifications); 1422 } 1423 }; 1424 Table.prototype.put = function (obj, key) { 1425 var _this = this; 1426 var _a = this.schema.primKey, 1427 auto = _a.auto, 1428 keyPath = _a.keyPath; 1429 var objToAdd = obj; 1430 if (keyPath && auto) {
vendor: 2,544 bytes, lines 1431-1500
1431 objToAdd = workaroundForUndefinedPrimKey(keyPath)(obj); 1432 } 1433 return this._trans('readwrite', function (trans) { 1434 return _this.core.mutate({ 1435 trans: trans, 1436 type: 'put', 1437 values: [objToAdd], 1438 keys: key != null ? [key] : null 1439 }); 1440 }).then(function (res) { 1441 return res.numFailures ? DexiePromise.reject(res.failures[0]) : res.lastResult; 1442 }).then(function (lastResult) { 1443 if (keyPath) { 1444 try { 1445 setByKeyPath(obj, keyPath, lastResult); 1446 } catch (_) {} 1447 } 1448 return lastResult; 1449 }); 1450 }; 1451 Table.prototype["delete"] = function (key) { 1452 var _this = this; 1453 return this._trans('readwrite', function (trans) { 1454 return _this.core.mutate({ 1455 trans: trans, 1456 type: 'delete', 1457 keys: [key] 1458 }); 1459 }).then(function (res) { 1460 return res.numFailures ? DexiePromise.reject(res.failures[0]) : undefined; 1461 }); 1462 }; 1463 Table.prototype.clear = function () { 1464 var _this = this; 1465 return this._trans('readwrite', function (trans) { 1466 return _this.core.mutate({ 1467 trans: trans, 1468 type: 'deleteRange', 1469 range: AnyRange 1470 }); 1471 }).then(function (res) { 1472 return res.numFailures ? DexiePromise.reject(res.failures[0]) : undefined; 1473 }); 1474 }; 1475 Table.prototype.bulkGet = function (keys) { 1476 var _this = this; 1477 return this._trans('readonly', function (trans) { 1478 return _this.core.getMany({ 1479 keys: keys, 1480 trans: trans 1481 }).then(function (result) { 1482 return result.map(function (res) { 1483 return _this.hook.reading.fire(res); 1484 }); 1485 }); 1486 }); 1487 }; 1488 Table.prototype.bulkAdd = function (objects, keysOrOptions, options) { 1489 var _this = this; 1490 var keys = Array.isArray(keysOrOptions) ? keysOrOptions : undefined; 1491 options = options || (keys ? undefined : keysOrOptions); 1492 var wantResults = options ? options.allKeys : undefined; 1493 return this._trans('readwrite', function (trans) { 1494 var _a = _this.schema.primKey, 1495 auto = _a.auto, 1496 keyPath = _a.keyPath; 1497 if (keyPath && keys) throw new exceptions.InvalidArgument("bulkAdd(): keys argument invalid on tables with inbound keys"); 1498 if (keys && keys.length !== objects.length) throw new exceptions.InvalidArgument("Arguments objects and keys must have the same length"); 1499 var numObjects = objects.length; 1500 var objectsToAdd = keyPath && auto ? objects.map(workaroundForUndef
1500inedPrimKey(keyPath)) : objects; 1501 return _this.core.mutate({ 1502 trans: trans, 1503 type: 'add', 1504 keys: keys, 1505 values: objectsToAdd, 1506 wantResults: wantResults 1507 }).then(function (_a) { 1508 var numFailures = _a.numFailures, 1509 results = _a.results, 1510 lastResult = _a.lastResult, 1511 failures = _a.failures; 1512 var result = wantResults ? results : lastResult; 1513 if (numFailures === 0) return result; 1514 throw new BulkError(_this.name + ".bulkAdd(): " + numFailures + " of " + numObjects + " operations failed", failures); 1515 }); 1516 }); 1517 }; 1518 Table.prototype.bulkPut = function (objects, keysOrOptions, options) { 1519 var _this = this; 1520 var keys = Array.isArray(keysOrOptions) ? keysOrOptions : undefined; 1521 options = options || (keys ? undefined : keysOrOptions); 1522 var wantResults = options ? options.allKeys : undefined; 1523 return this._trans('readwrite', function (trans) { 1524 var _a = _this.schema.primKey, 1525 auto = _a.auto, 1526 keyPath = _a.keyPath; 1527 if (keyPath && keys) throw new exceptions.InvalidArgument("bulkPut(): keys argument invalid on tables with inbound keys"); 1528 if (keys && keys.length !== objects.length) throw new exceptions.InvalidArgument("Arguments objects and keys must have the same length"); 1529 var numObjects = objects.length; 1530 var objectsToPut = keyPath && auto ? objects.map(workaroundForUndef
1530inedPrimKey(keyPath)) : objects; 1531 return _this.core.mutate({ 1532 trans: trans, 1533 type: 'put', 1534 keys: keys, 1535 values: objectsToPut, 1536 wantResults: wantResults 1537 }).then(function (_a) { 1538 var numFailures = _a.numFailures, 1539 results = _a.results, 1540 lastResult = _a.lastResult, 1541 failures = _a.failures; 1542 var result = wantResults ? results : lastResult; 1543 if (numFailures === 0) return result; 1544 throw new BulkError(_this.name + ".bulkPut(): " + numFailures + " of " + numObjects + " operations failed", failures); 1545 }); 1546 }); 1547 }; 1548 Table.prototype.bulkDelete = function (keys) { 1549 var _this = this; 1550 var numKeys = keys.length; 1551 return this._trans('readwrite', function (trans) { 1552 return _this.core.mutate({ 1553 trans: trans, 1554 type: 'delete', 1555 keys: keys 1556 }); 1557 }).then(function (_a) { 1558 var numFailures = _a.numFailures, 1559 lastResult = _a.lastResult, 1560 failures = _a.failures; 1561 if (numFailures === 0) return lastResult; 1562 throw new BulkError(_this.name + ".bulkDelete(): " + numFailures + " of " + numKeys + " operations failed", failures); 1563 }); 1564 }; 1565 return Table; 1566 }(); 1567 function Events(ctx) { 1568 var evs = {}; 1569 var rv = function rv(eventName, subscriber) { 1570 if (subscriber) { 1571 var i = arguments.length, 1572 args = new Array(i - 1); 1573 while (--i) args[i - 1] = arguments[i]; 1574 evs[eventName].subscribe.apply(null, args); 1575 return ctx; 1576 } else if (typeof eventName === 'string') { 1577 return evs[eventName]; 1578 } 1579 }; 1580 rv.addEventType = add; 1581 for (var i = 1, l = arguments.length; i < l; ++i) { 1582 add(arguments[i]); 1583 } 1584 return rv; 1585 function add(eventName, chainFunction, defaultFunction) { 1586 if (babelHelpers["typeof"](eventName) === 'object') return addConfiguredEvents(eventName); 1587 if (!chainFunction) chainFunction = reverseStoppableEventChain; 1588 if (!defaultFunction) defaultFunction = nop; 1589 var context = { 1590 subscribers: [], 1591 fire: defaultFunction, 1592 subscribe: function subscribe(cb) { 1593 if (context.subscribers.indexOf(cb) === -1) { 1594 context.subscribers.push(cb); 1595 context.fire = chainFunction(context.fire, cb); 1596 } 1597 }, 1598 unsubscribe: function unsubscribe(cb) { 1599 context.subscribers = context.subscribers.filter(function (fn) { 1600 return fn !== cb; 1601 }); 1602 context.fire = context.subscribers.reduce(chainFunction, defaultFunction); 1603 } 1604 }; 1605 evs[eventName] = rv[eventName] = context; 1606 return context; 1607 } 1608 function addConfiguredEvents(cfg) { 1609 keys(cfg).forEach(function (eventName) { 1610 var args = cfg[eventName]; 1611 if (isArray(args)) { 1612 add(eventName, cfg[eventName][0], cfg[eventName][1]); 1613 } else if (args === 'asap') { 1614 var context = add(eventName, mirror, function fire() { 1615 var i = arguments.length, 1616 args = new Array(i); 1617 while (i--) args[i] = arguments[i]; 1618 context.subscribers.forEach(function (fn) { 1619 asap$1(function fireEvent() { 1620 fn.apply(null, args); 1621 }); 1622 }); 1623 }); 1624 } else throw new exceptions.InvalidArgument("Invalid event config"); 1625 }); 1626 } 1627 } 1628 function makeClassConstructor(prototype, constructor) { 1629 derive(constructor).from({ 1630 prototype: prototype 1631 }); 1632 return constructor; 1633 } 1634 function createTableConstructor(db) { 1635 return makeClassConstructor(Table.prototype, function Table(name, tableSchema, trans) { 1636 this.db = db; 1637 this._tx = trans; 1638 this.name = name; 1639 this.schema = tableSchema; 1640 this.hook = db._allTables[name] ? db._allTables[name].hook : Events(null, { 1641 "creating": [hookCreatingChain, nop], 1642 "reading": [pureFunctionChain, mirror], 1643 "updating": [hookUpdatingChain, nop], 1644 "deleting": [hookDeletingChain, nop] 1645 }); 1646 }); 1647 } 1648 function isPlainKeyRange(ctx, ignoreLimitFilter) { 1649 return !(ctx.filter || ctx.algorithm || ctx.or) && (ignoreLimitFilter ? ctx.justLimit : !ctx.replayFilter); 1650 } 1651 function addFilter(ctx, fn) {
vendor: 5,565 bytes, lines 1652-1822
1652 ctx.filter = combine(ctx.filter, fn); 1653 } 1654 function addReplayFilter(ctx, factory, isLimitFilter) { 1655 var curr = ctx.replayFilter; 1656 ctx.replayFilter = curr ? function () { 1657 return combine(curr(), factory()); 1658 } : factory; 1659 ctx.justLimit = isLimitFilter && !curr; 1660 } 1661 function addMatchFilter(ctx, fn) { 1662 ctx.isMatch = combine(ctx.isMatch, fn); 1663 } 1664 function getIndexOrStore(ctx, coreSchema) { 1665 if (ctx.isPrimKey) return coreSchema.primaryKey; 1666 var index = coreSchema.getIndexByKeyPath(ctx.index); 1667 if (!index) throw new exceptions.Schema("KeyPath " + ctx.index + " on object store " + coreSchema.name + " is not indexed"); 1668 return index; 1669 } 1670 function openCursor(ctx, coreTable, trans) { 1671 var index = getIndexOrStore(ctx, coreTable.schema); 1672 return coreTable.openCursor({ 1673 trans: trans, 1674 values: !ctx.keysOnly, 1675 reverse: ctx.dir === 'prev', 1676 unique: !!ctx.unique, 1677 query: { 1678 index: index, 1679 range: ctx.range 1680 } 1681 }); 1682 } 1683 function iter(ctx, fn, coreTrans, coreTable) { 1684 var filter = ctx.replayFilter ? combine(ctx.filter, ctx.replayFilter()) : ctx.filter; 1685 if (!ctx.or) { 1686 return iterate(openCursor(ctx, coreTable, coreTrans), combine(ctx.algorithm, filter), fn, !ctx.keysOnly && ctx.valueMapper); 1687 } else { 1688 var set_1 = {}; 1689 var union = function union(item, cursor, advance) { 1690 if (!filter || filter(cursor, advance, function (result) { 1691 return cursor.stop(result); 1692 }, function (err) { 1693 return cursor.fail(err); 1694 })) { 1695 var primaryKey = cursor.primaryKey; 1696 var key = '' + primaryKey; 1697 if (key === '[object ArrayBuffer]') key = '' + new Uint8Array(primaryKey); 1698 if (!hasOwn(set_1, key)) { 1699 set_1[key] = true; 1700 fn(item, cursor, advance); 1701 } 1702 } 1703 }; 1704 return Promise.all([ctx.or._iterate(union, coreTrans), iterate(openCursor(ctx, coreTable, coreTrans), ctx.algorithm, union, !ctx.keysOnly && ctx.valueMapper)]); 1705 } 1706 } 1707 function iterate(cursorPromise, filter, fn, valueMapper) { 1708 var mappedFn = valueMapper ? function (x, c, a) { 1709 return fn(valueMapper(x), c, a); 1710 } : fn; 1711 var wrappedFn = wrap(mappedFn); 1712 return cursorPromise.then(function (cursor) { 1713 if (cursor) { 1714 return cursor.start(function () { 1715 var c = function c() { 1716 return cursor["continue"](); 1717 }; 1718 if (!filter || filter(cursor, function (advancer) { 1719 return c = advancer; 1720 }, function (val) { 1721 cursor.stop(val); 1722 c = nop; 1723 }, function (e) { 1724 cursor.fail(e); 1725 c = nop; 1726 })) wrappedFn(cursor.value, cursor, function (advancer) { 1727 return c = advancer; 1728 }); 1729 c(); 1730 }); 1731 } 1732 }); 1733 } 1734 function cmp(a, b) { 1735 try { 1736 var ta = type(a); 1737 var tb = type(b); 1738 if (ta !== tb) { 1739 if (ta === 'Array') return 1; 1740 if (tb === 'Array') return -1; 1741 if (ta === 'binary') return 1; 1742 if (tb === 'binary') return -1; 1743 if (ta === 'string') return 1; 1744 if (tb === 'string') return -1; 1745 if (ta === 'Date') return 1; 1746 if (tb !== 'Date') return NaN; 1747 return -1; 1748 } 1749 switch (ta) { 1750 case 'number': 1751 case 'Date': 1752 case 'string': 1753 return a > b ? 1 : a < b ? -1 : 0; 1754 case 'binary': 1755 { 1756 return compareUint8Arrays(getUint8Array(a), getUint8Array(b)); 1757 } 1758 case 'Array': 1759 return compareArrays(a, b); 1760 } 1761 } catch (_a) {} 1762 return NaN; 1763 } 1764 function compareArrays(a, b) { 1765 var al = a.length; 1766 var bl = b.length; 1767 var l = al < bl ? al : bl; 1768 for (var i = 0; i < l; ++i) { 1769 var res = cmp(a[i], b[i]); 1770 if (res !== 0) return res; 1771 } 1772 return al === bl ? 0 : al < bl ? -1 : 1; 1773 } 1774 function compareUint8Arrays(a, b) { 1775 var al = a.length; 1776 var bl = b.length; 1777 var l = al < bl ? al : bl; 1778 for (var i = 0; i < l; ++i) { 1779 if (a[i] !== b[i]) return a[i] < b[i] ? -1 : 1; 1780 } 1781 return al === bl ? 0 : al < bl ? -1 : 1; 1782 } 1783 function type(x) { 1784 var t = babelHelpers["typeof"](x); 1785 if (t !== 'object') return t; 1786 if (ArrayBuffer.isView(x)) return 'binary'; 1787 var tsTag = toStringTag(x); 1788 return tsTag === 'ArrayBuffer' ? 'binary' : tsTag; 1789 } 1790 function getUint8Array(a) { 1791 if (a instanceof Uint8Array) return a; 1792 if (ArrayBuffer.isView(a)) return new Uint8Array(a.buffer, a.byteOffset, a.byteLength); 1793 return new Uint8Array(a); 1794 } 1795 var Collection = function () { 1796 function Collection() {} 1797 Collection.prototype._read = function (fn, cb) { 1798 var ctx = this._ctx; 1799 return ctx.error ? ctx.table._trans(null, rejection.bind(null, ctx.error)) : ctx.table._trans('readonly', fn).then(cb); 1800 }; 1801 Collection.prototype._write = function (fn) { 1802 var ctx = this._ctx; 1803 return ctx.error ? ctx.table._trans(null, rejection.bind(null, ctx.error)) : ctx.table._trans('readwrite', fn, "locked"); 1804 }; 1805 Collection.prototype._addAlgorithm = function (fn) { 1806 var ctx = this._ctx; 1807 ctx.algorithm = combine(ctx.algorithm, fn); 1808 }; 1809 Collection.prototype._iterate = function (fn, coreTrans) { 1810 return iter(this._ctx, fn, coreTrans, this._ctx.table.core); 1811 }; 1812 Collection.prototype.clone = function (props) { 1813 var rv = Object.create(this.constructor.prototype), 1814 ctx = Object.create(this._ctx); 1815 if (props) extend(ctx, props); 1816 rv._ctx = ctx; 1817 return rv; 1818 }; 1819 Collection.prototype.raw = function () { 1820 this._ctx.valueMapper = null; 1821 return this; 1822 };
1823 Collection.prototype.each = function (fn) { 1824 var ctx = this._ctx; 1825 return this._read(function (trans) { 1826 return iter(ctx, fn, trans, ctx.table.core); 1827 }); 1828 }; 1829 Collection.prototype.count = function (cb) { 1830 var _this = this; 1831 return this._read(function (trans) { 1832 var ctx = _this._ctx; 1833 var coreTable = ctx.table.core; 1834 if (isPlainKeyRange(ctx, true)) { 1835 return coreTable.count({ 1836 trans: trans, 1837 query: { 1838 index: getIndexOrStore(ctx, coreTable.schema), 1839 range: ctx.range 1840 } 1841 }).then(function (count) { 1842 return Math.min(count, ctx.limit); 1843 }); 1844 } else { 1845 var count = 0; 1846 return iter(ctx, function () { 1847 ++count; 1848 return false; 1849 }, trans, coreTable).then(function () { 1850 return count; 1851 }); 1852 } 1853 }).then(cb); 1854 }; 1855 Collection.prototype.sortBy = function (keyPath, cb) { 1856 var parts = keyPath.split('.').reverse(), 1857 lastPart = parts[0], 1858 lastIndex = parts.length - 1; 1859 function getval(obj, i) { 1860 if (i) return getval(obj[parts[i]], i - 1); 1861 return obj[lastPart]; 1862 } 1863 var order = this._ctx.dir === "next" ? 1 : -1; 1864 function sorter(a, b) { 1865 var aVal = getval(a, lastIndex), 1866 bVal = getval(b, lastIndex); 1867 return aVal < bVal ? -order : aVal > bVal ? order : 0; 1868 } 1869 return this.toArray(function (a) { 1870 return a.sort(sorter); 1871 }).then(cb); 1872 };
vendor: 1,749 bytes, lines 1873-1931
1873 Collection.prototype.toArray = function (cb) { 1874 var _this = this; 1875 return this._read(function (trans) { 1876 var ctx = _this._ctx; 1877 if (ctx.dir === 'next' && isPlainKeyRange(ctx, true) && ctx.limit > 0) { 1878 var valueMapper_1 = ctx.valueMapper; 1879 var index = getIndexOrStore(ctx, ctx.table.core.schema); 1880 return ctx.table.core.query({ 1881 trans: trans, 1882 limit: ctx.limit, 1883 values: true, 1884 query: { 1885 index: index, 1886 range: ctx.range 1887 } 1888 }).then(function (_a) { 1889 var result = _a.result; 1890 return valueMapper_1 ? result.map(valueMapper_1) : result; 1891 }); 1892 } else { 1893 var a_1 = []; 1894 return iter(ctx, function (item) { 1895 return a_1.push(item); 1896 }, trans, ctx.table.core).then(function () { 1897 return a_1; 1898 }); 1899 } 1900 }, cb); 1901 }; 1902 Collection.prototype.offset = function (offset) { 1903 var ctx = this._ctx; 1904 if (offset <= 0) return this; 1905 ctx.offset += offset; 1906 if (isPlainKeyRange(ctx)) { 1907 addReplayFilter(ctx, function () { 1908 var offsetLeft = offset; 1909 return function (cursor, advance) { 1910 if (offsetLeft === 0) return true; 1911 if (offsetLeft === 1) { 1912 --offsetLeft; 1913 return false; 1914 } 1915 advance(function () { 1916 cursor.advance(offsetLeft); 1917 offsetLeft = 0; 1918 }); 1919 return false; 1920 }; 1921 }); 1922 } else { 1923 addReplayFilter(ctx, function () { 1924 var offsetLeft = offset; 1925 return function () { 1926 return --offsetLeft < 0; 1927 }; 1928 }); 1929 } 1930 return this; 1931 };
vendor: 2,482 bytes, lines 1932-2010
1932 Collection.prototype.limit = function (numRows) { 1933 this._ctx.limit = Math.min(this._ctx.limit, numRows); 1934 addReplayFilter(this._ctx, function () { 1935 var rowsLeft = numRows; 1936 return function (cursor, advance, resolve) { 1937 if (--rowsLeft <= 0) advance(resolve); 1938 return rowsLeft >= 0; 1939 }; 1940 }, true); 1941 return this; 1942 }; 1943 Collection.prototype.until = function (filterFunction, bIncludeStopEntry) { 1944 addFilter(this._ctx, function (cursor, advance, resolve) { 1945 if (filterFunction(cursor.value)) { 1946 advance(resolve); 1947 return bIncludeStopEntry; 1948 } else { 1949 return true; 1950 } 1951 }); 1952 return this; 1953 }; 1954 Collection.prototype.first = function (cb) { 1955 return this.limit(1).toArray(function (a) { 1956 return a[0]; 1957 }).then(cb); 1958 }; 1959 Collection.prototype.last = function (cb) { 1960 return this.reverse().first(cb); 1961 }; 1962 Collection.prototype.filter = function (filterFunction) { 1963 addFilter(this._ctx, function (cursor) { 1964 return filterFunction(cursor.value); 1965 }); 1966 addMatchFilter(this._ctx, filterFunction); 1967 return this; 1968 }; 1969 Collection.prototype.and = function (filter) { 1970 return this.filter(filter); 1971 }; 1972 Collection.prototype.or = function (indexName) { 1973 return new this.db.WhereClause(this._ctx.table, indexName, this); 1974 }; 1975 Collection.prototype.reverse = function () { 1976 this._ctx.dir = this._ctx.dir === "prev" ? "next" : "prev"; 1977 if (this._ondirectionchange) this._ondirectionchange(this._ctx.dir); 1978 return this; 1979 }; 1980 Collection.prototype.desc = function () { 1981 return this.reverse(); 1982 }; 1983 Collection.prototype.eachKey = function (cb) { 1984 var ctx = this._ctx; 1985 ctx.keysOnly = !ctx.isMatch; 1986 return this.each(function (val, cursor) { 1987 cb(cursor.key, cursor); 1988 }); 1989 }; 1990 Collection.prototype.eachUniqueKey = function (cb) { 1991 this._ctx.unique = "unique"; 1992 return this.eachKey(cb); 1993 }; 1994 Collection.prototype.eachPrimaryKey = function (cb) { 1995 var ctx = this._ctx; 1996 ctx.keysOnly = !ctx.isMatch; 1997 return this.each(function (val, cursor) { 1998 cb(cursor.primaryKey, cursor); 1999 }); 2000 }; 2001 Collection.prototype.keys = function (cb) { 2002 var ctx = this._ctx; 2003 ctx.keysOnly = !ctx.isMatch; 2004 var a = []; 2005 return this.each(function (item, cursor) { 2006 a.push(cursor.key); 2007 }).then(function () { 2008 return a; 2009 }).then(cb); 2010 };
vendor: 1,067 bytes, lines 2011-2046
2011 Collection.prototype.primaryKeys = function (cb) { 2012 var ctx = this._ctx; 2013 if (ctx.dir === 'next' && isPlainKeyRange(ctx, true) && ctx.limit > 0) { 2014 return this._read(function (trans) { 2015 var index = getIndexOrStore(ctx, ctx.table.core.schema); 2016 return ctx.table.core.query({ 2017 trans: trans, 2018 values: false, 2019 limit: ctx.limit, 2020 query: { 2021 index: index, 2022 range: ctx.range 2023 } 2024 }); 2025 }).then(function (_a) { 2026 var result = _a.result; 2027 return result; 2028 }).then(cb); 2029 } 2030 ctx.keysOnly = !ctx.isMatch; 2031 var a = []; 2032 return this.each(function (item, cursor) { 2033 a.push(cursor.primaryKey); 2034 }).then(function () { 2035 return a; 2036 }).then(cb); 2037 }; 2038 Collection.prototype.uniqueKeys = function (cb) { 2039 this._ctx.unique = "unique"; 2040 return this.keys(cb); 2041 }; 2042 Collection.prototype.firstKey = function (cb) { 2043 return this.limit(1).keys(function (a) { 2044 return a[0]; 2045 }).then(cb); 2046 };
2047 Collection.prototype.lastKey = function (cb) { 2048 return this.reverse().firstKey(cb); 2049 }; 2050 Collection.prototype.distinct = function () { 2051 var ctx = this._ctx, 2052 idx = ctx.index && ctx.table.schema.idxByName[ctx.index]; 2053 if (!idx || !idx.multi) return this; 2054 var set = {}; 2055 addFilter(this._ctx, function (cursor) { 2056 var strKey = cursor.primaryKey.toString(); 2057 var found = hasOwn(set, strKey); 2058 set[strKey] = true; 2059 return !found; 2060 }); 2061 return this; 2062 }; 2063 Collection.prototype.modify = function (changes) { 2064 var _this = this; 2065 var ctx = this._ctx; 2066 return this._write(function (trans) { 2067 var modifyer; 2068 if (typeof changes === 'function') { 2069 modifyer = changes; 2070 } else { 2071 var keyPaths = keys(changes); 2072 var numKeys = keyPaths.length; 2073 modifyer = function modifyer(item) { 2074 var anythingModified = false; 2075 for (var i = 0; i < numKeys; ++i) { 2076 var keyPath = keyPaths[i], 2077 val = changes[keyPath]; 2078 if (getByKeyPath(item, keyPath) !== val) { 2079 setByKeyPath(item, keyPath, val); 2080 anythingModified = true; 2081 } 2082 } 2083 return anythingModified; 2084 }; 2085 } 2086 var coreTable = ctx.table.core; 2087 var _a = coreTable.schema.primaryKey, 2088 outbound = _a.outbound, 2089 extractKey = _a.extractKey; 2090 var limit = _this.db._options.modifyChunkSize || 200; 2091 var totalFailures = []; 2092 var successCount = 0; 2093 var failedKeys = []; 2094 var applyMutateResult = function applyMutateResult(expectedCount, res) { 2095 var failures = res.failures, 2096 numFailures = res.numFailures; 2097 successCount += expectedCount - numFailures; 2098 for (var _i = 0, _a = keys(failures); _i < _a.length; _i++) { 2099 var pos = _a[_i]; 2100 totalFailures.push(failures[pos]); 2101 } 2102 }; 2103 return _this.clone().primaryKeys().then(function (keys) { 2104 var nextChunk = function nextChunk(offset) { 2105 var count = Math.min(limit, keys.length - offset); 2106 return coreTable.getMany({ 2107 trans: trans, 2108 keys: keys.slice(offset, offset + count), 2109 cache: "immutable" 2110 }).then(function (values) { 2111 var addValues = []; 2112 var putValues = []; 2113 var putKeys = outbound ? [] : null; 2114 var deleteKeys = []; 2115 for (var i = 0; i < count; ++i) { 2116 var origValue = values[i]; 2117 var ctx_1 = { 2118 value: deepClone(origValue), 2119 primKey: keys[offset + i] 2120 }; 2121 if (modifyer.call(ctx_1, ctx_1.value, ctx_1) !== false) { 2122 if (ctx_1.value == null) { 2123 deleteKeys.push(keys[offset + i]); 2124 } else if (!outbound && cmp(extractKey(origValue), extractKey(ctx_1.value)) !== 0) { 2125 deleteKeys.push(keys[offset + i]); 2126 addValues.push(ctx_1.value); 2127 } else { 2128 putValues.push(ctx_1.value); 2129 if (outbound) putKeys.push(keys[offset + i]); 2130 } 2131 } 2132 } 2133 var criteria = isPlainKeyRange(ctx) && ctx.limit === Infinity && (typeof changes !== 'function' || changes === deleteCallback) && { 2134 index: ctx.index, 2135 range: ctx.range 2136 }; 2137 return Promise.resolve(addValues.length > 0 && coreTable.mutate({ 2138 trans: trans, 2139 type: 'add', 2140 values: addValues 2141 }).then(function (res) { 2142 for (var pos in res.failures) { 2143 deleteKeys.splice(parseInt(pos), 1); 2144 } 2145 applyMutateResult(addValues.length, res); 2146 })).then(function () { 2147 return (putValues.length > 0 || criteria && babelHelpers["typeof"](changes) === 'object') && coreTable.mutate({ 2148 trans: trans, 2149 type: 'put', 2150 keys: putKeys, 2151 values: putValues, 2152 criteria: criteria, 2153 changeSpec: typeof changes !== 'function' && changes 2154 }).then(function (res) { 2155 return applyMutateResult(putValues.length, res); 2156 }); 2157 }).then(function () { 2158 return (deleteKeys.length > 0 || criteria && changes === deleteCallback) && coreTable.mutate({ 2159 trans: trans, 2160 type: 'delete', 2161 keys: deleteKeys, 2162 criteria: criteria 2163 }).then(function (res) { 2164 return applyMutateResult(deleteKeys.length, res); 2165 }); 2166 }).then(function () { 2167 return keys.length > offset + count && nextChunk(offset + limit); 2168 }); 2169 }); 2170 }; 2171 return nextChunk(0).then(function () { 2172 if (totalFailures.length > 0) throw new ModifyError("Error modifying one or more objects", totalFailures, successCount, failedKeys); 2173 return keys.length; 2174 }); 2175 }); 2176 }); 2177 };
vendor: 4,103 bytes, lines 2178-2294
2178 Collection.prototype["delete"] = function () { 2179 var ctx = this._ctx, 2180 range = ctx.range; 2181 if (isPlainKeyRange(ctx) && (ctx.isPrimKey && !hangsOnDeleteLargeKeyRange || range.type === 3)) { 2182 return this._write(function (trans) { 2183 var primaryKey = ctx.table.core.schema.primaryKey; 2184 var coreRange = range; 2185 return ctx.table.core.count({ 2186 trans: trans, 2187 query: { 2188 index: primaryKey, 2189 range: coreRange 2190 } 2191 }).then(function (count) { 2192 return ctx.table.core.mutate({ 2193 trans: trans, 2194 type: 'deleteRange', 2195 range: coreRange 2196 }).then(function (_a) { 2197 var failures = _a.failures; 2198 _a.lastResult; 2199 _a.results; 2200 var numFailures = _a.numFailures; 2201 if (numFailures) throw new ModifyError("Could not delete some values", Object.keys(failures).map(function (pos) { 2202 return failures[pos]; 2203 }), count - numFailures); 2204 return count - numFailures; 2205 }); 2206 }); 2207 }); 2208 } 2209 return this.modify(deleteCallback); 2210 }; 2211 return Collection; 2212 }(); 2213 var deleteCallback = function deleteCallback(value, ctx) { 2214 return ctx.value = null; 2215 }; 2216 function createCollectionConstructor(db) { 2217 return makeClassConstructor(Collection.prototype, function Collection(whereClause, keyRangeGenerator) { 2218 this.db = db; 2219 var keyRange = AnyRange, 2220 error = null; 2221 if (keyRangeGenerator) try { 2222 keyRange = keyRangeGenerator(); 2223 } catch (ex) { 2224 error = ex; 2225 } 2226 var whereCtx = whereClause._ctx; 2227 var table = whereCtx.table; 2228 var readingHook = table.hook.reading.fire; 2229 this._ctx = { 2230 table: table, 2231 index: whereCtx.index, 2232 isPrimKey: !whereCtx.index || table.schema.primKey.keyPath && whereCtx.index === table.schema.primKey.name, 2233 range: keyRange, 2234 keysOnly: false, 2235 dir: "next", 2236 unique: "", 2237 algorithm: null, 2238 filter: null, 2239 replayFilter: null, 2240 justLimit: true, 2241 isMatch: null, 2242 offset: 0, 2243 limit: Infinity, 2244 error: error, 2245 or: whereCtx.or, 2246 valueMapper: readingHook !== mirror ? readingHook : null 2247 }; 2248 }); 2249 } 2250 function simpleCompare(a, b) { 2251 return a < b ? -1 : a === b ? 0 : 1; 2252 } 2253 function simpleCompareReverse(a, b) { 2254 return a > b ? -1 : a === b ? 0 : 1; 2255 } 2256 function fail(collectionOrWhereClause, err, T) { 2257 var collection = collectionOrWhereClause instanceof WhereClause ? new collectionOrWhereClause.Collection(collectionOrWhereClause) : collectionOrWhereClause; 2258 collection._ctx.error = T ? new T(err) : new TypeError(err); 2259 return collection; 2260 } 2261 function emptyCollection(whereClause) { 2262 return new whereClause.Collection(whereClause, function () { 2263 return rangeEqual(""); 2264 }).limit(0); 2265 } 2266 function upperFactory(dir) { 2267 return dir === "next" ? function (s) { 2268 return s.toUpperCase(); 2269 } : function (s) { 2270 return s.toLowerCase(); 2271 }; 2272 } 2273 function lowerFactory(dir) { 2274 return dir === "next" ? function (s) { 2275 return s.toLowerCase(); 2276 } : function (s) { 2277 return s.toUpperCase(); 2278 }; 2279 } 2280 function nextCasing(key, lowerKey, upperNeedle, lowerNeedle, cmp, dir) { 2281 var length = Math.min(key.length, lowerNeedle.length); 2282 var llp = -1; 2283 for (var i = 0; i < length; ++i) { 2284 var lwrKeyChar = lowerKey[i]; 2285 if (lwrKeyChar !== lowerNeedle[i]) { 2286 if (cmp(key[i], upperNeedle[i]) < 0) return key.substr(0, i) + upperNeedle[i] + upperNeedle.substr(i + 1); 2287 if (cmp(key[i], lowerNeedle[i]) < 0) return key.substr(0, i) + lowerNeedle[i] + upperNeedle.substr(i + 1); 2288 if (llp >= 0) return key.substr(0, llp) + lowerKey[llp] + upperNeedle.substr(llp + 1); 2289 return null; 2290 } 2291 if (cmp(key[i], lwrKeyChar) < 0) llp = i; 2292 } 2293 if (length < lowerNeedle.length && dir === "next") return key + upperNeedle.substr(key.length); 2294 if (length < key.length && dir === "prev") return key.substr(0, upperNeedle.length);
vendor: 10,368 bytes, lines 2295-2590
2295 return llp < 0 ? null : key.substr(0, llp) + lowerNeedle[llp] + upperNeedle.substr(llp + 1); 2296 } 2297 function addIgnoreCaseAlgorithm(whereClause, match, needles, suffix) { 2298 var upper, 2299 lower, 2300 compare, 2301 upperNeedles, 2302 lowerNeedles, 2303 direction, 2304 nextKeySuffix, 2305 needlesLen = needles.length; 2306 if (!needles.every(function (s) { 2307 return typeof s === 'string'; 2308 })) { 2309 return fail(whereClause, STRING_EXPECTED); 2310 } 2311 function initDirection(dir) { 2312 upper = upperFactory(dir); 2313 lower = lowerFactory(dir); 2314 compare = dir === "next" ? simpleCompare : simpleCompareReverse; 2315 var needleBounds = needles.map(function (needle) { 2316 return { 2317 lower: lower(needle), 2318 upper: upper(needle) 2319 }; 2320 }).sort(function (a, b) { 2321 return compare(a.lower, b.lower); 2322 }); 2323 upperNeedles = needleBounds.map(function (nb) { 2324 return nb.upper; 2325 }); 2326 lowerNeedles = needleBounds.map(function (nb) { 2327 return nb.lower; 2328 }); 2329 direction = dir; 2330 nextKeySuffix = dir === "next" ? "" : suffix; 2331 } 2332 initDirection("next"); 2333 var c = new whereClause.Collection(whereClause, function () { 2334 return createRange(upperNeedles[0], lowerNeedles[needlesLen - 1] + suffix); 2335 }); 2336 c._ondirectionchange = function (direction) { 2337 initDirection(direction); 2338 }; 2339 var firstPossibleNeedle = 0; 2340 c._addAlgorithm(function (cursor, advance, resolve) { 2341 var key = cursor.key; 2342 if (typeof key !== 'string') return false; 2343 var lowerKey = lower(key); 2344 if (match(lowerKey, lowerNeedles, firstPossibleNeedle)) { 2345 return true; 2346 } else { 2347 var lowestPossibleCasing = null; 2348 for (var i = firstPossibleNeedle; i < needlesLen; ++i) { 2349 var casing = nextCasing(key, lowerKey, upperNeedles[i], lowerNeedles[i], compare, direction); 2350 if (casing === null && lowestPossibleCasing === null) firstPossibleNeedle = i + 1;else if (lowestPossibleCasing === null || compare(lowestPossibleCasing, casing) > 0) { 2351 lowestPossibleCasing = casing; 2352 } 2353 } 2354 if (lowestPossibleCasing !== null) { 2355 advance(function () { 2356 cursor["continue"](lowestPossibleCasing + nextKeySuffix); 2357 }); 2358 } else { 2359 advance(resolve); 2360 } 2361 return false; 2362 } 2363 }); 2364 return c; 2365 } 2366 function createRange(lower, upper, lowerOpen, upperOpen) { 2367 return { 2368 type: 2, 2369 lower: lower, 2370 upper: upper, 2371 lowerOpen: lowerOpen, 2372 upperOpen: upperOpen 2373 }; 2374 } 2375 function rangeEqual(value) { 2376 return { 2377 type: 1, 2378 lower: value, 2379 upper: value 2380 }; 2381 } 2382 var WhereClause = function () { 2383 function WhereClause() {} 2384 Object.defineProperty(WhereClause.prototype, "Collection", { 2385 get: function get() { 2386 return this._ctx.table.db.Collection; 2387 }, 2388 enumerable: false, 2389 configurable: true 2390 }); 2391 WhereClause.prototype.between = function (lower, upper, includeLower, includeUpper) { 2392 includeLower = includeLower !== false; 2393 includeUpper = includeUpper === true; 2394 try { 2395 if (this._cmp(lower, upper) > 0 || this._cmp(lower, upper) === 0 && (includeLower || includeUpper) && !(includeLower && includeUpper)) return emptyCollection(this); 2396 return new this.Collection(this, function () { 2397 return createRange(lower, upper, !includeLower, !includeUpper); 2398 }); 2399 } catch (e) { 2400 return fail(this, INVALID_KEY_ARGUMENT); 2401 } 2402 }; 2403 WhereClause.prototype.equals = function (value) { 2404 if (value == null) return fail(this, INVALID_KEY_ARGUMENT); 2405 return new this.Collection(this, function () { 2406 return rangeEqual(value); 2407 }); 2408 }; 2409 WhereClause.prototype.above = function (value) { 2410 if (value == null) return fail(this, INVALID_KEY_ARGUMENT); 2411 return new this.Collection(this, function () { 2412 return createRange(value, undefined, true); 2413 }); 2414 }; 2415 WhereClause.prototype.aboveOrEqual = function (value) { 2416 if (value == null) return fail(this, INVALID_KEY_ARGUMENT); 2417 return new this.Collection(this, function () { 2418 return createRange(value, undefined, false); 2419 }); 2420 }; 2421 WhereClause.prototype.below = function (value) { 2422 if (value == null) return fail(this, INVALID_KEY_ARGUMENT); 2423 return new this.Collection(this, function () { 2424 return createRange(undefined, value, false, true); 2425 }); 2426 }; 2427 WhereClause.prototype.belowOrEqual = function (value) { 2428 if (value == null) return fail(this, INVALID_KEY_ARGUMENT); 2429 return new this.Collection(this, function () { 2430 return createRange(undefined, value); 2431 }); 2432 }; 2433 WhereClause.prototype.startsWith = function (str) { 2434 if (typeof str !== 'string') return fail(this, STRING_EXPECTED); 2435 return this.between(str, str + maxString, true, true); 2436 }; 2437 WhereClause.prototype.startsWithIgnoreCase = function (str) { 2438 if (str === "") return this.startsWith(str); 2439 return addIgnoreCaseAlgorithm(this, function (x, a) { 2440 return x.indexOf(a[0]) === 0; 2441 }, [str], maxString); 2442 }; 2443 WhereClause.prototype.equalsIgnoreCase = function (str) { 2444 return addIgnoreCaseAlgorithm(this, function (x, a) { 2445 return x === a[0]; 2446 }, [str], ""); 2447 }; 2448 WhereClause.prototype.anyOfIgnoreCase = function () { 2449 var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); 2450 if (set.length === 0) return emptyCollection(this); 2451 return addIgnoreCaseAlgorithm(this, function (x, a) { 2452 return a.indexOf(x) !== -1; 2453 }, set, ""); 2454 }; 2455 WhereClause.prototype.startsWithAnyOfIgnoreCase = function () { 2456 var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); 2457 if (set.length === 0) return emptyCollection(this); 2458 return addIgnoreCaseAlgorithm(this, function (x, a) { 2459 return a.some(function (n) { 2460 return x.indexOf(n) === 0; 2461 }); 2462 }, set, maxString); 2463 }; 2464 WhereClause.prototype.anyOf = function () { 2465 var _this = this; 2466 var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); 2467 var compare = this._cmp; 2468 try { 2469 set.sort(compare); 2470 } catch (e) { 2471 return fail(this, INVALID_KEY_ARGUMENT); 2472 } 2473 if (set.length === 0) return emptyCollection(this); 2474 var c = new this.Collection(this, function () { 2475 return createRange(set[0], set[set.length - 1]); 2476 }); 2477 c._ondirectionchange = function (direction) { 2478 compare = direction === "next" ? _this._ascending : _this._descending; 2479 set.sort(compare); 2480 }; 2481 var i = 0; 2482 c._addAlgorithm(function (cursor, advance, resolve) { 2483 var key = cursor.key; 2484 while (compare(key, set[i]) > 0) { 2485 ++i; 2486 if (i === set.length) { 2487 advance(resolve); 2488 return false; 2489 } 2490 } 2491 if (compare(key, set[i]) === 0) { 2492 return true; 2493 } else { 2494 advance(function () { 2495 cursor["continue"](set[i]); 2496 }); 2497 return false; 2498 } 2499 }); 2500 return c; 2501 }; 2502 WhereClause.prototype.notEqual = function (value) { 2503 return this.inAnyRange([[minKey, value], [value, this.db._maxKey]], { 2504 includeLowers: false, 2505 includeUppers: false 2506 }); 2507 }; 2508 WhereClause.prototype.noneOf = function () { 2509 var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); 2510 if (set.length === 0) return new this.Collection(this); 2511 try { 2512 set.sort(this._ascending); 2513 } catch (e) { 2514 return fail(this, INVALID_KEY_ARGUMENT); 2515 } 2516 var ranges = set.reduce(function (res, val) { 2517 return res ? res.concat([[res[res.length - 1][1], val]]) : [[minKey, val]]; 2518 }, null); 2519 ranges.push([set[set.length - 1], this.db._maxKey]); 2520 return this.inAnyRange(ranges, { 2521 includeLowers: false, 2522 includeUppers: false 2523 }); 2524 }; 2525 WhereClause.prototype.inAnyRange = function (ranges, options) { 2526 var _this = this; 2527 var cmp = this._cmp, 2528 ascending = this._ascending, 2529 descending = this._descending, 2530 min = this._min, 2531 max = this._max; 2532 if (ranges.length === 0) return emptyCollection(this); 2533 if (!ranges.every(function (range) { 2534 return range[0] !== undefined && range[1] !== undefined && ascending(range[0], range[1]) <= 0; 2535 })) { 2536 return fail(this, "First argument to inAnyRange() must be an Array of two-value Arrays [lower,upper] where upper must not be lower than lower", exceptions.InvalidArgument); 2537 } 2538 var includeLowers = !options || options.includeLowers !== false; 2539 var includeUppers = options && options.includeUppers === true; 2540 function addRange(ranges, newRange) { 2541 var i = 0, 2542 l = ranges.length; 2543 for (; i < l; ++i) { 2544 var range = ranges[i]; 2545 if (cmp(newRange[0], range[1]) < 0 && cmp(newRange[1], range[0]) > 0) { 2546 range[0] = min(range[0], newRange[0]); 2547 range[1] = max(range[1], newRange[1]); 2548 break; 2549 } 2550 } 2551 if (i === l) ranges.push(newRange); 2552 return ranges; 2553 } 2554 var sortDirection = ascending; 2555 function rangeSorter(a, b) { 2556 return sortDirection(a[0], b[0]); 2557 } 2558 var set; 2559 try { 2560 set = ranges.reduce(addRange, []); 2561 set.sort(rangeSorter); 2562 } catch (ex) { 2563 return fail(this, INVALID_KEY_ARGUMENT); 2564 } 2565 var rangePos = 0; 2566 var keyIsBeyondCurrentEntry = includeUppers ? function (key) { 2567 return ascending(key, set[rangePos][1]) > 0; 2568 } : function (key) { 2569 return ascending(key, set[rangePos][1]) >= 0; 2570 }; 2571 var keyIsBeforeCurrentEntry = includeLowers ? function (key) { 2572 return descending(key, set[rangePos][0]) > 0; 2573 } : function (key) { 2574 return descending(key, set[rangePos][0]) >= 0; 2575 }; 2576 function keyWithinCurrentRange(key) { 2577 return !keyIsBeyondCurrentEntry(key) && !keyIsBeforeCurrentEntry(key); 2578 } 2579 var checkKey = keyIsBeyondCurrentEntry; 2580 var c = new this.Collection(this, function () { 2581 return createRange(set[0][0], set[set.length - 1][1], !includeLowers, !includeUppers); 2582 }); 2583 c._ondirectionchange = function (direction) { 2584 if (direction === "next") { 2585 checkKey = keyIsBeyondCurrentEntry; 2586 sortDirection = ascending; 2587 } else { 2588 checkKey = keyIsBeforeCurrentEntry; 2589 sortDirection = descending; 2590 }
2591 set.sort(rangeSorter); 2592 }; 2593 c._addAlgorithm(function (cursor, advance, resolve) { 2594 var key = cursor.key; 2595 while (checkKey(key)) { 2596 ++rangePos; 2597 if (rangePos === set.length) { 2598 advance(resolve); 2599 return false; 2600 } 2601 } 2602 if (keyWithinCurrentRange(key)) { 2603 return true; 2604 } else if (_this._cmp(key, set[rangePos][1]) === 0 || _this._cmp(key, set[rangePos][0]) === 0) { 2605 return false; 2606 } else { 2607 advance(function () { 2608 if (sortDirection === ascending) cursor["continue"](set[rangePos][0]);else cursor["continue"](set[rangePos][1]); 2609 }); 2610 return false; 2611 } 2612 }); 2613 return c; 2614 }; 2615 WhereClause.prototype.startsWithAnyOf = function () { 2616 var set = getArrayOf.apply(NO_CHAR_ARRAY, arguments); 2617 if (!set.every(function (s) { 2618 return typeof s === 'string'; 2619 })) { 2620 return fail(this, "startsWithAnyOf() only works with strings"); 2621 } 2622 if (set.length === 0) return emptyCollection(this); 2623 return this.inAnyRange(set.map(function (str) { 2624 return [str, str + maxString]; 2625 })); 2626 }; 2627 return WhereClause; 2628 }(); 2629 function createWhereClauseConstructor(db) { 2630 return makeClassConstructor(WhereClause.prototype, function WhereClause(table, index, orCollection) { 2631 this.db = db; 2632 this._ctx = { 2633 table: table, 2634 index: index === ":id" ? null : index, 2635 or: orCollection 2636 }; 2637 var indexedDB = db._deps.indexedDB; 2638 if (!indexedDB) throw new exceptions.MissingAPI(); 2639 this._cmp = this._ascending = indexedDB.cmp.bind(indexedDB); 2640 this._descending = function (a, b) { 2641 return indexedDB.cmp(b, a); 2642 }; 2643 this._max = function (a, b) { 2644 return indexedDB.cmp(a, b) > 0 ? a : b; 2645 }; 2646 this._min = function (a, b) { 2647 return indexedDB.cmp(a, b) < 0 ? a : b; 2648 }; 2649 this._IDBKeyRange = db._deps.IDBKeyRange; 2650 }); 2651 } 2652 function eventRejectHandler(reject) { 2653 return wrap(function (event) { 2654 preventDefault(event); 2655 reject(event.target.error); 2656 return false; 2657 }); 2658 } 2659 function preventDefault(event) { 2660 if (event.stopPropagation) event.stopPropagation(); 2661 if (event.preventDefault) event.preventDefault(); 2662 } 2663 var DEXIE_STORAGE_MUTATED_EVENT_NAME = 'storagemutated'; 2664 var STORAGE_MUTATED_DOM_EVENT_NAME = 'x-storagemutated-1'; 2665 var globalEvents = Events(null, DEXIE_STORAGE_MUTATED_EVENT_NAME); 2666 var Transaction = function () { 2667 function Transaction() {} 2668 Transaction.prototype._lock = function () { 2669 assert(!PSD.global); 2670 ++this._reculock; 2671 if (this._reculock === 1 && !PSD.global) PSD.lockOwnerFor = this; 2672 return this; 2673 }; 2674 Transaction.prototype._unlock = function () { 2675 assert(!PSD.global); 2676 if (--this._reculock === 0) { 2677 if (!PSD.global) PSD.lockOwnerFor = null; 2678 while (this._blockedFuncs.length > 0 && !this._locked()) { 2679 var fnAndPSD = this._blockedFuncs.shift(); 2680 try { 2681 usePSD(fnAndPSD[1], fnAndPSD[0]); 2682 } catch (e) {} 2683 } 2684 } 2685 return this; 2686 }; 2687 Transaction.prototype._locked = function () { 2688 return this._reculock && PSD.lockOwnerFor !== this; 2689 }; 2690 Transaction.prototype.create = function (idbtrans) { 2691 var _this = this; 2692 if (!this.mode) return this; 2693 var idbdb = this.db.idbdb; 2694 var dbOpenError = this.db._state.dbOpenError; 2695 assert(!this.idbtrans); 2696 if (!idbtrans && !idbdb) { 2697 switch (dbOpenError && dbOpenError.name) { 2698 case "DatabaseClosedError": 2699 throw new exceptions.DatabaseClosed(dbOpenError); 2700 case "MissingAPIError": 2701 throw new exceptions.MissingAPI(dbOpenError.message, dbOpenError); 2702 default: 2703 throw new exceptions.OpenFailed(dbOpenError); 2704 } 2705 } 2706 if (!this.active) throw new exceptions.TransactionInactive(); 2707 assert(this._completion._state === null); 2708 idbtrans = this.idbtrans = idbtrans || (this.db.core ? this.db.core.transaction(this.storeNames, this.mode, { 2709 durability: this.chromeTransactionDurability 2710 }) : idbdb.transaction(this.storeNames, this.mode, { 2711 durability: this.chromeTransactionDurability 2712 })); 2713 idbtrans.onerror = wrap(function (ev) { 2714 preventDefault(ev); 2715 _this._reject(idbtrans.error); 2716 }); 2717 idbtrans.onabort = wrap(function (ev) { 2718 preventDefault(ev); 2719 _this.active && _this._reject(new exceptions.Abort(idbtrans.error)); 2720 _this.active = false;
vendor: 4,503 bytes, lines 2721-2842
2721 _this.on("abort").fire(ev); 2722 }); 2723 idbtrans.oncomplete = wrap(function () { 2724 _this.active = false; 2725 _this._resolve(); 2726 if ('mutatedParts' in idbtrans) { 2727 globalEvents.storagemutated.fire(idbtrans["mutatedParts"]); 2728 } 2729 }); 2730 return this; 2731 }; 2732 Transaction.prototype._promise = function (mode, fn, bWriteLock) { 2733 var _this = this; 2734 if (mode === 'readwrite' && this.mode !== 'readwrite') return rejection(new exceptions.ReadOnly("Transaction is readonly")); 2735 if (!this.active) return rejection(new exceptions.TransactionInactive()); 2736 if (this._locked()) { 2737 return new DexiePromise(function (resolve, reject) { 2738 _this._blockedFuncs.push([function () { 2739 _this._promise(mode, fn, bWriteLock).then(resolve, reject); 2740 }, PSD]); 2741 }); 2742 } else if (bWriteLock) { 2743 return newScope(function () { 2744 var p = new DexiePromise(function (resolve, reject) { 2745 _this._lock(); 2746 var rv = fn(resolve, reject, _this); 2747 if (rv && rv.then) rv.then(resolve, reject); 2748 }); 2749 p["finally"](function () { 2750 return _this._unlock(); 2751 }); 2752 p._lib = true; 2753 return p; 2754 }); 2755 } else { 2756 var p = new DexiePromise(function (resolve, reject) { 2757 var rv = fn(resolve, reject, _this); 2758 if (rv && rv.then) rv.then(resolve, reject); 2759 }); 2760 p._lib = true; 2761 return p; 2762 } 2763 }; 2764 Transaction.prototype._root = function () { 2765 return this.parent ? this.parent._root() : this; 2766 }; 2767 Transaction.prototype.waitFor = function (promiseLike) { 2768 var root = this._root(); 2769 var promise = DexiePromise.resolve(promiseLike); 2770 if (root._waitingFor) { 2771 root._waitingFor = root._waitingFor.then(function () { 2772 return promise; 2773 }); 2774 } else { 2775 root._waitingFor = promise; 2776 root._waitingQueue = []; 2777 var store = root.idbtrans.objectStore(root.storeNames[0]); 2778 (function spin() { 2779 ++root._spinCount; 2780 while (root._waitingQueue.length) root._waitingQueue.shift()(); 2781 if (root._waitingFor) store.get(-Infinity).onsuccess = spin; 2782 })(); 2783 } 2784 var currentWaitPromise = root._waitingFor; 2785 return new DexiePromise(function (resolve, reject) { 2786 promise.then(function (res) { 2787 return root._waitingQueue.push(wrap(resolve.bind(null, res))); 2788 }, function (err) { 2789 return root._waitingQueue.push(wrap(reject.bind(null, err))); 2790 })["finally"](function () { 2791 if (root._waitingFor === currentWaitPromise) { 2792 root._waitingFor = null; 2793 } 2794 }); 2795 }); 2796 }; 2797 Transaction.prototype.abort = function () { 2798 if (this.active) { 2799 this.active = false; 2800 if (this.idbtrans) this.idbtrans.abort(); 2801 this._reject(new exceptions.Abort()); 2802 } 2803 }; 2804 Transaction.prototype.table = function (tableName) { 2805 var memoizedTables = this._memoizedTables || (this._memoizedTables = {}); 2806 if (hasOwn(memoizedTables, tableName)) return memoizedTables[tableName]; 2807 var tableSchema = this.schema[tableName]; 2808 if (!tableSchema) { 2809 throw new exceptions.NotFound("Table " + tableName + " not part of transaction"); 2810 } 2811 var transactionBoundTable = new this.db.Table(tableName, tableSchema, this); 2812 transactionBoundTable.core = this.db.core.table(tableName); 2813 memoizedTables[tableName] = transactionBoundTable; 2814 return transactionBoundTable; 2815 }; 2816 return Transaction; 2817 }(); 2818 function createTransactionConstructor(db) { 2819 return makeClassConstructor(Transaction.prototype, function Transaction(mode, storeNames, dbschema, chromeTransactionDurability, parent) { 2820 var _this = this; 2821 this.db = db; 2822 this.mode = mode; 2823 this.storeNames = storeNames; 2824 this.schema = dbschema; 2825 this.chromeTransactionDurability = chromeTransactionDurability; 2826 this.idbtrans = null; 2827 this.on = Events(this, "complete", "error", "abort"); 2828 this.parent = parent || null; 2829 this.active = true; 2830 this._reculock = 0; 2831 this._blockedFuncs = []; 2832 this._resolve = null; 2833 this._reject = null; 2834 this._waitingFor = null; 2835 this._waitingQueue = null; 2836 this._spinCount = 0; 2837 this._completion = new DexiePromise(function (resolve, reject) { 2838 _this._resolve = resolve; 2839 _this._reject = reject; 2840 }); 2841 this._completion.then(function () { 2842 _this.active = false;
2843 _this.on.complete.fire(); 2844 }, function (e) { 2845 var wasActive = _this.active; 2846 _this.active = false; 2847 _this.on.error.fire(e); 2848 _this.parent ? _this.parent._reject(e) : wasActive && _this.idbtrans && _this.idbtrans.abort(); 2849 return rejection(e); 2850 }); 2851 }); 2852 } 2853 function createIndexSpec(name, keyPath, unique, multi, auto, compound, isPrimKey) { 2854 return { 2855 name: name, 2856 keyPath: keyPath, 2857 unique: unique, 2858 multi: multi, 2859 auto: auto, 2860 compound: compound, 2861 src: (unique && !isPrimKey ? '&' : '') + (multi ? '*' : '') + (auto ? "++" : "") + nameFromKeyPath(keyPath) 2862 }; 2863 } 2864 function nameFromKeyPath(keyPath) { 2865 return typeof keyPath === 'string' ? keyPath : keyPath ? '[' + [].join.call(keyPath, '+') + ']' : ""; 2866 } 2867 function createTableSchema(name, primKey, indexes) { 2868 return { 2869 name: name, 2870 primKey: primKey, 2871 indexes: indexes, 2872 mappedClass: null, 2873 idxByName: arrayToObject(indexes, function (index) { 2874 return [index.name, index]; 2875 }) 2876 }; 2877 } 2878 function safariMultiStoreFix(storeNames) { 2879 return storeNames.length === 1 ? storeNames[0] : storeNames; 2880 } 2881 var _getMaxKey = function getMaxKey(IdbKeyRange) { 2882 try { 2883 IdbKeyRange.only([[]]); 2884 _getMaxKey = function getMaxKey() { 2885 return [[]]; 2886 }; 2887 return [[]]; 2888 } catch (e) { 2889 _getMaxKey = function getMaxKey() { 2890 return maxString; 2891 }; 2892 return maxString; 2893 } 2894 }; 2895 function getKeyExtractor(keyPath) { 2896 if (keyPath == null) { 2897 return function () { 2898 return undefined; 2899 }; 2900 } else if (typeof keyPath === 'string') { 2901 return getSinglePathKeyExtractor(keyPath); 2902 } else { 2903 return function (obj) { 2904 return getByKeyPath(obj, keyPath); 2905 }; 2906 } 2907 } 2908 function getSinglePathKeyExtractor(keyPath) { 2909 var split = keyPath.split('.'); 2910 if (split.length === 1) { 2911 return function (obj) { 2912 return obj[keyPath]; 2913 }; 2914 } else { 2915 return function (obj) { 2916 return getByKeyPath(obj, keyPath); 2917 }; 2918 } 2919 } 2920 function arrayify(arrayLike) { 2921 return [].slice.call(arrayLike); 2922 } 2923 var _id_counter = 0; 2924 function getKeyPathAlias(keyPath) { 2925 return keyPath == null ? ":id" : typeof keyPath === 'string' ? keyPath : "[" + keyPath.join('+') + "]"; 2926 } 2927 function createDBCore(db, IdbKeyRange, tmpTrans) { 2928 function extractSchema(db, trans) { 2929 var tables = arrayify(db.objectStoreNames); 2930 return { 2931 schema: { 2932 name: db.name, 2933 tables: tables.map(function (table) { 2934 return trans.objectStore(table); 2935 }).map(function (store) { 2936 var keyPath = store.keyPath, 2937 autoIncrement = store.autoIncrement; 2938 var compound = isArray(keyPath); 2939 var outbound = keyPath == null; 2940 var indexByKeyPath = {}; 2941 var result = { 2942 name: store.name, 2943 primaryKey: { 2944 name: null, 2945 isPrimaryKey: true, 2946 outbound: outbound, 2947 compound: compound, 2948 keyPath: keyPath, 2949 autoIncrement: autoIncrement, 2950 unique: true, 2951 extractKey: getKeyExtractor(keyPath) 2952 }, 2953 indexes: arrayify(store.indexNames).map(function (indexName) { 2954 return store.index(indexName); 2955 }).map(function (index) { 2956 var name = index.name, 2957 unique = index.unique, 2958 multiEntry = index.multiEntry, 2959 keyPath = index.keyPath; 2960 var compound = isArray(keyPath); 2961 var result = { 2962 name: name, 2963 compound: compound, 2964 keyPath: keyPath, 2965 unique: unique, 2966 multiEntry: multiEntry, 2967 extractKey: getKeyExtractor(keyPath) 2968 }; 2969 indexByKeyPath[getKeyPathAlias(keyPath)] = result; 2970 return result; 2971 }), 2972 getIndexByKeyPath: function getIndexByKeyPath(keyPath) { 2973 return indexByKeyPath[getKeyPathAlias(keyPath)]; 2974 } 2975 }; 2976 indexByKeyPath[":id"] = result.primaryKey; 2977 if (keyPath != null) { 2978 indexByKeyPath[getKeyPathAlias(keyPath)] = result.primaryKey; 2979 } 2980 return result; 2981 }) 2982 }, 2983 hasGetAll: tables.length > 0 && 'getAll' in trans.objectStore(tables[0]) && !(typeof navigator !== 'undefined' && /Safari/.test(navigator.userAgent) && !/(Chrome\/|Edge\/)/.test(navigator.userAgent) && [].concat(navigator.userAgent.match(/Safari\/(\d*)/))[1] < 604) 2984 }; 2985 } 2986 function makeIDBKeyRange(range) { 2987 if (range.type === 3) return null; 2988 if (range.type === 4) throw new Error("Cannot convert never type to IDBKeyRange"); 2989 var lower = range.lower, 2990 upper = range.upper, 2991 lowerOpen = range.lowerOpen, 2992 upperOpen = range.upperOpen; 2993 var idbRange = lower === undefined ? upper === undefined ? null : IdbKeyRange.upperBound(upper, !!upperOpen) : upper === undefined ? IdbKeyRange.lowerBound(lower, !!lowerOpen) : IdbKeyRange.bound(lower, upper, !!lowerOpen, !!upperOpen); 2994 return idbRange; 2995 } 2996 function createDbCoreTable(tableSchema) { 2997 var tableName = tableSchema.name; 2998 function mutate(_a) { 2999 var trans = _a.trans, 3000 type = _a.type, 3001 keys = _a.keys, 3002 values = _a.values, 3003 range = _a.range; 3004 return new Promise(function (resolve, reject) { 3005 resolve = wrap(resolve); 3006 var store = trans.objectStore(tableName); 3007 var outbound = store.keyPath == null; 3008 var isAddOrPut = type === "put" || type === "add"; 3009 if (!isAddOrPut && type !== 'delete' && type !== 'deleteRange') throw new Error("Invalid operation type: " + type); 3010 var length = (keys || values || { 3011 length: 1 3012 }).length; 3013 if (keys && values && keys.length !== values.length) { 3014 throw new Error("Given keys array must have same length as given values array."); 3015 } 3016 if (length === 0) return resolve({ 3017 numFailures: 0, 3018 failures: {}, 3019 results: [], 3020 lastResult: undefined 3021 }); 3022 var req; 3023 var reqs = []; 3024 var failures = []; 3025 var numFailures = 0; 3026 var errorHandler = function errorHandler(event) { 3027 ++numFailures; 3028 preventDefault(event); 3029 }; 3030 if (type === 'deleteRange') { 3031 if (range.type === 4) return resolve({ 3032 numFailures: numFailures, 3033 failures: failures, 3034 results: [], 3035 lastResult: undefined 3036 }); 3037 if (range.type === 3) reqs.push(req = store.clear());else reqs.push(req = store["delete"](makeIDBKeyRange(range))); 3038 } else { 3039 var _a = isAddOrPut ? outbound ? [values, keys] : [values, null] : [keys, null], 3040 args1 = _a[0], 3041 args2 = _a[1]; 3042 if (isAddOrPut) { 3043 for (var i = 0; i < length; ++i) { 3044 reqs.push(req = args2 && args2[i] !== undefined ? store[type](args1[i], args2[i]) : store[type](args1[i])); 3045 req.onerror = errorHandler; 3046 } 3047 } else { 3048 for (var i = 0; i < length; ++i) { 3049 reqs.push(req = store[type](args1[i])); 3050 req.onerror = errorHandler; 3051 } 3052 } 3053 } 3054 var done = function done(event) { 3055 var lastResult = event.target.result;
3056 reqs.forEach(function (req, i) { 3057 return req.error != null && (failures[i] = req.error); 3058 }); 3059 resolve({ 3060 numFailures: numFailures, 3061 failures: failures, 3062 results: type === "delete" ? keys : reqs.map(function (req) { 3063 return req.result; 3064 }), 3065 lastResult: lastResult 3066 }); 3067 }; 3068 req.onerror = function (event) { 3069 errorHandler(event); 3070 done(event); 3071 }; 3072 req.onsuccess = done; 3073 }); 3074 } 3075 function openCursor(_a) { 3076 var trans = _a.trans, 3077 values = _a.values, 3078 query = _a.query, 3079 reverse = _a.reverse, 3080 unique = _a.unique; 3081 return new Promise(function (resolve, reject) { 3082 resolve = wrap(resolve); 3083 var index = query.index, 3084 range = query.range; 3085 var store = trans.objectStore(tableName); 3086 var source = index.isPrimaryKey ? store : store.index(index.name); 3087 var direction = reverse ? unique ? "prevunique" : "prev" : unique ? "nextunique" : "next"; 3088 var req = values || !('openKeyCursor' in source) ? source.openCursor(makeIDBKeyRange(range), direction) : source.openKeyCursor(makeIDBKeyRange(range), direction); 3089 req.onerror = eventRejectHandler(reject); 3090 req.onsuccess = wrap(function (ev) { 3091 var cursor = req.result; 3092 if (!cursor) { 3093 resolve(null); 3094 return; 3095 } 3096 cursor.___id = ++_id_counter; 3097 cursor.done = false; 3098 var _cursorContinue = cursor["continue"].bind(cursor); 3099 var _cursorContinuePrimaryKey = cursor.continuePrimaryKey; 3100 if (_cursorContinuePrimaryKey) _cursorContinuePrimaryKey = _cursorContinuePrimaryKey.bind(cursor); 3101 var _cursorAdvance = cursor.advance.bind(cursor); 3102 var doThrowCursorIsNotStarted = function doThrowCursorIsNotStarted() { 3103 throw new Error("Cursor not started"); 3104 }; 3105 var doThrowCursorIsStopped = function doThrowCursorIsStopped() { 3106 throw new Error("Cursor not stopped"); 3107 }; 3108 cursor.trans = trans; 3109 cursor.stop = cursor["continue"] = cursor.continuePrimaryKey = cursor.advance = doThrowCursorIsNotStarted; 3110 cursor.fail = wrap(reject); 3111 cursor.next = function () { 3112 var _this = this; 3113 var gotOne = 1; 3114 return this.start(function () { 3115 return gotOne-- ? _this["continue"]() : _this.stop(); 3116 }).then(function () { 3117 return _this; 3118 }); 3119 }; 3120 cursor.start = function (callback) { 3121 var iterationPromise = new Promise(function (resolveIteration, rejectIteration) { 3122 resolveIteration = wrap(resolveIteration); 3123 req.onerror = eventRejectHandler(rejectIteration); 3124 cursor.fail = rejectIteration; 3125 cursor.stop = function (value) { 3126 cursor.stop = cursor["continue"] = cursor.continuePrimaryKey = cursor.advance = doThrowCursorIsStopped; 3127 resolveIteration(value); 3128 }; 3129 }); 3130 var guardedCallback = function guardedCallback() { 3131 if (req.result) { 3132 try { 3133 callback(); 3134 } catch (err) { 3135 cursor.fail(err); 3136 } 3137 } else { 3138 cursor.done = true; 3139 cursor.start = function () { 3140 throw new Error("Cursor behind last entry"); 3141 }; 3142 cursor.stop(); 3143 } 3144 }; 3145 req.onsuccess = wrap(function (ev) { 3146 req.onsuccess = guardedCallback; 3147 guardedCallback(); 3148 }); 3149 cursor["continue"] = _cursorContinue; 3150 cursor.continuePrimaryKey = _cursorContinuePrimaryKey; 3151 cursor.advance = _cursorAdvance; 3152 guardedCallback(); 3153 return iterationPromise; 3154 }; 3155 resolve(cursor); 3156 }, reject); 3157 }); 3158 } 3159 function query(hasGetAll) { 3160 return function (request) { 3161 return new Promise(function (resolve, reject) { 3162 resolve = wrap(resolve); 3163 var trans = request.trans, 3164 values = request.values, 3165 limit = request.limit, 3166 query = request.query; 3167 var nonInfinitLimit = limit === Infinity ? undefined : limit; 3168 var index = query.index, 3169 range = query.range; 3170 var store = trans.objectStore(tableName); 3171 var source = index.isPrimaryKey ? store : store.index(index.name); 3172 var idbKeyRange = makeIDBKeyRange(range); 3173 if (limit === 0) return resolve({ 3174 result: [] 3175 }); 3176 if (hasGetAll) { 3177 var req = values ? source.getAll(idbKeyRange, nonInfinitLimit) : source.getAllKeys(idbKeyRange, nonInfinitLimit); 3178 req.onsuccess = function (event) { 3179 return resolve({ 3180 result: event.target.result 3181 }); 3182 }; 3183 req.onerror = eventRejectHandler(reject); 3184 } else { 3185 var count_1 = 0; 3186 var req_1 = values || !('openKeyCursor' in source) ? source.openCursor(idbKeyRange) : source.openKeyCursor(idbKeyRange); 3187 var result_1 = []; 3188 req_1.onsuccess = function (event) { 3189 var cursor = req_1.result; 3190 if (!cursor) return resolve({ 3191 result: result_1 3192 });
3193 result_1.push(values ? cursor.value : cursor.primaryKey); 3194 if (++count_1 === limit) return resolve({ 3195 result: result_1 3196 }); 3197 cursor["continue"](); 3198 }; 3199 req_1.onerror = eventRejectHandler(reject); 3200 } 3201 }); 3202 }; 3203 } 3204 return { 3205 name: tableName, 3206 schema: tableSchema, 3207 mutate: mutate, 3208 getMany: function getMany(_a) { 3209 var trans = _a.trans, 3210 keys = _a.keys; 3211 return new Promise(function (resolve, reject) { 3212 resolve = wrap(resolve); 3213 var store = trans.objectStore(tableName); 3214 var length = keys.length; 3215 var result = new Array(length); 3216 var keyCount = 0; 3217 var callbackCount = 0; 3218 var req; 3219 var successHandler = function successHandler(event) { 3220 var req = event.target; 3221 if ((result[req._pos] = req.result) != null) ; 3222 if (++callbackCount === keyCount) resolve(result); 3223 }; 3224 var errorHandler = eventRejectHandler(reject); 3225 for (var i = 0; i < length; ++i) { 3226 var key = keys[i]; 3227 if (key != null) { 3228 req = store.get(keys[i]); 3229 req._pos = i; 3230 req.onsuccess = successHandler; 3231 req.onerror = errorHandler; 3232 ++keyCount; 3233 } 3234 } 3235 if (keyCount === 0) resolve(result); 3236 }); 3237 }, 3238 get: function get(_a) { 3239 var trans = _a.trans, 3240 key = _a.key; 3241 return new Promise(function (resolve, reject) { 3242 resolve = wrap(resolve); 3243 var store = trans.objectStore(tableName); 3244 var req = store.get(key); 3245 req.onsuccess = function (event) { 3246 return resolve(event.target.result); 3247 }; 3248 req.onerror = eventRejectHandler(reject); 3249 }); 3250 }, 3251 query: query(hasGetAll), 3252 openCursor: openCursor, 3253 count: function count(_a) { 3254 var query = _a.query, 3255 trans = _a.trans; 3256 var index = query.index, 3257 range = query.range; 3258 return new Promise(function (resolve, reject) { 3259 var store = trans.objectStore(tableName); 3260 var source = index.isPrimaryKey ? store : store.index(index.name); 3261 var idbKeyRange = makeIDBKeyRange(range); 3262 var req = idbKeyRange ? source.count(idbKeyRange) : source.count(); 3263 req.onsuccess = wrap(function (ev) { 3264 return resolve(ev.target.result); 3265 }); 3266 req.onerror = eventRejectHandler(reject); 3267 }); 3268 } 3269 }; 3270 } 3271 var _a = extractSchema(db, tmpTrans), 3272 schema = _a.schema, 3273 hasGetAll = _a.hasGetAll; 3274 var tables = schema.tables.map(function (tableSchema) { 3275 return createDbCoreTable(tableSchema); 3276 }); 3277 var tableMap = {}; 3278 tables.forEach(function (table) { 3279 return tableMap[table.name] = table; 3280 }); 3281 return { 3282 stack: "dbcore", 3283 transaction: db.transaction.bind(db), 3284 table: function table(name) { 3285 var result = tableMap[name]; 3286 if (!result) throw new Error("Table '" + name + "' not found"); 3287 return tableMap[name]; 3288 }, 3289 MIN_KEY: -Infinity, 3290 MAX_KEY: _getMaxKey(IdbKeyRange), 3291 schema: schema 3292 }; 3293 } 3294 function createMiddlewareStack(stackImpl, middlewares) { 3295 return middlewares.reduce(function (down, _a) { 3296 var create = _a.create; 3297 return _assign(_assign({}, down), create(down)); 3298 }, stackImpl); 3299 } 3300 function createMiddlewareStacks(middlewares, idbdb, _a, tmpTrans) { 3301 var IDBKeyRange = _a.IDBKeyRange; 3302 _a.indexedDB; 3303 var dbcore = createMiddlewareStack(createDBCore(idbdb, IDBKeyRange, tmpTrans), middlewares.dbcore); 3304 return { 3305 dbcore: dbcore 3306 }; 3307 } 3308 function generateMiddlewareStacks(_a, tmpTrans) { 3309 var db = _a._novip; 3310 var idbdb = tmpTrans.db; 3311 var stacks = createMiddlewareStacks(db._middlewares, idbdb, db._deps, tmpTrans); 3312 db.core = stacks.dbcore;
3313 db.tables.forEach(function (table) { 3314 var tableName = table.name; 3315 if (db.core.schema.tables.some(function (tbl) { 3316 return tbl.name === tableName; 3317 })) { 3318 table.core = db.core.table(tableName); 3319 if (db[tableName] instanceof db.Table) { 3320 db[tableName].core = table.core; 3321 } 3322 } 3323 }); 3324 } 3325 function setApiOnPlace(_a, objs, tableNames, dbschema) { 3326 var db = _a._novip; 3327 tableNames.forEach(function (tableName) { 3328 var schema = dbschema[tableName]; 3329 objs.forEach(function (obj) { 3330 var propDesc = getPropertyDescriptor(obj, tableName); 3331 if (!propDesc || "value" in propDesc && propDesc.value === undefined) { 3332 if (obj === db.Transaction.prototype || obj instanceof db.Transaction) { 3333 setProp(obj, tableName, { 3334 get: function get() { 3335 return this.table(tableName); 3336 }, 3337 set: function set(value) { 3338 defineProperty(this, tableName, { 3339 value: value, 3340 writable: true, 3341 configurable: true, 3342 enumerable: true 3343 }); 3344 } 3345 }); 3346 } else { 3347 obj[tableName] = new db.Table(tableName, schema); 3348 } 3349 } 3350 }); 3351 }); 3352 } 3353 function removeTablesApi(_a, objs) { 3354 var db = _a._novip; 3355 objs.forEach(function (obj) { 3356 for (var key in obj) { 3357 if (obj[key] instanceof db.Table) delete obj[key]; 3358 } 3359 }); 3360 } 3361 function lowerVersionFirst(a, b) { 3362 return a._cfg.version - b._cfg.version; 3363 } 3364 function runUpgraders(db, oldVersion, idbUpgradeTrans, reject) { 3365 var globalSchema = db._dbSchema; 3366 var trans = db._createTransaction('readwrite', db._storeNames, globalSchema); 3367 trans.create(idbUpgradeTrans); 3368 trans._completion["catch"](reject); 3369 var rejectTransaction = trans._reject.bind(trans); 3370 var transless = PSD.transless || PSD; 3371 newScope(function () { 3372 PSD.trans = trans; 3373 PSD.transless = transless; 3374 if (oldVersion === 0) { 3375 keys(globalSchema).forEach(function (tableName) { 3376 createTable(idbUpgradeTrans, tableName, globalSchema[tableName].primKey, globalSchema[tableName].indexes); 3377 }); 3378 generateMiddlewareStacks(db, idbUpgradeTrans); 3379 DexiePromise.follow(function () { 3380 return db.on.populate.fire(trans); 3381 })["catch"](rejectTransaction); 3382 } else updateTablesAndIndexes(db, oldVersion, trans, idbUpgradeTrans)["catch"](rejectTransaction); 3383 }); 3384 } 3385 function updateTablesAndIndexes(_a, oldVersion, trans, idbUpgradeTrans) { 3386 var db = _a._novip; 3387 var queue = []; 3388 var versions = db._versions; 3389 var globalSchema = db._dbSchema = buildGlobalSchema(db, db.idbdb, idbUpgradeTrans); 3390 var anyContentUpgraderHasRun = false; 3391 var versToRun = versions.filter(function (v) { 3392 return v._cfg.version >= oldVersion; 3393 }); 3394 versToRun.forEach(function (version) { 3395 queue.push(function () { 3396 var oldSchema = globalSchema; 3397 var newSchema = version._cfg.dbschema; 3398 adjustToExistingIndexNames(db, oldSchema, idbUpgradeTrans); 3399 adjustToExistingIndexNames(db, newSchema, idbUpgradeTrans); 3400 globalSchema = db._dbSchema = newSchema; 3401 var diff = getSchemaDiff(oldSchema, newSchema); 3402 diff.add.forEach(function (tuple) { 3403 createTable(idbUpgradeTrans, tuple[0], tuple[1].primKey, tuple[1].indexes); 3404 }); 3405 diff.change.forEach(function (change) { 3406 if (change.recreate) { 3407 throw new exceptions.Upgrade("Not yet support for changing primary key"); 3408 } else { 3409 var store_1 = idbUpgradeTrans.objectStore(change.name); 3410 change.add.forEach(function (idx) { 3411 return addIndex(store_1, idx); 3412 }); 3413 change.change.forEach(function (idx) { 3414 store_1.deleteIndex(idx.name); 3415 addIndex(store_1, idx); 3416 }); 3417 change.del.forEach(function (idxName) { 3418 return store_1.deleteIndex(idxName); 3419 }); 3420 } 3421 }); 3422 var contentUpgrade = version._cfg.contentUpgrade; 3423 if (contentUpgrade && version._cfg.version > oldVersion) { 3424 generateMiddlewareStacks(db, idbUpgradeTrans); 3425 trans._memoizedTables = {}; 3426 anyContentUpgraderHasRun = true; 3427 var upgradeSchema_1 = shallowClone(newSchema); 3428 diff.del.forEach(function (table) { 3429 upgradeSchema_1[table] = oldSchema[table]; 3430 }); 3431 removeTablesApi(db, [db.Transaction.prototype]); 3432 setApiOnPlace(db, [db.Transaction.prototype], keys(upgradeSchema_1), upgradeSchema_1); 3433 trans.schema = upgradeSchema_1; 3434 var contentUpgradeIsAsync_1 = isAsyncFunction(contentUpgrade); 3435 if (contentUpgradeIsAsync_1) { 3436 incrementExpectedAwaits(); 3437 } 3438 var returnValue_1; 3439 var promiseFollowed = DexiePromise.follow(function () { 3440 returnValue_1 = contentUpgrade(trans); 3441 if (returnValue_1) { 3442 if (contentUpgradeIsAsync_1) { 3443 var decrementor = decrementExpectedAwaits.bind(null, null); 3444 returnValue_1.then(decrementor, decrementor); 3445 } 3446 } 3447 }); 3448 return returnValue_1 && typeof returnValue_1.then === 'function' ? DexiePromise.resolve(returnValue_1) : promiseFollowed.then(function () { 3449 return returnValue_1; 3450 }); 3451 } 3452 }); 3453 queue.push(function (idbtrans) { 3454 if (!anyContentUpgraderHasRun || !hasIEDeleteObjectStoreBug) { 3455 var newSchema = version._cfg.dbschema; 3456 deleteRemovedTables(newSchema, idbtrans); 3457 } 3458 removeTablesApi(db, [db.Transaction.prototype]); 3459 setApiOnPlace(db, [db.Transaction.prototype], db._storeNames, db._dbSchema); 3460 trans.schema = db._dbSchema; 3461 }); 3462 }); 3463 function runQueue() { 3464 return queue.length ? DexiePromise.resolve(queue.shift()(trans.idbtrans)).then(runQueue) : DexiePromise.resolve(); 3465 } 3466 return runQueue().then(function () { 3467 createMissingTables(globalSchema, idbUpgradeTrans); 3468 }); 3469 } 3470 function getSchemaDiff(oldSchema, newSchema) { 3471 var diff = { 3472 del: [], 3473 add: [], 3474 change: [] 3475 }; 3476 var table; 3477 for (table in oldSchema) { 3478 if (!newSchema[table]) diff.del.push(table); 3479 } 3480 for (table in newSchema) { 3481 var oldDef = oldSchema[table], 3482 newDef = newSchema[table]; 3483 if (!oldDef) { 3484 diff.add.push([table, newDef]); 3485 } else { 3486 var change = { 3487 name: table, 3488 def: newDef, 3489 recreate: false, 3490 del: [], 3491 add: [], 3492 change: [] 3493 };
vendor: 4,589 bytes, lines 3494-3601
3494 if ('' + (oldDef.primKey.keyPath || '') !== '' + (newDef.primKey.keyPath || '') || oldDef.primKey.auto !== newDef.primKey.auto && !isIEOrEdge) { 3495 change.recreate = true; 3496 diff.change.push(change); 3497 } else { 3498 var oldIndexes = oldDef.idxByName; 3499 var newIndexes = newDef.idxByName; 3500 var idxName = void 0; 3501 for (idxName in oldIndexes) { 3502 if (!newIndexes[idxName]) change.del.push(idxName); 3503 } 3504 for (idxName in newIndexes) { 3505 var oldIdx = oldIndexes[idxName], 3506 newIdx = newIndexes[idxName]; 3507 if (!oldIdx) change.add.push(newIdx);else if (oldIdx.src !== newIdx.src) change.change.push(newIdx); 3508 } 3509 if (change.del.length > 0 || change.add.length > 0 || change.change.length > 0) { 3510 diff.change.push(change); 3511 } 3512 } 3513 } 3514 } 3515 return diff; 3516 } 3517 function createTable(idbtrans, tableName, primKey, indexes) { 3518 var store = idbtrans.db.createObjectStore(tableName, primKey.keyPath ? { 3519 keyPath: primKey.keyPath, 3520 autoIncrement: primKey.auto 3521 } : { 3522 autoIncrement: primKey.auto 3523 }); 3524 indexes.forEach(function (idx) { 3525 return addIndex(store, idx); 3526 }); 3527 return store; 3528 } 3529 function createMissingTables(newSchema, idbtrans) { 3530 keys(newSchema).forEach(function (tableName) { 3531 if (!idbtrans.db.objectStoreNames.contains(tableName)) { 3532 createTable(idbtrans, tableName, newSchema[tableName].primKey, newSchema[tableName].indexes); 3533 } 3534 }); 3535 } 3536 function deleteRemovedTables(newSchema, idbtrans) { 3537 [].slice.call(idbtrans.db.objectStoreNames).forEach(function (storeName) { 3538 return newSchema[storeName] == null && idbtrans.db.deleteObjectStore(storeName); 3539 }); 3540 } 3541 function addIndex(store, idx) { 3542 store.createIndex(idx.name, idx.keyPath, { 3543 unique: idx.unique, 3544 multiEntry: idx.multi 3545 }); 3546 } 3547 function buildGlobalSchema(db, idbdb, tmpTrans) { 3548 var globalSchema = {}; 3549 var dbStoreNames = slice(idbdb.objectStoreNames, 0); 3550 dbStoreNames.forEach(function (storeName) { 3551 var store = tmpTrans.objectStore(storeName); 3552 var keyPath = store.keyPath; 3553 var primKey = createIndexSpec(nameFromKeyPath(keyPath), keyPath || "", false, false, !!store.autoIncrement, keyPath && typeof keyPath !== "string", true); 3554 var indexes = []; 3555 for (var j = 0; j < store.indexNames.length; ++j) { 3556 var idbindex = store.index(store.indexNames[j]); 3557 keyPath = idbindex.keyPath; 3558 var index = createIndexSpec(idbindex.name, keyPath, !!idbindex.unique, !!idbindex.multiEntry, false, keyPath && typeof keyPath !== "string", false); 3559 indexes.push(index); 3560 } 3561 globalSchema[storeName] = createTableSchema(storeName, primKey, indexes); 3562 }); 3563 return globalSchema; 3564 } 3565 function readGlobalSchema(_a, idbdb, tmpTrans) { 3566 var db = _a._novip; 3567 db.verno = idbdb.version / 10; 3568 var globalSchema = db._dbSchema = buildGlobalSchema(db, idbdb, tmpTrans); 3569 db._storeNames = slice(idbdb.objectStoreNames, 0); 3570 setApiOnPlace(db, [db._allTables], keys(globalSchema), globalSchema); 3571 } 3572 function verifyInstalledSchema(db, tmpTrans) { 3573 var installedSchema = buildGlobalSchema(db, db.idbdb, tmpTrans); 3574 var diff = getSchemaDiff(installedSchema, db._dbSchema); 3575 return !(diff.add.length || diff.change.some(function (ch) { 3576 return ch.add.length || ch.change.length; 3577 })); 3578 } 3579 function adjustToExistingIndexNames(_a, schema, idbtrans) { 3580 var db = _a._novip; 3581 var storeNames = idbtrans.db.objectStoreNames; 3582 for (var i = 0; i < storeNames.length; ++i) { 3583 var storeName = storeNames[i]; 3584 var store = idbtrans.objectStore(storeName); 3585 db._hasGetAll = 'getAll' in store; 3586 for (var j = 0; j < store.indexNames.length; ++j) { 3587 var indexName = store.indexNames[j]; 3588 var keyPath = store.index(indexName).keyPath; 3589 var dexieName = typeof keyPath === 'string' ? keyPath : "[" + slice(keyPath).join('+') + "]"; 3590 if (schema[storeName]) { 3591 var indexSpec = schema[storeName].idxByName[dexieName]; 3592 if (indexSpec) { 3593 indexSpec.name = indexName; 3594 delete schema[storeName].idxByName[dexieName]; 3595 schema[storeName].idxByName[indexName] = indexSpec; 3596 } 3597 } 3598 } 3599 } 3600 if (typeof navigator !== 'undefined' && /Safari/.test(navigator.userAgent) && !/(Chrome\/|Edge\/)/.test(navigator.userAgent) && _global.WorkerGlobalScope && _global instanceof _global.WorkerGlobalScope && [].concat(navigator.userAgent.match(/Safari\/(\d*)/))[1] < 604) { 3601 db._hasGetAll = false;
3602 } 3603 } 3604 function parseIndexSyntax(primKeyAndIndexes) { 3605 return primKeyAndIndexes.split(',').map(function (index, indexNum) { 3606 index = index.trim(); 3607 var name = index.replace(/([&*]|\+\+)/g, ""); 3608 var keyPath = /^\[/.test(name) ? name.match(/^\[(.*)\]$/)[1].split('+') : name; 3609 return createIndexSpec(name, keyPath || null, /\&/.test(index), /\*/.test(index), /\+\+/.test(index), isArray(keyPath), indexNum === 0); 3610 }); 3611 } 3612 var Version = function () { 3613 function Version() {} 3614 Version.prototype._parseStoresSpec = function (stores, outSchema) { 3615 keys(stores).forEach(function (tableName) { 3616 if (stores[tableName] !== null) { 3617 var indexes = parseIndexSyntax(stores[tableName]); 3618 var primKey = indexes.shift(); 3619 if (primKey.multi) throw new exceptions.Schema("Primary key cannot be multi-valued"); 3620 indexes.forEach(function (idx) { 3621 if (idx.auto) throw new exceptions.Schema("Only primary key can be marked as autoIncrement (++)"); 3622 if (!idx.keyPath) throw new exceptions.Schema("Index must have a name and cannot be an empty string"); 3623 }); 3624 outSchema[tableName] = createTableSchema(tableName, primKey, indexes); 3625 } 3626 }); 3627 }; 3628 Version.prototype.stores = function (stores) { 3629 var db = this.db; 3630 this._cfg.storesSource = this._cfg.storesSource ? extend(this._cfg.storesSource, stores) : stores; 3631 var versions = db._versions; 3632 var storesSpec = {}; 3633 var dbschema = {}; 3634 versions.forEach(function (version) { 3635 extend(storesSpec, version._cfg.storesSource); 3636 dbschema = version._cfg.dbschema = {}; 3637 version._parseStoresSpec(storesSpec, dbschema); 3638 }); 3639 db._dbSchema = dbschema; 3640 removeTablesApi(db, [db._allTables, db, db.Transaction.prototype]); 3641 setApiOnPlace(db, [db._allTables, db, db.Transaction.prototype, this._cfg.tables], keys(dbschema), dbschema); 3642 db._storeNames = keys(dbschema); 3643 return this; 3644 }; 3645 Version.prototype.upgrade = function (upgradeFunction) { 3646 this._cfg.contentUpgrade = promisableChain(this._cfg.contentUpgrade || nop, upgradeFunction); 3647 return this; 3648 }; 3649 return Version; 3650 }(); 3651 function createVersionConstructor(db) { 3652 return makeClassConstructor(Version.prototype, function Version(versionNumber) { 3653 this.db = db; 3654 this._cfg = { 3655 version: versionNumber, 3656 storesSource: null, 3657 dbschema: {}, 3658 tables: {}, 3659 contentUpgrade: null 3660 }; 3661 }); 3662 } 3663 function getDbNamesTable(indexedDB, IDBKeyRange) { 3664 var dbNamesDB = indexedDB["_dbNamesDB"]; 3665 if (!dbNamesDB) { 3666 dbNamesDB = indexedDB["_dbNamesDB"] = new Dexie$1(DBNAMES_DB, { 3667 addons: [], 3668 indexedDB: indexedDB, 3669 IDBKeyRange: IDBKeyRange 3670 }); 3671 dbNamesDB.version(1).stores({ 3672 dbnames: "name" 3673 }); 3674 } 3675 return dbNamesDB.table("dbnames"); 3676 } 3677 function hasDatabasesNative(indexedDB) { 3678 return indexedDB && typeof indexedDB.databases === "function"; 3679 } 3680 function _getDatabaseNames(_a) { 3681 var indexedDB = _a.indexedDB, 3682 IDBKeyRange = _a.IDBKeyRange; 3683 return hasDatabasesNative(indexedDB) ? Promise.resolve(indexedDB.databases()).then(function (infos) { 3684 return infos.map(function (info) { 3685 return info.name; 3686 }).filter(function (name) { 3687 return name !== DBNAMES_DB; 3688 }); 3689 }) : getDbNamesTable(indexedDB, IDBKeyRange).toCollection().primaryKeys(); 3690 } 3691 function _onDatabaseCreated(_a, name) { 3692 var indexedDB = _a.indexedDB, 3693 IDBKeyRange = _a.IDBKeyRange; 3694 !hasDatabasesNative(indexedDB) && name !== DBNAMES_DB && getDbNamesTable(indexedDB, IDBKeyRange).put({ 3695 name: name 3696 })["catch"](nop); 3697 } 3698 function _onDatabaseDeleted(_a, name) { 3699 var indexedDB = _a.indexedDB, 3700 IDBKeyRange = _a.IDBKeyRange; 3701 !hasDatabasesNative(indexedDB) && name !== DBNAMES_DB && getDbNamesTable(indexedDB, IDBKeyRange)["delete"](name)["catch"](nop); 3702 } 3703 function vip(fn) { 3704 return newScope(function () { 3705 PSD.letThrough = true; 3706 return fn(); 3707 }); 3708 } 3709 function idbReady() { 3710 var isSafari = !navigator.userAgentData && /Safari\//.test(navigator.userAgent) && !/Chrom(e|ium)\//.test(navigator.userAgent); 3711 if (!isSafari || !indexedDB.databases) return Promise.resolve(); 3712 var intervalId; 3713 return new Promise(function (resolve) { 3714 var tryIdb = function tryIdb() { 3715 return indexedDB.databases()["finally"](resolve); 3716 }; 3717 intervalId = setInterval(tryIdb, 100); 3718 tryIdb(); 3719 })["finally"](function () { 3720 return clearInterval(intervalId); 3721 }); 3722 } 3723 function dexieOpen(db) { 3724 var state = db._state; 3725 var indexedDB = db._deps.indexedDB; 3726 if (state.isBeingOpened || db.idbdb) return state.dbReadyPromise.then(function () { 3727 return state.dbOpenError ? rejection(state.dbOpenError) : db; 3728 }); 3729 debug && (state.openCanceller._stackHolder = getErrorWithStack()); 3730 state.isBeingOpened = true; 3731 state.dbOpenError = null; 3732 state.openComplete = false;
3733 var openCanceller = state.openCanceller; 3734 function throwIfCancelled() { 3735 if (state.openCanceller !== openCanceller) throw new exceptions.DatabaseClosed('db.open() was cancelled'); 3736 } 3737 var resolveDbReady = state.dbReadyResolve, 3738 upgradeTransaction = null, 3739 wasCreated = false; 3740 return DexiePromise.race([openCanceller, (typeof navigator === 'undefined' ? DexiePromise.resolve() : idbReady()).then(function () { 3741 return new DexiePromise(function (resolve, reject) { 3742 throwIfCancelled(); 3743 if (!indexedDB) throw new exceptions.MissingAPI(); 3744 var dbName = db.name; 3745 var req = state.autoSchema ? indexedDB.open(dbName) : indexedDB.open(dbName, Math.round(db.verno * 10)); 3746 if (!req) throw new exceptions.MissingAPI(); 3747 req.onerror = eventRejectHandler(reject); 3748 req.onblocked = wrap(db._fireOnBlocked); 3749 req.onupgradeneeded = wrap(function (e) { 3750 upgradeTransaction = req.transaction; 3751 if (state.autoSchema && !db._options.allowEmptyDB) { 3752 req.onerror = preventDefault; 3753 upgradeTransaction.abort(); 3754 req.result.close(); 3755 var delreq = indexedDB.deleteDatabase(dbName); 3756 delreq.onsuccess = delreq.onerror = wrap(function () { 3757 reject(new exceptions.NoSuchDatabase("Database " + dbName + " doesnt exist")); 3758 }); 3759 } else { 3760 upgradeTransaction.onerror = eventRejectHandler(reject); 3761 var oldVer = e.oldVersion > Math.pow(2, 62) ? 0 : e.oldVersion; 3762 wasCreated = oldVer < 1; 3763 db._novip.idbdb = req.result; 3764 runUpgraders(db, oldVer / 10, upgradeTransaction, reject); 3765 } 3766 }, reject); 3767 req.onsuccess = wrap(function () { 3768 upgradeTransaction = null; 3769 var idbdb = db._novip.idbdb = req.result; 3770 var objectStoreNames = slice(idbdb.objectStoreNames); 3771 if (objectStoreNames.length > 0) try { 3772 var tmpTrans = idbdb.transaction(safariMultiStoreFix(objectStoreNames), 'readonly'); 3773 if (state.autoSchema) readGlobalSchema(db, idbdb, tmpTrans);else { 3774 adjustToExistingIndexNames(db, db._dbSchema, tmpTrans); 3775 if (!verifyInstalledSchema(db, tmpTrans)) { 3776 console.warn("Dexie SchemaDiff: Schema was extended without increasing the number passed to db.version(). Some queries may fail."); 3777 } 3778 } 3779 generateMiddlewareStacks(db, tmpTrans); 3780 } catch (e) {} 3781 connections.push(db); 3782 idbdb.onversionchange = wrap(function (ev) { 3783 state.vcFired = true; 3784 db.on("versionchange").fire(ev); 3785 }); 3786 idbdb.onclose = wrap(function (ev) { 3787 db.on("close").fire(ev); 3788 }); 3789 if (wasCreated) _onDatabaseCreated(db._deps, dbName); 3790 resolve(); 3791 }, reject); 3792 }); 3793 })]).then(function () { 3794 throwIfCancelled(); 3795 state.onReadyBeingFired = []; 3796 return DexiePromise.resolve(vip(function () { 3797 return db.on.ready.fire(db.vip); 3798 })).then(function fireRemainders() { 3799 if (state.onReadyBeingFired.length > 0) { 3800 var remainders_1 = state.onReadyBeingFired.reduce(promisableChain, nop); 3801 state.onReadyBeingFired = []; 3802 return DexiePromise.resolve(vip(function () { 3803 return remainders_1(db.vip); 3804 })).then(fireRemainders); 3805 } 3806 }); 3807 })["finally"](function () { 3808 state.onReadyBeingFired = null; 3809 state.isBeingOpened = false; 3810 }).then(function () { 3811 return db; 3812 })["catch"](function (err) { 3813 state.dbOpenError = err; 3814 try { 3815 upgradeTransaction && upgradeTransaction.abort(); 3816 } catch (_a) {} 3817 if (openCanceller === state.openCanceller) { 3818 db._close(); 3819 } 3820 return rejection(err); 3821 })["finally"](function () { 3822 state.openComplete = true; 3823 resolveDbReady(); 3824 }); 3825 } 3826 function awaitIterator(iterator) { 3827 var callNext = function callNext(result) { 3828 return iterator.next(result); 3829 }, 3830 doThrow = function doThrow(error) { 3831 return iterator["throw"](error); 3832 }, 3833 onSuccess = step(callNext), 3834 onError = step(doThrow); 3835 function step(getNext) { 3836 return function (val) { 3837 var next = getNext(val), 3838 value = next.value; 3839 return next.done ? value : !value || typeof value.then !== 'function' ? isArray(value) ? Promise.all(value).then(onSuccess, onError) : onSuccess(value) : value.then(onSuccess, onError); 3840 }; 3841 } 3842 return step(callNext)(); 3843 } 3844 function extractTransactionArgs(mode, _tableArgs_, scopeFunc) { 3845 var i = arguments.length; 3846 if (i < 2) throw new exceptions.InvalidArgument("Too few arguments"); 3847 var args = new Array(i - 1); 3848 while (--i) args[i - 1] = arguments[i]; 3849 scopeFunc = args.pop(); 3850 var tables = flatten(args); 3851 return [mode, tables, scopeFunc]; 3852 } 3853 function enterTransactionScope(db, mode, storeNames, parentTransaction, scopeFunc) { 3854 return DexiePromise.resolve().then(function () { 3855 var transless = PSD.transless || PSD; 3856 var trans = db._createTransaction(mode, storeNames, db._dbSchema, parentTransaction); 3857 var zoneProps = { 3858 trans: trans, 3859 transless: transless 3860 }; 3861 if (parentTransaction) { 3862 trans.idbtrans = parentTransaction.idbtrans; 3863 } else { 3864 try { 3865 trans.create(); 3866 db._state.PR1398_maxLoop = 3; 3867 } catch (ex) { 3868 if (ex.name === errnames.InvalidState && db.isOpen() && --db._state.PR1398_maxLoop > 0) { 3869 console.warn('Dexie: Need to reopen db'); 3870 db._close(); 3871 return db.open().then(function () { 3872 return enterTransactionScope(db, mode, storeNames, null, scopeFunc); 3873 }); 3874 } 3875 return rejection(ex); 3876 } 3877 } 3878 var scopeFuncIsAsync = isAsyncFunction(scopeFunc); 3879 if (scopeFuncIsAsync) { 3880 incrementExpectedAwaits(); 3881 } 3882 var returnValue; 3883 var promiseFollowed = DexiePromise.follow(function () { 3884 returnValue = scopeFunc.call(trans, trans); 3885 if (returnValue) { 3886 if (scopeFuncIsAsync) { 3887 var decrementor = decrementExpectedAwaits.bind(null, null); 3888 returnValue.then(decrementor, decrementor); 3889 } else if (typeof returnValue.next === 'function' && typeof returnValue["throw"] === 'function') { 3890 returnValue = awaitIterator(returnValue); 3891 } 3892 } 3893 }, zoneProps); 3894 return (returnValue && typeof returnValue.then === 'function' ? DexiePromise.resolve(returnValue).then(function (x) { 3895 return trans.active ? x : rejection(new exceptions.PrematureCommit("Transaction committed too early. See http://bit.ly/2kdckMn")); 3896 }) : promiseFollowed.then(function () { 3897 return returnValue; 3898 })).then(function (x) { 3899 if (parentTransaction) trans._resolve(); 3900 return trans._completion.then(function () { 3901 return x; 3902 }); 3903 })["catch"](function (e) { 3904 trans._reject(e); 3905 return rejection(e); 3906 }); 3907 }); 3908 } 3909 function pad(a, value, count) { 3910 var result = isArray(a) ? a.slice() : [a]; 3911 for (var i = 0; i < count; ++i) result.push(value); 3912 return result; 3913 } 3914 function createVirtualIndexMiddleware(down) { 3915 return _assign(_assign({}, down), { 3916 table: function table(tableName) { 3917 var table = down.table(tableName); 3918 var schema = table.schema; 3919 var indexLookup = {};
3920 var allVirtualIndexes = []; 3921 function addVirtualIndexes(keyPath, keyTail, lowLevelIndex) { 3922 var keyPathAlias = getKeyPathAlias(keyPath); 3923 var indexList = indexLookup[keyPathAlias] = indexLookup[keyPathAlias] || []; 3924 var keyLength = keyPath == null ? 0 : typeof keyPath === 'string' ? 1 : keyPath.length; 3925 var isVirtual = keyTail > 0; 3926 var virtualIndex = _assign(_assign({}, lowLevelIndex), { 3927 isVirtual: isVirtual, 3928 keyTail: keyTail, 3929 keyLength: keyLength, 3930 extractKey: getKeyExtractor(keyPath), 3931 unique: !isVirtual && lowLevelIndex.unique 3932 }); 3933 indexList.push(virtualIndex); 3934 if (!virtualIndex.isPrimaryKey) { 3935 allVirtualIndexes.push(virtualIndex); 3936 } 3937 if (keyLength > 1) { 3938 var virtualKeyPath = keyLength === 2 ? keyPath[0] : keyPath.slice(0, keyLength - 1); 3939 addVirtualIndexes(virtualKeyPath, keyTail + 1, lowLevelIndex); 3940 } 3941 indexList.sort(function (a, b) { 3942 return a.keyTail - b.keyTail; 3943 }); 3944 return virtualIndex; 3945 }
vendor: 1,249 bytes, lines 3946-3976
3946 var primaryKey = addVirtualIndexes(schema.primaryKey.keyPath, 0, schema.primaryKey); 3947 indexLookup[":id"] = [primaryKey]; 3948 for (var _i = 0, _a = schema.indexes; _i < _a.length; _i++) { 3949 var index = _a[_i]; 3950 addVirtualIndexes(index.keyPath, 0, index); 3951 } 3952 function findBestIndex(keyPath) { 3953 var result = indexLookup[getKeyPathAlias(keyPath)]; 3954 return result && result[0]; 3955 } 3956 function translateRange(range, keyTail) { 3957 return { 3958 type: range.type === 1 ? 2 : range.type, 3959 lower: pad(range.lower, range.lowerOpen ? down.MAX_KEY : down.MIN_KEY, keyTail), 3960 lowerOpen: true, 3961 upper: pad(range.upper, range.upperOpen ? down.MIN_KEY : down.MAX_KEY, keyTail), 3962 upperOpen: true 3963 }; 3964 } 3965 function translateRequest(req) { 3966 var index = req.query.index; 3967 return index.isVirtual ? _assign(_assign({}, req), { 3968 query: { 3969 index: index, 3970 range: translateRange(req.query.range, index.keyTail) 3971 } 3972 }) : req; 3973 } 3974 var result = _assign(_assign({}, table), { 3975 schema: _assign(_assign({}, schema), { 3976 primaryKey: primaryKey,
3977 indexes: allVirtualIndexes, 3978 getIndexByKeyPath: findBestIndex 3979 }), 3980 count: function count(req) { 3981 return table.count(translateRequest(req)); 3982 }, 3983 query: function query(req) { 3984 return table.query(translateRequest(req)); 3985 }, 3986 openCursor: function openCursor(req) { 3987 var _a = req.query.index, 3988 keyTail = _a.keyTail, 3989 isVirtual = _a.isVirtual, 3990 keyLength = _a.keyLength; 3991 if (!isVirtual) return table.openCursor(req); 3992 function createVirtualCursor(cursor) { 3993 function _continue(key) { 3994 key != null ? cursor["continue"](pad(key, req.reverse ? down.MAX_KEY : down.MIN_KEY, keyTail)) : req.unique ? cursor["continue"](cursor.key.slice(0, keyLength).concat(req.reverse ? down.MIN_KEY : down.MAX_KEY, keyTail)) : cursor["continue"](); 3995 } 3996 var virtualCursor = Object.create(cursor, { 3997 "continue": { 3998 value: _continue 3999 }, 4000 continuePrimaryKey: { 4001 value: function value(key, primaryKey) { 4002 cursor.continuePrimaryKey(pad(key, down.MAX_KEY, keyTail), primaryKey); 4003 } 4004 }, 4005 primaryKey: { 4006 get: function get() { 4007 return cursor.primaryKey; 4008 } 4009 }, 4010 key: { 4011 get: function get() { 4012 var key = cursor.key; 4013 return keyLength === 1 ? key[0] : key.slice(0, keyLength); 4014 } 4015 }, 4016 value: { 4017 get: function get() { 4018 return cursor.value; 4019 } 4020 } 4021 }); 4022 return virtualCursor; 4023 } 4024 return table.openCursor(translateRequest(req)).then(function (cursor) {
4025 return cursor && createVirtualCursor(cursor); 4026 }); 4027 } 4028 }); 4029 return result; 4030 } 4031 }); 4032 } 4033 var virtualIndexMiddleware = { 4034 stack: "dbcore", 4035 name: "VirtualIndexMiddleware", 4036 level: 1, 4037 create: createVirtualIndexMiddleware 4038 }; 4039 function getObjectDiff(a, b, rv, prfx) { 4040 rv = rv || {}; 4041 prfx = prfx || ''; 4042 keys(a).forEach(function (prop) { 4043 if (!hasOwn(b, prop)) { 4044 rv[prfx + prop] = undefined; 4045 } else { 4046 var ap = a[prop], 4047 bp = b[prop]; 4048 if (babelHelpers["typeof"](ap) === 'object' && babelHelpers["typeof"](bp) === 'object' && ap && bp) { 4049 var apTypeName = toStringTag(ap); 4050 var bpTypeName = toStringTag(bp); 4051 if (apTypeName !== bpTypeName) { 4052 rv[prfx + prop] = b[prop]; 4053 } else if (apTypeName === 'Object') { 4054 getObjectDiff(ap, bp, rv, prfx + prop + '.'); 4055 } else if (ap !== bp) { 4056 rv[prfx + prop] = b[prop]; 4057 } 4058 } else if (ap !== bp) rv[prfx + prop] = b[prop]; 4059 } 4060 }); 4061 keys(b).forEach(function (prop) { 4062 if (!hasOwn(a, prop)) { 4063 rv[prfx + prop] = b[prop]; 4064 } 4065 }); 4066 return rv; 4067 } 4068 function getEffectiveKeys(primaryKey, req) { 4069 if (req.type === 'delete') return req.keys; 4070 return req.keys || req.values.map(primaryKey.extractKey); 4071 } 4072 var hooksMiddleware = { 4073 stack: "dbcore", 4074 name: "HooksMiddleware", 4075 level: 2, 4076 create: function create(downCore) { 4077 return _assign(_assign({}, downCore), { 4078 table: function table(tableName) { 4079 var downTable = downCore.table(tableName); 4080 var primaryKey = downTable.schema.primaryKey; 4081 var tableMiddleware = _assign(_assign({}, downTable), { 4082 mutate: function mutate(req) { 4083 var dxTrans = PSD.trans; 4084 var _a = dxTrans.table(tableName).hook, 4085 deleting = _a.deleting, 4086 creating = _a.creating, 4087 updating = _a.updating; 4088 switch (req.type) { 4089 case 'add': 4090 if (creating.fire === nop) break; 4091 return dxTrans._promise('readwrite', function () { 4092 return addPutOrDelete(req); 4093 }, true); 4094 case 'put': 4095 if (creating.fire === nop && updating.fire === nop) break; 4096 return dxTrans._promise('readwrite', function () { 4097 return addPutOrDelete(req); 4098 }, true); 4099 case 'delete': 4100 if (deleting.fire === nop) break; 4101 return dxTrans._promise('readwrite', function () { 4102 return addPutOrDelete(req); 4103 }, true); 4104 case 'deleteRange': 4105 if (deleting.fire === nop) break; 4106 return dxTrans._promise('readwrite', function () { 4107 return deleteRange(req); 4108 }, true); 4109 } 4110 return downTable.mutate(req); 4111 function addPutOrDelete(req) { 4112 var dxTrans = PSD.trans; 4113 var keys = req.keys || getEffectiveKeys(primaryKey, req); 4114 if (!keys) throw new Error("Keys missing"); 4115 req = req.type === 'add' || req.type === 'put' ? _assign(_assign({}, req), { 4116 keys: keys 4117 }) : _assign({}, req); 4118 if (req.type !== 'delete') req.values = __spreadArray([], req.values, true); 4119 if (req.keys) req.keys = __spreadArray([], req.keys, true); 4120 return getExistingValues(downTable, req, keys).then(function (existingValues) { 4121 var contexts = keys.map(function (key, i) {
vendor: 2,683 bytes, lines 4122-4174
4122 var existingValue = existingValues[i]; 4123 var ctx = { 4124 onerror: null, 4125 onsuccess: null 4126 }; 4127 if (req.type === 'delete') { 4128 deleting.fire.call(ctx, key, existingValue, dxTrans); 4129 } else if (req.type === 'add' || existingValue === undefined) { 4130 var generatedPrimaryKey = creating.fire.call(ctx, key, req.values[i], dxTrans); 4131 if (key == null && generatedPrimaryKey != null) { 4132 key = generatedPrimaryKey; 4133 req.keys[i] = key; 4134 if (!primaryKey.outbound) { 4135 setByKeyPath(req.values[i], primaryKey.keyPath, key); 4136 } 4137 } 4138 } else { 4139 var objectDiff = getObjectDiff(existingValue, req.values[i]); 4140 var additionalChanges_1 = updating.fire.call(ctx, objectDiff, key, existingValue, dxTrans); 4141 if (additionalChanges_1) { 4142 var requestedValue_1 = req.values[i]; 4143 Object.keys(additionalChanges_1).forEach(function (keyPath) { 4144 if (hasOwn(requestedValue_1, keyPath)) { 4145 requestedValue_1[keyPath] = additionalChanges_1[keyPath]; 4146 } else { 4147 setByKeyPath(requestedValue_1, keyPath, additionalChanges_1[keyPath]); 4148 } 4149 }); 4150 } 4151 } 4152 return ctx; 4153 }); 4154 return downTable.mutate(req).then(function (_a) { 4155 var failures = _a.failures, 4156 results = _a.results, 4157 numFailures = _a.numFailures, 4158 lastResult = _a.lastResult; 4159 for (var i = 0; i < keys.length; ++i) { 4160 var primKey = results ? results[i] : keys[i]; 4161 var ctx = contexts[i]; 4162 if (primKey == null) { 4163 ctx.onerror && ctx.onerror(failures[i]); 4164 } else { 4165 ctx.onsuccess && ctx.onsuccess(req.type === 'put' && existingValues[i] ? req.values[i] : primKey); 4166 } 4167 } 4168 return { 4169 failures: failures, 4170 results: results, 4171 numFailures: numFailures, 4172 lastResult: lastResult 4173 }; 4174 })["catch"](function (error) {
4175 contexts.forEach(function (ctx) { 4176 return ctx.onerror && ctx.onerror(error); 4177 }); 4178 return Promise.reject(error); 4179 }); 4180 }); 4181 } 4182 function deleteRange(req) { 4183 return deleteNextChunk(req.trans, req.range, 10000); 4184 } 4185 function deleteNextChunk(trans, range, limit) { 4186 return downTable.query({ 4187 trans: trans, 4188 values: false, 4189 query: { 4190 index: primaryKey, 4191 range: range 4192 }, 4193 limit: limit 4194 }).then(function (_a) { 4195 var result = _a.result; 4196 return addPutOrDelete({ 4197 type: 'delete', 4198 keys: result, 4199 trans: trans 4200 }).then(function (res) { 4201 if (res.numFailures > 0) return Promise.reject(res.failures[0]); 4202 if (result.length < limit) { 4203 return { 4204 failures: [], 4205 numFailures: 0, 4206 lastResult: undefined 4207 }; 4208 } else { 4209 return deleteNextChunk(trans, _assign(_assign({}, range), { 4210 lower: result[result.length - 1], 4211 lowerOpen: true 4212 }), limit); 4213 } 4214 }); 4215 }); 4216 } 4217 } 4218 }); 4219 return tableMiddleware; 4220 } 4221 }); 4222 } 4223 }; 4224 function getExistingValues(table, req, effectiveKeys) { 4225 return req.type === "add" ? Promise.resolve([]) : table.getMany({ 4226 trans: req.trans, 4227 keys: effectiveKeys, 4228 cache: "immutable" 4229 }); 4230 } 4231 function getFromTransactionCache(keys, cache, clone) { 4232 try { 4233 if (!cache) return null; 4234 if (cache.keys.length < keys.length) return null; 4235 var result = []; 4236 for (var i = 0, j = 0; i < cache.keys.length && j < keys.length; ++i) { 4237 if (cmp(cache.keys[i], keys[j]) !== 0) continue; 4238 result.push(clone ? deepClone(cache.values[i]) : cache.values[i]); 4239 ++j; 4240 } 4241 return result.length === keys.length ? result : null; 4242 } catch (_a) { 4243 return null; 4244 } 4245 } 4246 var cacheExistingValuesMiddleware = { 4247 stack: "dbcore", 4248 level: -1, 4249 create: function create(core) { 4250 return { 4251 table: function table(tableName) { 4252 var table = core.table(tableName); 4253 return _assign(_assign({}, table), { 4254 getMany: function getMany(req) { 4255 if (!req.cache) { 4256 return table.getMany(req); 4257 } 4258 var cachedResult = getFromTransactionCache(req.keys, req.trans["_cache"], req.cache === "clone"); 4259 if (cachedResult) { 4260 return DexiePromise.resolve(cachedResult); 4261 } 4262 return table.getMany(req).then(function (res) { 4263 req.trans["_cache"] = { 4264 keys: req.keys, 4265 values: req.cache === "clone" ? deepClone(res) : res 4266 }; 4267 return res; 4268 }); 4269 }, 4270 mutate: function mutate(req) { 4271 if (req.type !== "add") req.trans["_cache"] = null; 4272 return table.mutate(req); 4273 } 4274 }); 4275 } 4276 }; 4277 } 4278 }; 4279 var _a; 4280 function isEmptyRange(node) { 4281 return !("from" in node); 4282 } 4283 var RangeSet = function RangeSet(fromOrTree, to) { 4284 if (this) { 4285 extend(this, arguments.length ? { 4286 d: 1, 4287 from: fromOrTree, 4288 to: arguments.length > 1 ? to : fromOrTree 4289 } : { 4290 d: 0 4291 }); 4292 } else { 4293 var rv = new RangeSet(); 4294 if (fromOrTree && "d" in fromOrTree) { 4295 extend(rv, fromOrTree); 4296 } 4297 return rv; 4298 } 4299 }; 4300 props(RangeSet.prototype, (_a = { 4301 add: function add(rangeSet) { 4302 mergeRanges(this, rangeSet); 4303 return this; 4304 }, 4305 addKey: function addKey(key) { 4306 addRange(this, key, key); 4307 return this; 4308 }, 4309 addKeys: function addKeys(keys) { 4310 var _this = this; 4311 keys.forEach(function (key) {
4312 return addRange(_this, key, key); 4313 }); 4314 return this; 4315 } 4316 }, _a[iteratorSymbol] = function () { 4317 return getRangeSetIterator(this); 4318 }, _a)); 4319 function addRange(target, from, to) { 4320 var diff = cmp(from, to); 4321 if (isNaN(diff)) return; 4322 if (diff > 0) throw RangeError(); 4323 if (isEmptyRange(target)) return extend(target, { 4324 from: from, 4325 to: to, 4326 d: 1 4327 }); 4328 var left = target.l; 4329 var right = target.r; 4330 if (cmp(to, target.from) < 0) { 4331 left ? addRange(left, from, to) : target.l = { 4332 from: from, 4333 to: to, 4334 d: 1, 4335 l: null, 4336 r: null 4337 }; 4338 return rebalance(target); 4339 } 4340 if (cmp(from, target.to) > 0) { 4341 right ? addRange(right, from, to) : target.r = { 4342 from: from, 4343 to: to, 4344 d: 1, 4345 l: null, 4346 r: null 4347 }; 4348 return rebalance(target); 4349 } 4350 if (cmp(from, target.from) < 0) { 4351 target.from = from; 4352 target.l = null; 4353 target.d = right ? right.d + 1 : 1; 4354 } 4355 if (cmp(to, target.to) > 0) { 4356 target.to = to; 4357 target.r = null; 4358 target.d = target.l ? target.l.d + 1 : 1; 4359 } 4360 var rightWasCutOff = !target.r; 4361 if (left && !target.l) { 4362 mergeRanges(target, left); 4363 } 4364 if (right && rightWasCutOff) { 4365 mergeRanges(target, right); 4366 } 4367 } 4368 function mergeRanges(target, newSet) { 4369 function _addRangeSet(target, _a) { 4370 var from = _a.from, 4371 to = _a.to, 4372 l = _a.l, 4373 r = _a.r; 4374 addRange(target, from, to); 4375 if (l) _addRangeSet(target, l); 4376 if (r) _addRangeSet(target, r); 4377 } 4378 if (!isEmptyRange(newSet)) _addRangeSet(target, newSet); 4379 } 4380 function rangesOverlap(rangeSet1, rangeSet2) { 4381 var i1 = getRangeSetIterator(rangeSet2); 4382 var nextResult1 = i1.next(); 4383 if (nextResult1.done) return false; 4384 var a = nextResult1.value; 4385 var i2 = getRangeSetIterator(rangeSet1); 4386 var nextResult2 = i2.next(a.from); 4387 var b = nextResult2.value; 4388 while (!nextResult1.done && !nextResult2.done) { 4389 if (cmp(b.from, a.to) <= 0 && cmp(b.to, a.from) >= 0) return true; 4390 cmp(a.from, b.from) < 0 ? a = (nextResult1 = i1.next(b.from)).value : b = (nextResult2 = i2.next(a.from)).value; 4391 } 4392 return false; 4393 } 4394 function getRangeSetIterator(node) { 4395 var state = isEmptyRange(node) ? null : { 4396 s: 0, 4397 n: node 4398 }; 4399 return { 4400 next: function next(key) { 4401 var keyProvided = arguments.length > 0; 4402 while (state) { 4403 switch (state.s) { 4404 case 0: 4405 state.s = 1; 4406 if (keyProvided) { 4407 while (state.n.l && cmp(key, state.n.from) < 0) state = { 4408 up: state, 4409 n: state.n.l, 4410 s: 1 4411 }; 4412 } else { 4413 while (state.n.l) state = { 4414 up: state, 4415 n: state.n.l, 4416 s: 1 4417 }; 4418 } 4419 case 1: 4420 state.s = 2; 4421 if (!keyProvided || cmp(key, state.n.to) <= 0) return { 4422 value: state.n, 4423 done: false 4424 }; 4425 case 2: 4426 if (state.n.r) { 4427 state.s = 3; 4428 state = { 4429 up: state, 4430 n: state.n.r, 4431 s: 0 4432 }; 4433 continue; 4434 } 4435 case 3: 4436 state = state.up; 4437 } 4438 } 4439 return { 4440 done: true 4441 }; 4442 } 4443 }; 4444 } 4445 function rebalance(target) { 4446 var _a, _b; 4447 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); 4448 var r = diff > 1 ? "r" : diff < -1 ? "l" : ""; 4449 if (r) { 4450 var l = r === "r" ? "l" : "r"; 4451 var rootClone = _assign({}, target); 4452 var oldRootRight = target[r]; 4453 target.from = oldRootRight.from; 4454 target.to = oldRootRight.to; 4455 target[r] = oldRootRight[r]; 4456 rootClone[r] = oldRootRight[l]; 4457 target[l] = rootClone; 4458 rootClone.d = computeDepth(rootClone); 4459 } 4460 target.d = computeDepth(target); 4461 } 4462 function computeDepth(_a) { 4463 var r = _a.r, 4464 l = _a.l; 4465 return (r ? l ? Math.max(r.d, l.d) : r.d : l ? l.d : 0) + 1; 4466 } 4467 var observabilityMiddleware = { 4468 stack: "dbcore", 4469 level: 0, 4470 create: function create(core) { 4471 var dbName = core.schema.name; 4472 var FULL_RANGE = new RangeSet(core.MIN_KEY, core.MAX_KEY); 4473 return _assign(_assign({}, core), { 4474 table: function table(tableName) { 4475 var table = core.table(tableName); 4476 var schema = table.schema; 4477 var primaryKey = schema.primaryKey; 4478 var extractKey = primaryKey.extractKey, 4479 outbound = primaryKey.outbound; 4480 var tableClone = _assign(_assign({}, table), { 4481 mutate: function mutate(req) { 4482 var trans = req.trans; 4483 var mutatedParts = trans.mutatedParts || (trans.mutatedParts = {}); 4484 var getRangeSet = function getRangeSet(indexName) { 4485 var part = "idb://" + dbName + "/" + tableName + "/" + indexName; 4486 return mutatedParts[part] || (mutatedParts[part] = new RangeSet()); 4487 }; 4488 var pkRangeSet = getRangeSet(""); 4489 var delsRangeSet = getRangeSet(":dels"); 4490 var type = req.type; 4491 var _a = req.type === "deleteRange" ? [req.range] : req.type === "delete" ? [req.keys] : req.values.length < 50 ? [[], req.values] : [], 4492 keys = _a[0], 4493 newObjs = _a[1]; 4494 var oldCache = req.trans["_cache"]; 4495 return table.mutate(req).then(function (res) { 4496 if (isArray(keys)) { 4497 if (type !== "delete") keys = res.results; 4498 pkRangeSet.addKeys(keys); 4499 var oldObjs = getFromTransactionCache(keys, oldCache); 4500 if (!oldObjs && type !== "add") {
4501 delsRangeSet.addKeys(keys); 4502 } 4503 if (oldObjs || newObjs) { 4504 trackAffectedIndexes(getRangeSet, schema, oldObjs, newObjs); 4505 } 4506 } else if (keys) { 4507 var range = { 4508 from: keys.lower, 4509 to: keys.upper 4510 }; 4511 delsRangeSet.add(range); 4512 pkRangeSet.add(range); 4513 } else { 4514 pkRangeSet.add(FULL_RANGE); 4515 delsRangeSet.add(FULL_RANGE); 4516 schema.indexes.forEach(function (idx) { 4517 return getRangeSet(idx.name).add(FULL_RANGE); 4518 }); 4519 } 4520 return res; 4521 }); 4522 } 4523 }); 4524 var getRange = function getRange(_a) { 4525 var _b, _c; 4526 var _d = _a.query, 4527 index = _d.index, 4528 range = _d.range; 4529 return [index, new RangeSet((_b = range.lower) !== null && _b !== void 0 ? _b : core.MIN_KEY, (_c = range.upper) !== null && _c !== void 0 ? _c : core.MAX_KEY)]; 4530 }; 4531 var readSubscribers = { 4532 get: function get(req) { 4533 return [primaryKey, new RangeSet(req.key)]; 4534 }, 4535 getMany: function getMany(req) { 4536 return [primaryKey, new RangeSet().addKeys(req.keys)]; 4537 }, 4538 count: getRange, 4539 query: getRange, 4540 openCursor: getRange 4541 }; 4542 keys(readSubscribers).forEach(function (method) { 4543 tableClone[method] = function (req) { 4544 var subscr = PSD.subscr; 4545 if (subscr) { 4546 var getRangeSet = function getRangeSet(indexName) { 4547 var part = "idb://" + dbName + "/" + tableName + "/" + indexName; 4548 return subscr[part] || (subscr[part] = new RangeSet()); 4549 }; 4550 var pkRangeSet_1 = getRangeSet(""); 4551 var delsRangeSet_1 = getRangeSet(":dels"); 4552 var _a = readSubscribers[method](req), 4553 queriedIndex = _a[0], 4554 queriedRanges = _a[1]; 4555 getRangeSet(queriedIndex.name || "").add(queriedRanges); 4556 if (!queriedIndex.isPrimaryKey) { 4557 if (method === "count") { 4558 delsRangeSet_1.add(FULL_RANGE); 4559 } else { 4560 var keysPromise_1 = method === "query" && outbound && req.values && table.query(_assign(_assign({}, req), { 4561 values: false 4562 })); 4563 return table[method].apply(this, arguments).then(function (res) { 4564 if (method === "query") { 4565 if (outbound && req.values) { 4566 return keysPromise_1.then(function (_a) { 4567 var resultingKeys = _a.result; 4568 pkRangeSet_1.addKeys(resultingKeys); 4569 return res; 4570 }); 4571 } 4572 var pKeys = req.values ? res.result.map(extractKey) : res.result; 4573 if (req.values) { 4574 pkRangeSet_1.addKeys(pKeys); 4575 } else { 4576 delsRangeSet_1.addKeys(pKeys); 4577 } 4578 } else if (method === "openCursor") { 4579 var cursor_1 = res; 4580 var wantValues_1 = req.values; 4581 return cursor_1 && Object.create(cursor_1, { 4582 key: { 4583 get: function get() { 4584 delsRangeSet_1.addKey(cursor_1.primaryKey); 4585 return cursor_1.key; 4586 } 4587 }, 4588 primaryKey: { 4589 get: function get() { 4590 var pkey = cursor_1.primaryKey; 4591 delsRangeSet_1.addKey(pkey); 4592 return pkey; 4593 } 4594 }, 4595 value: { 4596 get: function get() { 4597 wantValues_1 && pkRangeSet_1.addKey(cursor_1.primaryKey); 4598 return cursor_1.value; 4599 } 4600 } 4601 }); 4602 } 4603 return res; 4604 }); 4605 } 4606 } 4607 } 4608 return table[method].apply(this, arguments); 4609 }; 4610 }); 4611 return tableClone; 4612 } 4613 }); 4614 } 4615 }; 4616 function trackAffectedIndexes(getRangeSet, schema, oldObjs, newObjs) { 4617 function addAffectedIndex(ix) { 4618 var rangeSet = getRangeSet(ix.name || ""); 4619 function extractKey(obj) { 4620 return obj != null ? ix.extractKey(obj) : null; 4621 } 4622 var addKeyOrKeys = function addKeyOrKeys(key) {
4623 return ix.multiEntry && isArray(key) ? key.forEach(function (key) { 4624 return rangeSet.addKey(key); 4625 }) : rangeSet.addKey(key); 4626 }; 4627 (oldObjs || newObjs).forEach(function (_, i) { 4628 var oldKey = oldObjs && extractKey(oldObjs[i]); 4629 var newKey = newObjs && extractKey(newObjs[i]); 4630 if (cmp(oldKey, newKey) !== 0) { 4631 if (oldKey != null) addKeyOrKeys(oldKey); 4632 if (newKey != null) addKeyOrKeys(newKey); 4633 } 4634 }); 4635 } 4636 schema.indexes.forEach(addAffectedIndex); 4637 } 4638 var Dexie$1 = function () { 4639 function Dexie(name, options) { 4640 var _this = this; 4641 this._middlewares = {}; 4642 this.verno = 0; 4643 var deps = Dexie.dependencies; 4644 this._options = options = _assign({ 4645 addons: Dexie.addons, 4646 autoOpen: true, 4647 indexedDB: deps.indexedDB, 4648 IDBKeyRange: deps.IDBKeyRange 4649 }, options); 4650 this._deps = { 4651 indexedDB: options.indexedDB, 4652 IDBKeyRange: options.IDBKeyRange 4653 }; 4654 var addons = options.addons; 4655 this._dbSchema = {}; 4656 this._versions = []; 4657 this._storeNames = []; 4658 this._allTables = {}; 4659 this.idbdb = null; 4660 this._novip = this; 4661 var state = { 4662 dbOpenError: null, 4663 isBeingOpened: false, 4664 onReadyBeingFired: null, 4665 openComplete: false, 4666 dbReadyResolve: nop, 4667 dbReadyPromise: null, 4668 cancelOpen: nop, 4669 openCanceller: null, 4670 autoSchema: true, 4671 PR1398_maxLoop: 3 4672 }; 4673 state.dbReadyPromise = new DexiePromise(function (resolve) { 4674 state.dbReadyResolve = resolve; 4675 }); 4676 state.openCanceller = new DexiePromise(function (_, reject) { 4677 state.cancelOpen = reject; 4678 }); 4679 this._state = state; 4680 this.name = name; 4681 this.on = Events(this, "populate", "blocked", "versionchange", "close", { 4682 ready: [promisableChain, nop] 4683 }); 4684 this.on.ready.subscribe = override(this.on.ready.subscribe, function (subscribe) { 4685 return function (subscriber, bSticky) { 4686 Dexie.vip(function () { 4687 var state = _this._state; 4688 if (state.openComplete) { 4689 if (!state.dbOpenError) DexiePromise.resolve().then(subscriber); 4690 if (bSticky) subscribe(subscriber); 4691 } else if (state.onReadyBeingFired) { 4692 state.onReadyBeingFired.push(subscriber); 4693 if (bSticky) subscribe(subscriber); 4694 } else { 4695 subscribe(subscriber); 4696 var db_1 = _this; 4697 if (!bSticky) subscribe(function unsubscribe() { 4698 db_1.on.ready.unsubscribe(subscriber); 4699 db_1.on.ready.unsubscribe(unsubscribe); 4700 }); 4701 } 4702 }); 4703 }; 4704 }); 4705 this.Collection = createCollectionConstructor(this); 4706 this.Table = createTableConstructor(this); 4707 this.Transaction = createTransactionConstructor(this); 4708 this.Version = createVersionConstructor(this); 4709 this.WhereClause = createWhereClauseConstructor(this); 4710 this.on("versionchange", function (ev) { 4711 if (ev.newVersion > 0) console.warn("Another connection wants to upgrade database '" + _this.name + "'. Closing db now to resume the upgrade.");else console.warn("Another connection wants to delete database '" + _this.name + "'. Closing db now to resume the delete request."); 4712 _this.close(); 4713 }); 4714 this.on("blocked", function (ev) { 4715 if (!ev.newVersion || ev.newVersion < ev.oldVersion) console.warn("Dexie.delete('" + _this.name + "') was blocked");else console.warn("Upgrade '" + _this.name + "' blocked by other connection holding version " + ev.oldVersion / 10); 4716 }); 4717 this._maxKey = _getMaxKey(options.IDBKeyRange); 4718 this._createTransaction = function (mode, storeNames, dbschema, parentTransaction) { 4719 return new _this.Transaction(mode, storeNames, dbschema, _this._options.chromeTransactionDurability, parentTransaction); 4720 }; 4721 this._fireOnBlocked = function (ev) { 4722 _this.on("blocked").fire(ev); 4723 connections.filter(function (c) { 4724 return c.name === _this.name && c !== _this && !c._state.vcFired; 4725 }).map(function (c) { 4726 return c.on("versionchange").fire(ev); 4727 }); 4728 }; 4729 this.use(virtualIndexMiddleware); 4730 this.use(hooksMiddleware); 4731 this.use(observabilityMiddleware); 4732 this.use(cacheExistingValuesMiddleware); 4733 this.vip = Object.create(this, { 4734 _vip: { 4735 value: true 4736 } 4737 }); 4738 addons.forEach(function (addon) { 4739 return addon(_this); 4740 }); 4741 } 4742 Dexie.prototype.version = function (versionNumber) { 4743 if (isNaN(versionNumber) || versionNumber < 0.1) throw new exceptions.Type("Given version is not a positive number"); 4744 versionNumber = Math.round(versionNumber * 10) / 10; 4745 if (this.idbdb || this._state.isBeingOpened) throw new exceptions.Schema("Cannot add version when database is open"); 4746 this.verno = Math.max(this.verno, versionNumber); 4747 var versions = this._versions; 4748 var versionInstance = versions.filter(function (v) { 4749 return v._cfg.version === versionNumber; 4750 })[0]; 4751 if (versionInstance) return versionInstance; 4752 versionInstance = new this.Version(versionNumber); 4753 versions.push(versionInstance); 4754 versions.sort(lowerVersionFirst); 4755 versionInstance.stores({}); 4756 this._state.autoSchema = false;
4757 return versionInstance; 4758 }; 4759 Dexie.prototype._whenReady = function (fn) { 4760 var _this = this; 4761 return this.idbdb && (this._state.openComplete || PSD.letThrough || this._vip) ? fn() : new DexiePromise(function (resolve, reject) { 4762 if (_this._state.openComplete) { 4763 return reject(new exceptions.DatabaseClosed(_this._state.dbOpenError)); 4764 } 4765 if (!_this._state.isBeingOpened) { 4766 if (!_this._options.autoOpen) { 4767 reject(new exceptions.DatabaseClosed()); 4768 return; 4769 } 4770 _this.open()["catch"](nop); 4771 } 4772 _this._state.dbReadyPromise.then(resolve, reject); 4773 }).then(fn); 4774 }; 4775 Dexie.prototype.use = function (_a) { 4776 var stack = _a.stack, 4777 create = _a.create, 4778 level = _a.level, 4779 name = _a.name; 4780 if (name) this.unuse({ 4781 stack: stack, 4782 name: name 4783 }); 4784 var middlewares = this._middlewares[stack] || (this._middlewares[stack] = []); 4785 middlewares.push({ 4786 stack: stack, 4787 create: create, 4788 level: level == null ? 10 : level, 4789 name: name 4790 }); 4791 middlewares.sort(function (a, b) { 4792 return a.level - b.level; 4793 }); 4794 return this; 4795 }; 4796 Dexie.prototype.unuse = function (_a) { 4797 var stack = _a.stack, 4798 name = _a.name, 4799 create = _a.create; 4800 if (stack && this._middlewares[stack]) { 4801 this._middlewares[stack] = this._middlewares[stack].filter(function (mw) { 4802 return create ? mw.create !== create : name ? mw.name !== name : false; 4803 }); 4804 } 4805 return this; 4806 }; 4807 Dexie.prototype.open = function () { 4808 return dexieOpen(this); 4809 }; 4810 Dexie.prototype._close = function () { 4811 var state = this._state; 4812 var idx = connections.indexOf(this); 4813 if (idx >= 0) connections.splice(idx, 1); 4814 if (this.idbdb) { 4815 try { 4816 this.idbdb.close(); 4817 } catch (e) {} 4818 this._novip.idbdb = null; 4819 } 4820 state.dbReadyPromise = new DexiePromise(function (resolve) { 4821 state.dbReadyResolve = resolve; 4822 }); 4823 state.openCanceller = new DexiePromise(function (_, reject) { 4824 state.cancelOpen = reject; 4825 }); 4826 }; 4827 Dexie.prototype.close = function () { 4828 this._close(); 4829 var state = this._state; 4830 this._options.autoOpen = false; 4831 state.dbOpenError = new exceptions.DatabaseClosed(); 4832 if (state.isBeingOpened) state.cancelOpen(state.dbOpenError); 4833 }; 4834 Dexie.prototype["delete"] = function () { 4835 var _this = this; 4836 var hasArguments = arguments.length > 0; 4837 var state = this._state; 4838 return new DexiePromise(function (resolve, reject) { 4839 var doDelete = function doDelete() { 4840 _this.close(); 4841 var req = _this._deps.indexedDB.deleteDatabase(_this.name); 4842 req.onsuccess = wrap(function () { 4843 _onDatabaseDeleted(_this._deps, _this.name); 4844 resolve(); 4845 }); 4846 req.onerror = eventRejectHandler(reject); 4847 req.onblocked = _this._fireOnBlocked; 4848 }; 4849 if (hasArguments) throw new exceptions.InvalidArgument("Arguments not allowed in db.delete()"); 4850 if (state.isBeingOpened) { 4851 state.dbReadyPromise.then(doDelete); 4852 } else { 4853 doDelete(); 4854 } 4855 }); 4856 }; 4857 Dexie.prototype.backendDB = function () { 4858 return this.idbdb; 4859 }; 4860 Dexie.prototype.isOpen = function () { 4861 return this.idbdb !== null; 4862 }; 4863 Dexie.prototype.hasBeenClosed = function () { 4864 var dbOpenError = this._state.dbOpenError; 4865 return dbOpenError && dbOpenError.name === 'DatabaseClosed'; 4866 }; 4867 Dexie.prototype.hasFailed = function () { 4868 return this._state.dbOpenError !== null; 4869 }; 4870 Dexie.prototype.dynamicallyOpened = function () { 4871 return this._state.autoSchema; 4872 }; 4873 Object.defineProperty(Dexie.prototype, "tables", { 4874 get: function get() { 4875 var _this = this; 4876 return keys(this._allTables).map(function (name) { 4877 return _this._allTables[name]; 4878 }); 4879 }, 4880 enumerable: false, 4881 configurable: true 4882 }); 4883 Dexie.prototype.transaction = function () { 4884 var args = extractTransactionArgs.apply(this, arguments); 4885 return this._transaction.apply(this, args); 4886 }; 4887 Dexie.prototype._transaction = function (mode, tables, scopeFunc) { 4888 var _this = this; 4889 var parentTransaction = PSD.trans; 4890 if (!parentTransaction || parentTransaction.db !== this || mode.indexOf('!') !== -1) parentTransaction = null; 4891 var onlyIfCompatible = mode.indexOf('?') !== -1; 4892 mode = mode.replace('!', '').replace('?', ''); 4893 var idbMode, storeNames; 4894 try { 4895 storeNames = tables.map(function (table) { 4896 var storeName = table instanceof _this.Table ? table.name : table; 4897 if (typeof storeName !== 'string') throw new TypeError("Invalid table argument to Dexie.transaction(). Only Table or String are allowed"); 4898 return storeName; 4899 }); 4900 if (mode == "r" || mode === READONLY) idbMode = READONLY;else if (mode == "rw" || mode == READWRITE) idbMode = READWRITE;else throw new exceptions.InvalidArgument("Invalid transaction mode: " + mode); 4901 if (parentTransaction) { 4902 if (parentTransaction.mode === READONLY && idbMode === READWRITE) { 4903 if (onlyIfCompatible) { 4904 parentTransaction = null; 4905 } else throw new exceptions.SubTransaction("Cannot enter a sub-transaction with READWRITE mode when parent transaction is READONLY"); 4906 } 4907 if (parentTransaction) {
4908 storeNames.forEach(function (storeName) { 4909 if (parentTransaction && parentTransaction.storeNames.indexOf(storeName) === -1) { 4910 if (onlyIfCompatible) { 4911 parentTransaction = null; 4912 } else throw new exceptions.SubTransaction("Table " + storeName + " not included in parent transaction."); 4913 } 4914 }); 4915 } 4916 if (onlyIfCompatible && parentTransaction && !parentTransaction.active) { 4917 parentTransaction = null; 4918 } 4919 } 4920 } catch (e) { 4921 return parentTransaction ? parentTransaction._promise(null, function (_, reject) { 4922 reject(e); 4923 }) : rejection(e); 4924 } 4925 var enterTransaction = enterTransactionScope.bind(null, this, idbMode, storeNames, parentTransaction, scopeFunc); 4926 return parentTransaction ? parentTransaction._promise(idbMode, enterTransaction, "lock") : PSD.trans ? usePSD(PSD.transless, function () { 4927 return _this._whenReady(enterTransaction); 4928 }) : this._whenReady(enterTransaction); 4929 }; 4930 Dexie.prototype.table = function (tableName) { 4931 if (!hasOwn(this._allTables, tableName)) { 4932 throw new exceptions.InvalidTable("Table " + tableName + " does not exist"); 4933 } 4934 return this._allTables[tableName]; 4935 }; 4936 return Dexie; 4937 }(); 4938 var symbolObservable = typeof Symbol !== "undefined" && "observable" in Symbol ? Symbol.observable : "@@observable"; 4939 var Observable = function () { 4940 function Observable(subscribe) { 4941 this._subscribe = subscribe; 4942 } 4943 Observable.prototype.subscribe = function (x, error, complete) { 4944 return this._subscribe(!x || typeof x === "function" ? { 4945 next: x, 4946 error: error, 4947 complete: complete 4948 } : x); 4949 }; 4950 Observable.prototype[symbolObservable] = function () { 4951 return this; 4952 }; 4953 return Observable; 4954 }(); 4955 function extendObservabilitySet(target, newSet) { 4956 keys(newSet).forEach(function (part) { 4957 var rangeSet = target[part] || (target[part] = new RangeSet()); 4958 mergeRanges(rangeSet, newSet[part]); 4959 }); 4960 return target; 4961 } 4962 function liveQuery(querier) { 4963 return new Observable(function (observer) { 4964 var scopeFuncIsAsync = isAsyncFunction(querier); 4965 function execute(subscr) { 4966 if (scopeFuncIsAsync) { 4967 incrementExpectedAwaits(); 4968 } 4969 var exec = function exec() { 4970 return newScope(querier, { 4971 subscr: subscr, 4972 trans: null 4973 }); 4974 }; 4975 var rv = PSD.trans ? usePSD(PSD.transless, exec) : exec(); 4976 if (scopeFuncIsAsync) { 4977 rv.then(decrementExpectedAwaits, decrementExpectedAwaits); 4978 } 4979 return rv; 4980 } 4981 var closed = false; 4982 var accumMuts = {}; 4983 var currentObs = {}; 4984 var subscription = { 4985 get closed() { 4986 return closed; 4987 }, 4988 unsubscribe: function unsubscribe() { 4989 closed = true; 4990 globalEvents.storagemutated.unsubscribe(mutationListener); 4991 } 4992 }; 4993 observer.start && observer.start(subscription); 4994 var querying = false, 4995 startedListening = false; 4996 function shouldNotify() { 4997 return keys(currentObs).some(function (key) { 4998 return accumMuts[key] && rangesOverlap(accumMuts[key], currentObs[key]); 4999 }); 5000 } 5001 var mutationListener = function mutationListener(parts) { 5002 extendObservabilitySet(accumMuts, parts); 5003 if (shouldNotify()) { 5004 doQuery(); 5005 } 5006 }; 5007 var doQuery = function doQuery() { 5008 if (querying || closed) return; 5009 accumMuts = {}; 5010 var subscr = {}; 5011 var ret = execute(subscr); 5012 if (!startedListening) { 5013 globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, mutationListener); 5014 startedListening = true; 5015 } 5016 querying = true; 5017 Promise.resolve(ret).then(function (result) { 5018 querying = false; 5019 if (closed) return; 5020 if (shouldNotify()) { 5021 doQuery(); 5022 } else { 5023 accumMuts = {}; 5024 currentObs = subscr; 5025 observer.next && observer.next(result); 5026 } 5027 }, function (err) { 5028 querying = false;
5029 observer.error && observer.error(err); 5030 subscription.unsubscribe(); 5031 }); 5032 }; 5033 doQuery(); 5034 return subscription; 5035 }); 5036 } 5037 var domDeps; 5038 try { 5039 domDeps = { 5040 indexedDB: _global.indexedDB || _global.mozIndexedDB || _global.webkitIndexedDB || _global.msIndexedDB, 5041 IDBKeyRange: _global.IDBKeyRange || _global.webkitIDBKeyRange 5042 }; 5043 } catch (e) { 5044 domDeps = { 5045 indexedDB: null, 5046 IDBKeyRange: null 5047 }; 5048 } 5049 var Dexie = Dexie$1; 5050 props(Dexie, _assign(_assign({}, fullNameExceptions), { 5051 "delete": function _delete(databaseName) { 5052 var db = new Dexie(databaseName, { 5053 addons: [] 5054 }); 5055 return db["delete"](); 5056 }, 5057 exists: function exists(name) { 5058 return new Dexie(name, { 5059 addons: [] 5060 }).open().then(function (db) { 5061 db.close(); 5062 return true; 5063 })["catch"]('NoSuchDatabaseError', function () { 5064 return false; 5065 }); 5066 }, 5067 getDatabaseNames: function getDatabaseNames(cb) { 5068 try { 5069 return _getDatabaseNames(Dexie.dependencies).then(cb); 5070 } catch (_a) { 5071 return rejection(new exceptions.MissingAPI()); 5072 } 5073 }, 5074 defineClass: function defineClass() { 5075 function Class(content) { 5076 extend(this, content); 5077 } 5078 return Class; 5079 }, 5080 ignoreTransaction: function ignoreTransaction(scopeFunc) { 5081 return PSD.trans ? usePSD(PSD.transless, scopeFunc) : scopeFunc(); 5082 }, 5083 vip: vip, 5084 async: function async(generatorFn) { 5085 return function () { 5086 try { 5087 var rv = awaitIterator(generatorFn.apply(this, arguments)); 5088 if (!rv || typeof rv.then !== 'function') return DexiePromise.resolve(rv); 5089 return rv; 5090 } catch (e) { 5091 return rejection(e); 5092 } 5093 }; 5094 }, 5095 spawn: function spawn(generatorFn, args, thiz) { 5096 try { 5097 var rv = awaitIterator(generatorFn.apply(thiz, args || [])); 5098 if (!rv || typeof rv.then !== 'function') return DexiePromise.resolve(rv); 5099 return rv; 5100 } catch (e) { 5101 return rejection(e); 5102 } 5103 }, 5104 currentTransaction: { 5105 get: function get() { 5106 return PSD.trans || null; 5107 } 5108 }, 5109 waitFor: function waitFor(promiseOrFunction, optionalTimeout) { 5110 var promise = DexiePromise.resolve(typeof promiseOrFunction === 'function' ? Dexie.ignoreTransaction(promiseOrFunction) : promiseOrFunction).timeout(optionalTimeout || 60000); 5111 return PSD.trans ? PSD.trans.waitFor(promise) : promise; 5112 }, 5113 Promise: DexiePromise, 5114 debug: { 5115 get: function get() { 5116 return debug; 5117 }, 5118 set: function set(value) { 5119 setDebug(value, value === 'dexie' ? function () { 5120 return true; 5121 } : dexieStackFrameFilter); 5122 } 5123 }, 5124 derive: derive, 5125 extend: extend, 5126 props: props, 5127 override: override, 5128 Events: Events, 5129 on: globalEvents, 5130 liveQuery: liveQuery, 5131 extendObservabilitySet: extendObservabilitySet, 5132 getByKeyPath: getByKeyPath, 5133 setByKeyPath: setByKeyPath, 5134 delByKeyPath: delByKeyPath, 5135 shallowClone: shallowClone, 5136 deepClone: deepClone, 5137 getObjectDiff: getObjectDiff, 5138 cmp: cmp, 5139 asap: asap$1, 5140 minKey: minKey, 5141 addons: [], 5142 connections: connections, 5143 errnames: errnames, 5144 dependencies: domDeps, 5145 semVer: DEXIE_VERSION, 5146 version: DEXIE_VERSION.split('.').map(function (n) { 5147 return parseInt(n); 5148 }).reduce(function (p, c, i) { 5149 return p + c / Math.pow(10, i * 2); 5150 }) 5151 })); 5152 Dexie.maxKey = _getMaxKey(Dexie.dependencies.IDBKeyRange); 5153 if (typeof dispatchEvent !== 'undefined' && typeof addEventListener !== 'undefined') { 5154 globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, function (updatedParts) { 5155 if (!propagatingLocally) { 5156 var event_1; 5157 if (isIEOrEdge) { 5158 event_1 = document.createEvent('CustomEvent'); 5159 event_1.initCustomEvent(STORAGE_MUTATED_DOM_EVENT_NAME, true, true, updatedParts); 5160 } else { 5161 event_1 = new CustomEvent(STORAGE_MUTATED_DOM_EVENT_NAME, { 5162 detail: updatedParts 5163 }); 5164 } 5165 propagatingLocally = true; 5166 dispatchEvent(event_1); 5167 propagatingLocally = false;
5168 } 5169 }); 5170 addEventListener(STORAGE_MUTATED_DOM_EVENT_NAME, function (_a) { 5171 var detail = _a.detail; 5172 if (!propagatingLocally) { 5173 propagateLocally(detail); 5174 } 5175 }); 5176 } 5177 function propagateLocally(updateParts) { 5178 var wasMe = propagatingLocally; 5179 try { 5180 propagatingLocally = true; 5181 globalEvents.storagemutated.fire(updateParts); 5182 } finally { 5183 propagatingLocally = wasMe; 5184 } 5185 } 5186 var propagatingLocally = false; 5187 if (typeof BroadcastChannel !== 'undefined') { 5188 var bc_1 = new BroadcastChannel(STORAGE_MUTATED_DOM_EVENT_NAME); 5189 globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, function (changedParts) { 5190 if (!propagatingLocally) { 5191 bc_1.postMessage(changedParts); 5192 } 5193 }); 5194 bc_1.onmessage = function (ev) { 5195 if (ev.data) propagateLocally(ev.data); 5196 }; 5197 } else if (typeof self !== 'undefined' && typeof navigator !== 'undefined') { 5198 globalEvents(DEXIE_STORAGE_MUTATED_EVENT_NAME, function (changedParts) { 5199 try { 5200 if (!propagatingLocally) { 5201 if (typeof localStorage !== 'undefined') { 5202 localStorage.setItem(STORAGE_MUTATED_DOM_EVENT_NAME, JSON.stringify({ 5203 trig: Math.random(), 5204 changedParts: changedParts 5205 })); 5206 } 5207 if (babelHelpers["typeof"](self['clients']) === 'object') { 5208 __spreadArray([], self['clients'].matchAll({ 5209 includeUncontrolled: true 5210 }), true).forEach(function (client) { 5211 return client.postMessage({ 5212 type: STORAGE_MUTATED_DOM_EVENT_NAME, 5213 changedParts: changedParts 5214 }); 5215 }); 5216 } 5217 } 5218 } catch (_a) {} 5219 }); 5220 if (typeof addEventListener !== 'undefined') { 5221 addEventListener('storage', function (ev) { 5222 if (ev.key === STORAGE_MUTATED_DOM_EVENT_NAME) { 5223 var data = JSON.parse(ev.newValue); 5224 if (data) propagateLocally(data.changedParts); 5225 } 5226 }); 5227 } 5228 var swContainer = self.document && navigator.serviceWorker; 5229 if (swContainer) { 5230 swContainer.addEventListener('message', propagateMessageLocally); 5231 } 5232 } 5233 function propagateMessageLocally(_a) { 5234 var data = _a.data; 5235 if (data && data.type === STORAGE_MUTATED_DOM_EVENT_NAME) { 5236 propagateLocally(data.changedParts); 5237 } 5238 } 5239 DexiePromise.rejectionMapper = mapError; 5240 setDebug(debug, dexieStackFrameFilter); 5241 5242 // backward compatibility with Dexie 2 usages 5243 window.BX.Dexie = Dexie$1; 5244 5245 exports.Dexie = Dexie$1; 5246 exports.liveQuery = liveQuery; 5247 exports.RangeSet = RangeSet; 5248 exports.mergeRanges = mergeRanges; 5249 exports.rangesOverlap = rangesOverlap; 5250 5251}((this.BX.Dexie3 = this.BX.Dexie3 || {}))); 5252//# sourceMappingURL=dexie3.bundle.js.map
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.