From d3538718b9047f259f3999e01309ffd839fbb534 Mon Sep 17 00:00:00 2001 From: AJ ONeal Date: Fri, 22 Jul 2011 13:21:23 -0600 Subject: [PATCH 1/2] localStorage for Node.JS --- README.md | 40 +++++++++++++++++++++++++++++++++ lib/localStorage.js | 54 +++++++++++++++++++++++++++++++++++++++++++++ lib/package.json | 16 ++++++++++++++ tests/test.js | 34 ++++++++++++++++++++++++++++ 4 files changed, 144 insertions(+) create mode 100644 README.md create mode 100644 lib/localStorage.js create mode 100644 lib/package.json create mode 100644 tests/test.js diff --git a/README.md b/README.md new file mode 100644 index 0000000..f4c4a4b --- /dev/null +++ b/README.md @@ -0,0 +1,40 @@ +localStorage +=== + +An inefficient, but as W3C-compliant as possible using only pure JavaScript, `localStorage` implementation. + + var localStorage = require('localStorage'); + +API + + * getItem(key) + * setItem(key, value) + * removeItem(key) + * clear() + * key(n) + * length + +Tests + + 0 === localStorage.length; + null === localStorage.getItem('doesn't exist'); + undefined === localStorage['doesn't exist']; + + localStorage.setItem('myItem'); + "undefined" === localStorage.getItem('myItem'); + 1 === localStorage.length; + + localStorage.setItem('myItem', 0); + "0" === localStorage.getItem('myItem'); + + localStorage.removeItem('myItem', 0); + 0 === localStorage.length; + + localStorage.clear(); + 0 === localStorage.length; + +TODO / Bugs +--- + + Does not persist. + Doesn't not emit `Storage` events diff --git a/lib/localStorage.js b/lib/localStorage.js new file mode 100644 index 0000000..4a74dff --- /dev/null +++ b/lib/localStorage.js @@ -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(); + } +}()); diff --git a/lib/package.json b/lib/package.json new file mode 100644 index 0000000..2d96f56 --- /dev/null +++ b/lib/package.json @@ -0,0 +1,16 @@ +{ + "author": "AJ ONeal (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": {} +} diff --git a/tests/test.js b/tests/test.js new file mode 100644 index 0000000..07d8330 --- /dev/null +++ b/tests/test.js @@ -0,0 +1,34 @@ +(function () { + "use strict"; + + var assert = require('assert') + , localStorage = require('localStorage') + ; + + // can't make assuptions about key positioning + localStorage.setItem('a', 1); + assert.strictEqual(localStorage.key(0), 'a'); + + localStorage.setItem('b', '2'); + assert.strictEqual(localStorage.getItem('a'), '1'); + assert.strictEqual(localStorage.getItem('b'), '2'); + assert.strictEqual(localStorage.length, 2); + + assert.strictEqual(localStorage['c'], undefined); + assert.strictEqual(localStorage.getItem('c'), null); + + localStorage.setItem('c'); + assert.strictEqual(localStorage.getItem('c'), "undefined"); + assert.strictEqual(localStorage.length, 3); + + localStorage.removeItem('c'); + assert.strictEqual(localStorage.getItem('c'), null); + assert.strictEqual(localStorage.length, 2); + + localStorage.clear(); + assert.strictEqual(localStorage.getItem('a'), null); + assert.strictEqual(localStorage.getItem('b'), null); + assert.strictEqual(localStorage.length, 0); + + console.log('All tests passed'); +}()); From 1e2bf28341822bb3f774ffa8c49f9a16c50977b5 Mon Sep 17 00:00:00 2001 From: AJ ONeal Date: Fri, 22 Jul 2011 14:17:18 -0700 Subject: [PATCH 2/2] mentioned purpose, added better usage example, added more formatting --- README.md | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index f4c4a4b..f7dd256 100644 --- a/README.md +++ b/README.md @@ -3,9 +3,23 @@ localStorage An inefficient, but as W3C-compliant as possible using only pure JavaScript, `localStorage` implementation. - var localStorage = require('localStorage'); +Purpose +---- + +This is meant for the purpose of being able to run unit-tests and such for browser-y modules in node. + +Usage +---- + + var localStorage = require('localStorage') + , myValue = { foo: 'bar', baz: 'quux' } + ; + + localStorage.setItem('myKey', JSON.stringify(myValue)); + myValue = localStorage.getItem('myKey'); API +--- * getItem(key) * setItem(key, value) @@ -15,6 +29,7 @@ API * length Tests +--- 0 === localStorage.length; null === localStorage.getItem('doesn't exist'); @@ -36,5 +51,6 @@ Tests TODO / Bugs --- - Does not persist. - Doesn't not emit `Storage` events + * Does not persist. + * could use `fs.readFileSync` at load and an occasional `fs.writeFile` to write-out localStorage.json + * Doesn't not emit `Storage` events