From d00a01b1c97ac08d974d099e86841527cb3e0ea8 Mon Sep 17 00:00:00 2001 From: Jason Mulligan Date: Wed, 9 Dec 2020 07:59:38 -0500 Subject: [PATCH] Removing superficial/unneeded ops & property --- dist/haro.cjs.js | 13 ++++++------- dist/haro.esm.js | 2 +- dist/haro.js | 2 +- package-lock.json | 4 ++-- package.json | 2 +- src/haro.js | 13 ++++++------- 6 files changed, 17 insertions(+), 19 deletions(-) diff --git a/dist/haro.cjs.js b/dist/haro.cjs.js index 2ebf019..1a6fb06 100644 --- a/dist/haro.cjs.js +++ b/dist/haro.cjs.js @@ -104,7 +104,6 @@ class Haro { this.index = index; this.indexes = new Map(); this.key = key; - this.size = 0; this.versions = new Map(); this.versioning = versioning; @@ -113,6 +112,11 @@ class Haro { get: () => Array.from(this.data.keys()) }); + Object.defineProperty(this, "size", { + enumerable: true, + get: () => this.data.size + }); + return this.reindex(); } @@ -147,7 +151,6 @@ class Haro { clear () { this.beforeClear(); - this.size = 0; this.data.clear(); this.indexes.clear(); this.versions.clear(); @@ -166,7 +169,6 @@ class Haro { this.beforeDelete(key, batch, lazyLoad, retry); delIndex(this.index, this.indexes, this.delimiter, key, og); this.data.delete(key); - --this.size; this.ondelete(key, batch, retry, lazyLoad); if (this.versioning) { @@ -293,7 +295,6 @@ class Haro { } else if (type === "records") { this.indexes.clear(); this.data = new Map(data); - this.size = this.data.size; } else { throw new Error("Invalid type"); } @@ -365,8 +366,6 @@ class Haro { this.beforeSet(key, data, batch, override, lazyLoad, retry); if (this.has(key) === false) { - ++this.size; - if (this.versioning) { this.versions.set(key, new Set()); } @@ -392,7 +391,7 @@ class Haro { } sort (fn, frozen = true) { - return frozen ? Object.freeze(this.limit(0, this.size, true).sort(fn).map(i => Object.freeze(i))) : this.limit(0, this.size, true).sort(fn); + return frozen ? Object.freeze(this.limit(0, this.data.size, true).sort(fn).map(i => Object.freeze(i))) : this.limit(0, this.data.size, true).sort(fn); } sortBy (index, raw = false) { diff --git a/dist/haro.esm.js b/dist/haro.esm.js index 2b2838a..37bf4d8 100644 --- a/dist/haro.esm.js +++ b/dist/haro.esm.js @@ -1 +1 @@ -const e=[8,9,"a","b"];function t(e){return JSON.parse(JSON.stringify(e,null,0))}function s(e,t){for(const s of e.entries())t(s[1],s[0]);return e}function r(e="",t="|",s={}){return e.split(t).reduce(((e,r,i)=>{const n=[];return(Array.isArray(s[r])?s[r]:[s[r]]).forEach((s=>0===i?n.push(s):e.forEach((e=>n.push(`${e}${t}${s}`))))),n}),[])}function i(e,t,i,n,a){e.forEach((e=>{const h=t.get(e);s(e.includes(i)?r(e,i,a):Array.isArray(a[e])?a[e]:[a[e]],(e=>{if(h.has(e)){const t=h.get(e);t.delete(n),0===t.size&&h.delete(e)}}))}))}function n(e,t){return e instanceof Object&&t instanceof Object?s(Object.keys(t),(s=>{e[s]instanceof Object&&t[s]instanceof Object?e[s]=n(e[s],t[s]):Array.isArray(e[s])&&Array.isArray(t[s])?e[s]=e[s].concat(t[s]):e[s]=t[s]})):e=Array.isArray(e)&&Array.isArray(t)?e.concat(t):t,e}function a(){return(65536*(Math.random()+1)|0).toString(16).substring(1)}function h(e,t,i,n,a,h){s(null===h?e:[h],(e=>{const h=t.get(e);e.includes(i)?s(r(e,i,a),(e=>{!1===h.has(e)&&h.set(e,new Set),h.get(e).add(n)})):s(Array.isArray(a[e])?a[e]:[a[e]],(e=>{!1===h.has(e)&&h.set(e,new Set),h.get(e).add(n)}))}))}function o(){return a()+a()+"-"+a()+"-4"+a().substr(0,3)+"-"+e[Math.floor(4*Math.random())]+a().substr(0,3)+"-"+a()+a()+a()}class c{constructor({delimiter:e="|",id:t=o(),index:s=[],key:r="",versioning:i=!1}={}){return this.data=new Map,this.delimiter=e,this.id=t,this.index=s,this.indexes=new Map,this.key=r,this.size=0,this.versions=new Map,this.versioning=i,Object.defineProperty(this,"registry",{enumerable:!0,get:()=>Array.from(this.data.keys())}),this.reindex()}async batch(e,t="set",s=!1){let r;try{const i="del"===t?e=>this.del(e,!0,s):e=>this.set(null,e,!0,!0,s);r=await Promise.all(this.beforeBatch(e,t).map(i)),r=this.onbatch(r,t)}catch(e){throw this.onerror("batch",e),e}return r}beforeBatch(e){return e}beforeClear(){}beforeDelete(){}beforeSet(){}clear(){return this.beforeClear(),this.size=0,this.data.clear(),this.indexes.clear(),this.versions.clear(),this.reindex().onclear(),this}del(e,t=!1,s=!1,r=!1){if(!1===this.has(e))throw new Error("Record not found");const n=this.get(e,!0);this.beforeDelete(e,t,s,r),i(this.index,this.indexes,this.delimiter,e,n),this.data.delete(e),--this.size,this.ondelete(e,t,r,s),this.versioning&&this.versions.delete(e)}dump(e="records"){let t;return t="records"===e?Array.from(this.entries()):Array.from(this.indexes).map((e=>(e[1]=Array.from(e[1]).map((e=>(e[1]=Array.from(e[1]),e))),e))),t}entries(){return this.data.entries()}find(e={},t=!1){const s=Object.keys(e).sort(((e,t)=>e.localeCompare(t))).join(this.delimiter),i=this.indexes.get(s)||new Map;let n=[];if(i.size>0){const a=r(s,this.delimiter,e);n=Array.from(a.reduce(((e,t)=>(i.has(t)&&i.get(t).forEach((t=>e.add(t))),e)),new Set)).map((e=>this.get(e,t)))}return t?n:this.list(...n)}filter(e=(()=>{}),t=!1){const s=t?(e,t)=>t:(e,t)=>Object.freeze([e,Object.freeze(t)]),r=this.reduce(((t,r,i,n)=>(e.call(n,r)&&t.push(s(i,r)),t)),[]);return t?r:Object.freeze(r)}forEach(e,s){return this.data.forEach(((s,r)=>e(t(s),t(r))),s||this.data),this}get(e,s=!1){const r=t(this.data.get(e)||null);return s?r:this.list(e,r)}has(e){return this.data.has(e)}keys(){return this.data.keys()}limit(e=0,t=0,s=!1){const r=this.registry.slice(e,e+t).map((e=>this.get(e,s)));return s?r:this.list(...r)}list(...e){return Object.freeze(e.map((e=>Object.freeze(e))))}map(e,t=!1){const s=[];return this.forEach(((t,r)=>s.push(e(t,r)))),t?s:this.list(...s)}onbatch(e){return e}onclear(){}ondelete(){}onerror(){}onset(){}async override(e,t="records"){if("indexes"===t)this.indexes=new Map(e.map((e=>[e[0],new Map(e[1].map((e=>[e[0],new Set(e[1])])))])));else{if("records"!==t)throw new Error("Invalid type");this.indexes.clear(),this.data=new Map(e),this.size=this.data.size}return!0}reduce(e,t,s=!1){let r=t||this.data.keys().next().value;return this.forEach(((t,i)=>{r=e(r,t,i,this,s)}),this),r}reindex(e){const t=e?[e]:this.index;return e&&!1===this.index.includes(e)&&this.index.push(e),s(t,(e=>this.indexes.set(e,new Map))),this.forEach(((e,r)=>s(t,(t=>h(this.index,this.indexes,this.delimiter,r,e,t))))),this}search(e,t,r=!1){const i=new Map,n="function"==typeof e,a=e&&"function"==typeof e.test;return e&&s(t?Array.isArray(t)?t:[t]:this.index,(t=>{let s=this.indexes.get(t);s&&s.forEach(((s,h)=>{switch(!0){case n&&e(h,t):case a&&e.test(Array.isArray(h)?h.join(", "):h):case h===e:s.forEach((e=>{!1===i.has(e)&&this.has(e)&&i.set(e,this.get(e,r))}))}}))})),r?Array.from(i.values()):this.list(...Array.from(i.values()))}async set(e,s,r=!1,a=!1,c=!1,d=!1){let l,u,f=t(s);return null==e&&(e=this.key&&void 0!==f[this.key]?f[this.key]:o()),this.beforeSet(e,s,r,a,c,d),!1===this.has(e)?(++this.size,this.versioning&&this.versions.set(e,new Set)):(l=this.get(e,!0),i(this.index,this.indexes,this.delimiter,e,l),this.versioning&&this.versions.get(e).add(Object.freeze(t(l))),!1===a&&(f=n(t(l),f))),this.data.set(e,f),h(this.index,this.indexes,this.delimiter,e,f,null),u=this.get(e),this.onset(u,r,d,c),u}sort(e,t=!0){return t?Object.freeze(this.limit(0,this.size,!0).sort(e).map((e=>Object.freeze(e)))):this.limit(0,this.size,!0).sort(e)}sortBy(e,t=!1){const r=[],i=[];let n;return!1===this.indexes.has(e)&&this.reindex(e),n=this.indexes.get(e),n.forEach(((e,t)=>i.push(t))),s(i.sort(),(e=>n.get(e).forEach((e=>r.push(this.get(e,t)))))),t?r:this.list(...r)}toArray(e=!0){const t=Array.from(this.data.values());return e&&(s(t,(e=>Object.freeze(e))),Object.freeze(t)),t}values(){return this.data.values()}where(e,t=!1,s="||"){const r=this.index.filter((t=>t in e));return r.length>0?this.filter(new Function("a",`return (${r.map((t=>{let r;if(Array.isArray(e[t]))r=`Array.isArray(a['${t}']) ? ${e[t].map((e=>`a['${t}'].includes(${"string"==typeof e?`'${e}'`:e})`)).join(` ${s} `)} : (${e[t].map((e=>`a['${t}'] === ${"string"==typeof e?`'${e}'`:e}`)).join(` ${s} `)})`;else if(e[t]instanceof RegExp)r=`Array.isArray(a['${t}']) ? a['${t}'].filter(i => ${e[t]}.test(a['${t}'])).length > 0 : ${e[t]}.test(a['${t}'])`;else{const s="string"==typeof e[t]?`'${e[t]}'`:e[t];r=`Array.isArray(a['${t}']) ? a['${t}'].includes(${s}) : a['${t}'] === ${s}`}return r})).join(") && (")});`),t):[]}}function d(e=null,t={}){const s=new c(t);return Array.isArray(e)&&s.batch(e,"set"),s}export{d as haro}; \ No newline at end of file +const e=[8,9,"a","b"];function t(e){return JSON.parse(JSON.stringify(e,null,0))}function r(e,t){for(const r of e.entries())t(r[1],r[0]);return e}function s(e="",t="|",r={}){return e.split(t).reduce(((e,s,i)=>{const n=[];return(Array.isArray(r[s])?r[s]:[r[s]]).forEach((r=>0===i?n.push(r):e.forEach((e=>n.push(`${e}${t}${r}`))))),n}),[])}function i(e,t,i,n,a){e.forEach((e=>{const h=t.get(e);r(e.includes(i)?s(e,i,a):Array.isArray(a[e])?a[e]:[a[e]],(e=>{if(h.has(e)){const t=h.get(e);t.delete(n),0===t.size&&h.delete(e)}}))}))}function n(e,t){return e instanceof Object&&t instanceof Object?r(Object.keys(t),(r=>{e[r]instanceof Object&&t[r]instanceof Object?e[r]=n(e[r],t[r]):Array.isArray(e[r])&&Array.isArray(t[r])?e[r]=e[r].concat(t[r]):e[r]=t[r]})):e=Array.isArray(e)&&Array.isArray(t)?e.concat(t):t,e}function a(){return(65536*(Math.random()+1)|0).toString(16).substring(1)}function h(e,t,i,n,a,h){r(null===h?e:[h],(e=>{const h=t.get(e);e.includes(i)?r(s(e,i,a),(e=>{!1===h.has(e)&&h.set(e,new Set),h.get(e).add(n)})):r(Array.isArray(a[e])?a[e]:[a[e]],(e=>{!1===h.has(e)&&h.set(e,new Set),h.get(e).add(n)}))}))}function o(){return a()+a()+"-"+a()+"-4"+a().substr(0,3)+"-"+e[Math.floor(4*Math.random())]+a().substr(0,3)+"-"+a()+a()+a()}class c{constructor({delimiter:e="|",id:t=o(),index:r=[],key:s="",versioning:i=!1}={}){return this.data=new Map,this.delimiter=e,this.id=t,this.index=r,this.indexes=new Map,this.key=s,this.versions=new Map,this.versioning=i,Object.defineProperty(this,"registry",{enumerable:!0,get:()=>Array.from(this.data.keys())}),Object.defineProperty(this,"size",{enumerable:!0,get:()=>this.data.size}),this.reindex()}async batch(e,t="set",r=!1){let s;try{const i="del"===t?e=>this.del(e,!0,r):e=>this.set(null,e,!0,!0,r);s=await Promise.all(this.beforeBatch(e,t).map(i)),s=this.onbatch(s,t)}catch(e){throw this.onerror("batch",e),e}return s}beforeBatch(e){return e}beforeClear(){}beforeDelete(){}beforeSet(){}clear(){return this.beforeClear(),this.data.clear(),this.indexes.clear(),this.versions.clear(),this.reindex().onclear(),this}del(e,t=!1,r=!1,s=!1){if(!1===this.has(e))throw new Error("Record not found");const n=this.get(e,!0);this.beforeDelete(e,t,r,s),i(this.index,this.indexes,this.delimiter,e,n),this.data.delete(e),this.ondelete(e,t,s,r),this.versioning&&this.versions.delete(e)}dump(e="records"){let t;return t="records"===e?Array.from(this.entries()):Array.from(this.indexes).map((e=>(e[1]=Array.from(e[1]).map((e=>(e[1]=Array.from(e[1]),e))),e))),t}entries(){return this.data.entries()}find(e={},t=!1){const r=Object.keys(e).sort(((e,t)=>e.localeCompare(t))).join(this.delimiter),i=this.indexes.get(r)||new Map;let n=[];if(i.size>0){const a=s(r,this.delimiter,e);n=Array.from(a.reduce(((e,t)=>(i.has(t)&&i.get(t).forEach((t=>e.add(t))),e)),new Set)).map((e=>this.get(e,t)))}return t?n:this.list(...n)}filter(e=(()=>{}),t=!1){const r=t?(e,t)=>t:(e,t)=>Object.freeze([e,Object.freeze(t)]),s=this.reduce(((t,s,i,n)=>(e.call(n,s)&&t.push(r(i,s)),t)),[]);return t?s:Object.freeze(s)}forEach(e,r){return this.data.forEach(((r,s)=>e(t(r),t(s))),r||this.data),this}get(e,r=!1){const s=t(this.data.get(e)||null);return r?s:this.list(e,s)}has(e){return this.data.has(e)}keys(){return this.data.keys()}limit(e=0,t=0,r=!1){const s=this.registry.slice(e,e+t).map((e=>this.get(e,r)));return r?s:this.list(...s)}list(...e){return Object.freeze(e.map((e=>Object.freeze(e))))}map(e,t=!1){const r=[];return this.forEach(((t,s)=>r.push(e(t,s)))),t?r:this.list(...r)}onbatch(e){return e}onclear(){}ondelete(){}onerror(){}onset(){}async override(e,t="records"){if("indexes"===t)this.indexes=new Map(e.map((e=>[e[0],new Map(e[1].map((e=>[e[0],new Set(e[1])])))])));else{if("records"!==t)throw new Error("Invalid type");this.indexes.clear(),this.data=new Map(e)}return!0}reduce(e,t,r=!1){let s=t||this.data.keys().next().value;return this.forEach(((t,i)=>{s=e(s,t,i,this,r)}),this),s}reindex(e){const t=e?[e]:this.index;return e&&!1===this.index.includes(e)&&this.index.push(e),r(t,(e=>this.indexes.set(e,new Map))),this.forEach(((e,s)=>r(t,(t=>h(this.index,this.indexes,this.delimiter,s,e,t))))),this}search(e,t,s=!1){const i=new Map,n="function"==typeof e,a=e&&"function"==typeof e.test;return e&&r(t?Array.isArray(t)?t:[t]:this.index,(t=>{let r=this.indexes.get(t);r&&r.forEach(((r,h)=>{switch(!0){case n&&e(h,t):case a&&e.test(Array.isArray(h)?h.join(", "):h):case h===e:r.forEach((e=>{!1===i.has(e)&&this.has(e)&&i.set(e,this.get(e,s))}))}}))})),s?Array.from(i.values()):this.list(...Array.from(i.values()))}async set(e,r,s=!1,a=!1,c=!1,d=!1){let l,u,f=t(r);return null==e&&(e=this.key&&void 0!==f[this.key]?f[this.key]:o()),this.beforeSet(e,r,s,a,c,d),!1===this.has(e)?this.versioning&&this.versions.set(e,new Set):(l=this.get(e,!0),i(this.index,this.indexes,this.delimiter,e,l),this.versioning&&this.versions.get(e).add(Object.freeze(t(l))),!1===a&&(f=n(t(l),f))),this.data.set(e,f),h(this.index,this.indexes,this.delimiter,e,f,null),u=this.get(e),this.onset(u,s,d,c),u}sort(e,t=!0){return t?Object.freeze(this.limit(0,this.data.size,!0).sort(e).map((e=>Object.freeze(e)))):this.limit(0,this.data.size,!0).sort(e)}sortBy(e,t=!1){const s=[],i=[];let n;return!1===this.indexes.has(e)&&this.reindex(e),n=this.indexes.get(e),n.forEach(((e,t)=>i.push(t))),r(i.sort(),(e=>n.get(e).forEach((e=>s.push(this.get(e,t)))))),t?s:this.list(...s)}toArray(e=!0){const t=Array.from(this.data.values());return e&&(r(t,(e=>Object.freeze(e))),Object.freeze(t)),t}values(){return this.data.values()}where(e,t=!1,r="||"){const s=this.index.filter((t=>t in e));return s.length>0?this.filter(new Function("a",`return (${s.map((t=>{let s;if(Array.isArray(e[t]))s=`Array.isArray(a['${t}']) ? ${e[t].map((e=>`a['${t}'].includes(${"string"==typeof e?`'${e}'`:e})`)).join(` ${r} `)} : (${e[t].map((e=>`a['${t}'] === ${"string"==typeof e?`'${e}'`:e}`)).join(` ${r} `)})`;else if(e[t]instanceof RegExp)s=`Array.isArray(a['${t}']) ? a['${t}'].filter(i => ${e[t]}.test(a['${t}'])).length > 0 : ${e[t]}.test(a['${t}'])`;else{const r="string"==typeof e[t]?`'${e[t]}'`:e[t];s=`Array.isArray(a['${t}']) ? a['${t}'].includes(${r}) : a['${t}'] === ${r}`}return s})).join(") && (")});`),t):[]}}function d(e=null,t={}){const r=new c(t);return Array.isArray(e)&&r.batch(e,"set"),r}export{d as haro}; \ No newline at end of file diff --git a/dist/haro.js b/dist/haro.js index 49eeab6..da03bb3 100644 --- a/dist/haro.js +++ b/dist/haro.js @@ -1 +1 @@ -!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).haro={})}(this,(function(e){"use strict";const t=[8,9,"a","b"];function s(e){return JSON.parse(JSON.stringify(e,null,0))}function r(e,t){for(const s of e.entries())t(s[1],s[0]);return e}function i(e="",t="|",s={}){return e.split(t).reduce(((e,r,i)=>{const n=[];return(Array.isArray(s[r])?s[r]:[s[r]]).forEach((s=>0===i?n.push(s):e.forEach((e=>n.push(`${e}${t}${s}`))))),n}),[])}function n(e,t,s,n,a){e.forEach((e=>{const h=t.get(e);r(e.includes(s)?i(e,s,a):Array.isArray(a[e])?a[e]:[a[e]],(e=>{if(h.has(e)){const t=h.get(e);t.delete(n),0===t.size&&h.delete(e)}}))}))}function a(e,t){return e instanceof Object&&t instanceof Object?r(Object.keys(t),(s=>{e[s]instanceof Object&&t[s]instanceof Object?e[s]=a(e[s],t[s]):Array.isArray(e[s])&&Array.isArray(t[s])?e[s]=e[s].concat(t[s]):e[s]=t[s]})):e=Array.isArray(e)&&Array.isArray(t)?e.concat(t):t,e}function h(){return(65536*(Math.random()+1)|0).toString(16).substring(1)}function o(e,t,s,n,a,h){r(null===h?e:[h],(e=>{const h=t.get(e);e.includes(s)?r(i(e,s,a),(e=>{!1===h.has(e)&&h.set(e,new Set),h.get(e).add(n)})):r(Array.isArray(a[e])?a[e]:[a[e]],(e=>{!1===h.has(e)&&h.set(e,new Set),h.get(e).add(n)}))}))}function c(){return h()+h()+"-"+h()+"-4"+h().substr(0,3)+"-"+t[Math.floor(4*Math.random())]+h().substr(0,3)+"-"+h()+h()+h()}class d{constructor({delimiter:e="|",id:t=c(),index:s=[],key:r="",versioning:i=!1}={}){return this.data=new Map,this.delimiter=e,this.id=t,this.index=s,this.indexes=new Map,this.key=r,this.size=0,this.versions=new Map,this.versioning=i,Object.defineProperty(this,"registry",{enumerable:!0,get:()=>Array.from(this.data.keys())}),this.reindex()}async batch(e,t="set",s=!1){let r;try{const i="del"===t?e=>this.del(e,!0,s):e=>this.set(null,e,!0,!0,s);r=await Promise.all(this.beforeBatch(e,t).map(i)),r=this.onbatch(r,t)}catch(e){throw this.onerror("batch",e),e}return r}beforeBatch(e){return e}beforeClear(){}beforeDelete(){}beforeSet(){}clear(){return this.beforeClear(),this.size=0,this.data.clear(),this.indexes.clear(),this.versions.clear(),this.reindex().onclear(),this}del(e,t=!1,s=!1,r=!1){if(!1===this.has(e))throw new Error("Record not found");const i=this.get(e,!0);this.beforeDelete(e,t,s,r),n(this.index,this.indexes,this.delimiter,e,i),this.data.delete(e),--this.size,this.ondelete(e,t,r,s),this.versioning&&this.versions.delete(e)}dump(e="records"){let t;return t="records"===e?Array.from(this.entries()):Array.from(this.indexes).map((e=>(e[1]=Array.from(e[1]).map((e=>(e[1]=Array.from(e[1]),e))),e))),t}entries(){return this.data.entries()}find(e={},t=!1){const s=Object.keys(e).sort(((e,t)=>e.localeCompare(t))).join(this.delimiter),r=this.indexes.get(s)||new Map;let n=[];if(r.size>0){const a=i(s,this.delimiter,e);n=Array.from(a.reduce(((e,t)=>(r.has(t)&&r.get(t).forEach((t=>e.add(t))),e)),new Set)).map((e=>this.get(e,t)))}return t?n:this.list(...n)}filter(e=(()=>{}),t=!1){const s=t?(e,t)=>t:(e,t)=>Object.freeze([e,Object.freeze(t)]),r=this.reduce(((t,r,i,n)=>(e.call(n,r)&&t.push(s(i,r)),t)),[]);return t?r:Object.freeze(r)}forEach(e,t){return this.data.forEach(((t,r)=>e(s(t),s(r))),t||this.data),this}get(e,t=!1){const r=s(this.data.get(e)||null);return t?r:this.list(e,r)}has(e){return this.data.has(e)}keys(){return this.data.keys()}limit(e=0,t=0,s=!1){const r=this.registry.slice(e,e+t).map((e=>this.get(e,s)));return s?r:this.list(...r)}list(...e){return Object.freeze(e.map((e=>Object.freeze(e))))}map(e,t=!1){const s=[];return this.forEach(((t,r)=>s.push(e(t,r)))),t?s:this.list(...s)}onbatch(e){return e}onclear(){}ondelete(){}onerror(){}onset(){}async override(e,t="records"){if("indexes"===t)this.indexes=new Map(e.map((e=>[e[0],new Map(e[1].map((e=>[e[0],new Set(e[1])])))])));else{if("records"!==t)throw new Error("Invalid type");this.indexes.clear(),this.data=new Map(e),this.size=this.data.size}return!0}reduce(e,t,s=!1){let r=t||this.data.keys().next().value;return this.forEach(((t,i)=>{r=e(r,t,i,this,s)}),this),r}reindex(e){const t=e?[e]:this.index;return e&&!1===this.index.includes(e)&&this.index.push(e),r(t,(e=>this.indexes.set(e,new Map))),this.forEach(((e,s)=>r(t,(t=>o(this.index,this.indexes,this.delimiter,s,e,t))))),this}search(e,t,s=!1){const i=new Map,n="function"==typeof e,a=e&&"function"==typeof e.test;return e&&r(t?Array.isArray(t)?t:[t]:this.index,(t=>{let r=this.indexes.get(t);r&&r.forEach(((r,h)=>{switch(!0){case n&&e(h,t):case a&&e.test(Array.isArray(h)?h.join(", "):h):case h===e:r.forEach((e=>{!1===i.has(e)&&this.has(e)&&i.set(e,this.get(e,s))}))}}))})),s?Array.from(i.values()):this.list(...Array.from(i.values()))}async set(e,t,r=!1,i=!1,h=!1,d=!1){let l,f,u=s(t);return null==e&&(e=this.key&&void 0!==u[this.key]?u[this.key]:c()),this.beforeSet(e,t,r,i,h,d),!1===this.has(e)?(++this.size,this.versioning&&this.versions.set(e,new Set)):(l=this.get(e,!0),n(this.index,this.indexes,this.delimiter,e,l),this.versioning&&this.versions.get(e).add(Object.freeze(s(l))),!1===i&&(u=a(s(l),u))),this.data.set(e,u),o(this.index,this.indexes,this.delimiter,e,u,null),f=this.get(e),this.onset(f,r,d,h),f}sort(e,t=!0){return t?Object.freeze(this.limit(0,this.size,!0).sort(e).map((e=>Object.freeze(e)))):this.limit(0,this.size,!0).sort(e)}sortBy(e,t=!1){const s=[],i=[];let n;return!1===this.indexes.has(e)&&this.reindex(e),n=this.indexes.get(e),n.forEach(((e,t)=>i.push(t))),r(i.sort(),(e=>n.get(e).forEach((e=>s.push(this.get(e,t)))))),t?s:this.list(...s)}toArray(e=!0){const t=Array.from(this.data.values());return e&&(r(t,(e=>Object.freeze(e))),Object.freeze(t)),t}values(){return this.data.values()}where(e,t=!1,s="||"){const r=this.index.filter((t=>t in e));return r.length>0?this.filter(new Function("a",`return (${r.map((t=>{let r;if(Array.isArray(e[t]))r=`Array.isArray(a['${t}']) ? ${e[t].map((e=>`a['${t}'].includes(${"string"==typeof e?`'${e}'`:e})`)).join(` ${s} `)} : (${e[t].map((e=>`a['${t}'] === ${"string"==typeof e?`'${e}'`:e}`)).join(` ${s} `)})`;else if(e[t]instanceof RegExp)r=`Array.isArray(a['${t}']) ? a['${t}'].filter(i => ${e[t]}.test(a['${t}'])).length > 0 : ${e[t]}.test(a['${t}'])`;else{const s="string"==typeof e[t]?`'${e[t]}'`:e[t];r=`Array.isArray(a['${t}']) ? a['${t}'].includes(${s}) : a['${t}'] === ${s}`}return r})).join(") && (")});`),t):[]}}e.haro=function(e=null,t={}){const s=new d(t);return Array.isArray(e)&&s.batch(e,"set"),s},Object.defineProperty(e,"__esModule",{value:!0})})); \ No newline at end of file +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).haro={})}(this,(function(e){"use strict";const t=[8,9,"a","b"];function r(e){return JSON.parse(JSON.stringify(e,null,0))}function s(e,t){for(const r of e.entries())t(r[1],r[0]);return e}function i(e="",t="|",r={}){return e.split(t).reduce(((e,s,i)=>{const n=[];return(Array.isArray(r[s])?r[s]:[r[s]]).forEach((r=>0===i?n.push(r):e.forEach((e=>n.push(`${e}${t}${r}`))))),n}),[])}function n(e,t,r,n,a){e.forEach((e=>{const h=t.get(e);s(e.includes(r)?i(e,r,a):Array.isArray(a[e])?a[e]:[a[e]],(e=>{if(h.has(e)){const t=h.get(e);t.delete(n),0===t.size&&h.delete(e)}}))}))}function a(e,t){return e instanceof Object&&t instanceof Object?s(Object.keys(t),(r=>{e[r]instanceof Object&&t[r]instanceof Object?e[r]=a(e[r],t[r]):Array.isArray(e[r])&&Array.isArray(t[r])?e[r]=e[r].concat(t[r]):e[r]=t[r]})):e=Array.isArray(e)&&Array.isArray(t)?e.concat(t):t,e}function h(){return(65536*(Math.random()+1)|0).toString(16).substring(1)}function o(e,t,r,n,a,h){s(null===h?e:[h],(e=>{const h=t.get(e);e.includes(r)?s(i(e,r,a),(e=>{!1===h.has(e)&&h.set(e,new Set),h.get(e).add(n)})):s(Array.isArray(a[e])?a[e]:[a[e]],(e=>{!1===h.has(e)&&h.set(e,new Set),h.get(e).add(n)}))}))}function c(){return h()+h()+"-"+h()+"-4"+h().substr(0,3)+"-"+t[Math.floor(4*Math.random())]+h().substr(0,3)+"-"+h()+h()+h()}class d{constructor({delimiter:e="|",id:t=c(),index:r=[],key:s="",versioning:i=!1}={}){return this.data=new Map,this.delimiter=e,this.id=t,this.index=r,this.indexes=new Map,this.key=s,this.versions=new Map,this.versioning=i,Object.defineProperty(this,"registry",{enumerable:!0,get:()=>Array.from(this.data.keys())}),Object.defineProperty(this,"size",{enumerable:!0,get:()=>this.data.size}),this.reindex()}async batch(e,t="set",r=!1){let s;try{const i="del"===t?e=>this.del(e,!0,r):e=>this.set(null,e,!0,!0,r);s=await Promise.all(this.beforeBatch(e,t).map(i)),s=this.onbatch(s,t)}catch(e){throw this.onerror("batch",e),e}return s}beforeBatch(e){return e}beforeClear(){}beforeDelete(){}beforeSet(){}clear(){return this.beforeClear(),this.data.clear(),this.indexes.clear(),this.versions.clear(),this.reindex().onclear(),this}del(e,t=!1,r=!1,s=!1){if(!1===this.has(e))throw new Error("Record not found");const i=this.get(e,!0);this.beforeDelete(e,t,r,s),n(this.index,this.indexes,this.delimiter,e,i),this.data.delete(e),this.ondelete(e,t,s,r),this.versioning&&this.versions.delete(e)}dump(e="records"){let t;return t="records"===e?Array.from(this.entries()):Array.from(this.indexes).map((e=>(e[1]=Array.from(e[1]).map((e=>(e[1]=Array.from(e[1]),e))),e))),t}entries(){return this.data.entries()}find(e={},t=!1){const r=Object.keys(e).sort(((e,t)=>e.localeCompare(t))).join(this.delimiter),s=this.indexes.get(r)||new Map;let n=[];if(s.size>0){const a=i(r,this.delimiter,e);n=Array.from(a.reduce(((e,t)=>(s.has(t)&&s.get(t).forEach((t=>e.add(t))),e)),new Set)).map((e=>this.get(e,t)))}return t?n:this.list(...n)}filter(e=(()=>{}),t=!1){const r=t?(e,t)=>t:(e,t)=>Object.freeze([e,Object.freeze(t)]),s=this.reduce(((t,s,i,n)=>(e.call(n,s)&&t.push(r(i,s)),t)),[]);return t?s:Object.freeze(s)}forEach(e,t){return this.data.forEach(((t,s)=>e(r(t),r(s))),t||this.data),this}get(e,t=!1){const s=r(this.data.get(e)||null);return t?s:this.list(e,s)}has(e){return this.data.has(e)}keys(){return this.data.keys()}limit(e=0,t=0,r=!1){const s=this.registry.slice(e,e+t).map((e=>this.get(e,r)));return r?s:this.list(...s)}list(...e){return Object.freeze(e.map((e=>Object.freeze(e))))}map(e,t=!1){const r=[];return this.forEach(((t,s)=>r.push(e(t,s)))),t?r:this.list(...r)}onbatch(e){return e}onclear(){}ondelete(){}onerror(){}onset(){}async override(e,t="records"){if("indexes"===t)this.indexes=new Map(e.map((e=>[e[0],new Map(e[1].map((e=>[e[0],new Set(e[1])])))])));else{if("records"!==t)throw new Error("Invalid type");this.indexes.clear(),this.data=new Map(e)}return!0}reduce(e,t,r=!1){let s=t||this.data.keys().next().value;return this.forEach(((t,i)=>{s=e(s,t,i,this,r)}),this),s}reindex(e){const t=e?[e]:this.index;return e&&!1===this.index.includes(e)&&this.index.push(e),s(t,(e=>this.indexes.set(e,new Map))),this.forEach(((e,r)=>s(t,(t=>o(this.index,this.indexes,this.delimiter,r,e,t))))),this}search(e,t,r=!1){const i=new Map,n="function"==typeof e,a=e&&"function"==typeof e.test;return e&&s(t?Array.isArray(t)?t:[t]:this.index,(t=>{let s=this.indexes.get(t);s&&s.forEach(((s,h)=>{switch(!0){case n&&e(h,t):case a&&e.test(Array.isArray(h)?h.join(", "):h):case h===e:s.forEach((e=>{!1===i.has(e)&&this.has(e)&&i.set(e,this.get(e,r))}))}}))})),r?Array.from(i.values()):this.list(...Array.from(i.values()))}async set(e,t,s=!1,i=!1,h=!1,d=!1){let l,f,u=r(t);return null==e&&(e=this.key&&void 0!==u[this.key]?u[this.key]:c()),this.beforeSet(e,t,s,i,h,d),!1===this.has(e)?this.versioning&&this.versions.set(e,new Set):(l=this.get(e,!0),n(this.index,this.indexes,this.delimiter,e,l),this.versioning&&this.versions.get(e).add(Object.freeze(r(l))),!1===i&&(u=a(r(l),u))),this.data.set(e,u),o(this.index,this.indexes,this.delimiter,e,u,null),f=this.get(e),this.onset(f,s,d,h),f}sort(e,t=!0){return t?Object.freeze(this.limit(0,this.data.size,!0).sort(e).map((e=>Object.freeze(e)))):this.limit(0,this.data.size,!0).sort(e)}sortBy(e,t=!1){const r=[],i=[];let n;return!1===this.indexes.has(e)&&this.reindex(e),n=this.indexes.get(e),n.forEach(((e,t)=>i.push(t))),s(i.sort(),(e=>n.get(e).forEach((e=>r.push(this.get(e,t)))))),t?r:this.list(...r)}toArray(e=!0){const t=Array.from(this.data.values());return e&&(s(t,(e=>Object.freeze(e))),Object.freeze(t)),t}values(){return this.data.values()}where(e,t=!1,r="||"){const s=this.index.filter((t=>t in e));return s.length>0?this.filter(new Function("a",`return (${s.map((t=>{let s;if(Array.isArray(e[t]))s=`Array.isArray(a['${t}']) ? ${e[t].map((e=>`a['${t}'].includes(${"string"==typeof e?`'${e}'`:e})`)).join(` ${r} `)} : (${e[t].map((e=>`a['${t}'] === ${"string"==typeof e?`'${e}'`:e}`)).join(` ${r} `)})`;else if(e[t]instanceof RegExp)s=`Array.isArray(a['${t}']) ? a['${t}'].filter(i => ${e[t]}.test(a['${t}'])).length > 0 : ${e[t]}.test(a['${t}'])`;else{const r="string"==typeof e[t]?`'${e[t]}'`:e[t];s=`Array.isArray(a['${t}']) ? a['${t}'].includes(${r}) : a['${t}'] === ${r}`}return s})).join(") && (")});`),t):[]}}e.haro=function(e=null,t={}){const r=new d(t);return Array.isArray(e)&&r.batch(e,"set"),r},Object.defineProperty(e,"__esModule",{value:!0})})); \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index a3f492c..9550013 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,11 +1,11 @@ { "name": "haro", - "version": "13.0.0", + "version": "13.0.1", "lockfileVersion": 2, "requires": true, "packages": { "": { - "version": "13.0.0", + "version": "13.0.1", "license": "BSD-3-Clause", "devDependencies": { "auto-changelog": "^2.2.0", diff --git a/package.json b/package.json index 97ef86b..eba89d3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "haro", - "version": "13.0.0", + "version": "13.0.1", "description": "Haro is a modern immutable DataStore", "source": "src/haro.js", "browser": "dist/haro.js", diff --git a/src/haro.js b/src/haro.js index 551994c..39e305d 100644 --- a/src/haro.js +++ b/src/haro.js @@ -102,7 +102,6 @@ class Haro { this.index = index; this.indexes = new Map(); this.key = key; - this.size = 0; this.versions = new Map(); this.versioning = versioning; @@ -111,6 +110,11 @@ class Haro { get: () => Array.from(this.data.keys()) }); + Object.defineProperty(this, "size", { + enumerable: true, + get: () => this.data.size + }); + return this.reindex(); } @@ -145,7 +149,6 @@ class Haro { clear () { this.beforeClear(); - this.size = 0; this.data.clear(); this.indexes.clear(); this.versions.clear(); @@ -164,7 +167,6 @@ class Haro { this.beforeDelete(key, batch, lazyLoad, retry); delIndex(this.index, this.indexes, this.delimiter, key, og); this.data.delete(key); - --this.size; this.ondelete(key, batch, retry, lazyLoad); if (this.versioning) { @@ -291,7 +293,6 @@ class Haro { } else if (type === "records") { this.indexes.clear(); this.data = new Map(data); - this.size = this.data.size; } else { throw new Error("Invalid type"); } @@ -365,8 +366,6 @@ class Haro { this.beforeSet(key, data, batch, override, lazyLoad, retry); if (this.has(key) === false) { - ++this.size; - if (this.versioning) { this.versions.set(key, new Set()); } @@ -392,7 +391,7 @@ class Haro { } sort (fn, frozen = true) { - return frozen ? Object.freeze(this.limit(0, this.size, true).sort(fn).map(i => Object.freeze(i))) : this.limit(0, this.size, true).sort(fn); + return frozen ? Object.freeze(this.limit(0, this.data.size, true).sort(fn).map(i => Object.freeze(i))) : this.limit(0, this.data.size, true).sort(fn); } sortBy (index, raw = false) {