UNPKG

tinybase

Version:

A reactive data store and sync engine.

2 lines (1 loc) 3.88 kB
const e=e=>typeof e,t="",n=e(t),r=e=>null==e,s=(e,t,n)=>r(e)?n?.():t(e),o=e=>Array.isArray(e),a=e=>e.length,i=(e,t)=>e.forEach(t),d=(e,...t)=>e.push(...t),l=e=>t=>{return n=(t,n)=>t+e(n),f(t).reduce(n,0);var n},c=e=>e?.size??0,u=l(c),R=l(u),h=(e,t)=>e?.has(t)??!1,w=e=>r(e)||0==c(e),f=e=>[...e?.values()??[]],L=e=>e.clear(),I=(e,t)=>e?.forEach(t),g=(e,t)=>e?.delete(t),p=Object.freeze,v=e=>new Map(e),y=(e,t)=>e?.get(t),b=(e,t)=>I(e,((e,n)=>t(n,e))),k=(e,t,n)=>r(n)?(g(e,t),e):e?.set(t,n),m=(e,t,n,r)=>(h(e,t)?r?.(y(e,t)):k(e,t,n()),y(e,t)),E=(e,t,n,r,o=0)=>s((n?m:y)(e,t[o],o>a(t)-2?n:v),(s=>{if(o>a(t)-2)return r?.(s)&&k(e,t[o]),s;const i=E(s,t,n,r,o+1);return w(s)&&k(e,t[o]),i})),T=e=>new Set(o(e)||r(e)?e:[e]),S=(e,t)=>e?.add(t),z=/^\d+$/,A=(()=>{const l=new WeakMap;return c=>(l.has(c)||l.set(c,(l=>{const c=v(),u=v(),A=v(),D=v(),[M,j,x]=(()=>{let e;const[n,o]=(()=>{const e=[];let n=0;return[r=>(r?e.shift():null)??t+n++,t=>{z.test(t)&&a(e)<1e3&&d(e,t)}]})(),l=v();return[(r,s,o,a=[],i=()=>[])=>{e??=Q;const d=n(1);return k(l,d,[r,s,o,a,i]),S(E(s,o??[t],T),d),d},(n,r,...s)=>i(((e,n=[t])=>{const r=[],s=(e,t)=>t==a(n)?d(r,e):null===n[t]?I(e,(e=>s(e,t+1))):i([n[t],null],(n=>s(y(e,n),t+1)));return s(e,0),r})(n,r),(t=>I(t,(t=>y(l,t)[0](e,...r??[],...s))))),e=>s(y(l,e),(([,n,r])=>(E(n,r??[t],void 0,(t=>(g(t,e),w(t)?1:0))),k(l,e),o(e),r))),t=>s(y(l,t),(([t,,n=[],s,o])=>{const d=(...l)=>{const c=a(l);c==a(n)?t(e,...l,...o(l)):r(n[c])?i(s[c]?.(...l)??[],(e=>d(...l,e))):d(...l,n[c])};d()}))]})(),[C,O,W,$,q,B,,,F,G,H,J]=((e,n,d,l,c)=>{const u=e.hasRow,R=v(),p=v(),E=v(),z=v(),A=v(),D=v(),M=(t,n,...r)=>{const s=m(D,t,T);return i(r,(t=>S(s,t)&&n&&e.callListener(t))),r},j=(t,...n)=>s(y(D,t),(r=>{i(0==a(n)?f(r):n,(t=>{e.delListener(t),g(r,t)})),w(r)&&k(D,t)})),x=(e,t)=>{k(R,e,t),h(p,e)||(k(p,e,[v(),v(),v(),v()]),k(z,e,v()),k(A,e,v()),c(E))},C=e=>{k(R,e),k(p,e),k(z,e),k(A,e),j(e),c(E)};return[()=>e,()=>{return e=R,[...e?.keys()??[]];var e},e=>b(p,e),e=>h(p,e),e=>y(R,e),e=>y(p,e),(e,t)=>k(p,e,t),x,(n,s,d,l,c)=>{x(n,s);const R=v(),w=v(),f=y(z,n),g=y(A,n),p=n=>{const i=t=>e.getCell(s,n,t),d=y(f,n),h=u(s,n)?(L=l(i,n),r(L)?void 0:L+t):void 0;var L,I,p,v;if(d===h||o(d)&&o(h)&&(p=h,a(I=d)===a(p)&&(v=(e,t)=>p[t]===e,I.every(v)))||k(R,n,[d,h]),!r(c)){const e=y(g,n),t=u(s,n)?c(i,n):void 0;e!=t&&k(w,n,t)}},m=e=>{d((()=>{I(R,(([,e],t)=>k(f,t,e))),I(w,((e,t)=>k(g,t,e)))}),R,w,f,g,e),L(R),L(w)};b(f,p),e.hasTable(s)&&i(e.getRowIds(s),(e=>{h(f,e)||p(e)})),m(!0),j(n),M(n,0,e.addRowListener(s,null,((e,t,n)=>p(n))),e.addTableListener(s,(()=>m())))},C,e=>l(e,E),()=>b(D,C),M,j]})(l,0,0,M,j),K=(e,t,n)=>s(B(e),(([s,,o])=>{if(!h(o,t)){const a=T();if(q(e)!=P(e))S(a,t);else{let e=t;for(;!r(e)&&!h(a,e);)S(a,e),e=y(s,e)}if(n)return a;k(o,t,a)}return y(o,t)})),N=(e,t)=>s(B(e),(([,,e])=>k(e,t))),P=e=>y(c,e),Q={setRelationshipDefinition:(o,a,i,d)=>{return k(c,o,i),F(o,a,((e,t)=>{const n=T(),a=T(),i=T(),[d,l]=B(o);I(t,(([e,t],c)=>{r(e)||(S(a,e),s(y(l,e),(t=>{g(t,c),w(t)&&k(l,e)}))),r(t)||(S(a,t),h(l,t)||k(l,t,T()),S(y(l,t),c)),S(n,c),k(d,c,t),b(y(D,o),(e=>{h(K(o,e),c)&&S(i,e)}))})),e(),I(n,(e=>j(u,[o,e]))),I(a,(e=>j(A,[o,e]))),I(i,(e=>{N(o,e),j(D,[o,e])}))}),e(l=d)==n?e=>e(l):l??(()=>t)),Q;var l},delRelationshipDefinition:e=>(k(c,e),G(e),Q),getStore:C,getRelationshipIds:O,forEachRelationship:e=>W((t=>e(t,(e=>l.forEachRow(q(t),e))))),hasRelationship:$,getLocalTableId:q,getRemoteTableId:P,getRemoteRowId:(e,t)=>y(B(e)?.[0],t),getLocalRowIds:(e,t)=>f(y(B(e)?.[1],t)),getLinkedRowIds:(e,t)=>r(B(e))?[t]:f(K(e,t,!0)),addRelationshipIdsListener:H,addRemoteRowIdListener:(e,t,n)=>M(n,u,[e,t]),addLocalRowIdsListener:(e,t,n)=>M(n,A,[e,t]),addLinkedRowIdsListener:(e,t,n)=>(K(e,t),M(n,D,[e,t])),delListener:e=>(N(...x(e)??[]),Q),destroy:J,getListenerStats:()=>({remoteRowId:R(u),localRowIds:R(A),linkedRowIds:R(D)})};return p(Q)})(c)),l.get(c))})();export{A as createRelationships};