UNPKG

tinybase

Version:

A reactive data store and sync engine.

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