UNPKG

tinybase

Version:

A reactive data store and sync engine.

2 lines (1 loc) 4.45 kB
const t=t=>(e,a,n)=>t(e)?n?.():a(e),e=t=>null==t,a=t=>void 0===t,n=t=>null===t,s=t(e),r=t(a),o=t=>Array.isArray(t),i=t=>t.length,c=t=>{throw Error(t)},d=async(t,e,a)=>{try{return await t()}catch(t){e?.(t)}},u=(t,e)=>t.forEach(e),y=(t,...e)=>t.push(...e),l=t=>t.shift(),g=Object,w=t=>g.getPrototypeOf(t),h=g.entries,v=g.keys,p=g.freeze,f=(t=[])=>g.fromEntries(t),C=(t,e)=>r(t,t=>t[e]),A=(t,e)=>e in t,S=(t,e)=>(delete t[e],t),b=(t,e)=>f(((t,e)=>((t,e)=>t.map(e))(h(t),([t,a])=>e(a,t)))(t,(t,a)=>[a,e(t,a)])),L=t=>i(v(t)),M=t=>(t=>!e(t)&&s(w(t),t=>t==g.prototype||e(w(t)),()=>!0))(t)&&0==L(t),E=(t,e,a)=>(A(t,e)||(t[e]=a()),t[e]),P=t=>a(t)||0==(t=>t?.size??0)(t),m=(t,e)=>t?.forEach(e),D=(t,e)=>t?.delete(e),T=Map,z=t=>new T(t),O=(t,e)=>t?.get(e),j=(t,e,n)=>a(n)?(D(t,e),t):t?.set(e,n),k=(t,e,a,n)=>{var s,r;return s=t,r=e,s?.has(r)?n?.(O(t,e)):j(t,e,a()),O(t,e)},x=(t,e,a,n,s=0)=>r((a?k:O)(t,e[s],s>i(e)-2?a:z),r=>{if(s>i(e)-2)return n?.(r)&&j(t,e[s]),r;const o=x(r,e,a,n,s+1);return P(r)&&j(t,e[s]),o}),F=/^\d+$/,H=t=>new Set(o(t)||a(t)?t:[t]),$=z(),q=z(),B=(t,e,s,g,w,h,v,f={},C=0,A=[])=>{let S,b,L,E=0,T=0,B=0;k($,A,()=>0),k(q,A,()=>[]);const G=z(),[I,J,K,N,Q]=((t=1,e,a)=>1!=t&&e.isMergeable()?[1,e.getMergeableContent,()=>e.getTransactionMergeableChanges(!a),([[t],[e]])=>!M(t)||!M(e),e.setDefaultContent]:2!=t?[0,e.getContent,e.getTransactionChanges,([t,e])=>!M(t)||!M(e),e.setContent]:c("Store type not supported by this Persister"))(v,t,C),[R,U,V]=(()=>{let t;const[e,a]=(()=>{const t=[];let e=0;return[a=>(a?l(t):null)??""+e++,e=>{F.test(e)&&i(t)<1e3&&y(t,e)}]})(),s=z();return[(a,n,r,o=[],i=()=>[])=>{t??=it;const c=e(1);var d,u;return j(s,c,[a,n,r,o,i]),d=x(n,r??[""],H),u=c,d?.add(u),c},(e,a,...r)=>u(((t,e=[""])=>{const a=[],s=(t,r)=>r==i(e)?y(a,t):n(e[r])?m(t,t=>s(t,r+1)):u([e[r],null],e=>s(O(t,e),r+1));return s(t,0),a})(e,a),e=>m(e,e=>O(s,e)[0](t,...a??[],...r))),t=>r(O(s,t),([,e,n])=>(x(e,n??[""],void 0,e=>(D(e,t),P(e)?1:0)),j(s,t),a(t),n)),e=>r(O(s,e),([e,,a=[],s,r])=>{const o=(...c)=>{const d=i(c);d==i(a)?e(t,...c,...r(c)):n(a[d])?u(s[d]?.(...c)??[],t=>o(...c,t)):o(...c,a[d])};o()})]})(),W=t=>{t!=E&&(E=t,U(G,void 0,E))},X=e=>{(I&&o(e?.[0])?1===e?.[2]?t.applyMergeableChanges:t.setMergeableContent:1===e?.[2]?t.applyChanges:t.setContent)(e)},Y=async()=>{st()&&t.hadMutated?.()&&await et()},Z=async t=>(2!=E&&(W(1),T++,await ot(async()=>{await d(async()=>{const a=await e();o(a)?X(a):t?Q(t):c("Content is not an array: "+a)},()=>{t&&Q(t)}),W(0),await Y()})),it),_=async t=>(tt(),await Z(t),await d(async()=>b=await g(async(t,e)=>{e||t?2!=E&&(W(1),T++,X(e??t),W(0),await Y()):await Z()}),h),it),tt=async()=>(b&&(await d(()=>w(b),h),b=void 0),it),et=async t=>(1!=E&&(W(2),B++,await ot(async()=>{await d(()=>s(J,t),h),W(0)})),it),at=async()=>(nt(),await et(),L=t.addDidFinishTransactionListener(()=>{const t=K();N(t)&&et(t)}),it),nt=async()=>(L&&(t.delListener(L),L=void 0),it),st=()=>!a(L),rt=async(t=!1)=>{const[e,a]=t?[nt,tt]:[tt,nt];return await e(),await a(),it},ot=async(...t)=>(y(O(q,A),...t),await(async()=>{if(!O($,A)){for(j($,A,1);!a(S=l(O(q,A)));)await d(S,h);j($,A,0)}})(),it),it={load:Z,startAutoLoad:_,stopAutoLoad:tt,isAutoLoading:()=>!a(b),save:et,startAutoSave:at,stopAutoSave:nt,isAutoSaving:st,startAutoPersisting:async(t,e=!1)=>{const[a,n]=e?[at,_]:[_,at];return await a(t),await n(t),it},stopAutoPersisting:rt,getStatus:()=>E,addStatusListener:t=>R(t,G),delListener:e=>(V(e),t),schedule:ot,getStore:()=>t,destroy:()=>(O(q,A).splice(0,void 0),rt()),getStats:()=>({loads:T,saves:B}),...f};return p(it)},G=(t,e)=>[t[e].t,t[e].v],I=(t,e,n,s)=>{const r=a(e)?t:E(t,e,()=>({}));let o;return b(n,(t,e)=>{s(r,e,t)&&(o=1)}),b(r,(t,e)=>{A(n,e)||(S(r,e),o=1)}),!a(e)&&M(r)&&S(t,e),o},J=(t,e,n="tinybase",s)=>(e.change(t=>E(t,n,f)),B(t,async()=>{const t=e.doc();return 2==L(t?.[n])?G(t,n):void 0},async(t,s)=>e.change(e=>((t,e,n,s)=>{((t,e)=>{M(t[e])&&(t[e]={t:{},v:{}})})(t,e);const[o,i]=G(t,e),c=()=>{d=1};let d=1;if(r(s,([t,e])=>{d=0,b(t,(t,e)=>d?0:a(t)?S(o,e):r(o[e],e=>b(t,(t,n)=>d?0:a(t)?S(e,n):r(C(e,n),e=>b(t,(t,n)=>a(t)?S(e,n):e[n]=t),c)),c)),b(e,(t,e)=>d?0:a(t)?S(i,e):i[e]=t)}),d){const[t,e]=n();I(o,void 0,t,(t,e,a)=>I(o,e,a,(t,e,a)=>I(t,e,a,(t,e,a)=>{if(C(t,e)!==a)return t[e]=a,1}))),I(i,void 0,e,(t,e,a)=>{C(i,e)!==a&&(i[e]=a)})}})(e,n,t,s)),t=>{const a=({doc:e})=>t(G(e,n));return e.on("change",a),a},t=>{e.removeListener("change",t)},s,1,{getDocHandle:()=>e}));export{J as createAutomergePersister};