From b4b168dc45a25b46741849ffed6dcd4a394a6d86 Mon Sep 17 00:00:00 2001 From: Jason Mulligan Date: Fri, 3 Jul 2015 09:12:26 -0400 Subject: [PATCH] Implementing `PATCH` requests, moving "index" methods into utility function file & taking them off the prototype, refactoring `reindex()` to iterate the datastore once & the indices array many times (switched) --- README.md | 33 +++++-- lib/haro.es6.js | 130 +++++++++++++------------- lib/haro.js | 223 +++++++++++++++++++++----------------------- lib/haro.min.js | 2 +- lib/haro.min.js.map | 2 +- src/haro.js | 60 +++--------- src/intro.js | 1 + src/utility.js | 69 +++++++++----- 8 files changed, 260 insertions(+), 260 deletions(-) diff --git a/README.md b/README.md index f2b1271..098a342 100644 --- a/README.md +++ b/README.md @@ -165,6 +165,11 @@ _Map_ Map of indexes, which are Sets containing Map keys. +**patch** +_Boolean_ + +Set from the success handler of `sync()`, infers `PATCH` requests are supported by the API collection. + **registry** _Array_ @@ -178,7 +183,7 @@ Total records in the DataStore. **uri** _String_ -API collection URI the DataStore is wired to, in a feedback loop (do not modify, use `setUri()`). Setting the value creates an implicit relationship with records, e.g. setting `/users` would an implicit URI structure of `/users/{key}` +API collection URI the DataStore is wired to, in a feedback loop (do not modify, use `setUri()`). Setting the value creates an implicit relationship with records, e.g. setting `/users` would imply a URI structure of `/users/{key}`. Trailing slashes may be stripped. **versions** _Map_ @@ -189,7 +194,10 @@ _Map_ **batch( array, type )** _Promise_ -The first argument must be an `Array`, and the second argument must be `del` or `set`. +The first argument must be an `Array`, and the second argument must be `del` or `set`. Batch operations with a DataStore +that is wired to an API with pagination enabled & `PATCH` support may create erroneous operations, such as `add` where +`replace` is appropriate; this will happen because the DataStore will not have the entire data set to generate it's +[JSONPatch](http://jsonpatchjs.com/) request. ```javascript var haro = require('haro'), @@ -246,7 +254,8 @@ store.set(null, {abc: true}).then(function (rec) { **entries()** _MapIterator_ -Returns returns a new `Iterator` object that contains an array of `[key, value]` for each element in the `Map` object in insertion order. +Returns returns a new `Iterator` object that contains an array of `[key, value]` for each element in the `Map` object in +insertion order. Example of deleting a record: ```javascript @@ -267,7 +276,8 @@ do { **filter( callbackFn )** _Tuple_ -Returns a `Tuple` of double `Tuples` with the shape `[key, value]` for records which returned `true` to `callbackFn(value, key)`. +Returns a `Tuple` of double `Tuples` with the shape `[key, value]` for records which returned `true` to +`callbackFn(value, key)`. Example of filtering a DataStore: ```javascript @@ -297,7 +307,8 @@ store.find({field1: 'some value'}); **forEach( callbackFn[, thisArg] )** _Undefined_ -Calls `callbackFn` once for each key-value pair present in the `Map` object, in insertion order. If a `thisArg` parameter is provided to `forEach`, it will be used as the this value for each callback. +Calls `callbackFn` once for each key-value pair present in the `Map` object, in insertion order. If a `thisArg` +parameter is provided to `forEach`, it will be used as the this value for each callback. Example of deleting a record: ```javascript @@ -421,7 +432,8 @@ store.request('https://somedomain.com/api').then(function (arg) { _Tuple_ Returns a `Tuple` of double `Tuples` with the shape `[key, value]` of records found matching `arg`. -If `arg` is a `Function` a match is made if the result is `true`, if `arg` is a `RegExp` the field value must `.test()` as `true`, else the value must be an equality match. +If `arg` is a `Function` a match is made if the result is `true`, if `arg` is a `RegExp` the field value must `.test()` +as `true`, else the value must be an equality match. Example of searching with a predicate function: ```javascript @@ -440,7 +452,8 @@ store.batch(data, 'set').then(function (records) { **set( key, data, batch=false, override=false )** _Promise_ -Returns a `Promise` for setting/amending a record in the DataStore, if `key` is `false` a version 4 `UUID` will be generated. +Returns a `Promise` for setting/amending a record in the DataStore, if `key` is `false` a version 4 `UUID` will be +generated. If `override` is `true`, the existing record will be replaced instead of amended. @@ -461,8 +474,10 @@ _Promise_ Returns a `Promise` for wiring the DataStore to an API, with the retrieved record set as the `resolve()` argument. This creates an implicit mapping of `$uri/{key}` for records. -Pagination can be implemented by conditionally supplying `true` as the second argument. Doing so will `clear()` the DataStore -prior to a batch insertion. +Pagination can be implemented by conditionally supplying `true` as the second argument. Doing so will `clear()` the +DataStore prior to a batch insertion. + +If `PATCH` requests are supported by the collection `batch()`, `del()` & `set()` will make `JSONPatch` requests. Example setting the URI of the DataStore: ```javascript diff --git a/lib/haro.es6.js b/lib/haro.es6.js index 40bf1bd..7bcb6dd 100644 --- a/lib/haro.es6.js +++ b/lib/haro.es6.js @@ -15,6 +15,7 @@ const Map = global.Map || require("es6-map"); const Set = global.Set || require("es6-set"); const fetch = global.fetch || require("node-fetch"); const tuple = global.tuple || require("tiny-tuple"); +const r = [8, 9, "a", "b"]; const regex = { querystring: /\?.*/, endslash: /\/$/ @@ -39,16 +40,6 @@ function deferred () { return {resolve: resolver, reject: rejecter, promise: promise}; } -function iterate (obj, fn) { - if (obj instanceof Object) { - Object.keys(obj).forEach(function (i) { - fn.call(obj, obj[i], i); - }); - } else { - obj.forEach(fn); - } -} - function keyIndex (key, data, delimiter) { let keys = key.split(delimiter).sort(), result; @@ -64,6 +55,27 @@ function keyIndex (key, data, delimiter) { return result; } +function delIndex (index, indexes, delimiter, key, data) { + index.forEach(function (i) { + let idx = indexes.get(i), + value = keyIndex(i, data, delimiter); + + if (idx.has(value)) { + idx.get(value).delete(key); + } + }); +} + +function iterate (obj, fn) { + if (obj instanceof Object) { + Object.keys(obj).forEach(function (i) { + fn.call(obj, obj[i], i); + }); + } else { + obj.forEach(fn); + } +} + function merge (a, b) { let c = clone(a), d = clone(b); @@ -87,34 +99,50 @@ function merge (a, b) { return c; } -function patch (ogdata = {}, data = {}, overwrite = false) { +function patch (ogdata = {}, data = {}, key = "", overwrite = false) { let result = []; if (overwrite) { - iterate(ogdata, (value, key) => { - if (key !== this.key && data[key] === undefined) { - result.push({op: "remove", path: "/" + key}); + iterate(ogdata, function (v, k) { + if (k !== key && data[k] === undefined) { + result.push({op: "remove", path: "/" + k}); } }); } - iterate(data, (value, key) => { - if (key !== this.key && ogdata[key] === undefined) { - result.push({op: "add", path: "/" + key, value: value}); - } else if (JSON.stringify(ogdata[key]) !== JSON.stringify(value)) { - result.push({op: "replace", path: "/" + key, value: value}); + iterate(data, function (v, k) { + if (k !== key && ogdata[k] === undefined) { + result.push({op: "add", path: "/" + k, value: v}); + } else if (JSON.stringify(ogdata[k]) !== JSON.stringify(v)) { + result.push({op: "replace", path: "/" + k, value: v}); } }); return result; } -const r = [8, 9, "a", "b"]; - function s () { return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1); } +function setIndexValue (index, key, value) { + if (!index.has(key)) { + index.set(key, new Set()); + } + + index.get(key).add(value); +} + +function setIndex (index, indexes, delimiter, key, data, indice) { + if (!indice) { + index.forEach(function (i) { + setIndexValue(indexes.get(i), keyIndex(i, data, delimiter), key); + }); + } else { + setIndexValue(indexes.get(indice), keyIndex(indice, data, delimiter), key); + } +} + function uuid () { return (s() + s() + "-" + s() + "-4" + s().substr(0, 3) + "-" + r[Math.floor(Math.random() * 4)] + s().substr(0, 3) + "-" + s() + s() + s()); } @@ -180,7 +208,7 @@ class Haro { if (del) { data = patch(this.toArray().map(i => { return i[this.key]; - }), args, true); + }), args, this.key, true); } else { data = []; hash = {}; @@ -193,7 +221,7 @@ class Haro { data.push({op: "add", path: "/", value: i}); } }); - data = data.concat(patch(this.toObject(), hash, true)); + data = data.concat(patch(this.toObject(), hash, this.key, true)); } if (data.length > 0) { @@ -226,9 +254,10 @@ class Haro { } del (key, batch = false) { - let defer = deferred(); + let defer = deferred(), + next; - let next = () => { + next = () => { let index = this.registry.indexOf(key); if (index > -1) { @@ -240,7 +269,7 @@ class Haro { this.registry.splice(index, 1); } - this.delIndex(key, this.data.get(key)); + delIndex(this.index, this.indexes, this.delimiter, key, this.data.get(key)); this.data.delete(key); --this.total; @@ -255,10 +284,9 @@ class Haro { if (this.data.has(key)) { if (!batch && this.uri) { if (this.patch) { - // @todo implement this! this.request(concatURI(this.uri, null), { method: "patch", - body: null + body: JSON.stringify([{op: "remove", path: "/" + key}]) }).then(next, function (e) { defer.reject(e[0] || e); }); @@ -279,17 +307,6 @@ class Haro { return defer.promise; } - delIndex (key, data) { - this.index.forEach(i => { - let idx = this.indexes.get(i), - value = keyIndex(i, data, this.delimiter); - - if (idx.has(value)) { - idx.get(value).delete(key); - } - }); - } - entries () { return this.data.entries(); } @@ -386,14 +403,16 @@ class Haro { this.indexes.clear(); this.index.forEach(i => { this.indexes.set(i, new Map()); - this.forEach((data, key) => { - this.setIndex(key, data, i); + }); + this.forEach((data, key) => { + this.index.forEach(i => { + setIndex(this.index, this.indexes, this.delimiter, key, data, i); }); }); } else { this.indexes.set(index, new Map()); this.forEach((data, key) => { - this.setIndex(key, data, index); + setIndex(this.index, this.indexes, this.delimiter, key, data, index); }); } @@ -471,11 +490,11 @@ class Haro { this.versions.get(lkey).add(tuple(ogdata)); } - this.delIndex(lkey, ogdata); + delIndex(this.index, this.indexes, this.delimiter, lkey, ogdata); } this.data.set(lkey, ldata); - this.setIndex(lkey, ldata); + setIndex(this.index, this.indexes, this.delimiter, lkey, ldata); defer.resolve(this.get(lkey)); }; @@ -491,10 +510,9 @@ class Haro { if (!batch && this.uri) { if (this.patch) { - // @todo implement this! this.request(concatURI(this.uri, null), { method: "patch", - body: JSON.stringify(ldata) + body: JSON.stringify([{op: method === "post" ? "add" : "replace", path: "/" + lkey, value: ldata}]) }).then(next, function (e) { defer.reject(e[0] || e); }); @@ -513,26 +531,6 @@ class Haro { return defer.promise; } - setIndex (key, data, index) { - if (!index) { - this.index.forEach(i => { - this.setIndexValue(this.indexes.get(i), keyIndex(i, data, this.delimiter), key); - }); - } else { - this.setIndexValue(this.indexes.get(index), keyIndex(index, data, this.delimiter), key); - } - - return this; - } - - setIndexValue (index, key, value) { - if (!index.has(key)) { - index.set(key, new Set()); - } - - index.get(key).add(value); - } - setUri (uri, clear = false) { let defer = deferred(); diff --git a/lib/haro.js b/lib/haro.js index c132e7f..d621931 100644 --- a/lib/haro.js +++ b/lib/haro.js @@ -19,6 +19,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons var Set = global.Set || require("es6-set"); var fetch = global.fetch || require("node-fetch"); var tuple = global.tuple || require("tiny-tuple"); + var r = [8, 9, "a", "b"]; var regex = { querystring: /\?.*/, endslash: /\/$/ @@ -45,16 +46,6 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons return { resolve: resolver, reject: rejecter, promise: promise }; } - function iterate(obj, fn) { - if (obj instanceof Object) { - Object.keys(obj).forEach(function (i) { - fn.call(obj, obj[i], i); - }); - } else { - obj.forEach(fn); - } - } - function keyIndex(key, data, delimiter) { var keys = key.split(delimiter).sort(), result = undefined; @@ -70,6 +61,27 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons return result; } + function delIndex(index, indexes, delimiter, key, data) { + index.forEach(function (i) { + var idx = indexes.get(i), + value = keyIndex(i, data, delimiter); + + if (idx.has(value)) { + idx.get(value)["delete"](key); + } + }); + } + + function iterate(obj, fn) { + if (obj instanceof Object) { + Object.keys(obj).forEach(function (i) { + fn.call(obj, obj[i], i); + }); + } else { + obj.forEach(fn); + } + } + function merge(a, b) { var c = clone(a), d = clone(b); @@ -95,46 +107,60 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons function patch() { var ogdata = arguments[0] === undefined ? {} : arguments[0]; - - var _this = this; - var data = arguments[1] === undefined ? {} : arguments[1]; - var overwrite = arguments[2] === undefined ? false : arguments[2]; + var key = arguments[2] === undefined ? "" : arguments[2]; + var overwrite = arguments[3] === undefined ? false : arguments[3]; var result = []; if (overwrite) { - iterate(ogdata, function (value, key) { - if (key !== _this.key && data[key] === undefined) { - result.push({ op: "remove", path: "/" + key }); + iterate(ogdata, function (v, k) { + if (k !== key && data[k] === undefined) { + result.push({ op: "remove", path: "/" + k }); } }); } - iterate(data, function (value, key) { - if (key !== _this.key && ogdata[key] === undefined) { - result.push({ op: "add", path: "/" + key, value: value }); - } else if (JSON.stringify(ogdata[key]) !== JSON.stringify(value)) { - result.push({ op: "replace", path: "/" + key, value: value }); + iterate(data, function (v, k) { + if (k !== key && ogdata[k] === undefined) { + result.push({ op: "add", path: "/" + k, value: v }); + } else if (JSON.stringify(ogdata[k]) !== JSON.stringify(v)) { + result.push({ op: "replace", path: "/" + k, value: v }); } }); return result; } - var r = [8, 9, "a", "b"]; - function s() { return ((1 + Math.random()) * 0x10000 | 0).toString(16).substring(1); } + function setIndexValue(index, key, value) { + if (!index.has(key)) { + index.set(key, new Set()); + } + + index.get(key).add(value); + } + + function setIndex(index, indexes, delimiter, key, data, indice) { + if (!indice) { + index.forEach(function (i) { + setIndexValue(indexes.get(i), keyIndex(i, data, delimiter), key); + }); + } else { + setIndexValue(indexes.get(indice), keyIndex(indice, data, delimiter), key); + } + } + function uuid() { return s() + s() + "-" + s() + "-4" + s().substr(0, 3) + "-" + r[Math.floor(Math.random() * 4)] + s().substr(0, 3) + "-" + s() + s() + s(); } var Haro = (function () { function Haro(data) { - var _this2 = this; + var _this = this; var config = arguments[1] === undefined ? {} : arguments[1]; @@ -162,7 +188,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons this.versioning = true; Object.keys(config).forEach(function (i) { - _this2[i] = merge(_this2[i], config[i]); + _this[i] = merge(_this[i], config[i]); }); this.reindex(); @@ -175,7 +201,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons _createClass(Haro, [{ key: "batch", value: function batch(args, type) { - var _this3 = this; + var _this2 = this; var defer = deferred(), del = type === "del", @@ -193,24 +219,24 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons if (del) { fn = function (i) { - return _this3.del(i, true); + return _this2.del(i, true); }; } else { fn = function (i) { - return _this3.set(null, i, true, true); + return _this2.set(null, i, true, true); }; } if (this.patch) { if (del) { data = patch(this.toArray().map(function (i) { - return i[_this3.key]; - }), args, true); + return i[_this2.key]; + }), args, this.key, true); } else { data = []; hash = {}; args.forEach(function (i) { - var key = i[_this3.key]; + var key = i[_this2.key]; if (key) { hash[key] = i; @@ -218,7 +244,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons data.push({ op: "add", path: "/", value: i }); } }); - data = data.concat(patch(this.toObject(), hash, true)); + data = data.concat(patch(this.toObject(), hash, this.key, true)); } if (data.length > 0) { @@ -253,30 +279,31 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons }, { key: "del", value: function del(key) { - var _this4 = this; + var _this3 = this; var batch = arguments[1] === undefined ? false : arguments[1]; - var defer = deferred(); + var defer = deferred(), + next = undefined; - var next = function next() { - var index = _this4.registry.indexOf(key); + next = function () { + var index = _this3.registry.indexOf(key); if (index > -1) { if (index === 0) { - _this4.registry.shift(); - } else if (index === _this4.registry.length - 1) { - _this4.registry.pop(); + _this3.registry.shift(); + } else if (index === _this3.registry.length - 1) { + _this3.registry.pop(); } else { - _this4.registry.splice(index, 1); + _this3.registry.splice(index, 1); } - _this4.delIndex(key, _this4.data.get(key)); - _this4.data["delete"](key); - --_this4.total; + delIndex(_this3.index, _this3.indexes, _this3.delimiter, key, _this3.data.get(key)); + _this3.data["delete"](key); + --_this3.total; - if (_this4.versioning) { - _this4.versions["delete"](key); + if (_this3.versioning) { + _this3.versions["delete"](key); } } @@ -286,10 +313,9 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons if (this.data.has(key)) { if (!batch && this.uri) { if (this.patch) { - // @todo implement this! this.request(concatURI(this.uri, null), { method: "patch", - body: null + body: JSON.stringify([{ op: "remove", path: "/" + key }]) }).then(next, function (e) { defer.reject(e[0] || e); }); @@ -309,20 +335,6 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons return defer.promise; } - }, { - key: "delIndex", - value: function delIndex(key, data) { - var _this5 = this; - - this.index.forEach(function (i) { - var idx = _this5.indexes.get(i), - value = keyIndex(i, data, _this5.delimiter); - - if (idx.has(value)) { - idx.get(value)["delete"](key); - } - }); - } }, { key: "entries", value: function entries() { @@ -331,7 +343,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons }, { key: "find", value: function find(where) { - var _this6 = this; + var _this4 = this; var key = Object.keys(where).sort().join(this.delimiter), value = keyIndex(key, where, this.delimiter), @@ -339,7 +351,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons if (this.indexes.has(key)) { (this.indexes.get(key).get(value) || new Set()).forEach(function (i) { - result.push(_this6.get(i)); + result.push(_this4.get(i)); }); } @@ -431,20 +443,22 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons }, { key: "reindex", value: function reindex(index) { - var _this7 = this; + var _this5 = this; if (!index) { this.indexes.clear(); this.index.forEach(function (i) { - _this7.indexes.set(i, new Map()); - _this7.forEach(function (data, key) { - _this7.setIndex(key, data, i); + _this5.indexes.set(i, new Map()); + }); + this.forEach(function (data, key) { + _this5.index.forEach(function (i) { + setIndex(_this5.index, _this5.indexes, _this5.delimiter, key, data, i); }); }); } else { this.indexes.set(index, new Map()); this.forEach(function (data, key) { - _this7.setIndex(key, data, index); + setIndex(_this5.index, _this5.indexes, _this5.delimiter, key, data, index); }); } @@ -475,7 +489,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons }, { key: "search", value: function search(value, index) { - var _this8 = this; + var _this6 = this; var indexes = index ? this.index.indexOf(index) > -1 ? [index] : [] : this.index, result = [], @@ -485,7 +499,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons if (value) { indexes.forEach(function (i) { - var idx = _this8.indexes.get(i); + var idx = _this6.indexes.get(i); if (idx) { idx.forEach(function (lset, lkey) { @@ -493,7 +507,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons lset.forEach(function (key) { if (!seen.has(key)) { seen.add(key); - result.push(_this8.get(key)); + result.push(_this6.get(key)); } }); } @@ -507,7 +521,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons }, { key: "set", value: function set(key, data) { - var _this9 = this; + var _this7 = this; var batch = arguments[2] === undefined ? false : arguments[2]; var override = arguments[3] === undefined ? false : arguments[3]; @@ -521,25 +535,25 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons var ogdata = undefined; if (method === "post") { - _this9.registry[_this9.total] = lkey; - ++_this9.total; + _this7.registry[_this7.total] = lkey; + ++_this7.total; - if (_this9.versioning) { - _this9.versions.set(lkey, new Set()); + if (_this7.versioning) { + _this7.versions.set(lkey, new Set()); } } else { - ogdata = _this9.data.get(lkey); + ogdata = _this7.data.get(lkey); - if (_this9.versioning) { - _this9.versions.get(lkey).add(tuple(ogdata)); + if (_this7.versioning) { + _this7.versions.get(lkey).add(tuple(ogdata)); } - _this9.delIndex(lkey, ogdata); + delIndex(_this7.index, _this7.indexes, _this7.delimiter, lkey, ogdata); } - _this9.data.set(lkey, ldata); - _this9.setIndex(lkey, ldata); - defer.resolve(_this9.get(lkey)); + _this7.data.set(lkey, ldata); + setIndex(_this7.index, _this7.indexes, _this7.delimiter, lkey, ldata); + defer.resolve(_this7.get(lkey)); }; if (lkey === undefined || lkey === null) { @@ -554,10 +568,9 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons if (!batch && this.uri) { if (this.patch) { - // @todo implement this! this.request(concatURI(this.uri, null), { method: "patch", - body: JSON.stringify(ldata) + body: JSON.stringify([{ op: method === "post" ? "add" : "replace", path: "/" + lkey, value: ldata }]) }).then(next, function (e) { defer.reject(e[0] || e); }); @@ -575,30 +588,6 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons return defer.promise; } - }, { - key: "setIndex", - value: function setIndex(key, data, index) { - var _this10 = this; - - if (!index) { - this.index.forEach(function (i) { - _this10.setIndexValue(_this10.indexes.get(i), keyIndex(i, data, _this10.delimiter), key); - }); - } else { - this.setIndexValue(this.indexes.get(index), keyIndex(index, data, this.delimiter), key); - } - - return this; - } - }, { - key: "setIndexValue", - value: function setIndexValue(index, key, value) { - if (!index.has(key)) { - index.set(key, new Set()); - } - - index.get(key).add(value); - } }, { key: "setUri", value: function setUri(uri) { @@ -628,7 +617,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons }, { key: "sortBy", value: function sortBy(index) { - var _this11 = this; + var _this8 = this; var result = [], keys = [], @@ -646,7 +635,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons keys.sort().forEach(function (i) { lindex.get(i).forEach(function (key) { - result.push(_this11.get(key)); + result.push(_this8.get(key)); }); }); @@ -655,7 +644,7 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons }, { key: "sync", value: function sync() { - var _this12 = this; + var _this9 = this; var clear = arguments[0] === undefined ? false : arguments[0]; @@ -664,9 +653,9 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons this.request(this.uri).then(function (arg) { var data = arg[0]; - if (_this12.source) { + if (_this9.source) { try { - _this12.source.split(".").forEach(function (i) { + _this9.source.split(".").forEach(function (i) { data = data[i]; }); } catch (e) { @@ -675,10 +664,10 @@ function _classCallCheck(instance, Constructor) { if (!(instance instanceof Cons } if (clear) { - _this12.clear(); + _this9.clear(); } - _this12.batch(data, "set").then(function (records) { + _this9.batch(data, "set").then(function (records) { defer.resolve(records); }, function (e) { defer.reject(e); diff --git a/lib/haro.min.js b/lib/haro.min.js index 7662c9f..6c1414d 100644 --- a/lib/haro.min.js +++ b/lib/haro.min.js @@ -1,4 +1,4 @@ /* 2015 Jason Mulligan */ -"use strict";function _classCallCheck(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}var _createClass=function(){function a(a,b){for(var c=0;c1?d.map(function(a){return String(b[a])}).join(c):b[a]}function g(a,c){var d=b(a),e=b(c);return d instanceof Object&&e instanceof Object?Object.keys(e).forEach(function(a){d[a]instanceof Object&&e[a]instanceof Object?d[a]=g(d[a],e[a]):d[a]instanceof Array&&e[a]instanceof Array?d[a]=d[a].concat(e[a]):d[a]=e[a]}):d=d instanceof Array&&e instanceof Array?d.concat(e):e,d}function h(){var a=void 0===arguments[0]?{}:arguments[0],b=this,c=void 0===arguments[1]?{}:arguments[1],d=void 0===arguments[2]?!1:arguments[2],f=[];return d&&e(a,function(a,d){d!==b.key&&void 0===c[d]&&f.push({op:"remove",path:"/"+d})}),e(c,function(c,d){d!==b.key&&void 0===a[d]?f.push({op:"add",path:"/"+d,value:c}):JSON.stringify(a[d])!==JSON.stringify(c)&&f.push({op:"replace",path:"/"+d,value:c})}),f}function i(){return(65536*(1+Math.random())|0).toString(16).substring(1)}function j(){return i()+i()+"-"+i()+"-4"+i().substr(0,3)+"-"+r[Math.floor(4*Math.random())]+i().substr(0,3)+"-"+i()+i()+i()}function k(){var a=void 0===arguments[0]?null:arguments[0],b=void 0===arguments[1]?{}:arguments[1],c=void 0===arguments[2]?[]:arguments[2];return new Haro(a,b,c)}var l=a.Promise||require("es6-promise").Promise,m=a.Map||require("es6-map"),n=a.Set||require("es6-set"),o=a.fetch||require("node-fetch"),p=a.tuple||require("tiny-tuple"),q={querystring:/\?.*/,endslash:/\/$/},r=[8,9,"a","b"],Haro=function(){function Haro(a){var b=this,c=void 0===arguments[1]?{}:arguments[1];_classCallCheck(this,Haro),this.data=new m,this.delimiter="|",this.config={method:"get",credentials:!1,headers:{accept:"application/json","content-type":"application/json"}},this.index=[],this.indexes=new m,this.patch=!1,this.registry=[],this.key="",this.source="",this.total=0,this.uri="",this.versions=new m,this.versioning=!0,Object.keys(c).forEach(function(a){b[a]=g(b[a],c[a])}),this.reindex(),a&&this.batch(a,"set")}return _createClass(Haro,[{key:"batch",value:function(a,b){function c(){l.all(a.map(j)).then(function(a){f.resolve(a)},function(a){f.reject(a)})}var e=this,f=d(),g="del"===b,i=void 0,j=void 0,k=void 0;return j=g?function(a){return e.del(a,!0)}:function(a){return e.set(null,a,!0,!0)},this.patch?(g?i=h(this.toArray().map(function(a){return a[e.key]}),a,!0):(i=[],k={},a.forEach(function(a){var b=a[e.key];b?k[b]=a:i.push({op:"add",path:"/",value:a})}),i=i.concat(h(this.toObject(),k,!0))),i.length>0?this.request(this.uri,{method:"patch",body:JSON.stringify(i)}).then(function(){c()},function(a){f.reject(a)}):f.resolve()):c(),f.promise}},{key:"clear",value:function(){return this.total=0,this.registry=[],this.data.clear(),this.indexes.clear(),this.versions.clear(),this.reindex()}},{key:"del",value:function(a){var b=this,e=void 0===arguments[1]?!1:arguments[1],f=d(),g=function(){var c=b.registry.indexOf(a);c>-1&&(0===c?b.registry.shift():c===b.registry.length-1?b.registry.pop():b.registry.splice(c,1),b.delIndex(a,b.data.get(a)),b.data["delete"](a),--b.total,b.versioning&&b.versions["delete"](a)),f.resolve()};return this.data.has(a)?!e&&this.uri?this.patch?this.request(c(this.uri,null),{method:"patch",body:null}).then(g,function(a){f.reject(a[0]||a)}):this.request(c(this.uri,a),{method:"delete"}).then(g,function(a){f.reject(a[0]||a)}):g():f.reject(new Error("Record not found")),f.promise}},{key:"delIndex",value:function(a,b){var c=this;this.index.forEach(function(d){var e=c.indexes.get(d),g=f(d,b,c.delimiter);e.has(g)&&e.get(g)["delete"](a)})}},{key:"entries",value:function(){return this.data.entries()}},{key:"find",value:function(a){var b=this,c=Object.keys(a).sort().join(this.delimiter),d=f(c,a,this.delimiter),e=[];return this.indexes.has(c)&&(this.indexes.get(c).get(d)||new n).forEach(function(a){e.push(b.get(a))}),p.apply(p,e)}},{key:"filter",value:function(a){var b=[];return this.forEach(function(c,d){a(c,d)===!0&&b.push(p(d,c))}),p.apply(p,b)}},{key:"forEach",value:function(a,c){return this.data.forEach(function(c,d){a(b(c),b(d))},c),this}},{key:"get",value:function(a){var b=void 0;return this.data.has(a)&&(b=p(a,this.data.get(a))),b}},{key:"keys",value:function(){return this.data.keys()}},{key:"limit",value:function(a,b){void 0===a&&(a=0);var c=a,d=b,e=[],f=void 0,g=void 0,h=void 0;if(void 0===d&&(d=c,c=0),f=c,h=c+d,0>f||f>=h)throw new Error("Invalid range");do g=this.registry[f],g&&e.push(this.get(g));while(++f-1?"json":"text"]().then(function(d){c[200>b||b>=400?"reject":"resolve"](p(d,b,a.headers))},function(d){c.reject(p(d.message,b,a.headers))})},function(a){c.reject(p(a.message,0,null))}),c.promise}},{key:"search",value:function(a,b){var c=this,d=b?this.index.indexOf(b)>-1?[b]:[]:this.index,e=[],f="function"==typeof a,g=a instanceof RegExp,h=new n;return a&&d.forEach(function(b){var d=c.indexes.get(b);d&&d.forEach(function(b,d){(f&&a(d)||g&&a.test(d)||d===a)&&b.forEach(function(a){h.has(a)||(h.add(a),e.push(c.get(a)))})})}),p.apply(p,e)}},{key:"set",value:function(a,e){var f=this,h=void 0===arguments[2]?!1:arguments[2],i=void 0===arguments[3]?!1:arguments[3],k=d(),l="post",m=b(e),o=a,q=function(){var a=void 0;"post"===l?(f.registry[f.total]=o,++f.total,f.versioning&&f.versions.set(o,new n)):(a=f.data.get(o),f.versioning&&f.versions.get(o).add(p(a)),f.delIndex(o,a)),f.data.set(o,m),f.setIndex(o,m),k.resolve(f.get(o))};return void 0===o||null===o?o=this.key?m[this.key]||j():j()||j():this.data.has(o)&&(l="put",i||(m=g(this.get(o)[1],m))),!h&&this.uri?this.patch?this.request(c(this.uri,null),{method:"patch",body:JSON.stringify(m)}).then(q,function(a){k.reject(a[0]||a)}):this.request(c(this.uri,o),{method:l,body:JSON.stringify(m)}).then(q,function(a){k.reject(a[0]||a)}):q(),k.promise}},{key:"setIndex",value:function(a,b,c){var d=this;return c?this.setIndexValue(this.indexes.get(c),f(c,b,this.delimiter),a):this.index.forEach(function(c){d.setIndexValue(d.indexes.get(c),f(c,b,d.delimiter),a)}),this}},{key:"setIndexValue",value:function(a,b,c){a.has(b)||a.set(b,new n),a.get(b).add(c)}},{key:"setUri",value:function(a){var b=void 0===arguments[1]?!1:arguments[1],c=d();return this.uri=a,this.uri?this.sync(b).then(function(a){c.resolve(a)},function(a){c.reject(a)}):c.resolve([]),c.promise}},{key:"sort",value:function(a){return this.toArray().sort(a)}},{key:"sortBy",value:function(a){var b=this,c=[],d=[],e=void 0;return this.indexes.has(a)||(this.index.push(a),this.reindex(a)),e=this.indexes.get(a),e.forEach(function(a,b){d.push(b)}),d.sort().forEach(function(a){e.get(a).forEach(function(a){c.push(b.get(a))})}),p.apply(p,c)}},{key:"sync",value:function(){var a=this,b=void 0===arguments[0]?!1:arguments[0],c=d();return this.request(this.uri).then(function(d){var e=d[0];if(a.source)try{a.source.split(".").forEach(function(a){e=e[a]})}catch(f){return c.reject(f)}b&&a.clear(),a.batch(e,"set").then(function(a){c.resolve(a)},function(a){c.reject(a)})},function(a){c.reject(a[0]||a)}),c.promise}},{key:"toArray",value:function(){var a=[];return this.forEach(function(b){a.push(b)}),a}},{key:"toObject",value:function(){var a={};return this.forEach(function(b,c){a[c]=b}),a}},{key:"values",value:function(){return this.data.values()}}]),Haro}();k.version="1.3.2","undefined"!=typeof exports?module.exports=k:"function"==typeof define?define(function(){return k}):a.haro=k}("undefined"!=typeof global?global:window); +"use strict";function _classCallCheck(a,b){if(!(a instanceof b))throw new TypeError("Cannot call a class as a function")}var _createClass=function(){function a(a,b){for(var c=0;c1?d.map(function(a){return String(b[a])}).join(c):b[a]}function f(a,b,c,d,f){a.forEach(function(a){var g=b.get(a),h=e(a,f,c);g.has(h)&&g.get(h)["delete"](d)})}function g(a,b){a instanceof Object?Object.keys(a).forEach(function(c){b.call(a,a[c],c)}):a.forEach(b)}function h(a,c){var d=b(a),e=b(c);return d instanceof Object&&e instanceof Object?Object.keys(e).forEach(function(a){d[a]instanceof Object&&e[a]instanceof Object?d[a]=h(d[a],e[a]):d[a]instanceof Array&&e[a]instanceof Array?d[a]=d[a].concat(e[a]):d[a]=e[a]}):d=d instanceof Array&&e instanceof Array?d.concat(e):e,d}function i(){var a=void 0===arguments[0]?{}:arguments[0],b=void 0===arguments[1]?{}:arguments[1],c=void 0===arguments[2]?"":arguments[2],d=void 0===arguments[3]?!1:arguments[3],e=[];return d&&g(a,function(a,d){d!==c&&void 0===b[d]&&e.push({op:"remove",path:"/"+d})}),g(b,function(b,d){d!==c&&void 0===a[d]?e.push({op:"add",path:"/"+d,value:b}):JSON.stringify(a[d])!==JSON.stringify(b)&&e.push({op:"replace",path:"/"+d,value:b})}),e}function j(){return(65536*(1+Math.random())|0).toString(16).substring(1)}function k(a,b,c){a.has(b)||a.set(b,new q),a.get(b).add(c)}function l(a,b,c,d,f,g){g?k(b.get(g),e(g,f,c),d):a.forEach(function(a){k(b.get(a),e(a,f,c),d)})}function m(){return j()+j()+"-"+j()+"-4"+j().substr(0,3)+"-"+t[Math.floor(4*Math.random())]+j().substr(0,3)+"-"+j()+j()+j()}function n(){var a=void 0===arguments[0]?null:arguments[0],b=void 0===arguments[1]?{}:arguments[1],c=void 0===arguments[2]?[]:arguments[2];return new Haro(a,b,c)}var o=a.Promise||require("es6-promise").Promise,p=a.Map||require("es6-map"),q=a.Set||require("es6-set"),r=a.fetch||require("node-fetch"),s=a.tuple||require("tiny-tuple"),t=[8,9,"a","b"],u={querystring:/\?.*/,endslash:/\/$/},Haro=function(){function Haro(a){var b=this,c=void 0===arguments[1]?{}:arguments[1];_classCallCheck(this,Haro),this.data=new p,this.delimiter="|",this.config={method:"get",credentials:!1,headers:{accept:"application/json","content-type":"application/json"}},this.index=[],this.indexes=new p,this.patch=!1,this.registry=[],this.key="",this.source="",this.total=0,this.uri="",this.versions=new p,this.versioning=!0,Object.keys(c).forEach(function(a){b[a]=h(b[a],c[a])}),this.reindex(),a&&this.batch(a,"set")}return _createClass(Haro,[{key:"batch",value:function(a,b){function c(){o.all(a.map(j)).then(function(a){f.resolve(a)},function(a){f.reject(a)})}var e=this,f=d(),g="del"===b,h=void 0,j=void 0,k=void 0;return j=g?function(a){return e.del(a,!0)}:function(a){return e.set(null,a,!0,!0)},this.patch?(g?h=i(this.toArray().map(function(a){return a[e.key]}),a,this.key,!0):(h=[],k={},a.forEach(function(a){var b=a[e.key];b?k[b]=a:h.push({op:"add",path:"/",value:a})}),h=h.concat(i(this.toObject(),k,this.key,!0))),h.length>0?this.request(this.uri,{method:"patch",body:JSON.stringify(h)}).then(function(){c()},function(a){f.reject(a)}):f.resolve()):c(),f.promise}},{key:"clear",value:function(){return this.total=0,this.registry=[],this.data.clear(),this.indexes.clear(),this.versions.clear(),this.reindex()}},{key:"del",value:function(a){var b=this,e=void 0===arguments[1]?!1:arguments[1],g=d(),h=void 0;return h=function(){var c=b.registry.indexOf(a);c>-1&&(0===c?b.registry.shift():c===b.registry.length-1?b.registry.pop():b.registry.splice(c,1),f(b.index,b.indexes,b.delimiter,a,b.data.get(a)),b.data["delete"](a),--b.total,b.versioning&&b.versions["delete"](a)),g.resolve()},this.data.has(a)?!e&&this.uri?this.patch?this.request(c(this.uri,null),{method:"patch",body:JSON.stringify([{op:"remove",path:"/"+a}])}).then(h,function(a){g.reject(a[0]||a)}):this.request(c(this.uri,a),{method:"delete"}).then(h,function(a){g.reject(a[0]||a)}):h():g.reject(new Error("Record not found")),g.promise}},{key:"entries",value:function(){return this.data.entries()}},{key:"find",value:function(a){var b=this,c=Object.keys(a).sort().join(this.delimiter),d=e(c,a,this.delimiter),f=[];return this.indexes.has(c)&&(this.indexes.get(c).get(d)||new q).forEach(function(a){f.push(b.get(a))}),s.apply(s,f)}},{key:"filter",value:function(a){var b=[];return this.forEach(function(c,d){a(c,d)===!0&&b.push(s(d,c))}),s.apply(s,b)}},{key:"forEach",value:function(a,c){return this.data.forEach(function(c,d){a(b(c),b(d))},c),this}},{key:"get",value:function(a){var b=void 0;return this.data.has(a)&&(b=s(a,this.data.get(a))),b}},{key:"keys",value:function(){return this.data.keys()}},{key:"limit",value:function(a,b){void 0===a&&(a=0);var c=a,d=b,e=[],f=void 0,g=void 0,h=void 0;if(void 0===d&&(d=c,c=0),f=c,h=c+d,0>f||f>=h)throw new Error("Invalid range");do g=this.registry[f],g&&e.push(this.get(g));while(++f-1?"json":"text"]().then(function(d){c[200>b||b>=400?"reject":"resolve"](s(d,b,a.headers))},function(d){c.reject(s(d.message,b,a.headers))})},function(a){c.reject(s(a.message,0,null))}),c.promise}},{key:"search",value:function(a,b){var c=this,d=b?this.index.indexOf(b)>-1?[b]:[]:this.index,e=[],f="function"==typeof a,g=a instanceof RegExp,h=new q;return a&&d.forEach(function(b){var d=c.indexes.get(b);d&&d.forEach(function(b,d){(f&&a(d)||g&&a.test(d)||d===a)&&b.forEach(function(a){h.has(a)||(h.add(a),e.push(c.get(a)))})})}),s.apply(s,e)}},{key:"set",value:function(a,e){var g=this,i=void 0===arguments[2]?!1:arguments[2],j=void 0===arguments[3]?!1:arguments[3],k=d(),n="post",o=b(e),p=a,r=function(){var a=void 0;"post"===n?(g.registry[g.total]=p,++g.total,g.versioning&&g.versions.set(p,new q)):(a=g.data.get(p),g.versioning&&g.versions.get(p).add(s(a)),f(g.index,g.indexes,g.delimiter,p,a)),g.data.set(p,o),l(g.index,g.indexes,g.delimiter,p,o),k.resolve(g.get(p))};return void 0===p||null===p?p=this.key?o[this.key]||m():m()||m():this.data.has(p)&&(n="put",j||(o=h(this.get(p)[1],o))),!i&&this.uri?this.patch?this.request(c(this.uri,null),{method:"patch",body:JSON.stringify([{op:"post"===n?"add":"replace",path:"/"+p,value:o}])}).then(r,function(a){k.reject(a[0]||a)}):this.request(c(this.uri,p),{method:n,body:JSON.stringify(o)}).then(r,function(a){k.reject(a[0]||a)}):r(),k.promise}},{key:"setUri",value:function(a){var b=void 0===arguments[1]?!1:arguments[1],c=d();return this.uri=a,this.uri?this.sync(b).then(function(a){c.resolve(a)},function(a){c.reject(a)}):c.resolve([]),c.promise}},{key:"sort",value:function(a){return this.toArray().sort(a)}},{key:"sortBy",value:function(a){var b=this,c=[],d=[],e=void 0;return this.indexes.has(a)||(this.index.push(a),this.reindex(a)),e=this.indexes.get(a),e.forEach(function(a,b){d.push(b)}),d.sort().forEach(function(a){e.get(a).forEach(function(a){c.push(b.get(a))})}),s.apply(s,c)}},{key:"sync",value:function(){var a=this,b=void 0===arguments[0]?!1:arguments[0],c=d();return this.request(this.uri).then(function(d){var e=d[0];if(a.source)try{a.source.split(".").forEach(function(a){e=e[a]})}catch(f){return c.reject(f)}b&&a.clear(),a.batch(e,"set").then(function(a){c.resolve(a)},function(a){c.reject(a)})},function(a){c.reject(a[0]||a)}),c.promise}},{key:"toArray",value:function(){var a=[];return this.forEach(function(b){a.push(b)}),a}},{key:"toObject",value:function(){var a={};return this.forEach(function(b,c){a[c]=b}),a}},{key:"values",value:function(){return this.data.values()}}]),Haro}();n.version="1.3.2","undefined"!=typeof exports?module.exports=n:"function"==typeof define?define(function(){return n}):a.haro=n}("undefined"!=typeof global?global:window); //# sourceMappingURL=haro.min.js.map \ No newline at end of file diff --git a/lib/haro.min.js.map b/lib/haro.min.js.map index f3f1726..aa634db 100644 --- a/lib/haro.min.js.map +++ b/lib/haro.min.js.map @@ -1 +1 @@ -{"version":3,"file":"haro.min.js","sources":["haro.js"],"names":["_classCallCheck","instance","Constructor","TypeError","_createClass","defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","protoProps","staticProps","prototype","global","clone","arg","JSON","parse","stringify","concatURI","left","right","replace","regex","querystring","endslash","deferred","promise","undefined","resolver","rejecter","Promise","resolve","reject","iterate","obj","fn","keys","forEach","call","keyIndex","data","delimiter","split","sort","result","map","String","join","merge","a","b","c","d","Array","concat","patch","ogdata","arguments","_this","this","overwrite","value","push","op","path","s","Math","random","toString","substring","uuid","substr","r","floor","factory","config","indexes","Haro","require","Map","Set","fetch","tuple","_this2","method","credentials","headers","accept","content-type","index","registry","source","total","uri","versions","versioning","reindex","batch","args","type","next","all","then","defer","e","_this3","del","hash","set","toArray","toObject","request","body","clear","_this4","indexOf","shift","pop","splice","delIndex","get","has","Error","_this5","idx","entries","where","_this6","apply","ctx","output","offset","max","loffset","lmax","list","k","nth","_this7","setIndex","input","cfg","res","status","message","_this8","rgex","RegExp","seen","lset","lkey","test","add","_this9","override","ldata","_this10","setIndexValue","sync","_this11","lindex","_this12","records","values","version","exports","module","define","haro","window"],"mappings":"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","sourcesContent":["/**\r\n * Harō is a modern immutable DataStore using Maps, Sets, Promises, & Tuples\r\n *\r\n * @author Jason Mulligan \r\n * @copyright 2015\r\n * @license BSD-3-Clause\r\n * @link http://haro.rocks\r\n * @version 1.3.2\r\n */\n\"use strict\";\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n(function (global) {\n\tvar Promise = global.Promise || require(\"es6-promise\").Promise;\n\tvar Map = global.Map || require(\"es6-map\");\n\tvar Set = global.Set || require(\"es6-set\");\n\tvar fetch = global.fetch || require(\"node-fetch\");\n\tvar tuple = global.tuple || require(\"tiny-tuple\");\n\tvar regex = {\n\t\tquerystring: /\\?.*/,\n\t\tendslash: /\\/$/\n\t};\n\n\tfunction clone(arg) {\n\t\treturn JSON.parse(JSON.stringify(arg));\n\t}\n\n\tfunction concatURI(left, right) {\n\t\treturn left.replace(regex.querystring, \"\").replace(regex.endslash, \"\") + (right ? \"/\" + right : \"\");\n\t}\n\n\tfunction deferred() {\n\t\tvar promise = undefined,\n\t\t resolver = undefined,\n\t\t rejecter = undefined;\n\n\t\tpromise = new Promise(function (resolve, reject) {\n\t\t\tresolver = resolve;\n\t\t\trejecter = reject;\n\t\t});\n\n\t\treturn { resolve: resolver, reject: rejecter, promise: promise };\n\t}\n\n\tfunction iterate(obj, fn) {\n\t\tif (obj instanceof Object) {\n\t\t\tObject.keys(obj).forEach(function (i) {\n\t\t\t\tfn.call(obj, obj[i], i);\n\t\t\t});\n\t\t} else {\n\t\t\tobj.forEach(fn);\n\t\t}\n\t}\n\n\tfunction keyIndex(key, data, delimiter) {\n\t\tvar keys = key.split(delimiter).sort(),\n\t\t result = undefined;\n\n\t\tif (keys.length > 1) {\n\t\t\tresult = keys.map(function (i) {\n\t\t\t\treturn String(data[i]);\n\t\t\t}).join(delimiter);\n\t\t} else {\n\t\t\tresult = data[key];\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tfunction merge(a, b) {\n\t\tvar c = clone(a),\n\t\t d = clone(b);\n\n\t\tif (c instanceof Object && d instanceof Object) {\n\t\t\tObject.keys(d).forEach(function (i) {\n\t\t\t\tif (c[i] instanceof Object && d[i] instanceof Object) {\n\t\t\t\t\tc[i] = merge(c[i], d[i]);\n\t\t\t\t} else if (c[i] instanceof Array && d[i] instanceof Array) {\n\t\t\t\t\tc[i] = c[i].concat(d[i]);\n\t\t\t\t} else {\n\t\t\t\t\tc[i] = d[i];\n\t\t\t\t}\n\t\t\t});\n\t\t} else if (c instanceof Array && d instanceof Array) {\n\t\t\tc = c.concat(d);\n\t\t} else {\n\t\t\tc = d;\n\t\t}\n\n\t\treturn c;\n\t}\n\n\tfunction patch() {\n\t\tvar ogdata = arguments[0] === undefined ? {} : arguments[0];\n\n\t\tvar _this = this;\n\n\t\tvar data = arguments[1] === undefined ? {} : arguments[1];\n\t\tvar overwrite = arguments[2] === undefined ? false : arguments[2];\n\n\t\tvar result = [];\n\n\t\tif (overwrite) {\n\t\t\titerate(ogdata, function (value, key) {\n\t\t\t\tif (key !== _this.key && data[key] === undefined) {\n\t\t\t\t\tresult.push({ op: \"remove\", path: \"/\" + key });\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\titerate(data, function (value, key) {\n\t\t\tif (key !== _this.key && ogdata[key] === undefined) {\n\t\t\t\tresult.push({ op: \"add\", path: \"/\" + key, value: value });\n\t\t\t} else if (JSON.stringify(ogdata[key]) !== JSON.stringify(value)) {\n\t\t\t\tresult.push({ op: \"replace\", path: \"/\" + key, value: value });\n\t\t\t}\n\t\t});\n\n\t\treturn result;\n\t}\n\n\tvar r = [8, 9, \"a\", \"b\"];\n\n\tfunction s() {\n\t\treturn ((1 + Math.random()) * 0x10000 | 0).toString(16).substring(1);\n\t}\n\n\tfunction uuid() {\n\t\treturn s() + s() + \"-\" + s() + \"-4\" + s().substr(0, 3) + \"-\" + r[Math.floor(Math.random() * 4)] + s().substr(0, 3) + \"-\" + s() + s() + s();\n\t}\n\n\tvar Haro = (function () {\n\t\tfunction Haro(data) {\n\t\t\tvar _this2 = this;\n\n\t\t\tvar config = arguments[1] === undefined ? {} : arguments[1];\n\n\t\t\t_classCallCheck(this, Haro);\n\n\t\t\tthis.data = new Map();\n\t\t\tthis.delimiter = \"|\";\n\t\t\tthis.config = {\n\t\t\t\tmethod: \"get\",\n\t\t\t\tcredentials: false,\n\t\t\t\theaders: {\n\t\t\t\t\taccept: \"application/json\",\n\t\t\t\t\t\"content-type\": \"application/json\"\n\t\t\t\t}\n\t\t\t};\n\t\t\tthis.index = [];\n\t\t\tthis.indexes = new Map();\n\t\t\tthis.patch = false;\n\t\t\tthis.registry = [];\n\t\t\tthis.key = \"\";\n\t\t\tthis.source = \"\";\n\t\t\tthis.total = 0;\n\t\t\tthis.uri = \"\";\n\t\t\tthis.versions = new Map();\n\t\t\tthis.versioning = true;\n\n\t\t\tObject.keys(config).forEach(function (i) {\n\t\t\t\t_this2[i] = merge(_this2[i], config[i]);\n\t\t\t});\n\n\t\t\tthis.reindex();\n\n\t\t\tif (data) {\n\t\t\t\tthis.batch(data, \"set\");\n\t\t\t}\n\t\t}\n\n\t\t_createClass(Haro, [{\n\t\t\tkey: \"batch\",\n\t\t\tvalue: function batch(args, type) {\n\t\t\t\tvar _this3 = this;\n\n\t\t\t\tvar defer = deferred(),\n\t\t\t\t del = type === \"del\",\n\t\t\t\t data = undefined,\n\t\t\t\t fn = undefined,\n\t\t\t\t hash = undefined;\n\n\t\t\t\tfunction next() {\n\t\t\t\t\tPromise.all(args.map(fn)).then(function (arg) {\n\t\t\t\t\t\tdefer.resolve(arg);\n\t\t\t\t\t}, function (e) {\n\t\t\t\t\t\tdefer.reject(e);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (del) {\n\t\t\t\t\tfn = function (i) {\n\t\t\t\t\t\treturn _this3.del(i, true);\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tfn = function (i) {\n\t\t\t\t\t\treturn _this3.set(null, i, true, true);\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.patch) {\n\t\t\t\t\tif (del) {\n\t\t\t\t\t\tdata = patch(this.toArray().map(function (i) {\n\t\t\t\t\t\t\treturn i[_this3.key];\n\t\t\t\t\t\t}), args, true);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdata = [];\n\t\t\t\t\t\thash = {};\n\t\t\t\t\t\targs.forEach(function (i) {\n\t\t\t\t\t\t\tvar key = i[_this3.key];\n\n\t\t\t\t\t\t\tif (key) {\n\t\t\t\t\t\t\t\thash[key] = i;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tdata.push({ op: \"add\", path: \"/\", value: i });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\tdata = data.concat(patch(this.toObject(), hash, true));\n\t\t\t\t\t}\n\n\t\t\t\t\tif (data.length > 0) {\n\t\t\t\t\t\tthis.request(this.uri, {\n\t\t\t\t\t\t\tmethod: \"patch\",\n\t\t\t\t\t\t\tbody: JSON.stringify(data)\n\t\t\t\t\t\t}).then(function () {\n\t\t\t\t\t\t\tnext();\n\t\t\t\t\t\t}, function (e) {\n\t\t\t\t\t\t\tdefer.reject(e);\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdefer.resolve();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tnext();\n\t\t\t\t}\n\n\t\t\t\treturn defer.promise;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"clear\",\n\t\t\tvalue: function clear() {\n\t\t\t\tthis.total = 0;\n\t\t\t\tthis.registry = [];\n\t\t\t\tthis.data.clear();\n\t\t\t\tthis.indexes.clear();\n\t\t\t\tthis.versions.clear();\n\n\t\t\t\treturn this.reindex();\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"del\",\n\t\t\tvalue: function del(key) {\n\t\t\t\tvar _this4 = this;\n\n\t\t\t\tvar batch = arguments[1] === undefined ? false : arguments[1];\n\n\t\t\t\tvar defer = deferred();\n\n\t\t\t\tvar next = function next() {\n\t\t\t\t\tvar index = _this4.registry.indexOf(key);\n\n\t\t\t\t\tif (index > -1) {\n\t\t\t\t\t\tif (index === 0) {\n\t\t\t\t\t\t\t_this4.registry.shift();\n\t\t\t\t\t\t} else if (index === _this4.registry.length - 1) {\n\t\t\t\t\t\t\t_this4.registry.pop();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t_this4.registry.splice(index, 1);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t_this4.delIndex(key, _this4.data.get(key));\n\t\t\t\t\t\t_this4.data[\"delete\"](key);\n\t\t\t\t\t\t--_this4.total;\n\n\t\t\t\t\t\tif (_this4.versioning) {\n\t\t\t\t\t\t\t_this4.versions[\"delete\"](key);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tdefer.resolve();\n\t\t\t\t};\n\n\t\t\t\tif (this.data.has(key)) {\n\t\t\t\t\tif (!batch && this.uri) {\n\t\t\t\t\t\tif (this.patch) {\n\t\t\t\t\t\t\t// @todo implement this!\n\t\t\t\t\t\t\tthis.request(concatURI(this.uri, null), {\n\t\t\t\t\t\t\t\tmethod: \"patch\",\n\t\t\t\t\t\t\t\tbody: null\n\t\t\t\t\t\t\t}).then(next, function (e) {\n\t\t\t\t\t\t\t\tdefer.reject(e[0] || e);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.request(concatURI(this.uri, key), {\n\t\t\t\t\t\t\t\tmethod: \"delete\"\n\t\t\t\t\t\t\t}).then(next, function (e) {\n\t\t\t\t\t\t\t\tdefer.reject(e[0] || e);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnext();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tdefer.reject(new Error(\"Record not found\"));\n\t\t\t\t}\n\n\t\t\t\treturn defer.promise;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"delIndex\",\n\t\t\tvalue: function delIndex(key, data) {\n\t\t\t\tvar _this5 = this;\n\n\t\t\t\tthis.index.forEach(function (i) {\n\t\t\t\t\tvar idx = _this5.indexes.get(i),\n\t\t\t\t\t value = keyIndex(i, data, _this5.delimiter);\n\n\t\t\t\t\tif (idx.has(value)) {\n\t\t\t\t\t\tidx.get(value)[\"delete\"](key);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"entries\",\n\t\t\tvalue: function entries() {\n\t\t\t\treturn this.data.entries();\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"find\",\n\t\t\tvalue: function find(where) {\n\t\t\t\tvar _this6 = this;\n\n\t\t\t\tvar key = Object.keys(where).sort().join(this.delimiter),\n\t\t\t\t value = keyIndex(key, where, this.delimiter),\n\t\t\t\t result = [];\n\n\t\t\t\tif (this.indexes.has(key)) {\n\t\t\t\t\t(this.indexes.get(key).get(value) || new Set()).forEach(function (i) {\n\t\t\t\t\t\tresult.push(_this6.get(i));\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn tuple.apply(tuple, result);\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"filter\",\n\t\t\tvalue: function filter(fn) {\n\t\t\t\tvar result = [];\n\n\t\t\t\tthis.forEach(function (value, key) {\n\t\t\t\t\tif (fn(value, key) === true) {\n\t\t\t\t\t\tresult.push(tuple(key, value));\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\treturn tuple.apply(tuple, result);\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"forEach\",\n\t\t\tvalue: function forEach(fn, ctx) {\n\t\t\t\tthis.data.forEach(function (value, key) {\n\t\t\t\t\tfn(clone(value), clone(key));\n\t\t\t\t}, ctx);\n\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"get\",\n\t\t\tvalue: function get(key) {\n\t\t\t\tvar output = undefined;\n\n\t\t\t\tif (this.data.has(key)) {\n\t\t\t\t\toutput = tuple(key, this.data.get(key));\n\t\t\t\t}\n\n\t\t\t\treturn output;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"keys\",\n\t\t\tvalue: function keys() {\n\t\t\t\treturn this.data.keys();\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"limit\",\n\t\t\tvalue: function limit(offset, max) {\n\t\t\t\tif (offset === undefined) offset = 0;\n\n\t\t\t\tvar loffset = offset,\n\t\t\t\t lmax = max,\n\t\t\t\t list = [],\n\t\t\t\t i = undefined,\n\t\t\t\t k = undefined,\n\t\t\t\t nth = undefined;\n\n\t\t\t\tif (lmax === undefined) {\n\t\t\t\t\tlmax = loffset;\n\t\t\t\t\tloffset = 0;\n\t\t\t\t}\n\n\t\t\t\ti = loffset;\n\t\t\t\tnth = loffset + lmax;\n\n\t\t\t\tif (i < 0 || i >= nth) {\n\t\t\t\t\tthrow new Error(\"Invalid range\");\n\t\t\t\t}\n\n\t\t\t\tdo {\n\t\t\t\t\tk = this.registry[i];\n\n\t\t\t\t\tif (k) {\n\t\t\t\t\t\tlist.push(this.get(k));\n\t\t\t\t\t}\n\t\t\t\t} while (++i < nth);\n\n\t\t\t\treturn tuple.apply(tuple, list);\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"map\",\n\t\t\tvalue: function map(fn) {\n\t\t\t\tvar result = [];\n\n\t\t\t\tthis.forEach(function (value, key) {\n\t\t\t\t\tresult.push(fn(value, key));\n\t\t\t\t});\n\n\t\t\t\treturn tuple.apply(tuple, result);\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"reindex\",\n\t\t\tvalue: function reindex(index) {\n\t\t\t\tvar _this7 = this;\n\n\t\t\t\tif (!index) {\n\t\t\t\t\tthis.indexes.clear();\n\t\t\t\t\tthis.index.forEach(function (i) {\n\t\t\t\t\t\t_this7.indexes.set(i, new Map());\n\t\t\t\t\t\t_this7.forEach(function (data, key) {\n\t\t\t\t\t\t\t_this7.setIndex(key, data, i);\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tthis.indexes.set(index, new Map());\n\t\t\t\t\tthis.forEach(function (data, key) {\n\t\t\t\t\t\t_this7.setIndex(key, data, index);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"request\",\n\t\t\tvalue: function request(input) {\n\t\t\t\tvar config = arguments[1] === undefined ? {} : arguments[1];\n\n\t\t\t\tvar defer = deferred(),\n\t\t\t\t cfg = merge(this.config, config);\n\n\t\t\t\tfetch(input, cfg).then(function (res) {\n\t\t\t\t\tvar status = res.status;\n\n\t\t\t\t\tres[res.headers.get(\"content-type\").indexOf(\"application/json\") > -1 ? \"json\" : \"text\"]().then(function (arg) {\n\t\t\t\t\t\tdefer[status < 200 || status >= 400 ? \"reject\" : \"resolve\"](tuple(arg, status, res.headers));\n\t\t\t\t\t}, function (e) {\n\t\t\t\t\t\tdefer.reject(tuple(e.message, status, res.headers));\n\t\t\t\t\t});\n\t\t\t\t}, function (e) {\n\t\t\t\t\tdefer.reject(tuple(e.message, 0, null));\n\t\t\t\t});\n\n\t\t\t\treturn defer.promise;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"search\",\n\t\t\tvalue: function search(value, index) {\n\t\t\t\tvar _this8 = this;\n\n\t\t\t\tvar indexes = index ? this.index.indexOf(index) > -1 ? [index] : [] : this.index,\n\t\t\t\t result = [],\n\t\t\t\t fn = typeof value === \"function\",\n\t\t\t\t rgex = value instanceof RegExp,\n\t\t\t\t seen = new Set();\n\n\t\t\t\tif (value) {\n\t\t\t\t\tindexes.forEach(function (i) {\n\t\t\t\t\t\tvar idx = _this8.indexes.get(i);\n\n\t\t\t\t\t\tif (idx) {\n\t\t\t\t\t\t\tidx.forEach(function (lset, lkey) {\n\t\t\t\t\t\t\t\tif (fn && value(lkey) || rgex && value.test(lkey) || lkey === value) {\n\t\t\t\t\t\t\t\t\tlset.forEach(function (key) {\n\t\t\t\t\t\t\t\t\t\tif (!seen.has(key)) {\n\t\t\t\t\t\t\t\t\t\t\tseen.add(key);\n\t\t\t\t\t\t\t\t\t\t\tresult.push(_this8.get(key));\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn tuple.apply(tuple, result);\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"set\",\n\t\t\tvalue: function set(key, data) {\n\t\t\t\tvar _this9 = this;\n\n\t\t\t\tvar batch = arguments[2] === undefined ? false : arguments[2];\n\t\t\t\tvar override = arguments[3] === undefined ? false : arguments[3];\n\n\t\t\t\tvar defer = deferred(),\n\t\t\t\t method = \"post\",\n\t\t\t\t ldata = clone(data),\n\t\t\t\t lkey = key;\n\n\t\t\t\tvar next = function next() {\n\t\t\t\t\tvar ogdata = undefined;\n\n\t\t\t\t\tif (method === \"post\") {\n\t\t\t\t\t\t_this9.registry[_this9.total] = lkey;\n\t\t\t\t\t\t++_this9.total;\n\n\t\t\t\t\t\tif (_this9.versioning) {\n\t\t\t\t\t\t\t_this9.versions.set(lkey, new Set());\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\togdata = _this9.data.get(lkey);\n\n\t\t\t\t\t\tif (_this9.versioning) {\n\t\t\t\t\t\t\t_this9.versions.get(lkey).add(tuple(ogdata));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\t_this9.delIndex(lkey, ogdata);\n\t\t\t\t\t}\n\n\t\t\t\t\t_this9.data.set(lkey, ldata);\n\t\t\t\t\t_this9.setIndex(lkey, ldata);\n\t\t\t\t\tdefer.resolve(_this9.get(lkey));\n\t\t\t\t};\n\n\t\t\t\tif (lkey === undefined || lkey === null) {\n\t\t\t\t\tlkey = this.key ? ldata[this.key] || uuid() : uuid() || uuid();\n\t\t\t\t} else if (this.data.has(lkey)) {\n\t\t\t\t\tmethod = \"put\";\n\n\t\t\t\t\tif (!override) {\n\t\t\t\t\t\tldata = merge(this.get(lkey)[1], ldata);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!batch && this.uri) {\n\t\t\t\t\tif (this.patch) {\n\t\t\t\t\t\t// @todo implement this!\n\t\t\t\t\t\tthis.request(concatURI(this.uri, null), {\n\t\t\t\t\t\t\tmethod: \"patch\",\n\t\t\t\t\t\t\tbody: JSON.stringify(ldata)\n\t\t\t\t\t\t}).then(next, function (e) {\n\t\t\t\t\t\t\tdefer.reject(e[0] || e);\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.request(concatURI(this.uri, lkey), {\n\t\t\t\t\t\t\tmethod: method,\n\t\t\t\t\t\t\tbody: JSON.stringify(ldata)\n\t\t\t\t\t\t}).then(next, function (e) {\n\t\t\t\t\t\t\tdefer.reject(e[0] || e);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tnext();\n\t\t\t\t}\n\n\t\t\t\treturn defer.promise;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"setIndex\",\n\t\t\tvalue: function setIndex(key, data, index) {\n\t\t\t\tvar _this10 = this;\n\n\t\t\t\tif (!index) {\n\t\t\t\t\tthis.index.forEach(function (i) {\n\t\t\t\t\t\t_this10.setIndexValue(_this10.indexes.get(i), keyIndex(i, data, _this10.delimiter), key);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tthis.setIndexValue(this.indexes.get(index), keyIndex(index, data, this.delimiter), key);\n\t\t\t\t}\n\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"setIndexValue\",\n\t\t\tvalue: function setIndexValue(index, key, value) {\n\t\t\t\tif (!index.has(key)) {\n\t\t\t\t\tindex.set(key, new Set());\n\t\t\t\t}\n\n\t\t\t\tindex.get(key).add(value);\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"setUri\",\n\t\t\tvalue: function setUri(uri) {\n\t\t\t\tvar clear = arguments[1] === undefined ? false : arguments[1];\n\n\t\t\t\tvar defer = deferred();\n\n\t\t\t\tthis.uri = uri;\n\n\t\t\t\tif (this.uri) {\n\t\t\t\t\tthis.sync(clear).then(function (arg) {\n\t\t\t\t\t\tdefer.resolve(arg);\n\t\t\t\t\t}, function (e) {\n\t\t\t\t\t\tdefer.reject(e);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tdefer.resolve([]);\n\t\t\t\t}\n\n\t\t\t\treturn defer.promise;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"sort\",\n\t\t\tvalue: function sort(fn) {\n\t\t\t\treturn this.toArray().sort(fn);\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"sortBy\",\n\t\t\tvalue: function sortBy(index) {\n\t\t\t\tvar _this11 = this;\n\n\t\t\t\tvar result = [],\n\t\t\t\t keys = [],\n\t\t\t\t lindex = undefined;\n\n\t\t\t\tif (!this.indexes.has(index)) {\n\t\t\t\t\tthis.index.push(index);\n\t\t\t\t\tthis.reindex(index);\n\t\t\t\t}\n\n\t\t\t\tlindex = this.indexes.get(index);\n\t\t\t\tlindex.forEach(function (idx, key) {\n\t\t\t\t\tkeys.push(key);\n\t\t\t\t});\n\n\t\t\t\tkeys.sort().forEach(function (i) {\n\t\t\t\t\tlindex.get(i).forEach(function (key) {\n\t\t\t\t\t\tresult.push(_this11.get(key));\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\treturn tuple.apply(tuple, result);\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"sync\",\n\t\t\tvalue: function sync() {\n\t\t\t\tvar _this12 = this;\n\n\t\t\t\tvar clear = arguments[0] === undefined ? false : arguments[0];\n\n\t\t\t\tvar defer = deferred();\n\n\t\t\t\tthis.request(this.uri).then(function (arg) {\n\t\t\t\t\tvar data = arg[0];\n\n\t\t\t\t\tif (_this12.source) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t_this12.source.split(\".\").forEach(function (i) {\n\t\t\t\t\t\t\t\tdata = data[i];\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\treturn defer.reject(e);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (clear) {\n\t\t\t\t\t\t_this12.clear();\n\t\t\t\t\t}\n\n\t\t\t\t\t_this12.batch(data, \"set\").then(function (records) {\n\t\t\t\t\t\tdefer.resolve(records);\n\t\t\t\t\t}, function (e) {\n\t\t\t\t\t\tdefer.reject(e);\n\t\t\t\t\t});\n\t\t\t\t}, function (e) {\n\t\t\t\t\tdefer.reject(e[0] || e);\n\t\t\t\t});\n\n\t\t\t\treturn defer.promise;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"toArray\",\n\t\t\tvalue: function toArray() {\n\t\t\t\tvar result = [];\n\n\t\t\t\tthis.forEach(function (value) {\n\t\t\t\t\tresult.push(value);\n\t\t\t\t});\n\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"toObject\",\n\t\t\tvalue: function toObject() {\n\t\t\t\tvar result = {};\n\n\t\t\t\tthis.forEach(function (value, key) {\n\t\t\t\t\tresult[key] = value;\n\t\t\t\t});\n\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"values\",\n\t\t\tvalue: function values() {\n\t\t\t\treturn this.data.values();\n\t\t\t}\n\t\t}]);\n\n\t\treturn Haro;\n\t})();\n\n\tfunction factory() {\n\t\tvar data = arguments[0] === undefined ? null : arguments[0];\n\t\tvar config = arguments[1] === undefined ? {} : arguments[1];\n\t\tvar indexes = arguments[2] === undefined ? [] : arguments[2];\n\n\t\treturn new Haro(data, config, indexes);\n\t}\n\n\tfactory.version = \"1.3.2\";\n\n\t// Node, AMD & window supported\n\tif (typeof exports !== \"undefined\") {\n\t\tmodule.exports = factory;\n\t} else if (typeof define === \"function\") {\n\t\tdefine(function () {\n\t\t\treturn factory;\n\t\t});\n\t} else {\n\t\tglobal.haro = factory;\n\t}\n})(typeof global !== \"undefined\" ? global : window);\n"]} \ No newline at end of file +{"version":3,"file":"haro.min.js","sources":["haro.js"],"names":["_classCallCheck","instance","Constructor","TypeError","_createClass","defineProperties","target","props","i","length","descriptor","enumerable","configurable","writable","Object","defineProperty","key","protoProps","staticProps","prototype","global","clone","arg","JSON","parse","stringify","concatURI","left","right","replace","regex","querystring","endslash","deferred","promise","undefined","resolver","rejecter","Promise","resolve","reject","keyIndex","data","delimiter","keys","split","sort","result","map","String","join","delIndex","index","indexes","forEach","idx","get","value","has","iterate","obj","fn","call","merge","a","b","c","d","Array","concat","patch","ogdata","arguments","overwrite","v","k","push","op","path","s","Math","random","toString","substring","setIndexValue","set","Set","add","setIndex","indice","uuid","substr","r","floor","factory","config","Haro","require","Map","fetch","tuple","_this","this","method","credentials","headers","accept","content-type","registry","source","total","uri","versions","versioning","reindex","batch","args","type","next","all","then","defer","e","_this2","del","hash","toArray","toObject","request","body","clear","_this3","indexOf","shift","pop","splice","Error","entries","where","_this4","apply","ctx","output","offset","max","loffset","lmax","list","nth","_this5","input","cfg","res","status","message","_this6","rgex","RegExp","seen","lset","lkey","test","_this7","override","ldata","sync","_this8","lindex","_this9","records","values","version","exports","module","define","haro","window"],"mappings":"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","sourcesContent":["/**\r\n * Harō is a modern immutable DataStore using Maps, Sets, Promises, & Tuples\r\n *\r\n * @author Jason Mulligan \r\n * @copyright 2015\r\n * @license BSD-3-Clause\r\n * @link http://haro.rocks\r\n * @version 1.3.2\r\n */\n\"use strict\";\n\nvar _createClass = (function () { function defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } } return function (Constructor, protoProps, staticProps) { if (protoProps) defineProperties(Constructor.prototype, protoProps); if (staticProps) defineProperties(Constructor, staticProps); return Constructor; }; })();\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\n(function (global) {\n\tvar Promise = global.Promise || require(\"es6-promise\").Promise;\n\tvar Map = global.Map || require(\"es6-map\");\n\tvar Set = global.Set || require(\"es6-set\");\n\tvar fetch = global.fetch || require(\"node-fetch\");\n\tvar tuple = global.tuple || require(\"tiny-tuple\");\n\tvar r = [8, 9, \"a\", \"b\"];\n\tvar regex = {\n\t\tquerystring: /\\?.*/,\n\t\tendslash: /\\/$/\n\t};\n\n\tfunction clone(arg) {\n\t\treturn JSON.parse(JSON.stringify(arg));\n\t}\n\n\tfunction concatURI(left, right) {\n\t\treturn left.replace(regex.querystring, \"\").replace(regex.endslash, \"\") + (right ? \"/\" + right : \"\");\n\t}\n\n\tfunction deferred() {\n\t\tvar promise = undefined,\n\t\t resolver = undefined,\n\t\t rejecter = undefined;\n\n\t\tpromise = new Promise(function (resolve, reject) {\n\t\t\tresolver = resolve;\n\t\t\trejecter = reject;\n\t\t});\n\n\t\treturn { resolve: resolver, reject: rejecter, promise: promise };\n\t}\n\n\tfunction keyIndex(key, data, delimiter) {\n\t\tvar keys = key.split(delimiter).sort(),\n\t\t result = undefined;\n\n\t\tif (keys.length > 1) {\n\t\t\tresult = keys.map(function (i) {\n\t\t\t\treturn String(data[i]);\n\t\t\t}).join(delimiter);\n\t\t} else {\n\t\t\tresult = data[key];\n\t\t}\n\n\t\treturn result;\n\t}\n\n\tfunction delIndex(index, indexes, delimiter, key, data) {\n\t\tindex.forEach(function (i) {\n\t\t\tvar idx = indexes.get(i),\n\t\t\t value = keyIndex(i, data, delimiter);\n\n\t\t\tif (idx.has(value)) {\n\t\t\t\tidx.get(value)[\"delete\"](key);\n\t\t\t}\n\t\t});\n\t}\n\n\tfunction iterate(obj, fn) {\n\t\tif (obj instanceof Object) {\n\t\t\tObject.keys(obj).forEach(function (i) {\n\t\t\t\tfn.call(obj, obj[i], i);\n\t\t\t});\n\t\t} else {\n\t\t\tobj.forEach(fn);\n\t\t}\n\t}\n\n\tfunction merge(a, b) {\n\t\tvar c = clone(a),\n\t\t d = clone(b);\n\n\t\tif (c instanceof Object && d instanceof Object) {\n\t\t\tObject.keys(d).forEach(function (i) {\n\t\t\t\tif (c[i] instanceof Object && d[i] instanceof Object) {\n\t\t\t\t\tc[i] = merge(c[i], d[i]);\n\t\t\t\t} else if (c[i] instanceof Array && d[i] instanceof Array) {\n\t\t\t\t\tc[i] = c[i].concat(d[i]);\n\t\t\t\t} else {\n\t\t\t\t\tc[i] = d[i];\n\t\t\t\t}\n\t\t\t});\n\t\t} else if (c instanceof Array && d instanceof Array) {\n\t\t\tc = c.concat(d);\n\t\t} else {\n\t\t\tc = d;\n\t\t}\n\n\t\treturn c;\n\t}\n\n\tfunction patch() {\n\t\tvar ogdata = arguments[0] === undefined ? {} : arguments[0];\n\t\tvar data = arguments[1] === undefined ? {} : arguments[1];\n\t\tvar key = arguments[2] === undefined ? \"\" : arguments[2];\n\t\tvar overwrite = arguments[3] === undefined ? false : arguments[3];\n\n\t\tvar result = [];\n\n\t\tif (overwrite) {\n\t\t\titerate(ogdata, function (v, k) {\n\t\t\t\tif (k !== key && data[k] === undefined) {\n\t\t\t\t\tresult.push({ op: \"remove\", path: \"/\" + k });\n\t\t\t\t}\n\t\t\t});\n\t\t}\n\n\t\titerate(data, function (v, k) {\n\t\t\tif (k !== key && ogdata[k] === undefined) {\n\t\t\t\tresult.push({ op: \"add\", path: \"/\" + k, value: v });\n\t\t\t} else if (JSON.stringify(ogdata[k]) !== JSON.stringify(v)) {\n\t\t\t\tresult.push({ op: \"replace\", path: \"/\" + k, value: v });\n\t\t\t}\n\t\t});\n\n\t\treturn result;\n\t}\n\n\tfunction s() {\n\t\treturn ((1 + Math.random()) * 0x10000 | 0).toString(16).substring(1);\n\t}\n\n\tfunction setIndexValue(index, key, value) {\n\t\tif (!index.has(key)) {\n\t\t\tindex.set(key, new Set());\n\t\t}\n\n\t\tindex.get(key).add(value);\n\t}\n\n\tfunction setIndex(index, indexes, delimiter, key, data, indice) {\n\t\tif (!indice) {\n\t\t\tindex.forEach(function (i) {\n\t\t\t\tsetIndexValue(indexes.get(i), keyIndex(i, data, delimiter), key);\n\t\t\t});\n\t\t} else {\n\t\t\tsetIndexValue(indexes.get(indice), keyIndex(indice, data, delimiter), key);\n\t\t}\n\t}\n\n\tfunction uuid() {\n\t\treturn s() + s() + \"-\" + s() + \"-4\" + s().substr(0, 3) + \"-\" + r[Math.floor(Math.random() * 4)] + s().substr(0, 3) + \"-\" + s() + s() + s();\n\t}\n\n\tvar Haro = (function () {\n\t\tfunction Haro(data) {\n\t\t\tvar _this = this;\n\n\t\t\tvar config = arguments[1] === undefined ? {} : arguments[1];\n\n\t\t\t_classCallCheck(this, Haro);\n\n\t\t\tthis.data = new Map();\n\t\t\tthis.delimiter = \"|\";\n\t\t\tthis.config = {\n\t\t\t\tmethod: \"get\",\n\t\t\t\tcredentials: false,\n\t\t\t\theaders: {\n\t\t\t\t\taccept: \"application/json\",\n\t\t\t\t\t\"content-type\": \"application/json\"\n\t\t\t\t}\n\t\t\t};\n\t\t\tthis.index = [];\n\t\t\tthis.indexes = new Map();\n\t\t\tthis.patch = false;\n\t\t\tthis.registry = [];\n\t\t\tthis.key = \"\";\n\t\t\tthis.source = \"\";\n\t\t\tthis.total = 0;\n\t\t\tthis.uri = \"\";\n\t\t\tthis.versions = new Map();\n\t\t\tthis.versioning = true;\n\n\t\t\tObject.keys(config).forEach(function (i) {\n\t\t\t\t_this[i] = merge(_this[i], config[i]);\n\t\t\t});\n\n\t\t\tthis.reindex();\n\n\t\t\tif (data) {\n\t\t\t\tthis.batch(data, \"set\");\n\t\t\t}\n\t\t}\n\n\t\t_createClass(Haro, [{\n\t\t\tkey: \"batch\",\n\t\t\tvalue: function batch(args, type) {\n\t\t\t\tvar _this2 = this;\n\n\t\t\t\tvar defer = deferred(),\n\t\t\t\t del = type === \"del\",\n\t\t\t\t data = undefined,\n\t\t\t\t fn = undefined,\n\t\t\t\t hash = undefined;\n\n\t\t\t\tfunction next() {\n\t\t\t\t\tPromise.all(args.map(fn)).then(function (arg) {\n\t\t\t\t\t\tdefer.resolve(arg);\n\t\t\t\t\t}, function (e) {\n\t\t\t\t\t\tdefer.reject(e);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\tif (del) {\n\t\t\t\t\tfn = function (i) {\n\t\t\t\t\t\treturn _this2.del(i, true);\n\t\t\t\t\t};\n\t\t\t\t} else {\n\t\t\t\t\tfn = function (i) {\n\t\t\t\t\t\treturn _this2.set(null, i, true, true);\n\t\t\t\t\t};\n\t\t\t\t}\n\n\t\t\t\tif (this.patch) {\n\t\t\t\t\tif (del) {\n\t\t\t\t\t\tdata = patch(this.toArray().map(function (i) {\n\t\t\t\t\t\t\treturn i[_this2.key];\n\t\t\t\t\t\t}), args, this.key, true);\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdata = [];\n\t\t\t\t\t\thash = {};\n\t\t\t\t\t\targs.forEach(function (i) {\n\t\t\t\t\t\t\tvar key = i[_this2.key];\n\n\t\t\t\t\t\t\tif (key) {\n\t\t\t\t\t\t\t\thash[key] = i;\n\t\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t\tdata.push({ op: \"add\", path: \"/\", value: i });\n\t\t\t\t\t\t\t}\n\t\t\t\t\t\t});\n\t\t\t\t\t\tdata = data.concat(patch(this.toObject(), hash, this.key, true));\n\t\t\t\t\t}\n\n\t\t\t\t\tif (data.length > 0) {\n\t\t\t\t\t\tthis.request(this.uri, {\n\t\t\t\t\t\t\tmethod: \"patch\",\n\t\t\t\t\t\t\tbody: JSON.stringify(data)\n\t\t\t\t\t\t}).then(function () {\n\t\t\t\t\t\t\tnext();\n\t\t\t\t\t\t}, function (e) {\n\t\t\t\t\t\t\tdefer.reject(e);\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tdefer.resolve();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tnext();\n\t\t\t\t}\n\n\t\t\t\treturn defer.promise;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"clear\",\n\t\t\tvalue: function clear() {\n\t\t\t\tthis.total = 0;\n\t\t\t\tthis.registry = [];\n\t\t\t\tthis.data.clear();\n\t\t\t\tthis.indexes.clear();\n\t\t\t\tthis.versions.clear();\n\n\t\t\t\treturn this.reindex();\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"del\",\n\t\t\tvalue: function del(key) {\n\t\t\t\tvar _this3 = this;\n\n\t\t\t\tvar batch = arguments[1] === undefined ? false : arguments[1];\n\n\t\t\t\tvar defer = deferred(),\n\t\t\t\t next = undefined;\n\n\t\t\t\tnext = function () {\n\t\t\t\t\tvar index = _this3.registry.indexOf(key);\n\n\t\t\t\t\tif (index > -1) {\n\t\t\t\t\t\tif (index === 0) {\n\t\t\t\t\t\t\t_this3.registry.shift();\n\t\t\t\t\t\t} else if (index === _this3.registry.length - 1) {\n\t\t\t\t\t\t\t_this3.registry.pop();\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\t_this3.registry.splice(index, 1);\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdelIndex(_this3.index, _this3.indexes, _this3.delimiter, key, _this3.data.get(key));\n\t\t\t\t\t\t_this3.data[\"delete\"](key);\n\t\t\t\t\t\t--_this3.total;\n\n\t\t\t\t\t\tif (_this3.versioning) {\n\t\t\t\t\t\t\t_this3.versions[\"delete\"](key);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tdefer.resolve();\n\t\t\t\t};\n\n\t\t\t\tif (this.data.has(key)) {\n\t\t\t\t\tif (!batch && this.uri) {\n\t\t\t\t\t\tif (this.patch) {\n\t\t\t\t\t\t\tthis.request(concatURI(this.uri, null), {\n\t\t\t\t\t\t\t\tmethod: \"patch\",\n\t\t\t\t\t\t\t\tbody: JSON.stringify([{ op: \"remove\", path: \"/\" + key }])\n\t\t\t\t\t\t\t}).then(next, function (e) {\n\t\t\t\t\t\t\t\tdefer.reject(e[0] || e);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tthis.request(concatURI(this.uri, key), {\n\t\t\t\t\t\t\t\tmethod: \"delete\"\n\t\t\t\t\t\t\t}).then(next, function (e) {\n\t\t\t\t\t\t\t\tdefer.reject(e[0] || e);\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\tnext();\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tdefer.reject(new Error(\"Record not found\"));\n\t\t\t\t}\n\n\t\t\t\treturn defer.promise;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"entries\",\n\t\t\tvalue: function entries() {\n\t\t\t\treturn this.data.entries();\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"find\",\n\t\t\tvalue: function find(where) {\n\t\t\t\tvar _this4 = this;\n\n\t\t\t\tvar key = Object.keys(where).sort().join(this.delimiter),\n\t\t\t\t value = keyIndex(key, where, this.delimiter),\n\t\t\t\t result = [];\n\n\t\t\t\tif (this.indexes.has(key)) {\n\t\t\t\t\t(this.indexes.get(key).get(value) || new Set()).forEach(function (i) {\n\t\t\t\t\t\tresult.push(_this4.get(i));\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn tuple.apply(tuple, result);\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"filter\",\n\t\t\tvalue: function filter(fn) {\n\t\t\t\tvar result = [];\n\n\t\t\t\tthis.forEach(function (value, key) {\n\t\t\t\t\tif (fn(value, key) === true) {\n\t\t\t\t\t\tresult.push(tuple(key, value));\n\t\t\t\t\t}\n\t\t\t\t});\n\n\t\t\t\treturn tuple.apply(tuple, result);\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"forEach\",\n\t\t\tvalue: function forEach(fn, ctx) {\n\t\t\t\tthis.data.forEach(function (value, key) {\n\t\t\t\t\tfn(clone(value), clone(key));\n\t\t\t\t}, ctx);\n\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"get\",\n\t\t\tvalue: function get(key) {\n\t\t\t\tvar output = undefined;\n\n\t\t\t\tif (this.data.has(key)) {\n\t\t\t\t\toutput = tuple(key, this.data.get(key));\n\t\t\t\t}\n\n\t\t\t\treturn output;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"keys\",\n\t\t\tvalue: function keys() {\n\t\t\t\treturn this.data.keys();\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"limit\",\n\t\t\tvalue: function limit(offset, max) {\n\t\t\t\tif (offset === undefined) offset = 0;\n\n\t\t\t\tvar loffset = offset,\n\t\t\t\t lmax = max,\n\t\t\t\t list = [],\n\t\t\t\t i = undefined,\n\t\t\t\t k = undefined,\n\t\t\t\t nth = undefined;\n\n\t\t\t\tif (lmax === undefined) {\n\t\t\t\t\tlmax = loffset;\n\t\t\t\t\tloffset = 0;\n\t\t\t\t}\n\n\t\t\t\ti = loffset;\n\t\t\t\tnth = loffset + lmax;\n\n\t\t\t\tif (i < 0 || i >= nth) {\n\t\t\t\t\tthrow new Error(\"Invalid range\");\n\t\t\t\t}\n\n\t\t\t\tdo {\n\t\t\t\t\tk = this.registry[i];\n\n\t\t\t\t\tif (k) {\n\t\t\t\t\t\tlist.push(this.get(k));\n\t\t\t\t\t}\n\t\t\t\t} while (++i < nth);\n\n\t\t\t\treturn tuple.apply(tuple, list);\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"map\",\n\t\t\tvalue: function map(fn) {\n\t\t\t\tvar result = [];\n\n\t\t\t\tthis.forEach(function (value, key) {\n\t\t\t\t\tresult.push(fn(value, key));\n\t\t\t\t});\n\n\t\t\t\treturn tuple.apply(tuple, result);\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"reindex\",\n\t\t\tvalue: function reindex(index) {\n\t\t\t\tvar _this5 = this;\n\n\t\t\t\tif (!index) {\n\t\t\t\t\tthis.indexes.clear();\n\t\t\t\t\tthis.index.forEach(function (i) {\n\t\t\t\t\t\t_this5.indexes.set(i, new Map());\n\t\t\t\t\t});\n\t\t\t\t\tthis.forEach(function (data, key) {\n\t\t\t\t\t\t_this5.index.forEach(function (i) {\n\t\t\t\t\t\t\tsetIndex(_this5.index, _this5.indexes, _this5.delimiter, key, data, i);\n\t\t\t\t\t\t});\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tthis.indexes.set(index, new Map());\n\t\t\t\t\tthis.forEach(function (data, key) {\n\t\t\t\t\t\tsetIndex(_this5.index, _this5.indexes, _this5.delimiter, key, data, index);\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"request\",\n\t\t\tvalue: function request(input) {\n\t\t\t\tvar config = arguments[1] === undefined ? {} : arguments[1];\n\n\t\t\t\tvar defer = deferred(),\n\t\t\t\t cfg = merge(this.config, config);\n\n\t\t\t\tfetch(input, cfg).then(function (res) {\n\t\t\t\t\tvar status = res.status;\n\n\t\t\t\t\tres[res.headers.get(\"content-type\").indexOf(\"application/json\") > -1 ? \"json\" : \"text\"]().then(function (arg) {\n\t\t\t\t\t\tdefer[status < 200 || status >= 400 ? \"reject\" : \"resolve\"](tuple(arg, status, res.headers));\n\t\t\t\t\t}, function (e) {\n\t\t\t\t\t\tdefer.reject(tuple(e.message, status, res.headers));\n\t\t\t\t\t});\n\t\t\t\t}, function (e) {\n\t\t\t\t\tdefer.reject(tuple(e.message, 0, null));\n\t\t\t\t});\n\n\t\t\t\treturn defer.promise;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"search\",\n\t\t\tvalue: function search(value, index) {\n\t\t\t\tvar _this6 = this;\n\n\t\t\t\tvar indexes = index ? this.index.indexOf(index) > -1 ? [index] : [] : this.index,\n\t\t\t\t result = [],\n\t\t\t\t fn = typeof value === \"function\",\n\t\t\t\t rgex = value instanceof RegExp,\n\t\t\t\t seen = new Set();\n\n\t\t\t\tif (value) {\n\t\t\t\t\tindexes.forEach(function (i) {\n\t\t\t\t\t\tvar idx = _this6.indexes.get(i);\n\n\t\t\t\t\t\tif (idx) {\n\t\t\t\t\t\t\tidx.forEach(function (lset, lkey) {\n\t\t\t\t\t\t\t\tif (fn && value(lkey) || rgex && value.test(lkey) || lkey === value) {\n\t\t\t\t\t\t\t\t\tlset.forEach(function (key) {\n\t\t\t\t\t\t\t\t\t\tif (!seen.has(key)) {\n\t\t\t\t\t\t\t\t\t\t\tseen.add(key);\n\t\t\t\t\t\t\t\t\t\t\tresult.push(_this6.get(key));\n\t\t\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t\t\t});\n\t\t\t\t\t\t\t\t}\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t}\n\n\t\t\t\treturn tuple.apply(tuple, result);\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"set\",\n\t\t\tvalue: function set(key, data) {\n\t\t\t\tvar _this7 = this;\n\n\t\t\t\tvar batch = arguments[2] === undefined ? false : arguments[2];\n\t\t\t\tvar override = arguments[3] === undefined ? false : arguments[3];\n\n\t\t\t\tvar defer = deferred(),\n\t\t\t\t method = \"post\",\n\t\t\t\t ldata = clone(data),\n\t\t\t\t lkey = key;\n\n\t\t\t\tvar next = function next() {\n\t\t\t\t\tvar ogdata = undefined;\n\n\t\t\t\t\tif (method === \"post\") {\n\t\t\t\t\t\t_this7.registry[_this7.total] = lkey;\n\t\t\t\t\t\t++_this7.total;\n\n\t\t\t\t\t\tif (_this7.versioning) {\n\t\t\t\t\t\t\t_this7.versions.set(lkey, new Set());\n\t\t\t\t\t\t}\n\t\t\t\t\t} else {\n\t\t\t\t\t\togdata = _this7.data.get(lkey);\n\n\t\t\t\t\t\tif (_this7.versioning) {\n\t\t\t\t\t\t\t_this7.versions.get(lkey).add(tuple(ogdata));\n\t\t\t\t\t\t}\n\n\t\t\t\t\t\tdelIndex(_this7.index, _this7.indexes, _this7.delimiter, lkey, ogdata);\n\t\t\t\t\t}\n\n\t\t\t\t\t_this7.data.set(lkey, ldata);\n\t\t\t\t\tsetIndex(_this7.index, _this7.indexes, _this7.delimiter, lkey, ldata);\n\t\t\t\t\tdefer.resolve(_this7.get(lkey));\n\t\t\t\t};\n\n\t\t\t\tif (lkey === undefined || lkey === null) {\n\t\t\t\t\tlkey = this.key ? ldata[this.key] || uuid() : uuid() || uuid();\n\t\t\t\t} else if (this.data.has(lkey)) {\n\t\t\t\t\tmethod = \"put\";\n\n\t\t\t\t\tif (!override) {\n\t\t\t\t\t\tldata = merge(this.get(lkey)[1], ldata);\n\t\t\t\t\t}\n\t\t\t\t}\n\n\t\t\t\tif (!batch && this.uri) {\n\t\t\t\t\tif (this.patch) {\n\t\t\t\t\t\tthis.request(concatURI(this.uri, null), {\n\t\t\t\t\t\t\tmethod: \"patch\",\n\t\t\t\t\t\t\tbody: JSON.stringify([{ op: method === \"post\" ? \"add\" : \"replace\", path: \"/\" + lkey, value: ldata }])\n\t\t\t\t\t\t}).then(next, function (e) {\n\t\t\t\t\t\t\tdefer.reject(e[0] || e);\n\t\t\t\t\t\t});\n\t\t\t\t\t} else {\n\t\t\t\t\t\tthis.request(concatURI(this.uri, lkey), {\n\t\t\t\t\t\t\tmethod: method,\n\t\t\t\t\t\t\tbody: JSON.stringify(ldata)\n\t\t\t\t\t\t}).then(next, function (e) {\n\t\t\t\t\t\t\tdefer.reject(e[0] || e);\n\t\t\t\t\t\t});\n\t\t\t\t\t}\n\t\t\t\t} else {\n\t\t\t\t\tnext();\n\t\t\t\t}\n\n\t\t\t\treturn defer.promise;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"setUri\",\n\t\t\tvalue: function setUri(uri) {\n\t\t\t\tvar clear = arguments[1] === undefined ? false : arguments[1];\n\n\t\t\t\tvar defer = deferred();\n\n\t\t\t\tthis.uri = uri;\n\n\t\t\t\tif (this.uri) {\n\t\t\t\t\tthis.sync(clear).then(function (arg) {\n\t\t\t\t\t\tdefer.resolve(arg);\n\t\t\t\t\t}, function (e) {\n\t\t\t\t\t\tdefer.reject(e);\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\tdefer.resolve([]);\n\t\t\t\t}\n\n\t\t\t\treturn defer.promise;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"sort\",\n\t\t\tvalue: function sort(fn) {\n\t\t\t\treturn this.toArray().sort(fn);\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"sortBy\",\n\t\t\tvalue: function sortBy(index) {\n\t\t\t\tvar _this8 = this;\n\n\t\t\t\tvar result = [],\n\t\t\t\t keys = [],\n\t\t\t\t lindex = undefined;\n\n\t\t\t\tif (!this.indexes.has(index)) {\n\t\t\t\t\tthis.index.push(index);\n\t\t\t\t\tthis.reindex(index);\n\t\t\t\t}\n\n\t\t\t\tlindex = this.indexes.get(index);\n\t\t\t\tlindex.forEach(function (idx, key) {\n\t\t\t\t\tkeys.push(key);\n\t\t\t\t});\n\n\t\t\t\tkeys.sort().forEach(function (i) {\n\t\t\t\t\tlindex.get(i).forEach(function (key) {\n\t\t\t\t\t\tresult.push(_this8.get(key));\n\t\t\t\t\t});\n\t\t\t\t});\n\n\t\t\t\treturn tuple.apply(tuple, result);\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"sync\",\n\t\t\tvalue: function sync() {\n\t\t\t\tvar _this9 = this;\n\n\t\t\t\tvar clear = arguments[0] === undefined ? false : arguments[0];\n\n\t\t\t\tvar defer = deferred();\n\n\t\t\t\tthis.request(this.uri).then(function (arg) {\n\t\t\t\t\tvar data = arg[0];\n\n\t\t\t\t\tif (_this9.source) {\n\t\t\t\t\t\ttry {\n\t\t\t\t\t\t\t_this9.source.split(\".\").forEach(function (i) {\n\t\t\t\t\t\t\t\tdata = data[i];\n\t\t\t\t\t\t\t});\n\t\t\t\t\t\t} catch (e) {\n\t\t\t\t\t\t\treturn defer.reject(e);\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\n\t\t\t\t\tif (clear) {\n\t\t\t\t\t\t_this9.clear();\n\t\t\t\t\t}\n\n\t\t\t\t\t_this9.batch(data, \"set\").then(function (records) {\n\t\t\t\t\t\tdefer.resolve(records);\n\t\t\t\t\t}, function (e) {\n\t\t\t\t\t\tdefer.reject(e);\n\t\t\t\t\t});\n\t\t\t\t}, function (e) {\n\t\t\t\t\tdefer.reject(e[0] || e);\n\t\t\t\t});\n\n\t\t\t\treturn defer.promise;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"toArray\",\n\t\t\tvalue: function toArray() {\n\t\t\t\tvar result = [];\n\n\t\t\t\tthis.forEach(function (value) {\n\t\t\t\t\tresult.push(value);\n\t\t\t\t});\n\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"toObject\",\n\t\t\tvalue: function toObject() {\n\t\t\t\tvar result = {};\n\n\t\t\t\tthis.forEach(function (value, key) {\n\t\t\t\t\tresult[key] = value;\n\t\t\t\t});\n\n\t\t\t\treturn result;\n\t\t\t}\n\t\t}, {\n\t\t\tkey: \"values\",\n\t\t\tvalue: function values() {\n\t\t\t\treturn this.data.values();\n\t\t\t}\n\t\t}]);\n\n\t\treturn Haro;\n\t})();\n\n\tfunction factory() {\n\t\tvar data = arguments[0] === undefined ? null : arguments[0];\n\t\tvar config = arguments[1] === undefined ? {} : arguments[1];\n\t\tvar indexes = arguments[2] === undefined ? [] : arguments[2];\n\n\t\treturn new Haro(data, config, indexes);\n\t}\n\n\tfactory.version = \"1.3.2\";\n\n\t// Node, AMD & window supported\n\tif (typeof exports !== \"undefined\") {\n\t\tmodule.exports = factory;\n\t} else if (typeof define === \"function\") {\n\t\tdefine(function () {\n\t\t\treturn factory;\n\t\t});\n\t} else {\n\t\tglobal.haro = factory;\n\t}\n})(typeof global !== \"undefined\" ? global : window);\n"]} \ No newline at end of file diff --git a/src/haro.js b/src/haro.js index 203cc35..62ba78d 100644 --- a/src/haro.js +++ b/src/haro.js @@ -59,7 +59,7 @@ class Haro { if (del) { data = patch(this.toArray().map(i => { return i[this.key]; - }), args, true); + }), args, this.key, true); } else { data = []; hash = {}; @@ -72,7 +72,7 @@ class Haro { data.push({op: "add", path: "/", value: i}); } }); - data = data.concat(patch(this.toObject(), hash, true)); + data = data.concat(patch(this.toObject(), hash, this.key, true)); } if (data.length > 0) { @@ -105,9 +105,10 @@ class Haro { } del (key, batch = false) { - let defer = deferred(); + let defer = deferred(), + next; - let next = () => { + next = () => { let index = this.registry.indexOf(key); if (index > -1) { @@ -119,7 +120,7 @@ class Haro { this.registry.splice(index, 1); } - this.delIndex(key, this.data.get(key)); + delIndex(this.index, this.indexes, this.delimiter, key, this.data.get(key)); this.data.delete(key); --this.total; @@ -134,10 +135,9 @@ class Haro { if (this.data.has(key)) { if (!batch && this.uri) { if (this.patch) { - // @todo implement this! this.request(concatURI(this.uri, null), { method: "patch", - body: null + body: JSON.stringify([{op: "remove", path: "/" + key}]) }).then(next, function (e) { defer.reject(e[0] || e); }); @@ -158,17 +158,6 @@ class Haro { return defer.promise; } - delIndex (key, data) { - this.index.forEach(i => { - let idx = this.indexes.get(i), - value = keyIndex(i, data, this.delimiter); - - if (idx.has(value)) { - idx.get(value).delete(key); - } - }); - } - entries () { return this.data.entries(); } @@ -265,14 +254,16 @@ class Haro { this.indexes.clear(); this.index.forEach(i => { this.indexes.set(i, new Map()); - this.forEach((data, key) => { - this.setIndex(key, data, i); + }); + this.forEach((data, key) => { + this.index.forEach(i => { + setIndex(this.index, this.indexes, this.delimiter, key, data, i); }); }); } else { this.indexes.set(index, new Map()); this.forEach((data, key) => { - this.setIndex(key, data, index); + setIndex(this.index, this.indexes, this.delimiter, key, data, index); }); } @@ -350,11 +341,11 @@ class Haro { this.versions.get(lkey).add(tuple(ogdata)); } - this.delIndex(lkey, ogdata); + delIndex(this.index, this.indexes, this.delimiter, lkey, ogdata); } this.data.set(lkey, ldata); - this.setIndex(lkey, ldata); + setIndex(this.index, this.indexes, this.delimiter, lkey, ldata); defer.resolve(this.get(lkey)); }; @@ -370,10 +361,9 @@ class Haro { if (!batch && this.uri) { if (this.patch) { - // @todo implement this! this.request(concatURI(this.uri, null), { method: "patch", - body: JSON.stringify(ldata) + body: JSON.stringify([{op: method === "post" ? "add" : "replace", path: "/" + lkey, value: ldata}]) }).then(next, function (e) { defer.reject(e[0] || e); }); @@ -392,26 +382,6 @@ class Haro { return defer.promise; } - setIndex (key, data, index) { - if (!index) { - this.index.forEach(i => { - this.setIndexValue(this.indexes.get(i), keyIndex(i, data, this.delimiter), key); - }); - } else { - this.setIndexValue(this.indexes.get(index), keyIndex(index, data, this.delimiter), key); - } - - return this; - } - - setIndexValue (index, key, value) { - if (!index.has(key)) { - index.set(key, new Set()); - } - - index.get(key).add(value); - } - setUri (uri, clear = false) { let defer = deferred(); diff --git a/src/intro.js b/src/intro.js index 5274025..dfad95c 100644 --- a/src/intro.js +++ b/src/intro.js @@ -6,6 +6,7 @@ const Map = global.Map || require("es6-map"); const Set = global.Set || require("es6-set"); const fetch = global.fetch || require("node-fetch"); const tuple = global.tuple || require("tiny-tuple"); +const r = [8, 9, "a", "b"]; const regex = { querystring: /\?.*/, endslash: /\/$/ diff --git a/src/utility.js b/src/utility.js index fe92171..bbf0453 100644 --- a/src/utility.js +++ b/src/utility.js @@ -17,16 +17,6 @@ function deferred () { return {resolve: resolver, reject: rejecter, promise: promise}; } -function iterate (obj, fn) { - if (obj instanceof Object) { - Object.keys(obj).forEach(function (i) { - fn.call(obj, obj[i], i); - }); - } else { - obj.forEach(fn); - } -} - function keyIndex (key, data, delimiter) { let keys = key.split(delimiter).sort(), result; @@ -42,6 +32,27 @@ function keyIndex (key, data, delimiter) { return result; } +function delIndex (index, indexes, delimiter, key, data) { + index.forEach(function (i) { + let idx = indexes.get(i), + value = keyIndex(i, data, delimiter); + + if (idx.has(value)) { + idx.get(value).delete(key); + } + }); +} + +function iterate (obj, fn) { + if (obj instanceof Object) { + Object.keys(obj).forEach(function (i) { + fn.call(obj, obj[i], i); + }); + } else { + obj.forEach(fn); + } +} + function merge (a, b) { let c = clone(a), d = clone(b); @@ -65,34 +76,50 @@ function merge (a, b) { return c; } -function patch (ogdata = {}, data = {}, overwrite = false) { +function patch (ogdata = {}, data = {}, key = "", overwrite = false) { let result = []; if (overwrite) { - iterate(ogdata, (value, key) => { - if (key !== this.key && data[key] === undefined) { - result.push({op: "remove", path: "/" + key}); + iterate(ogdata, function (v, k) { + if (k !== key && data[k] === undefined) { + result.push({op: "remove", path: "/" + k}); } }); } - iterate(data, (value, key) => { - if (key !== this.key && ogdata[key] === undefined) { - result.push({op: "add", path: "/" + key, value: value}); - } else if (JSON.stringify(ogdata[key]) !== JSON.stringify(value)) { - result.push({op: "replace", path: "/" + key, value: value}); + iterate(data, function (v, k) { + if (k !== key && ogdata[k] === undefined) { + result.push({op: "add", path: "/" + k, value: v}); + } else if (JSON.stringify(ogdata[k]) !== JSON.stringify(v)) { + result.push({op: "replace", path: "/" + k, value: v}); } }); return result; } -const r = [8, 9, "a", "b"]; - function s () { return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1); } +function setIndexValue (index, key, value) { + if (!index.has(key)) { + index.set(key, new Set()); + } + + index.get(key).add(value); +} + +function setIndex (index, indexes, delimiter, key, data, indice) { + if (!indice) { + index.forEach(function (i) { + setIndexValue(indexes.get(i), keyIndex(i, data, delimiter), key); + }); + } else { + setIndexValue(indexes.get(indice), keyIndex(indice, data, delimiter), key); + } +} + function uuid () { return (s() + s() + "-" + s() + "-4" + s().substr(0, 3) + "-" + r[Math.floor(Math.random() * 4)] + s().substr(0, 3) + "-" + s() + s() + s()); }