localforage
Advanced tools
Comparing version 0.1.0 to 0.1.1
{ | ||
"name": "localforage", | ||
"version": "0.1.0", | ||
"version": "0.1.1", | ||
"main": [ | ||
@@ -10,6 +10,4 @@ "dist/localforage.min.js", | ||
".travis.yml", | ||
"build.sh", | ||
"CONTRIBUTING.md", | ||
"LICENSE", | ||
"Makefile", | ||
"test*", | ||
@@ -16,0 +14,0 @@ "vendor/*" |
@@ -6,8 +6,18 @@ # About this CHANGELOG | ||
## [Version 0.1.1](https://github.com/mozilla/localForage/releases/tag/0.1.1) | ||
* Added config options to allow users to set their own database names, etc. #100 | ||
--- | ||
## March 16th, 2014 | ||
* [Moved Backbone adapter to its own repository](https://github.com/mozilla/localForage/commit/b7987b3091855379d4908376b668b4b51a6fedfe) | ||
## March 13th, 2014 | ||
* [Changed `localforage.driver` to a function instead of the string directly](https://github.com/mozilla/localForage/commit/4941514) | ||
* [Changed `localforage.driver` to a function instead of the string directly](https://github.com/mozilla/localForage/commit/49415145021b0029d2521182de6e338e048fe5b1) | ||
## March 4th, 2014 | ||
* [Changed the IndexedDB database name from `asyncStorage` to `localforage`](https://github.com/mozilla/localForage/commit/f4e0156) | ||
* [Changed the IndexedDB database name from `asyncStorage` to `localforage`](https://github.com/mozilla/localForage/commit/f4e0156a29969a79005ac27b303d7e321a720fc6) |
/*! | ||
localForage -- Offline Storage, Improved | ||
Version 0.1.0 | ||
http://mozilla.github.io/localForage | ||
@@ -791,7 +792,9 @@ (c) 2013-2014 Mozilla, Apache License 2.0 | ||
var DBNAME = 'localforage'; | ||
var DBVERSION = 1; | ||
var STORENAME = 'keyvaluepairs'; | ||
var Promise = window.Promise; | ||
var db = null; | ||
var dbInfo = { | ||
name: 'localforage', | ||
storeName: 'keyvaluepairs', | ||
version: 1 | ||
}; | ||
@@ -808,5 +811,15 @@ // Initialize IndexedDB; fall back to vendor-prefixed versions if needed. | ||
function _initStorage() { | ||
// Open the IndexedDB database (automatically creates one if one didn't | ||
// previously exist), using any options set in window.localForageConfig. | ||
function _initStorage(options) { | ||
if (options) { | ||
for (var i in dbInfo) { | ||
if (options[i] !== undefined) { | ||
dbInfo[i] = options[i]; | ||
} | ||
} | ||
} | ||
return new Promise(function(resolve, reject) { | ||
var openreq = indexedDB.open(DBNAME, DBVERSION); | ||
var openreq = indexedDB.open(dbInfo.name, dbInfo.version); | ||
openreq.onerror = function withStoreOnError() { | ||
@@ -817,7 +830,6 @@ reject(openreq.error.name); | ||
// First time setup: create an empty object store | ||
openreq.result.createObjectStore(STORENAME); | ||
openreq.result.createObjectStore(dbInfo.storeName); | ||
}; | ||
openreq.onsuccess = function withStoreOnSuccess() { | ||
db = openreq.result; | ||
resolve(); | ||
@@ -831,4 +843,3 @@ }; | ||
localforage.ready().then(function() { | ||
var store = db.transaction(STORENAME, 'readonly').objectStore(STORENAME); | ||
var store = db.transaction(dbInfo.storeName, 'readonly').objectStore(dbInfo.storeName); | ||
var req = store.get(key); | ||
@@ -840,3 +851,2 @@ req.onsuccess = function getItemOnSuccess() { | ||
} | ||
if (callback) { | ||
@@ -858,3 +868,3 @@ callback(value); | ||
localforage.ready().then(function() { | ||
var store = db.transaction(STORENAME, 'readwrite').objectStore(STORENAME); | ||
var store = db.transaction(dbInfo.storeName, 'readwrite').objectStore(dbInfo.storeName); | ||
@@ -888,3 +898,3 @@ // Cast to undefined so the value passed to callback/promise is | ||
localforage.ready().then(function() { | ||
var store = db.transaction(STORENAME, 'readwrite').objectStore(STORENAME); | ||
var store = db.transaction(dbInfo.storeName, 'readwrite').objectStore(dbInfo.storeName); | ||
@@ -905,3 +915,2 @@ // We use `['delete']` instead of `.delete` because IE 8 will | ||
} | ||
resolve(); | ||
@@ -919,4 +928,3 @@ }; | ||
localforage.ready().then(function() { | ||
var store = db.transaction(STORENAME, 'readwrite').objectStore(STORENAME); | ||
var store = db.transaction(dbInfo.storeName, 'readwrite').objectStore(dbInfo.storeName); | ||
var req = store.clear(); | ||
@@ -940,4 +948,3 @@ req.onsuccess = function clearOnSuccess() { | ||
localforage.ready().then(function() { | ||
var store = db.transaction(STORENAME, 'readonly').objectStore(STORENAME); | ||
var store = db.transaction(dbInfo.storeName, 'readonly').objectStore(dbInfo.storeName); | ||
var req = store.count(); | ||
@@ -971,3 +978,3 @@ req.onsuccess = function lengthOnSuccess() { | ||
localforage.ready().then(function() { | ||
var store = db.transaction(STORENAME, 'readonly').objectStore(STORENAME); | ||
var store = db.transaction(dbInfo.storeName, 'readonly').objectStore(dbInfo.storeName); | ||
@@ -1046,2 +1053,6 @@ var advanced = false; | ||
var keyPrefix = ''; | ||
var dbInfo = { | ||
name: 'localforage' | ||
}; | ||
var Promise = window.Promise; | ||
@@ -1063,3 +1074,15 @@ var localStorage = null; | ||
function _initStorage() { | ||
// Config the localStorage backend, using options set in | ||
// window.localForageConfig. | ||
function _initStorage(options) { | ||
if (options) { | ||
for (var i in dbInfo) { | ||
if (options[i] !== undefined) { | ||
dbInfo[i] = options[i]; | ||
} | ||
} | ||
} | ||
keyPrefix = dbInfo.name + '/'; | ||
return Promise.resolve(); | ||
@@ -1091,3 +1114,3 @@ } | ||
try { | ||
var result = localStorage.getItem(key); | ||
var result = localStorage.getItem(keyPrefix + key); | ||
@@ -1119,6 +1142,10 @@ // If a result was found, parse it from serialized JSON into a | ||
// Remove the prefix from the key, if a key is found. | ||
if (result) { | ||
result = result.substring(keyPrefix.length); | ||
} | ||
if (callback) { | ||
callback(result); | ||
} | ||
resolve(result); | ||
@@ -1148,3 +1175,3 @@ }); | ||
localforage.ready().then(function() { | ||
localStorage.removeItem(key); | ||
localStorage.removeItem(keyPrefix + key); | ||
@@ -1182,3 +1209,3 @@ if (callback) { | ||
localStorage.setItem(key, value); | ||
localStorage.setItem(keyPrefix + key, value); | ||
@@ -1219,3 +1246,2 @@ if (callback) { | ||
var DB_NAME = 'localforage'; | ||
// Default DB size is _JUST UNDER_ 5MB, as it's the highest size we can use | ||
@@ -1226,8 +1252,12 @@ // without a prompt. | ||
var DB_SIZE = 4980736; | ||
var DB_VERSION = '1.0'; | ||
var SERIALIZED_MARKER = '__lfsc__:'; | ||
var SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER.length; | ||
var STORE_NAME = 'keyvaluepairs'; | ||
var Promise = window.Promise; | ||
var db = null; | ||
var dbInfo = { | ||
description: '', | ||
name: 'localforage', | ||
storeName: 'keyvaluepairs', | ||
version: '1.0' | ||
}; | ||
@@ -1239,14 +1269,22 @@ // If WebSQL methods aren't available, we can stop now. | ||
function _initStorage() { | ||
// Open the WebSQL database (automatically creates one if one didn't | ||
// previously exist), using any options set in window.localForageConfig. | ||
function _initStorage(options) { | ||
if (options) { | ||
for (var i in dbInfo) { | ||
if (options[i] !== undefined) { | ||
dbInfo[i] = typeof(options[i]) !== 'string' ? options[i].toString() : options[i]; | ||
} | ||
} | ||
} | ||
return new Promise(function(resolve, reject) { | ||
// Open the database; the openDatabase API will automatically create it for | ||
// us if it doesn't exist. | ||
db = window.openDatabase(DB_NAME, DB_VERSION, STORE_NAME, DB_SIZE); | ||
// Open the database; the openDatabase API will automatically | ||
// create it for us if it doesn't exist. | ||
db = window.openDatabase(dbInfo.name, dbInfo.version, | ||
dbInfo.description, DB_SIZE); | ||
// Create our key/value table if it doesn't exist. | ||
// TODO: Technically I can imagine this being as race condition, as I'm not | ||
// positive on the WebSQL API enough to be sure that other transactions | ||
// won't be run before this? But I assume not. | ||
db.transaction(function (t) { | ||
t.executeSql('CREATE TABLE IF NOT EXISTS localforage (id INTEGER PRIMARY KEY, key unique, value)', [], function(t, results) { | ||
t.executeSql('CREATE TABLE IF NOT EXISTS ' + dbInfo.storeName + ' (id INTEGER PRIMARY KEY, key unique, value)', [], function() { | ||
resolve(); | ||
@@ -1262,3 +1300,3 @@ }, null); | ||
db.transaction(function (t) { | ||
t.executeSql('SELECT * FROM localforage WHERE key = ? LIMIT 1', [key], function (t, results) { | ||
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; | ||
@@ -1311,3 +1349,3 @@ | ||
db.transaction(function (t) { | ||
t.executeSql('INSERT OR REPLACE INTO localforage (key, value) VALUES (?, ?)', [key, valueToSave], function() { | ||
t.executeSql('INSERT OR REPLACE INTO ' + dbInfo.storeName + ' (key, value) VALUES (?, ?)', [key, valueToSave], function() { | ||
if (callback) { | ||
@@ -1328,3 +1366,3 @@ callback(value); | ||
db.transaction(function (t) { | ||
t.executeSql('DELETE FROM localforage WHERE key = ?', [key], function() { | ||
t.executeSql('DELETE FROM ' + dbInfo.storeName + ' WHERE key = ?', [key], function() { | ||
if (callback) { | ||
@@ -1347,3 +1385,3 @@ callback(); | ||
db.transaction(function (t) { | ||
t.executeSql('DELETE FROM localforage', [], function(t, results) { | ||
t.executeSql('DELETE FROM ' + dbInfo.storeName, [], function(t, results) { | ||
if (callback) { | ||
@@ -1367,3 +1405,3 @@ callback(); | ||
// Ahhh, SQL makes this one soooooo easy. | ||
t.executeSql('SELECT COUNT(key) as c FROM localforage', [], function (t, results) { | ||
t.executeSql('SELECT COUNT(key) as c FROM ' + dbInfo.storeName, [], function (t, results) { | ||
var result = results.rows.item(0).c; | ||
@@ -1393,3 +1431,3 @@ | ||
db.transaction(function (t) { | ||
t.executeSql('SELECT key FROM localforage WHERE id = ? LIMIT 1', [n + 1], function (t, results) { | ||
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; | ||
@@ -1490,3 +1528,3 @@ | ||
localForage._initStorage().then(function() { | ||
localForage._initStorage(window.localForageConfig).then(function() { | ||
if (callback) { | ||
@@ -1514,3 +1552,3 @@ callback(localForage); | ||
localForage._initStorage().then(function() { | ||
localForage._initStorage(window.localForageConfig).then(function() { | ||
if (callback) { | ||
@@ -1525,3 +1563,3 @@ callback(localForage); | ||
localForage._initStorage().then(function() { | ||
localForage._initStorage(window.localForageConfig).then(function() { | ||
if (callback) { | ||
@@ -1528,0 +1566,0 @@ callback(localForage); |
@@ -1,1 +0,1 @@ | ||
!function(){var a,b,c,d;!function(){var e={},f={};a=function(a,b,c){e[a]={deps:b,callback:c}},d=c=b=function(a){function c(b){if("."!==b.charAt(0))return b;for(var c=b.split("/"),d=a.split("/").slice(0,-1),e=0,f=c.length;f>e;e++){var g=c[e];if(".."===g)d.pop();else{if("."===g)continue;d.push(g)}}return d.join("/")}if(d._eak_seen=e,f[a])return f[a];if(f[a]={},!e[a])throw new Error("Could not find module "+a);for(var g,h=e[a],i=h.deps,j=h.callback,k=[],l=0,m=i.length;m>l;l++)k.push("exports"===i[l]?g={}:b(c(i[l])));var n=j.apply(this,k);return f[a]=g||n}}(),a("promise/all",["./utils","exports"],function(a,b){"use strict";function c(a){var b=this;if(!d(a))throw new TypeError("You must pass an array to all.");return new b(function(b,c){function d(a){return function(b){f(a,b)}}function f(a,c){h[a]=c,0===--i&&b(h)}var g,h=[],i=a.length;0===i&&b([]);for(var j=0;j<a.length;j++)g=a[j],g&&e(g.then)?g.then(d(j),c):f(j,g)})}var d=a.isArray,e=a.isFunction;b.all=c}),a("promise/asap",["exports"],function(a){"use strict";function b(){return function(){process.nextTick(e)}}function c(){var a=0,b=new i(e),c=document.createTextNode("");return b.observe(c,{characterData:!0}),function(){c.data=a=++a%2}}function d(){return function(){j.setTimeout(e,1)}}function e(){for(var a=0;a<k.length;a++){var b=k[a],c=b[0],d=b[1];c(d)}k=[]}function f(a,b){var c=k.push([a,b]);1===c&&g()}var g,h="undefined"!=typeof window?window:{},i=h.MutationObserver||h.WebKitMutationObserver,j="undefined"!=typeof global?global:this,k=[];g="undefined"!=typeof process&&"[object process]"==={}.toString.call(process)?b():i?c():d(),a.asap=f}),a("promise/cast",["exports"],function(a){"use strict";function b(a){if(a&&"object"==typeof a&&a.constructor===this)return a;var b=this;return new b(function(b){b(a)})}a.cast=b}),a("promise/config",["exports"],function(a){"use strict";function b(a,b){return 2!==arguments.length?c[a]:void(c[a]=b)}var c={instrument:!1};a.config=c,a.configure=b}),a("promise/polyfill",["./promise","./utils","exports"],function(a,b,c){"use strict";function d(){var a="Promise"in window&&"cast"in window.Promise&&"resolve"in window.Promise&&"reject"in window.Promise&&"all"in window.Promise&&"race"in window.Promise&&function(){var a;return new window.Promise(function(b){a=b}),f(a)}();a||(window.Promise=e)}var e=a.Promise,f=b.isFunction;c.polyfill=d}),a("promise/promise",["./config","./utils","./cast","./all","./race","./resolve","./reject","./asap","exports"],function(a,b,c,d,e,f,g,h,i){"use strict";function j(a){if(!w(a))throw new TypeError("You must pass a resolver function as the first argument to the promise constructor");if(!(this instanceof j))throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.");this._subscribers=[],k(a,this)}function k(a,b){function c(a){p(b,a)}function d(a){r(b,a)}try{a(c,d)}catch(e){d(e)}}function l(a,b,c,d){var e,f,g,h,i=w(c);if(i)try{e=c(d),g=!0}catch(j){h=!0,f=j}else e=d,g=!0;o(b,e)||(i&&g?p(b,e):h?r(b,f):a===F?p(b,e):a===G&&r(b,e))}function m(a,b,c,d){var e=a._subscribers,f=e.length;e[f]=b,e[f+F]=c,e[f+G]=d}function n(a,b){for(var c,d,e=a._subscribers,f=a._detail,g=0;g<e.length;g+=3)c=e[g],d=e[g+b],l(b,c,d,f);a._subscribers=null}function o(a,b){var c,d=null;try{if(a===b)throw new TypeError("A promises callback cannot return that same promise.");if(v(b)&&(d=b.then,w(d)))return d.call(b,function(d){return c?!0:(c=!0,void(b!==d?p(a,d):q(a,d)))},function(b){return c?!0:(c=!0,void r(a,b))}),!0}catch(e){return c?!0:(r(a,e),!0)}return!1}function p(a,b){a===b?q(a,b):o(a,b)||q(a,b)}function q(a,b){a._state===D&&(a._state=E,a._detail=b,u.async(s,a))}function r(a,b){a._state===D&&(a._state=E,a._detail=b,u.async(t,a))}function s(a){n(a,a._state=F)}function t(a){n(a,a._state=G)}var u=a.config,v=(a.configure,b.objectOrFunction),w=b.isFunction,x=(b.now,c.cast),y=d.all,z=e.race,A=f.resolve,B=g.reject,C=h.asap;u.async=C;var D=void 0,E=0,F=1,G=2;j.prototype={constructor:j,_state:void 0,_detail:void 0,_subscribers:void 0,then:function(a,b){var c=this,d=new this.constructor(function(){});if(this._state){var e=arguments;u.async(function(){l(c._state,d,e[c._state-1],c._detail)})}else m(this,d,a,b);return d},"catch":function(a){return this.then(null,a)}},j.all=y,j.cast=x,j.race=z,j.resolve=A,j.reject=B,i.Promise=j}),a("promise/race",["./utils","exports"],function(a,b){"use strict";function c(a){var b=this;if(!d(a))throw new TypeError("You must pass an array to race.");return new b(function(b,c){for(var d,e=0;e<a.length;e++)d=a[e],d&&"function"==typeof d.then?d.then(b,c):b(d)})}var d=a.isArray;b.race=c}),a("promise/reject",["exports"],function(a){"use strict";function b(a){var b=this;return new b(function(b,c){c(a)})}a.reject=b}),a("promise/resolve",["exports"],function(a){"use strict";function b(a){var b=this;return new b(function(b){b(a)})}a.resolve=b}),a("promise/utils",["exports"],function(a){"use strict";function b(a){return c(a)||"object"==typeof a&&null!==a}function c(a){return"function"==typeof a}function d(a){return"[object Array]"===Object.prototype.toString.call(a)}var e=Date.now||function(){return(new Date).getTime()};a.objectOrFunction=b,a.isFunction=c,a.isArray=d,a.now=e}),b("promise/polyfill").polyfill()}(),function(){"use strict";function a(){return new k(function(a,b){var c=m.open(h,i);c.onerror=function(){b(c.error.name)},c.onupgradeneeded=function(){c.result.createObjectStore(j)},c.onsuccess=function(){l=c.result,a()}})}function b(a,b){return new k(function(c,d){localforage.ready().then(function(){var e=l.transaction(j,"readonly").objectStore(j),f=e.get(a);f.onsuccess=function(){var a=f.result;void 0===a&&(a=null),b&&b(a),c(a)},f.onerror=function(){d(f.error.name)}})})}function c(a,b,c){return new k(function(d,e){localforage.ready().then(function(){var f=l.transaction(j,"readwrite").objectStore(j);void 0===b&&(b=null);var g=f.put(b,a);g.onsuccess=function(){c&&c(b),d(b)},g.onerror=function(){e(g.error.name)}})})}function d(a,b){return new k(function(c,d){localforage.ready().then(function(){var e=l.transaction(j,"readwrite").objectStore(j),f=e["delete"](a);f.onsuccess=function(){b&&b(),c()},f.onerror=function(){d(f.error.name)}})})}function e(a){return new k(function(b,c){localforage.ready().then(function(){var d=l.transaction(j,"readwrite").objectStore(j),e=d.clear();e.onsuccess=function(){a&&a(),b()},e.onerror=function(){c(e.error.name)}})})}function f(a){return new k(function(b,c){localforage.ready().then(function(){var d=l.transaction(j,"readonly").objectStore(j),e=d.count();e.onsuccess=function(){a&&a(e.result),b(e.result)},e.onerror=function(){c(e.error.name)}})})}function g(a,b){return new k(function(c,d){return 0>a?(b&&b(null),void c(null)):void localforage.ready().then(function(){var e=l.transaction(j,"readonly").objectStore(j),f=!1,g=e.openCursor();g.onsuccess=function(){var d=g.result;return d?void(0===a?(b&&b(d.key),c(d.key)):f?(b&&b(d.key),c(d.key)):(f=!0,d.advance(a))):(b&&b(null),void c(null))},g.onerror=function(){d(g.error.name)}})})}var h="localforage",i=1,j="keyvaluepairs",k=window.Promise,l=null,m=m||window.indexedDB||window.webkitIndexedDB||window.mozIndexedDB||window.OIndexedDB||window.msIndexedDB;if(m){var n={_driver:"asyncStorage",_initStorage:a,getItem:b,setItem:c,removeItem:d,clear:e,length:f,key:g};"function"==typeof define&&define.amd?define("asyncStorage",function(){return n}):"undefined"!=typeof module&&module.exports?module.exports=n:this.asyncStorage=n}}.call(this),function(){"use strict";function a(){return h.resolve()}function b(a){return new h(function(b){localforage.ready().then(function(){i.clear(),a&&a(),b()})})}function c(a,b){return new h(function(c,d){localforage.ready().then(function(){try{var e=i.getItem(a);e&&(e=JSON.parse(e)),b&&b(e),c(e)}catch(f){d(f)}})})}function d(a,b){return new h(function(c){localforage.ready().then(function(){var d=i.key(a);b&&b(d),c(d)})})}function e(a){return new h(function(b){localforage.ready().then(function(){var c=i.length;a&&a(c),b(c)})})}function f(a,b){return new h(function(c){localforage.ready().then(function(){i.removeItem(a),b&&b(),c()})})}function g(a,b,c){return new h(function(d,e){localforage.ready().then(function(){void 0===b&&(b=null);var f=b;try{b=JSON.stringify(b)}catch(g){e(g)}i.setItem(a,b),c&&c(f),d(f)})})}var h=window.Promise,i=null;try{i=window.localStorage}catch(j){return}var k={_driver:"localStorageWrapper",_initStorage:a,getItem:c,setItem:g,removeItem:f,clear:b,length:e,key:d};"function"==typeof define&&define.amd?define("localStorageWrapper",function(){return k}):"undefined"!=typeof module&&module.exports?module.exports=k:this.localStorageWrapper=k}.call(this),function(){"use strict";function a(){return new n(function(a){o=window.openDatabase(h,j,m,i),o.transaction(function(b){b.executeSql("CREATE TABLE IF NOT EXISTS localforage (id INTEGER PRIMARY KEY, key unique, value)",[],function(){a()},null)})})}function b(a,b){return new n(function(c,d){localforage.ready().then(function(){o.transaction(function(e){e.executeSql("SELECT * FROM localforage WHERE key = ? LIMIT 1",[a],function(a,e){var f=e.rows.length?e.rows.item(0).value:null;if(f&&f.substr(0,l)===k)try{f=JSON.parse(f.slice(l))}catch(g){d(g)}b&&b(f),c(f)},null)})})})}function c(a,b,c){return new n(function(d){localforage.ready().then(function(){void 0===b&&(b=null);var e;e="boolean"==typeof b||"number"==typeof b||"object"==typeof b?k+JSON.stringify(b):b,o.transaction(function(f){f.executeSql("INSERT OR REPLACE INTO localforage (key, value) VALUES (?, ?)",[a,e],function(){c&&c(b),d(b)},null)})})})}function d(a,b){return new n(function(c){localforage.ready().then(function(){o.transaction(function(d){d.executeSql("DELETE FROM localforage WHERE key = ?",[a],function(){b&&b(),c()},null)})})})}function e(a){return new n(function(b){localforage.ready().then(function(){o.transaction(function(c){c.executeSql("DELETE FROM localforage",[],function(){a&&a(),b()},null)})})})}function f(a){return new n(function(b){localforage.ready().then(function(){o.transaction(function(c){c.executeSql("SELECT COUNT(key) as c FROM localforage",[],function(c,d){var e=d.rows.item(0).c;a&&a(e),b(e)},null)})})})}function g(a,b){return new n(function(c){localforage.ready().then(function(){o.transaction(function(d){d.executeSql("SELECT key FROM localforage WHERE id = ? LIMIT 1",[a+1],function(a,d){var e=d.rows.length?d.rows.item(0).key:null;b&&b(e),c(e)},null)})})})}var h="localforage",i=4980736,j="1.0",k="__lfsc__:",l=k.length,m="keyvaluepairs",n=window.Promise,o=null;if(window.openDatabase){var p={_driver:"webSQLStorage",_initStorage:a,getItem:b,setItem:c,removeItem:d,clear:e,length:f,key:g};"function"==typeof define&&define.amd?define("webSQLStorage",function(){return p}):"undefined"!=typeof module&&module.exports?module.exports=p:this.webSQLStorage=p}}.call(this),function(){"use strict";var a=window.Promise,b=1,c=2,d=3,e=d;"function"==typeof define&&define.amd?e=b:"undefined"!=typeof module&&module.exports&&(e=c);var f,g=g||window.indexedDB||window.webkitIndexedDB||window.mozIndexedDB||window.OIndexedDB||window.msIndexedDB,h=this,i={INDEXEDDB:"asyncStorage",LOCALSTORAGE:"localStorageWrapper",WEBSQL:"webSQLStorage",driver:function(){return i._driver||null},_ready:a.reject(new Error("setDriver() wasn't called")),setDriver:function(d,f){return this._ready=new a(function(a,j){if(!g&&d===i.INDEXEDDB||!window.openDatabase&&d===i.WEBSQL)return f&&f(i),void j(i);if(e===b)require([d],function(b){i._extend(b),i._initStorage().then(function(){f&&f(i),a(i)})});else if(e===c){var k;switch(d){case i.INDEXEDDB:k=require("localforage/src/drivers/indexeddb");break;case i.LOCALSTORAGE:k=require("localforage/src/drivers/localstorage");break;case i.WEBSQL:k=require("localforage/src/drivers/websql")}i._extend(k),i._initStorage().then(function(){f&&f(i),a(i)})}else i._extend(h[d]),i._initStorage().then(function(){f&&f(i),a(i)})}),i._ready},ready:function(){return this._ready},_extend:function(a){for(var b in a)a.hasOwnProperty(b)&&(this[b]=a[b])}};f=g?i.INDEXEDDB:window.openDatabase?i.WEBSQL:i.LOCALSTORAGE,i.setDriver(f),e===b?define(function(){return i}):e===c?module.exports=i:this.localforage=i}.call(this); | ||
!function(){var a,b,c,d;!function(){var e={},f={};a=function(a,b,c){e[a]={deps:b,callback:c}},d=c=b=function(a){function c(b){if("."!==b.charAt(0))return b;for(var c=b.split("/"),d=a.split("/").slice(0,-1),e=0,f=c.length;f>e;e++){var g=c[e];if(".."===g)d.pop();else{if("."===g)continue;d.push(g)}}return d.join("/")}if(d._eak_seen=e,f[a])return f[a];if(f[a]={},!e[a])throw new Error("Could not find module "+a);for(var g,h=e[a],i=h.deps,j=h.callback,k=[],l=0,m=i.length;m>l;l++)k.push("exports"===i[l]?g={}:b(c(i[l])));var n=j.apply(this,k);return f[a]=g||n}}(),a("promise/all",["./utils","exports"],function(a,b){"use strict";function c(a){var b=this;if(!d(a))throw new TypeError("You must pass an array to all.");return new b(function(b,c){function d(a){return function(b){f(a,b)}}function f(a,c){h[a]=c,0===--i&&b(h)}var g,h=[],i=a.length;0===i&&b([]);for(var j=0;j<a.length;j++)g=a[j],g&&e(g.then)?g.then(d(j),c):f(j,g)})}var d=a.isArray,e=a.isFunction;b.all=c}),a("promise/asap",["exports"],function(a){"use strict";function b(){return function(){process.nextTick(e)}}function c(){var a=0,b=new i(e),c=document.createTextNode("");return b.observe(c,{characterData:!0}),function(){c.data=a=++a%2}}function d(){return function(){j.setTimeout(e,1)}}function e(){for(var a=0;a<k.length;a++){var b=k[a],c=b[0],d=b[1];c(d)}k=[]}function f(a,b){var c=k.push([a,b]);1===c&&g()}var g,h="undefined"!=typeof window?window:{},i=h.MutationObserver||h.WebKitMutationObserver,j="undefined"!=typeof global?global:this,k=[];g="undefined"!=typeof process&&"[object process]"==={}.toString.call(process)?b():i?c():d(),a.asap=f}),a("promise/cast",["exports"],function(a){"use strict";function b(a){if(a&&"object"==typeof a&&a.constructor===this)return a;var b=this;return new b(function(b){b(a)})}a.cast=b}),a("promise/config",["exports"],function(a){"use strict";function b(a,b){return 2!==arguments.length?c[a]:void(c[a]=b)}var c={instrument:!1};a.config=c,a.configure=b}),a("promise/polyfill",["./promise","./utils","exports"],function(a,b,c){"use strict";function d(){var a="Promise"in window&&"cast"in window.Promise&&"resolve"in window.Promise&&"reject"in window.Promise&&"all"in window.Promise&&"race"in window.Promise&&function(){var a;return new window.Promise(function(b){a=b}),f(a)}();a||(window.Promise=e)}var e=a.Promise,f=b.isFunction;c.polyfill=d}),a("promise/promise",["./config","./utils","./cast","./all","./race","./resolve","./reject","./asap","exports"],function(a,b,c,d,e,f,g,h,i){"use strict";function j(a){if(!w(a))throw new TypeError("You must pass a resolver function as the first argument to the promise constructor");if(!(this instanceof j))throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.");this._subscribers=[],k(a,this)}function k(a,b){function c(a){p(b,a)}function d(a){r(b,a)}try{a(c,d)}catch(e){d(e)}}function l(a,b,c,d){var e,f,g,h,i=w(c);if(i)try{e=c(d),g=!0}catch(j){h=!0,f=j}else e=d,g=!0;o(b,e)||(i&&g?p(b,e):h?r(b,f):a===F?p(b,e):a===G&&r(b,e))}function m(a,b,c,d){var e=a._subscribers,f=e.length;e[f]=b,e[f+F]=c,e[f+G]=d}function n(a,b){for(var c,d,e=a._subscribers,f=a._detail,g=0;g<e.length;g+=3)c=e[g],d=e[g+b],l(b,c,d,f);a._subscribers=null}function o(a,b){var c,d=null;try{if(a===b)throw new TypeError("A promises callback cannot return that same promise.");if(v(b)&&(d=b.then,w(d)))return d.call(b,function(d){return c?!0:(c=!0,void(b!==d?p(a,d):q(a,d)))},function(b){return c?!0:(c=!0,void r(a,b))}),!0}catch(e){return c?!0:(r(a,e),!0)}return!1}function p(a,b){a===b?q(a,b):o(a,b)||q(a,b)}function q(a,b){a._state===D&&(a._state=E,a._detail=b,u.async(s,a))}function r(a,b){a._state===D&&(a._state=E,a._detail=b,u.async(t,a))}function s(a){n(a,a._state=F)}function t(a){n(a,a._state=G)}var u=a.config,v=(a.configure,b.objectOrFunction),w=b.isFunction,x=(b.now,c.cast),y=d.all,z=e.race,A=f.resolve,B=g.reject,C=h.asap;u.async=C;var D=void 0,E=0,F=1,G=2;j.prototype={constructor:j,_state:void 0,_detail:void 0,_subscribers:void 0,then:function(a,b){var c=this,d=new this.constructor(function(){});if(this._state){var e=arguments;u.async(function(){l(c._state,d,e[c._state-1],c._detail)})}else m(this,d,a,b);return d},"catch":function(a){return this.then(null,a)}},j.all=y,j.cast=x,j.race=z,j.resolve=A,j.reject=B,i.Promise=j}),a("promise/race",["./utils","exports"],function(a,b){"use strict";function c(a){var b=this;if(!d(a))throw new TypeError("You must pass an array to race.");return new b(function(b,c){for(var d,e=0;e<a.length;e++)d=a[e],d&&"function"==typeof d.then?d.then(b,c):b(d)})}var d=a.isArray;b.race=c}),a("promise/reject",["exports"],function(a){"use strict";function b(a){var b=this;return new b(function(b,c){c(a)})}a.reject=b}),a("promise/resolve",["exports"],function(a){"use strict";function b(a){var b=this;return new b(function(b){b(a)})}a.resolve=b}),a("promise/utils",["exports"],function(a){"use strict";function b(a){return c(a)||"object"==typeof a&&null!==a}function c(a){return"function"==typeof a}function d(a){return"[object Array]"===Object.prototype.toString.call(a)}var e=Date.now||function(){return(new Date).getTime()};a.objectOrFunction=b,a.isFunction=c,a.isArray=d,a.now=e}),b("promise/polyfill").polyfill()}(),function(){"use strict";function a(a){if(a)for(var b in j)void 0!==a[b]&&(j[b]=a[b]);return new h(function(a,b){var c=k.open(j.name,j.version);c.onerror=function(){b(c.error.name)},c.onupgradeneeded=function(){c.result.createObjectStore(j.storeName)},c.onsuccess=function(){i=c.result,a()}})}function b(a,b){return new h(function(c,d){localforage.ready().then(function(){var e=i.transaction(j.storeName,"readonly").objectStore(j.storeName),f=e.get(a);f.onsuccess=function(){var a=f.result;void 0===a&&(a=null),b&&b(a),c(a)},f.onerror=function(){d(f.error.name)}})})}function c(a,b,c){return new h(function(d,e){localforage.ready().then(function(){var f=i.transaction(j.storeName,"readwrite").objectStore(j.storeName);void 0===b&&(b=null);var g=f.put(b,a);g.onsuccess=function(){c&&c(b),d(b)},g.onerror=function(){e(g.error.name)}})})}function d(a,b){return new h(function(c,d){localforage.ready().then(function(){var e=i.transaction(j.storeName,"readwrite").objectStore(j.storeName),f=e["delete"](a);f.onsuccess=function(){b&&b(),c()},f.onerror=function(){d(f.error.name)}})})}function e(a){return new h(function(b,c){localforage.ready().then(function(){var d=i.transaction(j.storeName,"readwrite").objectStore(j.storeName),e=d.clear();e.onsuccess=function(){a&&a(),b()},e.onerror=function(){c(e.error.name)}})})}function f(a){return new h(function(b,c){localforage.ready().then(function(){var d=i.transaction(j.storeName,"readonly").objectStore(j.storeName),e=d.count();e.onsuccess=function(){a&&a(e.result),b(e.result)},e.onerror=function(){c(e.error.name)}})})}function g(a,b){return new h(function(c,d){return 0>a?(b&&b(null),void c(null)):void localforage.ready().then(function(){var e=i.transaction(j.storeName,"readonly").objectStore(j.storeName),f=!1,g=e.openCursor();g.onsuccess=function(){var d=g.result;return d?void(0===a?(b&&b(d.key),c(d.key)):f?(b&&b(d.key),c(d.key)):(f=!0,d.advance(a))):(b&&b(null),void c(null))},g.onerror=function(){d(g.error.name)}})})}var h=window.Promise,i=null,j={name:"localforage",storeName:"keyvaluepairs",version:1},k=k||window.indexedDB||window.webkitIndexedDB||window.mozIndexedDB||window.OIndexedDB||window.msIndexedDB;if(k){var l={_driver:"asyncStorage",_initStorage:a,getItem:b,setItem:c,removeItem:d,clear:e,length:f,key:g};"function"==typeof define&&define.amd?define("asyncStorage",function(){return l}):"undefined"!=typeof module&&module.exports?module.exports=l:this.asyncStorage=l}}.call(this),function(){"use strict";function a(a){if(a)for(var b in i)void 0!==a[b]&&(i[b]=a[b]);return h=i.name+"/",j.resolve()}function b(a){return new j(function(b){localforage.ready().then(function(){k.clear(),a&&a(),b()})})}function c(a,b){return new j(function(c,d){localforage.ready().then(function(){try{var e=k.getItem(h+a);e&&(e=JSON.parse(e)),b&&b(e),c(e)}catch(f){d(f)}})})}function d(a,b){return new j(function(c){localforage.ready().then(function(){var d=k.key(a);d&&(d=d.substring(h.length)),b&&b(d),c(d)})})}function e(a){return new j(function(b){localforage.ready().then(function(){var c=k.length;a&&a(c),b(c)})})}function f(a,b){return new j(function(c){localforage.ready().then(function(){k.removeItem(h+a),b&&b(),c()})})}function g(a,b,c){return new j(function(d,e){localforage.ready().then(function(){void 0===b&&(b=null);var f=b;try{b=JSON.stringify(b)}catch(g){e(g)}k.setItem(h+a,b),c&&c(f),d(f)})})}var h="",i={name:"localforage"},j=window.Promise,k=null;try{k=window.localStorage}catch(l){return}var m={_driver:"localStorageWrapper",_initStorage:a,getItem:c,setItem:g,removeItem:f,clear:b,length:e,key:d};"function"==typeof define&&define.amd?define("localStorageWrapper",function(){return m}):"undefined"!=typeof module&&module.exports?module.exports=m:this.localStorageWrapper=m}.call(this),function(){"use strict";function a(a){if(a)for(var b in m)void 0!==a[b]&&(m[b]="string"!=typeof a[b]?a[b].toString():a[b]);return new k(function(a){l=window.openDatabase(m.name,m.version,m.description,h),l.transaction(function(b){b.executeSql("CREATE TABLE IF NOT EXISTS "+m.storeName+" (id INTEGER PRIMARY KEY, key unique, value)",[],function(){a()},null)})})}function b(a,b){return new k(function(c,d){localforage.ready().then(function(){l.transaction(function(e){e.executeSql("SELECT * FROM "+m.storeName+" WHERE key = ? LIMIT 1",[a],function(a,e){var f=e.rows.length?e.rows.item(0).value:null;if(f&&f.substr(0,j)===i)try{f=JSON.parse(f.slice(j))}catch(g){d(g)}b&&b(f),c(f)},null)})})})}function c(a,b,c){return new k(function(d){localforage.ready().then(function(){void 0===b&&(b=null);var e;e="boolean"==typeof b||"number"==typeof b||"object"==typeof b?i+JSON.stringify(b):b,l.transaction(function(f){f.executeSql("INSERT OR REPLACE INTO "+m.storeName+" (key, value) VALUES (?, ?)",[a,e],function(){c&&c(b),d(b)},null)})})})}function d(a,b){return new k(function(c){localforage.ready().then(function(){l.transaction(function(d){d.executeSql("DELETE FROM "+m.storeName+" WHERE key = ?",[a],function(){b&&b(),c()},null)})})})}function e(a){return new k(function(b){localforage.ready().then(function(){l.transaction(function(c){c.executeSql("DELETE FROM "+m.storeName,[],function(){a&&a(),b()},null)})})})}function f(a){return new k(function(b){localforage.ready().then(function(){l.transaction(function(c){c.executeSql("SELECT COUNT(key) as c FROM "+m.storeName,[],function(c,d){var e=d.rows.item(0).c;a&&a(e),b(e)},null)})})})}function g(a,b){return new k(function(c){localforage.ready().then(function(){l.transaction(function(d){d.executeSql("SELECT key FROM "+m.storeName+" WHERE id = ? LIMIT 1",[a+1],function(a,d){var e=d.rows.length?d.rows.item(0).key:null;b&&b(e),c(e)},null)})})})}var h=4980736,i="__lfsc__:",j=i.length,k=window.Promise,l=null,m={description:"",name:"localforage",storeName:"keyvaluepairs",version:"1.0"};if(window.openDatabase){var n={_driver:"webSQLStorage",_initStorage:a,getItem:b,setItem:c,removeItem:d,clear:e,length:f,key:g};"function"==typeof define&&define.amd?define("webSQLStorage",function(){return n}):"undefined"!=typeof module&&module.exports?module.exports=n:this.webSQLStorage=n}}.call(this),function(){"use strict";var a=window.Promise,b=1,c=2,d=3,e=d;"function"==typeof define&&define.amd?e=b:"undefined"!=typeof module&&module.exports&&(e=c);var f,g=g||window.indexedDB||window.webkitIndexedDB||window.mozIndexedDB||window.OIndexedDB||window.msIndexedDB,h=this,i={INDEXEDDB:"asyncStorage",LOCALSTORAGE:"localStorageWrapper",WEBSQL:"webSQLStorage",driver:function(){return i._driver||null},_ready:a.reject(new Error("setDriver() wasn't called")),setDriver:function(d,f){return this._ready=new a(function(a,j){if(!g&&d===i.INDEXEDDB||!window.openDatabase&&d===i.WEBSQL)return f&&f(i),void j(i);if(e===b)require([d],function(b){i._extend(b),i._initStorage(window.localForageConfig).then(function(){f&&f(i),a(i)})});else if(e===c){var k;switch(d){case i.INDEXEDDB:k=require("localforage/src/drivers/indexeddb");break;case i.LOCALSTORAGE:k=require("localforage/src/drivers/localstorage");break;case i.WEBSQL:k=require("localforage/src/drivers/websql")}i._extend(k),i._initStorage(window.localForageConfig).then(function(){f&&f(i),a(i)})}else i._extend(h[d]),i._initStorage(window.localForageConfig).then(function(){f&&f(i),a(i)})}),i._ready},ready:function(){return this._ready},_extend:function(a){for(var b in a)a.hasOwnProperty(b)&&(this[b]=a[b])}};f=g?i.INDEXEDDB:window.openDatabase?i.WEBSQL:i.LOCALSTORAGE,i.setDriver(f),e===b?define(function(){return i}):e===c?module.exports=i:this.localforage=i}.call(this); |
@@ -78,8 +78,2 @@ /*global exports:true, require:true */ | ||
} | ||
}, | ||
backbone: { | ||
src: [ | ||
'src/adapters/backbone.js' | ||
], | ||
dest: 'dist/backbone.localforage.js', | ||
} | ||
@@ -92,7 +86,2 @@ }, | ||
} | ||
}, | ||
backbone: { | ||
files: { | ||
'dist/backbone.localforage.min.js': ['dist/backbone.localforage.js'] | ||
} | ||
} | ||
@@ -99,0 +88,0 @@ }, |
@@ -11,3 +11,3 @@ { | ||
], | ||
"version": "0.1.0", | ||
"version": "0.1.1", | ||
"homepage": "https://github.com/mozilla/localForage", | ||
@@ -14,0 +14,0 @@ "repository": { |
@@ -130,12 +130,31 @@ # localForage [![Build Status](https://secure.travis-ci.org/mozilla/localForage.png?branch=master)](http://travis-ci.org/mozilla/localForage) | ||
## Backbone.js | ||
## Configuration | ||
localForage includes a [Backbone.js](http://backbonejs.org/) storage library | ||
that you can use to store your Backbone collections offline with only a few | ||
lines of really simple code. The is a [Backbone example](https://github.com/mozilla/localForage/blob/master/examples/backbone-example.html) available if you're | ||
interested in using Backbone and localForage together. | ||
You can set database information, by giving the `window.localForageConfig` | ||
variable a hash of options. Available options are `name`, `storeName`, | ||
`version`, and `description`. | ||
Of course, Backbone.js is entirely optional and you can use localForage | ||
without it. | ||
Example: | ||
```javascript | ||
window.localForageConfig = { | ||
name : 'myApp', | ||
version : 1.0, | ||
storeName : 'keyvaluepairs', | ||
description : 'some description' | ||
}; | ||
``` | ||
## Framework Support | ||
If you use a framework listed, there's a localForage storage driver for the | ||
models in your framework so you can store data offline with localForage. We | ||
have drivers for the following frameworks: | ||
* [AngularJS](https://github.com/ocombe/angular-localForage) | ||
* [Backbone](https://github.com/mozilla/localForage-backbone) | ||
If you have a driver you'd like listed, please | ||
[open an issue](https://github.com/mozilla/localForage/issues/new) to have it | ||
added to this list. | ||
# Running Tests | ||
@@ -190,8 +209,2 @@ | ||
### Will you add (or accept) support for storage in X framework? | ||
**Yes**. If you have an adapter for EmberJS, Angular, whatever, please add it, | ||
along with tests, and submit a pull request. The more frameworks this library | ||
can support, the better. | ||
### Will you add support for node.js? | ||
@@ -198,0 +211,0 @@ |
@@ -6,7 +6,9 @@ (function() { | ||
var DBNAME = 'localforage'; | ||
var DBVERSION = 1; | ||
var STORENAME = 'keyvaluepairs'; | ||
var Promise = window.Promise; | ||
var db = null; | ||
var dbInfo = { | ||
name: 'localforage', | ||
storeName: 'keyvaluepairs', | ||
version: 1 | ||
}; | ||
@@ -23,5 +25,15 @@ // Initialize IndexedDB; fall back to vendor-prefixed versions if needed. | ||
function _initStorage() { | ||
// Open the IndexedDB database (automatically creates one if one didn't | ||
// previously exist), using any options set in window.localForageConfig. | ||
function _initStorage(options) { | ||
if (options) { | ||
for (var i in dbInfo) { | ||
if (options[i] !== undefined) { | ||
dbInfo[i] = options[i]; | ||
} | ||
} | ||
} | ||
return new Promise(function(resolve, reject) { | ||
var openreq = indexedDB.open(DBNAME, DBVERSION); | ||
var openreq = indexedDB.open(dbInfo.name, dbInfo.version); | ||
openreq.onerror = function withStoreOnError() { | ||
@@ -32,7 +44,6 @@ reject(openreq.error.name); | ||
// First time setup: create an empty object store | ||
openreq.result.createObjectStore(STORENAME); | ||
openreq.result.createObjectStore(dbInfo.storeName); | ||
}; | ||
openreq.onsuccess = function withStoreOnSuccess() { | ||
db = openreq.result; | ||
resolve(); | ||
@@ -46,4 +57,3 @@ }; | ||
localforage.ready().then(function() { | ||
var store = db.transaction(STORENAME, 'readonly').objectStore(STORENAME); | ||
var store = db.transaction(dbInfo.storeName, 'readonly').objectStore(dbInfo.storeName); | ||
var req = store.get(key); | ||
@@ -55,3 +65,2 @@ req.onsuccess = function getItemOnSuccess() { | ||
} | ||
if (callback) { | ||
@@ -73,3 +82,3 @@ callback(value); | ||
localforage.ready().then(function() { | ||
var store = db.transaction(STORENAME, 'readwrite').objectStore(STORENAME); | ||
var store = db.transaction(dbInfo.storeName, 'readwrite').objectStore(dbInfo.storeName); | ||
@@ -103,3 +112,3 @@ // Cast to undefined so the value passed to callback/promise is | ||
localforage.ready().then(function() { | ||
var store = db.transaction(STORENAME, 'readwrite').objectStore(STORENAME); | ||
var store = db.transaction(dbInfo.storeName, 'readwrite').objectStore(dbInfo.storeName); | ||
@@ -120,3 +129,2 @@ // We use `['delete']` instead of `.delete` because IE 8 will | ||
} | ||
resolve(); | ||
@@ -134,4 +142,3 @@ }; | ||
localforage.ready().then(function() { | ||
var store = db.transaction(STORENAME, 'readwrite').objectStore(STORENAME); | ||
var store = db.transaction(dbInfo.storeName, 'readwrite').objectStore(dbInfo.storeName); | ||
var req = store.clear(); | ||
@@ -155,4 +162,3 @@ req.onsuccess = function clearOnSuccess() { | ||
localforage.ready().then(function() { | ||
var store = db.transaction(STORENAME, 'readonly').objectStore(STORENAME); | ||
var store = db.transaction(dbInfo.storeName, 'readonly').objectStore(dbInfo.storeName); | ||
var req = store.count(); | ||
@@ -186,3 +192,3 @@ req.onsuccess = function lengthOnSuccess() { | ||
localforage.ready().then(function() { | ||
var store = db.transaction(STORENAME, 'readonly').objectStore(STORENAME); | ||
var store = db.transaction(dbInfo.storeName, 'readonly').objectStore(dbInfo.storeName); | ||
@@ -189,0 +195,0 @@ var advanced = false; |
@@ -8,2 +8,6 @@ // If IndexedDB isn't available, we'll fall back to localStorage. | ||
var keyPrefix = ''; | ||
var dbInfo = { | ||
name: 'localforage' | ||
}; | ||
var Promise = window.Promise; | ||
@@ -25,3 +29,15 @@ var localStorage = null; | ||
function _initStorage() { | ||
// Config the localStorage backend, using options set in | ||
// window.localForageConfig. | ||
function _initStorage(options) { | ||
if (options) { | ||
for (var i in dbInfo) { | ||
if (options[i] !== undefined) { | ||
dbInfo[i] = options[i]; | ||
} | ||
} | ||
} | ||
keyPrefix = dbInfo.name + '/'; | ||
return Promise.resolve(); | ||
@@ -53,3 +69,3 @@ } | ||
try { | ||
var result = localStorage.getItem(key); | ||
var result = localStorage.getItem(keyPrefix + key); | ||
@@ -81,6 +97,10 @@ // If a result was found, parse it from serialized JSON into a | ||
// Remove the prefix from the key, if a key is found. | ||
if (result) { | ||
result = result.substring(keyPrefix.length); | ||
} | ||
if (callback) { | ||
callback(result); | ||
} | ||
resolve(result); | ||
@@ -110,3 +130,3 @@ }); | ||
localforage.ready().then(function() { | ||
localStorage.removeItem(key); | ||
localStorage.removeItem(keyPrefix + key); | ||
@@ -144,3 +164,3 @@ if (callback) { | ||
localStorage.setItem(key, value); | ||
localStorage.setItem(keyPrefix + key, value); | ||
@@ -147,0 +167,0 @@ if (callback) { |
(function() { | ||
'use strict'; | ||
var DB_NAME = 'localforage'; | ||
// Default DB size is _JUST UNDER_ 5MB, as it's the highest size we can use | ||
@@ -10,8 +9,12 @@ // without a prompt. | ||
var DB_SIZE = 4980736; | ||
var DB_VERSION = '1.0'; | ||
var SERIALIZED_MARKER = '__lfsc__:'; | ||
var SERIALIZED_MARKER_LENGTH = SERIALIZED_MARKER.length; | ||
var STORE_NAME = 'keyvaluepairs'; | ||
var Promise = window.Promise; | ||
var db = null; | ||
var dbInfo = { | ||
description: '', | ||
name: 'localforage', | ||
storeName: 'keyvaluepairs', | ||
version: '1.0' | ||
}; | ||
@@ -23,14 +26,22 @@ // If WebSQL methods aren't available, we can stop now. | ||
function _initStorage() { | ||
// Open the WebSQL database (automatically creates one if one didn't | ||
// previously exist), using any options set in window.localForageConfig. | ||
function _initStorage(options) { | ||
if (options) { | ||
for (var i in dbInfo) { | ||
if (options[i] !== undefined) { | ||
dbInfo[i] = typeof(options[i]) !== 'string' ? options[i].toString() : options[i]; | ||
} | ||
} | ||
} | ||
return new Promise(function(resolve, reject) { | ||
// Open the database; the openDatabase API will automatically create it for | ||
// us if it doesn't exist. | ||
db = window.openDatabase(DB_NAME, DB_VERSION, STORE_NAME, DB_SIZE); | ||
// Open the database; the openDatabase API will automatically | ||
// create it for us if it doesn't exist. | ||
db = window.openDatabase(dbInfo.name, dbInfo.version, | ||
dbInfo.description, DB_SIZE); | ||
// Create our key/value table if it doesn't exist. | ||
// TODO: Technically I can imagine this being as race condition, as I'm not | ||
// positive on the WebSQL API enough to be sure that other transactions | ||
// won't be run before this? But I assume not. | ||
db.transaction(function (t) { | ||
t.executeSql('CREATE TABLE IF NOT EXISTS localforage (id INTEGER PRIMARY KEY, key unique, value)', [], function(t, results) { | ||
t.executeSql('CREATE TABLE IF NOT EXISTS ' + dbInfo.storeName + ' (id INTEGER PRIMARY KEY, key unique, value)', [], function() { | ||
resolve(); | ||
@@ -46,3 +57,3 @@ }, null); | ||
db.transaction(function (t) { | ||
t.executeSql('SELECT * FROM localforage WHERE key = ? LIMIT 1', [key], function (t, results) { | ||
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; | ||
@@ -95,3 +106,3 @@ | ||
db.transaction(function (t) { | ||
t.executeSql('INSERT OR REPLACE INTO localforage (key, value) VALUES (?, ?)', [key, valueToSave], function() { | ||
t.executeSql('INSERT OR REPLACE INTO ' + dbInfo.storeName + ' (key, value) VALUES (?, ?)', [key, valueToSave], function() { | ||
if (callback) { | ||
@@ -112,3 +123,3 @@ callback(value); | ||
db.transaction(function (t) { | ||
t.executeSql('DELETE FROM localforage WHERE key = ?', [key], function() { | ||
t.executeSql('DELETE FROM ' + dbInfo.storeName + ' WHERE key = ?', [key], function() { | ||
if (callback) { | ||
@@ -131,3 +142,3 @@ callback(); | ||
db.transaction(function (t) { | ||
t.executeSql('DELETE FROM localforage', [], function(t, results) { | ||
t.executeSql('DELETE FROM ' + dbInfo.storeName, [], function(t, results) { | ||
if (callback) { | ||
@@ -151,3 +162,3 @@ callback(); | ||
// Ahhh, SQL makes this one soooooo easy. | ||
t.executeSql('SELECT COUNT(key) as c FROM localforage', [], function (t, results) { | ||
t.executeSql('SELECT COUNT(key) as c FROM ' + dbInfo.storeName, [], function (t, results) { | ||
var result = results.rows.item(0).c; | ||
@@ -177,3 +188,3 @@ | ||
db.transaction(function (t) { | ||
t.executeSql('SELECT key FROM localforage WHERE id = ? LIMIT 1', [n + 1], function (t, results) { | ||
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; | ||
@@ -180,0 +191,0 @@ |
@@ -62,3 +62,3 @@ (function() { | ||
localForage._initStorage().then(function() { | ||
localForage._initStorage(window.localForageConfig).then(function() { | ||
if (callback) { | ||
@@ -86,3 +86,3 @@ callback(localForage); | ||
localForage._initStorage().then(function() { | ||
localForage._initStorage(window.localForageConfig).then(function() { | ||
if (callback) { | ||
@@ -97,3 +97,3 @@ callback(localForage); | ||
localForage._initStorage().then(function() { | ||
localForage._initStorage(window.localForageConfig).then(function() { | ||
if (callback) { | ||
@@ -100,0 +100,0 @@ callback(localForage); |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
New author
Supply chain riskA new npm collaborator published a version of the package for the first time. New collaborators are usually benign additions to a project, but do indicate a change to the security surface area of a package.
Found 1 instance in 1 package
Minified code
QualityThis package contains minified code. This may be harmless in some cases where minified code is included in packaged libraries, however packages on npm should not minify code.
Found 1 instance in 1 package
2
225
2
1255162
48
16712