tinybase
Version:
A reactive data store and sync engine.
2 lines (1 loc) • 3.82 kB
JavaScript
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};