UNPKG

6.55 kBJavaScriptView Raw
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