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