From c29d1ea2ddabc1a78dce7e31aa9bf9f42fc54abb Mon Sep 17 00:00:00 2001 From: Jason Mulligan Date: Tue, 3 Apr 2018 21:15:06 -0400 Subject: [PATCH] Fixing a regression in utility `joinData()` --- lib/haro.js | 8 ++++---- lib/haro.min.js | 4 ++-- lib/haro.min.js.map | 2 +- package-lock.json | 2 +- package.json | 2 +- src/utility.js | 4 ++-- 6 files changed, 11 insertions(+), 11 deletions(-) diff --git a/lib/haro.js b/lib/haro.js index 71a8204..02fb762 100644 --- a/lib/haro.js +++ b/lib/haro.js @@ -4,7 +4,7 @@ * @author Jason Mulligan * @copyright 2018 * @license BSD-3-Clause - * @version 4.3.0 + * @version 4.3.1 */ "use strict"; @@ -160,8 +160,8 @@ } function joinData (id, a, b, key, on, type = "inner") { - const result = [], - errorMsg = "More than one record found on "; + const result = []; + let errorMsg = "More than one record found on "; let error = false; @@ -1085,7 +1085,7 @@ } factory.transform = cast; - factory.version = "4.3.0"; + factory.version = "4.3.1"; // Node, AMD & window supported if (typeof exports !== "undefined") { diff --git a/lib/haro.min.js b/lib/haro.min.js index 13ad3e8..03fe4a5 100644 --- a/lib/haro.min.js +++ b/lib/haro.min.js @@ -1,6 +1,6 @@ /* 2018 Jason Mulligan - @version 4.3.0 + @version 4.3.1 */ -"use strict";(function(a){function b(c,a){return a in c}function d(a,b){for(const c of a.entries())b(c[1],c[0]);return a}function c(a){let b;switch(!0){case a instanceof w:b={},a.forEach((a,d)=>{b[d]=c(a)});break;case a instanceof y:b=Array.from(a);break;case Array.isArray(a):b=new y(a);break;case a instanceof Object:b=new w(Object.keys(a).map((b)=>[b,c(a[b])]));break;default:b=a;}return b}function e(a){return new z([a],{type:"application/javascript"})}function f(a){return JSON.parse(JSON.stringify(a,null,0))}function g(a,b){return a.replace(r.querystring,"").replace(r.endslash,"")+(b?"/"+b:"")}function h(a,b,c,d){let e;return e=-1c.localeCompare(a)).map((a)=>b[a].toString().replace(new RegExp(d,"g"),"").toLowerCase()).join(c):b[a],e}function i(a,b,c,d,e,f){a.forEach((a)=>{const g=b.get(a),i=h(a,e,c,f);if(g.has(i)){const a=g.get(i);a.delete(d),0===a.size&&g.delete(i)}})}function j(a,c,e,f,g){const j={};return d(c,(a)=>{j[a]={}}),d(a,(a)=>{const d=a[e];void 0!==d&&c.forEach((c)=>{const e=h(c,a,f,g);b(j[c],e)||(j[c][e]=[]),j[c][e].push(d)})}),j}function k(a,b){a instanceof Object?d(Object.keys(a),(c)=>b.call(a,a[c],c)):d(a,b)}function l(c,a){return c instanceof Object&&a instanceof Object?d(Object.keys(a),(b)=>{c[b]=c[b]instanceof Object&&a[b]instanceof Object?l(c[b],a[b]):Array.isArray(c[b])&&Array.isArray(a[b])?c[b].concat(a[b]):a[b]}):Array.isArray(c)&&Array.isArray(a)?c=c.concat(a):c=a,c}function m(c,e,a,b,g,h="inner"){function i(a,e,c,f=!1,h=!1){const n=Object.keys(e[0]),o=h?(a,c)=>a[b]===c[g]:(a,c)=>a[g]===c[b];d(a,(a)=>{const b={},h=e.filter((b)=>o(b,a));let i=!0;return 1k(a,(a,e)=>{b[c[d]+"_"+e]=a})):f&&(k(a,(a,d)=>{b[c[0]+"_"+d]=a}),d(n,(a)=>{b[c[1]+"_"+a]=null})),i&&0{d!==c&&void 0===b[d]&&e.push({op:"remove",path:"/"+d})}),k(b,(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 o(){return(0|65536*(Math.random()+1)).toString(16).substring(1)}function p(a,b,c,e,f,g,j){d(g?[g]:a,(a)=>{const d=h(a,f,c,j);let g;void 0!==d&&null!==d&&(g=b.get(a),!g.has(d)&&g.set(d,new y),g.get(d).add(e))})}function q(a,b=!0){const c={};return a.forEach((a,d)=>{const e=a;b&&Object.freeze(e),c[f(d)]=e}),b&&Object.freeze(c),c}function s(){return o()+o()+"-"+o()+"-4"+o().substr(0,3)+"-"+B[Math.floor(4*Math.random())]+o().substr(0,3)+"-"+o()+o()+o()}function t(b=null,c={}){const d=new G(c);return C&&(d.worker=!1===u?a.URL.createObjectURL(e(F)):new Function(F)),Array.isArray(b)&&d.batch(b,"set"),d}const u="undefined"!=typeof process&&"function"==typeof process.nextTick,v=a.Promise,w=a.Map,y=a.Set,x=a.fetch||(u?require("node-fetch"):void 0),z=a.Blob,A=a.Worker||(u?require("tiny-worker"):void 0),B=[8,9,"a","b"],r={querystring:/\?.*/,endslash:/\/$/,json:/^application\/json/},C="undefined"!=typeof A,D="Web Worker not supported",E={},F=[c.toString(),f.toString(),j.toString(),d.toString(),b.toString(),k.toString(),m.toString(),h.toString(),p.toString(),(!1==u?"":"self.")+"onmessage = "+function(a){const b=JSON.parse(a.data),c=b.cmd;let d;"index"===c&&(d=j(b.records,b.index,b.key,b.delimiter,b.pattern)),"join"===c&&(d=m(b.ids,b.records[0],b.records[1],b.key,b.on,b.type)),postMessage(JSON.stringify(d))}.toString()+";"].join("\n");class G{constructor({config:a={},debounce:b=0,delimiter:c="|",id:d=s(),index:e=[],key:f="",logging:g=!0,patch:h=!1,pattern:i="\\s*|\\t*",source:j="",versioning:k=!1}={}){return this.adapters={},this.data=new w,this.debounce=b,this.debounced=new w,this.delimiter=c,this.config={method:"get",credentials:"include",headers:{accept:"application/json","content-type":"application/json"}},this.id=d,this.index=e,this.indexes=new w,this.key=f,this.logging=g,this.patch=h,this.pattern=i,this.source=j,this.size=this.total=0,this.uri="",this.worker=null,this.versions=new w,this.versioning=k,Object.defineProperty(this,"registry",{enumerable:!0,get:()=>Array.from(this.data.keys())}),1this.del(a,!0,c):(a)=>this.set(null,a,!0,!0,c);d=await v.all(a.map(e)),this.onbatch(b,d),this.log(`Batch successful on ${this.id}`)}catch(a){throw this.onerror("batch",a),this.log(`Batch failure on ${this.id}`),a}return d}beforeBatch(){}beforeClear(){}beforeDelete(){}beforeRequest(){}beforeSet(){}beforeSync(){}clear(){return this.beforeClear(),this.size=this.total=0,this.data.clear(),this.indexes.clear(),this.versions.clear(),this.reindex().onclear(),this.log(`Cleared ${this.id}`),this}async cmd(a,...b){if(void 0===this.adapters[a]||void 0===E[a])throw new Error(`${a} not configured for persistent storage`);return await E[a].apply(this,[this,...b])}crawl(a){let b=f(a);return d((this.source||"").split("."),(a)=>{b=b[a]}),b||a}del(a,b=!1,c=!1,d=!1){if(!1===this.has(a))throw new Error("Record not found");const e=this.get(a,!0);return this.exec(async()=>{this.beforeDelete(a,b,c,d),i(this.index,this.indexes,this.delimiter,a,e,this.pattern),this.data.delete(a),--this.total,this.size=this.total},async()=>{this.ondelete(a,b,d,c),this.versioning&&this.versions.delete(a),c||(this.storage("remove",a).then((b)=>{b&&this.log(`Deleted ${a} from persistent storage`)},(b)=>this.log(`Error deleting ${a} from persistent storage: ${b.message||b.stack||b}`,"error")),!b&&!d&&this.uri&&(this.debounced.has(a)&&clearTimeout(this.debounced.get(a)),this.debounced.set(a,setTimeout(async()=>{this.debounced.delete(a);try{await this.transmit(a,null,e,!1,"delete")}catch(b){this.log(b.stack||b.message||b,"error");try{await this.set(a,e,!0,!0),this.log(`Reverted ${a}`)}catch(b){this.log(`Failed to revert ${a}`)}}},this.debounce))))},(a)=>{throw this.onerror("delete",a),a})}dump(a="records"){return"records"===a?this.toArray(null,!1):this.transform(this.indexes)}entries(){return this.data.entries()}async exec(a,b,c){let d;try{const c=await a();d=await b(c)}catch(a){c(a)}return d}find(a,b=!1){const c=Object.keys(a).sort((c,a)=>c.localeCompare(a)).join(this.delimiter),d=h(c,a,this.delimiter,this.pattern),e=[];return this.indexes.has(c)&&(this.indexes.get(c).get(d)||new y).forEach((a)=>e.push(this.get(a,b))),b?e:this.list(...e)}filter(b,c=!1){const a=this.reduce((d,a,e,f)=>(!0===b.call(f,a)&&d.push(this.get(e,c)),d),[]);return c?a:this.list(...a)}forEach(a,b){return this.data.forEach((b,c)=>a(f(b),f(c)),b||this.data),this}get(a,b=!1){const c=f(this.data.get(a)||null);return c&&!b?this.list(a,c):c}has(a,b){return(b||this.data).has(a)}async join(a,b,c="inner",d=[]){let e;if(!(0this.get(a,c));return c?d:this.list(...d)}list(...a){return Object.freeze(a.map((a)=>Object.freeze(a)))}async load(a="mongo",b=void 0){const c=b===void 0,d=c?this.id:b;let e;c&&this.clear();try{const f=await this.cmd(a,"get",b);e=c?this.batch(f,"set",!0):this.set(b,f,!0,!0,!0),this.log(`Loaded ${d} from ${a} persistent storage`)}catch(b){throw this.log(`Error loading ${d} from ${a} persistent storage: ${b.message||b.stack||b}`,"error"),b}return e}log(a="",b="log"){this.logging&&console[b](`haro: ${a}`)}map(a,b=!1){const c=[];return this.forEach((b,d)=>c.push(a(b,d))),b?c:this.list(...c)}async offload(a,b="index",c=this.index){return new v((d,e)=>{if(this.worker){const f=this.useWorker(d,e);let g;"index"===b?g={cmd:b,index:c,records:a,key:this.key,delimiter:this.delimiter,pattern:this.pattern}:"join"===b&&(g={cmd:b,ids:a[0],records:[a[1],a[2]],key:a[3],on:a[4],type:a[5]}),f.postMessage(JSON.stringify(g,null,0))}else e(new Error(D))})}onbatch(){}onclear(){}ondelete(){}onerror(){}onrequest(a){return a}onset(){}onsync(){}async override(a,b="records",c=void 0){if("indexes"===b)this.indexes=this.transform(a,c);else if("records"===b){const b=""===this.key?()=>s():(a)=>a[this.key]||s();this.indexes.clear(),this.data=new w(a.map((a)=>[b(a),a])),this.size=this.total=this.data.size}else throw new Error("Invalid type");return!0}reduce(b,c,d=!1){let e=c||this.data.keys().next().value;return this.forEach((a,c)=>{e=b(e,a,c,this,d)},this),e}register(a,b){return E[a]=b,this}reindex(a){const b=a?[a]:this.index;return a&&!1===this.index.includes(a)&&this.index.push(a),d(b,(a)=>this.indexes.set(a,new w)),this.forEach((a,c)=>d(b,(b)=>p(this.index,this.indexes,this.delimiter,c,a,b,this.pattern))),this}async request(a,b={}){return new v(async(c,g)=>{const e=l(f(this.config),b),h={};e.method=e.method.toUpperCase(),"DELETE"===e.method&&delete e.body,this.beforeRequest(...[a,e]);try{const b=await x(a,e),f=b.ok,i=b.status;if(b.headers._headers)d(Object.keys(b.headers._headers),(a)=>{h[a]=b.headers._headers[a].join(", ")});else for(const a of b.headers.entries())h[a[0]]=a[1];const j=await b[r.json.test(h["content-type"]||"")?"json":"text"](),k=f?c:g;k(this.list(this.onrequest(j,i,h),i,h))}catch(a){g(this.list(a.message,0,{}))}})}async save(a="mongo"){let b;try{b=await this.cmd(a,"set"),this.log(`Saved ${this.id} to ${a} persistent storage`)}catch(b){throw this.log(`Error saving ${this.id} to ${a} persistent storage: ${b.message||b.stack||b}`,"error"),b}return b}search(a,b,c=!1){const e=new w,f=a&&"function"==typeof a.test;return a&&d(b?Array.isArray(b)?b:[b]:this.index,(b)=>{let d=this.indexes.get(b);d&&d.forEach((d,g)=>{switch(!0){case"function"==typeof a&&a(g,b):case f&&a.test(Array.isArray(g)?g.join(", "):g):case g===a:d.forEach((a)=>{!e.has(a)&&this.has(a)&&e.set(a,this.get(a,c))});break;default:}})}),c?Array.from(e.values()):this.list(...Array.from(e.values()))}async set(a,b,c=!1,d=!1,e=!1,g=!1){let h,j,k=f(b);return this.exec(async()=>((void 0===a||null===a)&&(a=this.key&&void 0!==k[this.key]?k[this.key]:s()),this.beforeSet(a,b,c,d,e,g),this.data.has(a)?(j=this.get(a,!0),i(this.index,this.indexes,this.delimiter,a,j,this.pattern),h="put",this.versioning&&this.versions.get(a).add(Object.freeze(f(j))),!1===d&&(k=l(f(j),k))):(++this.total,this.size=this.total,h="post",this.versioning&&this.versions.set(a,new y)),this.data.set(a,k),p(this.index,this.indexes,this.delimiter,a,k,null,this.pattern),this.get(a)),async(b)=>(this.onset(b,c,g,e),e||(this.storage("set",a,k).then((b)=>{b&&this.log(`Saved ${a} to persistent storage`)},(b)=>this.log(`Error saving ${a} to persistent storage: ${b.message||b.stack||b}`,"error")),!c&&!g&&this.uri&&(this.debounced.has(a)&&clearTimeout(this.debounced.get(a)),this.debounced.set(a,setTimeout(async()=>{this.debounced.delete(a);try{if(await this.transmit(a,k,j,d,h),j)try{await this.set(a,j,c,!0,e,!0),this.log(`Reverted ${a}`)}catch(b){this.log(`Failed to revert ${a}`)}else try{await this.del(a,!0),this.log(`Reverted ${a}`)}catch(b){this.log(`Failed to revert ${a}`)}}catch(a){this.log(a.stack||a.message||a,"error")}},this.debounce)))),b),(a)=>{throw this.onerror("set",a),a})}async setUri(a,b=!1){return this.uri=a,""===this.uri?[]:await this.sync(b)}sort(a,b=!0){return b?Object.freeze(this.limit(0,this.total,!0).sort(a).map((a)=>Object.freeze(a))):this.limit(0,this.total,!0).sort(a)}sortBy(a,b=!1){const c=[],e=[];let f;return this.indexes.has(a)||this.reindex(a),f=this.indexes.get(a),f.forEach((a,b)=>e.push(b)),d(e.sort(),(a)=>f.get(a).forEach((a)=>c.push(this.get(a,b)))),b?c:this.list(...c)}async storage(...a){let b;try{const c=Object.keys(this.adapters).map(async(b)=>await this.cmd.apply(this,[b,...a]));0b?a[1]:f(a[1])):(c=this.limit(0,this.total,!0),b&&d(c,(a)=>Object.freeze(a))),b?Object.freeze(c):c}toObject(a,c=!0){const b=a?a.reduce((d,a)=>{const b=f(a[1]);return c&&Object.freeze(b),d[a[0]]=b,d},{}):q(this,c);return c?Object.freeze(b):b}transform(a,b){return"function"==typeof b?b(a):c(a)}async transmit(a,b,c,d=!1,f="post"){const h=g(this.uri,b?a:null);let e,i;if(this.patch){e=void 0===b?[{op:"remove",path:"/",value:a}]:void 0===c?[{op:"add",path:"/",value:b}]:d?[{op:"replace",path:"/",value:b}]:n(c,b,this.key);try{i=await this.request(h,{method:"patch",body:JSON.stringify(e,null,0)})}catch(c){if(405===c[1])this.patch=!1,i=await this.request(b?h:g(this.uri,a),{method:f,body:JSON.stringify(b,null,0)});else throw c}}else i=await this.request(h,{method:f,body:JSON.stringify(b,null,0)});return i}async unload(a="mongo",b=void 0){const c=b===void 0?this.id:b;let d;try{d=await this.cmd(a,"remove",b),this.log(`Unloaded ${c} from ${a} persistent storage`)}catch(b){throw this.log(`Error unloading ${c} from ${a} persistent storage: ${b.message||b.stack||b}`,"error"),b}return d}unregister(a){delete E[a]}values(){return this.data.values()}useWorker(a,b){let c;return this.worker?(c=new A(this.worker),c.onerror=(a)=>{b(a),c.terminate()},c.onmessage=(b)=>{a(JSON.parse(b.data)),c.terminate()}):b(new Error(D)),c}where(a,b=!1){const c=this.index.filter((b)=>b in a);return 0{const c="string"==typeof a[b]?`'${a[b]}'`:a[b];return`Array.isArray(a['${b}']) ? a['${b}'].includes(${c}) : a['${b}'] === ${c}`}).join(") && (")});`),b):[]}}t.transform=c,t.version="4.3.0","undefined"==typeof exports?"function"==typeof define&&void 0!==define.amd?define(()=>t):a.haro=t:module.exports=t})("undefined"==typeof window?global:window); +"use strict";(function(a){function b(c,a){return a in c}function d(a,b){for(const c of a.entries())b(c[1],c[0]);return a}function c(a){let b;switch(!0){case a instanceof w:b={},a.forEach((a,d)=>{b[d]=c(a)});break;case a instanceof y:b=Array.from(a);break;case Array.isArray(a):b=new y(a);break;case a instanceof Object:b=new w(Object.keys(a).map((b)=>[b,c(a[b])]));break;default:b=a;}return b}function e(a){return new z([a],{type:"application/javascript"})}function f(a){return JSON.parse(JSON.stringify(a,null,0))}function g(a,b){return a.replace(r.querystring,"").replace(r.endslash,"")+(b?"/"+b:"")}function h(a,b,c,d){let e;return e=-1c.localeCompare(a)).map((a)=>b[a].toString().replace(new RegExp(d,"g"),"").toLowerCase()).join(c):b[a],e}function i(a,b,c,d,e,f){a.forEach((a)=>{const g=b.get(a),i=h(a,e,c,f);if(g.has(i)){const a=g.get(i);a.delete(d),0===a.size&&g.delete(i)}})}function j(a,c,e,f,g){const j={};return d(c,(a)=>{j[a]={}}),d(a,(a)=>{const d=a[e];void 0!==d&&c.forEach((c)=>{const e=h(c,a,f,g);b(j[c],e)||(j[c][e]=[]),j[c][e].push(d)})}),j}function k(a,b){a instanceof Object?d(Object.keys(a),(c)=>b.call(a,a[c],c)):d(a,b)}function l(c,a){return c instanceof Object&&a instanceof Object?d(Object.keys(a),(b)=>{c[b]=c[b]instanceof Object&&a[b]instanceof Object?l(c[b],a[b]):Array.isArray(c[b])&&Array.isArray(a[b])?c[b].concat(a[b]):a[b]}):Array.isArray(c)&&Array.isArray(a)?c=c.concat(a):c=a,c}function m(c,e,a,b,g,h="inner"){function i(a,e,c,f=!1,h=!1){const n=Object.keys(e[0]),o=h?(a,c)=>a[b]===c[g]:(a,c)=>a[g]===c[b];d(a,(a)=>{const b={},h=e.filter((b)=>o(b,a));let i=!0;return 1k(a,(a,e)=>{b[c[d]+"_"+e]=a})):f&&(k(a,(a,d)=>{b[c[0]+"_"+d]=a}),d(n,(a)=>{b[c[1]+"_"+a]=null})),i&&0{d!==c&&void 0===b[d]&&e.push({op:"remove",path:"/"+d})}),k(b,(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 o(){return(0|65536*(Math.random()+1)).toString(16).substring(1)}function p(a,b,c,e,f,g,j){d(g?[g]:a,(a)=>{const d=h(a,f,c,j);let g;void 0!==d&&null!==d&&(g=b.get(a),!g.has(d)&&g.set(d,new y),g.get(d).add(e))})}function q(a,b=!0){const c={};return a.forEach((a,d)=>{const e=a;b&&Object.freeze(e),c[f(d)]=e}),b&&Object.freeze(c),c}function s(){return o()+o()+"-"+o()+"-4"+o().substr(0,3)+"-"+B[Math.floor(4*Math.random())]+o().substr(0,3)+"-"+o()+o()+o()}function t(b=null,c={}){const d=new G(c);return C&&(d.worker=!1===u?a.URL.createObjectURL(e(F)):new Function(F)),Array.isArray(b)&&d.batch(b,"set"),d}const u="undefined"!=typeof process&&"function"==typeof process.nextTick,v=a.Promise,w=a.Map,y=a.Set,x=a.fetch||(u?require("node-fetch"):void 0),z=a.Blob,A=a.Worker||(u?require("tiny-worker"):void 0),B=[8,9,"a","b"],r={querystring:/\?.*/,endslash:/\/$/,json:/^application\/json/},C="undefined"!=typeof A,D="Web Worker not supported",E={},F=[c.toString(),f.toString(),j.toString(),d.toString(),b.toString(),k.toString(),m.toString(),h.toString(),p.toString(),(!1==u?"":"self.")+"onmessage = "+function(a){const b=JSON.parse(a.data),c=b.cmd;let d;"index"===c&&(d=j(b.records,b.index,b.key,b.delimiter,b.pattern)),"join"===c&&(d=m(b.ids,b.records[0],b.records[1],b.key,b.on,b.type)),postMessage(JSON.stringify(d))}.toString()+";"].join("\n");class G{constructor({config:a={},debounce:b=0,delimiter:c="|",id:d=s(),index:e=[],key:f="",logging:g=!0,patch:h=!1,pattern:i="\\s*|\\t*",source:j="",versioning:k=!1}={}){return this.adapters={},this.data=new w,this.debounce=b,this.debounced=new w,this.delimiter=c,this.config={method:"get",credentials:"include",headers:{accept:"application/json","content-type":"application/json"}},this.id=d,this.index=e,this.indexes=new w,this.key=f,this.logging=g,this.patch=h,this.pattern=i,this.source=j,this.size=this.total=0,this.uri="",this.worker=null,this.versions=new w,this.versioning=k,Object.defineProperty(this,"registry",{enumerable:!0,get:()=>Array.from(this.data.keys())}),1this.del(a,!0,c):(a)=>this.set(null,a,!0,!0,c);d=await v.all(a.map(e)),this.onbatch(b,d),this.log(`Batch successful on ${this.id}`)}catch(a){throw this.onerror("batch",a),this.log(`Batch failure on ${this.id}`),a}return d}beforeBatch(){}beforeClear(){}beforeDelete(){}beforeRequest(){}beforeSet(){}beforeSync(){}clear(){return this.beforeClear(),this.size=this.total=0,this.data.clear(),this.indexes.clear(),this.versions.clear(),this.reindex().onclear(),this.log(`Cleared ${this.id}`),this}async cmd(a,...b){if(void 0===this.adapters[a]||void 0===E[a])throw new Error(`${a} not configured for persistent storage`);return await E[a].apply(this,[this,...b])}crawl(a){let b=f(a);return d((this.source||"").split("."),(a)=>{b=b[a]}),b||a}del(a,b=!1,c=!1,d=!1){if(!1===this.has(a))throw new Error("Record not found");const e=this.get(a,!0);return this.exec(async()=>{this.beforeDelete(a,b,c,d),i(this.index,this.indexes,this.delimiter,a,e,this.pattern),this.data.delete(a),--this.total,this.size=this.total},async()=>{this.ondelete(a,b,d,c),this.versioning&&this.versions.delete(a),c||(this.storage("remove",a).then((b)=>{b&&this.log(`Deleted ${a} from persistent storage`)},(b)=>this.log(`Error deleting ${a} from persistent storage: ${b.message||b.stack||b}`,"error")),!b&&!d&&this.uri&&(this.debounced.has(a)&&clearTimeout(this.debounced.get(a)),this.debounced.set(a,setTimeout(async()=>{this.debounced.delete(a);try{await this.transmit(a,null,e,!1,"delete")}catch(b){this.log(b.stack||b.message||b,"error");try{await this.set(a,e,!0,!0),this.log(`Reverted ${a}`)}catch(b){this.log(`Failed to revert ${a}`)}}},this.debounce))))},(a)=>{throw this.onerror("delete",a),a})}dump(a="records"){return"records"===a?this.toArray(null,!1):this.transform(this.indexes)}entries(){return this.data.entries()}async exec(a,b,c){let d;try{const c=await a();d=await b(c)}catch(a){c(a)}return d}find(a,b=!1){const c=Object.keys(a).sort((c,a)=>c.localeCompare(a)).join(this.delimiter),d=h(c,a,this.delimiter,this.pattern),e=[];return this.indexes.has(c)&&(this.indexes.get(c).get(d)||new y).forEach((a)=>e.push(this.get(a,b))),b?e:this.list(...e)}filter(b,c=!1){const a=this.reduce((d,a,e,f)=>(!0===b.call(f,a)&&d.push(this.get(e,c)),d),[]);return c?a:this.list(...a)}forEach(a,b){return this.data.forEach((b,c)=>a(f(b),f(c)),b||this.data),this}get(a,b=!1){const c=f(this.data.get(a)||null);return c&&!b?this.list(a,c):c}has(a,b){return(b||this.data).has(a)}async join(a,b,c="inner",d=[]){let e;if(!(0this.get(a,c));return c?d:this.list(...d)}list(...a){return Object.freeze(a.map((a)=>Object.freeze(a)))}async load(a="mongo",b=void 0){const c=b===void 0,d=c?this.id:b;let e;c&&this.clear();try{const f=await this.cmd(a,"get",b);e=c?this.batch(f,"set",!0):this.set(b,f,!0,!0,!0),this.log(`Loaded ${d} from ${a} persistent storage`)}catch(b){throw this.log(`Error loading ${d} from ${a} persistent storage: ${b.message||b.stack||b}`,"error"),b}return e}log(a="",b="log"){this.logging&&console[b](`haro: ${a}`)}map(a,b=!1){const c=[];return this.forEach((b,d)=>c.push(a(b,d))),b?c:this.list(...c)}async offload(a,b="index",c=this.index){return new v((d,e)=>{if(this.worker){const f=this.useWorker(d,e);let g;"index"===b?g={cmd:b,index:c,records:a,key:this.key,delimiter:this.delimiter,pattern:this.pattern}:"join"===b&&(g={cmd:b,ids:a[0],records:[a[1],a[2]],key:a[3],on:a[4],type:a[5]}),f.postMessage(JSON.stringify(g,null,0))}else e(new Error(D))})}onbatch(){}onclear(){}ondelete(){}onerror(){}onrequest(a){return a}onset(){}onsync(){}async override(a,b="records",c=void 0){if("indexes"===b)this.indexes=this.transform(a,c);else if("records"===b){const b=""===this.key?()=>s():(a)=>a[this.key]||s();this.indexes.clear(),this.data=new w(a.map((a)=>[b(a),a])),this.size=this.total=this.data.size}else throw new Error("Invalid type");return!0}reduce(b,c,d=!1){let e=c||this.data.keys().next().value;return this.forEach((a,c)=>{e=b(e,a,c,this,d)},this),e}register(a,b){return E[a]=b,this}reindex(a){const b=a?[a]:this.index;return a&&!1===this.index.includes(a)&&this.index.push(a),d(b,(a)=>this.indexes.set(a,new w)),this.forEach((a,c)=>d(b,(b)=>p(this.index,this.indexes,this.delimiter,c,a,b,this.pattern))),this}async request(a,b={}){return new v(async(c,g)=>{const e=l(f(this.config),b),h={};e.method=e.method.toUpperCase(),"DELETE"===e.method&&delete e.body,this.beforeRequest(...[a,e]);try{const b=await x(a,e),f=b.ok,i=b.status;if(b.headers._headers)d(Object.keys(b.headers._headers),(a)=>{h[a]=b.headers._headers[a].join(", ")});else for(const a of b.headers.entries())h[a[0]]=a[1];const j=await b[r.json.test(h["content-type"]||"")?"json":"text"](),k=f?c:g;k(this.list(this.onrequest(j,i,h),i,h))}catch(a){g(this.list(a.message,0,{}))}})}async save(a="mongo"){let b;try{b=await this.cmd(a,"set"),this.log(`Saved ${this.id} to ${a} persistent storage`)}catch(b){throw this.log(`Error saving ${this.id} to ${a} persistent storage: ${b.message||b.stack||b}`,"error"),b}return b}search(a,b,c=!1){const e=new w,f=a&&"function"==typeof a.test;return a&&d(b?Array.isArray(b)?b:[b]:this.index,(b)=>{let d=this.indexes.get(b);d&&d.forEach((d,g)=>{switch(!0){case"function"==typeof a&&a(g,b):case f&&a.test(Array.isArray(g)?g.join(", "):g):case g===a:d.forEach((a)=>{!e.has(a)&&this.has(a)&&e.set(a,this.get(a,c))});break;default:}})}),c?Array.from(e.values()):this.list(...Array.from(e.values()))}async set(a,b,c=!1,d=!1,e=!1,g=!1){let h,j,k=f(b);return this.exec(async()=>((void 0===a||null===a)&&(a=this.key&&void 0!==k[this.key]?k[this.key]:s()),this.beforeSet(a,b,c,d,e,g),this.data.has(a)?(j=this.get(a,!0),i(this.index,this.indexes,this.delimiter,a,j,this.pattern),h="put",this.versioning&&this.versions.get(a).add(Object.freeze(f(j))),!1===d&&(k=l(f(j),k))):(++this.total,this.size=this.total,h="post",this.versioning&&this.versions.set(a,new y)),this.data.set(a,k),p(this.index,this.indexes,this.delimiter,a,k,null,this.pattern),this.get(a)),async(b)=>(this.onset(b,c,g,e),e||(this.storage("set",a,k).then((b)=>{b&&this.log(`Saved ${a} to persistent storage`)},(b)=>this.log(`Error saving ${a} to persistent storage: ${b.message||b.stack||b}`,"error")),!c&&!g&&this.uri&&(this.debounced.has(a)&&clearTimeout(this.debounced.get(a)),this.debounced.set(a,setTimeout(async()=>{this.debounced.delete(a);try{if(await this.transmit(a,k,j,d,h),j)try{await this.set(a,j,c,!0,e,!0),this.log(`Reverted ${a}`)}catch(b){this.log(`Failed to revert ${a}`)}else try{await this.del(a,!0),this.log(`Reverted ${a}`)}catch(b){this.log(`Failed to revert ${a}`)}}catch(a){this.log(a.stack||a.message||a,"error")}},this.debounce)))),b),(a)=>{throw this.onerror("set",a),a})}async setUri(a,b=!1){return this.uri=a,""===this.uri?[]:await this.sync(b)}sort(a,b=!0){return b?Object.freeze(this.limit(0,this.total,!0).sort(a).map((a)=>Object.freeze(a))):this.limit(0,this.total,!0).sort(a)}sortBy(a,b=!1){const c=[],e=[];let f;return this.indexes.has(a)||this.reindex(a),f=this.indexes.get(a),f.forEach((a,b)=>e.push(b)),d(e.sort(),(a)=>f.get(a).forEach((a)=>c.push(this.get(a,b)))),b?c:this.list(...c)}async storage(...a){let b;try{const c=Object.keys(this.adapters).map(async(b)=>await this.cmd.apply(this,[b,...a]));0b?a[1]:f(a[1])):(c=this.limit(0,this.total,!0),b&&d(c,(a)=>Object.freeze(a))),b?Object.freeze(c):c}toObject(a,c=!0){const b=a?a.reduce((d,a)=>{const b=f(a[1]);return c&&Object.freeze(b),d[a[0]]=b,d},{}):q(this,c);return c?Object.freeze(b):b}transform(a,b){return"function"==typeof b?b(a):c(a)}async transmit(a,b,c,d=!1,f="post"){const h=g(this.uri,b?a:null);let e,i;if(this.patch){e=void 0===b?[{op:"remove",path:"/",value:a}]:void 0===c?[{op:"add",path:"/",value:b}]:d?[{op:"replace",path:"/",value:b}]:n(c,b,this.key);try{i=await this.request(h,{method:"patch",body:JSON.stringify(e,null,0)})}catch(c){if(405===c[1])this.patch=!1,i=await this.request(b?h:g(this.uri,a),{method:f,body:JSON.stringify(b,null,0)});else throw c}}else i=await this.request(h,{method:f,body:JSON.stringify(b,null,0)});return i}async unload(a="mongo",b=void 0){const c=b===void 0?this.id:b;let d;try{d=await this.cmd(a,"remove",b),this.log(`Unloaded ${c} from ${a} persistent storage`)}catch(b){throw this.log(`Error unloading ${c} from ${a} persistent storage: ${b.message||b.stack||b}`,"error"),b}return d}unregister(a){delete E[a]}values(){return this.data.values()}useWorker(a,b){let c;return this.worker?(c=new A(this.worker),c.onerror=(a)=>{b(a),c.terminate()},c.onmessage=(b)=>{a(JSON.parse(b.data)),c.terminate()}):b(new Error(D)),c}where(a,b=!1){const c=this.index.filter((b)=>b in a);return 0{const c="string"==typeof a[b]?`'${a[b]}'`:a[b];return`Array.isArray(a['${b}']) ? a['${b}'].includes(${c}) : a['${b}'] === ${c}`}).join(") && (")});`),b):[]}}t.transform=c,t.version="4.3.1","undefined"==typeof exports?"function"==typeof define&&void 0!==define.amd?define(()=>t):a.haro=t:module.exports=t})("undefined"==typeof window?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 c69487c..fab2790 100644 --- a/lib/haro.min.js.map +++ b/lib/haro.min.js.map @@ -1 +1 @@ -{"version":3,"sources":["haro.js"],"names":["entries","forEach","Array","from","isArray","Object","keys","map","type","JSON","parse","stringify","replace","querystring","endslash","indexOf","split","sort","localeCompare","toString","RegExp","toLowerCase","join","get","has","delete","size","push","call","concat","filter","length","reverse","op","path","value","Math","random","substring","set","add","freeze","substr","floor","worker","URL","createObjectURL","Function","batch","process","nextTick","Promise","Map","Set","fetch","require","Blob","Worker","json","data","cmd","records","index","key","delimiter","pattern","ids","on","postMessage","constructor","config","debounce","id","logging","patch","source","versioning","adapters","debounced","method","credentials","headers","accept","indexes","total","uri","versions","defineProperty","enumerable","reindex","beforeBatch","del","all","onbatch","log","onerror","beforeClear","beforeDelete","beforeRequest","beforeSet","beforeSync","clear","onclear","Error","apply","crawl","exec","ondelete","storage","then","message","stack","clearTimeout","setTimeout","transmit","dump","toArray","transform","find","list","reduce","offload","arg","limit","registry","slice","load","console","useWorker","onrequest","onset","onsync","override","next","register","includes","request","toUpperCase","body","ok","status","_headers","test","save","search","values","setUri","sync","sortBy","Allow","allow","toObject","unload","unregister","terminate","onmessage","where","version","exports","define","amd","haro","module","window","global"],"mappings":"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","file":"unknown","sourcesContent":["/**\r\n * Harō is a modern immutable DataStore\r\n *\r\n * @author Jason Mulligan \r\n * @copyright 2018\r\n * @license BSD-3-Clause\r\n * @version 4.3.0\r\n */\r\n\r\n\r\n(function (global) {\r\n\tconst node = typeof process !== \"undefined\" && typeof process.nextTick === \"function\",\r\n\t\tPromise = global.Promise,\r\n\t\tMap = global.Map,\r\n\t\tSet = global.Set,\r\n\t\tfetch = global.fetch || (node ? require(\"node-fetch\") : undefined),\r\n\t\tBlob = global.Blob,\r\n\t\tWorker = global.Worker || (node ? require(\"tiny-worker\") : undefined),\r\n\t\tr = [8, 9, \"a\", \"b\"],\r\n\t\tregex = {\r\n\t\t\tquerystring: /\\?.*/,\r\n\t\t\tendslash: /\\/$/,\r\n\t\t\tjson: /^application\\/json/\r\n\t\t},\r\n\t\twebWorker = typeof Worker !== \"undefined\",\r\n\t\twebWorkerError = \"Web Worker not supported\",\r\n\t\tadapter = {};\r\n\r\n\tfunction has (a, b) {\r\n\t\treturn b in a;\r\n\t}\r\n\r\n\tfunction each (arr, fn) {\r\n\t\tfor (const item of arr.entries()) {\r\n\t\t\tfn(item[1], item[0]);\r\n\t\t}\r\n\r\n\t\treturn arr;\r\n\t}\r\n\r\n\tfunction cast (input) {\r\n\t\tlet result;\r\n\r\n\t\tswitch (true) {\r\n\t\t\tcase input instanceof Map:\r\n\t\t\t\tresult = {};\r\n\t\t\t\tinput.forEach((value, key) => {\r\n\t\t\t\t\tresult[key] = cast(value);\r\n\t\t\t\t});\r\n\t\t\t\tbreak;\r\n\t\t\tcase input instanceof Set:\r\n\t\t\t\tresult = Array.from(input);\r\n\t\t\t\tbreak;\r\n\t\t\tcase Array.isArray(input):\r\n\t\t\t\tresult = new Set(input);\r\n\t\t\t\tbreak;\r\n\t\t\tcase input instanceof Object:\r\n\t\t\t\tresult = new Map(Object.keys(input).map(i => [i, cast(input[i])]));\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\tresult = input;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tfunction blob (arg) {\r\n\t\treturn new Blob([arg], {type: \"application/javascript\"});\r\n\t}\r\n\r\n\tfunction clone (arg) {\r\n\t\treturn JSON.parse(JSON.stringify(arg, null, 0));\r\n\t}\r\n\r\n\tfunction concatURI (left, right) {\r\n\t\treturn left.replace(regex.querystring, \"\").replace(regex.endslash, \"\") + (right ? \"/\" + right : \"\");\r\n\t}\r\n\r\n\tfunction keyIndex (key, data, delimiter, pattern) {\r\n\t\tlet result;\r\n\r\n\t\tif (key.indexOf(delimiter) > -1) {\r\n\t\t\tresult = key.split(delimiter).sort((a, b) => a.localeCompare(b)).map(i => data[i].toString().replace(new RegExp(pattern, \"g\"), \"\").toLowerCase()).join(delimiter);\r\n\t\t} else {\r\n\t\t\tresult = data[key];\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tfunction delIndex (index, indexes, delimiter, key, data, pattern) {\r\n\t\tindex.forEach(i => {\r\n\t\t\tconst idx = indexes.get(i),\r\n\t\t\t\tvalue = keyIndex(i, data, delimiter, pattern);\r\n\r\n\t\t\tif (idx.has(value)) {\r\n\t\t\t\tconst o = idx.get(value);\r\n\r\n\t\t\t\to.delete(key);\r\n\r\n\t\t\t\tif (o.size === 0) {\r\n\t\t\t\t\tidx.delete(value);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tfunction createIndexes (records, indexes, key, delimiter, pattern) {\r\n\t\tconst result = {};\r\n\r\n\t\teach(indexes, i => {\r\n\t\t\tresult[i] = {};\r\n\t\t});\r\n\r\n\t\teach(records, i => {\r\n\t\t\tconst lkey = i[key];\r\n\r\n\t\t\tif (lkey !== void 0) {\r\n\t\t\t\tindexes.forEach(index => {\r\n\t\t\t\t\tconst lindex = keyIndex(index, i, delimiter, pattern);\r\n\r\n\t\t\t\t\tif (!has(result[index], lindex)) {\r\n\t\t\t\t\t\tresult[index][lindex] = [];\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tresult[index][lindex].push(lkey);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tfunction iterate (obj, fn) {\r\n\t\tif (obj instanceof Object) {\r\n\t\t\teach(Object.keys(obj), i => fn.call(obj, obj[i], i));\r\n\t\t} else {\r\n\t\t\teach(obj, fn);\r\n\t\t}\r\n\t}\r\n\r\n\tfunction merge (a, b) {\r\n\t\tif (a instanceof Object && b instanceof Object) {\r\n\t\t\teach(Object.keys(b), i => {\r\n\t\t\t\tif (a[i] instanceof Object && b[i] instanceof Object) {\r\n\t\t\t\t\ta[i] = merge(a[i], b[i]);\r\n\t\t\t\t} else if (Array.isArray(a[i]) && Array.isArray(b[i])) {\r\n\t\t\t\t\ta[i] = a[i].concat(b[i]);\r\n\t\t\t\t} else {\r\n\t\t\t\t\ta[i] = b[i];\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t} else if (Array.isArray(a) && Array.isArray(b)) {\r\n\t\t\ta = a.concat(b);\r\n\t\t} else {\r\n\t\t\ta = b;\r\n\t\t}\r\n\r\n\t\treturn a;\r\n\t}\r\n\r\n\tfunction joinData (id, a, b, key, on, type = \"inner\") {\r\n\t\tconst result = [],\r\n\t\t\terrorMsg = \"More than one record found on \";\r\n\r\n\t\tlet error = false;\r\n\r\n\t\tfunction join (left, right, ids, include = false, reverse = false) {\r\n\t\t\tconst keys = Object.keys(right[0]),\r\n\t\t\t\tfn = !reverse ? (x, i) => x[on] === i[key] : (x, i) => x[key] === i[on];\r\n\r\n\t\t\teach(left, i => {\r\n\t\t\t\tconst comp = {},\r\n\t\t\t\t\tc = right.filter(x => fn(x, i));\r\n\r\n\t\t\t\tlet valid = true;\r\n\r\n\t\t\t\tif (c.length > 1) {\r\n\t\t\t\t\terror = true;\r\n\t\t\t\t\terrorMsg += i[on];\r\n\t\t\t\t\tvalid = false;\r\n\t\t\t\t} else if (c.length === 1) {\r\n\t\t\t\t\teach([i, c[0]], (x, idx) => iterate(x, (v, k) => {\r\n\t\t\t\t\t\tcomp[ids[idx] + \"_\" + k] = v;\r\n\t\t\t\t\t}));\r\n\t\t\t\t} else if (include) {\r\n\t\t\t\t\titerate(i, (v, k) => {\r\n\t\t\t\t\t\tcomp[ids[0] + \"_\" + k] = v;\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\teach(keys, k => {\r\n\t\t\t\t\t\tcomp[ids[1] + \"_\" + k] = null;\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (valid && Object.keys(comp).length > 0) {\r\n\t\t\t\t\tresult.push(comp);\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn valid;\r\n\t\t\t}, true);\r\n\t\t}\r\n\r\n\t\tif (type === \"inner\") {\r\n\t\t\tjoin(a, b, id);\r\n\t\t}\r\n\r\n\t\tif (type === \"left\") {\r\n\t\t\tjoin(a, b, id, true);\r\n\t\t}\r\n\r\n\t\tif (type === \"right\") {\r\n\t\t\tjoin(b, a, clone(id).reverse(), true, true);\r\n\t\t}\r\n\r\n\t\treturn !error ? result : errorMsg;\r\n\t}\r\n\r\n\tfunction onmessage (ev) {\r\n\t\tconst data = JSON.parse(ev.data),\r\n\t\t\tcmd = data.cmd;\r\n\r\n\t\tlet result;\r\n\r\n\t\tif (cmd === \"index\") {\r\n\t\t\tresult = createIndexes(data.records, data.index, data.key, data.delimiter, data.pattern);\r\n\t\t}\r\n\r\n\t\tif (cmd === \"join\") {\r\n\t\t\tresult = joinData(data.ids, data.records[0], data.records[1], data.key, data.on, data.type);\r\n\t\t}\r\n\r\n\t\tpostMessage(JSON.stringify(result));\r\n\t}\r\n\r\n\tfunction createPatch (ogdata = {}, data = {}, key = \"\", overwrite = false) {\r\n\t\tconst result = [];\r\n\r\n\t\tif (overwrite) {\r\n\t\t\titerate(ogdata, (v, k) => {\r\n\t\t\t\tif (k !== key && data[k] === void 0) {\r\n\t\t\t\t\tresult.push({op: \"remove\", path: \"/\" + k});\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\titerate(data, (v, k) => {\r\n\t\t\tif (k !== key && ogdata[k] === void 0) {\r\n\t\t\t\tresult.push({op: \"add\", path: \"/\" + k, value: v});\r\n\t\t\t} else if (JSON.stringify(ogdata[k]) !== JSON.stringify(v)) {\r\n\t\t\t\tresult.push({op: \"replace\", path: \"/\" + k, value: v});\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tfunction s () {\r\n\t\treturn ((Math.random() + 1) * 0x10000 | 0).toString(16).substring(1);\r\n\t}\r\n\r\n\tfunction setIndex (index, indexes, delimiter, key, data, indice, pattern) {\r\n\t\teach(!indice ? index : [indice], i => {\r\n\t\t\tconst lidx = keyIndex(i, data, delimiter, pattern);\r\n\t\t\tlet lindex;\r\n\r\n\t\t\tif (lidx !== void 0 && lidx !== null) {\r\n\t\t\t\tlindex = indexes.get(i);\r\n\r\n\t\t\t\tif (!lindex.has(lidx)) {\r\n\t\t\t\t\tlindex.set(lidx, new Set());\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlindex.get(lidx).add(key);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tfunction toObjekt (arg, frozen = true) {\r\n\t\tconst result = {};\r\n\r\n\t\targ.forEach((value, key) => {\r\n\t\t\tconst obj = value;\r\n\r\n\t\t\tif (frozen) {\r\n\t\t\t\tObject.freeze(obj);\r\n\t\t\t}\r\n\r\n\t\t\tresult[clone(key)] = obj;\r\n\t\t});\r\n\r\n\t\tif (frozen) {\r\n\t\t\tObject.freeze(result);\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tfunction uuid () {\r\n\t\treturn s() + s() + \"-\" + s() + \"-4\" + s().substr(0, 3) + \"-\" + r[Math.floor(Math.random() * 4)] + s().substr(0, 3) + \"-\" + s() + s() + s();\r\n\t}\r\n\r\n\tconst functions = [\r\n\t\tcast.toString(),\r\n\t\tclone.toString(),\r\n\t\tcreateIndexes.toString(),\r\n\t\teach.toString(),\r\n\t\thas.toString(),\r\n\t\titerate.toString(),\r\n\t\tjoinData.toString(),\r\n\t\tkeyIndex.toString(),\r\n\t\tsetIndex.toString(),\r\n\t\t(node === false ? \"\" : \"self.\") + \"onmessage = \" + onmessage.toString() + \";\"\r\n\t].join(\"\\n\");\r\n\r\n\tclass Haro {\r\n\t\tconstructor ({config = {}, debounce = 0, delimiter = \"|\", id = uuid(), index = [], key = \"\", logging = true, patch = false, pattern = \"\\\\s*|\\\\t*\", source = \"\", versioning = false} = {}) {\r\n\t\t\tthis.adapters = {};\r\n\t\t\tthis.data = new Map();\r\n\t\t\tthis.debounce = debounce;\r\n\t\t\tthis.debounced = new Map();\r\n\t\t\tthis.delimiter = delimiter;\r\n\t\t\tthis.config = {\r\n\t\t\t\tmethod: \"get\",\r\n\t\t\t\tcredentials: \"include\",\r\n\t\t\t\theaders: {\r\n\t\t\t\t\taccept: \"application/json\",\r\n\t\t\t\t\t\"content-type\": \"application/json\"\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\tthis.id = id;\r\n\t\t\tthis.index = index;\r\n\t\t\tthis.indexes = new Map();\r\n\t\t\tthis.key = key;\r\n\t\t\tthis.logging = logging;\r\n\t\t\tthis.patch = patch;\r\n\t\t\tthis.pattern = pattern;\r\n\t\t\tthis.source = source;\r\n\t\t\tthis.size = this.total = 0;\r\n\t\t\tthis.uri = \"\";\r\n\t\t\tthis.worker = null;\r\n\t\t\tthis.versions = new Map();\r\n\t\t\tthis.versioning = versioning;\r\n\r\n\t\t\tObject.defineProperty(this, \"registry\", {\r\n\t\t\t\tenumerable: true,\r\n\t\t\t\tget: () => Array.from(this.data.keys())\r\n\t\t\t});\r\n\r\n\t\t\tif (Object.keys(config).length > 1) {\r\n\t\t\t\tthis.config = merge(this.config, config);\r\n\t\t\t}\r\n\r\n\t\t\treturn this.reindex();\r\n\t\t}\r\n\r\n\t\tasync batch (args, type = \"set\", lazyLoad = false) {\r\n\t\t\tlet result;\r\n\r\n\t\t\tthis.beforeBatch(args, type);\r\n\r\n\t\t\ttry {\r\n\t\t\t\tconst fn = type === \"del\" ? i => this.del(i, true, lazyLoad) : i => this.set(null, i, true, true, lazyLoad);\r\n\r\n\t\t\t\tresult = await Promise.all(args.map(fn));\r\n\t\t\t\tthis.onbatch(type, result);\r\n\t\t\t\tthis.log(`Batch successful on ${this.id}`);\r\n\t\t\t} catch (e) {\r\n\t\t\t\tthis.onerror(\"batch\", e);\r\n\t\t\t\tthis.log(`Batch failure on ${this.id}`);\r\n\t\t\t\tthrow e;\r\n\t\t\t}\r\n\r\n\t\t\treturn result;\r\n\t\t}\r\n\r\n\t\tbeforeBatch () {}\r\n\r\n\t\tbeforeClear () {}\r\n\r\n\t\tbeforeDelete () {}\r\n\r\n\t\tbeforeRequest () {}\r\n\r\n\t\tbeforeSet () {}\r\n\r\n\t\tbeforeSync () {}\r\n\r\n\t\tclear () {\r\n\t\t\tthis.beforeClear();\r\n\t\t\tthis.size = this.total = 0;\r\n\t\t\tthis.data.clear();\r\n\t\t\tthis.indexes.clear();\r\n\t\t\tthis.versions.clear();\r\n\t\t\tthis.reindex().onclear();\r\n\t\t\tthis.log(`Cleared ${this.id}`);\r\n\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tasync cmd (type, ...args) {\r\n\t\t\tif (this.adapters[type] === void 0 || adapter[type] === void 0) {\r\n\t\t\t\tthrow new Error(`${type} not configured for persistent storage`);\r\n\t\t\t}\r\n\r\n\t\t\treturn await adapter[type].apply(this, [this, ...args]);\r\n\t\t}\r\n\r\n\t\tcrawl (arg) {\r\n\t\t\tlet result = clone(arg);\r\n\r\n\t\t\teach((this.source || \"\").split(\".\"), i => {\r\n\t\t\t\tresult = result[i];\r\n\t\t\t});\r\n\r\n\t\t\treturn result || arg;\r\n\t\t}\r\n\r\n\t\tdel (key, batch = false, lazyLoad = false, retry = false) {\r\n\t\t\tif (this.has(key) === false) {\r\n\t\t\t\tthrow new Error(\"Record not found\");\r\n\t\t\t}\r\n\r\n\t\t\tconst og = this.get(key, true);\r\n\r\n\t\t\treturn this.exec(async () => {\r\n\t\t\t\tthis.beforeDelete(key, batch, lazyLoad, retry);\r\n\t\t\t\tdelIndex(this.index, this.indexes, this.delimiter, key, og, this.pattern);\r\n\t\t\t\tthis.data.delete(key);\r\n\t\t\t\t--this.total;\r\n\t\t\t\tthis.size = this.total;\r\n\t\t\t}, async () => {\r\n\t\t\t\tthis.ondelete(key, batch, retry, lazyLoad);\r\n\r\n\t\t\t\tif (this.versioning) {\r\n\t\t\t\t\tthis.versions.delete(key);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!lazyLoad) {\r\n\t\t\t\t\tthis.storage(\"remove\", key).then(success => {\r\n\t\t\t\t\t\tif (success) {\r\n\t\t\t\t\t\t\tthis.log(`Deleted ${key} from persistent storage`);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}, e => this.log(`Error deleting ${key} from persistent storage: ${e.message || e.stack || e}`, \"error\"));\r\n\r\n\t\t\t\t\tif (!batch && !retry && this.uri) {\r\n\t\t\t\t\t\tif (this.debounced.has(key)) {\r\n\t\t\t\t\t\t\tclearTimeout(this.debounced.get(key));\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tthis.debounced.set(key, setTimeout(async () => {\r\n\t\t\t\t\t\t\tthis.debounced.delete(key);\r\n\r\n\t\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t\tawait this.transmit(key, null, og, false, \"delete\");\r\n\t\t\t\t\t\t\t} catch (err) {\r\n\t\t\t\t\t\t\t\tthis.log(err.stack || err.message || err, \"error\");\r\n\r\n\t\t\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t\t\tawait this.set(key, og, true, true);\r\n\t\t\t\t\t\t\t\t\tthis.log(`Reverted ${key}`);\r\n\t\t\t\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\t\t\t\tthis.log(`Failed to revert ${key}`);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}, this.debounce));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}, err => {\r\n\t\t\t\tthis.onerror(\"delete\", err);\r\n\t\t\t\tthrow err;\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tdump (type = \"records\") {\r\n\t\t\treturn type === \"records\" ? this.toArray(null, false) : this.transform(this.indexes);\r\n\t\t}\r\n\r\n\t\tentries () {\r\n\t\t\treturn this.data.entries();\r\n\t\t}\r\n\r\n\t\tasync exec (first, second, handler) {\r\n\t\t\tlet result;\r\n\r\n\t\t\ttry {\r\n\t\t\t\tconst arg = await first();\r\n\t\t\t\tresult = await second(arg);\r\n\t\t\t} catch (err) {\r\n\t\t\t\thandler(err);\r\n\t\t\t}\r\n\r\n\t\t\treturn result;\r\n\t\t}\r\n\r\n\t\tfind (where, raw = false) {\r\n\t\t\tconst key = Object.keys(where).sort((a, b) => a.localeCompare(b)).join(this.delimiter),\r\n\t\t\t\tvalue = keyIndex(key, where, this.delimiter, this.pattern),\r\n\t\t\t\tresult = [];\r\n\r\n\t\t\tif (this.indexes.has(key)) {\r\n\t\t\t\t(this.indexes.get(key).get(value) || new Set()).forEach(i => result.push(this.get(i, raw)));\r\n\t\t\t}\r\n\r\n\t\t\treturn raw ? result : this.list(...result);\r\n\t\t}\r\n\r\n\t\tfilter (fn, raw = false) {\r\n\t\t\tconst result = this.reduce((a, v, k, ctx) => {\r\n\t\t\t\tif (fn.call(ctx, v) === true) {\r\n\t\t\t\t\ta.push(this.get(k, raw));\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn a;\r\n\t\t\t}, []);\r\n\r\n\t\t\treturn raw ? result : this.list(...result);\r\n\t\t}\r\n\r\n\t\tforEach (fn, ctx) {\r\n\t\t\tthis.data.forEach((value, key) => fn(clone(value), clone(key)), ctx || this.data);\r\n\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tget (key, raw = false) {\r\n\t\t\tconst result = clone(this.data.get(key) || null);\r\n\r\n\t\t\treturn result && !raw ? this.list(key, result) : result;\r\n\t\t}\r\n\r\n\t\thas (key, map) {\r\n\t\t\treturn (map || this.data).has(key);\r\n\t\t}\r\n\r\n\t\tasync join (other, on, type = \"inner\", where = []) {\r\n\t\t\tlet result;\r\n\r\n\t\t\tif (other.total > 0) {\r\n\t\t\t\tif (where.length > 0) {\r\n\t\t\t\t\tresult = await this.offload([[this.id, other.id], this.find(where[0], true), !where[1] ? other.toArray(null, true) : other.find(where[1], true), this.key, on || this.key, type], \"join\");\r\n\t\t\t\t} else {\r\n\t\t\t\t\tresult = await this.offload([[this.id, other.id], this.toArray(null, true), other.toArray(null, true), this.key, on || this.key, type], \"join\");\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (typeof arg === \"string\") {\r\n\t\t\t\t\tthrow new Error(result);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tresult = [];\r\n\t\t\t}\r\n\r\n\t\t\treturn result;\r\n\t\t}\r\n\r\n\t\tkeys () {\r\n\t\t\treturn this.data.keys();\r\n\t\t}\r\n\r\n\t\tlimit (offset = 0, max = 0, raw = false) {\r\n\t\t\tconst result = this.registry.slice(offset, offset + max).map(i => this.get(i, raw));\r\n\r\n\t\t\treturn raw ? result : this.list(...result);\r\n\t\t}\r\n\r\n\t\tlist (...args) {\r\n\t\t\treturn Object.freeze(args.map(i => Object.freeze(i)));\r\n\t\t}\r\n\r\n\t\tasync load (type = \"mongo\", key = undefined) {\r\n\t\t\tconst batch = key === undefined,\r\n\t\t\t\tid = !batch ? key : this.id;\r\n\t\t\tlet result;\r\n\r\n\t\t\tif (batch) {\r\n\t\t\t\tthis.clear();\r\n\t\t\t}\r\n\r\n\t\t\ttry {\r\n\t\t\t\tconst data = await this.cmd(type, \"get\", key);\r\n\r\n\t\t\t\tresult = batch ? this.batch(data, \"set\", true) : this.set(key, data, true, true, true);\r\n\t\t\t\tthis.log(`Loaded ${id} from ${type} persistent storage`);\r\n\t\t\t} catch (e) {\r\n\t\t\t\tthis.log(`Error loading ${id} from ${type} persistent storage: ${e.message || e.stack || e}`, \"error\");\r\n\t\t\t\tthrow e;\r\n\t\t\t}\r\n\r\n\t\t\treturn result;\r\n\t\t}\r\n\r\n\t\tlog (arg = \"\", type = \"log\") {\r\n\t\t\tif (this.logging) {\r\n\t\t\t\tconsole[type](`haro: ${arg}`);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tmap (fn, raw = false) {\r\n\t\t\tconst result = [];\r\n\r\n\t\t\tthis.forEach((value, key) => result.push(fn(value, key)));\r\n\r\n\t\t\treturn raw ? result : this.list(...result);\r\n\t\t}\r\n\r\n\t\tasync offload (data, cmd = \"index\", index = this.index) {\r\n\t\t\treturn new Promise((resolve, reject) => {\r\n\t\t\t\tif (this.worker) {\r\n\t\t\t\t\tconst obj = this.useWorker(resolve, reject);\r\n\t\t\t\t\tlet payload;\r\n\r\n\t\t\t\t\tif (cmd === \"index\") {\r\n\t\t\t\t\t\tpayload = {\r\n\t\t\t\t\t\t\tcmd: cmd,\r\n\t\t\t\t\t\t\tindex: index,\r\n\t\t\t\t\t\t\trecords: data,\r\n\t\t\t\t\t\t\tkey: this.key,\r\n\t\t\t\t\t\t\tdelimiter: this.delimiter,\r\n\t\t\t\t\t\t\tpattern: this.pattern\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t} else if (cmd === \"join\") {\r\n\t\t\t\t\t\tpayload = {\r\n\t\t\t\t\t\t\tcmd: cmd,\r\n\t\t\t\t\t\t\tids: data[0],\r\n\t\t\t\t\t\t\trecords: [data[1], data[2]],\r\n\t\t\t\t\t\t\tkey: data[3],\r\n\t\t\t\t\t\t\ton: data[4],\r\n\t\t\t\t\t\t\ttype: data[5]\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tobj.postMessage(JSON.stringify(payload, null, 0));\r\n\t\t\t\t} else {\r\n\t\t\t\t\treject(new Error(webWorkerError));\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tonbatch () {}\r\n\r\n\t\tonclear () {}\r\n\r\n\t\tondelete () {}\r\n\r\n\t\tonerror () {}\r\n\r\n\t\tonrequest (arg) {\r\n\t\t\treturn arg;\r\n\t\t}\r\n\r\n\t\tonset () {}\r\n\r\n\t\tonsync () {}\r\n\r\n\t\tasync override (data, type = \"records\", fn = undefined) {\r\n\t\t\tconst result = true;\r\n\r\n\t\t\tif (type === \"indexes\") {\r\n\t\t\t\tthis.indexes = this.transform(data, fn);\r\n\t\t\t} else if (type === \"records\") {\r\n\t\t\t\tconst key = this.key !== \"\" ? arg => arg[this.key] || uuid() : () => uuid();\r\n\t\t\t\tthis.indexes.clear();\r\n\t\t\t\tthis.data = new Map(data.map(datum => [key(datum), datum]));\r\n\t\t\t\tthis.size = this.total = this.data.size;\r\n\t\t\t} else {\r\n\t\t\t\tthrow new Error(\"Invalid type\");\r\n\t\t\t}\r\n\r\n\t\t\treturn result;\r\n\t\t}\r\n\r\n\t\treduce (fn, accumulator, raw = false) {\r\n\t\t\tlet a = accumulator || this.data.keys().next().value;\r\n\r\n\t\t\tthis.forEach((v, k) => {\r\n\t\t\t\ta = fn(a, v, k, this, raw);\r\n\t\t\t}, this);\r\n\r\n\t\t\treturn a;\r\n\t\t}\r\n\r\n\t\tregister (key, fn) {\r\n\t\t\tadapter[key] = fn;\r\n\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\treindex (index) {\r\n\t\t\tconst indices = index ? [index] : this.index;\r\n\r\n\t\t\tif (index && this.index.includes(index) === false) {\r\n\t\t\t\tthis.index.push(index);\r\n\t\t\t}\r\n\r\n\t\t\teach(indices, i => this.indexes.set(i, new Map()));\r\n\t\t\tthis.forEach((data, key) => each(indices, i => setIndex(this.index, this.indexes, this.delimiter, key, data, i, this.pattern)));\r\n\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tasync request (input, config = {}) {\r\n\t\t\treturn new Promise(async (resolve, reject) => {\r\n\t\t\t\tconst cfg = merge(clone(this.config), config),\r\n\t\t\t\t\tref = [input, cfg],\r\n\t\t\t\t\theaders = {};\r\n\r\n\t\t\t\tcfg.method = cfg.method.toUpperCase();\r\n\r\n\t\t\t\tif (cfg.method === \"DELETE\") {\r\n\t\t\t\t\tdelete cfg.body;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.beforeRequest(...ref);\r\n\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconst res = await fetch(input, cfg),\r\n\t\t\t\t\t\tok = res.ok,\r\n\t\t\t\t\t\tstatus = res.status;\r\n\r\n\t\t\t\t\tif (res.headers._headers) {\r\n\t\t\t\t\t\teach(Object.keys(res.headers._headers), i => {\r\n\t\t\t\t\t\t\theaders[i] = res.headers._headers[i].join(\", \");\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tfor (const pair of res.headers.entries()) {\r\n\t\t\t\t\t\t\theaders[pair[0]] = pair[1];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst arg = await res[regex.json.test(headers[\"content-type\"] || \"\") ? \"json\" : \"text\"](),\r\n\t\t\t\t\t\tnext = ok ? resolve : reject;\r\n\r\n\t\t\t\t\tnext(this.list(this.onrequest(arg, status, headers), status, headers));\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\treject(this.list(e.message, 0, {}));\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tasync save (type = \"mongo\") {\r\n\t\t\tlet result;\r\n\r\n\t\t\ttry {\r\n\t\t\t\tresult = await this.cmd(type, \"set\");\r\n\t\t\t\tthis.log(`Saved ${this.id} to ${type} persistent storage`);\r\n\t\t\t} catch (e) {\r\n\t\t\t\tthis.log(`Error saving ${this.id} to ${type} persistent storage: ${e.message || e.stack || e}`, \"error\");\r\n\t\t\t\tthrow e;\r\n\t\t\t}\r\n\r\n\t\t\treturn result;\r\n\t\t}\r\n\r\n\t\tsearch (value, index, raw = false) {\r\n\t\t\tconst result = new Map(),\r\n\t\t\t\tfn = typeof value === \"function\",\r\n\t\t\t\trgex = value && typeof value.test === \"function\";\r\n\r\n\t\t\tif (value) {\r\n\t\t\t\teach(index ? Array.isArray(index) ? index : [index] : this.index, i => {\r\n\t\t\t\t\tlet idx = this.indexes.get(i);\r\n\r\n\t\t\t\t\tif (idx) {\r\n\t\t\t\t\t\tidx.forEach((lset, lkey) => {\r\n\t\t\t\t\t\t\tswitch (true) {\r\n\t\t\t\t\t\t\t\tcase fn && value(lkey, i):\r\n\t\t\t\t\t\t\t\tcase rgex && value.test(Array.isArray(lkey) ? lkey.join(\", \") : lkey):\r\n\t\t\t\t\t\t\t\tcase lkey === value:\r\n\t\t\t\t\t\t\t\t\tlset.forEach(key => {\r\n\t\t\t\t\t\t\t\t\t\tif (!result.has(key) && this.has(key)) {\r\n\t\t\t\t\t\t\t\t\t\t\tresult.set(key, this.get(key, raw));\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t\t\t\tvoid 0;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\treturn raw ? Array.from(result.values()) : this.list(...Array.from(result.values()));\r\n\t\t}\r\n\r\n\t\tasync set (key, data, batch = false, override = false, lazyLoad = false, retry = false) {\r\n\t\t\tlet x = clone(data),\r\n\t\t\t\tmethod, og;\r\n\r\n\t\t\treturn this.exec(async () => {\r\n\t\t\t\tif (key === undefined || key === null) {\r\n\t\t\t\t\tkey = this.key && x[this.key] !== undefined ? x[this.key] : uuid();\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.beforeSet(key, data, batch, override, lazyLoad, retry);\r\n\r\n\t\t\t\tif (!this.data.has(key)) {\r\n\t\t\t\t\t++this.total;\r\n\t\t\t\t\tthis.size = this.total;\r\n\t\t\t\t\tmethod = \"post\";\r\n\r\n\t\t\t\t\tif (this.versioning) {\r\n\t\t\t\t\t\tthis.versions.set(key, new Set());\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tog = this.get(key, true);\r\n\t\t\t\t\tdelIndex(this.index, this.indexes, this.delimiter, key, og, this.pattern);\r\n\t\t\t\t\tmethod = \"put\";\r\n\r\n\t\t\t\t\tif (this.versioning) {\r\n\t\t\t\t\t\tthis.versions.get(key).add(Object.freeze(clone(og)));\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (override === false) {\r\n\t\t\t\t\t\tx = merge(clone(og), x);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.data.set(key, x);\r\n\t\t\t\tsetIndex(this.index, this.indexes, this.delimiter, key, x, null, this.pattern);\r\n\r\n\t\t\t\treturn this.get(key);\r\n\t\t\t}, async arg => {\r\n\t\t\t\tthis.onset(arg, batch, retry, lazyLoad);\r\n\r\n\t\t\t\tif (!lazyLoad) {\r\n\t\t\t\t\tthis.storage(\"set\", key, x).then(success => {\r\n\t\t\t\t\t\tif (success) {\r\n\t\t\t\t\t\t\tthis.log(`Saved ${key} to persistent storage`);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}, e => this.log(`Error saving ${key} to persistent storage: ${e.message || e.stack || e}`, \"error\"));\r\n\r\n\t\t\t\t\tif (!batch && !retry && this.uri) {\r\n\t\t\t\t\t\tif (this.debounced.has(key)) {\r\n\t\t\t\t\t\t\tclearTimeout(this.debounced.get(key));\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tthis.debounced.set(key, setTimeout(async () => {\r\n\t\t\t\t\t\t\tthis.debounced.delete(key);\r\n\r\n\t\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t\tawait this.transmit(key, x, og, override, method);\r\n\r\n\t\t\t\t\t\t\t\tif (og) {\r\n\t\t\t\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t\t\t\tawait this.set(key, og, batch, true, lazyLoad, true);\r\n\t\t\t\t\t\t\t\t\t\tthis.log(`Reverted ${key}`);\r\n\t\t\t\t\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\t\t\t\t\tthis.log(`Failed to revert ${key}`);\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t\t\t\tawait this.del(key, true);\r\n\t\t\t\t\t\t\t\t\t\tthis.log(`Reverted ${key}`);\r\n\t\t\t\t\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\t\t\t\t\tthis.log(`Failed to revert ${key}`);\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\t\t\tthis.log(e.stack || e.message || e, \"error\");\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}, this.debounce));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn arg;\r\n\t\t\t}, err => {\r\n\t\t\t\tthis.onerror(\"set\", err);\r\n\t\t\t\tthrow err;\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tasync setUri (uri, clear = false) {\r\n\t\t\tthis.uri = uri;\r\n\r\n\t\t\treturn this.uri !== \"\" ? await this.sync(clear) : [];\r\n\t\t}\r\n\r\n\t\tsort (fn, frozen = true) {\r\n\t\t\treturn frozen ? Object.freeze(this.limit(0, this.total, true).sort(fn).map(i => Object.freeze(i))) : this.limit(0, this.total, true).sort(fn);\r\n\t\t}\r\n\r\n\t\tsortBy (index, raw = false) {\r\n\t\t\tconst result = [],\r\n\t\t\t\tkeys = [];\r\n\r\n\t\t\tlet lindex;\r\n\r\n\t\t\tif (!this.indexes.has(index)) {\r\n\t\t\t\tthis.reindex(index);\r\n\t\t\t}\r\n\r\n\t\t\tlindex = this.indexes.get(index);\r\n\t\t\tlindex.forEach((idx, key) => keys.push(key));\r\n\t\t\teach(keys.sort(), i => lindex.get(i).forEach(key => result.push(this.get(key, raw))));\r\n\r\n\t\t\treturn raw ? result : this.list(...result);\r\n\t\t}\r\n\r\n\t\tasync storage (...args) {\r\n\t\t\tlet result;\r\n\r\n\t\t\ttry {\r\n\t\t\t\tconst deferreds = Object.keys(this.adapters).map(async i => await this.cmd.apply(this, [i, ...args]));\r\n\r\n\t\t\t\tif (deferreds.length > 0) {\r\n\t\t\t\t\tawait Promise.all(deferreds);\r\n\t\t\t\t\tresult = true;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tresult = false;\r\n\t\t\t\t}\r\n\t\t\t} catch (e) {\r\n\t\t\t\tthis.log(e.stack || e.message || e, \"error\");\r\n\t\t\t\tthrow e;\r\n\t\t\t}\r\n\r\n\t\t\treturn result;\r\n\t\t}\r\n\r\n\t\tasync sync (clear = false) {\r\n\t\t\tlet result;\r\n\r\n\t\t\tthis.beforeSync(this.uri, clear);\r\n\r\n\t\t\ttry {\r\n\t\t\t\tconst arg = await this.request(this.uri),\r\n\t\t\t\t\tdata = this.source ? this.crawl(arg[0]) : arg[0];\r\n\r\n\t\t\t\tthis.patch = (arg[2].Allow || arg[2].allow || \"\").includes(\"PATCH\");\r\n\r\n\t\t\t\tif (clear) {\r\n\t\t\t\t\tthis.clear();\r\n\t\t\t\t}\r\n\r\n\t\t\t\tresult = await this.batch(data, \"set\");\r\n\t\t\t\tthis.onsync(result);\r\n\t\t\t} catch (e) {\r\n\t\t\t\tthis.onerror(\"sync\", e[0] || e);\r\n\t\t\t\tthrow e[0] || e;\r\n\t\t\t}\r\n\r\n\t\t\treturn result;\r\n\t\t}\r\n\r\n\t\ttoArray (data, frozen = true) {\r\n\t\t\tlet result;\r\n\r\n\t\t\tif (data) {\r\n\t\t\t\tresult = data.map(i => frozen ? i[1] : clone(i[1]));\r\n\t\t\t} else {\r\n\t\t\t\tresult = this.limit(0, this.total, true);\r\n\r\n\t\t\t\tif (frozen) {\r\n\t\t\t\t\teach(result, i => Object.freeze(i));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn frozen ? Object.freeze(result) : result;\r\n\t\t}\r\n\r\n\t\ttoObject (data, frozen = true) {\r\n\t\t\tconst result = !data ? toObjekt(this, frozen) : data.reduce((a, b) => {\r\n\t\t\t\tconst obj = clone(b[1]);\r\n\r\n\t\t\t\tif (frozen) {\r\n\t\t\t\t\tObject.freeze(obj);\r\n\t\t\t\t}\r\n\r\n\t\t\t\ta[b[0]] = obj;\r\n\r\n\t\t\t\treturn a;\r\n\t\t\t}, {});\r\n\r\n\t\t\treturn frozen ? Object.freeze(result) : result;\r\n\t\t}\r\n\r\n\t\ttransform (input, fn) {\r\n\t\t\treturn typeof fn === \"function\" ? fn(input) : cast(input);\r\n\t\t}\r\n\r\n\t\tasync transmit (key, data, og, override = false, method = \"post\") {\r\n\t\t\tconst uri = concatURI(this.uri, data ? key : null);\r\n\r\n\t\t\tlet body, result;\r\n\r\n\t\t\tif (this.patch) {\r\n\t\t\t\tif (data === void 0) {\r\n\t\t\t\t\tbody = [{op: \"remove\", path: \"/\", value: key}];\r\n\t\t\t\t} else if (og === void 0) {\r\n\t\t\t\t\tbody = [{op: \"add\", path: \"/\", value: data}];\r\n\t\t\t\t} else if (override) {\r\n\t\t\t\t\tbody = [{op: \"replace\", path: \"/\", value: data}];\r\n\t\t\t\t} else {\r\n\t\t\t\t\tbody = createPatch(og, data, this.key);\r\n\t\t\t\t}\r\n\r\n\t\t\t\ttry {\r\n\t\t\t\t\tresult = await this.request(uri, {method: \"patch\", body: JSON.stringify(body, null, 0)});\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\tif (e[1] === 405) {\r\n\t\t\t\t\t\tthis.patch = false;\r\n\t\t\t\t\t\tresult = await this.request(!data ? concatURI(this.uri, key) : uri, {\r\n\t\t\t\t\t\t\tmethod: method,\r\n\t\t\t\t\t\t\tbody: JSON.stringify(data, null, 0)\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tthrow e;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tresult = await this.request(uri, {method: method, body: JSON.stringify(data, null, 0)});\r\n\t\t\t}\r\n\r\n\t\t\treturn result;\r\n\t\t}\r\n\r\n\t\tasync unload (type = \"mongo\", key = undefined) {\r\n\t\t\tconst id = key !== undefined ? key : this.id;\r\n\t\t\tlet result;\r\n\r\n\t\t\ttry {\r\n\t\t\t\tresult = await this.cmd(type, \"remove\", key);\r\n\t\t\t\tthis.log(`Unloaded ${id} from ${type} persistent storage`);\r\n\t\t\t} catch (e) {\r\n\t\t\t\tthis.log(`Error unloading ${id} from ${type} persistent storage: ${e.message || e.stack || e}`, \"error\");\r\n\t\t\t\tthrow e;\r\n\t\t\t}\r\n\r\n\t\t\treturn result;\r\n\t\t}\r\n\r\n\t\tunregister (key) {\r\n\t\t\tdelete adapter[key];\r\n\t\t}\r\n\r\n\t\tvalues () {\r\n\t\t\treturn this.data.values();\r\n\t\t}\r\n\r\n\t\tuseWorker (resolve, reject) {\r\n\t\t\tlet obj;\r\n\r\n\t\t\tif (this.worker) {\r\n\t\t\t\tobj = new Worker(this.worker);\r\n\r\n\t\t\t\tobj.onerror = err => {\r\n\t\t\t\t\treject(err);\r\n\t\t\t\t\tobj.terminate();\r\n\t\t\t\t};\r\n\r\n\t\t\t\tobj.onmessage = ev => {\r\n\t\t\t\t\tresolve(JSON.parse(ev.data));\r\n\t\t\t\t\tobj.terminate();\r\n\t\t\t\t};\r\n\t\t\t} else {\r\n\t\t\t\treject(new Error(webWorkerError));\r\n\t\t\t}\r\n\r\n\t\t\treturn obj;\r\n\t\t}\r\n\r\n\t\twhere (predicate, raw = false) {\r\n\t\t\tconst keys = this.index.filter(i => i in predicate);\r\n\r\n\t\t\treturn keys.length > 0 ? this.filter(new Function(\"a\", `return (${keys.map(i => {\r\n\t\t\t\tconst arg = typeof predicate[i] === \"string\" ? `'${predicate[i]}'` : predicate[i];\r\n\r\n\t\t\t\treturn `Array.isArray(a['${i}']) ? a['${i}'].includes(${arg}) : a['${i}'] === ${arg}`;\r\n\t\t\t}).join(\") && (\")});`), raw) : [];\r\n\t\t}\r\n\t}\r\n\r\n\tfunction factory (data = null, config = {}) {\r\n\t\tconst obj = new Haro(config);\r\n\r\n\t\tif (webWorker) {\r\n\t\t\tobj.worker = node === false ? global.URL.createObjectURL(blob(functions)) : new Function(functions);\r\n\t\t}\r\n\r\n\t\tif (Array.isArray(data)) {\r\n\t\t\tobj.batch(data, \"set\");\r\n\t\t}\r\n\r\n\t\treturn obj;\r\n\t}\r\n\r\n\tfactory.transform = cast;\r\n\tfactory.version = \"4.3.0\";\r\n\r\n\t// Node, AMD & window supported\r\n\tif (typeof exports !== \"undefined\") {\r\n\t\tmodule.exports = factory;\r\n\t} else if (typeof define === \"function\" && define.amd !== void 0) {\r\n\t\tdefine(() => factory);\r\n\t} else {\r\n\t\tglobal.haro = factory;\r\n\t}\r\n}(typeof window !== \"undefined\" ? window : global));\r\n"]} \ No newline at end of file +{"version":3,"sources":["haro.js"],"names":["entries","forEach","Array","from","isArray","Object","keys","map","type","JSON","parse","stringify","replace","querystring","endslash","indexOf","split","sort","localeCompare","toString","RegExp","toLowerCase","join","get","has","delete","size","push","call","concat","filter","length","reverse","op","path","value","Math","random","substring","set","add","freeze","substr","floor","worker","URL","createObjectURL","Function","batch","process","nextTick","Promise","Map","Set","fetch","require","Blob","Worker","json","data","cmd","records","index","key","delimiter","pattern","ids","on","postMessage","constructor","config","debounce","id","logging","patch","source","versioning","adapters","debounced","method","credentials","headers","accept","indexes","total","uri","versions","defineProperty","enumerable","reindex","beforeBatch","del","all","onbatch","log","onerror","beforeClear","beforeDelete","beforeRequest","beforeSet","beforeSync","clear","onclear","Error","apply","crawl","exec","ondelete","storage","then","message","stack","clearTimeout","setTimeout","transmit","dump","toArray","transform","find","list","reduce","offload","arg","limit","registry","slice","load","console","useWorker","onrequest","onset","onsync","override","next","register","includes","request","toUpperCase","body","ok","status","_headers","test","save","search","values","setUri","sync","sortBy","Allow","allow","toObject","unload","unregister","terminate","onmessage","where","version","exports","define","amd","haro","module","window","global"],"mappings":"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","file":"unknown","sourcesContent":["/**\r\n * Harō is a modern immutable DataStore\r\n *\r\n * @author Jason Mulligan \r\n * @copyright 2018\r\n * @license BSD-3-Clause\r\n * @version 4.3.1\r\n */\r\n\r\n\r\n(function (global) {\r\n\tconst node = typeof process !== \"undefined\" && typeof process.nextTick === \"function\",\r\n\t\tPromise = global.Promise,\r\n\t\tMap = global.Map,\r\n\t\tSet = global.Set,\r\n\t\tfetch = global.fetch || (node ? require(\"node-fetch\") : undefined),\r\n\t\tBlob = global.Blob,\r\n\t\tWorker = global.Worker || (node ? require(\"tiny-worker\") : undefined),\r\n\t\tr = [8, 9, \"a\", \"b\"],\r\n\t\tregex = {\r\n\t\t\tquerystring: /\\?.*/,\r\n\t\t\tendslash: /\\/$/,\r\n\t\t\tjson: /^application\\/json/\r\n\t\t},\r\n\t\twebWorker = typeof Worker !== \"undefined\",\r\n\t\twebWorkerError = \"Web Worker not supported\",\r\n\t\tadapter = {};\r\n\r\n\tfunction has (a, b) {\r\n\t\treturn b in a;\r\n\t}\r\n\r\n\tfunction each (arr, fn) {\r\n\t\tfor (const item of arr.entries()) {\r\n\t\t\tfn(item[1], item[0]);\r\n\t\t}\r\n\r\n\t\treturn arr;\r\n\t}\r\n\r\n\tfunction cast (input) {\r\n\t\tlet result;\r\n\r\n\t\tswitch (true) {\r\n\t\t\tcase input instanceof Map:\r\n\t\t\t\tresult = {};\r\n\t\t\t\tinput.forEach((value, key) => {\r\n\t\t\t\t\tresult[key] = cast(value);\r\n\t\t\t\t});\r\n\t\t\t\tbreak;\r\n\t\t\tcase input instanceof Set:\r\n\t\t\t\tresult = Array.from(input);\r\n\t\t\t\tbreak;\r\n\t\t\tcase Array.isArray(input):\r\n\t\t\t\tresult = new Set(input);\r\n\t\t\t\tbreak;\r\n\t\t\tcase input instanceof Object:\r\n\t\t\t\tresult = new Map(Object.keys(input).map(i => [i, cast(input[i])]));\r\n\t\t\t\tbreak;\r\n\t\t\tdefault:\r\n\t\t\t\tresult = input;\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tfunction blob (arg) {\r\n\t\treturn new Blob([arg], {type: \"application/javascript\"});\r\n\t}\r\n\r\n\tfunction clone (arg) {\r\n\t\treturn JSON.parse(JSON.stringify(arg, null, 0));\r\n\t}\r\n\r\n\tfunction concatURI (left, right) {\r\n\t\treturn left.replace(regex.querystring, \"\").replace(regex.endslash, \"\") + (right ? \"/\" + right : \"\");\r\n\t}\r\n\r\n\tfunction keyIndex (key, data, delimiter, pattern) {\r\n\t\tlet result;\r\n\r\n\t\tif (key.indexOf(delimiter) > -1) {\r\n\t\t\tresult = key.split(delimiter).sort((a, b) => a.localeCompare(b)).map(i => data[i].toString().replace(new RegExp(pattern, \"g\"), \"\").toLowerCase()).join(delimiter);\r\n\t\t} else {\r\n\t\t\tresult = data[key];\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tfunction delIndex (index, indexes, delimiter, key, data, pattern) {\r\n\t\tindex.forEach(i => {\r\n\t\t\tconst idx = indexes.get(i),\r\n\t\t\t\tvalue = keyIndex(i, data, delimiter, pattern);\r\n\r\n\t\t\tif (idx.has(value)) {\r\n\t\t\t\tconst o = idx.get(value);\r\n\r\n\t\t\t\to.delete(key);\r\n\r\n\t\t\t\tif (o.size === 0) {\r\n\t\t\t\t\tidx.delete(value);\r\n\t\t\t\t}\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tfunction createIndexes (records, indexes, key, delimiter, pattern) {\r\n\t\tconst result = {};\r\n\r\n\t\teach(indexes, i => {\r\n\t\t\tresult[i] = {};\r\n\t\t});\r\n\r\n\t\teach(records, i => {\r\n\t\t\tconst lkey = i[key];\r\n\r\n\t\t\tif (lkey !== void 0) {\r\n\t\t\t\tindexes.forEach(index => {\r\n\t\t\t\t\tconst lindex = keyIndex(index, i, delimiter, pattern);\r\n\r\n\t\t\t\t\tif (!has(result[index], lindex)) {\r\n\t\t\t\t\t\tresult[index][lindex] = [];\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tresult[index][lindex].push(lkey);\r\n\t\t\t\t});\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tfunction iterate (obj, fn) {\r\n\t\tif (obj instanceof Object) {\r\n\t\t\teach(Object.keys(obj), i => fn.call(obj, obj[i], i));\r\n\t\t} else {\r\n\t\t\teach(obj, fn);\r\n\t\t}\r\n\t}\r\n\r\n\tfunction merge (a, b) {\r\n\t\tif (a instanceof Object && b instanceof Object) {\r\n\t\t\teach(Object.keys(b), i => {\r\n\t\t\t\tif (a[i] instanceof Object && b[i] instanceof Object) {\r\n\t\t\t\t\ta[i] = merge(a[i], b[i]);\r\n\t\t\t\t} else if (Array.isArray(a[i]) && Array.isArray(b[i])) {\r\n\t\t\t\t\ta[i] = a[i].concat(b[i]);\r\n\t\t\t\t} else {\r\n\t\t\t\t\ta[i] = b[i];\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t} else if (Array.isArray(a) && Array.isArray(b)) {\r\n\t\t\ta = a.concat(b);\r\n\t\t} else {\r\n\t\t\ta = b;\r\n\t\t}\r\n\r\n\t\treturn a;\r\n\t}\r\n\r\n\tfunction joinData (id, a, b, key, on, type = \"inner\") {\r\n\t\tconst result = [];\r\n\t\tlet errorMsg = \"More than one record found on \";\r\n\r\n\t\tlet error = false;\r\n\r\n\t\tfunction join (left, right, ids, include = false, reverse = false) {\r\n\t\t\tconst keys = Object.keys(right[0]),\r\n\t\t\t\tfn = !reverse ? (x, i) => x[on] === i[key] : (x, i) => x[key] === i[on];\r\n\r\n\t\t\teach(left, i => {\r\n\t\t\t\tconst comp = {},\r\n\t\t\t\t\tc = right.filter(x => fn(x, i));\r\n\r\n\t\t\t\tlet valid = true;\r\n\r\n\t\t\t\tif (c.length > 1) {\r\n\t\t\t\t\terror = true;\r\n\t\t\t\t\terrorMsg += i[on];\r\n\t\t\t\t\tvalid = false;\r\n\t\t\t\t} else if (c.length === 1) {\r\n\t\t\t\t\teach([i, c[0]], (x, idx) => iterate(x, (v, k) => {\r\n\t\t\t\t\t\tcomp[ids[idx] + \"_\" + k] = v;\r\n\t\t\t\t\t}));\r\n\t\t\t\t} else if (include) {\r\n\t\t\t\t\titerate(i, (v, k) => {\r\n\t\t\t\t\t\tcomp[ids[0] + \"_\" + k] = v;\r\n\t\t\t\t\t});\r\n\r\n\t\t\t\t\teach(keys, k => {\r\n\t\t\t\t\t\tcomp[ids[1] + \"_\" + k] = null;\r\n\t\t\t\t\t});\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (valid && Object.keys(comp).length > 0) {\r\n\t\t\t\t\tresult.push(comp);\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn valid;\r\n\t\t\t}, true);\r\n\t\t}\r\n\r\n\t\tif (type === \"inner\") {\r\n\t\t\tjoin(a, b, id);\r\n\t\t}\r\n\r\n\t\tif (type === \"left\") {\r\n\t\t\tjoin(a, b, id, true);\r\n\t\t}\r\n\r\n\t\tif (type === \"right\") {\r\n\t\t\tjoin(b, a, clone(id).reverse(), true, true);\r\n\t\t}\r\n\r\n\t\treturn !error ? result : errorMsg;\r\n\t}\r\n\r\n\tfunction onmessage (ev) {\r\n\t\tconst data = JSON.parse(ev.data),\r\n\t\t\tcmd = data.cmd;\r\n\r\n\t\tlet result;\r\n\r\n\t\tif (cmd === \"index\") {\r\n\t\t\tresult = createIndexes(data.records, data.index, data.key, data.delimiter, data.pattern);\r\n\t\t}\r\n\r\n\t\tif (cmd === \"join\") {\r\n\t\t\tresult = joinData(data.ids, data.records[0], data.records[1], data.key, data.on, data.type);\r\n\t\t}\r\n\r\n\t\tpostMessage(JSON.stringify(result));\r\n\t}\r\n\r\n\tfunction createPatch (ogdata = {}, data = {}, key = \"\", overwrite = false) {\r\n\t\tconst result = [];\r\n\r\n\t\tif (overwrite) {\r\n\t\t\titerate(ogdata, (v, k) => {\r\n\t\t\t\tif (k !== key && data[k] === void 0) {\r\n\t\t\t\t\tresult.push({op: \"remove\", path: \"/\" + k});\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\titerate(data, (v, k) => {\r\n\t\t\tif (k !== key && ogdata[k] === void 0) {\r\n\t\t\t\tresult.push({op: \"add\", path: \"/\" + k, value: v});\r\n\t\t\t} else if (JSON.stringify(ogdata[k]) !== JSON.stringify(v)) {\r\n\t\t\t\tresult.push({op: \"replace\", path: \"/\" + k, value: v});\r\n\t\t\t}\r\n\t\t});\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tfunction s () {\r\n\t\treturn ((Math.random() + 1) * 0x10000 | 0).toString(16).substring(1);\r\n\t}\r\n\r\n\tfunction setIndex (index, indexes, delimiter, key, data, indice, pattern) {\r\n\t\teach(!indice ? index : [indice], i => {\r\n\t\t\tconst lidx = keyIndex(i, data, delimiter, pattern);\r\n\t\t\tlet lindex;\r\n\r\n\t\t\tif (lidx !== void 0 && lidx !== null) {\r\n\t\t\t\tlindex = indexes.get(i);\r\n\r\n\t\t\t\tif (!lindex.has(lidx)) {\r\n\t\t\t\t\tlindex.set(lidx, new Set());\r\n\t\t\t\t}\r\n\r\n\t\t\t\tlindex.get(lidx).add(key);\r\n\t\t\t}\r\n\t\t});\r\n\t}\r\n\r\n\tfunction toObjekt (arg, frozen = true) {\r\n\t\tconst result = {};\r\n\r\n\t\targ.forEach((value, key) => {\r\n\t\t\tconst obj = value;\r\n\r\n\t\t\tif (frozen) {\r\n\t\t\t\tObject.freeze(obj);\r\n\t\t\t}\r\n\r\n\t\t\tresult[clone(key)] = obj;\r\n\t\t});\r\n\r\n\t\tif (frozen) {\r\n\t\t\tObject.freeze(result);\r\n\t\t}\r\n\r\n\t\treturn result;\r\n\t}\r\n\r\n\tfunction uuid () {\r\n\t\treturn s() + s() + \"-\" + s() + \"-4\" + s().substr(0, 3) + \"-\" + r[Math.floor(Math.random() * 4)] + s().substr(0, 3) + \"-\" + s() + s() + s();\r\n\t}\r\n\r\n\tconst functions = [\r\n\t\tcast.toString(),\r\n\t\tclone.toString(),\r\n\t\tcreateIndexes.toString(),\r\n\t\teach.toString(),\r\n\t\thas.toString(),\r\n\t\titerate.toString(),\r\n\t\tjoinData.toString(),\r\n\t\tkeyIndex.toString(),\r\n\t\tsetIndex.toString(),\r\n\t\t(node === false ? \"\" : \"self.\") + \"onmessage = \" + onmessage.toString() + \";\"\r\n\t].join(\"\\n\");\r\n\r\n\tclass Haro {\r\n\t\tconstructor ({config = {}, debounce = 0, delimiter = \"|\", id = uuid(), index = [], key = \"\", logging = true, patch = false, pattern = \"\\\\s*|\\\\t*\", source = \"\", versioning = false} = {}) {\r\n\t\t\tthis.adapters = {};\r\n\t\t\tthis.data = new Map();\r\n\t\t\tthis.debounce = debounce;\r\n\t\t\tthis.debounced = new Map();\r\n\t\t\tthis.delimiter = delimiter;\r\n\t\t\tthis.config = {\r\n\t\t\t\tmethod: \"get\",\r\n\t\t\t\tcredentials: \"include\",\r\n\t\t\t\theaders: {\r\n\t\t\t\t\taccept: \"application/json\",\r\n\t\t\t\t\t\"content-type\": \"application/json\"\r\n\t\t\t\t}\r\n\t\t\t};\r\n\t\t\tthis.id = id;\r\n\t\t\tthis.index = index;\r\n\t\t\tthis.indexes = new Map();\r\n\t\t\tthis.key = key;\r\n\t\t\tthis.logging = logging;\r\n\t\t\tthis.patch = patch;\r\n\t\t\tthis.pattern = pattern;\r\n\t\t\tthis.source = source;\r\n\t\t\tthis.size = this.total = 0;\r\n\t\t\tthis.uri = \"\";\r\n\t\t\tthis.worker = null;\r\n\t\t\tthis.versions = new Map();\r\n\t\t\tthis.versioning = versioning;\r\n\r\n\t\t\tObject.defineProperty(this, \"registry\", {\r\n\t\t\t\tenumerable: true,\r\n\t\t\t\tget: () => Array.from(this.data.keys())\r\n\t\t\t});\r\n\r\n\t\t\tif (Object.keys(config).length > 1) {\r\n\t\t\t\tthis.config = merge(this.config, config);\r\n\t\t\t}\r\n\r\n\t\t\treturn this.reindex();\r\n\t\t}\r\n\r\n\t\tasync batch (args, type = \"set\", lazyLoad = false) {\r\n\t\t\tlet result;\r\n\r\n\t\t\tthis.beforeBatch(args, type);\r\n\r\n\t\t\ttry {\r\n\t\t\t\tconst fn = type === \"del\" ? i => this.del(i, true, lazyLoad) : i => this.set(null, i, true, true, lazyLoad);\r\n\r\n\t\t\t\tresult = await Promise.all(args.map(fn));\r\n\t\t\t\tthis.onbatch(type, result);\r\n\t\t\t\tthis.log(`Batch successful on ${this.id}`);\r\n\t\t\t} catch (e) {\r\n\t\t\t\tthis.onerror(\"batch\", e);\r\n\t\t\t\tthis.log(`Batch failure on ${this.id}`);\r\n\t\t\t\tthrow e;\r\n\t\t\t}\r\n\r\n\t\t\treturn result;\r\n\t\t}\r\n\r\n\t\tbeforeBatch () {}\r\n\r\n\t\tbeforeClear () {}\r\n\r\n\t\tbeforeDelete () {}\r\n\r\n\t\tbeforeRequest () {}\r\n\r\n\t\tbeforeSet () {}\r\n\r\n\t\tbeforeSync () {}\r\n\r\n\t\tclear () {\r\n\t\t\tthis.beforeClear();\r\n\t\t\tthis.size = this.total = 0;\r\n\t\t\tthis.data.clear();\r\n\t\t\tthis.indexes.clear();\r\n\t\t\tthis.versions.clear();\r\n\t\t\tthis.reindex().onclear();\r\n\t\t\tthis.log(`Cleared ${this.id}`);\r\n\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tasync cmd (type, ...args) {\r\n\t\t\tif (this.adapters[type] === void 0 || adapter[type] === void 0) {\r\n\t\t\t\tthrow new Error(`${type} not configured for persistent storage`);\r\n\t\t\t}\r\n\r\n\t\t\treturn await adapter[type].apply(this, [this, ...args]);\r\n\t\t}\r\n\r\n\t\tcrawl (arg) {\r\n\t\t\tlet result = clone(arg);\r\n\r\n\t\t\teach((this.source || \"\").split(\".\"), i => {\r\n\t\t\t\tresult = result[i];\r\n\t\t\t});\r\n\r\n\t\t\treturn result || arg;\r\n\t\t}\r\n\r\n\t\tdel (key, batch = false, lazyLoad = false, retry = false) {\r\n\t\t\tif (this.has(key) === false) {\r\n\t\t\t\tthrow new Error(\"Record not found\");\r\n\t\t\t}\r\n\r\n\t\t\tconst og = this.get(key, true);\r\n\r\n\t\t\treturn this.exec(async () => {\r\n\t\t\t\tthis.beforeDelete(key, batch, lazyLoad, retry);\r\n\t\t\t\tdelIndex(this.index, this.indexes, this.delimiter, key, og, this.pattern);\r\n\t\t\t\tthis.data.delete(key);\r\n\t\t\t\t--this.total;\r\n\t\t\t\tthis.size = this.total;\r\n\t\t\t}, async () => {\r\n\t\t\t\tthis.ondelete(key, batch, retry, lazyLoad);\r\n\r\n\t\t\t\tif (this.versioning) {\r\n\t\t\t\t\tthis.versions.delete(key);\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (!lazyLoad) {\r\n\t\t\t\t\tthis.storage(\"remove\", key).then(success => {\r\n\t\t\t\t\t\tif (success) {\r\n\t\t\t\t\t\t\tthis.log(`Deleted ${key} from persistent storage`);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}, e => this.log(`Error deleting ${key} from persistent storage: ${e.message || e.stack || e}`, \"error\"));\r\n\r\n\t\t\t\t\tif (!batch && !retry && this.uri) {\r\n\t\t\t\t\t\tif (this.debounced.has(key)) {\r\n\t\t\t\t\t\t\tclearTimeout(this.debounced.get(key));\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tthis.debounced.set(key, setTimeout(async () => {\r\n\t\t\t\t\t\t\tthis.debounced.delete(key);\r\n\r\n\t\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t\tawait this.transmit(key, null, og, false, \"delete\");\r\n\t\t\t\t\t\t\t} catch (err) {\r\n\t\t\t\t\t\t\t\tthis.log(err.stack || err.message || err, \"error\");\r\n\r\n\t\t\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t\t\tawait this.set(key, og, true, true);\r\n\t\t\t\t\t\t\t\t\tthis.log(`Reverted ${key}`);\r\n\t\t\t\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\t\t\t\tthis.log(`Failed to revert ${key}`);\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}, this.debounce));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t}, err => {\r\n\t\t\t\tthis.onerror(\"delete\", err);\r\n\t\t\t\tthrow err;\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tdump (type = \"records\") {\r\n\t\t\treturn type === \"records\" ? this.toArray(null, false) : this.transform(this.indexes);\r\n\t\t}\r\n\r\n\t\tentries () {\r\n\t\t\treturn this.data.entries();\r\n\t\t}\r\n\r\n\t\tasync exec (first, second, handler) {\r\n\t\t\tlet result;\r\n\r\n\t\t\ttry {\r\n\t\t\t\tconst arg = await first();\r\n\t\t\t\tresult = await second(arg);\r\n\t\t\t} catch (err) {\r\n\t\t\t\thandler(err);\r\n\t\t\t}\r\n\r\n\t\t\treturn result;\r\n\t\t}\r\n\r\n\t\tfind (where, raw = false) {\r\n\t\t\tconst key = Object.keys(where).sort((a, b) => a.localeCompare(b)).join(this.delimiter),\r\n\t\t\t\tvalue = keyIndex(key, where, this.delimiter, this.pattern),\r\n\t\t\t\tresult = [];\r\n\r\n\t\t\tif (this.indexes.has(key)) {\r\n\t\t\t\t(this.indexes.get(key).get(value) || new Set()).forEach(i => result.push(this.get(i, raw)));\r\n\t\t\t}\r\n\r\n\t\t\treturn raw ? result : this.list(...result);\r\n\t\t}\r\n\r\n\t\tfilter (fn, raw = false) {\r\n\t\t\tconst result = this.reduce((a, v, k, ctx) => {\r\n\t\t\t\tif (fn.call(ctx, v) === true) {\r\n\t\t\t\t\ta.push(this.get(k, raw));\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn a;\r\n\t\t\t}, []);\r\n\r\n\t\t\treturn raw ? result : this.list(...result);\r\n\t\t}\r\n\r\n\t\tforEach (fn, ctx) {\r\n\t\t\tthis.data.forEach((value, key) => fn(clone(value), clone(key)), ctx || this.data);\r\n\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tget (key, raw = false) {\r\n\t\t\tconst result = clone(this.data.get(key) || null);\r\n\r\n\t\t\treturn result && !raw ? this.list(key, result) : result;\r\n\t\t}\r\n\r\n\t\thas (key, map) {\r\n\t\t\treturn (map || this.data).has(key);\r\n\t\t}\r\n\r\n\t\tasync join (other, on, type = \"inner\", where = []) {\r\n\t\t\tlet result;\r\n\r\n\t\t\tif (other.total > 0) {\r\n\t\t\t\tif (where.length > 0) {\r\n\t\t\t\t\tresult = await this.offload([[this.id, other.id], this.find(where[0], true), !where[1] ? other.toArray(null, true) : other.find(where[1], true), this.key, on || this.key, type], \"join\");\r\n\t\t\t\t} else {\r\n\t\t\t\t\tresult = await this.offload([[this.id, other.id], this.toArray(null, true), other.toArray(null, true), this.key, on || this.key, type], \"join\");\r\n\t\t\t\t}\r\n\r\n\t\t\t\tif (typeof arg === \"string\") {\r\n\t\t\t\t\tthrow new Error(result);\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tresult = [];\r\n\t\t\t}\r\n\r\n\t\t\treturn result;\r\n\t\t}\r\n\r\n\t\tkeys () {\r\n\t\t\treturn this.data.keys();\r\n\t\t}\r\n\r\n\t\tlimit (offset = 0, max = 0, raw = false) {\r\n\t\t\tconst result = this.registry.slice(offset, offset + max).map(i => this.get(i, raw));\r\n\r\n\t\t\treturn raw ? result : this.list(...result);\r\n\t\t}\r\n\r\n\t\tlist (...args) {\r\n\t\t\treturn Object.freeze(args.map(i => Object.freeze(i)));\r\n\t\t}\r\n\r\n\t\tasync load (type = \"mongo\", key = undefined) {\r\n\t\t\tconst batch = key === undefined,\r\n\t\t\t\tid = !batch ? key : this.id;\r\n\t\t\tlet result;\r\n\r\n\t\t\tif (batch) {\r\n\t\t\t\tthis.clear();\r\n\t\t\t}\r\n\r\n\t\t\ttry {\r\n\t\t\t\tconst data = await this.cmd(type, \"get\", key);\r\n\r\n\t\t\t\tresult = batch ? this.batch(data, \"set\", true) : this.set(key, data, true, true, true);\r\n\t\t\t\tthis.log(`Loaded ${id} from ${type} persistent storage`);\r\n\t\t\t} catch (e) {\r\n\t\t\t\tthis.log(`Error loading ${id} from ${type} persistent storage: ${e.message || e.stack || e}`, \"error\");\r\n\t\t\t\tthrow e;\r\n\t\t\t}\r\n\r\n\t\t\treturn result;\r\n\t\t}\r\n\r\n\t\tlog (arg = \"\", type = \"log\") {\r\n\t\t\tif (this.logging) {\r\n\t\t\t\tconsole[type](`haro: ${arg}`);\r\n\t\t\t}\r\n\t\t}\r\n\r\n\t\tmap (fn, raw = false) {\r\n\t\t\tconst result = [];\r\n\r\n\t\t\tthis.forEach((value, key) => result.push(fn(value, key)));\r\n\r\n\t\t\treturn raw ? result : this.list(...result);\r\n\t\t}\r\n\r\n\t\tasync offload (data, cmd = \"index\", index = this.index) {\r\n\t\t\treturn new Promise((resolve, reject) => {\r\n\t\t\t\tif (this.worker) {\r\n\t\t\t\t\tconst obj = this.useWorker(resolve, reject);\r\n\t\t\t\t\tlet payload;\r\n\r\n\t\t\t\t\tif (cmd === \"index\") {\r\n\t\t\t\t\t\tpayload = {\r\n\t\t\t\t\t\t\tcmd: cmd,\r\n\t\t\t\t\t\t\tindex: index,\r\n\t\t\t\t\t\t\trecords: data,\r\n\t\t\t\t\t\t\tkey: this.key,\r\n\t\t\t\t\t\t\tdelimiter: this.delimiter,\r\n\t\t\t\t\t\t\tpattern: this.pattern\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t} else if (cmd === \"join\") {\r\n\t\t\t\t\t\tpayload = {\r\n\t\t\t\t\t\t\tcmd: cmd,\r\n\t\t\t\t\t\t\tids: data[0],\r\n\t\t\t\t\t\t\trecords: [data[1], data[2]],\r\n\t\t\t\t\t\t\tkey: data[3],\r\n\t\t\t\t\t\t\ton: data[4],\r\n\t\t\t\t\t\t\ttype: data[5]\r\n\t\t\t\t\t\t};\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tobj.postMessage(JSON.stringify(payload, null, 0));\r\n\t\t\t\t} else {\r\n\t\t\t\t\treject(new Error(webWorkerError));\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tonbatch () {}\r\n\r\n\t\tonclear () {}\r\n\r\n\t\tondelete () {}\r\n\r\n\t\tonerror () {}\r\n\r\n\t\tonrequest (arg) {\r\n\t\t\treturn arg;\r\n\t\t}\r\n\r\n\t\tonset () {}\r\n\r\n\t\tonsync () {}\r\n\r\n\t\tasync override (data, type = \"records\", fn = undefined) {\r\n\t\t\tconst result = true;\r\n\r\n\t\t\tif (type === \"indexes\") {\r\n\t\t\t\tthis.indexes = this.transform(data, fn);\r\n\t\t\t} else if (type === \"records\") {\r\n\t\t\t\tconst key = this.key !== \"\" ? arg => arg[this.key] || uuid() : () => uuid();\r\n\t\t\t\tthis.indexes.clear();\r\n\t\t\t\tthis.data = new Map(data.map(datum => [key(datum), datum]));\r\n\t\t\t\tthis.size = this.total = this.data.size;\r\n\t\t\t} else {\r\n\t\t\t\tthrow new Error(\"Invalid type\");\r\n\t\t\t}\r\n\r\n\t\t\treturn result;\r\n\t\t}\r\n\r\n\t\treduce (fn, accumulator, raw = false) {\r\n\t\t\tlet a = accumulator || this.data.keys().next().value;\r\n\r\n\t\t\tthis.forEach((v, k) => {\r\n\t\t\t\ta = fn(a, v, k, this, raw);\r\n\t\t\t}, this);\r\n\r\n\t\t\treturn a;\r\n\t\t}\r\n\r\n\t\tregister (key, fn) {\r\n\t\t\tadapter[key] = fn;\r\n\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\treindex (index) {\r\n\t\t\tconst indices = index ? [index] : this.index;\r\n\r\n\t\t\tif (index && this.index.includes(index) === false) {\r\n\t\t\t\tthis.index.push(index);\r\n\t\t\t}\r\n\r\n\t\t\teach(indices, i => this.indexes.set(i, new Map()));\r\n\t\t\tthis.forEach((data, key) => each(indices, i => setIndex(this.index, this.indexes, this.delimiter, key, data, i, this.pattern)));\r\n\r\n\t\t\treturn this;\r\n\t\t}\r\n\r\n\t\tasync request (input, config = {}) {\r\n\t\t\treturn new Promise(async (resolve, reject) => {\r\n\t\t\t\tconst cfg = merge(clone(this.config), config),\r\n\t\t\t\t\tref = [input, cfg],\r\n\t\t\t\t\theaders = {};\r\n\r\n\t\t\t\tcfg.method = cfg.method.toUpperCase();\r\n\r\n\t\t\t\tif (cfg.method === \"DELETE\") {\r\n\t\t\t\t\tdelete cfg.body;\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.beforeRequest(...ref);\r\n\r\n\t\t\t\ttry {\r\n\t\t\t\t\tconst res = await fetch(input, cfg),\r\n\t\t\t\t\t\tok = res.ok,\r\n\t\t\t\t\t\tstatus = res.status;\r\n\r\n\t\t\t\t\tif (res.headers._headers) {\r\n\t\t\t\t\t\teach(Object.keys(res.headers._headers), i => {\r\n\t\t\t\t\t\t\theaders[i] = res.headers._headers[i].join(\", \");\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tfor (const pair of res.headers.entries()) {\r\n\t\t\t\t\t\t\theaders[pair[0]] = pair[1];\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tconst arg = await res[regex.json.test(headers[\"content-type\"] || \"\") ? \"json\" : \"text\"](),\r\n\t\t\t\t\t\tnext = ok ? resolve : reject;\r\n\r\n\t\t\t\t\tnext(this.list(this.onrequest(arg, status, headers), status, headers));\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\treject(this.list(e.message, 0, {}));\r\n\t\t\t\t}\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tasync save (type = \"mongo\") {\r\n\t\t\tlet result;\r\n\r\n\t\t\ttry {\r\n\t\t\t\tresult = await this.cmd(type, \"set\");\r\n\t\t\t\tthis.log(`Saved ${this.id} to ${type} persistent storage`);\r\n\t\t\t} catch (e) {\r\n\t\t\t\tthis.log(`Error saving ${this.id} to ${type} persistent storage: ${e.message || e.stack || e}`, \"error\");\r\n\t\t\t\tthrow e;\r\n\t\t\t}\r\n\r\n\t\t\treturn result;\r\n\t\t}\r\n\r\n\t\tsearch (value, index, raw = false) {\r\n\t\t\tconst result = new Map(),\r\n\t\t\t\tfn = typeof value === \"function\",\r\n\t\t\t\trgex = value && typeof value.test === \"function\";\r\n\r\n\t\t\tif (value) {\r\n\t\t\t\teach(index ? Array.isArray(index) ? index : [index] : this.index, i => {\r\n\t\t\t\t\tlet idx = this.indexes.get(i);\r\n\r\n\t\t\t\t\tif (idx) {\r\n\t\t\t\t\t\tidx.forEach((lset, lkey) => {\r\n\t\t\t\t\t\t\tswitch (true) {\r\n\t\t\t\t\t\t\t\tcase fn && value(lkey, i):\r\n\t\t\t\t\t\t\t\tcase rgex && value.test(Array.isArray(lkey) ? lkey.join(\", \") : lkey):\r\n\t\t\t\t\t\t\t\tcase lkey === value:\r\n\t\t\t\t\t\t\t\t\tlset.forEach(key => {\r\n\t\t\t\t\t\t\t\t\t\tif (!result.has(key) && this.has(key)) {\r\n\t\t\t\t\t\t\t\t\t\t\tresult.set(key, this.get(key, raw));\r\n\t\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t\t});\r\n\t\t\t\t\t\t\t\t\tbreak;\r\n\t\t\t\t\t\t\t\tdefault:\r\n\t\t\t\t\t\t\t\t\tvoid 0;\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t}\r\n\t\t\t\t});\r\n\t\t\t}\r\n\r\n\t\t\treturn raw ? Array.from(result.values()) : this.list(...Array.from(result.values()));\r\n\t\t}\r\n\r\n\t\tasync set (key, data, batch = false, override = false, lazyLoad = false, retry = false) {\r\n\t\t\tlet x = clone(data),\r\n\t\t\t\tmethod, og;\r\n\r\n\t\t\treturn this.exec(async () => {\r\n\t\t\t\tif (key === undefined || key === null) {\r\n\t\t\t\t\tkey = this.key && x[this.key] !== undefined ? x[this.key] : uuid();\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.beforeSet(key, data, batch, override, lazyLoad, retry);\r\n\r\n\t\t\t\tif (!this.data.has(key)) {\r\n\t\t\t\t\t++this.total;\r\n\t\t\t\t\tthis.size = this.total;\r\n\t\t\t\t\tmethod = \"post\";\r\n\r\n\t\t\t\t\tif (this.versioning) {\r\n\t\t\t\t\t\tthis.versions.set(key, new Set());\r\n\t\t\t\t\t}\r\n\t\t\t\t} else {\r\n\t\t\t\t\tog = this.get(key, true);\r\n\t\t\t\t\tdelIndex(this.index, this.indexes, this.delimiter, key, og, this.pattern);\r\n\t\t\t\t\tmethod = \"put\";\r\n\r\n\t\t\t\t\tif (this.versioning) {\r\n\t\t\t\t\t\tthis.versions.get(key).add(Object.freeze(clone(og)));\r\n\t\t\t\t\t}\r\n\r\n\t\t\t\t\tif (override === false) {\r\n\t\t\t\t\t\tx = merge(clone(og), x);\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\tthis.data.set(key, x);\r\n\t\t\t\tsetIndex(this.index, this.indexes, this.delimiter, key, x, null, this.pattern);\r\n\r\n\t\t\t\treturn this.get(key);\r\n\t\t\t}, async arg => {\r\n\t\t\t\tthis.onset(arg, batch, retry, lazyLoad);\r\n\r\n\t\t\t\tif (!lazyLoad) {\r\n\t\t\t\t\tthis.storage(\"set\", key, x).then(success => {\r\n\t\t\t\t\t\tif (success) {\r\n\t\t\t\t\t\t\tthis.log(`Saved ${key} to persistent storage`);\r\n\t\t\t\t\t\t}\r\n\t\t\t\t\t}, e => this.log(`Error saving ${key} to persistent storage: ${e.message || e.stack || e}`, \"error\"));\r\n\r\n\t\t\t\t\tif (!batch && !retry && this.uri) {\r\n\t\t\t\t\t\tif (this.debounced.has(key)) {\r\n\t\t\t\t\t\t\tclearTimeout(this.debounced.get(key));\r\n\t\t\t\t\t\t}\r\n\r\n\t\t\t\t\t\tthis.debounced.set(key, setTimeout(async () => {\r\n\t\t\t\t\t\t\tthis.debounced.delete(key);\r\n\r\n\t\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t\tawait this.transmit(key, x, og, override, method);\r\n\r\n\t\t\t\t\t\t\t\tif (og) {\r\n\t\t\t\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t\t\t\tawait this.set(key, og, batch, true, lazyLoad, true);\r\n\t\t\t\t\t\t\t\t\t\tthis.log(`Reverted ${key}`);\r\n\t\t\t\t\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\t\t\t\t\tthis.log(`Failed to revert ${key}`);\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t} else {\r\n\t\t\t\t\t\t\t\t\ttry {\r\n\t\t\t\t\t\t\t\t\t\tawait this.del(key, true);\r\n\t\t\t\t\t\t\t\t\t\tthis.log(`Reverted ${key}`);\r\n\t\t\t\t\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\t\t\t\t\tthis.log(`Failed to revert ${key}`);\r\n\t\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t\t} catch (e) {\r\n\t\t\t\t\t\t\t\tthis.log(e.stack || e.message || e, \"error\");\r\n\t\t\t\t\t\t\t}\r\n\t\t\t\t\t\t}, this.debounce));\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\r\n\t\t\t\treturn arg;\r\n\t\t\t}, err => {\r\n\t\t\t\tthis.onerror(\"set\", err);\r\n\t\t\t\tthrow err;\r\n\t\t\t});\r\n\t\t}\r\n\r\n\t\tasync setUri (uri, clear = false) {\r\n\t\t\tthis.uri = uri;\r\n\r\n\t\t\treturn this.uri !== \"\" ? await this.sync(clear) : [];\r\n\t\t}\r\n\r\n\t\tsort (fn, frozen = true) {\r\n\t\t\treturn frozen ? Object.freeze(this.limit(0, this.total, true).sort(fn).map(i => Object.freeze(i))) : this.limit(0, this.total, true).sort(fn);\r\n\t\t}\r\n\r\n\t\tsortBy (index, raw = false) {\r\n\t\t\tconst result = [],\r\n\t\t\t\tkeys = [];\r\n\r\n\t\t\tlet lindex;\r\n\r\n\t\t\tif (!this.indexes.has(index)) {\r\n\t\t\t\tthis.reindex(index);\r\n\t\t\t}\r\n\r\n\t\t\tlindex = this.indexes.get(index);\r\n\t\t\tlindex.forEach((idx, key) => keys.push(key));\r\n\t\t\teach(keys.sort(), i => lindex.get(i).forEach(key => result.push(this.get(key, raw))));\r\n\r\n\t\t\treturn raw ? result : this.list(...result);\r\n\t\t}\r\n\r\n\t\tasync storage (...args) {\r\n\t\t\tlet result;\r\n\r\n\t\t\ttry {\r\n\t\t\t\tconst deferreds = Object.keys(this.adapters).map(async i => await this.cmd.apply(this, [i, ...args]));\r\n\r\n\t\t\t\tif (deferreds.length > 0) {\r\n\t\t\t\t\tawait Promise.all(deferreds);\r\n\t\t\t\t\tresult = true;\r\n\t\t\t\t} else {\r\n\t\t\t\t\tresult = false;\r\n\t\t\t\t}\r\n\t\t\t} catch (e) {\r\n\t\t\t\tthis.log(e.stack || e.message || e, \"error\");\r\n\t\t\t\tthrow e;\r\n\t\t\t}\r\n\r\n\t\t\treturn result;\r\n\t\t}\r\n\r\n\t\tasync sync (clear = false) {\r\n\t\t\tlet result;\r\n\r\n\t\t\tthis.beforeSync(this.uri, clear);\r\n\r\n\t\t\ttry {\r\n\t\t\t\tconst arg = await this.request(this.uri),\r\n\t\t\t\t\tdata = this.source ? this.crawl(arg[0]) : arg[0];\r\n\r\n\t\t\t\tthis.patch = (arg[2].Allow || arg[2].allow || \"\").includes(\"PATCH\");\r\n\r\n\t\t\t\tif (clear) {\r\n\t\t\t\t\tthis.clear();\r\n\t\t\t\t}\r\n\r\n\t\t\t\tresult = await this.batch(data, \"set\");\r\n\t\t\t\tthis.onsync(result);\r\n\t\t\t} catch (e) {\r\n\t\t\t\tthis.onerror(\"sync\", e[0] || e);\r\n\t\t\t\tthrow e[0] || e;\r\n\t\t\t}\r\n\r\n\t\t\treturn result;\r\n\t\t}\r\n\r\n\t\ttoArray (data, frozen = true) {\r\n\t\t\tlet result;\r\n\r\n\t\t\tif (data) {\r\n\t\t\t\tresult = data.map(i => frozen ? i[1] : clone(i[1]));\r\n\t\t\t} else {\r\n\t\t\t\tresult = this.limit(0, this.total, true);\r\n\r\n\t\t\t\tif (frozen) {\r\n\t\t\t\t\teach(result, i => Object.freeze(i));\r\n\t\t\t\t}\r\n\t\t\t}\r\n\r\n\t\t\treturn frozen ? Object.freeze(result) : result;\r\n\t\t}\r\n\r\n\t\ttoObject (data, frozen = true) {\r\n\t\t\tconst result = !data ? toObjekt(this, frozen) : data.reduce((a, b) => {\r\n\t\t\t\tconst obj = clone(b[1]);\r\n\r\n\t\t\t\tif (frozen) {\r\n\t\t\t\t\tObject.freeze(obj);\r\n\t\t\t\t}\r\n\r\n\t\t\t\ta[b[0]] = obj;\r\n\r\n\t\t\t\treturn a;\r\n\t\t\t}, {});\r\n\r\n\t\t\treturn frozen ? Object.freeze(result) : result;\r\n\t\t}\r\n\r\n\t\ttransform (input, fn) {\r\n\t\t\treturn typeof fn === \"function\" ? fn(input) : cast(input);\r\n\t\t}\r\n\r\n\t\tasync transmit (key, data, og, override = false, method = \"post\") {\r\n\t\t\tconst uri = concatURI(this.uri, data ? key : null);\r\n\r\n\t\t\tlet body, result;\r\n\r\n\t\t\tif (this.patch) {\r\n\t\t\t\tif (data === void 0) {\r\n\t\t\t\t\tbody = [{op: \"remove\", path: \"/\", value: key}];\r\n\t\t\t\t} else if (og === void 0) {\r\n\t\t\t\t\tbody = [{op: \"add\", path: \"/\", value: data}];\r\n\t\t\t\t} else if (override) {\r\n\t\t\t\t\tbody = [{op: \"replace\", path: \"/\", value: data}];\r\n\t\t\t\t} else {\r\n\t\t\t\t\tbody = createPatch(og, data, this.key);\r\n\t\t\t\t}\r\n\r\n\t\t\t\ttry {\r\n\t\t\t\t\tresult = await this.request(uri, {method: \"patch\", body: JSON.stringify(body, null, 0)});\r\n\t\t\t\t} catch (e) {\r\n\t\t\t\t\tif (e[1] === 405) {\r\n\t\t\t\t\t\tthis.patch = false;\r\n\t\t\t\t\t\tresult = await this.request(!data ? concatURI(this.uri, key) : uri, {\r\n\t\t\t\t\t\t\tmethod: method,\r\n\t\t\t\t\t\t\tbody: JSON.stringify(data, null, 0)\r\n\t\t\t\t\t\t});\r\n\t\t\t\t\t} else {\r\n\t\t\t\t\t\tthrow e;\r\n\t\t\t\t\t}\r\n\t\t\t\t}\r\n\t\t\t} else {\r\n\t\t\t\tresult = await this.request(uri, {method: method, body: JSON.stringify(data, null, 0)});\r\n\t\t\t}\r\n\r\n\t\t\treturn result;\r\n\t\t}\r\n\r\n\t\tasync unload (type = \"mongo\", key = undefined) {\r\n\t\t\tconst id = key !== undefined ? key : this.id;\r\n\t\t\tlet result;\r\n\r\n\t\t\ttry {\r\n\t\t\t\tresult = await this.cmd(type, \"remove\", key);\r\n\t\t\t\tthis.log(`Unloaded ${id} from ${type} persistent storage`);\r\n\t\t\t} catch (e) {\r\n\t\t\t\tthis.log(`Error unloading ${id} from ${type} persistent storage: ${e.message || e.stack || e}`, \"error\");\r\n\t\t\t\tthrow e;\r\n\t\t\t}\r\n\r\n\t\t\treturn result;\r\n\t\t}\r\n\r\n\t\tunregister (key) {\r\n\t\t\tdelete adapter[key];\r\n\t\t}\r\n\r\n\t\tvalues () {\r\n\t\t\treturn this.data.values();\r\n\t\t}\r\n\r\n\t\tuseWorker (resolve, reject) {\r\n\t\t\tlet obj;\r\n\r\n\t\t\tif (this.worker) {\r\n\t\t\t\tobj = new Worker(this.worker);\r\n\r\n\t\t\t\tobj.onerror = err => {\r\n\t\t\t\t\treject(err);\r\n\t\t\t\t\tobj.terminate();\r\n\t\t\t\t};\r\n\r\n\t\t\t\tobj.onmessage = ev => {\r\n\t\t\t\t\tresolve(JSON.parse(ev.data));\r\n\t\t\t\t\tobj.terminate();\r\n\t\t\t\t};\r\n\t\t\t} else {\r\n\t\t\t\treject(new Error(webWorkerError));\r\n\t\t\t}\r\n\r\n\t\t\treturn obj;\r\n\t\t}\r\n\r\n\t\twhere (predicate, raw = false) {\r\n\t\t\tconst keys = this.index.filter(i => i in predicate);\r\n\r\n\t\t\treturn keys.length > 0 ? this.filter(new Function(\"a\", `return (${keys.map(i => {\r\n\t\t\t\tconst arg = typeof predicate[i] === \"string\" ? `'${predicate[i]}'` : predicate[i];\r\n\r\n\t\t\t\treturn `Array.isArray(a['${i}']) ? a['${i}'].includes(${arg}) : a['${i}'] === ${arg}`;\r\n\t\t\t}).join(\") && (\")});`), raw) : [];\r\n\t\t}\r\n\t}\r\n\r\n\tfunction factory (data = null, config = {}) {\r\n\t\tconst obj = new Haro(config);\r\n\r\n\t\tif (webWorker) {\r\n\t\t\tobj.worker = node === false ? global.URL.createObjectURL(blob(functions)) : new Function(functions);\r\n\t\t}\r\n\r\n\t\tif (Array.isArray(data)) {\r\n\t\t\tobj.batch(data, \"set\");\r\n\t\t}\r\n\r\n\t\treturn obj;\r\n\t}\r\n\r\n\tfactory.transform = cast;\r\n\tfactory.version = \"4.3.1\";\r\n\r\n\t// Node, AMD & window supported\r\n\tif (typeof exports !== \"undefined\") {\r\n\t\tmodule.exports = factory;\r\n\t} else if (typeof define === \"function\" && define.amd !== void 0) {\r\n\t\tdefine(() => factory);\r\n\t} else {\r\n\t\tglobal.haro = factory;\r\n\t}\r\n}(typeof window !== \"undefined\" ? window : global));\r\n"]} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index 888e435..94b9b9e 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "haro", - "version": "4.3.0", + "version": "4.3.1", "lockfileVersion": 1, "requires": true, "dependencies": { diff --git a/package.json b/package.json index 089bd77..0dfb9a8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "haro", - "version": "4.3.0", + "version": "4.3.1", "description": "Harō is a modern immutable DataStore", "main": "lib/haro.js", "scripts": { diff --git a/src/utility.js b/src/utility.js index d4ef5df..932e5f8 100644 --- a/src/utility.js +++ b/src/utility.js @@ -132,8 +132,8 @@ } function joinData (id, a, b, key, on, type = "inner") { - const result = [], - errorMsg = "More than one record found on "; + const result = []; + let errorMsg = "More than one record found on "; let error = false;