tinybase
Version:
A reactive data store and sync engine.
2 lines (1 loc) • 8.37 kB
JavaScript
const a=a=>typeof a,t="tinybase",e="",n=",",s=a(e),i="true",r=(a,t,e)=>a.replace(t,e),o=Promise,c=clearInterval,l=a=>null==a,w=(a,t,e)=>l(a)?e?.():t(a),u=t=>a(t)==s,y=a=>Array.isArray(a),d=(a,t,e)=>a.slice(t,e),g=a=>a.length,v=()=>{},p=async a=>o.all(a),E=a=>{throw Error(a)},A=async(a,t,e)=>{try{return await a()}catch(a){t?.(a)}},N=(a,t)=>a.forEach(t),m=(a,t="")=>a.join(t),$=(a,t)=>a.map(t),f=a=>0==g(a),h=(a,t)=>a.filter(t),C=(a,...t)=>a.push(...t),T=a=>a.shift(),O=(a,t)=>a?.has(t)??!1,b=a=>l(a)||0==(a=>a?.size??0)(a),D=a=>[...a?.values()??[]],I=(a,t)=>a?.forEach(t),S=(a,t)=>a?.delete(t),L="_",R="_id",P="SELECT",M="WHERE",_="TABLE",F="ALTER "+_,U="FROM",j="DELETE "+U,B=P+"*"+U,J="pragma_",Y="data_version",k="schema_version",x="pragma_table_",z="CREATE "+_,G=a=>m($(((a,t="",e)=>a.split(t,e))(a,"."),a=>`"${r(a,/"/g,'""')}"`),"."),H=(a,t=[1])=>m($(a,()=>"$"+t[0]++),n),K=(a,t=i)=>M+`(${r(t,"$tableName",G(a))})`,Q=Object,V=a=>Q.getPrototypeOf(a),W=Q.entries,X=Q.keys,q=Q.freeze,Z=(a=[])=>Q.fromEntries(a),aa=(...a)=>Q.assign({},...a),ta=(a,t)=>(delete a[t],a),ea=(a,t)=>$(W(a),([a,e])=>t(e,a)),na=(a,t)=>Z(ea(a,(a,e)=>[e,t(a,e)])),sa=a=>Q.values(a),ia=a=>g(X(a)),ra=a=>(a=>!l(a)&&w(V(a),a=>a==Q.prototype||l(V(a)),()=>!0))(a)&&0==ia(a),oa=a=>new Map(a),ca=(a,t)=>a?.get(t),la=(a,t)=>$([...a?.entries()??[]],([a,e])=>t(e,a)),wa=(a,t,e)=>l(e)?(S(a,t),a):a?.set(t,e),ua=(a,t,e,n)=>(O(a,t)?n?.(ca(a,t)):wa(a,t,e()),ca(a,t)),ya=(a,t,e,n,s=0)=>w((e?ua:ca)(a,t[s],s>g(t)-2?e:oa),i=>{if(s>g(t)-2)return n?.(i)&&wa(a,t[s]),i;const r=ya(i,t,e,n,s+1);return b(i)&&wa(a,t[s]),r}),da=a=>new Set(y(a)||l(a)?a:[a]),ga=(a,t)=>a?.add(t),va="ColumnName",pa="store",Ea="json",Aa=pa+"TableName",Na=pa+"Id"+va,ma=pa+va,$a="autoLoadIntervalSeconds",fa="rowId"+va,ha="tableId",Ca="tableName",Ta="deleteEmptyColumns",Oa="deleteEmptyTable",ba="condition",Da={mode:Ea,[$a]:1},Ia={load:0,save:0,[Ca]:t+"_values"},Sa=(a,t,e,n,s)=>{const i=oa();return na(a,(a,r)=>{const o=d(sa(aa(t,u(a)?{[e]:a}:a)),0,ia(t));l(o[0])||n(r,o[0])||(s(r,o[0]),wa(i,r,o))}),i},La=JSON.stringify,Ra=JSON.parse,Pa=/^\d+$/,Ma=oa(),_a=oa(),Fa=(a,t,n,s,i,r,o,c={},u=0,d=[])=>{let v,p,m,$=0,f=0,h=0;ua(Ma,d,()=>0),ua(_a,d,()=>[]);const O=oa(),[D,L,R,P,M]=((a=1,t,e)=>1!=a&&t.isMergeable()?[1,t.getMergeableContent,()=>t.getTransactionMergeableChanges(!e),([[a],[t]])=>!ra(a)||!ra(t),t.setDefaultContent]:2!=a?[0,t.getContent,t.getTransactionChanges,([a,t])=>!ra(a)||!ra(t),t.setContent]:E("Store type not supported by this Persister"))(o,a,u),[_,F,U]=(()=>{let a;const[t,n]=(()=>{const a=[];let t=0;return[n=>(n?T(a):null)??e+t++,t=>{Pa.test(t)&&g(a)<1e3&&C(a,t)}]})(),s=oa();return[(n,i,r,o=[],c=()=>[])=>{a??=Q;const l=t(1);return wa(s,l,[n,i,r,o,c]),ga(ya(i,r??[e],da),l),l},(t,n,...i)=>N(((a,t=[e])=>{const n=[],s=(a,e)=>e==g(t)?C(n,a):null===t[e]?I(a,a=>s(a,e+1)):N([t[e],null],t=>s(ca(a,t),e+1));return s(a,0),n})(t,n),t=>I(t,t=>ca(s,t)[0](a,...n??[],...i))),a=>w(ca(s,a),([,t,i])=>(ya(t,i??[e],void 0,t=>(S(t,a),b(t)?1:0)),wa(s,a),n(a),i)),t=>w(ca(s,t),([t,,e=[],n,s])=>{const i=(...r)=>{const o=g(r);o==g(e)?t(a,...r,...s(r)):l(e[o])?N(n[o]?.(...r)??[],a=>i(...r,a)):i(...r,e[o])};i()})]})(),j=a=>{a!=$&&($=a,F(O,void 0,$))},B=t=>{(D&&y(t?.[0])?1===t?.[2]?a.applyMergeableChanges:a.setMergeableContent:1===t?.[2]?a.applyChanges:a.setContent)(t)},J=async a=>(2!=$&&(j(1),f++,await K(async()=>{await A(async()=>{const e=await t();y(e)?B(e):a?M(a):E("Content is not an array: "+e)},()=>{a&&M(a)}),j(0)})),Q),Y=async a=>(k(),await J(a),await A(async()=>p=await s(async(a,t)=>{t||a?2!=$&&(j(1),f++,B(t??a),j(0)):await J()}),r),Q),k=async()=>(p&&(await A(()=>i(p),r),p=void 0),Q),x=async a=>(1!=$&&(j(2),h++,await K(async()=>{await A(()=>n(L,a),r),j(0)})),Q),z=async()=>(G(),await x(),m=a.addDidFinishTransactionListener(()=>{const a=R();P(a)&&x(a)}),Q),G=async()=>(m&&(a.delListener(m),m=void 0),Q),H=async(a=!1)=>{const[t,e]=a?[G,k]:[k,G];return await t(),await e(),Q},K=async(...a)=>(C(ca(_a,d),...a),await(async()=>{if(!ca(Ma,d)){for(wa(Ma,d,1);!l(v=T(ca(_a,d)));)await A(v,r);wa(Ma,d,0)}})(),Q),Q={load:J,startAutoLoad:Y,stopAutoLoad:k,isAutoLoading:()=>!l(p),save:x,startAutoSave:z,stopAutoSave:G,isAutoSaving:()=>!l(m),startAutoPersisting:async(a,t=!1)=>{const[e,n]=t?[z,Y]:[Y,z];return await e(a),await n(a),Q},stopAutoPersisting:H,getStatus:()=>$,addStatusListener:a=>_(a,O),delListener:t=>(U(t),a),schedule:K,getStore:()=>a,destroy:()=>(ca(_a,d).splice(0,void 0),H()),getStats:()=>({loads:f,saves:h}),...c};return q(Q)},Ua=(a,t,e,s,r,o=ja,c,w)=>{const u=oa();return[async()=>{u.clear(),$(await e(a,t),({tn:a,cn:t})=>ga(ua(u,a,da),t))},async(t,e,n)=>((a,t)=>O(ca(u,a),t))(t,e)?Z(h($(await a(B+G(t)+K(t,n)),a=>[a[e],w?na(ta(a,e),w):ta(a,e)]),([a,t])=>!l(a)&&!ra(t))):{},async(t,e,s,w,y,d=!1,g=i)=>{const v=da();na(s??{},a=>$(X(a??{}),a=>ga(v,a)));const E=D(v);if(!d&&y&&g==i&&f(E)&&O(u,t))return await a("DROP "+_+G(t)),void wa(u,t);const A=ca(u,t),N=da(D(A));if(f(E)||(O(u,t)?await p($([e,...E],async(n,s)=>{S(N,n)||(await a(F+G(t)+"ADD"+G(n)+r),0==s&&await a("CREATE UNIQUE INDEX pk ON "+G(t)+`(${G(e)})`),ga(A,n))})):(await a(z+G(t)+`(${G(e)}${r} PRIMARY KEY${m($(E,a=>n+G(a)+r))});`),wa(u,t,da([e,...E])))),await p([...!d&&w?$(D(N),async n=>{n!=e&&(await a(F+G(t)+"DROP"+G(n)),S(A,n))}):[]]),d)l(s)?await a(j+G(t)+K(t,g)):await p(ea(s,async(n,s)=>{l(n)?await a(j+G(t)+K(t,g)+`AND(${G(e)}=$1)`,[s]):f(E)||await o(a,t,e,X(n),{[s]:c?$(sa(n),c):sa(n)},A)}));else if(f(E))O(u,t)&&await a(j+G(t)+K(t,g));else{const n=h(D(ca(u,t)),a=>a!=e),i={},r=[];na(s??{},(a,t)=>{i[t]=$(n,t=>c?c(a?.[t]):a?.[t]),C(r,t)}),await o(a,t,e,n,i),await a(j+G(t)+K(t,g)+`AND${G(e)}NOT IN(${H(r)})`,r)}},async t=>{let e;return await a("BEGIN"),await A(async()=>e=await t(),s),await a("END"),e}]},ja=async(a,t,e,s,i)=>{const r=[1];await a("INSERT INTO"+G(t)+"("+((...a)=>m($(a,G),n))(e,...s)+")VALUES"+m(ea(i,a=>"($"+r[0]+++","+H(a,r)+")"),n)+"ON CONFLICT("+G(e)+")DO UPDATE SET"+m($(s,a=>G(a)+"=excluded."+G(a)),n),ea(i,(a,t)=>[t,...$(a,a=>a??null)]).flat())},Ba=(a,t,e,n,s,i,r,[o,c,l],w,u,y,d,g,v)=>{const[p,E,A,N]=Ua(t,w,u,s,g,v),m=Fa(a,()=>N(async()=>{return await p(),a=(await E(o,c))[L]?.[l]??"null",Ra(a,(a,t)=>""===t?void 0:t);var a}),a=>N(async()=>{var t;await p(),await A(o,c,{[L]:{[l]:(t=a()??null,La(t,(a,t)=>void 0===t?"":t))}},!0,!0)}),e,n,s,r,{[d]:()=>y,destroy:async()=>(await m.stopAutoPersisting(),i(),m)},0,y);return m},Ja=(a,t,e,n,s,i,r,[o,c,[w,u,y]],d,g,v,E,A,N,m,$)=>{const[f,C,T,O]=Ua(t,d,g,s,A,N,m,$),b=(a,t)=>p(la(c,async([e,n,s,i,r],o)=>{t&&!(o in a)||await T(e,n,a[o],s,i,t,r)})),D=async(a,t)=>u?await T(y,R,{[L]:a},!0,!0,t):null,I=Fa(a,()=>O(async()=>{await f();const a=await(async()=>Z(h(await p(la(o,async([a,t,e],n)=>[a,await C(n,t,e)])),a=>!ra(a[1]))))(),t=await(async()=>w?(await C(y,R))[L]:{})();return ra(a)&&l(t)?void 0:[a,t]}),(a,t)=>O(async()=>{if(await f(),l(t)){const[t,e]=a();await b(t),await D(e)}else await b(t[0],!0),await D(t[1],!0)}),e,n,s,r,{[E]:()=>v,destroy:async()=>(await I.stopAutoPersisting(),i(),I)},0,v);return I},Ya=(a,n,s,r,o,l,w,y,g,v,p="getDb",E)=>{let N,m,$;const f=((a,t)=>t?async(e,n)=>(t(e,n),await a(e,n)):a)(s,l),[h,C,T,b]=(a=>{const e=(a=>aa(Da,u(a)?{[Aa]:a}:a??{}))(a),n=e[$a];if(e.mode==Ea){const a=e[Aa]??t;return[1,n,[a,e[Na]??R,e[ma]??pa],da(a)]}const{tables:{load:s={},save:r={}}={},values:o={}}=e,c=d(sa(aa(Ia,o)),0,ia(Ia)),l=c[2],w=da(l),y=da(l),g=Sa(s,{[ha]:null,[fa]:R,[ba]:i},ha,a=>O(y,a),a=>ga(w,a)),v=Sa(r,{[Ca]:null,[fa]:R,[Ta]:0,[Oa]:0,[ba]:null},Ca,(a,t)=>O(y,t),(a,t)=>ga(w,t));var p;return p=(a,t)=>t[4]??=ca(g,t[0])?.[2]??i,I(v,(a,t)=>p(0,a)),[0,n,[g,v,c],w]})(n);return(h?Ba:Ja)(a,f,a=>{let t;const e=()=>t=setInterval(()=>A(async()=>{const[{d:t,s:e,c:n}]=await f(P+` ${Y} d,${k} s,TOTAL_CHANGES() c FROM ${J}${Y} JOIN ${J}${k}`);t==N&&e==m&&n==$||(null!=N&&a(),N=t,m=e,$=n)}),1e3*C),n=()=>{N=m=$=null,c(t)},s=r(t=>{b.has(t)&&(n(),a(),e())});return e(),()=>{n(),o(s)}},a=>a(),w,y,g,T,D(b),async(a,t)=>await a(P+` t.name tn,c.name cn FROM ${x}list()t,${x}info(t.name)c ${M} t.schema='main'AND t.type IN('table','view')AND t.name IN(${H(t)})ORDER BY t.name,c.name`,t),v,p,e,E,a=>!0===a?1:!1===a?0:a,void 0)},ka="change",xa=(a,t,e,n,s)=>Ya(a,e,async(a,e=[])=>{return await(n=(n,s)=>t.all(a,e,(a,t)=>a?s(a):n(t)),new o(n));var n},a=>{const e=(t,e,n)=>a(n);return t.on(ka,e),e},a=>t.off(ka,a),n,s,v,3,t);export{xa as createSqlite3Persister};