UNPKG

tinybase

Version:

A reactive data store and sync engine.

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