Socket
Socket
Sign inDemoInstall

localforage

Package Overview
Dependencies
Maintainers
1
Versions
62
Alerts
File Explorer

Advanced tools

Socket logo

Install Socket

Detect and block malicious and high-risk dependencies

Install

localforage - npm Package Compare versions

Comparing version 1.5.7 to 1.6.0

.prettierrc

2

bower.json

@@ -28,3 +28,3 @@ {

},
"version": "1.5.7"
"version": "1.6.0"
}

@@ -6,2 +6,23 @@ # About this CHANGELOG

### [1.6](https://github.com/mozilla/localForage/releases/tag/1.6.0)
* Add `dropInstance()` method to localforage.
* Improve IDB driver reliability when a connection gets closed.
### [1.5.7]
* Fix IE8 localStorage support detection.
### [1.5.6]
* Upgrade lie to 3.1.1 to work with yarn.
### [1.5.5]
* Roll back dropInstance breaking change.
### [1.5.4]
* Set `null` as `undefined` (for Edge).
### [1.5.3]

@@ -8,0 +29,0 @@

{
"name": "localforage",
"version": "1.5.7",
"version": "1.6.0",
"dependencies": {

@@ -5,0 +5,0 @@ "then/promise": "5.0.0"

/*!
localForage -- Offline Storage, Improved
Version 1.5.7
Version 1.6.0
https://localforage.github.io/localForage
(c) 2013-2017 Mozilla, Apache License 2.0
*/
!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;b="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,b.localforage=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c||a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){(function(a){"use strict";function c(){k=!0;for(var a,b,c=l.length;c;){for(b=l,l=[],a=-1;++a<c;)b[a]();c=l.length}k=!1}function d(a){1!==l.push(a)||k||e()}var e,f=a.MutationObserver||a.WebKitMutationObserver;if(f){var g=0,h=new f(c),i=a.document.createTextNode("");h.observe(i,{characterData:!0}),e=function(){i.data=g=++g%2}}else if(a.setImmediate||void 0===a.MessageChannel)e="document"in a&&"onreadystatechange"in a.document.createElement("script")?function(){var b=a.document.createElement("script");b.onreadystatechange=function(){c(),b.onreadystatechange=null,b.parentNode.removeChild(b),b=null},a.document.documentElement.appendChild(b)}:function(){setTimeout(c,0)};else{var j=new a.MessageChannel;j.port1.onmessage=c,e=function(){j.port2.postMessage(0)}}var k,l=[];b.exports=d}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],2:[function(a,b,c){"use strict";function d(){}function e(a){if("function"!=typeof a)throw new TypeError("resolver must be a function");this.state=s,this.queue=[],this.outcome=void 0,a!==d&&i(this,a)}function f(a,b,c){this.promise=a,"function"==typeof b&&(this.onFulfilled=b,this.callFulfilled=this.otherCallFulfilled),"function"==typeof c&&(this.onRejected=c,this.callRejected=this.otherCallRejected)}function g(a,b,c){o(function(){var d;try{d=b(c)}catch(b){return p.reject(a,b)}d===a?p.reject(a,new TypeError("Cannot resolve promise with itself")):p.resolve(a,d)})}function h(a){var b=a&&a.then;if(a&&("object"==typeof a||"function"==typeof a)&&"function"==typeof b)return function(){b.apply(a,arguments)}}function i(a,b){function c(b){f||(f=!0,p.reject(a,b))}function d(b){f||(f=!0,p.resolve(a,b))}function e(){b(d,c)}var f=!1,g=j(e);"error"===g.status&&c(g.value)}function j(a,b){var c={};try{c.value=a(b),c.status="success"}catch(a){c.status="error",c.value=a}return c}function k(a){return a instanceof this?a:p.resolve(new this(d),a)}function l(a){var b=new this(d);return p.reject(b,a)}function m(a){function b(a,b){function d(a){g[b]=a,++h!==e||f||(f=!0,p.resolve(j,g))}c.resolve(a).then(d,function(a){f||(f=!0,p.reject(j,a))})}var c=this;if("[object Array]"!==Object.prototype.toString.call(a))return this.reject(new TypeError("must be an array"));var e=a.length,f=!1;if(!e)return this.resolve([]);for(var g=new Array(e),h=0,i=-1,j=new this(d);++i<e;)b(a[i],i);return j}function n(a){function b(a){c.resolve(a).then(function(a){f||(f=!0,p.resolve(h,a))},function(a){f||(f=!0,p.reject(h,a))})}var c=this;if("[object Array]"!==Object.prototype.toString.call(a))return this.reject(new TypeError("must be an array"));var e=a.length,f=!1;if(!e)return this.resolve([]);for(var g=-1,h=new this(d);++g<e;)b(a[g]);return h}var o=a(1),p={},q=["REJECTED"],r=["FULFILLED"],s=["PENDING"];b.exports=e,e.prototype.catch=function(a){return this.then(null,a)},e.prototype.then=function(a,b){if("function"!=typeof a&&this.state===r||"function"!=typeof b&&this.state===q)return this;var c=new this.constructor(d);if(this.state!==s){g(c,this.state===r?a:b,this.outcome)}else this.queue.push(new f(c,a,b));return c},f.prototype.callFulfilled=function(a){p.resolve(this.promise,a)},f.prototype.otherCallFulfilled=function(a){g(this.promise,this.onFulfilled,a)},f.prototype.callRejected=function(a){p.reject(this.promise,a)},f.prototype.otherCallRejected=function(a){g(this.promise,this.onRejected,a)},p.resolve=function(a,b){var c=j(h,b);if("error"===c.status)return p.reject(a,c.value);var d=c.value;if(d)i(a,d);else{a.state=r,a.outcome=b;for(var e=-1,f=a.queue.length;++e<f;)a.queue[e].callFulfilled(b)}return a},p.reject=function(a,b){a.state=q,a.outcome=b;for(var c=-1,d=a.queue.length;++c<d;)a.queue[c].callRejected(b);return a},e.resolve=k,e.reject=l,e.all=m,e.race=n},{1:1}],3:[function(a,b,c){(function(b){"use strict";"function"!=typeof b.Promise&&(b.Promise=a(2))}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{2:2}],4:[function(a,b,c){"use strict";function d(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function e(){try{if("undefined"!=typeof indexedDB)return indexedDB;if("undefined"!=typeof webkitIndexedDB)return webkitIndexedDB;if("undefined"!=typeof mozIndexedDB)return mozIndexedDB;if("undefined"!=typeof OIndexedDB)return OIndexedDB;if("undefined"!=typeof msIndexedDB)return msIndexedDB}catch(a){return}}function f(){try{if(!la)return!1;var a="undefined"!=typeof openDatabase&&/(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent)&&!/Chrome/.test(navigator.userAgent)&&!/BlackBerry/.test(navigator.platform),b="function"==typeof fetch&&-1!==fetch.toString().indexOf("[native code");return(!a||b)&&"undefined"!=typeof indexedDB&&"undefined"!=typeof IDBKeyRange}catch(a){return!1}}function g(a,b){a=a||[],b=b||{};try{return new Blob(a,b)}catch(f){if("TypeError"!==f.name)throw f;for(var c="undefined"!=typeof BlobBuilder?BlobBuilder:"undefined"!=typeof MSBlobBuilder?MSBlobBuilder:"undefined"!=typeof MozBlobBuilder?MozBlobBuilder:WebKitBlobBuilder,d=new c,e=0;e<a.length;e+=1)d.append(a[e]);return d.getBlob(b.type)}}function h(a,b){b&&a.then(function(a){b(null,a)},function(a){b(a)})}function i(a,b,c){"function"==typeof b&&a.then(b),"function"==typeof c&&a.catch(c)}function j(a){return"string"!=typeof a&&(console.warn(a+" used as a key, but it is not a string."),a=String(a)),a}function k(a){for(var b=a.length,c=new ArrayBuffer(b),d=new Uint8Array(c),e=0;e<b;e++)d[e]=a.charCodeAt(e);return c}function l(a){return new oa(function(b){var c=a.transaction(pa,sa),d=g([""]);c.objectStore(pa).put(d,"key"),c.onabort=function(a){a.preventDefault(),a.stopPropagation(),b(!1)},c.oncomplete=function(){var a=navigator.userAgent.match(/Chrome\/(\d+)/),c=navigator.userAgent.match(/Edge\//);b(c||!a||parseInt(a[1],10)>=43)}}).catch(function(){return!1})}function m(a){return"boolean"==typeof ma?oa.resolve(ma):l(a).then(function(a){return ma=a})}function n(a){var b=na[a.name],c={};c.promise=new oa(function(a){c.resolve=a}),b.deferredOperations.push(c),b.dbReady?b.dbReady=b.dbReady.then(function(){return c.promise}):b.dbReady=c.promise}function o(a){var b=na[a.name],c=b.deferredOperations.pop();c&&c.resolve()}function p(a,b){var c=na[a.name],d=c.deferredOperations.pop();d&&d.reject(b)}function q(a,b){return new oa(function(c,d){if(a.db){if(!b)return c(a.db);n(a),a.db.close()}var e=[a.name];b&&e.push(a.version);var f=la.open.apply(la,e);b&&(f.onupgradeneeded=function(b){var c=f.result;try{c.createObjectStore(a.storeName),b.oldVersion<=1&&c.createObjectStore(pa)}catch(c){if("ConstraintError"!==c.name)throw c;console.warn('The database "'+a.name+'" has been upgraded from version '+b.oldVersion+" to version "+b.newVersion+', but the storage "'+a.storeName+'" already exists.')}}),f.onerror=function(a){a.preventDefault(),d(f.error)},f.onsuccess=function(){c(f.result),o(a)}})}function r(a){return q(a,!1)}function s(a){return q(a,!0)}function t(a,b){if(!a.db)return!0;var c=!a.db.objectStoreNames.contains(a.storeName),d=a.version<a.db.version,e=a.version>a.db.version;if(d&&(a.version!==b&&console.warn('The database "'+a.name+"\" can't be downgraded from version "+a.db.version+" to version "+a.version+"."),a.version=a.db.version),e||c){if(c){var f=a.db.version+1;f>a.version&&(a.version=f)}return!0}return!1}function u(a){return new oa(function(b,c){var d=new FileReader;d.onerror=c,d.onloadend=function(c){var d=btoa(c.target.result||"");b({__local_forage_encoded_blob:!0,data:d,type:a.type})},d.readAsBinaryString(a)})}function v(a){return g([k(atob(a.data))],{type:a.type})}function w(a){return a&&a.__local_forage_encoded_blob}function x(a){var b=this,c=b._initReady().then(function(){var a=na[b._dbInfo.name];if(a&&a.dbReady)return a.dbReady});return i(c,a,a),c}function y(a){n(a);for(var b=na[a.name],c=b.forages,d=0;d<c.length;d++)c[d]._dbInfo.db&&(c[d]._dbInfo.db.close(),c[d]._dbInfo.db=null);return q(a,!1).then(function(a){for(var b=0;b<c.length;b++)c[b]._dbInfo.db=a}).catch(function(b){throw p(a,b),b})}function z(a,b,c){try{var d=a.db.transaction(a.storeName,b);c(null,d)}catch(d){if(!a.db||"InvalidStateError"===d.name)return y(a).then(function(){var d=a.db.transaction(a.storeName,b);c(null,d)});c(d)}}function A(a){function b(){return oa.resolve()}var c=this,d={db:null};if(a)for(var e in a)d[e]=a[e];na||(na={});var f=na[d.name];f||(f={forages:[],db:null,dbReady:null,deferredOperations:[]},na[d.name]=f),f.forages.push(c),c._initReady||(c._initReady=c.ready,c.ready=x);for(var g=[],h=0;h<f.forages.length;h++){var i=f.forages[h];i!==c&&g.push(i._initReady().catch(b))}var j=f.forages.slice(0);return oa.all(g).then(function(){return d.db=f.db,r(d)}).then(function(a){return d.db=a,t(d,c._defaultConfig.version)?s(d):a}).then(function(a){d.db=f.db=a,c._dbInfo=d;for(var b=0;b<j.length;b++){var e=j[b];e!==c&&(e._dbInfo.db=d.db,e._dbInfo.version=d.version)}})}function B(a,b){var c=this;a=j(a);var d=new oa(function(b,d){c.ready().then(function(){z(c._dbInfo,ra,function(e,f){if(e)return d(e);try{var g=f.objectStore(c._dbInfo.storeName),h=g.get(a);h.onsuccess=function(){var a=h.result;void 0===a&&(a=null),w(a)&&(a=v(a)),b(a)},h.onerror=function(){d(h.error)}}catch(a){d(a)}})}).catch(d)});return h(d,b),d}function C(a,b){var c=this,d=new oa(function(b,d){c.ready().then(function(){z(c._dbInfo,ra,function(e,f){if(e)return d(e);try{var g=f.objectStore(c._dbInfo.storeName),h=g.openCursor(),i=1;h.onsuccess=function(){var c=h.result;if(c){var d=c.value;w(d)&&(d=v(d));var e=a(d,c.key,i++);void 0!==e?b(e):c.continue()}else b()},h.onerror=function(){d(h.error)}}catch(a){d(a)}})}).catch(d)});return h(d,b),d}function D(a,b,c){var d=this;a=j(a);var e=new oa(function(c,e){var f;d.ready().then(function(){return f=d._dbInfo,"[object Blob]"===qa.call(b)?m(f.db).then(function(a){return a?b:u(b)}):b}).then(function(b){z(d._dbInfo,sa,function(f,g){if(f)return e(f);try{var h=g.objectStore(d._dbInfo.storeName);null===b&&(b=void 0);var i=h.put(b,a);g.oncomplete=function(){void 0===b&&(b=null),c(b)},g.onabort=g.onerror=function(){var a=i.error?i.error:i.transaction.error;e(a)}}catch(a){e(a)}})}).catch(e)});return h(e,c),e}function E(a,b){var c=this;a=j(a);var d=new oa(function(b,d){c.ready().then(function(){z(c._dbInfo,sa,function(e,f){if(e)return d(e);try{var g=f.objectStore(c._dbInfo.storeName),h=g.delete(a);f.oncomplete=function(){b()},f.onerror=function(){d(h.error)},f.onabort=function(){var a=h.error?h.error:h.transaction.error;d(a)}}catch(a){d(a)}})}).catch(d)});return h(d,b),d}function F(a){var b=this,c=new oa(function(a,c){b.ready().then(function(){z(b._dbInfo,sa,function(d,e){if(d)return c(d);try{var f=e.objectStore(b._dbInfo.storeName),g=f.clear();e.oncomplete=function(){a()},e.onabort=e.onerror=function(){var a=g.error?g.error:g.transaction.error;c(a)}}catch(a){c(a)}})}).catch(c)});return h(c,a),c}function G(a){var b=this,c=new oa(function(a,c){b.ready().then(function(){z(b._dbInfo,ra,function(d,e){if(d)return c(d);try{var f=e.objectStore(b._dbInfo.storeName),g=f.count();g.onsuccess=function(){a(g.result)},g.onerror=function(){c(g.error)}}catch(a){c(a)}})}).catch(c)});return h(c,a),c}function H(a,b){var c=this,d=new oa(function(b,d){if(a<0)return void b(null);c.ready().then(function(){z(c._dbInfo,ra,function(e,f){if(e)return d(e);try{var g=f.objectStore(c._dbInfo.storeName),h=!1,i=g.openCursor();i.onsuccess=function(){var c=i.result;if(!c)return void b(null);0===a?b(c.key):h?b(c.key):(h=!0,c.advance(a))},i.onerror=function(){d(i.error)}}catch(a){d(a)}})}).catch(d)});return h(d,b),d}function I(a){var b=this,c=new oa(function(a,c){b.ready().then(function(){z(b._dbInfo,ra,function(d,e){if(d)return c(d);try{var f=e.objectStore(b._dbInfo.storeName),g=f.openCursor(),h=[];g.onsuccess=function(){var b=g.result;if(!b)return void a(h);h.push(b.key),b.continue()},g.onerror=function(){c(g.error)}}catch(a){c(a)}})}).catch(c)});return h(c,a),c}function J(){return"function"==typeof openDatabase}function K(a){var b,c,d,e,f,g=.75*a.length,h=a.length,i=0;"="===a[a.length-1]&&(g--,"="===a[a.length-2]&&g--);var j=new ArrayBuffer(g),k=new Uint8Array(j);for(b=0;b<h;b+=4)c=ua.indexOf(a[b]),d=ua.indexOf(a[b+1]),e=ua.indexOf(a[b+2]),f=ua.indexOf(a[b+3]),k[i++]=c<<2|d>>4,k[i++]=(15&d)<<4|e>>2,k[i++]=(3&e)<<6|63&f;return j}function L(a){var b,c=new Uint8Array(a),d="";for(b=0;b<c.length;b+=3)d+=ua[c[b]>>2],d+=ua[(3&c[b])<<4|c[b+1]>>4],d+=ua[(15&c[b+1])<<2|c[b+2]>>6],d+=ua[63&c[b+2]];return c.length%3==2?d=d.substring(0,d.length-1)+"=":c.length%3==1&&(d=d.substring(0,d.length-2)+"=="),d}function M(a,b){var c="";if(a&&(c=La.call(a)),a&&("[object ArrayBuffer]"===c||a.buffer&&"[object ArrayBuffer]"===La.call(a.buffer))){var d,e=xa;a instanceof ArrayBuffer?(d=a,e+=za):(d=a.buffer,"[object Int8Array]"===c?e+=Ba:"[object Uint8Array]"===c?e+=Ca:"[object Uint8ClampedArray]"===c?e+=Da:"[object Int16Array]"===c?e+=Ea:"[object Uint16Array]"===c?e+=Ga:"[object Int32Array]"===c?e+=Fa:"[object Uint32Array]"===c?e+=Ha:"[object Float32Array]"===c?e+=Ia:"[object Float64Array]"===c?e+=Ja:b(new Error("Failed to get type for BinaryArray"))),b(e+L(d))}else if("[object Blob]"===c){var f=new FileReader;f.onload=function(){var c=va+a.type+"~"+L(this.result);b(xa+Aa+c)},f.readAsArrayBuffer(a)}else try{b(JSON.stringify(a))}catch(c){console.error("Couldn't convert value into a JSON string: ",a),b(null,c)}}function N(a){if(a.substring(0,ya)!==xa)return JSON.parse(a);var b,c=a.substring(Ka),d=a.substring(ya,Ka);if(d===Aa&&wa.test(c)){var e=c.match(wa);b=e[1],c=c.substring(e[0].length)}var f=K(c);switch(d){case za:return f;case Aa:return g([f],{type:b});case Ba:return new Int8Array(f);case Ca:return new Uint8Array(f);case Da:return new Uint8ClampedArray(f);case Ea:return new Int16Array(f);case Ga:return new Uint16Array(f);case Fa:return new Int32Array(f);case Ha:return new Uint32Array(f);case Ia:return new Float32Array(f);case Ja:return new Float64Array(f);default:throw new Error("Unkown type: "+d)}}function O(a){var b=this,c={db:null};if(a)for(var d in a)c[d]="string"!=typeof a[d]?a[d].toString():a[d];var e=new oa(function(a,d){try{c.db=openDatabase(c.name,String(c.version),c.description,c.size)}catch(a){return d(a)}c.db.transaction(function(e){e.executeSql("CREATE TABLE IF NOT EXISTS "+c.storeName+" (id INTEGER PRIMARY KEY, key unique, value)",[],function(){b._dbInfo=c,a()},function(a,b){d(b)})})});return c.serializer=Ma,e}function P(a,b){var c=this;a=j(a);var d=new oa(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){c.executeSql("SELECT * FROM "+e.storeName+" WHERE key = ? LIMIT 1",[a],function(a,c){var d=c.rows.length?c.rows.item(0).value:null;d&&(d=e.serializer.deserialize(d)),b(d)},function(a,b){d(b)})})}).catch(d)});return h(d,b),d}function Q(a,b){var c=this,d=new oa(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){c.executeSql("SELECT * FROM "+e.storeName,[],function(c,d){for(var f=d.rows,g=f.length,h=0;h<g;h++){var i=f.item(h),j=i.value;if(j&&(j=e.serializer.deserialize(j)),void 0!==(j=a(j,i.key,h+1)))return void b(j)}b()},function(a,b){d(b)})})}).catch(d)});return h(d,b),d}function R(a,b,c,d){var e=this;a=j(a);var f=new oa(function(f,g){e.ready().then(function(){void 0===b&&(b=null);var h=b,i=e._dbInfo;i.serializer.serialize(b,function(b,j){j?g(j):i.db.transaction(function(c){c.executeSql("INSERT OR REPLACE INTO "+i.storeName+" (key, value) VALUES (?, ?)",[a,b],function(){f(h)},function(a,b){g(b)})},function(b){if(b.code===b.QUOTA_ERR){if(d>0)return void f(R.apply(e,[a,h,c,d-1]));g(b)}})})}).catch(g)});return h(f,c),f}function S(a,b,c){return R.apply(this,[a,b,c,1])}function T(a,b){var c=this;a=j(a);var d=new oa(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){c.executeSql("DELETE FROM "+e.storeName+" WHERE key = ?",[a],function(){b()},function(a,b){d(b)})})}).catch(d)});return h(d,b),d}function U(a){var b=this,c=new oa(function(a,c){b.ready().then(function(){var d=b._dbInfo;d.db.transaction(function(b){b.executeSql("DELETE FROM "+d.storeName,[],function(){a()},function(a,b){c(b)})})}).catch(c)});return h(c,a),c}function V(a){var b=this,c=new oa(function(a,c){b.ready().then(function(){var d=b._dbInfo;d.db.transaction(function(b){b.executeSql("SELECT COUNT(key) as c FROM "+d.storeName,[],function(b,c){var d=c.rows.item(0).c;a(d)},function(a,b){c(b)})})}).catch(c)});return h(c,a),c}function W(a,b){var c=this,d=new oa(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){c.executeSql("SELECT key FROM "+e.storeName+" WHERE id = ? LIMIT 1",[a+1],function(a,c){var d=c.rows.length?c.rows.item(0).key:null;b(d)},function(a,b){d(b)})})}).catch(d)});return h(d,b),d}function X(a){var b=this,c=new oa(function(a,c){b.ready().then(function(){var d=b._dbInfo;d.db.transaction(function(b){b.executeSql("SELECT key FROM "+d.storeName,[],function(b,c){for(var d=[],e=0;e<c.rows.length;e++)d.push(c.rows.item(e).key);a(d)},function(a,b){c(b)})})}).catch(c)});return h(c,a),c}function Y(){try{return"undefined"!=typeof localStorage&&"setItem"in localStorage&&!!localStorage.setItem}catch(a){return!1}}function Z(){var a="_localforage_support_test";try{return localStorage.setItem(a,!0),localStorage.removeItem(a),!1}catch(a){return!0}}function $(){return!Z()||localStorage.length>0}function _(a){var b=this,c={};if(a)for(var d in a)c[d]=a[d];return c.keyPrefix=c.name+"/",c.storeName!==b._defaultConfig.storeName&&(c.keyPrefix+=c.storeName+"/"),$()?(b._dbInfo=c,c.serializer=Ma,oa.resolve()):oa.reject()}function aa(a){var b=this,c=b.ready().then(function(){for(var a=b._dbInfo.keyPrefix,c=localStorage.length-1;c>=0;c--){var d=localStorage.key(c);0===d.indexOf(a)&&localStorage.removeItem(d)}});return h(c,a),c}function ba(a,b){var c=this;a=j(a);var d=c.ready().then(function(){var b=c._dbInfo,d=localStorage.getItem(b.keyPrefix+a);return d&&(d=b.serializer.deserialize(d)),d});return h(d,b),d}function ca(a,b){var c=this,d=c.ready().then(function(){for(var b=c._dbInfo,d=b.keyPrefix,e=d.length,f=localStorage.length,g=1,h=0;h<f;h++){var i=localStorage.key(h);if(0===i.indexOf(d)){var j=localStorage.getItem(i);if(j&&(j=b.serializer.deserialize(j)),void 0!==(j=a(j,i.substring(e),g++)))return j}}});return h(d,b),d}function da(a,b){var c=this,d=c.ready().then(function(){var b,d=c._dbInfo;try{b=localStorage.key(a)}catch(a){b=null}return b&&(b=b.substring(d.keyPrefix.length)),b});return h(d,b),d}function ea(a){var b=this,c=b.ready().then(function(){for(var a=b._dbInfo,c=localStorage.length,d=[],e=0;e<c;e++){var f=localStorage.key(e);0===f.indexOf(a.keyPrefix)&&d.push(f.substring(a.keyPrefix.length))}return d});return h(c,a),c}function fa(a){var b=this,c=b.keys().then(function(a){return a.length});return h(c,a),c}function ga(a,b){var c=this;a=j(a);var d=c.ready().then(function(){var b=c._dbInfo;localStorage.removeItem(b.keyPrefix+a)});return h(d,b),d}function ha(a,b,c){var d=this;a=j(a);var e=d.ready().then(function(){void 0===b&&(b=null);var c=b;return new oa(function(e,f){var g=d._dbInfo;g.serializer.serialize(b,function(b,d){if(d)f(d);else try{localStorage.setItem(g.keyPrefix+a,b),e(c)}catch(a){"QuotaExceededError"!==a.name&&"NS_ERROR_DOM_QUOTA_REACHED"!==a.name||f(a),f(a)}})})});return h(e,c),e}function ia(a,b){a[b]=function(){var c=arguments;return a.ready().then(function(){return a[b].apply(a,c)})}}function ja(){for(var a=1;a<arguments.length;a++){var b=arguments[a];if(b)for(var c in b)b.hasOwnProperty(c)&&(Pa(b[c])?arguments[0][c]=b[c].slice():arguments[0][c]=b[c])}return arguments[0]}var ka="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},la=e();"undefined"==typeof Promise&&a(3);var ma,na,oa=Promise,pa="local-forage-detect-blob-support",qa=Object.prototype.toString,ra="readonly",sa="readwrite",ta={_driver:"asyncStorage",_initStorage:A,_support:f(),iterate:C,getItem:B,setItem:D,removeItem:E,clear:F,length:G,key:H,keys:I},ua="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",va="~~local_forage_type~",wa=/^~~local_forage_type~([^~]+)~/,xa="__lfsc__:",ya=xa.length,za="arbf",Aa="blob",Ba="si08",Ca="ui08",Da="uic8",Ea="si16",Fa="si32",Ga="ur16",Ha="ui32",Ia="fl32",Ja="fl64",Ka=ya+za.length,La=Object.prototype.toString,Ma={serialize:M,deserialize:N,stringToBuffer:K,bufferToString:L},Na={_driver:"webSQLStorage",_initStorage:O,_support:J(),iterate:Q,getItem:P,setItem:S,removeItem:T,clear:U,length:V,key:W,keys:X},Oa={_driver:"localStorageWrapper",_initStorage:_,_support:Y(),iterate:ca,getItem:ba,setItem:ha,removeItem:ga,clear:aa,length:fa,key:da,keys:ea},Pa=Array.isArray||function(a){return"[object Array]"===Object.prototype.toString.call(a)},Qa={},Ra={},Sa={INDEXEDDB:ta,WEBSQL:Na,LOCALSTORAGE:Oa},Ta=[Sa.INDEXEDDB._driver,Sa.WEBSQL._driver,Sa.LOCALSTORAGE._driver],Ua=["clear","getItem","iterate","key","keys","length","removeItem","setItem"],Va={description:"",driver:Ta.slice(),name:"localforage",size:4980736,storeName:"keyvaluepairs",version:1},Wa=function(){function a(b){d(this,a);for(var c in Sa)if(Sa.hasOwnProperty(c)){var e=Sa[c],f=e._driver;this[c]=f,Qa[f]||this.defineDriver(e)}this._defaultConfig=ja({},Va),this._config=ja({},this._defaultConfig,b),this._driverSet=null,this._initDriver=null,this._ready=!1,this._dbInfo=null,this._wrapLibraryMethodsWithReady(),this.setDriver(this._config.driver).catch(function(){})}return a.prototype.config=function(a){if("object"===(void 0===a?"undefined":ka(a))){if(this._ready)return new Error("Can't call config() after localforage has been used.");for(var b in a){if("storeName"===b&&(a[b]=a[b].replace(/\W/g,"_")),"version"===b&&"number"!=typeof a[b])return new Error("Database version must be a number.");this._config[b]=a[b]}return!("driver"in a&&a.driver)||this.setDriver(this._config.driver)}return"string"==typeof a?this._config[a]:this._config},a.prototype.defineDriver=function(a,b,c){var d=new oa(function(b,c){try{var d=a._driver,e=new Error("Custom driver not compliant; see https://mozilla.github.io/localForage/#definedriver");if(!a._driver)return void c(e);for(var f=Ua.concat("_initStorage"),g=0,h=f.length;g<h;g++){var i=f[g];if(!i||!a[i]||"function"!=typeof a[i])return void c(e)}var j=function(c){Qa[d]&&console.info("Redefining LocalForage driver: "+d),Qa[d]=a,Ra[d]=c,b()};"_support"in a?a._support&&"function"==typeof a._support?a._support().then(j,c):j(!!a._support):j(!0)}catch(a){c(a)}});return i(d,b,c),d},a.prototype.driver=function(){return this._driver||null},a.prototype.getDriver=function(a,b,c){var d=Qa[a]?oa.resolve(Qa[a]):oa.reject(new Error("Driver not found."));return i(d,b,c),d},a.prototype.getSerializer=function(a){var b=oa.resolve(Ma);return i(b,a),b},a.prototype.ready=function(a){var b=this,c=b._driverSet.then(function(){return null===b._ready&&(b._ready=b._initDriver()),b._ready});return i(c,a,a),c},a.prototype.setDriver=function(a,b,c){function d(){g._config.driver=g.driver()}function e(a){return g._extend(a),d(),g._ready=g._initStorage(g._config),g._ready}function f(a){return function(){function b(){for(;c<a.length;){var f=a[c];return c++,g._dbInfo=null,g._ready=null,g.getDriver(f).then(e).catch(b)}d();var h=new Error("No available storage method found.");return g._driverSet=oa.reject(h),g._driverSet}var c=0;return b()}}var g=this;Pa(a)||(a=[a]);var h=this._getSupportedDrivers(a),j=null!==this._driverSet?this._driverSet.catch(function(){return oa.resolve()}):oa.resolve();return this._driverSet=j.then(function(){var a=h[0];return g._dbInfo=null,g._ready=null,g.getDriver(a).then(function(a){g._driver=a._driver,d(),g._wrapLibraryMethodsWithReady(),g._initDriver=f(h)})}).catch(function(){d();var a=new Error("No available storage method found.");return g._driverSet=oa.reject(a),g._driverSet}),i(this._driverSet,b,c),this._driverSet},a.prototype.supports=function(a){return!!Ra[a]},a.prototype._extend=function(a){ja(this,a)},a.prototype._getSupportedDrivers=function(a){for(var b=[],c=0,d=a.length;c<d;c++){var e=a[c];this.supports(e)&&b.push(e)}return b},a.prototype._wrapLibraryMethodsWithReady=function(){for(var a=0,b=Ua.length;a<b;a++)ia(this,Ua[a])},a.prototype.createInstance=function(b){return new a(b)},a}(),Xa=new Wa;b.exports=Xa},{3:3}]},{},[4])(4)});
!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;b="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,b.localforage=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c||a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){(function(a){"use strict";function c(){k=!0;for(var a,b,c=l.length;c;){for(b=l,l=[],a=-1;++a<c;)b[a]();c=l.length}k=!1}function d(a){1!==l.push(a)||k||e()}var e,f=a.MutationObserver||a.WebKitMutationObserver;if(f){var g=0,h=new f(c),i=a.document.createTextNode("");h.observe(i,{characterData:!0}),e=function(){i.data=g=++g%2}}else if(a.setImmediate||void 0===a.MessageChannel)e="document"in a&&"onreadystatechange"in a.document.createElement("script")?function(){var b=a.document.createElement("script");b.onreadystatechange=function(){c(),b.onreadystatechange=null,b.parentNode.removeChild(b),b=null},a.document.documentElement.appendChild(b)}:function(){setTimeout(c,0)};else{var j=new a.MessageChannel;j.port1.onmessage=c,e=function(){j.port2.postMessage(0)}}var k,l=[];b.exports=d}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],2:[function(a,b,c){"use strict";function d(){}function e(a){if("function"!=typeof a)throw new TypeError("resolver must be a function");this.state=s,this.queue=[],this.outcome=void 0,a!==d&&i(this,a)}function f(a,b,c){this.promise=a,"function"==typeof b&&(this.onFulfilled=b,this.callFulfilled=this.otherCallFulfilled),"function"==typeof c&&(this.onRejected=c,this.callRejected=this.otherCallRejected)}function g(a,b,c){o(function(){var d;try{d=b(c)}catch(b){return p.reject(a,b)}d===a?p.reject(a,new TypeError("Cannot resolve promise with itself")):p.resolve(a,d)})}function h(a){var b=a&&a.then;if(a&&("object"==typeof a||"function"==typeof a)&&"function"==typeof b)return function(){b.apply(a,arguments)}}function i(a,b){function c(b){f||(f=!0,p.reject(a,b))}function d(b){f||(f=!0,p.resolve(a,b))}function e(){b(d,c)}var f=!1,g=j(e);"error"===g.status&&c(g.value)}function j(a,b){var c={};try{c.value=a(b),c.status="success"}catch(a){c.status="error",c.value=a}return c}function k(a){return a instanceof this?a:p.resolve(new this(d),a)}function l(a){var b=new this(d);return p.reject(b,a)}function m(a){function b(a,b){function d(a){g[b]=a,++h!==e||f||(f=!0,p.resolve(j,g))}c.resolve(a).then(d,function(a){f||(f=!0,p.reject(j,a))})}var c=this;if("[object Array]"!==Object.prototype.toString.call(a))return this.reject(new TypeError("must be an array"));var e=a.length,f=!1;if(!e)return this.resolve([]);for(var g=new Array(e),h=0,i=-1,j=new this(d);++i<e;)b(a[i],i);return j}function n(a){function b(a){c.resolve(a).then(function(a){f||(f=!0,p.resolve(h,a))},function(a){f||(f=!0,p.reject(h,a))})}var c=this;if("[object Array]"!==Object.prototype.toString.call(a))return this.reject(new TypeError("must be an array"));var e=a.length,f=!1;if(!e)return this.resolve([]);for(var g=-1,h=new this(d);++g<e;)b(a[g]);return h}var o=a(1),p={},q=["REJECTED"],r=["FULFILLED"],s=["PENDING"];b.exports=e,e.prototype.catch=function(a){return this.then(null,a)},e.prototype.then=function(a,b){if("function"!=typeof a&&this.state===r||"function"!=typeof b&&this.state===q)return this;var c=new this.constructor(d);if(this.state!==s){g(c,this.state===r?a:b,this.outcome)}else this.queue.push(new f(c,a,b));return c},f.prototype.callFulfilled=function(a){p.resolve(this.promise,a)},f.prototype.otherCallFulfilled=function(a){g(this.promise,this.onFulfilled,a)},f.prototype.callRejected=function(a){p.reject(this.promise,a)},f.prototype.otherCallRejected=function(a){g(this.promise,this.onRejected,a)},p.resolve=function(a,b){var c=j(h,b);if("error"===c.status)return p.reject(a,c.value);var d=c.value;if(d)i(a,d);else{a.state=r,a.outcome=b;for(var e=-1,f=a.queue.length;++e<f;)a.queue[e].callFulfilled(b)}return a},p.reject=function(a,b){a.state=q,a.outcome=b;for(var c=-1,d=a.queue.length;++c<d;)a.queue[c].callRejected(b);return a},e.resolve=k,e.reject=l,e.all=m,e.race=n},{1:1}],3:[function(a,b,c){(function(b){"use strict";"function"!=typeof b.Promise&&(b.Promise=a(2))}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{2:2}],4:[function(a,b,c){"use strict";function d(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function e(){try{if("undefined"!=typeof indexedDB)return indexedDB;if("undefined"!=typeof webkitIndexedDB)return webkitIndexedDB;if("undefined"!=typeof mozIndexedDB)return mozIndexedDB;if("undefined"!=typeof OIndexedDB)return OIndexedDB;if("undefined"!=typeof msIndexedDB)return msIndexedDB}catch(a){return}}function f(){try{if(!ua)return!1;var a="undefined"!=typeof openDatabase&&/(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent)&&!/Chrome/.test(navigator.userAgent)&&!/BlackBerry/.test(navigator.platform),b="function"==typeof fetch&&-1!==fetch.toString().indexOf("[native code");return(!a||b)&&"undefined"!=typeof indexedDB&&"undefined"!=typeof IDBKeyRange}catch(a){return!1}}function g(a,b){a=a||[],b=b||{};try{return new Blob(a,b)}catch(f){if("TypeError"!==f.name)throw f;for(var c="undefined"!=typeof BlobBuilder?BlobBuilder:"undefined"!=typeof MSBlobBuilder?MSBlobBuilder:"undefined"!=typeof MozBlobBuilder?MozBlobBuilder:WebKitBlobBuilder,d=new c,e=0;e<a.length;e+=1)d.append(a[e]);return d.getBlob(b.type)}}function h(a,b){b&&a.then(function(a){b(null,a)},function(a){b(a)})}function i(a,b,c){"function"==typeof b&&a.then(b),"function"==typeof c&&a.catch(c)}function j(a){return"string"!=typeof a&&(console.warn(a+" used as a key, but it is not a string."),a=String(a)),a}function k(){if(arguments.length&&"function"==typeof arguments[arguments.length-1])return arguments[arguments.length-1]}function l(a){for(var b=a.length,c=new ArrayBuffer(b),d=new Uint8Array(c),e=0;e<b;e++)d[e]=a.charCodeAt(e);return c}function m(a){return new va(function(b){var c=a.transaction(wa,Ba),d=g([""]);c.objectStore(wa).put(d,"key"),c.onabort=function(a){a.preventDefault(),a.stopPropagation(),b(!1)},c.oncomplete=function(){var a=navigator.userAgent.match(/Chrome\/(\d+)/),c=navigator.userAgent.match(/Edge\//);b(c||!a||parseInt(a[1],10)>=43)}}).catch(function(){return!1})}function n(a){return"boolean"==typeof xa?va.resolve(xa):m(a).then(function(a){return xa=a})}function o(a){var b=ya[a.name],c={};c.promise=new va(function(a,b){c.resolve=a,c.reject=b}),b.deferredOperations.push(c),b.dbReady?b.dbReady=b.dbReady.then(function(){return c.promise}):b.dbReady=c.promise}function p(a){var b=ya[a.name],c=b.deferredOperations.pop();if(c)return c.resolve(),c.promise}function q(a,b){var c=ya[a.name],d=c.deferredOperations.pop();if(d)return d.reject(b),d.promise}function r(a,b){return new va(function(c,d){if(ya[a.name]=ya[a.name]||B(),a.db){if(!b)return c(a.db);o(a),a.db.close()}var e=[a.name];b&&e.push(a.version);var f=ua.open.apply(ua,e);b&&(f.onupgradeneeded=function(b){var c=f.result;try{c.createObjectStore(a.storeName),b.oldVersion<=1&&c.createObjectStore(wa)}catch(c){if("ConstraintError"!==c.name)throw c;console.warn('The database "'+a.name+'" has been upgraded from version '+b.oldVersion+" to version "+b.newVersion+', but the storage "'+a.storeName+'" already exists.')}}),f.onerror=function(a){a.preventDefault(),d(f.error)},f.onsuccess=function(){c(f.result),p(a)}})}function s(a){return r(a,!1)}function t(a){return r(a,!0)}function u(a,b){if(!a.db)return!0;var c=!a.db.objectStoreNames.contains(a.storeName),d=a.version<a.db.version,e=a.version>a.db.version;if(d&&(a.version!==b&&console.warn('The database "'+a.name+"\" can't be downgraded from version "+a.db.version+" to version "+a.version+"."),a.version=a.db.version),e||c){if(c){var f=a.db.version+1;f>a.version&&(a.version=f)}return!0}return!1}function v(a){return new va(function(b,c){var d=new FileReader;d.onerror=c,d.onloadend=function(c){var d=btoa(c.target.result||"");b({__local_forage_encoded_blob:!0,data:d,type:a.type})},d.readAsBinaryString(a)})}function w(a){return g([l(atob(a.data))],{type:a.type})}function x(a){return a&&a.__local_forage_encoded_blob}function y(a){var b=this,c=b._initReady().then(function(){var a=ya[b._dbInfo.name];if(a&&a.dbReady)return a.dbReady});return i(c,a,a),c}function z(a){o(a);for(var b=ya[a.name],c=b.forages,d=0;d<c.length;d++){var e=c[d];e._dbInfo.db&&(e._dbInfo.db.close(),e._dbInfo.db=null)}return a.db=null,s(a).then(function(b){return a.db=b,u(a)?t(a):b}).then(function(d){a.db=b.db=d;for(var e=0;e<c.length;e++)c[e]._dbInfo.db=d}).catch(function(b){throw q(a,b),b})}function A(a,b,c,d){void 0===d&&(d=1);try{var e=a.db.transaction(a.storeName,b);c(null,e)}catch(e){if(d>0&&(!a.db||"InvalidStateError"===e.name||"NotFoundError"===e.name))return va.resolve().then(function(){if(!a.db||"NotFoundError"===e.name&&!a.db.objectStoreNames.contains(a.storeName)&&a.version<=a.db.version)return a.db&&(a.version=a.db.version+1),t(a)}).then(function(){return z(a).then(function(){A(a,b,c,d-1)})}).catch(c);c(e)}}function B(){return{forages:[],db:null,dbReady:null,deferredOperations:[]}}function C(a){function b(){return va.resolve()}var c=this,d={db:null};if(a)for(var e in a)d[e]=a[e];var f=ya[d.name];f||(f=B(),ya[d.name]=f),f.forages.push(c),c._initReady||(c._initReady=c.ready,c.ready=y);for(var g=[],h=0;h<f.forages.length;h++){var i=f.forages[h];i!==c&&g.push(i._initReady().catch(b))}var j=f.forages.slice(0);return va.all(g).then(function(){return d.db=f.db,s(d)}).then(function(a){return d.db=a,u(d,c._defaultConfig.version)?t(d):a}).then(function(a){d.db=f.db=a,c._dbInfo=d;for(var b=0;b<j.length;b++){var e=j[b];e!==c&&(e._dbInfo.db=d.db,e._dbInfo.version=d.version)}})}function D(a,b){var c=this;a=j(a);var d=new va(function(b,d){c.ready().then(function(){A(c._dbInfo,Aa,function(e,f){if(e)return d(e);try{var g=f.objectStore(c._dbInfo.storeName),h=g.get(a);h.onsuccess=function(){var a=h.result;void 0===a&&(a=null),x(a)&&(a=w(a)),b(a)},h.onerror=function(){d(h.error)}}catch(a){d(a)}})}).catch(d)});return h(d,b),d}function E(a,b){var c=this,d=new va(function(b,d){c.ready().then(function(){A(c._dbInfo,Aa,function(e,f){if(e)return d(e);try{var g=f.objectStore(c._dbInfo.storeName),h=g.openCursor(),i=1;h.onsuccess=function(){var c=h.result;if(c){var d=c.value;x(d)&&(d=w(d));var e=a(d,c.key,i++);void 0!==e?b(e):c.continue()}else b()},h.onerror=function(){d(h.error)}}catch(a){d(a)}})}).catch(d)});return h(d,b),d}function F(a,b,c){var d=this;a=j(a);var e=new va(function(c,e){var f;d.ready().then(function(){return f=d._dbInfo,"[object Blob]"===za.call(b)?n(f.db).then(function(a){return a?b:v(b)}):b}).then(function(b){A(d._dbInfo,Ba,function(f,g){if(f)return e(f);try{var h=g.objectStore(d._dbInfo.storeName);null===b&&(b=void 0);var i=h.put(b,a);g.oncomplete=function(){void 0===b&&(b=null),c(b)},g.onabort=g.onerror=function(){var a=i.error?i.error:i.transaction.error;e(a)}}catch(a){e(a)}})}).catch(e)});return h(e,c),e}function G(a,b){var c=this;a=j(a);var d=new va(function(b,d){c.ready().then(function(){A(c._dbInfo,Ba,function(e,f){if(e)return d(e);try{var g=f.objectStore(c._dbInfo.storeName),h=g.delete(a);f.oncomplete=function(){b()},f.onerror=function(){d(h.error)},f.onabort=function(){var a=h.error?h.error:h.transaction.error;d(a)}}catch(a){d(a)}})}).catch(d)});return h(d,b),d}function H(a){var b=this,c=new va(function(a,c){b.ready().then(function(){A(b._dbInfo,Ba,function(d,e){if(d)return c(d);try{var f=e.objectStore(b._dbInfo.storeName),g=f.clear();e.oncomplete=function(){a()},e.onabort=e.onerror=function(){var a=g.error?g.error:g.transaction.error;c(a)}}catch(a){c(a)}})}).catch(c)});return h(c,a),c}function I(a){var b=this,c=new va(function(a,c){b.ready().then(function(){A(b._dbInfo,Aa,function(d,e){if(d)return c(d);try{var f=e.objectStore(b._dbInfo.storeName),g=f.count();g.onsuccess=function(){a(g.result)},g.onerror=function(){c(g.error)}}catch(a){c(a)}})}).catch(c)});return h(c,a),c}function J(a,b){var c=this,d=new va(function(b,d){if(a<0)return void b(null);c.ready().then(function(){A(c._dbInfo,Aa,function(e,f){if(e)return d(e);try{var g=f.objectStore(c._dbInfo.storeName),h=!1,i=g.openCursor();i.onsuccess=function(){var c=i.result;if(!c)return void b(null);0===a?b(c.key):h?b(c.key):(h=!0,c.advance(a))},i.onerror=function(){d(i.error)}}catch(a){d(a)}})}).catch(d)});return h(d,b),d}function K(a){var b=this,c=new va(function(a,c){b.ready().then(function(){A(b._dbInfo,Aa,function(d,e){if(d)return c(d);try{var f=e.objectStore(b._dbInfo.storeName),g=f.openCursor(),h=[];g.onsuccess=function(){var b=g.result;if(!b)return void a(h);h.push(b.key),b.continue()},g.onerror=function(){c(g.error)}}catch(a){c(a)}})}).catch(c)});return h(c,a),c}function L(a,b){b=k.apply(this,arguments);var c=this.config();a="function"!=typeof a&&a||{},a.name||(a.name=a.name||c.name,a.storeName=a.storeName||c.storeName);var d,e=this;if(a.name){var f=a.name===c.name&&e._dbInfo.db,g=f?va.resolve(e._dbInfo.db):s(a).then(function(b){var c=ya[a.name],d=c.forages;c.db=b;for(var e=0;e<d.length;e++)d[e]._dbInfo.db=b;return b});d=a.storeName?g.then(function(b){if(b.objectStoreNames.contains(a.storeName)){var c=b.version+1;o(a);var d=ya[a.name],e=d.forages;b.close();for(var f=0;f<e.length;f++){var g=e[f];g._dbInfo.db=null,g._dbInfo.version=c}return new va(function(b,d){var e=ua.open(a.name,c);e.onerror=function(a){e.result.close(),d(a)},e.onupgradeneeded=function(){e.result.deleteObjectStore(a.storeName)},e.onsuccess=function(){var a=e.result;a.close(),b(a)}}).then(function(a){d.db=a;for(var b=0;b<e.length;b++){var c=e[b];c._dbInfo.db=a,p(c._dbInfo)}}).catch(function(b){throw(q(a,b)||va.resolve()).catch(function(){}),b})}}):g.then(function(b){o(a);var c=ya[a.name],d=c.forages;b.close();for(var e=0;e<d.length;e++){d[e]._dbInfo.db=null}return new va(function(b,c){var d=ua.deleteDatabase(a.name);d.onerror=d.onblocked=function(a){var b=d.result;b&&b.close(),c(a)},d.onsuccess=function(){var a=d.result;a&&a.close(),b(a)}}).then(function(a){c.db=a;for(var b=0;b<d.length;b++)p(d[b]._dbInfo)}).catch(function(b){throw(q(a,b)||va.resolve()).catch(function(){}),b})})}else d=va.reject("Invalid arguments");return h(d,b),d}function M(){return"function"==typeof openDatabase}function N(a){var b,c,d,e,f,g=.75*a.length,h=a.length,i=0;"="===a[a.length-1]&&(g--,"="===a[a.length-2]&&g--);var j=new ArrayBuffer(g),k=new Uint8Array(j);for(b=0;b<h;b+=4)c=Da.indexOf(a[b]),d=Da.indexOf(a[b+1]),e=Da.indexOf(a[b+2]),f=Da.indexOf(a[b+3]),k[i++]=c<<2|d>>4,k[i++]=(15&d)<<4|e>>2,k[i++]=(3&e)<<6|63&f;return j}function O(a){var b,c=new Uint8Array(a),d="";for(b=0;b<c.length;b+=3)d+=Da[c[b]>>2],d+=Da[(3&c[b])<<4|c[b+1]>>4],d+=Da[(15&c[b+1])<<2|c[b+2]>>6],d+=Da[63&c[b+2]];return c.length%3==2?d=d.substring(0,d.length-1)+"=":c.length%3==1&&(d=d.substring(0,d.length-2)+"=="),d}function P(a,b){var c="";if(a&&(c=Ua.call(a)),a&&("[object ArrayBuffer]"===c||a.buffer&&"[object ArrayBuffer]"===Ua.call(a.buffer))){var d,e=Ga;a instanceof ArrayBuffer?(d=a,e+=Ia):(d=a.buffer,"[object Int8Array]"===c?e+=Ka:"[object Uint8Array]"===c?e+=La:"[object Uint8ClampedArray]"===c?e+=Ma:"[object Int16Array]"===c?e+=Na:"[object Uint16Array]"===c?e+=Pa:"[object Int32Array]"===c?e+=Oa:"[object Uint32Array]"===c?e+=Qa:"[object Float32Array]"===c?e+=Ra:"[object Float64Array]"===c?e+=Sa:b(new Error("Failed to get type for BinaryArray"))),b(e+O(d))}else if("[object Blob]"===c){var f=new FileReader;f.onload=function(){var c=Ea+a.type+"~"+O(this.result);b(Ga+Ja+c)},f.readAsArrayBuffer(a)}else try{b(JSON.stringify(a))}catch(c){console.error("Couldn't convert value into a JSON string: ",a),b(null,c)}}function Q(a){if(a.substring(0,Ha)!==Ga)return JSON.parse(a);var b,c=a.substring(Ta),d=a.substring(Ha,Ta);if(d===Ja&&Fa.test(c)){var e=c.match(Fa);b=e[1],c=c.substring(e[0].length)}var f=N(c);switch(d){case Ia:return f;case Ja:return g([f],{type:b});case Ka:return new Int8Array(f);case La:return new Uint8Array(f);case Ma:return new Uint8ClampedArray(f);case Na:return new Int16Array(f);case Pa:return new Uint16Array(f);case Oa:return new Int32Array(f);case Qa:return new Uint32Array(f);case Ra:return new Float32Array(f);case Sa:return new Float64Array(f);default:throw new Error("Unkown type: "+d)}}function R(a,b,c,d){a.executeSql("CREATE TABLE IF NOT EXISTS "+b.storeName+" (id INTEGER PRIMARY KEY, key unique, value)",[],c,d)}function S(a){var b=this,c={db:null};if(a)for(var d in a)c[d]="string"!=typeof a[d]?a[d].toString():a[d];var e=new va(function(a,d){try{c.db=openDatabase(c.name,String(c.version),c.description,c.size)}catch(a){return d(a)}c.db.transaction(function(e){R(e,c,function(){b._dbInfo=c,a()},function(a,b){d(b)})},d)});return c.serializer=Va,e}function T(a,b,c,d,e,f){a.executeSql(c,d,e,function(a,g){g.code===g.SYNTAX_ERR?a.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name = ?",[name],function(a,h){h.rows.length?f(a,g):R(a,b,function(){a.executeSql(c,d,e,f)},f)},f):f(a,g)},f)}function U(a,b){var c=this;a=j(a);var d=new va(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){T(c,e,"SELECT * FROM "+e.storeName+" WHERE key = ? LIMIT 1",[a],function(a,c){var d=c.rows.length?c.rows.item(0).value:null;d&&(d=e.serializer.deserialize(d)),b(d)},function(a,b){d(b)})})}).catch(d)});return h(d,b),d}function V(a,b){var c=this,d=new va(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){T(c,e,"SELECT * FROM "+e.storeName,[],function(c,d){for(var f=d.rows,g=f.length,h=0;h<g;h++){var i=f.item(h),j=i.value;if(j&&(j=e.serializer.deserialize(j)),void 0!==(j=a(j,i.key,h+1)))return void b(j)}b()},function(a,b){d(b)})})}).catch(d)});return h(d,b),d}function W(a,b,c,d){var e=this;a=j(a);var f=new va(function(f,g){e.ready().then(function(){void 0===b&&(b=null);var h=b,i=e._dbInfo;i.serializer.serialize(b,function(b,j){j?g(j):i.db.transaction(function(c){T(c,i,"INSERT OR REPLACE INTO "+i.storeName+" (key, value) VALUES (?, ?)",[a,b],function(){f(h)},function(a,b){g(b)})},function(b){if(b.code===b.QUOTA_ERR){if(d>0)return void f(W.apply(e,[a,h,c,d-1]));g(b)}})})}).catch(g)});return h(f,c),f}function X(a,b,c){return W.apply(this,[a,b,c,1])}function Y(a,b){var c=this;a=j(a);var d=new va(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){T(c,e,"DELETE FROM "+e.storeName+" WHERE key = ?",[a],function(){b()},function(a,b){d(b)})})}).catch(d)});return h(d,b),d}function Z(a){var b=this,c=new va(function(a,c){b.ready().then(function(){var d=b._dbInfo;d.db.transaction(function(b){T(b,d,"DELETE FROM "+d.storeName,[],function(){a()},function(a,b){c(b)})})}).catch(c)});return h(c,a),c}function $(a){var b=this,c=new va(function(a,c){b.ready().then(function(){var d=b._dbInfo;d.db.transaction(function(b){T(b,d,"SELECT COUNT(key) as c FROM "+d.storeName,[],function(b,c){var d=c.rows.item(0).c;a(d)},function(a,b){c(b)})})}).catch(c)});return h(c,a),c}function _(a,b){var c=this,d=new va(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){T(c,e,"SELECT key FROM "+e.storeName+" WHERE id = ? LIMIT 1",[a+1],function(a,c){var d=c.rows.length?c.rows.item(0).key:null;b(d)},function(a,b){d(b)})})}).catch(d)});return h(d,b),d}function aa(a){var b=this,c=new va(function(a,c){b.ready().then(function(){var d=b._dbInfo;d.db.transaction(function(b){T(b,d,"SELECT key FROM "+d.storeName,[],function(b,c){for(var d=[],e=0;e<c.rows.length;e++)d.push(c.rows.item(e).key);a(d)},function(a,b){c(b)})})}).catch(c)});return h(c,a),c}function ba(a){return new va(function(b,c){a.transaction(function(d){d.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name <> '__WebKitDatabaseInfoTable__'",[],function(c,d){for(var e=[],f=0;f<d.rows.length;f++)e.push(d.rows.item(f).name);b({db:a,storeNames:e})},function(a,b){c(b)})},function(a){c(a)})})}function ca(a,b){b=k.apply(this,arguments);var c=this.config();a="function"!=typeof a&&a||{},a.name||(a.name=a.name||c.name,a.storeName=a.storeName||c.storeName);var d,e=this;return d=a.name?new va(function(b){var d;d=a.name===c.name?e._dbInfo.db:openDatabase(a.name,"","",0),b(a.storeName?{db:d,storeNames:[a.storeName]}:ba(d))}).then(function(a){return new va(function(b,c){a.db.transaction(function(d){function e(a){return new va(function(b,c){d.executeSql("DROP TABLE IF EXISTS "+a,[],function(){b()},function(a,b){c(b)})})}for(var f=[],g=0,h=a.storeNames.length;g<h;g++)f.push(e(a.storeNames[g]));va.all(f).then(function(){b()}).catch(function(a){c(a)})},function(a){c(a)})})}):va.reject("Invalid arguments"),h(d,b),d}function da(){try{return"undefined"!=typeof localStorage&&"setItem"in localStorage&&!!localStorage.setItem}catch(a){return!1}}function ea(a,b){var c=a.name+"/";return a.storeName!==b.storeName&&(c+=a.storeName+"/"),c}function fa(){var a="_localforage_support_test";try{return localStorage.setItem(a,!0),localStorage.removeItem(a),!1}catch(a){return!0}}function ga(){return!fa()||localStorage.length>0}function ha(a){var b=this,c={};if(a)for(var d in a)c[d]=a[d];return c.keyPrefix=ea(a,b._defaultConfig),ga()?(b._dbInfo=c,c.serializer=Va,va.resolve()):va.reject()}function ia(a){var b=this,c=b.ready().then(function(){for(var a=b._dbInfo.keyPrefix,c=localStorage.length-1;c>=0;c--){var d=localStorage.key(c);0===d.indexOf(a)&&localStorage.removeItem(d)}});return h(c,a),c}function ja(a,b){var c=this;a=j(a);var d=c.ready().then(function(){var b=c._dbInfo,d=localStorage.getItem(b.keyPrefix+a);return d&&(d=b.serializer.deserialize(d)),d});return h(d,b),d}function ka(a,b){var c=this,d=c.ready().then(function(){for(var b=c._dbInfo,d=b.keyPrefix,e=d.length,f=localStorage.length,g=1,h=0;h<f;h++){var i=localStorage.key(h);if(0===i.indexOf(d)){var j=localStorage.getItem(i);if(j&&(j=b.serializer.deserialize(j)),void 0!==(j=a(j,i.substring(e),g++)))return j}}});return h(d,b),d}function la(a,b){var c=this,d=c.ready().then(function(){var b,d=c._dbInfo;try{b=localStorage.key(a)}catch(a){b=null}return b&&(b=b.substring(d.keyPrefix.length)),b});return h(d,b),d}function ma(a){var b=this,c=b.ready().then(function(){for(var a=b._dbInfo,c=localStorage.length,d=[],e=0;e<c;e++){var f=localStorage.key(e);0===f.indexOf(a.keyPrefix)&&d.push(f.substring(a.keyPrefix.length))}return d});return h(c,a),c}function na(a){var b=this,c=b.keys().then(function(a){return a.length});return h(c,a),c}function oa(a,b){var c=this;a=j(a);var d=c.ready().then(function(){var b=c._dbInfo;localStorage.removeItem(b.keyPrefix+a)});return h(d,b),d}function pa(a,b,c){var d=this;a=j(a);var e=d.ready().then(function(){void 0===b&&(b=null);var c=b;return new va(function(e,f){var g=d._dbInfo;g.serializer.serialize(b,function(b,d){if(d)f(d);else try{localStorage.setItem(g.keyPrefix+a,b),e(c)}catch(a){"QuotaExceededError"!==a.name&&"NS_ERROR_DOM_QUOTA_REACHED"!==a.name||f(a),f(a)}})})});return h(e,c),e}function qa(a,b){if(b=k.apply(this,arguments),a="function"!=typeof a&&a||{},!a.name){var c=this.config();a.name=a.name||c.name,a.storeName=a.storeName||c.storeName}var d,e=this;return d=a.name?new va(function(b){b(a.storeName?ea(a,e._defaultConfig):a.name+"/")}).then(function(a){for(var b=localStorage.length-1;b>=0;b--){var c=localStorage.key(b);0===c.indexOf(a)&&localStorage.removeItem(c)}}):va.reject("Invalid arguments"),h(d,b),d}function ra(a,b){a[b]=function(){var c=arguments;return a.ready().then(function(){return a[b].apply(a,c)})}}function sa(){for(var a=1;a<arguments.length;a++){var b=arguments[a];if(b)for(var c in b)b.hasOwnProperty(c)&&($a(b[c])?arguments[0][c]=b[c].slice():arguments[0][c]=b[c])}return arguments[0]}var ta="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},ua=e();"undefined"==typeof Promise&&a(3);var va=Promise,wa="local-forage-detect-blob-support",xa=void 0,ya={},za=Object.prototype.toString,Aa="readonly",Ba="readwrite",Ca={_driver:"asyncStorage",_initStorage:C,_support:f(),iterate:E,getItem:D,setItem:F,removeItem:G,clear:H,length:I,key:J,keys:K,dropInstance:L},Da="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",Ea="~~local_forage_type~",Fa=/^~~local_forage_type~([^~]+)~/,Ga="__lfsc__:",Ha=Ga.length,Ia="arbf",Ja="blob",Ka="si08",La="ui08",Ma="uic8",Na="si16",Oa="si32",Pa="ur16",Qa="ui32",Ra="fl32",Sa="fl64",Ta=Ha+Ia.length,Ua=Object.prototype.toString,Va={serialize:P,deserialize:Q,stringToBuffer:N,bufferToString:O},Wa={_driver:"webSQLStorage",_initStorage:S,_support:M(),iterate:V,getItem:U,setItem:X,removeItem:Y,clear:Z,length:$,key:_,keys:aa,dropInstance:ca},Xa={_driver:"localStorageWrapper",_initStorage:ha,_support:da(),iterate:ka,getItem:ja,setItem:pa,removeItem:oa,clear:ia,length:na,key:la,keys:ma,dropInstance:qa},Ya=function(a,b){return a===b||"number"==typeof a&&"number"==typeof b&&isNaN(a)&&isNaN(b)},Za=function(a,b){for(var c=a.length,d=0;d<c;){if(Ya(a[d],b))return!0;d++}return!1},$a=Array.isArray||function(a){return"[object Array]"===Object.prototype.toString.call(a)},_a={},ab={},bb={INDEXEDDB:Ca,WEBSQL:Wa,LOCALSTORAGE:Xa},cb=[bb.INDEXEDDB._driver,bb.WEBSQL._driver,bb.LOCALSTORAGE._driver],db=["dropInstance"],eb=["clear","getItem","iterate","key","keys","length","removeItem","setItem"].concat(db),fb={description:"",driver:cb.slice(),name:"localforage",size:4980736,storeName:"keyvaluepairs",version:1},gb=function(){function a(b){d(this,a);for(var c in bb)if(bb.hasOwnProperty(c)){var e=bb[c],f=e._driver;this[c]=f,_a[f]||this.defineDriver(e)}this._defaultConfig=sa({},fb),this._config=sa({},this._defaultConfig,b),this._driverSet=null,this._initDriver=null,this._ready=!1,this._dbInfo=null,this._wrapLibraryMethodsWithReady(),this.setDriver(this._config.driver).catch(function(){})}return a.prototype.config=function(a){if("object"===(void 0===a?"undefined":ta(a))){if(this._ready)return new Error("Can't call config() after localforage has been used.");for(var b in a){if("storeName"===b&&(a[b]=a[b].replace(/\W/g,"_")),"version"===b&&"number"!=typeof a[b])return new Error("Database version must be a number.");this._config[b]=a[b]}return!("driver"in a&&a.driver)||this.setDriver(this._config.driver)}return"string"==typeof a?this._config[a]:this._config},a.prototype.defineDriver=function(a,b,c){var d=new va(function(b,c){try{var d=a._driver,e=new Error("Custom driver not compliant; see https://mozilla.github.io/localForage/#definedriver");if(!a._driver)return void c(e);for(var f=eb.concat("_initStorage"),g=0,i=f.length;g<i;g++){var j=f[g];if((!Za(db,j)||a[j])&&"function"!=typeof a[j])return void c(e)}(function(){for(var b=function(a){return function(){var b=new Error("Method "+a+" is not implemented by the current driver"),c=va.reject(b);return h(c,arguments[arguments.length-1]),c}},c=0,d=db.length;c<d;c++){var e=db[c];a[e]||(a[e]=b(e))}})();var k=function(c){_a[d]&&console.info("Redefining LocalForage driver: "+d),_a[d]=a,ab[d]=c,b()};"_support"in a?a._support&&"function"==typeof a._support?a._support().then(k,c):k(!!a._support):k(!0)}catch(a){c(a)}});return i(d,b,c),d},a.prototype.driver=function(){return this._driver||null},a.prototype.getDriver=function(a,b,c){var d=_a[a]?va.resolve(_a[a]):va.reject(new Error("Driver not found."));return i(d,b,c),d},a.prototype.getSerializer=function(a){var b=va.resolve(Va);return i(b,a),b},a.prototype.ready=function(a){var b=this,c=b._driverSet.then(function(){return null===b._ready&&(b._ready=b._initDriver()),b._ready});return i(c,a,a),c},a.prototype.setDriver=function(a,b,c){function d(){g._config.driver=g.driver()}function e(a){return g._extend(a),d(),g._ready=g._initStorage(g._config),g._ready}function f(a){return function(){function b(){for(;c<a.length;){var f=a[c];return c++,g._dbInfo=null,g._ready=null,g.getDriver(f).then(e).catch(b)}d();var h=new Error("No available storage method found.");return g._driverSet=va.reject(h),g._driverSet}var c=0;return b()}}var g=this;$a(a)||(a=[a]);var h=this._getSupportedDrivers(a),j=null!==this._driverSet?this._driverSet.catch(function(){return va.resolve()}):va.resolve();return this._driverSet=j.then(function(){var a=h[0];return g._dbInfo=null,g._ready=null,g.getDriver(a).then(function(a){g._driver=a._driver,d(),g._wrapLibraryMethodsWithReady(),g._initDriver=f(h)})}).catch(function(){d();var a=new Error("No available storage method found.");return g._driverSet=va.reject(a),g._driverSet}),i(this._driverSet,b,c),this._driverSet},a.prototype.supports=function(a){return!!ab[a]},a.prototype._extend=function(a){sa(this,a)},a.prototype._getSupportedDrivers=function(a){for(var b=[],c=0,d=a.length;c<d;c++){var e=a[c];this.supports(e)&&b.push(e)}return b},a.prototype._wrapLibraryMethodsWithReady=function(){for(var a=0,b=eb.length;a<b;a++)ra(this,eb[a])},a.prototype.createInstance=function(b){return new a(b)},a}(),hb=new gb;b.exports=hb},{3:3}]},{},[4])(4)});
/*!
localForage -- Offline Storage, Improved
Version 1.5.7
Version 1.6.0
https://localforage.github.io/localForage
(c) 2013-2017 Mozilla, Apache License 2.0
*/
!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;b="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,b.localforage=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c||a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){"use strict";function d(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function e(){try{if("undefined"!=typeof indexedDB)return indexedDB;if("undefined"!=typeof webkitIndexedDB)return webkitIndexedDB;if("undefined"!=typeof mozIndexedDB)return mozIndexedDB;if("undefined"!=typeof OIndexedDB)return OIndexedDB;if("undefined"!=typeof msIndexedDB)return msIndexedDB}catch(a){return}}function f(){try{if(!la)return!1;var a="undefined"!=typeof openDatabase&&/(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent)&&!/Chrome/.test(navigator.userAgent)&&!/BlackBerry/.test(navigator.platform),b="function"==typeof fetch&&-1!==fetch.toString().indexOf("[native code");return(!a||b)&&"undefined"!=typeof indexedDB&&"undefined"!=typeof IDBKeyRange}catch(a){return!1}}function g(a,b){a=a||[],b=b||{};try{return new Blob(a,b)}catch(f){if("TypeError"!==f.name)throw f;for(var c="undefined"!=typeof BlobBuilder?BlobBuilder:"undefined"!=typeof MSBlobBuilder?MSBlobBuilder:"undefined"!=typeof MozBlobBuilder?MozBlobBuilder:WebKitBlobBuilder,d=new c,e=0;e<a.length;e+=1)d.append(a[e]);return d.getBlob(b.type)}}function h(a,b){b&&a.then(function(a){b(null,a)},function(a){b(a)})}function i(a,b,c){"function"==typeof b&&a.then(b),"function"==typeof c&&a.catch(c)}function j(a){return"string"!=typeof a&&(console.warn(a+" used as a key, but it is not a string."),a=String(a)),a}function k(a){for(var b=a.length,c=new ArrayBuffer(b),d=new Uint8Array(c),e=0;e<b;e++)d[e]=a.charCodeAt(e);return c}function l(a){return new oa(function(b){var c=a.transaction(pa,sa),d=g([""]);c.objectStore(pa).put(d,"key"),c.onabort=function(a){a.preventDefault(),a.stopPropagation(),b(!1)},c.oncomplete=function(){var a=navigator.userAgent.match(/Chrome\/(\d+)/),c=navigator.userAgent.match(/Edge\//);b(c||!a||parseInt(a[1],10)>=43)}}).catch(function(){return!1})}function m(a){return"boolean"==typeof ma?oa.resolve(ma):l(a).then(function(a){return ma=a})}function n(a){var b=na[a.name],c={};c.promise=new oa(function(a){c.resolve=a}),b.deferredOperations.push(c),b.dbReady?b.dbReady=b.dbReady.then(function(){return c.promise}):b.dbReady=c.promise}function o(a){var b=na[a.name],c=b.deferredOperations.pop();c&&c.resolve()}function p(a,b){var c=na[a.name],d=c.deferredOperations.pop();d&&d.reject(b)}function q(a,b){return new oa(function(c,d){if(a.db){if(!b)return c(a.db);n(a),a.db.close()}var e=[a.name];b&&e.push(a.version);var f=la.open.apply(la,e);b&&(f.onupgradeneeded=function(b){var c=f.result;try{c.createObjectStore(a.storeName),b.oldVersion<=1&&c.createObjectStore(pa)}catch(c){if("ConstraintError"!==c.name)throw c;console.warn('The database "'+a.name+'" has been upgraded from version '+b.oldVersion+" to version "+b.newVersion+', but the storage "'+a.storeName+'" already exists.')}}),f.onerror=function(a){a.preventDefault(),d(f.error)},f.onsuccess=function(){c(f.result),o(a)}})}function r(a){return q(a,!1)}function s(a){return q(a,!0)}function t(a,b){if(!a.db)return!0;var c=!a.db.objectStoreNames.contains(a.storeName),d=a.version<a.db.version,e=a.version>a.db.version;if(d&&(a.version!==b&&console.warn('The database "'+a.name+"\" can't be downgraded from version "+a.db.version+" to version "+a.version+"."),a.version=a.db.version),e||c){if(c){var f=a.db.version+1;f>a.version&&(a.version=f)}return!0}return!1}function u(a){return new oa(function(b,c){var d=new FileReader;d.onerror=c,d.onloadend=function(c){var d=btoa(c.target.result||"");b({__local_forage_encoded_blob:!0,data:d,type:a.type})},d.readAsBinaryString(a)})}function v(a){return g([k(atob(a.data))],{type:a.type})}function w(a){return a&&a.__local_forage_encoded_blob}function x(a){var b=this,c=b._initReady().then(function(){var a=na[b._dbInfo.name];if(a&&a.dbReady)return a.dbReady});return i(c,a,a),c}function y(a){n(a);for(var b=na[a.name],c=b.forages,d=0;d<c.length;d++)c[d]._dbInfo.db&&(c[d]._dbInfo.db.close(),c[d]._dbInfo.db=null);return q(a,!1).then(function(a){for(var b=0;b<c.length;b++)c[b]._dbInfo.db=a}).catch(function(b){throw p(a,b),b})}function z(a,b,c){try{var d=a.db.transaction(a.storeName,b);c(null,d)}catch(d){if(!a.db||"InvalidStateError"===d.name)return y(a).then(function(){var d=a.db.transaction(a.storeName,b);c(null,d)});c(d)}}function A(a){function b(){return oa.resolve()}var c=this,d={db:null};if(a)for(var e in a)d[e]=a[e];na||(na={});var f=na[d.name];f||(f={forages:[],db:null,dbReady:null,deferredOperations:[]},na[d.name]=f),f.forages.push(c),c._initReady||(c._initReady=c.ready,c.ready=x);for(var g=[],h=0;h<f.forages.length;h++){var i=f.forages[h];i!==c&&g.push(i._initReady().catch(b))}var j=f.forages.slice(0);return oa.all(g).then(function(){return d.db=f.db,r(d)}).then(function(a){return d.db=a,t(d,c._defaultConfig.version)?s(d):a}).then(function(a){d.db=f.db=a,c._dbInfo=d;for(var b=0;b<j.length;b++){var e=j[b];e!==c&&(e._dbInfo.db=d.db,e._dbInfo.version=d.version)}})}function B(a,b){var c=this;a=j(a);var d=new oa(function(b,d){c.ready().then(function(){z(c._dbInfo,ra,function(e,f){if(e)return d(e);try{var g=f.objectStore(c._dbInfo.storeName),h=g.get(a);h.onsuccess=function(){var a=h.result;void 0===a&&(a=null),w(a)&&(a=v(a)),b(a)},h.onerror=function(){d(h.error)}}catch(a){d(a)}})}).catch(d)});return h(d,b),d}function C(a,b){var c=this,d=new oa(function(b,d){c.ready().then(function(){z(c._dbInfo,ra,function(e,f){if(e)return d(e);try{var g=f.objectStore(c._dbInfo.storeName),h=g.openCursor(),i=1;h.onsuccess=function(){var c=h.result;if(c){var d=c.value;w(d)&&(d=v(d));var e=a(d,c.key,i++);void 0!==e?b(e):c.continue()}else b()},h.onerror=function(){d(h.error)}}catch(a){d(a)}})}).catch(d)});return h(d,b),d}function D(a,b,c){var d=this;a=j(a);var e=new oa(function(c,e){var f;d.ready().then(function(){return f=d._dbInfo,"[object Blob]"===qa.call(b)?m(f.db).then(function(a){return a?b:u(b)}):b}).then(function(b){z(d._dbInfo,sa,function(f,g){if(f)return e(f);try{var h=g.objectStore(d._dbInfo.storeName);null===b&&(b=void 0);var i=h.put(b,a);g.oncomplete=function(){void 0===b&&(b=null),c(b)},g.onabort=g.onerror=function(){var a=i.error?i.error:i.transaction.error;e(a)}}catch(a){e(a)}})}).catch(e)});return h(e,c),e}function E(a,b){var c=this;a=j(a);var d=new oa(function(b,d){c.ready().then(function(){z(c._dbInfo,sa,function(e,f){if(e)return d(e);try{var g=f.objectStore(c._dbInfo.storeName),h=g.delete(a);f.oncomplete=function(){b()},f.onerror=function(){d(h.error)},f.onabort=function(){var a=h.error?h.error:h.transaction.error;d(a)}}catch(a){d(a)}})}).catch(d)});return h(d,b),d}function F(a){var b=this,c=new oa(function(a,c){b.ready().then(function(){z(b._dbInfo,sa,function(d,e){if(d)return c(d);try{var f=e.objectStore(b._dbInfo.storeName),g=f.clear();e.oncomplete=function(){a()},e.onabort=e.onerror=function(){var a=g.error?g.error:g.transaction.error;c(a)}}catch(a){c(a)}})}).catch(c)});return h(c,a),c}function G(a){var b=this,c=new oa(function(a,c){b.ready().then(function(){z(b._dbInfo,ra,function(d,e){if(d)return c(d);try{var f=e.objectStore(b._dbInfo.storeName),g=f.count();g.onsuccess=function(){a(g.result)},g.onerror=function(){c(g.error)}}catch(a){c(a)}})}).catch(c)});return h(c,a),c}function H(a,b){var c=this,d=new oa(function(b,d){if(a<0)return void b(null);c.ready().then(function(){z(c._dbInfo,ra,function(e,f){if(e)return d(e);try{var g=f.objectStore(c._dbInfo.storeName),h=!1,i=g.openCursor();i.onsuccess=function(){var c=i.result;if(!c)return void b(null);0===a?b(c.key):h?b(c.key):(h=!0,c.advance(a))},i.onerror=function(){d(i.error)}}catch(a){d(a)}})}).catch(d)});return h(d,b),d}function I(a){var b=this,c=new oa(function(a,c){b.ready().then(function(){z(b._dbInfo,ra,function(d,e){if(d)return c(d);try{var f=e.objectStore(b._dbInfo.storeName),g=f.openCursor(),h=[];g.onsuccess=function(){var b=g.result;if(!b)return void a(h);h.push(b.key),b.continue()},g.onerror=function(){c(g.error)}}catch(a){c(a)}})}).catch(c)});return h(c,a),c}function J(){return"function"==typeof openDatabase}function K(a){var b,c,d,e,f,g=.75*a.length,h=a.length,i=0;"="===a[a.length-1]&&(g--,"="===a[a.length-2]&&g--);var j=new ArrayBuffer(g),k=new Uint8Array(j);for(b=0;b<h;b+=4)c=ua.indexOf(a[b]),d=ua.indexOf(a[b+1]),e=ua.indexOf(a[b+2]),f=ua.indexOf(a[b+3]),k[i++]=c<<2|d>>4,k[i++]=(15&d)<<4|e>>2,k[i++]=(3&e)<<6|63&f;return j}function L(a){var b,c=new Uint8Array(a),d="";for(b=0;b<c.length;b+=3)d+=ua[c[b]>>2],d+=ua[(3&c[b])<<4|c[b+1]>>4],d+=ua[(15&c[b+1])<<2|c[b+2]>>6],d+=ua[63&c[b+2]];return c.length%3==2?d=d.substring(0,d.length-1)+"=":c.length%3==1&&(d=d.substring(0,d.length-2)+"=="),d}function M(a,b){var c="";if(a&&(c=La.call(a)),a&&("[object ArrayBuffer]"===c||a.buffer&&"[object ArrayBuffer]"===La.call(a.buffer))){var d,e=xa;a instanceof ArrayBuffer?(d=a,e+=za):(d=a.buffer,"[object Int8Array]"===c?e+=Ba:"[object Uint8Array]"===c?e+=Ca:"[object Uint8ClampedArray]"===c?e+=Da:"[object Int16Array]"===c?e+=Ea:"[object Uint16Array]"===c?e+=Ga:"[object Int32Array]"===c?e+=Fa:"[object Uint32Array]"===c?e+=Ha:"[object Float32Array]"===c?e+=Ia:"[object Float64Array]"===c?e+=Ja:b(new Error("Failed to get type for BinaryArray"))),b(e+L(d))}else if("[object Blob]"===c){var f=new FileReader;f.onload=function(){var c=va+a.type+"~"+L(this.result);b(xa+Aa+c)},f.readAsArrayBuffer(a)}else try{b(JSON.stringify(a))}catch(c){console.error("Couldn't convert value into a JSON string: ",a),b(null,c)}}function N(a){if(a.substring(0,ya)!==xa)return JSON.parse(a);var b,c=a.substring(Ka),d=a.substring(ya,Ka);if(d===Aa&&wa.test(c)){var e=c.match(wa);b=e[1],c=c.substring(e[0].length)}var f=K(c);switch(d){case za:return f;case Aa:return g([f],{type:b});case Ba:return new Int8Array(f);case Ca:return new Uint8Array(f);case Da:return new Uint8ClampedArray(f);case Ea:return new Int16Array(f);case Ga:return new Uint16Array(f);case Fa:return new Int32Array(f);case Ha:return new Uint32Array(f);case Ia:return new Float32Array(f);case Ja:return new Float64Array(f);default:throw new Error("Unkown type: "+d)}}function O(a){var b=this,c={db:null};if(a)for(var d in a)c[d]="string"!=typeof a[d]?a[d].toString():a[d];var e=new oa(function(a,d){try{c.db=openDatabase(c.name,String(c.version),c.description,c.size)}catch(a){return d(a)}c.db.transaction(function(e){e.executeSql("CREATE TABLE IF NOT EXISTS "+c.storeName+" (id INTEGER PRIMARY KEY, key unique, value)",[],function(){b._dbInfo=c,a()},function(a,b){d(b)})})});return c.serializer=Ma,e}function P(a,b){var c=this;a=j(a);var d=new oa(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){c.executeSql("SELECT * FROM "+e.storeName+" WHERE key = ? LIMIT 1",[a],function(a,c){var d=c.rows.length?c.rows.item(0).value:null;d&&(d=e.serializer.deserialize(d)),b(d)},function(a,b){d(b)})})}).catch(d)});return h(d,b),d}function Q(a,b){var c=this,d=new oa(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){c.executeSql("SELECT * FROM "+e.storeName,[],function(c,d){for(var f=d.rows,g=f.length,h=0;h<g;h++){var i=f.item(h),j=i.value;if(j&&(j=e.serializer.deserialize(j)),void 0!==(j=a(j,i.key,h+1)))return void b(j)}b()},function(a,b){d(b)})})}).catch(d)});return h(d,b),d}function R(a,b,c,d){var e=this;a=j(a);var f=new oa(function(f,g){e.ready().then(function(){void 0===b&&(b=null);var h=b,i=e._dbInfo;i.serializer.serialize(b,function(b,j){j?g(j):i.db.transaction(function(c){c.executeSql("INSERT OR REPLACE INTO "+i.storeName+" (key, value) VALUES (?, ?)",[a,b],function(){f(h)},function(a,b){g(b)})},function(b){if(b.code===b.QUOTA_ERR){if(d>0)return void f(R.apply(e,[a,h,c,d-1]));g(b)}})})}).catch(g)});return h(f,c),f}function S(a,b,c){return R.apply(this,[a,b,c,1])}function T(a,b){var c=this;a=j(a);var d=new oa(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){c.executeSql("DELETE FROM "+e.storeName+" WHERE key = ?",[a],function(){b()},function(a,b){d(b)})})}).catch(d)});return h(d,b),d}function U(a){var b=this,c=new oa(function(a,c){b.ready().then(function(){var d=b._dbInfo;d.db.transaction(function(b){b.executeSql("DELETE FROM "+d.storeName,[],function(){a()},function(a,b){c(b)})})}).catch(c)});return h(c,a),c}function V(a){var b=this,c=new oa(function(a,c){b.ready().then(function(){var d=b._dbInfo;d.db.transaction(function(b){b.executeSql("SELECT COUNT(key) as c FROM "+d.storeName,[],function(b,c){var d=c.rows.item(0).c;a(d)},function(a,b){c(b)})})}).catch(c)});return h(c,a),c}function W(a,b){var c=this,d=new oa(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){c.executeSql("SELECT key FROM "+e.storeName+" WHERE id = ? LIMIT 1",[a+1],function(a,c){var d=c.rows.length?c.rows.item(0).key:null;b(d)},function(a,b){d(b)})})}).catch(d)});return h(d,b),d}function X(a){var b=this,c=new oa(function(a,c){b.ready().then(function(){var d=b._dbInfo;d.db.transaction(function(b){b.executeSql("SELECT key FROM "+d.storeName,[],function(b,c){for(var d=[],e=0;e<c.rows.length;e++)d.push(c.rows.item(e).key);a(d)},function(a,b){c(b)})})}).catch(c)});return h(c,a),c}function Y(){try{return"undefined"!=typeof localStorage&&"setItem"in localStorage&&!!localStorage.setItem}catch(a){return!1}}function Z(){var a="_localforage_support_test";try{return localStorage.setItem(a,!0),localStorage.removeItem(a),!1}catch(a){return!0}}function $(){return!Z()||localStorage.length>0}function _(a){var b=this,c={};if(a)for(var d in a)c[d]=a[d];return c.keyPrefix=c.name+"/",c.storeName!==b._defaultConfig.storeName&&(c.keyPrefix+=c.storeName+"/"),$()?(b._dbInfo=c,c.serializer=Ma,oa.resolve()):oa.reject()}function aa(a){var b=this,c=b.ready().then(function(){for(var a=b._dbInfo.keyPrefix,c=localStorage.length-1;c>=0;c--){var d=localStorage.key(c);0===d.indexOf(a)&&localStorage.removeItem(d)}});return h(c,a),c}function ba(a,b){var c=this;a=j(a);var d=c.ready().then(function(){var b=c._dbInfo,d=localStorage.getItem(b.keyPrefix+a);return d&&(d=b.serializer.deserialize(d)),d});return h(d,b),d}function ca(a,b){var c=this,d=c.ready().then(function(){for(var b=c._dbInfo,d=b.keyPrefix,e=d.length,f=localStorage.length,g=1,h=0;h<f;h++){var i=localStorage.key(h);if(0===i.indexOf(d)){var j=localStorage.getItem(i);if(j&&(j=b.serializer.deserialize(j)),void 0!==(j=a(j,i.substring(e),g++)))return j}}});return h(d,b),d}function da(a,b){var c=this,d=c.ready().then(function(){var b,d=c._dbInfo;try{b=localStorage.key(a)}catch(a){b=null}return b&&(b=b.substring(d.keyPrefix.length)),b});return h(d,b),d}function ea(a){var b=this,c=b.ready().then(function(){for(var a=b._dbInfo,c=localStorage.length,d=[],e=0;e<c;e++){var f=localStorage.key(e);0===f.indexOf(a.keyPrefix)&&d.push(f.substring(a.keyPrefix.length))}return d});return h(c,a),c}function fa(a){var b=this,c=b.keys().then(function(a){return a.length});return h(c,a),c}function ga(a,b){var c=this;a=j(a);var d=c.ready().then(function(){var b=c._dbInfo;localStorage.removeItem(b.keyPrefix+a)});return h(d,b),d}function ha(a,b,c){var d=this;a=j(a);var e=d.ready().then(function(){void 0===b&&(b=null);var c=b;return new oa(function(e,f){var g=d._dbInfo;g.serializer.serialize(b,function(b,d){if(d)f(d);else try{localStorage.setItem(g.keyPrefix+a,b),e(c)}catch(a){"QuotaExceededError"!==a.name&&"NS_ERROR_DOM_QUOTA_REACHED"!==a.name||f(a),f(a)}})})});return h(e,c),e}function ia(a,b){a[b]=function(){var c=arguments;return a.ready().then(function(){return a[b].apply(a,c)})}}function ja(){for(var a=1;a<arguments.length;a++){var b=arguments[a];if(b)for(var c in b)b.hasOwnProperty(c)&&(Pa(b[c])?arguments[0][c]=b[c].slice():arguments[0][c]=b[c])}return arguments[0]}var ka="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},la=e();"undefined"==typeof Promise&&a("lie/polyfill");var ma,na,oa=Promise,pa="local-forage-detect-blob-support",qa=Object.prototype.toString,ra="readonly",sa="readwrite",ta={_driver:"asyncStorage",_initStorage:A,_support:f(),iterate:C,getItem:B,setItem:D,removeItem:E,clear:F,length:G,key:H,keys:I},ua="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",va="~~local_forage_type~",wa=/^~~local_forage_type~([^~]+)~/,xa="__lfsc__:",ya=xa.length,za="arbf",Aa="blob",Ba="si08",Ca="ui08",Da="uic8",Ea="si16",Fa="si32",Ga="ur16",Ha="ui32",Ia="fl32",Ja="fl64",Ka=ya+za.length,La=Object.prototype.toString,Ma={serialize:M,deserialize:N,stringToBuffer:K,bufferToString:L},Na={_driver:"webSQLStorage",_initStorage:O,_support:J(),iterate:Q,getItem:P,setItem:S,removeItem:T,clear:U,length:V,key:W,keys:X},Oa={_driver:"localStorageWrapper",_initStorage:_,_support:Y(),iterate:ca,getItem:ba,setItem:ha,removeItem:ga,clear:aa,length:fa,key:da,keys:ea},Pa=Array.isArray||function(a){return"[object Array]"===Object.prototype.toString.call(a)},Qa={},Ra={},Sa={INDEXEDDB:ta,WEBSQL:Na,LOCALSTORAGE:Oa},Ta=[Sa.INDEXEDDB._driver,Sa.WEBSQL._driver,Sa.LOCALSTORAGE._driver],Ua=["clear","getItem","iterate","key","keys","length","removeItem","setItem"],Va={description:"",driver:Ta.slice(),name:"localforage",size:4980736,storeName:"keyvaluepairs",version:1},Wa=function(){function a(b){d(this,a);for(var c in Sa)if(Sa.hasOwnProperty(c)){var e=Sa[c],f=e._driver;this[c]=f,Qa[f]||this.defineDriver(e)}this._defaultConfig=ja({},Va),this._config=ja({},this._defaultConfig,b),this._driverSet=null,this._initDriver=null,this._ready=!1,this._dbInfo=null,this._wrapLibraryMethodsWithReady(),this.setDriver(this._config.driver).catch(function(){})}return a.prototype.config=function(a){if("object"===(void 0===a?"undefined":ka(a))){if(this._ready)return new Error("Can't call config() after localforage has been used.");for(var b in a){if("storeName"===b&&(a[b]=a[b].replace(/\W/g,"_")),"version"===b&&"number"!=typeof a[b])return new Error("Database version must be a number.");this._config[b]=a[b]}return!("driver"in a&&a.driver)||this.setDriver(this._config.driver)}return"string"==typeof a?this._config[a]:this._config},a.prototype.defineDriver=function(a,b,c){var d=new oa(function(b,c){try{var d=a._driver,e=new Error("Custom driver not compliant; see https://mozilla.github.io/localForage/#definedriver");if(!a._driver)return void c(e);for(var f=Ua.concat("_initStorage"),g=0,h=f.length;g<h;g++){var i=f[g];if(!i||!a[i]||"function"!=typeof a[i])return void c(e)}var j=function(c){Qa[d]&&console.info("Redefining LocalForage driver: "+d),Qa[d]=a,Ra[d]=c,b()};"_support"in a?a._support&&"function"==typeof a._support?a._support().then(j,c):j(!!a._support):j(!0)}catch(a){c(a)}});return i(d,b,c),d},a.prototype.driver=function(){return this._driver||null},a.prototype.getDriver=function(a,b,c){var d=Qa[a]?oa.resolve(Qa[a]):oa.reject(new Error("Driver not found."));return i(d,b,c),d},a.prototype.getSerializer=function(a){var b=oa.resolve(Ma);return i(b,a),b},a.prototype.ready=function(a){var b=this,c=b._driverSet.then(function(){return null===b._ready&&(b._ready=b._initDriver()),b._ready});return i(c,a,a),c},a.prototype.setDriver=function(a,b,c){function d(){g._config.driver=g.driver()}function e(a){return g._extend(a),d(),g._ready=g._initStorage(g._config),g._ready}function f(a){return function(){function b(){for(;c<a.length;){var f=a[c];return c++,g._dbInfo=null,g._ready=null,g.getDriver(f).then(e).catch(b)}d();var h=new Error("No available storage method found.");return g._driverSet=oa.reject(h),g._driverSet}var c=0;return b()}}var g=this;Pa(a)||(a=[a]);var h=this._getSupportedDrivers(a),j=null!==this._driverSet?this._driverSet.catch(function(){return oa.resolve()}):oa.resolve();return this._driverSet=j.then(function(){var a=h[0];return g._dbInfo=null,g._ready=null,g.getDriver(a).then(function(a){g._driver=a._driver,d(),g._wrapLibraryMethodsWithReady(),g._initDriver=f(h)})}).catch(function(){d();var a=new Error("No available storage method found.");return g._driverSet=oa.reject(a),g._driverSet}),i(this._driverSet,b,c),this._driverSet},a.prototype.supports=function(a){return!!Ra[a]},a.prototype._extend=function(a){ja(this,a)},a.prototype._getSupportedDrivers=function(a){for(var b=[],c=0,d=a.length;c<d;c++){var e=a[c];this.supports(e)&&b.push(e)}return b},a.prototype._wrapLibraryMethodsWithReady=function(){for(var a=0,b=Ua.length;a<b;a++)ia(this,Ua[a])},a.prototype.createInstance=function(b){return new a(b)},a}(),Xa=new Wa;b.exports=Xa},{undefined:void 0}]},{},[1])(1)});
!function(a){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=a();else if("function"==typeof define&&define.amd)define([],a);else{var b;b="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,b.localforage=a()}}(function(){return function a(b,c,d){function e(g,h){if(!c[g]){if(!b[g]){var i="function"==typeof require&&require;if(!h&&i)return i(g,!0);if(f)return f(g,!0);var j=new Error("Cannot find module '"+g+"'");throw j.code="MODULE_NOT_FOUND",j}var k=c[g]={exports:{}};b[g][0].call(k.exports,function(a){var c=b[g][1][a];return e(c||a)},k,k.exports,a,b,c,d)}return c[g].exports}for(var f="function"==typeof require&&require,g=0;g<d.length;g++)e(d[g]);return e}({1:[function(a,b,c){"use strict";function d(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}function e(){try{if("undefined"!=typeof indexedDB)return indexedDB;if("undefined"!=typeof webkitIndexedDB)return webkitIndexedDB;if("undefined"!=typeof mozIndexedDB)return mozIndexedDB;if("undefined"!=typeof OIndexedDB)return OIndexedDB;if("undefined"!=typeof msIndexedDB)return msIndexedDB}catch(a){return}}function f(){try{if(!ua)return!1;var a="undefined"!=typeof openDatabase&&/(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent)&&!/Chrome/.test(navigator.userAgent)&&!/BlackBerry/.test(navigator.platform),b="function"==typeof fetch&&-1!==fetch.toString().indexOf("[native code");return(!a||b)&&"undefined"!=typeof indexedDB&&"undefined"!=typeof IDBKeyRange}catch(a){return!1}}function g(a,b){a=a||[],b=b||{};try{return new Blob(a,b)}catch(f){if("TypeError"!==f.name)throw f;for(var c="undefined"!=typeof BlobBuilder?BlobBuilder:"undefined"!=typeof MSBlobBuilder?MSBlobBuilder:"undefined"!=typeof MozBlobBuilder?MozBlobBuilder:WebKitBlobBuilder,d=new c,e=0;e<a.length;e+=1)d.append(a[e]);return d.getBlob(b.type)}}function h(a,b){b&&a.then(function(a){b(null,a)},function(a){b(a)})}function i(a,b,c){"function"==typeof b&&a.then(b),"function"==typeof c&&a.catch(c)}function j(a){return"string"!=typeof a&&(console.warn(a+" used as a key, but it is not a string."),a=String(a)),a}function k(){if(arguments.length&&"function"==typeof arguments[arguments.length-1])return arguments[arguments.length-1]}function l(a){for(var b=a.length,c=new ArrayBuffer(b),d=new Uint8Array(c),e=0;e<b;e++)d[e]=a.charCodeAt(e);return c}function m(a){return new va(function(b){var c=a.transaction(wa,Ba),d=g([""]);c.objectStore(wa).put(d,"key"),c.onabort=function(a){a.preventDefault(),a.stopPropagation(),b(!1)},c.oncomplete=function(){var a=navigator.userAgent.match(/Chrome\/(\d+)/),c=navigator.userAgent.match(/Edge\//);b(c||!a||parseInt(a[1],10)>=43)}}).catch(function(){return!1})}function n(a){return"boolean"==typeof xa?va.resolve(xa):m(a).then(function(a){return xa=a})}function o(a){var b=ya[a.name],c={};c.promise=new va(function(a,b){c.resolve=a,c.reject=b}),b.deferredOperations.push(c),b.dbReady?b.dbReady=b.dbReady.then(function(){return c.promise}):b.dbReady=c.promise}function p(a){var b=ya[a.name],c=b.deferredOperations.pop();if(c)return c.resolve(),c.promise}function q(a,b){var c=ya[a.name],d=c.deferredOperations.pop();if(d)return d.reject(b),d.promise}function r(a,b){return new va(function(c,d){if(ya[a.name]=ya[a.name]||B(),a.db){if(!b)return c(a.db);o(a),a.db.close()}var e=[a.name];b&&e.push(a.version);var f=ua.open.apply(ua,e);b&&(f.onupgradeneeded=function(b){var c=f.result;try{c.createObjectStore(a.storeName),b.oldVersion<=1&&c.createObjectStore(wa)}catch(c){if("ConstraintError"!==c.name)throw c;console.warn('The database "'+a.name+'" has been upgraded from version '+b.oldVersion+" to version "+b.newVersion+', but the storage "'+a.storeName+'" already exists.')}}),f.onerror=function(a){a.preventDefault(),d(f.error)},f.onsuccess=function(){c(f.result),p(a)}})}function s(a){return r(a,!1)}function t(a){return r(a,!0)}function u(a,b){if(!a.db)return!0;var c=!a.db.objectStoreNames.contains(a.storeName),d=a.version<a.db.version,e=a.version>a.db.version;if(d&&(a.version!==b&&console.warn('The database "'+a.name+"\" can't be downgraded from version "+a.db.version+" to version "+a.version+"."),a.version=a.db.version),e||c){if(c){var f=a.db.version+1;f>a.version&&(a.version=f)}return!0}return!1}function v(a){return new va(function(b,c){var d=new FileReader;d.onerror=c,d.onloadend=function(c){var d=btoa(c.target.result||"");b({__local_forage_encoded_blob:!0,data:d,type:a.type})},d.readAsBinaryString(a)})}function w(a){return g([l(atob(a.data))],{type:a.type})}function x(a){return a&&a.__local_forage_encoded_blob}function y(a){var b=this,c=b._initReady().then(function(){var a=ya[b._dbInfo.name];if(a&&a.dbReady)return a.dbReady});return i(c,a,a),c}function z(a){o(a);for(var b=ya[a.name],c=b.forages,d=0;d<c.length;d++){var e=c[d];e._dbInfo.db&&(e._dbInfo.db.close(),e._dbInfo.db=null)}return a.db=null,s(a).then(function(b){return a.db=b,u(a)?t(a):b}).then(function(d){a.db=b.db=d;for(var e=0;e<c.length;e++)c[e]._dbInfo.db=d}).catch(function(b){throw q(a,b),b})}function A(a,b,c,d){void 0===d&&(d=1);try{var e=a.db.transaction(a.storeName,b);c(null,e)}catch(e){if(d>0&&(!a.db||"InvalidStateError"===e.name||"NotFoundError"===e.name))return va.resolve().then(function(){if(!a.db||"NotFoundError"===e.name&&!a.db.objectStoreNames.contains(a.storeName)&&a.version<=a.db.version)return a.db&&(a.version=a.db.version+1),t(a)}).then(function(){return z(a).then(function(){A(a,b,c,d-1)})}).catch(c);c(e)}}function B(){return{forages:[],db:null,dbReady:null,deferredOperations:[]}}function C(a){function b(){return va.resolve()}var c=this,d={db:null};if(a)for(var e in a)d[e]=a[e];var f=ya[d.name];f||(f=B(),ya[d.name]=f),f.forages.push(c),c._initReady||(c._initReady=c.ready,c.ready=y);for(var g=[],h=0;h<f.forages.length;h++){var i=f.forages[h];i!==c&&g.push(i._initReady().catch(b))}var j=f.forages.slice(0);return va.all(g).then(function(){return d.db=f.db,s(d)}).then(function(a){return d.db=a,u(d,c._defaultConfig.version)?t(d):a}).then(function(a){d.db=f.db=a,c._dbInfo=d;for(var b=0;b<j.length;b++){var e=j[b];e!==c&&(e._dbInfo.db=d.db,e._dbInfo.version=d.version)}})}function D(a,b){var c=this;a=j(a);var d=new va(function(b,d){c.ready().then(function(){A(c._dbInfo,Aa,function(e,f){if(e)return d(e);try{var g=f.objectStore(c._dbInfo.storeName),h=g.get(a);h.onsuccess=function(){var a=h.result;void 0===a&&(a=null),x(a)&&(a=w(a)),b(a)},h.onerror=function(){d(h.error)}}catch(a){d(a)}})}).catch(d)});return h(d,b),d}function E(a,b){var c=this,d=new va(function(b,d){c.ready().then(function(){A(c._dbInfo,Aa,function(e,f){if(e)return d(e);try{var g=f.objectStore(c._dbInfo.storeName),h=g.openCursor(),i=1;h.onsuccess=function(){var c=h.result;if(c){var d=c.value;x(d)&&(d=w(d));var e=a(d,c.key,i++);void 0!==e?b(e):c.continue()}else b()},h.onerror=function(){d(h.error)}}catch(a){d(a)}})}).catch(d)});return h(d,b),d}function F(a,b,c){var d=this;a=j(a);var e=new va(function(c,e){var f;d.ready().then(function(){return f=d._dbInfo,"[object Blob]"===za.call(b)?n(f.db).then(function(a){return a?b:v(b)}):b}).then(function(b){A(d._dbInfo,Ba,function(f,g){if(f)return e(f);try{var h=g.objectStore(d._dbInfo.storeName);null===b&&(b=void 0);var i=h.put(b,a);g.oncomplete=function(){void 0===b&&(b=null),c(b)},g.onabort=g.onerror=function(){var a=i.error?i.error:i.transaction.error;e(a)}}catch(a){e(a)}})}).catch(e)});return h(e,c),e}function G(a,b){var c=this;a=j(a);var d=new va(function(b,d){c.ready().then(function(){A(c._dbInfo,Ba,function(e,f){if(e)return d(e);try{var g=f.objectStore(c._dbInfo.storeName),h=g.delete(a);f.oncomplete=function(){b()},f.onerror=function(){d(h.error)},f.onabort=function(){var a=h.error?h.error:h.transaction.error;d(a)}}catch(a){d(a)}})}).catch(d)});return h(d,b),d}function H(a){var b=this,c=new va(function(a,c){b.ready().then(function(){A(b._dbInfo,Ba,function(d,e){if(d)return c(d);try{var f=e.objectStore(b._dbInfo.storeName),g=f.clear();e.oncomplete=function(){a()},e.onabort=e.onerror=function(){var a=g.error?g.error:g.transaction.error;c(a)}}catch(a){c(a)}})}).catch(c)});return h(c,a),c}function I(a){var b=this,c=new va(function(a,c){b.ready().then(function(){A(b._dbInfo,Aa,function(d,e){if(d)return c(d);try{var f=e.objectStore(b._dbInfo.storeName),g=f.count();g.onsuccess=function(){a(g.result)},g.onerror=function(){c(g.error)}}catch(a){c(a)}})}).catch(c)});return h(c,a),c}function J(a,b){var c=this,d=new va(function(b,d){if(a<0)return void b(null);c.ready().then(function(){A(c._dbInfo,Aa,function(e,f){if(e)return d(e);try{var g=f.objectStore(c._dbInfo.storeName),h=!1,i=g.openCursor();i.onsuccess=function(){var c=i.result;if(!c)return void b(null);0===a?b(c.key):h?b(c.key):(h=!0,c.advance(a))},i.onerror=function(){d(i.error)}}catch(a){d(a)}})}).catch(d)});return h(d,b),d}function K(a){var b=this,c=new va(function(a,c){b.ready().then(function(){A(b._dbInfo,Aa,function(d,e){if(d)return c(d);try{var f=e.objectStore(b._dbInfo.storeName),g=f.openCursor(),h=[];g.onsuccess=function(){var b=g.result;if(!b)return void a(h);h.push(b.key),b.continue()},g.onerror=function(){c(g.error)}}catch(a){c(a)}})}).catch(c)});return h(c,a),c}function L(a,b){b=k.apply(this,arguments);var c=this.config();a="function"!=typeof a&&a||{},a.name||(a.name=a.name||c.name,a.storeName=a.storeName||c.storeName);var d,e=this;if(a.name){var f=a.name===c.name&&e._dbInfo.db,g=f?va.resolve(e._dbInfo.db):s(a).then(function(b){var c=ya[a.name],d=c.forages;c.db=b;for(var e=0;e<d.length;e++)d[e]._dbInfo.db=b;return b});d=a.storeName?g.then(function(b){if(b.objectStoreNames.contains(a.storeName)){var c=b.version+1;o(a);var d=ya[a.name],e=d.forages;b.close();for(var f=0;f<e.length;f++){var g=e[f];g._dbInfo.db=null,g._dbInfo.version=c}return new va(function(b,d){var e=ua.open(a.name,c);e.onerror=function(a){e.result.close(),d(a)},e.onupgradeneeded=function(){e.result.deleteObjectStore(a.storeName)},e.onsuccess=function(){var a=e.result;a.close(),b(a)}}).then(function(a){d.db=a;for(var b=0;b<e.length;b++){var c=e[b];c._dbInfo.db=a,p(c._dbInfo)}}).catch(function(b){throw(q(a,b)||va.resolve()).catch(function(){}),b})}}):g.then(function(b){o(a);var c=ya[a.name],d=c.forages;b.close();for(var e=0;e<d.length;e++){d[e]._dbInfo.db=null}return new va(function(b,c){var d=ua.deleteDatabase(a.name);d.onerror=d.onblocked=function(a){var b=d.result;b&&b.close(),c(a)},d.onsuccess=function(){var a=d.result;a&&a.close(),b(a)}}).then(function(a){c.db=a;for(var b=0;b<d.length;b++)p(d[b]._dbInfo)}).catch(function(b){throw(q(a,b)||va.resolve()).catch(function(){}),b})})}else d=va.reject("Invalid arguments");return h(d,b),d}function M(){return"function"==typeof openDatabase}function N(a){var b,c,d,e,f,g=.75*a.length,h=a.length,i=0;"="===a[a.length-1]&&(g--,"="===a[a.length-2]&&g--);var j=new ArrayBuffer(g),k=new Uint8Array(j);for(b=0;b<h;b+=4)c=Da.indexOf(a[b]),d=Da.indexOf(a[b+1]),e=Da.indexOf(a[b+2]),f=Da.indexOf(a[b+3]),k[i++]=c<<2|d>>4,k[i++]=(15&d)<<4|e>>2,k[i++]=(3&e)<<6|63&f;return j}function O(a){var b,c=new Uint8Array(a),d="";for(b=0;b<c.length;b+=3)d+=Da[c[b]>>2],d+=Da[(3&c[b])<<4|c[b+1]>>4],d+=Da[(15&c[b+1])<<2|c[b+2]>>6],d+=Da[63&c[b+2]];return c.length%3==2?d=d.substring(0,d.length-1)+"=":c.length%3==1&&(d=d.substring(0,d.length-2)+"=="),d}function P(a,b){var c="";if(a&&(c=Ua.call(a)),a&&("[object ArrayBuffer]"===c||a.buffer&&"[object ArrayBuffer]"===Ua.call(a.buffer))){var d,e=Ga;a instanceof ArrayBuffer?(d=a,e+=Ia):(d=a.buffer,"[object Int8Array]"===c?e+=Ka:"[object Uint8Array]"===c?e+=La:"[object Uint8ClampedArray]"===c?e+=Ma:"[object Int16Array]"===c?e+=Na:"[object Uint16Array]"===c?e+=Pa:"[object Int32Array]"===c?e+=Oa:"[object Uint32Array]"===c?e+=Qa:"[object Float32Array]"===c?e+=Ra:"[object Float64Array]"===c?e+=Sa:b(new Error("Failed to get type for BinaryArray"))),b(e+O(d))}else if("[object Blob]"===c){var f=new FileReader;f.onload=function(){var c=Ea+a.type+"~"+O(this.result);b(Ga+Ja+c)},f.readAsArrayBuffer(a)}else try{b(JSON.stringify(a))}catch(c){console.error("Couldn't convert value into a JSON string: ",a),b(null,c)}}function Q(a){if(a.substring(0,Ha)!==Ga)return JSON.parse(a);var b,c=a.substring(Ta),d=a.substring(Ha,Ta);if(d===Ja&&Fa.test(c)){var e=c.match(Fa);b=e[1],c=c.substring(e[0].length)}var f=N(c);switch(d){case Ia:return f;case Ja:return g([f],{type:b});case Ka:return new Int8Array(f);case La:return new Uint8Array(f);case Ma:return new Uint8ClampedArray(f);case Na:return new Int16Array(f);case Pa:return new Uint16Array(f);case Oa:return new Int32Array(f);case Qa:return new Uint32Array(f);case Ra:return new Float32Array(f);case Sa:return new Float64Array(f);default:throw new Error("Unkown type: "+d)}}function R(a,b,c,d){a.executeSql("CREATE TABLE IF NOT EXISTS "+b.storeName+" (id INTEGER PRIMARY KEY, key unique, value)",[],c,d)}function S(a){var b=this,c={db:null};if(a)for(var d in a)c[d]="string"!=typeof a[d]?a[d].toString():a[d];var e=new va(function(a,d){try{c.db=openDatabase(c.name,String(c.version),c.description,c.size)}catch(a){return d(a)}c.db.transaction(function(e){R(e,c,function(){b._dbInfo=c,a()},function(a,b){d(b)})},d)});return c.serializer=Va,e}function T(a,b,c,d,e,f){a.executeSql(c,d,e,function(a,g){g.code===g.SYNTAX_ERR?a.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name = ?",[name],function(a,h){h.rows.length?f(a,g):R(a,b,function(){a.executeSql(c,d,e,f)},f)},f):f(a,g)},f)}function U(a,b){var c=this;a=j(a);var d=new va(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){T(c,e,"SELECT * FROM "+e.storeName+" WHERE key = ? LIMIT 1",[a],function(a,c){var d=c.rows.length?c.rows.item(0).value:null;d&&(d=e.serializer.deserialize(d)),b(d)},function(a,b){d(b)})})}).catch(d)});return h(d,b),d}function V(a,b){var c=this,d=new va(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){T(c,e,"SELECT * FROM "+e.storeName,[],function(c,d){for(var f=d.rows,g=f.length,h=0;h<g;h++){var i=f.item(h),j=i.value;if(j&&(j=e.serializer.deserialize(j)),void 0!==(j=a(j,i.key,h+1)))return void b(j)}b()},function(a,b){d(b)})})}).catch(d)});return h(d,b),d}function W(a,b,c,d){var e=this;a=j(a);var f=new va(function(f,g){e.ready().then(function(){void 0===b&&(b=null);var h=b,i=e._dbInfo;i.serializer.serialize(b,function(b,j){j?g(j):i.db.transaction(function(c){T(c,i,"INSERT OR REPLACE INTO "+i.storeName+" (key, value) VALUES (?, ?)",[a,b],function(){f(h)},function(a,b){g(b)})},function(b){if(b.code===b.QUOTA_ERR){if(d>0)return void f(W.apply(e,[a,h,c,d-1]));g(b)}})})}).catch(g)});return h(f,c),f}function X(a,b,c){return W.apply(this,[a,b,c,1])}function Y(a,b){var c=this;a=j(a);var d=new va(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){T(c,e,"DELETE FROM "+e.storeName+" WHERE key = ?",[a],function(){b()},function(a,b){d(b)})})}).catch(d)});return h(d,b),d}function Z(a){var b=this,c=new va(function(a,c){b.ready().then(function(){var d=b._dbInfo;d.db.transaction(function(b){T(b,d,"DELETE FROM "+d.storeName,[],function(){a()},function(a,b){c(b)})})}).catch(c)});return h(c,a),c}function $(a){var b=this,c=new va(function(a,c){b.ready().then(function(){var d=b._dbInfo;d.db.transaction(function(b){T(b,d,"SELECT COUNT(key) as c FROM "+d.storeName,[],function(b,c){var d=c.rows.item(0).c;a(d)},function(a,b){c(b)})})}).catch(c)});return h(c,a),c}function _(a,b){var c=this,d=new va(function(b,d){c.ready().then(function(){var e=c._dbInfo;e.db.transaction(function(c){T(c,e,"SELECT key FROM "+e.storeName+" WHERE id = ? LIMIT 1",[a+1],function(a,c){var d=c.rows.length?c.rows.item(0).key:null;b(d)},function(a,b){d(b)})})}).catch(d)});return h(d,b),d}function aa(a){var b=this,c=new va(function(a,c){b.ready().then(function(){var d=b._dbInfo;d.db.transaction(function(b){T(b,d,"SELECT key FROM "+d.storeName,[],function(b,c){for(var d=[],e=0;e<c.rows.length;e++)d.push(c.rows.item(e).key);a(d)},function(a,b){c(b)})})}).catch(c)});return h(c,a),c}function ba(a){return new va(function(b,c){a.transaction(function(d){d.executeSql("SELECT name FROM sqlite_master WHERE type='table' AND name <> '__WebKitDatabaseInfoTable__'",[],function(c,d){for(var e=[],f=0;f<d.rows.length;f++)e.push(d.rows.item(f).name);b({db:a,storeNames:e})},function(a,b){c(b)})},function(a){c(a)})})}function ca(a,b){b=k.apply(this,arguments);var c=this.config();a="function"!=typeof a&&a||{},a.name||(a.name=a.name||c.name,a.storeName=a.storeName||c.storeName);var d,e=this;return d=a.name?new va(function(b){var d;d=a.name===c.name?e._dbInfo.db:openDatabase(a.name,"","",0),b(a.storeName?{db:d,storeNames:[a.storeName]}:ba(d))}).then(function(a){return new va(function(b,c){a.db.transaction(function(d){function e(a){return new va(function(b,c){d.executeSql("DROP TABLE IF EXISTS "+a,[],function(){b()},function(a,b){c(b)})})}for(var f=[],g=0,h=a.storeNames.length;g<h;g++)f.push(e(a.storeNames[g]));va.all(f).then(function(){b()}).catch(function(a){c(a)})},function(a){c(a)})})}):va.reject("Invalid arguments"),h(d,b),d}function da(){try{return"undefined"!=typeof localStorage&&"setItem"in localStorage&&!!localStorage.setItem}catch(a){return!1}}function ea(a,b){var c=a.name+"/";return a.storeName!==b.storeName&&(c+=a.storeName+"/"),c}function fa(){var a="_localforage_support_test";try{return localStorage.setItem(a,!0),localStorage.removeItem(a),!1}catch(a){return!0}}function ga(){return!fa()||localStorage.length>0}function ha(a){var b=this,c={};if(a)for(var d in a)c[d]=a[d];return c.keyPrefix=ea(a,b._defaultConfig),ga()?(b._dbInfo=c,c.serializer=Va,va.resolve()):va.reject()}function ia(a){var b=this,c=b.ready().then(function(){for(var a=b._dbInfo.keyPrefix,c=localStorage.length-1;c>=0;c--){var d=localStorage.key(c);0===d.indexOf(a)&&localStorage.removeItem(d)}});return h(c,a),c}function ja(a,b){var c=this;a=j(a);var d=c.ready().then(function(){var b=c._dbInfo,d=localStorage.getItem(b.keyPrefix+a);return d&&(d=b.serializer.deserialize(d)),d});return h(d,b),d}function ka(a,b){var c=this,d=c.ready().then(function(){for(var b=c._dbInfo,d=b.keyPrefix,e=d.length,f=localStorage.length,g=1,h=0;h<f;h++){var i=localStorage.key(h);if(0===i.indexOf(d)){var j=localStorage.getItem(i);if(j&&(j=b.serializer.deserialize(j)),void 0!==(j=a(j,i.substring(e),g++)))return j}}});return h(d,b),d}function la(a,b){var c=this,d=c.ready().then(function(){var b,d=c._dbInfo;try{b=localStorage.key(a)}catch(a){b=null}return b&&(b=b.substring(d.keyPrefix.length)),b});return h(d,b),d}function ma(a){var b=this,c=b.ready().then(function(){for(var a=b._dbInfo,c=localStorage.length,d=[],e=0;e<c;e++){var f=localStorage.key(e);0===f.indexOf(a.keyPrefix)&&d.push(f.substring(a.keyPrefix.length))}return d});return h(c,a),c}function na(a){var b=this,c=b.keys().then(function(a){return a.length});return h(c,a),c}function oa(a,b){var c=this;a=j(a);var d=c.ready().then(function(){var b=c._dbInfo;localStorage.removeItem(b.keyPrefix+a)});return h(d,b),d}function pa(a,b,c){var d=this;a=j(a);var e=d.ready().then(function(){void 0===b&&(b=null);var c=b;return new va(function(e,f){var g=d._dbInfo;g.serializer.serialize(b,function(b,d){if(d)f(d);else try{localStorage.setItem(g.keyPrefix+a,b),e(c)}catch(a){"QuotaExceededError"!==a.name&&"NS_ERROR_DOM_QUOTA_REACHED"!==a.name||f(a),f(a)}})})});return h(e,c),e}function qa(a,b){if(b=k.apply(this,arguments),a="function"!=typeof a&&a||{},!a.name){var c=this.config();a.name=a.name||c.name,a.storeName=a.storeName||c.storeName}var d,e=this;return d=a.name?new va(function(b){b(a.storeName?ea(a,e._defaultConfig):a.name+"/")}).then(function(a){for(var b=localStorage.length-1;b>=0;b--){var c=localStorage.key(b);0===c.indexOf(a)&&localStorage.removeItem(c)}}):va.reject("Invalid arguments"),h(d,b),d}function ra(a,b){a[b]=function(){var c=arguments;return a.ready().then(function(){return a[b].apply(a,c)})}}function sa(){for(var a=1;a<arguments.length;a++){var b=arguments[a];if(b)for(var c in b)b.hasOwnProperty(c)&&($a(b[c])?arguments[0][c]=b[c].slice():arguments[0][c]=b[c])}return arguments[0]}var ta="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(a){return typeof a}:function(a){return a&&"function"==typeof Symbol&&a.constructor===Symbol&&a!==Symbol.prototype?"symbol":typeof a},ua=e();"undefined"==typeof Promise&&a("lie/polyfill");var va=Promise,wa="local-forage-detect-blob-support",xa=void 0,ya={},za=Object.prototype.toString,Aa="readonly",Ba="readwrite",Ca={_driver:"asyncStorage",_initStorage:C,_support:f(),iterate:E,getItem:D,setItem:F,removeItem:G,clear:H,length:I,key:J,keys:K,dropInstance:L},Da="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",Ea="~~local_forage_type~",Fa=/^~~local_forage_type~([^~]+)~/,Ga="__lfsc__:",Ha=Ga.length,Ia="arbf",Ja="blob",Ka="si08",La="ui08",Ma="uic8",Na="si16",Oa="si32",Pa="ur16",Qa="ui32",Ra="fl32",Sa="fl64",Ta=Ha+Ia.length,Ua=Object.prototype.toString,Va={serialize:P,deserialize:Q,stringToBuffer:N,bufferToString:O},Wa={_driver:"webSQLStorage",_initStorage:S,_support:M(),iterate:V,getItem:U,setItem:X,removeItem:Y,clear:Z,length:$,key:_,keys:aa,dropInstance:ca},Xa={_driver:"localStorageWrapper",_initStorage:ha,_support:da(),iterate:ka,getItem:ja,setItem:pa,removeItem:oa,clear:ia,length:na,key:la,keys:ma,dropInstance:qa},Ya=function(a,b){return a===b||"number"==typeof a&&"number"==typeof b&&isNaN(a)&&isNaN(b)},Za=function(a,b){for(var c=a.length,d=0;d<c;){if(Ya(a[d],b))return!0;d++}return!1},$a=Array.isArray||function(a){return"[object Array]"===Object.prototype.toString.call(a)},_a={},ab={},bb={INDEXEDDB:Ca,WEBSQL:Wa,LOCALSTORAGE:Xa},cb=[bb.INDEXEDDB._driver,bb.WEBSQL._driver,bb.LOCALSTORAGE._driver],db=["dropInstance"],eb=["clear","getItem","iterate","key","keys","length","removeItem","setItem"].concat(db),fb={description:"",driver:cb.slice(),name:"localforage",size:4980736,storeName:"keyvaluepairs",version:1},gb=function(){function a(b){d(this,a);for(var c in bb)if(bb.hasOwnProperty(c)){var e=bb[c],f=e._driver;this[c]=f,_a[f]||this.defineDriver(e)}this._defaultConfig=sa({},fb),this._config=sa({},this._defaultConfig,b),this._driverSet=null,this._initDriver=null,this._ready=!1,this._dbInfo=null,this._wrapLibraryMethodsWithReady(),this.setDriver(this._config.driver).catch(function(){})}return a.prototype.config=function(a){if("object"===(void 0===a?"undefined":ta(a))){if(this._ready)return new Error("Can't call config() after localforage has been used.");for(var b in a){if("storeName"===b&&(a[b]=a[b].replace(/\W/g,"_")),"version"===b&&"number"!=typeof a[b])return new Error("Database version must be a number.");this._config[b]=a[b]}return!("driver"in a&&a.driver)||this.setDriver(this._config.driver)}return"string"==typeof a?this._config[a]:this._config},a.prototype.defineDriver=function(a,b,c){var d=new va(function(b,c){try{var d=a._driver,e=new Error("Custom driver not compliant; see https://mozilla.github.io/localForage/#definedriver");if(!a._driver)return void c(e);for(var f=eb.concat("_initStorage"),g=0,i=f.length;g<i;g++){var j=f[g];if((!Za(db,j)||a[j])&&"function"!=typeof a[j])return void c(e)}(function(){for(var b=function(a){return function(){var b=new Error("Method "+a+" is not implemented by the current driver"),c=va.reject(b);return h(c,arguments[arguments.length-1]),c}},c=0,d=db.length;c<d;c++){var e=db[c];a[e]||(a[e]=b(e))}})();var k=function(c){_a[d]&&console.info("Redefining LocalForage driver: "+d),_a[d]=a,ab[d]=c,b()};"_support"in a?a._support&&"function"==typeof a._support?a._support().then(k,c):k(!!a._support):k(!0)}catch(a){c(a)}});return i(d,b,c),d},a.prototype.driver=function(){return this._driver||null},a.prototype.getDriver=function(a,b,c){var d=_a[a]?va.resolve(_a[a]):va.reject(new Error("Driver not found."));return i(d,b,c),d},a.prototype.getSerializer=function(a){var b=va.resolve(Va);return i(b,a),b},a.prototype.ready=function(a){var b=this,c=b._driverSet.then(function(){return null===b._ready&&(b._ready=b._initDriver()),b._ready});return i(c,a,a),c},a.prototype.setDriver=function(a,b,c){function d(){g._config.driver=g.driver()}function e(a){return g._extend(a),d(),g._ready=g._initStorage(g._config),g._ready}function f(a){return function(){function b(){for(;c<a.length;){var f=a[c];return c++,g._dbInfo=null,g._ready=null,g.getDriver(f).then(e).catch(b)}d();var h=new Error("No available storage method found.");return g._driverSet=va.reject(h),g._driverSet}var c=0;return b()}}var g=this;$a(a)||(a=[a]);var h=this._getSupportedDrivers(a),j=null!==this._driverSet?this._driverSet.catch(function(){return va.resolve()}):va.resolve();return this._driverSet=j.then(function(){var a=h[0];return g._dbInfo=null,g._ready=null,g.getDriver(a).then(function(a){g._driver=a._driver,d(),g._wrapLibraryMethodsWithReady(),g._initDriver=f(h)})}).catch(function(){d();var a=new Error("No available storage method found.");return g._driverSet=va.reject(a),g._driverSet}),i(this._driverSet,b,c),this._driverSet},a.prototype.supports=function(a){return!!ab[a]},a.prototype._extend=function(a){sa(this,a)},a.prototype._getSupportedDrivers=function(a){for(var b=[],c=0,d=a.length;c<d;c++){var e=a[c];this.supports(e)&&b.push(e)}return b},a.prototype._wrapLibraryMethodsWithReady=function(){for(var a=0,b=eb.length;a<b;a++)ra(this,eb[a])},a.prototype.createInstance=function(b){return new a(b)},a}(),hb=new gb;b.exports=hb},{undefined:void 0}]},{},[1])(1)});

@@ -443,3 +443,3 @@ # localForage

Returns the name of the driver being used, or `null` if none can be used.
Returns the name of the driver being used, `null` during the asynchronous driver initialization process (see <a href="#driver-api-ready"><code>ready</code></a> for more details), or `null` if the asynchronous driver initialization process failed to find a usable driver.

@@ -500,1 +500,26 @@ <aside class="notice">

Creates a new instance of localForage and returns it. Each object contains its own database and doesn't affect other instances of localForage.
## dropInstance
```js
localforage.dropInstance().then(function() {
console.log('Dropped the store of the current instance').
});
localforage.dropInstance({
name: "otherName",
storeName: "otherStore"
}).then(function() {
console.log('Dropped otherStore').
});
localforage.dropInstance({
name: "otherName"
}).then(function() {
console.log('Dropped otherName database').
});
```
When invoked with no arguments, it drops the "store" of the current instance.
When invoked with an object specifying both `name` and `storeName` properties, it drops the specified "store".
When invoked with an object specifying only a `name` property, it drops the specified "database" (and all its stores).

@@ -147,2 +147,3 @@ var path = require('path');

'http://localhost:9999/test/test.min.html',
'http://localhost:9999/test/test.polyfill.html',
'http://localhost:9999/test/test.callwhenready.html',

@@ -149,0 +150,0 @@ 'http://localhost:9999/test/test.customdriver.html',

@@ -12,3 +12,3 @@ {

],
"version": "1.5.7",
"version": "1.6.0",
"homepage": "https://github.com/localForage/localForage",

@@ -21,2 +21,4 @@ "repository": {

"build": "node -e \"require('grunt').cli()\" null build",
"precommit": "lint-staged",
"prettify": "prettier --write \"src/**/*.js\" \"test/**/*.js\"",
"publish-docs": "node -e \"require('grunt').cli()\" null copy build-rules-html publish-rules",

@@ -38,2 +40,3 @@ "serve": "node -e \"require('grunt').cli()\" null serve",

"cors": "^2.3.1",
"eslint-config-prettier": "^2.9.0",
"grunt": "^0.4.2",

@@ -54,5 +57,8 @@ "grunt-babel": "^6.0.0",

"grunt-webpack": "^1.0.11",
"husky": "^0.14.3",
"lint-staged": "^5.0.0",
"load-grunt-tasks": "^0.4.0",
"mocha": "^3.4.2",
"phantomjs": "^2.1.7",
"prettier": "^1.9.2",
"rollupify": "^0.1.0",

@@ -59,0 +65,0 @@ "script-loader": "^0.6.1",

@@ -5,3 +5,4 @@ # localForage

[![Dependency Status](https://img.shields.io/david/localForage/localForage.svg)](https://david-dm.org/localForage/localForage)
[![npm](https://img.shields.io/npm/dm/localforage.svg?maxAge=2592000)]()
[![npm](https://img.shields.io/npm/dm/localforage.svg?maxAge=2592000)](https://npmcharts.com/compare/localforage?minimal=true)
[![jsDelivr Hits](https://data.jsdelivr.com/v1/package/npm/localforage/badge?style=rounded)](https://www.jsdelivr.com/package/npm/localforage)

@@ -205,2 +206,3 @@ localForage is a fast and simple storage library for JavaScript. localForage

* [AngularJS](https://github.com/ocombe/angular-localForage)
* [Angular 4+](https://www.npmjs.com/package/ngforage)
* [Backbone](https://github.com/localForage/localForage-backbone)

@@ -207,0 +209,0 @@ * [Ember](https://github.com/genkgo/ember-localforage-adapter)

@@ -8,2 +8,3 @@ import isIndexedDBValid from '../utils/isIndexedDBValid';

import normalizeKey from '../utils/normalizeKey';
import getCallback from '../utils/getCallback';

@@ -13,10 +14,10 @@ // Some code originally from async_storage.js in

var DETECT_BLOB_SUPPORT_STORE = 'local-forage-detect-blob-support';
var supportsBlobs;
var dbContexts;
var toString = Object.prototype.toString;
const DETECT_BLOB_SUPPORT_STORE = 'local-forage-detect-blob-support';
let supportsBlobs;
const dbContexts = {};
const toString = Object.prototype.toString;
// Transaction Modes
var READ_ONLY = 'readonly';
var READ_WRITE = 'readwrite';
const READ_ONLY = 'readonly';
const READ_WRITE = 'readwrite';

@@ -72,4 +73,7 @@ // Transform a binary string to an array buffer, because otherwise

// https://msdn.microsoft.com/en-us/library/hh869301%28v=vs.85%29.aspx
resolve(matchedEdge || !matchedChrome ||
parseInt(matchedChrome[1], 10) >= 43);
resolve(
matchedEdge ||
!matchedChrome ||
parseInt(matchedChrome[1], 10) >= 43
);
};

@@ -97,4 +101,5 @@ }).catch(function() {

deferredOperation.promise = new Promise(function(resolve) {
deferredOperation.promise = new Promise(function(resolve, reject) {
deferredOperation.resolve = resolve;
deferredOperation.reject = reject;
});

@@ -125,2 +130,3 @@

deferredOperation.resolve();
return deferredOperation.promise;
}

@@ -139,2 +145,3 @@ }

deferredOperation.reject(err);
return deferredOperation.promise;
}

@@ -145,2 +152,3 @@ }

return new Promise(function(resolve, reject) {
dbContexts[dbInfo.name] = dbContexts[dbInfo.name] || createDbContext();

@@ -175,6 +183,14 @@ if (dbInfo.db) {

if (ex.name === 'ConstraintError') {
console.warn('The database "' + dbInfo.name + '"' +
' has been upgraded from version ' + e.oldVersion +
' to version ' + e.newVersion +
', but the storage "' + dbInfo.storeName + '" already exists.');
console.warn(
'The database "' +
dbInfo.name +
'"' +
' has been upgraded from version ' +
e.oldVersion +
' to version ' +
e.newVersion +
', but the storage "' +
dbInfo.storeName +
'" already exists.'
);
} else {

@@ -220,5 +236,12 @@ throw ex;

if (dbInfo.version !== defaultVersion) {
console.warn('The database "' + dbInfo.name + '"' +
' can\'t be downgraded from version ' + dbInfo.db.version +
' to version ' + dbInfo.version + '.');
console.warn(
'The database "' +
dbInfo.name +
'"' +
" can't be downgraded from version " +
dbInfo.db.version +
' to version ' +
dbInfo.version +
'.'
);
}

@@ -266,3 +289,3 @@ // Align the versions to prevent errors.

var arrayBuff = _binStringToArrayBuffer(atob(encodedBlob.data));
return createBlob([arrayBuff], {type: encodedBlob.type});
return createBlob([arrayBuff], { type: encodedBlob.type });
}

@@ -304,22 +327,40 @@

for (var i = 0; i < forages.length; i++) {
if (forages[i]._dbInfo.db) {
forages[i]._dbInfo.db.close();
forages[i]._dbInfo.db = null;
const forage = forages[i];
if (forage._dbInfo.db) {
forage._dbInfo.db.close();
forage._dbInfo.db = null;
}
}
dbInfo.db = null;
return _getConnection(dbInfo, false).then(function(db) {
for (var j = 0; j < forages.length; j++) {
forages[j]._dbInfo.db = db;
}
}).catch(function(err) {
_rejectReadiness(dbInfo, err);
throw err;
});
return _getOriginalConnection(dbInfo)
.then(db => {
dbInfo.db = db;
if (_isUpgradeNeeded(dbInfo)) {
// Reopen the database for upgrading.
return _getUpgradedConnection(dbInfo);
}
return db;
})
.then(db => {
// store the latest db reference
// in case the db was upgraded
dbInfo.db = dbContext.db = db;
for (var i = 0; i < forages.length; i++) {
forages[i]._dbInfo.db = db;
}
})
.catch(err => {
_rejectReadiness(dbInfo, err);
throw err;
});
}
// FF doesn't like Promises (micro-tasks) and IDDB store operations,
// so we have to do it with callbacks
function createTransaction(dbInfo, mode, callback) {
function createTransaction(dbInfo, mode, callback, retries) {
if (retries === undefined) {
retries = 1;
}
try {

@@ -329,9 +370,32 @@ var tx = dbInfo.db.transaction(dbInfo.storeName, mode);

} catch (err) {
if (!dbInfo.db ||
err.name === 'InvalidStateError') {
return _tryReconnect(dbInfo).then(function() {
var tx = dbInfo.db.transaction(dbInfo.storeName, mode);
callback(null, tx);
});
if (
retries > 0 &&
(!dbInfo.db ||
err.name === 'InvalidStateError' ||
err.name === 'NotFoundError')
) {
return Promise.resolve()
.then(() => {
if (
!dbInfo.db ||
(err.name === 'NotFoundError' &&
!dbInfo.db.objectStoreNames.contains(
dbInfo.storeName
) &&
dbInfo.version <= dbInfo.db.version)
) {
// increase the db version, to create the new ObjectStore
if (dbInfo.db) {
dbInfo.version = dbInfo.db.version + 1;
}
// Reopen the database for upgrading.
return _getUpgradedConnection(dbInfo);
}
})
.then(() => {
return _tryReconnect(dbInfo).then(function() {
createTransaction(dbInfo, mode, callback, retries - 1);
});
})
.catch(callback);
}

@@ -343,2 +407,14 @@

function createDbContext() {
return {
// Running localForages sharing a database.
forages: [],
// Shared database.
db: null,
// Database readiness (promise).
dbReady: null,
// Deferred operations on the database.
deferredOperations: []
};
}

@@ -359,7 +435,2 @@ // Open the IndexedDB database (automatically creates one if one didn't

// Initialize a singleton container for all running localForages.
if (!dbContexts) {
dbContexts = {};
}
// Get the current context of the database;

@@ -370,12 +441,3 @@ var dbContext = dbContexts[dbInfo.name];

if (!dbContext) {
dbContext = {
// Running localForages sharing a database.
forages: [],
// Shared database.
db: null,
// Database readiness (promise).
dbReady: null,
// Deferred operations on the database.
deferredOperations: []
};
dbContext = createDbContext();
// Register the new context in the global container.

@@ -405,3 +467,4 @@ dbContexts[dbInfo.name] = dbContext;

var forage = dbContext.forages[j];
if (forage !== self) { // Don't wait for itself...
if (forage !== self) {
// Don't wait for itself...
initPromises.push(forage._initReady().catch(ignoreErrors));

@@ -416,28 +479,31 @@ }

// all the related localForages aren't pending.
return Promise.all(initPromises).then(function() {
dbInfo.db = dbContext.db;
// Get the connection or open a new one without upgrade.
return _getOriginalConnection(dbInfo);
}).then(function(db) {
dbInfo.db = db;
if (_isUpgradeNeeded(dbInfo, self._defaultConfig.version)) {
// Reopen the database for upgrading.
return _getUpgradedConnection(dbInfo);
}
return db;
}).then(function(db) {
dbInfo.db = dbContext.db = db;
self._dbInfo = dbInfo;
// Share the final connection amongst related localForages.
for (var k = 0; k < forages.length; k++) {
var forage = forages[k];
if (forage !== self) { // Self is already up-to-date.
forage._dbInfo.db = dbInfo.db;
forage._dbInfo.version = dbInfo.version;
return Promise.all(initPromises)
.then(function() {
dbInfo.db = dbContext.db;
// Get the connection or open a new one without upgrade.
return _getOriginalConnection(dbInfo);
})
.then(function(db) {
dbInfo.db = db;
if (_isUpgradeNeeded(dbInfo, self._defaultConfig.version)) {
// Reopen the database for upgrading.
return _getUpgradedConnection(dbInfo);
}
}
});
return db;
})
.then(function(db) {
dbInfo.db = dbContext.db = db;
self._dbInfo = dbInfo;
// Share the final connection amongst related localForages.
for (var k = 0; k < forages.length; k++) {
var forage = forages[k];
if (forage !== self) {
// Self is already up-to-date.
forage._dbInfo.db = dbInfo.db;
forage._dbInfo.version = dbInfo.version;
}
}
});
}
function getItem(key, callback) {

@@ -449,31 +515,39 @@ var self = this;

var promise = new Promise(function(resolve, reject) {
self.ready().then(function() {
createTransaction(self._dbInfo, READ_ONLY, function(err, transaction) {
if (err) {
return reject(err);
}
self
.ready()
.then(function() {
createTransaction(self._dbInfo, READ_ONLY, function(
err,
transaction
) {
if (err) {
return reject(err);
}
try {
var store = transaction.objectStore(self._dbInfo.storeName);
var req = store.get(key);
try {
var store = transaction.objectStore(
self._dbInfo.storeName
);
var req = store.get(key);
req.onsuccess = function() {
var value = req.result;
if (value === undefined) {
value = null;
}
if (_isEncodedBlob(value)) {
value = _decodeBlob(value);
}
resolve(value);
};
req.onsuccess = function() {
var value = req.result;
if (value === undefined) {
value = null;
}
if (_isEncodedBlob(value)) {
value = _decodeBlob(value);
}
resolve(value);
};
req.onerror = function() {
reject(req.error);
};
} catch (e) {
reject(e);
}
});
}).catch(reject);
req.onerror = function() {
reject(req.error);
};
} catch (e) {
reject(e);
}
});
})
.catch(reject);
});

@@ -490,45 +564,56 @@

var promise = new Promise(function(resolve, reject) {
self.ready().then(function() {
createTransaction(self._dbInfo, READ_ONLY, function(err, transaction) {
if (err) {
return reject(err);
}
self
.ready()
.then(function() {
createTransaction(self._dbInfo, READ_ONLY, function(
err,
transaction
) {
if (err) {
return reject(err);
}
try {
var store = transaction.objectStore(self._dbInfo.storeName);
var req = store.openCursor();
var iterationNumber = 1;
try {
var store = transaction.objectStore(
self._dbInfo.storeName
);
var req = store.openCursor();
var iterationNumber = 1;
req.onsuccess = function() {
var cursor = req.result;
req.onsuccess = function() {
var cursor = req.result;
if (cursor) {
var value = cursor.value;
if (_isEncodedBlob(value)) {
value = _decodeBlob(value);
}
var result = iterator(value, cursor.key,
iterationNumber++);
if (cursor) {
var value = cursor.value;
if (_isEncodedBlob(value)) {
value = _decodeBlob(value);
}
var result = iterator(
value,
cursor.key,
iterationNumber++
);
// when the iterator callback retuns any
// (non-`undefined`) value, then we stop
// the iteration immediately
if (result !== void(0)) {
resolve(result);
// when the iterator callback retuns any
// (non-`undefined`) value, then we stop
// the iteration immediately
if (result !== void 0) {
resolve(result);
} else {
cursor.continue();
}
} else {
cursor.continue();
resolve();
}
} else {
resolve();
}
};
};
req.onerror = function() {
reject(req.error);
};
} catch (e) {
reject(e);
}
});
}).catch(reject);
req.onerror = function() {
reject(req.error);
};
} catch (e) {
reject(e);
}
});
})
.catch(reject);
});

@@ -548,54 +633,67 @@

var dbInfo;
self.ready().then(function() {
dbInfo = self._dbInfo;
if (toString.call(value) === '[object Blob]') {
return _checkBlobSupport(dbInfo.db).then(function(blobSupport) {
if (blobSupport) {
return value;
}
return _encodeBlob(value);
});
}
return value;
}).then(function(value) {
createTransaction(self._dbInfo, READ_WRITE, function(err, transaction) {
if (err) {
return reject(err);
self
.ready()
.then(function() {
dbInfo = self._dbInfo;
if (toString.call(value) === '[object Blob]') {
return _checkBlobSupport(dbInfo.db).then(function(
blobSupport
) {
if (blobSupport) {
return value;
}
return _encodeBlob(value);
});
}
try {
var store = transaction.objectStore(self._dbInfo.storeName);
// The reason we don't _save_ null is because IE 10 does
// not support saving the `null` type in IndexedDB. How
// ironic, given the bug below!
// See: https://github.com/mozilla/localForage/issues/161
if (value === null) {
value = undefined;
return value;
})
.then(function(value) {
createTransaction(self._dbInfo, READ_WRITE, function(
err,
transaction
) {
if (err) {
return reject(err);
}
var req = store.put(value, key);
try {
var store = transaction.objectStore(
self._dbInfo.storeName
);
transaction.oncomplete = function() {
// Cast to undefined so the value passed to
// callback/promise is the same as what one would get out
// of `getItem()` later. This leads to some weirdness
// (setItem('foo', undefined) will return `null`), but
// it's not my fault localStorage is our baseline and that
// it's weird.
if (value === undefined) {
value = null;
// The reason we don't _save_ null is because IE 10 does
// not support saving the `null` type in IndexedDB. How
// ironic, given the bug below!
// See: https://github.com/mozilla/localForage/issues/161
if (value === null) {
value = undefined;
}
resolve(value);
};
transaction.onabort = transaction.onerror = function() {
var err = req.error ? req.error : req.transaction.error;
reject(err);
};
} catch (e) {
reject(e);
}
});
}).catch(reject);
var req = store.put(value, key);
transaction.oncomplete = function() {
// Cast to undefined so the value passed to
// callback/promise is the same as what one would get out
// of `getItem()` later. This leads to some weirdness
// (setItem('foo', undefined) will return `null`), but
// it's not my fault localStorage is our baseline and that
// it's weird.
if (value === undefined) {
value = null;
}
resolve(value);
};
transaction.onabort = transaction.onerror = function() {
var err = req.error
? req.error
: req.transaction.error;
reject(err);
};
} catch (e) {
reject(e);
}
});
})
.catch(reject);
});

@@ -613,35 +711,45 @@

var promise = new Promise(function(resolve, reject) {
self.ready().then(function() {
createTransaction(self._dbInfo, READ_WRITE, function(err, transaction) {
if (err) {
return reject(err);
}
self
.ready()
.then(function() {
createTransaction(self._dbInfo, READ_WRITE, function(
err,
transaction
) {
if (err) {
return reject(err);
}
try {
var store = transaction.objectStore(self._dbInfo.storeName);
// We use a Grunt task to make this safe for IE and some
// versions of Android (including those used by Cordova).
// Normally IE won't like `.delete()` and will insist on
// using `['delete']()`, but we have a build step that
// fixes this for us now.
var req = store.delete(key);
transaction.oncomplete = function() {
resolve();
};
try {
var store = transaction.objectStore(
self._dbInfo.storeName
);
// We use a Grunt task to make this safe for IE and some
// versions of Android (including those used by Cordova).
// Normally IE won't like `.delete()` and will insist on
// using `['delete']()`, but we have a build step that
// fixes this for us now.
var req = store.delete(key);
transaction.oncomplete = function() {
resolve();
};
transaction.onerror = function() {
reject(req.error);
};
transaction.onerror = function() {
reject(req.error);
};
// The request will be also be aborted if we've exceeded our storage
// space.
transaction.onabort = function() {
var err = req.error ? req.error : req.transaction.error;
reject(err);
};
} catch (e) {
reject(e);
}
});
}).catch(reject);
// The request will be also be aborted if we've exceeded our storage
// space.
transaction.onabort = function() {
var err = req.error
? req.error
: req.transaction.error;
reject(err);
};
} catch (e) {
reject(e);
}
});
})
.catch(reject);
});

@@ -657,25 +765,35 @@

var promise = new Promise(function(resolve, reject) {
self.ready().then(function() {
createTransaction(self._dbInfo, READ_WRITE, function(err, transaction) {
if (err) {
return reject(err);
}
self
.ready()
.then(function() {
createTransaction(self._dbInfo, READ_WRITE, function(
err,
transaction
) {
if (err) {
return reject(err);
}
try {
var store = transaction.objectStore(self._dbInfo.storeName);
var req = store.clear();
try {
var store = transaction.objectStore(
self._dbInfo.storeName
);
var req = store.clear();
transaction.oncomplete = function() {
resolve();
};
transaction.oncomplete = function() {
resolve();
};
transaction.onabort = transaction.onerror = function() {
var err = req.error ? req.error : req.transaction.error;
reject(err);
};
} catch (e) {
reject(e);
}
});
}).catch(reject);
transaction.onabort = transaction.onerror = function() {
var err = req.error
? req.error
: req.transaction.error;
reject(err);
};
} catch (e) {
reject(e);
}
});
})
.catch(reject);
});

@@ -691,24 +809,32 @@

var promise = new Promise(function(resolve, reject) {
self.ready().then(function() {
createTransaction(self._dbInfo, READ_ONLY, function(err, transaction) {
if (err) {
return reject(err);
}
self
.ready()
.then(function() {
createTransaction(self._dbInfo, READ_ONLY, function(
err,
transaction
) {
if (err) {
return reject(err);
}
try {
var store = transaction.objectStore(self._dbInfo.storeName);
var req = store.count();
try {
var store = transaction.objectStore(
self._dbInfo.storeName
);
var req = store.count();
req.onsuccess = function() {
resolve(req.result);
};
req.onsuccess = function() {
resolve(req.result);
};
req.onerror = function() {
reject(req.error);
};
} catch (e) {
reject(e);
}
});
}).catch(reject);
req.onerror = function() {
reject(req.error);
};
} catch (e) {
reject(e);
}
});
})
.catch(reject);
});

@@ -730,47 +856,55 @@

self.ready().then(function() {
createTransaction(self._dbInfo, READ_ONLY, function(err, transaction) {
if (err) {
return reject(err);
}
self
.ready()
.then(function() {
createTransaction(self._dbInfo, READ_ONLY, function(
err,
transaction
) {
if (err) {
return reject(err);
}
try {
var store = transaction.objectStore(self._dbInfo.storeName);
var advanced = false;
var req = store.openCursor();
try {
var store = transaction.objectStore(
self._dbInfo.storeName
);
var advanced = false;
var req = store.openCursor();
req.onsuccess = function() {
var cursor = req.result;
if (!cursor) {
// this means there weren't enough keys
resolve(null);
req.onsuccess = function() {
var cursor = req.result;
if (!cursor) {
// this means there weren't enough keys
resolve(null);
return;
}
return;
}
if (n === 0) {
// We have the first key, return it if that's what they
// wanted.
resolve(cursor.key);
} else {
if (!advanced) {
// Otherwise, ask the cursor to skip ahead n
// records.
advanced = true;
cursor.advance(n);
if (n === 0) {
// We have the first key, return it if that's what they
// wanted.
resolve(cursor.key);
} else {
// When we get here, we've got the nth key.
resolve(cursor.key);
if (!advanced) {
// Otherwise, ask the cursor to skip ahead n
// records.
advanced = true;
cursor.advance(n);
} else {
// When we get here, we've got the nth key.
resolve(cursor.key);
}
}
}
};
};
req.onerror = function() {
reject(req.error);
};
} catch (e) {
reject(e);
}
});
}).catch(reject);
req.onerror = function() {
reject(req.error);
};
} catch (e) {
reject(e);
}
});
})
.catch(reject);
});

@@ -786,34 +920,184 @@

var promise = new Promise(function(resolve, reject) {
self.ready().then(function() {
createTransaction(self._dbInfo, READ_ONLY, function(err, transaction) {
if (err) {
return reject(err);
self
.ready()
.then(function() {
createTransaction(self._dbInfo, READ_ONLY, function(
err,
transaction
) {
if (err) {
return reject(err);
}
try {
var store = transaction.objectStore(
self._dbInfo.storeName
);
var req = store.openCursor();
var keys = [];
req.onsuccess = function() {
var cursor = req.result;
if (!cursor) {
resolve(keys);
return;
}
keys.push(cursor.key);
cursor.continue();
};
req.onerror = function() {
reject(req.error);
};
} catch (e) {
reject(e);
}
});
})
.catch(reject);
});
executeCallback(promise, callback);
return promise;
}
function dropInstance(options, callback) {
callback = getCallback.apply(this, arguments);
var currentConfig = this.config();
options = (typeof options !== 'function' && options) || {};
if (!options.name) {
options.name = options.name || currentConfig.name;
options.storeName = options.storeName || currentConfig.storeName;
}
var self = this;
var promise;
if (!options.name) {
promise = Promise.reject('Invalid arguments');
} else {
const isCurrentDb =
options.name === currentConfig.name && self._dbInfo.db;
const dbPromise = isCurrentDb
? Promise.resolve(self._dbInfo.db)
: _getOriginalConnection(options).then(db => {
const dbContext = dbContexts[options.name];
const forages = dbContext.forages;
dbContext.db = db;
for (var i = 0; i < forages.length; i++) {
forages[i]._dbInfo.db = db;
}
return db;
});
if (!options.storeName) {
promise = dbPromise.then(db => {
_deferReadiness(options);
const dbContext = dbContexts[options.name];
const forages = dbContext.forages;
db.close();
for (var i = 0; i < forages.length; i++) {
const forage = forages[i];
forage._dbInfo.db = null;
}
try {
var store = transaction.objectStore(self._dbInfo.storeName);
var req = store.openCursor();
var keys = [];
const dropDBPromise = new Promise((resolve, reject) => {
var req = idb.deleteDatabase(options.name);
req.onsuccess = function() {
var cursor = req.result;
req.onerror = req.onblocked = err => {
const db = req.result;
if (db) {
db.close();
}
reject(err);
};
if (!cursor) {
resolve(keys);
return;
req.onsuccess = () => {
const db = req.result;
if (db) {
db.close();
}
resolve(db);
};
});
keys.push(cursor.key);
cursor.continue();
return dropDBPromise
.then(db => {
dbContext.db = db;
for (var i = 0; i < forages.length; i++) {
const forage = forages[i];
_advanceReadiness(forage._dbInfo);
}
})
.catch(err => {
(
_rejectReadiness(options, err) || Promise.resolve()
).catch(() => {});
throw err;
});
});
} else {
promise = dbPromise.then(db => {
if (!db.objectStoreNames.contains(options.storeName)) {
return;
}
const newVersion = db.version + 1;
_deferReadiness(options);
const dbContext = dbContexts[options.name];
const forages = dbContext.forages;
db.close();
for (let i = 0; i < forages.length; i++) {
const forage = forages[i];
forage._dbInfo.db = null;
forage._dbInfo.version = newVersion;
}
const dropObjectPromise = new Promise((resolve, reject) => {
const req = idb.open(options.name, newVersion);
req.onerror = err => {
const db = req.result;
db.close();
reject(err);
};
req.onerror = function() {
reject(req.error);
req.onupgradeneeded = () => {
var db = req.result;
db.deleteObjectStore(options.storeName);
};
} catch (e) {
reject(e);
}
req.onsuccess = () => {
const db = req.result;
db.close();
resolve(db);
};
});
return dropObjectPromise
.then(db => {
dbContext.db = db;
for (let j = 0; j < forages.length; j++) {
const forage = forages[j];
forage._dbInfo.db = db;
_advanceReadiness(forage._dbInfo);
}
})
.catch(err => {
(
_rejectReadiness(options, err) || Promise.resolve()
).catch(() => {});
throw err;
});
});
}).catch(reject);
});
}
}

@@ -835,4 +1119,5 @@ executeCallback(promise, callback);

key: key,
keys: keys
keys: keys,
dropInstance: dropInstance
};
export default asyncStorage;

@@ -11,3 +11,13 @@ // If IndexedDB isn't available, we'll fall back to localStorage.

import normalizeKey from '../utils/normalizeKey';
import getCallback from '../utils/getCallback';
function _getKeyPrefix(options, defaultConfig) {
var keyPrefix = options.name + '/';
if (options.storeName !== defaultConfig.storeName) {
keyPrefix += options.storeName + '/';
}
return keyPrefix;
}
// Check if localStorage throws when saving an item

@@ -45,8 +55,4 @@ function checkIfLocalStorageThrows() {

dbInfo.keyPrefix = dbInfo.name + '/';
dbInfo.keyPrefix = _getKeyPrefix(options, self._defaultConfig);
if (dbInfo.storeName !== self._defaultConfig.storeName) {
dbInfo.keyPrefix += dbInfo.storeName + '/';
}
if (!_isLocalStorageUsable()) {

@@ -142,6 +148,9 @@ return Promise.reject();

value = iterator(value, key.substring(keyPrefixLength),
iterationNumber++);
value = iterator(
value,
key.substring(keyPrefixLength),
iterationNumber++
);
if (value !== void(0)) {
if (value !== void 0) {
return value;

@@ -258,4 +267,6 @@ }

// TODO: Make this a specific error/event.
if (e.name === 'QuotaExceededError' ||
e.name === 'NS_ERROR_DOM_QUOTA_REACHED') {
if (
e.name === 'QuotaExceededError' ||
e.name === 'NS_ERROR_DOM_QUOTA_REACHED'
) {
reject(e);

@@ -274,2 +285,38 @@ }

function dropInstance(options, callback) {
callback = getCallback.apply(this, arguments);
options = (typeof options !== 'function' && options) || {};
if (!options.name) {
var currentConfig = this.config();
options.name = options.name || currentConfig.name;
options.storeName = options.storeName || currentConfig.storeName;
}
var self = this;
var promise;
if (!options.name) {
promise = Promise.reject('Invalid arguments');
} else {
promise = new Promise(function(resolve) {
if (!options.storeName) {
resolve(`${options.name}/`);
} else {
resolve(_getKeyPrefix(options, self._defaultConfig));
}
}).then(function(keyPrefix) {
for (var i = localStorage.length - 1; i >= 0; i--) {
var key = localStorage.key(i);
if (key.indexOf(keyPrefix) === 0) {
localStorage.removeItem(key);
}
}
});
}
executeCallback(promise, callback);
return promise;
}
var localStorageWrapper = {

@@ -286,5 +333,6 @@ _driver: 'localStorageWrapper',

key: key,
keys: keys
keys: keys,
dropInstance: dropInstance
};
export default localStorageWrapper;

@@ -6,2 +6,3 @@ import isWebSQLValid from '../utils/isWebSQLValid';

import normalizeKey from '../utils/normalizeKey';
import getCallback from '../utils/getCallback';

@@ -17,2 +18,13 @@ /*

*/
function createDbTable(t, dbInfo, callback, errorCallback) {
t.executeSql(
`CREATE TABLE IF NOT EXISTS ${dbInfo.storeName} ` +
'(id INTEGER PRIMARY KEY, key unique, value)',
[],
callback,
errorCallback
);
}
// Open the WebSQL database (automatically creates one if one didn't

@@ -28,4 +40,6 @@ // previously exist), using any options set in the config.

for (var i in options) {
dbInfo[i] = typeof(options[i]) !== 'string' ?
options[i].toString() : options[i];
dbInfo[i] =
typeof options[i] !== 'string'
? options[i].toString()
: options[i];
}

@@ -38,4 +52,8 @@ }

try {
dbInfo.db = openDatabase(dbInfo.name, String(dbInfo.version),
dbInfo.description, dbInfo.size);
dbInfo.db = openDatabase(
dbInfo.name,
String(dbInfo.version),
dbInfo.description,
dbInfo.size
);
} catch (e) {

@@ -47,12 +65,14 @@ return reject(e);

dbInfo.db.transaction(function(t) {
t.executeSql(
'CREATE TABLE IF NOT EXISTS ' + dbInfo.storeName +
' (id INTEGER PRIMARY KEY, key unique, value)', [],
createDbTable(
t,
dbInfo,
function() {
self._dbInfo = dbInfo;
resolve();
}, function(t, error) {
},
function(t, error) {
reject(error);
});
});
}
);
}, reject);
});

@@ -64,2 +84,44 @@

function tryExecuteSql(t, dbInfo, sqlStatement, args, callback, errorCallback) {
t.executeSql(
sqlStatement,
args,
callback,
function(t, error) {
if (error.code === error.SYNTAX_ERR) {
t.executeSql(
'SELECT name FROM sqlite_master ' +
"WHERE type='table' AND name = ?",
[name],
function(t, results) {
if (!results.rows.length) {
// if the table is missing (was deleted)
// re-create it table and retry
createDbTable(
t,
dbInfo,
function() {
t.executeSql(
sqlStatement,
args,
callback,
errorCallback
);
},
errorCallback
);
} else {
errorCallback(t, error);
}
},
errorCallback
);
} else {
errorCallback(t, error);
}
},
errorCallback
);
}
function getItem(key, callback) {

@@ -71,25 +133,34 @@ var self = this;

var promise = new Promise(function(resolve, reject) {
self.ready().then(function() {
var dbInfo = self._dbInfo;
dbInfo.db.transaction(function(t) {
t.executeSql(
'SELECT * FROM ' + dbInfo.storeName +
' WHERE key = ? LIMIT 1', [key],
function(t, results) {
var result = results.rows.length ?
results.rows.item(0).value : null;
self
.ready()
.then(function() {
var dbInfo = self._dbInfo;
dbInfo.db.transaction(function(t) {
tryExecuteSql(
t,
dbInfo,
`SELECT * FROM ${
dbInfo.storeName
} WHERE key = ? LIMIT 1`,
[key],
function(t, results) {
var result = results.rows.length
? results.rows.item(0).value
: null;
// Check to see if this is serialized content we need to
// unpack.
if (result) {
result = dbInfo.serializer.deserialize(result);
// Check to see if this is serialized content we need to
// unpack.
if (result) {
result = dbInfo.serializer.deserialize(result);
}
resolve(result);
},
function(t, error) {
reject(error);
}
resolve(result);
}, function(t, error) {
reject(error);
});
});
}).catch(reject);
);
});
})
.catch(reject);
});

@@ -105,38 +176,48 @@

var promise = new Promise(function(resolve, reject) {
self.ready().then(function() {
var dbInfo = self._dbInfo;
self
.ready()
.then(function() {
var dbInfo = self._dbInfo;
dbInfo.db.transaction(function(t) {
t.executeSql(
'SELECT * FROM ' + dbInfo.storeName, [],
function(t, results) {
var rows = results.rows;
var length = rows.length;
dbInfo.db.transaction(function(t) {
tryExecuteSql(
t,
dbInfo,
`SELECT * FROM ${dbInfo.storeName}`,
[],
function(t, results) {
var rows = results.rows;
var length = rows.length;
for (var i = 0; i < length; i++) {
var item = rows.item(i);
var result = item.value;
for (var i = 0; i < length; i++) {
var item = rows.item(i);
var result = item.value;
// Check to see if this is serialized content
// we need to unpack.
if (result) {
result = dbInfo.serializer.deserialize(result);
}
// Check to see if this is serialized content
// we need to unpack.
if (result) {
result = dbInfo.serializer.deserialize(
result
);
}
result = iterator(result, item.key, i + 1);
result = iterator(result, item.key, i + 1);
// void(0) prevents problems with redefinition
// of `undefined`.
if (result !== void(0)) {
resolve(result);
return;
// void(0) prevents problems with redefinition
// of `undefined`.
if (result !== void 0) {
resolve(result);
return;
}
}
resolve();
},
function(t, error) {
reject(error);
}
resolve();
}, function(t, error) {
reject(error);
});
});
}).catch(reject);
);
});
})
.catch(reject);
});

@@ -154,50 +235,67 @@

var promise = new Promise(function(resolve, reject) {
self.ready().then(function() {
// The localStorage API doesn't return undefined values in an
// "expected" way, so undefined is always cast to null in all
// drivers. See: https://github.com/mozilla/localForage/pull/42
if (value === undefined) {
value = null;
}
self
.ready()
.then(function() {
// The localStorage API doesn't return undefined values in an
// "expected" way, so undefined is always cast to null in all
// drivers. See: https://github.com/mozilla/localForage/pull/42
if (value === undefined) {
value = null;
}
// Save the original value to pass to the callback.
var originalValue = value;
// Save the original value to pass to the callback.
var originalValue = value;
var dbInfo = self._dbInfo;
dbInfo.serializer.serialize(value, function(value, error) {
if (error) {
reject(error);
} else {
dbInfo.db.transaction(function(t) {
t.executeSql(
'INSERT OR REPLACE INTO ' +
dbInfo.storeName +
' (key, value) VALUES (?, ?)',
[key, value],
function() {
resolve(originalValue);
}, function(t, error) {
reject(error);
});
}, function(sqlError) {
// The transaction failed; check
// to see if it's a quota error.
if (sqlError.code === sqlError.QUOTA_ERR) {
// We reject the callback outright for now, but
// it's worth trying to re-run the transaction.
// Even if the user accepts the prompt to use
// more storage on Safari, this error will
// be called.
//
// Try to re-run the transaction.
if (retriesLeft > 0) {
resolve(_setItem.apply(self, [key, originalValue, callback, retriesLeft - 1]));
return;
var dbInfo = self._dbInfo;
dbInfo.serializer.serialize(value, function(value, error) {
if (error) {
reject(error);
} else {
dbInfo.db.transaction(
function(t) {
tryExecuteSql(
t,
dbInfo,
`INSERT OR REPLACE INTO ${
dbInfo.storeName
} ` + '(key, value) VALUES (?, ?)',
[key, value],
function() {
resolve(originalValue);
},
function(t, error) {
reject(error);
}
);
},
function(sqlError) {
// The transaction failed; check
// to see if it's a quota error.
if (sqlError.code === sqlError.QUOTA_ERR) {
// We reject the callback outright for now, but
// it's worth trying to re-run the transaction.
// Even if the user accepts the prompt to use
// more storage on Safari, this error will
// be called.
//
// Try to re-run the transaction.
if (retriesLeft > 0) {
resolve(
_setItem.apply(self, [
key,
originalValue,
callback,
retriesLeft - 1
])
);
return;
}
reject(sqlError);
}
}
reject(sqlError);
}
});
}
});
}).catch(reject);
);
}
});
})
.catch(reject);
});

@@ -219,15 +317,22 @@

var promise = new Promise(function(resolve, reject) {
self.ready().then(function() {
var dbInfo = self._dbInfo;
dbInfo.db.transaction(function(t) {
t.executeSql(
'DELETE FROM ' + dbInfo.storeName +
' WHERE key = ?', [key],
function() {
resolve();
}, function(t, error) {
reject(error);
});
});
}).catch(reject);
self
.ready()
.then(function() {
var dbInfo = self._dbInfo;
dbInfo.db.transaction(function(t) {
tryExecuteSql(
t,
dbInfo,
`DELETE FROM ${dbInfo.storeName} WHERE key = ?`,
[key],
function() {
resolve();
},
function(t, error) {
reject(error);
}
);
});
})
.catch(reject);
});

@@ -245,14 +350,22 @@

var promise = new Promise(function(resolve, reject) {
self.ready().then(function() {
var dbInfo = self._dbInfo;
dbInfo.db.transaction(function(t) {
t.executeSql(
'DELETE FROM ' + dbInfo.storeName, [],
function() {
resolve();
}, function(t, error) {
reject(error);
});
});
}).catch(reject);
self
.ready()
.then(function() {
var dbInfo = self._dbInfo;
dbInfo.db.transaction(function(t) {
tryExecuteSql(
t,
dbInfo,
`DELETE FROM ${dbInfo.storeName}`,
[],
function() {
resolve();
},
function(t, error) {
reject(error);
}
);
});
})
.catch(reject);
});

@@ -270,18 +383,24 @@

var promise = new Promise(function(resolve, reject) {
self.ready().then(function() {
var dbInfo = self._dbInfo;
dbInfo.db.transaction(function(t) {
// Ahhh, SQL makes this one soooooo easy.
t.executeSql(
'SELECT COUNT(key) as c FROM ' +
dbInfo.storeName, [],
function(t, results) {
var result = results.rows.item(0).c;
resolve(result);
}, function(t, error) {
reject(error);
});
});
}).catch(reject);
self
.ready()
.then(function() {
var dbInfo = self._dbInfo;
dbInfo.db.transaction(function(t) {
// Ahhh, SQL makes this one soooooo easy.
tryExecuteSql(
t,
dbInfo,
`SELECT COUNT(key) as c FROM ${dbInfo.storeName}`,
[],
function(t, results) {
var result = results.rows.item(0).c;
resolve(result);
},
function(t, error) {
reject(error);
}
);
});
})
.catch(reject);
});

@@ -304,17 +423,27 @@

var promise = new Promise(function(resolve, reject) {
self.ready().then(function() {
var dbInfo = self._dbInfo;
dbInfo.db.transaction(function(t) {
t.executeSql(
'SELECT key FROM ' + dbInfo.storeName +
' WHERE id = ? LIMIT 1', [n + 1],
function(t, results) {
var result = results.rows.length ?
results.rows.item(0).key : null;
resolve(result);
}, function(t, error) {
reject(error);
});
});
}).catch(reject);
self
.ready()
.then(function() {
var dbInfo = self._dbInfo;
dbInfo.db.transaction(function(t) {
tryExecuteSql(
t,
dbInfo,
`SELECT key FROM ${
dbInfo.storeName
} WHERE id = ? LIMIT 1`,
[n + 1],
function(t, results) {
var result = results.rows.length
? results.rows.item(0).key
: null;
resolve(result);
},
function(t, error) {
reject(error);
}
);
});
})
.catch(reject);
});

@@ -330,22 +459,147 @@

var promise = new Promise(function(resolve, reject) {
self.ready().then(function() {
var dbInfo = self._dbInfo;
dbInfo.db.transaction(function(t) {
self
.ready()
.then(function() {
var dbInfo = self._dbInfo;
dbInfo.db.transaction(function(t) {
tryExecuteSql(
t,
dbInfo,
`SELECT key FROM ${dbInfo.storeName}`,
[],
function(t, results) {
var keys = [];
for (var i = 0; i < results.rows.length; i++) {
keys.push(results.rows.item(i).key);
}
resolve(keys);
},
function(t, error) {
reject(error);
}
);
});
})
.catch(reject);
});
executeCallback(promise, callback);
return promise;
}
// https://www.w3.org/TR/webdatabase/#databases
// > There is no way to enumerate or delete the databases available for an origin from this API.
function getAllStoreNames(db) {
return new Promise(function(resolve, reject) {
db.transaction(
function(t) {
t.executeSql(
'SELECT key FROM ' + dbInfo.storeName, [],
'SELECT name FROM sqlite_master ' +
"WHERE type='table' AND name <> '__WebKitDatabaseInfoTable__'",
[],
function(t, results) {
var keys = [];
var storeNames = [];
for (var i = 0; i < results.rows.length; i++) {
keys.push(results.rows.item(i).key);
storeNames.push(results.rows.item(i).name);
}
resolve(keys);
}, function(t, error) {
resolve({
db,
storeNames
});
},
function(t, error) {
reject(error);
});
});
}).catch(reject);
}
);
},
function(sqlError) {
reject(sqlError);
}
);
});
}
function dropInstance(options, callback) {
callback = getCallback.apply(this, arguments);
var currentConfig = this.config();
options = (typeof options !== 'function' && options) || {};
if (!options.name) {
options.name = options.name || currentConfig.name;
options.storeName = options.storeName || currentConfig.storeName;
}
var self = this;
var promise;
if (!options.name) {
promise = Promise.reject('Invalid arguments');
} else {
promise = new Promise(function(resolve) {
var db;
if (options.name === currentConfig.name) {
// use the db reference of the current instance
db = self._dbInfo.db;
} else {
db = openDatabase(options.name, '', '', 0);
}
if (!options.storeName) {
// drop all database tables
resolve(getAllStoreNames(db));
} else {
resolve({
db,
storeNames: [options.storeName]
});
}
}).then(function(operationInfo) {
return new Promise(function(resolve, reject) {
operationInfo.db.transaction(
function(t) {
function dropTable(storeName) {
return new Promise(function(resolve, reject) {
t.executeSql(
`DROP TABLE IF EXISTS ${storeName}`,
[],
function() {
resolve();
},
function(t, error) {
reject(error);
}
);
});
}
var operations = [];
for (
var i = 0, len = operationInfo.storeNames.length;
i < len;
i++
) {
operations.push(
dropTable(operationInfo.storeNames[i])
);
}
Promise.all(operations)
.then(function() {
resolve();
})
.catch(function(e) {
reject(e);
});
},
function(sqlError) {
reject(sqlError);
}
);
});
});
}
executeCallback(promise, callback);

@@ -366,5 +620,6 @@ return promise;

key: key,
keys: keys
keys: keys,
dropInstance: dropInstance
};
export default webSQLStorage;

@@ -6,3 +6,5 @@ import idbDriver from './drivers/indexeddb';

import Promise from './utils/promise';
import executeCallback from './utils/executeCallback';
import executeTwoCallbacks from './utils/executeTwoCallbacks';
import includes from './utils/includes';
import isArray from './utils/isArray';

@@ -28,2 +30,4 @@

const OptionalDriverMethods = ['dropInstance'];
const LibraryMethods = [

@@ -38,3 +42,3 @@ 'clear',

'setItem'
];
].concat(OptionalDriverMethods);

@@ -56,3 +60,6 @@ const DefaultConfig = {

return localForageInstance.ready().then(function() {
return localForageInstance[libraryMethod].apply(localForageInstance, _args);
return localForageInstance[libraryMethod].apply(
localForageInstance,
_args
);
});

@@ -118,8 +125,9 @@ };

// config values.
if (typeof(options) === 'object') {
if (typeof options === 'object') {
// If localforage is ready and fully initialized, we can't set
// any new configuration values. Instead, we return an error.
if (this._ready) {
return new Error('Can\'t call config() after localforage ' +
'has been used.');
return new Error(
"Can't call config() after localforage " + 'has been used.'
);
}

@@ -146,3 +154,3 @@

return true;
} else if (typeof(options) === 'string') {
} else if (typeof options === 'string') {
return this._config[options];

@@ -162,3 +170,3 @@ } else {

'Custom driver not compliant; see ' +
'https://mozilla.github.io/localForage/#definedriver'
'https://mozilla.github.io/localForage/#definedriver'
);

@@ -175,5 +183,14 @@

for (let i = 0, len = driverMethods.length; i < len; i++) {
const customDriverMethod = driverMethods[i];
if (!customDriverMethod || !driverObject[customDriverMethod] ||
typeof driverObject[customDriverMethod] !== 'function') {
const driverMethodName = driverMethods[i];
// when the property is there,
// it should be a method even when optional
const isRequired = !includes(
OptionalDriverMethods,
driverMethodName
);
if (
(isRequired || driverObject[driverMethodName]) &&
typeof driverObject[driverMethodName] !== 'function'
) {
reject(complianceError);

@@ -184,5 +201,40 @@ return;

const configureMissingMethods = function() {
const methodNotImplementedFactory = function(methodName) {
return function() {
const error = new Error(
`Method ${methodName} is not implemented by the current driver`
);
const promise = Promise.reject(error);
executeCallback(
promise,
arguments[arguments.length - 1]
);
return promise;
};
};
for (
let i = 0, len = OptionalDriverMethods.length;
i < len;
i++
) {
const optionalDriverMethod = OptionalDriverMethods[i];
if (!driverObject[optionalDriverMethod]) {
driverObject[
optionalDriverMethod
] = methodNotImplementedFactory(
optionalDriverMethod
);
}
}
};
configureMissingMethods();
const setDriverSupport = function(support) {
if (DefinedDrivers[driverName]) {
console.info(`Redefining LocalForage driver: ${driverName}`);
console.info(
`Redefining LocalForage driver: ${driverName}`
);
}

@@ -198,3 +250,6 @@ DefinedDrivers[driverName] = driverObject;

if ('_support' in driverObject) {
if (driverObject._support && typeof driverObject._support === 'function') {
if (
driverObject._support &&
typeof driverObject._support === 'function'
) {
driverObject._support().then(setDriverSupport, reject);

@@ -221,5 +276,5 @@ } else {

getDriver(driverName, callback, errorCallback) {
const getDriverPromise = DefinedDrivers[driverName] ?
Promise.resolve(DefinedDrivers[driverName]) :
Promise.reject(new Error('Driver not found.'));
const getDriverPromise = DefinedDrivers[driverName]
? Promise.resolve(DefinedDrivers[driverName])
: Promise.reject(new Error('Driver not found.'));

@@ -284,3 +339,4 @@ executeTwoCallbacks(getDriverPromise, callback, errorCallback);

return self.getDriver(driverName)
return self
.getDriver(driverName)
.then(extendSelfWithDriver)

@@ -291,3 +347,5 @@ .catch(driverPromiseLoop);

setDriverToConfig();
const error = new Error('No available storage method found.');
const error = new Error(
'No available storage method found.'
);
self._driverSet = Promise.reject(error);

@@ -304,13 +362,14 @@ return self._driverSet;

// race condition to set _dbInfo
const oldDriverSetDone = this._driverSet !== null ?
this._driverSet.catch(() => Promise.resolve()) :
Promise.resolve();
const oldDriverSetDone =
this._driverSet !== null
? this._driverSet.catch(() => Promise.resolve())
: Promise.resolve();
this._driverSet = oldDriverSetDone.then(() => {
const driverName = supportedDrivers[0];
self._dbInfo = null;
self._ready = null;
this._driverSet = oldDriverSetDone
.then(() => {
const driverName = supportedDrivers[0];
self._dbInfo = null;
self._ready = null;
return self.getDriver(driverName)
.then(driver => {
return self.getDriver(driverName).then(driver => {
self._driver = driver._driver;

@@ -321,8 +380,9 @@ setDriverToConfig();

});
}).catch(() => {
setDriverToConfig();
const error = new Error('No available storage method found.');
self._driverSet = Promise.reject(error);
return self._driverSet;
});
})
.catch(() => {
setDriverToConfig();
const error = new Error('No available storage method found.');
self._driverSet = Promise.reject(error);
return self._driverSet;
});

@@ -329,0 +389,0 @@ executeTwoCallbacks(this._driverSet, callback, errorCallback);

@@ -17,6 +17,10 @@ // Abstracts constructing a Blob object, so it also works in older

}
var Builder = typeof BlobBuilder !== 'undefined' ? BlobBuilder :
typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder :
typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder :
WebKitBlobBuilder;
var Builder =
typeof BlobBuilder !== 'undefined'
? BlobBuilder
: typeof MSBlobBuilder !== 'undefined'
? MSBlobBuilder
: typeof MozBlobBuilder !== 'undefined'
? MozBlobBuilder
: WebKitBlobBuilder;
var builder = new Builder();

@@ -23,0 +27,0 @@ for (var i = 0; i < parts.length; i += 1) {

function executeCallback(promise, callback) {
if (callback) {
promise.then(function(result) {
callback(null, result);
}, function(error) {
callback(error);
});
promise.then(
function(result) {
callback(null, result);
},
function(error) {
callback(error);
}
);
}

@@ -9,0 +12,0 @@ }

@@ -1,5 +0,7 @@

const isArray = Array.isArray || function(arg) {
return Object.prototype.toString.call(arg) === '[object Array]';
};
const isArray =
Array.isArray ||
function(arg) {
return Object.prototype.toString.call(arg) === '[object Array]';
};
export default isArray;

@@ -14,19 +14,23 @@ import idb from './idb';

// as Safari. Oh the lulz...
var isSafari = typeof openDatabase !== 'undefined' &&
/(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent) &&
!/Chrome/.test(navigator.userAgent) &&
!/BlackBerry/.test(navigator.platform);
var isSafari =
typeof openDatabase !== 'undefined' &&
/(Safari|iPhone|iPad|iPod)/.test(navigator.userAgent) &&
!/Chrome/.test(navigator.userAgent) &&
!/BlackBerry/.test(navigator.platform);
var hasFetch = typeof fetch === 'function' &&
fetch.toString().indexOf('[native code') !== -1;
var hasFetch =
typeof fetch === 'function' &&
fetch.toString().indexOf('[native code') !== -1;
// Safari <10.1 does not meet our requirements for IDB support (#5572)
// since Safari 10.1 shipped with fetch, we can use that to detect it
return (!isSafari || hasFetch) &&
typeof indexedDB !== 'undefined' &&
// some outdated implementations of IDB that appear on Samsung
// and HTC Android devices <4.4 are missing IDBKeyRange
// See: https://github.com/mozilla/localForage/issues/128
// See: https://github.com/mozilla/localForage/issues/272
typeof IDBKeyRange !== 'undefined';
return (
(!isSafari || hasFetch) &&
typeof indexedDB !== 'undefined' &&
// some outdated implementations of IDB that appear on Samsung
// and HTC Android devices <4.4 are missing IDBKeyRange
// See: https://github.com/mozilla/localForage/issues/128
// See: https://github.com/mozilla/localForage/issues/272
typeof IDBKeyRange !== 'undefined'
);
} catch (e) {

@@ -33,0 +37,0 @@ return false;

@@ -7,3 +7,4 @@ /* eslint-disable no-bitwise */

// verbose ways of binary <-> string data storage.
var BASE_CHARS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
var BASE_CHARS =
'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';

@@ -28,4 +29,4 @@ var BLOB_TYPE_PREFIX = '~~local_forage_type~';

var TYPE_FLOAT64ARRAY = 'fl64';
var TYPE_SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER_LENGTH +
TYPE_ARRAYBUFFER.length;
var TYPE_SERIALIZED_MARKER_LENGTH =
SERIALIZED_MARKER_LENGTH + TYPE_ARRAYBUFFER.length;

@@ -78,10 +79,12 @@ var toString = Object.prototype.toString;

base64String += BASE_CHARS[((bytes[i] & 3) << 4) | (bytes[i + 1] >> 4)];
base64String += BASE_CHARS[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];
base64String +=
BASE_CHARS[((bytes[i + 1] & 15) << 2) | (bytes[i + 2] >> 6)];
base64String += BASE_CHARS[bytes[i + 2] & 63];
}
if ((bytes.length % 3) === 2) {
if (bytes.length % 3 === 2) {
base64String = base64String.substring(0, base64String.length - 1) + '=';
} else if (bytes.length % 3 === 1) {
base64String = base64String.substring(0, base64String.length - 2) + '==';
base64String =
base64String.substring(0, base64String.length - 2) + '==';
}

@@ -105,5 +108,8 @@

// TODO: See why those tests fail and use a better solution.
if (value && (valueType === '[object ArrayBuffer]' ||
value.buffer &&
toString.call(value.buffer) === '[object ArrayBuffer]')) {
if (
value &&
(valueType === '[object ArrayBuffer]' ||
(value.buffer &&
toString.call(value.buffer) === '[object ArrayBuffer]'))
) {
// Convert binary arrays to a string and prefix the string with

@@ -150,3 +156,6 @@ // a special marker.

// Backwards-compatible prefix for the blob type.
var str = BLOB_TYPE_PREFIX + value.type + '~' +
var str =
BLOB_TYPE_PREFIX +
value.type +
'~' +
bufferToString(this.result);

@@ -162,4 +171,3 @@

} catch (e) {
console.error("Couldn't convert value into a JSON string: ",
value);
console.error("Couldn't convert value into a JSON string: ", value);

@@ -191,4 +199,6 @@ callback(null, e);

var serializedString = value.substring(TYPE_SERIALIZED_MARKER_LENGTH);
var type = value.substring(SERIALIZED_MARKER_LENGTH,
TYPE_SERIALIZED_MARKER_LENGTH);
var type = value.substring(
SERIALIZED_MARKER_LENGTH,
TYPE_SERIALIZED_MARKER_LENGTH
);

@@ -211,3 +221,3 @@ var blobType;

case TYPE_BLOB:
return createBlob([buffer], {type: blobType});
return createBlob([buffer], { type: blobType });
case TYPE_INT8ARRAY:

@@ -214,0 +224,0 @@ return new Int8Array(buffer);

@@ -9,3 +9,3 @@ (function() {

var self = this;
var dbInfo = {};

@@ -39,4 +39,4 @@ if (options) {

var TYPE_FLOAT64ARRAY = 'fl64';
var TYPE_SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER_LENGTH +
TYPE_ARRAYBUFFER.length;
var TYPE_SERIALIZED_MARKER_LENGTH =
SERIALIZED_MARKER_LENGTH + TYPE_ARRAYBUFFER.length;

@@ -46,14 +46,17 @@ function clear(callback) {

var promise = new Promise(function(resolve, reject) {
self.ready().then(function() {
var db = self._dbInfo.db;
self
.ready()
.then(function() {
var db = self._dbInfo.db;
for (var key in db) {
if (db.hasOwnProperty(key)) {
delete db[key];
// db[key] = undefined;
for (var key in db) {
if (db.hasOwnProperty(key)) {
delete db[key];
// db[key] = undefined;
}
}
}
resolve();
}).catch(reject);
resolve();
})
.catch(reject);
});

@@ -70,4 +73,5 @@

if (typeof key !== 'string') {
window.console.warn(key +
' used as a key, but it is not a string.');
window.console.warn(
key + ' used as a key, but it is not a string.'
);
key = String(key);

@@ -77,16 +81,19 @@ }

var promise = new Promise(function(resolve, reject) {
self.ready().then(function() {
try {
var db = self._dbInfo.db;
var result = db[key];
self
.ready()
.then(function() {
try {
var db = self._dbInfo.db;
var result = db[key];
if (result) {
result = _deserialize(result);
if (result) {
result = _deserialize(result);
}
resolve(result);
} catch (e) {
reject(e);
}
resolve(result);
} catch (e) {
reject(e);
}
}).catch(reject);
})
.catch(reject);
});

@@ -102,21 +109,24 @@

var promise = new Promise(function(resolve, reject) {
self.ready().then(function() {
try {
var db = self._dbInfo.db;
self
.ready()
.then(function() {
try {
var db = self._dbInfo.db;
for (var key in db) {
var result = db[key];
for (var key in db) {
var result = db[key];
if (result) {
result = _deserialize(result);
if (result) {
result = _deserialize(result);
}
callback(result, key);
}
callback(result, key);
resolve();
} catch (e) {
reject(e);
}
resolve();
} catch (e) {
reject(e);
}
}).catch(reject);
})
.catch(reject);
});

@@ -131,19 +141,22 @@

var promise = new Promise(function(resolve, reject) {
self.ready().then(function() {
var db = self._dbInfo.db;
var result = null;
var index = 0;
self
.ready()
.then(function() {
var db = self._dbInfo.db;
var result = null;
var index = 0;
for (var key in db) {
if (db.hasOwnProperty(key) && db[key] !== undefined) {
if (n === index) {
result = key;
break;
for (var key in db) {
if (db.hasOwnProperty(key) && db[key] !== undefined) {
if (n === index) {
result = key;
break;
}
index++;
}
index++;
}
}
resolve(result);
}).catch(reject);
resolve(result);
})
.catch(reject);
});

@@ -158,14 +171,17 @@

var promise = new Promise(function(resolve, reject) {
self.ready().then(function() {
var db = self._dbInfo.db;
var keys = [];
self
.ready()
.then(function() {
var db = self._dbInfo.db;
var keys = [];
for (var key in db) {
if (db.hasOwnProperty(key)) {
keys.push(key);
for (var key in db) {
if (db.hasOwnProperty(key)) {
keys.push(key);
}
}
}
resolve(keys);
}).catch(reject);
resolve(keys);
})
.catch(reject);
});

@@ -180,5 +196,8 @@

var promise = new Promise(function(resolve, reject) {
self.keys().then(function(keys) {
resolve(keys.length);
}).catch(reject);
self
.keys()
.then(function(keys) {
resolve(keys.length);
})
.catch(reject);
});

@@ -195,4 +214,5 @@

if (typeof key !== 'string') {
window.console.warn(key +
' used as a key, but it is not a string.');
window.console.warn(
key + ' used as a key, but it is not a string.'
);
key = String(key);

@@ -202,11 +222,14 @@ }

var promise = new Promise(function(resolve, reject) {
self.ready().then(function() {
var db = self._dbInfo.db;
if (db.hasOwnProperty(key)) {
delete db[key];
// db[key] = undefined;
}
self
.ready()
.then(function() {
var db = self._dbInfo.db;
if (db.hasOwnProperty(key)) {
delete db[key];
// db[key] = undefined;
}
resolve();
}).catch(reject);
resolve();
})
.catch(reject);
});

@@ -223,4 +246,5 @@

if (typeof key !== 'string') {
window.console.warn(key +
' used as a key, but it is not a string.');
window.console.warn(
key + ' used as a key, but it is not a string.'
);
key = String(key);

@@ -230,26 +254,29 @@ }

var promise = new Promise(function(resolve, reject) {
self.ready().then(function() {
// Convert undefined values to null.
// https://github.com/mozilla/localForage/pull/42
if (value === undefined) {
value = null;
}
self
.ready()
.then(function() {
// Convert undefined values to null.
// https://github.com/mozilla/localForage/pull/42
if (value === undefined) {
value = null;
}
// Save the original value to pass to the callback.
var originalValue = value;
// Save the original value to pass to the callback.
var originalValue = value;
_serialize(value, function(value, error) {
if (error) {
reject(error);
} else {
try {
var db = self._dbInfo.db;
db[key] = value;
resolve(originalValue);
} catch (e) {
reject(e);
_serialize(value, function(value, error) {
if (error) {
reject(error);
} else {
try {
var db = self._dbInfo.db;
db[key] = value;
resolve(originalValue);
} catch (e) {
reject(e);
}
}
}
});
}).catch(reject);
});
})
.catch(reject);
});

@@ -272,5 +299,8 @@

// TODO: See why those tests fail and use a better solution.
if (value && (value.toString() === '[object ArrayBuffer]' ||
value.buffer &&
value.buffer.toString() === '[object ArrayBuffer]')) {
if (
value &&
(value.toString() === '[object ArrayBuffer]' ||
(value.buffer &&
value.buffer.toString() === '[object ArrayBuffer]'))
) {
// Convert binary arrays to a string and prefix the string with

@@ -326,4 +356,6 @@ // a special marker.

} catch (e) {
window.console.error("Couldn't convert value into a JSON " +
'string: ', value);
window.console.error(
"Couldn't convert value into a JSON " + 'string: ',
value
);

@@ -334,3 +366,3 @@ callback(e);

}
// _deserialize just like in LocalStorage

@@ -341,4 +373,5 @@ function _deserialize(value) {

// done with it.
if (value.substring(0,
SERIALIZED_MARKER_LENGTH) !== SERIALIZED_MARKER) {
if (
value.substring(0, SERIALIZED_MARKER_LENGTH) !== SERIALIZED_MARKER
) {
return JSON.parse(value);

@@ -351,4 +384,6 @@ }

var serializedString = value.substring(TYPE_SERIALIZED_MARKER_LENGTH);
var type = value.substring(SERIALIZED_MARKER_LENGTH,
TYPE_SERIALIZED_MARKER_LENGTH);
var type = value.substring(
SERIALIZED_MARKER_LENGTH,
TYPE_SERIALIZED_MARKER_LENGTH
);

@@ -413,7 +448,10 @@ // Fill the string into a ArrayBuffer.

if (callback) {
promise.then(function(result) {
callback(null, result);
}, function(error) {
callback(error);
});
promise.then(
function(result) {
callback(null, result);
},
function(error) {
callback(error);
}
);
}

@@ -440,3 +478,7 @@ }

});
} else if (typeof module !== 'undefined' && module.exports && typeof require !== 'undefined') {
} else if (
typeof module !== 'undefined' &&
module.exports &&
typeof require !== 'undefined'
) {
module.exports = dummyStorageDriver;

@@ -446,2 +488,2 @@ } else {

}
}).call(window);
}.call(window));

@@ -42,3 +42,3 @@ /* global requirejs:true */

Array.prototype.forEach = function(callback, thisArg) {
if (typeof(callback) !== 'function') {
if (typeof callback !== 'function') {
throw new TypeError(callback + ' is not a function!');

@@ -55,3 +55,2 @@ }

if (require) {
requirejs.config({

@@ -58,0 +57,0 @@ paths: {

@@ -1,2 +0,2 @@

/*jshint node:true */
/*jshint node:true */

@@ -8,3 +8,3 @@ var SAUCELAB_BROWSERS = [

platform: 'Windows 7',
version: '34',
version: '34'
},

@@ -15,3 +15,3 @@ {

platform: 'Windows 7',
version: '28',
version: '28'
},

@@ -22,3 +22,3 @@ {

platform: 'Windows 7',
version: '29',
version: '29'
},

@@ -35,3 +35,3 @@

browserName: 'internet explorer',
version: '9',
version: '9'
},

@@ -41,3 +41,3 @@ {

browserName: 'internet explorer',
version: '10',
version: '10'
},

@@ -47,6 +47,5 @@ {

browserName: 'internet explorer',
version: '11',
version: '11'
},
{

@@ -63,5 +62,5 @@ base: 'SauceLabs',

platform: 'Windows 8.1'
},
}
];
module.exports = SAUCELAB_BROWSERS;
/*globals importScripts:true, self:true */
importScripts("/dist/localforage.js");
importScripts('/dist/localforage.js');

@@ -8,3 +8,6 @@ self.onmessage = function(messageEvent) {

.then(function() {
return localforage.setItem('service worker', messageEvent.data.value);
return localforage.setItem(
'service worker',
messageEvent.data.value
);
})

@@ -15,17 +18,12 @@ .then(function() {

.then(function(value) {
messageEvent
.ports[0]
.postMessage({
body: value + ' using ' + localforage.driver()
});
messageEvent.ports[0].postMessage({
body: value + ' using ' + localforage.driver()
});
})
.catch(function(error) {
messageEvent
.ports[0]
.postMessage({
error: JSON.stringify(error),
body: error,
fail: true
});
messageEvent.ports[0].postMessage({
error: JSON.stringify(error),
body: error,
fail: true
});
});

@@ -37,7 +35,7 @@ };

localforage
.setItem('service worker registration', 'serviceworker present')
.then(function(value) {
console.log(value);
})
.setItem('service worker registration', 'serviceworker present')
.then(function(value) {
console.log(value);
})
);
};

@@ -28,8 +28,11 @@ /* global beforeEach:true */

localforage.ready().then(function() {
previousDriver = localforage.driver();
rerequirelocalforage();
}, function() {
rerequirelocalforage();
});
localforage.ready().then(
function() {
previousDriver = localforage.driver();
rerequirelocalforage();
},
function() {
rerequirelocalforage();
}
);
});

@@ -52,4 +52,5 @@ /* global before:true, beforeEach:true, describe:true, expect:true, it:true */

var error = "Error: Can't call config() after localforage " +
'has been used.';
var error =
"Error: Can't call config() after localforage " +
'has been used.';

@@ -63,4 +64,5 @@ expect(configResult).to.not.be(true);

expect(localforage.config('driver')).to.be(localforage.driver());
expect(localforage.config('driver')).to.not
.be('I a not set driver');
expect(localforage.config('driver')).to.not.be(
'I a not set driver'
);
expect(localforage.config('name')).to.be('localforage');

@@ -77,3 +79,4 @@ expect(localforage.config('name')).to.not.be('My Cool App');

it('sets new values and returns them properly', function(done) {
var secondSupportedDriver = supportedDrivers.length >= 2 ? supportedDrivers[1] : null;
var secondSupportedDriver =
supportedDrivers.length >= 2 ? supportedDrivers[1] : null;

@@ -89,6 +92,6 @@ localforage.config({

expect(localforage.config('description')).to.not.be('');
expect(localforage.config('description')).to
.be('The offline datastore for my cool app');
expect(localforage.config('driver')).to
.be(secondSupportedDriver);
expect(localforage.config('description')).to.be(
'The offline datastore for my cool app'
);
expect(localforage.config('driver')).to.be(secondSupportedDriver);
expect(localforage.config('name')).to.be('My Cool App');

@@ -101,7 +104,7 @@ expect(localforage.config('size')).to.be(4980736);

if (supportedDrivers.length >= 2) {
expect(localforage.config('driver')).to
.be(secondSupportedDriver);
expect(localforage.config('driver')).to.be(
secondSupportedDriver
);
} else {
expect(localforage.config('driver')).to
.be(supportedDrivers[0]);
expect(localforage.config('driver')).to.be(supportedDrivers[0]);
}

@@ -121,9 +124,12 @@ done();

expect(configResult).to.be.a(Promise);
localforage.ready(function() {
expect(localforage.config('driver')).to
.be(otherSupportedDrivers[0]);
return configResult;
}).then(function() {
done();
});
localforage
.ready(function() {
expect(localforage.config('driver')).to.be(
otherSupportedDrivers[0]
);
return configResult;
})
.then(function() {
done();
});
});

@@ -139,12 +145,14 @@ }

expect(configResult).to.be.a(Promise);
localforage.ready(function() {
expect(localforage.config('driver')).to
.be(oldDriver);
return configResult;
}).catch(function(error) {
expect(error).to.be.an(Error);
expect(error.message).to
.be('No available storage method found.');
done();
});
localforage
.ready(function() {
expect(localforage.config('driver')).to.be(oldDriver);
return configResult;
})
.catch(function(error) {
expect(error).to.be.an(Error);
expect(error.message).to.be(
'No available storage method found.'
);
done();
});
});

@@ -162,4 +170,3 @@

localforage.ready(function() {
expect(localforage.config('driver')).to
.be(oldDriver);
expect(localforage.config('driver')).to.be(oldDriver);
done();

@@ -193,6 +200,9 @@ });

if (localforage.driver() === localforage.INDEXEDDB) {
var indexedDB = (indexedDB || window.indexedDB ||
window.webkitIndexedDB ||
window.mozIndexedDB || window.OIndexedDB ||
window.msIndexedDB);
var indexedDB =
indexedDB ||
window.indexedDB ||
window.webkitIndexedDB ||
window.mozIndexedDB ||
window.OIndexedDB ||
window.msIndexedDB;
var req = indexedDB.open('My Cool App', 2.0);

@@ -202,5 +212,5 @@

var dbValue = req.result
.transaction('myStoreName', 'readonly')
.objectStore('myStoreName')
.get('some key');
.transaction('myStoreName', 'readonly')
.objectStore('myStoreName')
.get('some key');
expect(dbValue).to.be(value);

@@ -210,15 +220,23 @@ done();

} else if (localforage.driver() === localforage.WEBSQL) {
window.openDatabase('My Cool App', String(2.0), '',
4980736).transaction(function(t) {
t.executeSql('SELECT * FROM myStoreName WHERE key = ? ' +
'LIMIT 1', ['some key'], function(t, results) {
var dbValue = JSON.parse(results.rows.item(0).value);
window
.openDatabase('My Cool App', String(2.0), '', 4980736)
.transaction(function(t) {
t.executeSql(
'SELECT * FROM myStoreName WHERE key = ? ' +
'LIMIT 1',
['some key'],
function(t, results) {
var dbValue = JSON.parse(
results.rows.item(0).value
);
expect(dbValue).to.be(value);
done();
expect(dbValue).to.be(value);
done();
}
);
});
});
} else if (localforage.driver() === localforage.LOCALSTORAGE) {
var dbValue = JSON.parse(
localStorage['My Cool App/myStoreName/some key']);
localStorage['My Cool App/myStoreName/some key']
);

@@ -243,8 +261,11 @@ expect(dbValue).to.be(value);

localforage.length().then(function() {
return localforage.setDriver(localforage.LOCALSTORAGE);
}).then(function() {
expect(localforage.config('name')).to.be('Mega Mozilla Dino');
done();
});
localforage
.length()
.then(function() {
return localforage.setDriver(localforage.LOCALSTORAGE);
})
.then(function() {
expect(localforage.config('name')).to.be('Mega Mozilla Dino');
done();
});
});

@@ -251,0 +272,0 @@

/* global describe:true, expect:true, it:true, dummyStorageDriver:true */
describe('When Custom Drivers are used', function() {
'use strict';
var errorMessage = 'Custom driver not compliant; see ' +
'https://mozilla.github.io/localForage/#definedriver';
var errorMessage =
'Custom driver not compliant; see ' +
'https://mozilla.github.io/localForage/#definedriver';
it('fails to define a no-name custom driver', function(done) {
localforage.defineDriver({
_initStorage: function() {},
iterate: function() {},
getItem: function() {},
setItem: function() {},
removeItem: function() {},
clear: function() {},
length: function() {},
key: function() {},
keys: function() {}
}, null, function(err) {
expect(err).to.be.an(Error);
expect(err.message).to.be(errorMessage);
done();
});
localforage.defineDriver(
{
_initStorage: function() {},
iterate: function() {},
getItem: function() {},
setItem: function() {},
removeItem: function() {},
clear: function() {},
length: function() {},
key: function() {},
keys: function() {}
},
null,
function(err) {
expect(err).to.be.an(Error);
expect(err.message).to.be(errorMessage);
done();
}
);
});
it('fails to define a no-name custom driver [promise]', function(done) {
localforage.defineDriver({
_initStorage: function() {},
iterate: function() {},
getItem: function() {},
setItem: function() {},
removeItem: function() {},
clear: function() {},
length: function() {},
key: function() {},
keys: function() {}
}).then(null, function(err) {
expect(err).to.be.an(Error);
expect(err.message).to.be(errorMessage);
done();
});
localforage
.defineDriver({
_initStorage: function() {},
iterate: function() {},
getItem: function() {},
setItem: function() {},
removeItem: function() {},
clear: function() {},
length: function() {},
key: function() {},
keys: function() {}
})
.then(null, function(err) {
expect(err).to.be.an(Error);
expect(err.message).to.be(errorMessage);
done();
});
});
it('fails to define a custom driver with missing methods', function(done) {
localforage.defineDriver({
_driver: 'missingMethodsDriver',
_initStorage: function() {},
iterate: function() {},
getItem: function() {},
setItem: function() {},
removeItem: function() {},
clear: function() {}
}, null, function(err) {
expect(err).to.be.an(Error);
expect(err.message).to.be(errorMessage);
done();
});
localforage.defineDriver(
{
_driver: 'missingMethodsDriver',
_initStorage: function() {},
iterate: function() {},
getItem: function() {},
setItem: function() {},
removeItem: function() {},
clear: function() {}
},
null,
function(err) {
expect(err).to.be.an(Error);
expect(err.message).to.be(errorMessage);
done();
}
);
});
it('fails to define a custom driver with missing methods [promise]', function(done) {
localforage.defineDriver({
_driver: 'missingMethodsDriver',
_initStorage: function() {},
iterate: function() {},
getItem: function() {},
setItem: function() {},
removeItem: function() {},
clear: function() {}
}).then(null, function(err) {
expect(err).to.be.an(Error);
expect(err.message).to.be(errorMessage);
done();
});
localforage
.defineDriver({
_driver: 'missingMethodsDriver',
_initStorage: function() {},
iterate: function() {},
getItem: function() {},
setItem: function() {},
removeItem: function() {},
clear: function() {}
})
.then(null, function(err) {
expect(err).to.be.an(Error);
expect(err.message).to.be(errorMessage);
done();
});
});

@@ -97,23 +110,26 @@

it('sets a custom driver [promise]', function(done) {
localforage.defineDriver(dummyStorageDriver).then(function() {
return localforage.setDriver(dummyStorageDriver._driver);
}).then(function() {
expect(localforage.driver()).to.be(dummyStorageDriver._driver);
done();
});
localforage
.defineDriver(dummyStorageDriver)
.then(function() {
return localforage.setDriver(dummyStorageDriver._driver);
})
.then(function() {
expect(localforage.driver()).to.be(dummyStorageDriver._driver);
done();
});
});
it('defines a driver synchronously when it doesn\'t have _supports()', function(done) {
it("defines a driver synchronously when it doesn't have _supports()", function(done) {
var customDriver = {
_driver: 'dummyStorageDriver' + (+new Date()),
_initStorage: function() { },
_driver: 'dummyStorageDriver' + +new Date(),
_initStorage: function() {},
// _support: function() { return true; }
iterate: function() { },
getItem: function() { },
setItem: function() { },
removeItem: function() { },
clear: function() { },
length: function() { },
key: function() { },
keys: function() { }
iterate: function() {},
getItem: function() {},
setItem: function() {},
removeItem: function() {},
clear: function() {},
length: function() {},
key: function() {},
keys: function() {}
};

@@ -130,13 +146,13 @@

var customDriver = {
_driver: 'dummyStorageDriver' + (+new Date()),
_initStorage: function() { },
_driver: 'dummyStorageDriver' + +new Date(),
_initStorage: function() {},
_support: true,
iterate: function() { },
getItem: function() { },
setItem: function() { },
removeItem: function() { },
clear: function() { },
length: function() { },
key: function() { },
keys: function() { }
iterate: function() {},
getItem: function() {},
setItem: function() {},
removeItem: function() {},
clear: function() {},
length: function() {},
key: function() {},
keys: function() {}
};

@@ -153,23 +169,26 @@

var customDriver = {
_driver: 'dummyStorageDriver' + (+new Date()),
_initStorage: function() { },
_driver: 'dummyStorageDriver' + +new Date(),
_initStorage: function() {},
_support: function() {
return Promise.resolve(true);
},
iterate: function() { },
getItem: function() { },
setItem: function() { },
removeItem: function() { },
clear: function() { },
length: function() { },
key: function() { },
keys: function() { }
iterate: function() {},
getItem: function() {},
setItem: function() {},
removeItem: function() {},
clear: function() {},
length: function() {},
key: function() {},
keys: function() {}
};
localforage.defineDriver(customDriver).then(function() {
return localforage.setDriver(customDriver._driver);
}).then(function() {
expect(localforage.driver()).to.be(customDriver._driver);
done();
});
localforage
.defineDriver(customDriver)
.then(function() {
return localforage.setDriver(customDriver._driver);
})
.then(function() {
expect(localforage.driver()).to.be(customDriver._driver);
done();
});
});

@@ -181,10 +200,17 @@

expect(err).to.be(undefined);
localforage.setItem('testCallbackKey', 'testCallbackValue', function(err) {
expect(err).to.be(null);
localforage.getItem('testCallbackKey', function(err, value) {
localforage.setItem(
'testCallbackKey',
'testCallbackValue',
function(err) {
expect(err).to.be(null);
expect(value).to.be('testCallbackValue');
done();
});
});
localforage.getItem('testCallbackKey', function(
err,
value
) {
expect(err).to.be(null);
expect(value).to.be('testCallbackValue');
done();
});
}
);
});

@@ -195,14 +221,89 @@ });

it('sets and uses a custom driver [promise]', function(done) {
localforage.defineDriver(dummyStorageDriver).then(function() {
return localforage.setDriver(dummyStorageDriver._driver);
}).then(function() {
return localforage.setItem('testPromiseKey', 'testPromiseValue');
}).then(function() {
return localforage.getItem('testPromiseKey');
}).then(function(value) {
expect(value).to.be('testPromiseValue');
done();
localforage
.defineDriver(dummyStorageDriver)
.then(function() {
return localforage.setDriver(dummyStorageDriver._driver);
})
.then(function() {
return localforage.setItem(
'testPromiseKey',
'testPromiseValue'
);
})
.then(function() {
return localforage.getItem('testPromiseKey');
})
.then(function(value) {
expect(value).to.be('testPromiseValue');
done();
});
});
describe('when dropInstance is not defined', function() {
it('rejects when it is used', function(done) {
var customDriver = {
_driver: 'dummyStorageDriver' + +new Date(),
_initStorage: function() {},
_support: function() {
return Promise.resolve(true);
},
iterate: function() {},
getItem: function() {},
setItem: function() {},
removeItem: function() {},
clear: function() {},
length: function() {},
key: function() {},
keys: function() {}
};
localforage
.defineDriver(customDriver)
.then(function() {
return localforage.setDriver(customDriver._driver);
})
.then(function() {
return localforage.dropInstance();
})
.catch(function(err) {
expect(err.message).to.be(
'Method dropInstance is not implemented by the current driver'
);
done();
});
});
});
describe('when dropInstance is defined', function() {
it('is does not reject', function(done) {
var customDriver = {
_driver: 'dummyStorageDriver' + +new Date(),
_initStorage: function() {},
_support: function() {
return Promise.resolve(true);
},
iterate: function() {},
getItem: function() {},
setItem: function() {},
removeItem: function() {},
clear: function() {},
length: function() {},
key: function() {},
keys: function() {},
dropInstance: function() {}
};
localforage
.defineDriver(customDriver)
.then(function() {
return localforage.setDriver(customDriver._driver);
})
.then(function() {
return localforage.dropInstance();
})
.then(function() {
done();
});
});
});
});

@@ -14,6 +14,10 @@ /* global before:true, beforeEach:true, describe:true, expect:true, it:true */

}
var Builder = typeof BlobBuilder !== 'undefined' ? BlobBuilder :
typeof MSBlobBuilder !== 'undefined' ? MSBlobBuilder :
typeof MozBlobBuilder !== 'undefined' ? MozBlobBuilder :
WebKitBlobBuilder;
var Builder =
typeof BlobBuilder !== 'undefined'
? BlobBuilder
: typeof MSBlobBuilder !== 'undefined'
? MSBlobBuilder
: typeof MozBlobBuilder !== 'undefined'
? MozBlobBuilder
: WebKitBlobBuilder;
var builder = new Builder();

@@ -34,8 +38,10 @@ for (var i = 0; i < parts.length; i += 1) {

DRIVERS.forEach(function(driverName) {
if ((!localforage.supports(localforage.INDEXEDDB) &&
driverName === localforage.INDEXEDDB) ||
if (
(!localforage.supports(localforage.INDEXEDDB) &&
driverName === localforage.INDEXEDDB) ||
(!localforage.supports(localforage.LOCALSTORAGE) &&
driverName === localforage.LOCALSTORAGE) ||
driverName === localforage.LOCALSTORAGE) ||
(!localforage.supports(localforage.WEBSQL) &&
driverName === localforage.WEBSQL)) {
driverName === localforage.WEBSQL)
) {
// Browser doesn't support this storage library, so we exit the API

@@ -70,21 +76,27 @@ // tests.

it('saves a string [promise]', function(done) {
localforage.setItem('office', 'Initech').then(function(setValue) {
expect(setValue).to.be('Initech');
localforage
.setItem('office', 'Initech')
.then(function(setValue) {
expect(setValue).to.be('Initech');
return localforage.getItem('office');
}).then(function(value) {
expect(value).to.be('Initech');
done();
});
return localforage.getItem('office');
})
.then(function(value) {
expect(value).to.be('Initech');
done();
});
});
it('saves a string like "[object Blob]" [promise]', function(done) {
localforage.setItem('fake Blob', '[object Blob]').then(function(setValue) {
expect(setValue).to.be('[object Blob]');
localforage
.setItem('fake Blob', '[object Blob]')
.then(function(setValue) {
expect(setValue).to.be('[object Blob]');
return localforage.getItem('fake Blob');
}).then(function(value) {
expect(value).to.be('[object Blob]');
done();
});
return localforage.getItem('fake Blob');
})
.then(function(value) {
expect(value).to.be('[object Blob]');
done();
});
});

@@ -105,12 +117,15 @@

it('saves a number [promise]', function(done) {
localforage.setItem('number', 546).then(function(setValue) {
expect(setValue).to.be(546);
expect(setValue).to.be.a('number');
localforage
.setItem('number', 546)
.then(function(setValue) {
expect(setValue).to.be(546);
expect(setValue).to.be.a('number');
return localforage.getItem('number');
}).then(function(value) {
expect(value).to.be(546);
expect(value).to.be.a('number');
done();
});
return localforage.getItem('number');
})
.then(function(value) {
expect(value).to.be(546);
expect(value).to.be.a('number');
done();
});
});

@@ -131,12 +146,15 @@

it('saves a boolean [promise]', function(done) {
localforage.setItem('boolean', false).then(function(setValue) {
expect(setValue).to.be(false);
expect(setValue).to.be.a('boolean');
localforage
.setItem('boolean', false)
.then(function(setValue) {
expect(setValue).to.be(false);
expect(setValue).to.be.a('boolean');
return localforage.getItem('boolean');
}).then(function(value) {
expect(value).to.be(false);
expect(value).to.be.a('boolean');
done();
});
return localforage.getItem('boolean');
})
.then(function(value) {
expect(value).to.be(false);
expect(value).to.be.a('boolean');
done();
});
});

@@ -155,10 +173,13 @@

it('saves null [promise]', function(done) {
localforage.setItem('null', null).then(function(setValue) {
expect(setValue).to.be(null);
localforage
.setItem('null', null)
.then(function(setValue) {
expect(setValue).to.be(null);
return localforage.getItem('null');
}).then(function(value) {
expect(value).to.be(null);
done();
});
return localforage.getItem('null');
})
.then(function(value) {
expect(value).to.be(null);
done();
});
});

@@ -177,10 +198,13 @@

it('saves undefined as null [promise]', function(done) {
localforage.setItem('null', undefined).then(function(setValue) {
expect(setValue).to.be(null);
localforage
.setItem('null', undefined)
.then(function(setValue) {
expect(setValue).to.be(null);
return localforage.getItem('null');
}).then(function(value) {
expect(value).to.be(null);
done();
});
return localforage.getItem('null');
})
.then(function(value) {
expect(value).to.be(null);
done();
});
});

@@ -201,12 +225,15 @@

it('saves a float [promise]', function(done) {
localforage.setItem('float', 546.041).then(function(setValue) {
expect(setValue).to.be(546.041);
expect(setValue).to.be.a('number');
localforage
.setItem('float', 546.041)
.then(function(setValue) {
expect(setValue).to.be(546.041);
expect(setValue).to.be.a('number');
return localforage.getItem('float');
}).then(function(value) {
expect(value).to.be(546.041);
expect(value).to.be.a('number');
done();
});
return localforage.getItem('float');
})
.then(function(value) {
expect(value).to.be(546.041);
expect(value).to.be.a('number');
done();
});
});

@@ -229,13 +256,16 @@

it('saves an array [promise]', function(done) {
localforage.setItem('array', arrayToSave).then(function(setValue) {
expect(setValue.length).to.be(arrayToSave.length);
expect(setValue instanceof Array).to.be(true);
localforage
.setItem('array', arrayToSave)
.then(function(setValue) {
expect(setValue.length).to.be(arrayToSave.length);
expect(setValue instanceof Array).to.be(true);
return localforage.getItem('array');
}).then(function(value) {
expect(value.length).to.be(arrayToSave.length);
expect(value instanceof Array).to.be(true);
expect(value[1]).to.be.a('string');
done();
});
return localforage.getItem('array');
})
.then(function(value) {
expect(value.length).to.be(arrayToSave.length);
expect(value instanceof Array).to.be(true);
expect(value[1]).to.be.a('string');
done();
});
});

@@ -249,5 +279,5 @@

nestedObjects: [
{truth: true},
{theCake: 'is a lie'},
{happiness: 'is a warm gun'},
{ truth: true },
{ theCake: 'is a lie' },
{ happiness: 'is a warm gun' },
false

@@ -259,9 +289,11 @@ ],

localforage.setItem('obj', objectToSave, function(err, setValue) {
expect(Object.keys(setValue).length)
.to.be(Object.keys(objectToSave).length);
expect(Object.keys(setValue).length).to.be(
Object.keys(objectToSave).length
);
expect(setValue).to.be.an('object');
localforage.getItem('obj', function(err, value) {
expect(Object.keys(value).length)
.to.be(Object.keys(objectToSave).length);
expect(Object.keys(value).length).to.be(
Object.keys(objectToSave).length
);
expect(value).to.be.an('object');

@@ -277,18 +309,23 @@ expect(value.nested).to.be.an('object');

it('saves a nested object [promise]', function(done) {
localforage.setItem('obj', objectToSave).then(function(setValue) {
expect(Object.keys(setValue).length)
.to.be(Object.keys(objectToSave).length);
expect(setValue).to.be.an('object');
localforage
.setItem('obj', objectToSave)
.then(function(setValue) {
expect(Object.keys(setValue).length).to.be(
Object.keys(objectToSave).length
);
expect(setValue).to.be.an('object');
return localforage.getItem('obj');
}).then(function(value) {
expect(Object.keys(value).length)
.to.be(Object.keys(objectToSave).length);
expect(value).to.be.an('object');
expect(value.nested).to.be.an('object');
expect(value.nestedObjects[0].truth).to.be.a('boolean');
expect(value.nestedObjects[1].theCake).to.be.a('string');
expect(value.nestedObjects[3]).to.be(false);
done();
});
return localforage.getItem('obj');
})
.then(function(value) {
expect(Object.keys(value).length).to.be(
Object.keys(objectToSave).length
);
expect(value).to.be.an('object');
expect(value.nested).to.be.an('object');
expect(value.nestedObjects[0].truth).to.be.a('boolean');
expect(value.nestedObjects[1].theCake).to.be.a('string');
expect(value.nestedObjects[3]).to.be(false);
done();
});
});

@@ -308,19 +345,28 @@

var response = request.response;
localforage.setItem('ab', response, function(err, sab) {
expect(sab.toString())
.to.be('[object ArrayBuffer]');
expect(sab.byteLength)
.to.be(response.byteLength);
}).then(function() {
// TODO: Running getItem from inside the setItem
// callback times out on IE 10/11. Could be an
// open transaction issue?
localforage.getItem('ab', function(err, arrayBuff) {
expect(arrayBuff.toString())
.to.be('[object ArrayBuffer]');
expect(arrayBuff.byteLength)
.to.be(response.byteLength);
localforage
.setItem('ab', response, function(err, sab) {
expect(sab.toString()).to.be(
'[object ArrayBuffer]'
);
expect(sab.byteLength).to.be(
response.byteLength
);
})
.then(function() {
// TODO: Running getItem from inside the setItem
// callback times out on IE 10/11. Could be an
// open transaction issue?
localforage.getItem('ab', function(
err,
arrayBuff
) {
expect(arrayBuff.toString()).to.be(
'[object ArrayBuffer]'
);
expect(arrayBuff.byteLength).to.be(
response.byteLength
);
});
done();
});
done();
});
}

@@ -340,3 +386,5 @@ };

} else {
it.skip('saves binary (ArrayBuffer) data (ArrayBuffer type does not exist)');
it.skip(
'saves binary (ArrayBuffer) data (ArrayBuffer type does not exist)'
);
}

@@ -352,24 +400,20 @@

var testBlob = createBlob(fileParts, { 'type' : mimeString });
var testBlob = createBlob(fileParts, { type: mimeString });
localforage.setItem('blob', testBlob, function(err, blob) {
expect(err).to.be(null);
expect(blob.toString())
.to.be('[object Blob]');
expect(blob.size)
.to.be(testBlob.size);
expect(blob.type)
.to.be(testBlob.type);
}).then(function() {
localforage.getItem('blob', function(err, blob) {
localforage
.setItem('blob', testBlob, function(err, blob) {
expect(err).to.be(null);
expect(blob.toString())
.to.be('[object Blob]');
expect(blob.size)
.to.be(testBlob.size);
expect(blob.type)
.to.be(testBlob.type);
done();
expect(blob.toString()).to.be('[object Blob]');
expect(blob.size).to.be(testBlob.size);
expect(blob.type).to.be(testBlob.type);
})
.then(function() {
localforage.getItem('blob', function(err, blob) {
expect(err).to.be(null);
expect(blob.toString()).to.be('[object Blob]');
expect(blob.size).to.be(testBlob.size);
expect(blob.type).to.be(testBlob.type);
done();
});
});
});
});

@@ -385,26 +429,22 @@ } else {

var testBlob = createBlob(fileParts, { 'type' : mimeString });
var testBlob = createBlob(fileParts, { type: mimeString });
localforage.setItem('blob', testBlob, function(err, blob) {
expect(err).to.be(null);
expect(blob.toString())
.to.be('[object Blob]');
expect(blob.size)
.to.be(testBlob.size);
expect(blob.type)
.to.be(testBlob.type);
}).then(function() {
localforage.iterate(function(blob, key) {
if (key !== 'blob') {
return;
}
expect(blob.toString())
.to.be('[object Blob]');
expect(blob.size)
.to.be(testBlob.size);
expect(blob.type)
.to.be(testBlob.type);
done();
localforage
.setItem('blob', testBlob, function(err, blob) {
expect(err).to.be(null);
expect(blob.toString()).to.be('[object Blob]');
expect(blob.size).to.be(testBlob.size);
expect(blob.type).to.be(testBlob.type);
})
.then(function() {
localforage.iterate(function(blob, key) {
if (key !== 'blob') {
return;
}
expect(blob.toString()).to.be('[object Blob]');
expect(blob.size).to.be(testBlob.size);
expect(blob.type).to.be(testBlob.type);
done();
});
});
});
});

@@ -468,4 +508,5 @@ } else {

localforage.getItem('array', function(err, readValue) {
expect(readValue instanceof Uint8ClampedArray)
.to.be(true);
expect(readValue instanceof Uint8ClampedArray).to.be(
true
);
expect(readValue[0]).to.be(array[0]);

@@ -472,0 +513,0 @@ expect(readValue[1]).to.be(array[1]);

@@ -19,26 +19,42 @@ /* global beforeEach:true, describe:true, expect:true, it:true */

if ((localforage.supports(localforage.INDEXEDDB) &&
localforage.driver() === localforage.INDEXEDDB) ||
if (
(localforage.supports(localforage.INDEXEDDB) &&
localforage.driver() === localforage.INDEXEDDB) ||
(localforage.supports(localforage.WEBSQL) &&
localforage.driver() === localforage.WEBSQL)) {
it('can change to localStorage from ' + localforage.driver() +
' [callback]', function(done) {
var previousDriver = localforage.driver();
localforage.driver() === localforage.WEBSQL)
) {
it(
'can change to localStorage from ' +
localforage.driver() +
' [callback]',
function(done) {
var previousDriver = localforage.driver();
localforage.setDriver(localforage.LOCALSTORAGE, function() {
expect(localforage.driver()).to.be(localforage.LOCALSTORAGE);
expect(localforage.driver()).to.not.be(previousDriver);
done();
});
});
it('can change to localStorage from ' + localforage.driver() +
' [promise]', function(done) {
var previousDriver = localforage.driver();
localforage.setDriver(localforage.LOCALSTORAGE, function() {
expect(localforage.driver()).to.be(
localforage.LOCALSTORAGE
);
expect(localforage.driver()).to.not.be(previousDriver);
done();
});
}
);
it(
'can change to localStorage from ' +
localforage.driver() +
' [promise]',
function(done) {
var previousDriver = localforage.driver();
localforage.setDriver(localforage.LOCALSTORAGE).then(function() {
expect(localforage.driver()).to.be(localforage.LOCALSTORAGE);
expect(localforage.driver()).to.not.be(previousDriver);
done();
});
});
localforage
.setDriver(localforage.LOCALSTORAGE)
.then(function() {
expect(localforage.driver()).to.be(
localforage.LOCALSTORAGE
);
expect(localforage.driver()).to.not.be(previousDriver);
done();
});
}
);
}

@@ -64,4 +80,3 @@

// TODO: Look into why.
localforage.setDriver(localforage.INDEXEDDB)
.then(null, function() {
localforage.setDriver(localforage.INDEXEDDB).then(null, function() {
expect(localforage.driver()).to.be(previousDriver);

@@ -106,10 +121,13 @@ done();

localforage.setDriver(localforage.LOCALSTORAGE)
.then(null, function() {
expect(localforage.driver()).to.be(previousDriver);
done();
});
localforage
.setDriver(localforage.LOCALSTORAGE)
.then(null, function() {
expect(localforage.driver()).to.be(previousDriver);
done();
});
});
} else if (!localforage.supports(localforage.INDEXEDDB) &&
!localforage.supports(localforage.WEBSQL)) {
} else if (
!localforage.supports(localforage.INDEXEDDB) &&
!localforage.supports(localforage.WEBSQL)
) {
it('can set already active localStorage [callback]', function(done) {

@@ -149,4 +167,3 @@ var previousDriver = localforage.driver();

localforage.setDriver(localforage.WEBSQL)
.then(null, function() {
localforage.setDriver(localforage.WEBSQL).then(null, function() {
expect(localforage.driver()).to.be(previousDriver);

@@ -153,0 +170,0 @@ done();

@@ -10,16 +10,15 @@ /* global beforeEach:true, describe:true, expect:true, it:true */

]
.filter(localforage.supports)
.filter(function(driverName) {
// FF doesn't allow you to override `localStorage.setItem`
// so if the faulty driver setup didn't succeed
// then skip the localStorage tests
return !(
driverName === localforage.LOCALSTORAGE &&
localStorage.setItem.toString().indexOf('[native code]') >= 0
);
});
.filter(localforage.supports)
.filter(function(driverName) {
// FF doesn't allow you to override `localStorage.setItem`
// so if the faulty driver setup didn't succeed
// then skip the localStorage tests
return !(
driverName === localforage.LOCALSTORAGE &&
localStorage.setItem.toString().indexOf('[native code]') >= 0
);
});
FAULTYDRIVERS.forEach(function(driverName) {
describe(driverName, function() {
beforeEach(function() {

@@ -31,7 +30,11 @@ if (driverName === localforage.LOCALSTORAGE) {

it('fails to setDriver ' + driverName + ' [callback]', function(done) {
it('fails to setDriver ' + driverName + ' [callback]', function(
done
) {
localforage.setDriver(driverName, function() {
localforage.ready(function(err) {
expect(err).to.be.an(Error);
expect(err.message).to.be('No available storage method found.');
expect(err.message).to.be(
'No available storage method found.'
);
done();

@@ -42,14 +45,20 @@ });

it('fails to setDriver ' + driverName + ' [promise]', function(done) {
localforage.setDriver(driverName).then(function() {
return localforage.ready();
}).then(null, function(err) {
expect(err).to.be.an(Error);
expect(err.message).to.be('No available storage method found.');
done();
});
it('fails to setDriver ' + driverName + ' [promise]', function(
done
) {
localforage
.setDriver(driverName)
.then(function() {
return localforage.ready();
})
.then(null, function(err) {
expect(err).to.be.an(Error);
expect(err.message).to.be(
'No available storage method found.'
);
done();
});
});
});
});
});

@@ -10,4 +10,4 @@ /* global before:true, after:true, describe:true, expect:true, it:true */

// TODO: Get this to be cross-origin.
iFrame.src = 'http://' + window.location.host +
'/test/test.iframecontents.html';
iFrame.src =
'http://' + window.location.host + '/test/test.iframecontents.html';

@@ -24,5 +24,5 @@ window.document.body.appendChild(iFrame);

var timer = setInterval(function() {
var element = window.document.getElementById('iframe')
.contentWindow.document
.getElementById('my-text');
var element = window.document
.getElementById('iframe')
.contentWindow.document.getElementById('my-text');
if (element && element.innerHTML) {

@@ -29,0 +29,0 @@ clearInterval(timer);

@@ -13,13 +13,15 @@ /* global describe:true, expect:true, it:true, Modernizr:true */

expect(localforage.supports(localforage.INDEXEDDB)).to.be(false);
expect(localforage.supports(localforage.INDEXEDDB))
.to.be(Modernizr.indexeddb);
expect(localforage.supports(localforage.INDEXEDDB)).to.be(
Modernizr.indexeddb
);
expect(localforage.supports(localforage.LOCALSTORAGE))
.to.be(false);
expect(localforage.supports(localforage.LOCALSTORAGE))
.to.be(Modernizr.localstorage);
expect(localforage.supports(localforage.LOCALSTORAGE)).to.be(false);
expect(localforage.supports(localforage.LOCALSTORAGE)).to.be(
Modernizr.localstorage
);
expect(localforage.supports(localforage.WEBSQL)).to.be(false);
expect(localforage.supports(localforage.WEBSQL))
.to.be(Modernizr.websqldatabase);
expect(localforage.supports(localforage.WEBSQL)).to.be(
Modernizr.websqldatabase
);
});

@@ -83,3 +85,2 @@

});
});

@@ -9,5 +9,7 @@ /* global navigator:true, window:true, Modernizr:true, describe:true, expect:true, it:true, xit:true, before:true, beforeEach:true, after:true*/

DRIVERS.forEach(function(driverName) {
if ((!Modernizr.indexeddb && driverName === localforage.INDEXEDDB) ||
if (
(!Modernizr.indexeddb && driverName === localforage.INDEXEDDB) ||
(!Modernizr.localstorage && driverName === localforage.LOCALSTORAGE) ||
(!Modernizr.websqldatabase && driverName === localforage.WEBSQL)) {
(!Modernizr.websqldatabase && driverName === localforage.WEBSQL)
) {
// Browser doesn't support this storage library, so we exit the API

@@ -69,4 +71,6 @@ // tests.

if (driverName === localforage.LOCALSTORAGE ||
driverName === localforage.WEBSQL) {
if (
driverName === localforage.LOCALSTORAGE ||
driverName === localforage.WEBSQL
) {
it.skip(driverName + ' is not supported in service workers');

@@ -82,4 +86,3 @@ return;

.then(function(result) {
expect(result)
.to.equal('serviceworker present');
expect(result).to.equal('serviceworker present');
done();

@@ -95,4 +98,5 @@ })

messageChannel.port1.onmessage = function(event) {
expect(event.data.body)
.to.be('I have been set using ' + driverName);
expect(event.data.body).to.be(
'I have been set using ' + driverName
);
done();

@@ -103,6 +107,9 @@ };

.then(function(registration) {
registration.active.postMessage({
driver: driverName,
value: 'I have been set'
}, [messageChannel.port2]);
registration.active.postMessage(
{
driver: driverName,
value: 'I have been set'
},
[messageChannel.port2]
);
})

@@ -109,0 +116,0 @@ .catch(function(error) {

@@ -9,8 +9,10 @@ /* global before:true, beforeEach:true, describe:true, expect:true, it:true, Modernizr:true */

DRIVERS.forEach(function(driverName) {
if ((!localforage.supports(localforage.INDEXEDDB) &&
driverName === localforage.INDEXEDDB) ||
if (
(!localforage.supports(localforage.INDEXEDDB) &&
driverName === localforage.INDEXEDDB) ||
(!localforage.supports(localforage.LOCALSTORAGE) &&
driverName === localforage.LOCALSTORAGE) ||
driverName === localforage.LOCALSTORAGE) ||
(!localforage.supports(localforage.WEBSQL) &&
driverName === localforage.WEBSQL)) {
driverName === localforage.WEBSQL)
) {
// Browser doesn't support this storage library, so we exit the API

@@ -33,8 +35,10 @@ // tests.

if (!Modernizr.webworkers) {
it.skip('doesn\'t have web worker support');
it.skip("doesn't have web worker support");
return;
}
if (driverName === localforage.LOCALSTORAGE ||
driverName === localforage.WEBSQL) {
if (
driverName === localforage.LOCALSTORAGE ||
driverName === localforage.WEBSQL
) {
it.skip(driverName + ' is not supported in web workers');

@@ -41,0 +45,0 @@ return;

/*globals importScripts:true, self:true */
importScripts("/dist/localforage.js");
importScripts('/dist/localforage.js');
self.addEventListener('message', function(e) {
function handleError(e) {
self.postMessage({
error: JSON.stringify(e),
body: e,
fail: true
});
}
self.addEventListener(
'message',
function(e) {
function handleError(e) {
self.postMessage({
error: JSON.stringify(e),
body: e,
fail: true
});
}
localforage.setDriver(e.data.driver, function() {
localforage.setItem('web worker', e.data.value, function() {
localforage.getItem('web worker', function(err, value) {
self.postMessage({
body: value
});
});
}, handleError).catch(handleError);
}, handleError);
}, false);
localforage.setDriver(
e.data.driver,
function() {
localforage
.setItem(
'web worker',
e.data.value,
function() {
localforage.getItem('web worker', function(
err,
value
) {
self.postMessage({
body: value
});
});
},
handleError
)
.catch(handleError);
},
handleError
);
},
false
);

@@ -1,4 +0,4 @@

/// <reference path="../typings/localforage.d.ts" />
import * as localforage from 'localforage';
declare let localForage: LocalForage;
let localForage: LocalForage = localforage;

@@ -129,2 +129,47 @@ namespace LocalForageTest {

const customDriver: LocalForageDriver = {
_driver: "CustomDriver",
_initStorage: (options: LocalForageOptions) => {},
getItem: <T>(key: string, callback?: (err: any, value: T) => void) => Promise.resolve({} as T),
setItem: <T>(key: string, value: T, callback?: (err: any, value: T) => void) => Promise.resolve(value),
removeItem: (key: string, callback?: (err: any) => void) => Promise.resolve(),
clear: (callback?: (err: any) => void) => Promise.resolve(),
length: (callback?: (err: any, numberOfKeys: number) => void) => Promise.resolve(5),
key: (keyIndex: number, callback?: (err: any, key: string) => void) => Promise.resolve('aKey'),
keys: (callback?: (err: any, keys: string[]) => void) => Promise.resolve(['1', '2']),
iterate: <T, U>(iteratee: (value: T, key: string, iterationNumber: number) => U, callback?: (err: any, result: U) => void) => Promise.resolve({} as U),
};
localForage.defineDriver(customDriver);
const customDriver2: LocalForageDriver = {
_driver: "CustomDriver",
_initStorage: (options: LocalForageOptions) => {},
_support: true,
getItem: <T>(key: string, callback?: (err: any, value: T) => void) => Promise.resolve({} as T),
setItem: <T>(key: string, value: T, callback?: (err: any, value: T) => void) => Promise.resolve(value),
removeItem: (key: string, callback?: (err: any) => void) => Promise.resolve(),
clear: (callback?: (err: any) => void) => Promise.resolve(),
length: (callback?: (err: any, numberOfKeys: number) => void) => Promise.resolve(5),
key: (keyIndex: number, callback?: (err: any, key: string) => void) => Promise.resolve('aKey'),
keys: (callback?: (err: any, keys: string[]) => void) => Promise.resolve(['1', '2']),
iterate: <T, U>(iteratee: (value: T, key: string, iterationNumber: number) => U, callback?: (err: any, result: U) => void) => Promise.resolve({} as U),
};
localForage.defineDriver(customDriver2);
const customDriver3: LocalForageDriver = {
_driver: "CustomDriver",
_initStorage: (options: LocalForageOptions) => {},
_support: () => Promise.resolve(true),
getItem: <T>(key: string, callback?: (err: any, value: T) => void) => Promise.resolve({} as T),
setItem: <T>(key: string, value: T, callback?: (err: any, value: T) => void) => Promise.resolve(value),
removeItem: (key: string, callback?: (err: any) => void) => Promise.resolve(),
clear: (callback?: (err: any) => void) => Promise.resolve(),
length: (callback?: (err: any, numberOfKeys: number) => void) => Promise.resolve(5),
key: (keyIndex: number, callback?: (err: any, key: string) => void) => Promise.resolve('aKey'),
keys: (callback?: (err: any, keys: string[]) => void) => Promise.resolve(['1', '2']),
iterate: <T, U>(iteratee: (value: T, key: string, iterationNumber: number) => U, callback?: (err: any, result: U) => void) => Promise.resolve({} as U),
dropInstance: (dbInstanceOptions?: LocalForageDbInstanceOptions, callback?: (err: any) => void) => Promise.resolve(),
};
localForage.defineDriver(customDriver3);
localForage.getDriver("CustomDriver").then((result: LocalForageDriver) => {

@@ -147,2 +192,8 @@ var driver: LocalForageDriver = result;

const configOptions: LocalForageOptions = {
name: "testyo",
driver: localForage.LOCALSTORAGE
};
config = localForage.config(configOptions);
config = localForage.config({

@@ -157,2 +208,8 @@ name: "testyo",

const configOptions: LocalForageOptions = {
name: "da instance",
driver: localForage.LOCALSTORAGE
};
store = localForage.createInstance(configOptions);
store = localForage.createInstance({

@@ -165,2 +222,26 @@ name: "da instance",

{
localForage.dropInstance().then(() => {});
const dropInstanceOptions: LocalForageDbInstanceOptions = {
name: "da instance",
storeName: "da store"
};
localForage.dropInstance(dropInstanceOptions).then(() => {});
localForage.dropInstance({
name: "da instance",
storeName: "da store"
}).then(() => {});
const dropDbOptions: LocalForageDbInstanceOptions = {
name: "da instance",
};
localForage.dropInstance({
name: "da instance",
}).then(() => {});
}
{
let testSerializer: LocalForageSerializer;

@@ -167,0 +248,0 @@

@@ -0,11 +1,12 @@

interface LocalForageDbInstanceOptions {
name?: string;
interface LocalForageOptions {
storeName?: string;
}
interface LocalForageOptions extends LocalForageDbInstanceOptions {
driver?: string | string[];
name?: string;
size?: number;
storeName?: string;
version?: number;

@@ -16,29 +17,37 @@

interface LocalForageDbMethods {
getItem<T>(key: string): Promise<T>;
getItem<T>(key: string, callback: (err: any, value: T) => void): void;
interface LocalForageDbMethodsCore {
getItem<T>(key: string, callback?: (err: any, value: T) => void): Promise<T>;
setItem<T>(key: string, value: T): Promise<T>;
setItem<T>(key: string, value: T, callback: (err: any, value: T) => void): void;
setItem<T>(key: string, value: T, callback?: (err: any, value: T) => void): Promise<T>;
removeItem(key: string): Promise<void>;
removeItem(key: string, callback: (err: any) => void): void;
removeItem(key: string, callback?: (err: any) => void): Promise<void>;
clear(): Promise<void>;
clear(callback: (err: any) => void): void;
clear(callback?: (err: any) => void): Promise<void>;
length(): Promise<number>;
length(callback: (err: any, numberOfKeys: number) => void): void;
length(callback?: (err: any, numberOfKeys: number) => void): Promise<number>;
key(keyIndex: number): Promise<string>;
key(keyIndex: number, callback: (err: any, key: string) => void): void;
key(keyIndex: number, callback?: (err: any, key: string) => void): Promise<string>;
keys(): Promise<string[]>;
keys(callback: (err: any, keys: string[]) => void): void;
keys(callback?: (err: any, keys: string[]) => void): Promise<string[]>;
iterate<T, U>(iteratee: (value: T, key: string, iterationNumber: number) => U): Promise<U>;
iterate<T, U>(iteratee: (value: T, key: string, iterationNumber: number) => U,
callback: (err: any, result: U) => void): void;
callback?: (err: any, result: U) => void): Promise<U>;
}
interface LocalForageDropInstanceFn {
(dbInstanceOptions?: LocalForageDbInstanceOptions, callback?: (err: any) => void): Promise<void>;
}
interface LocalForageDriverMethodsOptional {
dropInstance?: LocalForageDropInstanceFn;
}
// duplicating LocalForageDriverMethodsOptional to preserve TS v2.0 support,
// since Partial<> isn't supported there
interface LocalForageDbMethodsOptional {
dropInstance: LocalForageDropInstanceFn;
}
interface LocalForageDriverDbMethods extends LocalForageDbMethodsCore, LocalForageDriverMethodsOptional {}
interface LocalForageDriverSupportFunc {

@@ -48,3 +57,3 @@ (): Promise<boolean>;

interface LocalForageDriver extends LocalForageDbMethods {
interface LocalForageDriver extends LocalForageDriverDbMethods {
_driver: string;

@@ -67,2 +76,4 @@

interface LocalForageDbMethods extends LocalForageDbMethodsCore, LocalForageDbMethodsOptional {}
interface LocalForage extends LocalForageDbMethods {

@@ -90,2 +101,3 @@ LOCALSTORAGE: string;

driver(): string;
/**

@@ -95,7 +107,6 @@ * Force usage of a particular driver or drivers, if available.

*/
setDriver(driver: string | string[]): Promise<void>;
setDriver(driver: string | string[], callback: () => void, errorCallback: (error: any) => void): void;
setDriver(driver: string | string[], callback?: () => void, errorCallback?: (error: any) => void): Promise<void>;
defineDriver(driver: LocalForageDriver): Promise<void>;
defineDriver(driver: LocalForageDriver, callback: () => void, errorCallback: (error: any) => void): void;
defineDriver(driver: LocalForageDriver, callback?: () => void, errorCallback?: (error: any) => void): Promise<void>;
/**

@@ -107,9 +118,7 @@ * Return a particular driver

getSerializer(): Promise<LocalForageSerializer>;
getSerializer(callback: (serializer: LocalForageSerializer) => void): void;
getSerializer(callback?: (serializer: LocalForageSerializer) => void): Promise<LocalForageSerializer>;
supports(driverName: string): boolean;
ready(callback: (error: any) => void): void;
ready(): Promise<void>;
ready(callback?: (error: any) => void): Promise<void>;
}

@@ -116,0 +125,0 @@

Sorry, the diff of this file is not supported yet

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

Sorry, the diff of this file is too big to display

SocketSocket SOC 2 Logo

Product

  • Package Alerts
  • Integrations
  • Docs
  • Pricing
  • FAQ
  • Roadmap
  • Changelog

Packages

npm

Stay in touch

Get open source security insights delivered straight into your inbox.


  • Terms
  • Privacy
  • Security

Made with ⚡️ by Socket Inc