lightweight json wrapper for w3c Storage engines
This commit is contained in:
		
						commit
						bf858f6073
					
				
							
								
								
									
										41
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										41
									
								
								README.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,41 @@ | ||||
| jsonStorage | ||||
| ==== | ||||
| 
 | ||||
| A light abstraction for DOMStorage (such as localStorage). | ||||
| 
 | ||||
| Made fo for Node.JS and Ender.JS (browser-side). | ||||
| 
 | ||||
|     var localStorage = require('localStorage') | ||||
|       , JsonStorage = require('json-storage') | ||||
|       , db = JsonStorage(localStorage) | ||||
|       , myValue = { | ||||
|             foo: "bar" | ||||
|           , baz: "quux" | ||||
|         } | ||||
|       ; | ||||
| 
 | ||||
|     db.set('myKey', myValue);  | ||||
|     myValue = db.get('myKey'); | ||||
| 
 | ||||
| API | ||||
| === | ||||
| 
 | ||||
|   * get(key) | ||||
|   * set(key, value) | ||||
|   * remove(key) | ||||
|   * clear() | ||||
|   * keys() | ||||
|   * size() | ||||
| 
 | ||||
| null vs undefined in JSON | ||||
| === | ||||
| 
 | ||||
| Since it is not valid to set `undefined` in JSON, calling `db.set('x')` is the same as `db.remove('x')`. | ||||
| 
 | ||||
| However, `null`, and `"null"` both parse as `null` the "object", but the string (which would be `"\"null\""`). | ||||
| 
 | ||||
| Therefore, setting a key to `undefined` will remove it from the db, but setting it to `null` will save it. | ||||
| 
 | ||||
| Yet both values that exist as `null` and values that don't exist will return `null`. | ||||
| 
 | ||||
| Also `{ "foo": null, "bar": "null" }` will parse as `foo` being `null` but `bar` being `"null"`, much unlike the value `"null"` being parsed on its own. | ||||
							
								
								
									
										77
									
								
								lib/json-storage.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								lib/json-storage.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,77 @@ | ||||
| (function () { | ||||
|   "use strict"; | ||||
| 
 | ||||
|   var db; | ||||
| 
 | ||||
|   function Stringify(obj) { | ||||
|     var str; | ||||
|     try { | ||||
|       str = JSON.stringify(obj); | ||||
|     } catch(e) { | ||||
|       str = ""; | ||||
|     } | ||||
| 
 | ||||
|     return str; | ||||
|   } | ||||
| 
 | ||||
|   function Parse(str) { | ||||
|     var obj = null; | ||||
|     try { | ||||
|       obj = JSON.parse(str); | ||||
|     } catch(e) {} | ||||
| 
 | ||||
|     return obj; | ||||
|   } | ||||
| 
 | ||||
|   function JsonStorage(w3cStorage) { | ||||
|     this.db = w3cStorage; | ||||
|     this.keysAreDirty = true; | ||||
|   } | ||||
|   db = JsonStorage; | ||||
|    | ||||
|   db.prototype.clear = function () { | ||||
|     this.keysAreDirty = true; | ||||
|     self.keys().forEach(function (uuid) { | ||||
|       this.remove(uuid); | ||||
|     }, this); | ||||
|   }; | ||||
| 
 | ||||
|   db.prototype.remove = function (uuid) { | ||||
|     this.keysAreDirty = true; | ||||
|     this.db.removeItem(uuid); | ||||
|   }; | ||||
| 
 | ||||
|   db.prototype.get = function (uuid) { | ||||
|     return Parse(this.db.getItem(uuid)); | ||||
|   }; | ||||
| 
 | ||||
|   db.prototype.set = function (uuid, val) { | ||||
|     this.keysAreDirty = true; | ||||
|     return this.db.setItem(uuid, Stringify(val)); | ||||
|   }; | ||||
| 
 | ||||
|   db.prototype.keys = function () { | ||||
|     var i; | ||||
| 
 | ||||
|     if (!this.keysAreDirty) { | ||||
|       return this.keys; | ||||
|     } | ||||
| 
 | ||||
|     this.keys = []; | ||||
|     for (i = 0; i < this.db.length; i += 1) { | ||||
|       this.keys.push(this.db.key(i)); | ||||
|     } | ||||
|     this.keysAreDirty = false; | ||||
|     return this.keys.concat([]); | ||||
|   }; | ||||
| 
 | ||||
|   db.prototype.size = function () { | ||||
|     return this.db.length; | ||||
|   }; | ||||
| 
 | ||||
|   function create(w3cStorage) { | ||||
|     return new JsonStorage(w3cStorage); | ||||
|   } | ||||
| 
 | ||||
|   module.exports = create; | ||||
| }()); | ||||
							
								
								
									
										17
									
								
								lib/package.json
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								lib/package.json
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,17 @@ | ||||
| { | ||||
|   "author": "AJ ONeal <coolaj86@gmail.com> (http://coolaj86.info)", | ||||
|   "name": "json-storage", | ||||
|   "description": "A wrapper for storage engines which use the W3C Storage API", | ||||
|   "keywords": ["ender", "localStorage", "sessionStorage", "globalStorage", "Storage"], | ||||
|   "version": "1.0.0", | ||||
|   "repository": { | ||||
|     "type": "git", | ||||
|     "url": "git://github.com/coolaj86/json-storage-js.git" | ||||
|   }, | ||||
|   "engines": { | ||||
|     "node": ">= v0.2.0" | ||||
|   }, | ||||
|   "main": "json-storage.js", | ||||
|   "dependencies": {}, | ||||
|   "devDependencies": {} | ||||
| } | ||||
							
								
								
									
										77
									
								
								tests/node_modules/json-storage/json-storage.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								tests/node_modules/json-storage/json-storage.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,77 @@ | ||||
| (function () { | ||||
|   "use strict"; | ||||
| 
 | ||||
|   var db; | ||||
| 
 | ||||
|   function Stringify(obj) { | ||||
|     var str; | ||||
|     try { | ||||
|       str = JSON.stringify(obj); | ||||
|     } catch(e) { | ||||
|       str = ""; | ||||
|     } | ||||
| 
 | ||||
|     return str; | ||||
|   } | ||||
| 
 | ||||
|   function Parse(str) { | ||||
|     var obj = null; | ||||
|     try { | ||||
|       obj = JSON.parse(str); | ||||
|     } catch(e) {} | ||||
| 
 | ||||
|     return obj; | ||||
|   } | ||||
| 
 | ||||
|   function JsonStorage(w3cStorage) { | ||||
|     this.db = w3cStorage; | ||||
|     this.keysAreDirty = true; | ||||
|   } | ||||
|   db = JsonStorage; | ||||
|    | ||||
|   db.prototype.clear = function () { | ||||
|     this.keysAreDirty = true; | ||||
|     self.keys().forEach(function (uuid) { | ||||
|       this.remove(uuid); | ||||
|     }, this); | ||||
|   }; | ||||
| 
 | ||||
|   db.prototype.remove = function (uuid) { | ||||
|     this.keysAreDirty = true; | ||||
|     this.db.removeItem(uuid); | ||||
|   }; | ||||
| 
 | ||||
|   db.prototype.get = function (uuid) { | ||||
|     return Parse(this.db.getItem(uuid)); | ||||
|   }; | ||||
| 
 | ||||
|   db.prototype.set = function (uuid, val) { | ||||
|     this.keysAreDirty = true; | ||||
|     return this.db.setItem(uuid, Stringify(val)); | ||||
|   }; | ||||
| 
 | ||||
|   db.prototype.keys = function () { | ||||
|     var i; | ||||
| 
 | ||||
|     if (!this.keysAreDirty) { | ||||
|       return this.keys; | ||||
|     } | ||||
| 
 | ||||
|     this.keys = []; | ||||
|     for (i = 0; i < this.db.length; i += 1) { | ||||
|       this.keys.push(this.db.key(i)); | ||||
|     } | ||||
|     this.keysAreDirty = false; | ||||
|     return this.keys.concat([]); | ||||
|   }; | ||||
| 
 | ||||
|   db.prototype.size = function () { | ||||
|     return this.db.length; | ||||
|   }; | ||||
| 
 | ||||
|   function create(w3cStorage) { | ||||
|     return new JsonStorage(w3cStorage); | ||||
|   } | ||||
| 
 | ||||
|   module.exports = create; | ||||
| }()); | ||||
							
								
								
									
										17
									
								
								tests/node_modules/json-storage/package.json
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										17
									
								
								tests/node_modules/json-storage/package.json
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,17 @@ | ||||
| { | ||||
|   "author": "AJ ONeal <coolaj86@gmail.com> (http://coolaj86.info)", | ||||
|   "name": "json-storage", | ||||
|   "description": "A wrapper for storage engines which use the W3C Storage API", | ||||
|   "keywords": ["ender", "localStorage", "sessionStorage", "globalStorage", "Storage"], | ||||
|   "version": "1.0.0", | ||||
|   "repository": { | ||||
|     "type": "git", | ||||
|     "url": "git://github.com/coolaj86/json-storage-js.git" | ||||
|   }, | ||||
|   "engines": { | ||||
|     "node": ">= v0.2.0" | ||||
|   }, | ||||
|   "main": "json-storage.js", | ||||
|   "dependencies": {}, | ||||
|   "devDependencies": {} | ||||
| } | ||||
							
								
								
									
										54
									
								
								tests/node_modules/localStorage/localStorage.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										54
									
								
								tests/node_modules/localStorage/localStorage.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,54 @@ | ||||
| // http://www.rajdeepd.com/articles/chrome/localstrg/LocalStorageSample.htm
 | ||||
| 
 | ||||
| // NOTE:
 | ||||
| // this varies from actual localStorage in some subtle ways
 | ||||
| 
 | ||||
| // also, there is no persistence
 | ||||
| // TODO persist
 | ||||
| (function () { | ||||
|   "use strict"; | ||||
| 
 | ||||
|   var db; | ||||
| 
 | ||||
|   function LocalStorage() { | ||||
|   } | ||||
|   db = LocalStorage; | ||||
| 
 | ||||
|   db.prototype.getItem = function (key) { | ||||
|     if (key in this) { | ||||
|       return String(this[key]); | ||||
|     } | ||||
|     return null; | ||||
|   }; | ||||
| 
 | ||||
|   db.prototype.setItem = function (key, val) { | ||||
|     this[key] = String(val); | ||||
|   }; | ||||
| 
 | ||||
|   db.prototype.removeItem = function (key) { | ||||
|     delete this[key]; | ||||
|   }; | ||||
| 
 | ||||
|   db.prototype.clear = function () { | ||||
|     var self = this; | ||||
|     Object.keys(self).forEach(function (key) { | ||||
|       self[key] = undefined; | ||||
|       delete self[key]; | ||||
|     }); | ||||
|   }; | ||||
| 
 | ||||
|   db.prototype.key = function (i) { | ||||
|     i = i || 0; | ||||
|     return Object.keys(this)[i]; | ||||
|   }; | ||||
| 
 | ||||
|   db.prototype.__defineGetter__('length', function () { | ||||
|     return Object.keys(this).length; | ||||
|   }); | ||||
| 
 | ||||
|   if (global.localStorage) { | ||||
|     module.exports = localStorage; | ||||
|   } else { | ||||
|     module.exports = new LocalStorage(); | ||||
|   } | ||||
| }()); | ||||
							
								
								
									
										16
									
								
								tests/node_modules/localStorage/package.json
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										16
									
								
								tests/node_modules/localStorage/package.json
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @ -0,0 +1,16 @@ | ||||
| { | ||||
|   "author": "AJ ONeal <coolaj86@gmail.com> (http://coolaj86.info)", | ||||
|   "name": "localStorage", | ||||
|   "description": "W3C localStorage for Node.JS", | ||||
|   "version": "1.0.0", | ||||
|   "repository": { | ||||
|     "type": "git", | ||||
|     "url": "git://github.com/coolaj86/node-localStorage.git" | ||||
|   }, | ||||
|   "engines": { | ||||
|     "node": ">= v0.2.0" | ||||
|   }, | ||||
|   "main": "localStorage.js", | ||||
|   "dependencies": {}, | ||||
|   "devDependencies": {} | ||||
| } | ||||
							
								
								
									
										28
									
								
								tests/test.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								tests/test.js
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,28 @@ | ||||
| (function () { | ||||
|   "use strict"; | ||||
| 
 | ||||
|   var assert = require('assert') | ||||
|     , localStorage = require('localStorage') | ||||
|     , JsonStorage = require('json-storage') | ||||
|     , db = JsonStorage(localStorage) | ||||
|     ; | ||||
| 
 | ||||
|   assert.strictEqual(null, db.get('a')); | ||||
| 
 | ||||
|   // you can't really save undefined as JSON, it's not valid
 | ||||
|   // the attempt to do so will delete the underlying key
 | ||||
|   db.set('a'); | ||||
|   assert.strictEqual(null, db.get('a')); | ||||
| 
 | ||||
|   db.set('a', 1); | ||||
|   assert.strictEqual(1, db.get('a')); | ||||
| 
 | ||||
|   db.set('a', '1'); | ||||
|   assert.strictEqual('1', db.get('a')); | ||||
| 
 | ||||
|   db.set('a', [1]); | ||||
|   assert.deepEqual([1], db.get('a')); | ||||
| 
 | ||||
|   db.set('a', { 'a': [1] }); | ||||
|   assert.deepEqual({'a': [1] }, db.get('a')); | ||||
| }()); | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user