tinybase 4.6.0-beta.0 → 4.6.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/lib/checkpoints.js +1 -1
- package/lib/checkpoints.js.gz +0 -0
- package/lib/cjs/checkpoints.cjs +1 -1
- package/lib/cjs/checkpoints.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-electric-sql.cjs +1 -0
- package/lib/cjs/persisters/persister-electric-sql.cjs.gz +0 -0
- package/lib/cjs/persisters/persister-partykit-server.cjs +1 -1
- package/lib/cjs/persisters/persister-partykit-server.cjs.gz +0 -0
- package/lib/cjs/tinybase.cjs +1 -1
- package/lib/cjs/tinybase.cjs.gz +0 -0
- package/lib/cjs/ui-react.cjs +1 -1
- package/lib/cjs/ui-react.cjs.gz +0 -0
- package/lib/cjs-es6/checkpoints.cjs +1 -1
- package/lib/cjs-es6/checkpoints.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-electric-sql.cjs +1 -0
- package/lib/cjs-es6/persisters/persister-electric-sql.cjs.gz +0 -0
- package/lib/cjs-es6/persisters/persister-partykit-server.cjs +1 -1
- package/lib/cjs-es6/persisters/persister-partykit-server.cjs.gz +0 -0
- package/lib/cjs-es6/tinybase.cjs +1 -1
- package/lib/cjs-es6/tinybase.cjs.gz +0 -0
- package/lib/cjs-es6/ui-react.cjs +1 -1
- package/lib/cjs-es6/ui-react.cjs.gz +0 -0
- package/lib/debug/checkpoints.js +8 -0
- package/lib/debug/persisters/persister-electric-sql.js +839 -0
- package/lib/debug/persisters/persister-partykit-server.js +45 -25
- package/lib/debug/tinybase.js +8 -0
- package/lib/debug/ui-react.js +20 -2
- package/lib/es6/checkpoints.js +1 -1
- package/lib/es6/checkpoints.js.gz +0 -0
- package/lib/es6/persisters/persister-electric-sql.js +1 -0
- package/lib/es6/persisters/persister-electric-sql.js.gz +0 -0
- package/lib/es6/persisters/persister-partykit-server.js +1 -1
- package/lib/es6/persisters/persister-partykit-server.js.gz +0 -0
- package/lib/es6/tinybase.js +1 -1
- package/lib/es6/tinybase.js.gz +0 -0
- package/lib/es6/ui-react.js +1 -1
- package/lib/es6/ui-react.js.gz +0 -0
- package/lib/persisters/persister-electric-sql.js +1 -0
- package/lib/persisters/persister-electric-sql.js.gz +0 -0
- package/lib/persisters/persister-partykit-server.js +1 -1
- package/lib/persisters/persister-partykit-server.js.gz +0 -0
- package/lib/tinybase.js +1 -1
- package/lib/tinybase.js.gz +0 -0
- package/lib/types/checkpoints.d.ts +58 -6
- package/lib/types/persisters/persister-electric-sql.d.ts +164 -0
- package/lib/types/persisters/persister-expo-sqlite-next.d.ts +2 -2
- package/lib/types/persisters/persister-partykit-server.d.ts +32 -8
- package/lib/types/persisters.d.ts +2 -0
- package/lib/types/ui-react.d.ts +56 -26
- package/lib/types/with-schemas/checkpoints.d.ts +64 -6
- package/lib/types/with-schemas/internal/ui-react.d.ts +5 -0
- package/lib/types/with-schemas/persisters/persister-electric-sql.d.ts +177 -0
- package/lib/types/with-schemas/persisters/persister-expo-sqlite-next.d.ts +2 -2
- package/lib/types/with-schemas/persisters/persister-partykit-server.d.ts +44 -10
- package/lib/types/with-schemas/persisters/persister-sqlite3.d.ts +1 -1
- package/lib/types/with-schemas/persisters.d.ts +2 -0
- package/lib/types/with-schemas/ui-react.d.ts +56 -36
- package/lib/ui-react.js +1 -1
- package/lib/ui-react.js.gz +0 -0
- package/lib/umd/checkpoints.js +1 -1
- package/lib/umd/checkpoints.js.gz +0 -0
- package/lib/umd/persisters/persister-electric-sql.js +1 -0
- package/lib/umd/persisters/persister-electric-sql.js.gz +0 -0
- package/lib/umd/persisters/persister-partykit-server.js +1 -1
- package/lib/umd/persisters/persister-partykit-server.js.gz +0 -0
- package/lib/umd/tinybase.js +1 -1
- package/lib/umd/tinybase.js.gz +0 -0
- package/lib/umd/ui-react.js +1 -1
- package/lib/umd/ui-react.js.gz +0 -0
- package/lib/umd-es6/checkpoints.js +1 -1
- package/lib/umd-es6/checkpoints.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-electric-sql.js +1 -0
- package/lib/umd-es6/persisters/persister-electric-sql.js.gz +0 -0
- package/lib/umd-es6/persisters/persister-partykit-server.js +1 -1
- package/lib/umd-es6/persisters/persister-partykit-server.js.gz +0 -0
- package/lib/umd-es6/tinybase.js +1 -1
- package/lib/umd-es6/tinybase.js.gz +0 -0
- package/lib/umd-es6/ui-react.js +1 -1
- package/lib/umd-es6/ui-react.js.gz +0 -0
- package/package.json +45 -40
- package/readme.md +2 -2
package/lib/tinybase.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const e=e=>typeof e,t="",s=e(t),n=e(!0),a=e(0),o=e(e),r="type",l="default",i="Listener",d="Result",c="add",u="Has",h="Ids",g="Table",f=g+"s",L=g+h,w="Row",v=w+"Count",I=w+h,S="Sorted"+w+h,R="Cell",T=R+h,y="Value",C=y+"s",p=y+h,b=e=>t+e,V=Math.max,m=Math.min,E=isFinite,k=e=>null==e,M=(e,t,s)=>k(e)?s?.():t(e),D=e=>e==s||e==n,J=t=>e(t)==o,A=e=>Array.isArray(e),x=(e,t,s)=>e.slice(t,s),F=e=>e.length,Q=()=>{},z=(e,t)=>e.includes(t),N=(e,t)=>e.every(t),O=(e,t)=>F(e)===F(t)&&N(e,((e,s)=>t[s]===e)),P=(e,t)=>N(e,((s,n)=>0==n||t(e[n-1],s)<=0)),j=(e,t)=>e.sort(t),W=(e,t)=>e.forEach(t),B=(e,t)=>e.map(t),H=e=>q(e,((e,t)=>e+t),0),$=e=>0==F(e),q=(e,t,s)=>e.reduce(t,s),G=(e,...t)=>e.push(...t),K=e=>e.pop(),U=e=>e.shift(),X=Object,Y=e=>X.getPrototypeOf(e),Z=X.keys,_=X.isFrozen,ee=X.freeze,te=e=>!k(e)&&M(Y(e),(e=>e==X.prototype||k(Y(e))),(()=>!0)),se=(e,t)=>!k(((e,t)=>M(e,(e=>e[t])))(e,t)),ne=(e,t)=>(delete e[t],e),ae=(e,t)=>B(X.entries(e),(([e,s])=>t(s,e))),oe=e=>te(e)&&0==(e=>F(Z(e)))(e),re=e=>e?.size??0,le=(e,t)=>e?.has(t)??!1,ie=e=>k(e)||0==re(e),de=e=>[...e?.values()??[]],ce=e=>e.clear(),ue=(e,t)=>e?.forEach(t),he=(e,t)=>e?.delete(t),ge=e=>new Map(e),fe=e=>[...e?.keys()??[]],Le=(e,t)=>e?.get(t),we=(e,t)=>ue(e,((e,s)=>t(s,e))),ve=(e,t,s)=>k(s)?(he(e,t),e):e?.set(t,s),Ie=(e,t,s)=>(le(e,t)||ve(e,t,s()),Le(e,t)),Se=(e,t,s,n=ve)=>(ae(t,((t,n)=>s(e,n,t))),we(e,(s=>se(t,s)?0:n(e,s))),e),Re=(e,t,s)=>{const n={};return ue(e,((e,a)=>{const o=t?t(e,a):e;!s?.(o,e)&&(n[a]=o)})),n},Te=(e,t,s)=>Re(e,(e=>Re(e,t,s)),oe),ye=(e,t,s)=>Re(e,(e=>Te(e,t,s)),oe),Ce=(e,t)=>{const s=ge();return ue(e,((e,n)=>s.set(n,t?.(e)??e))),s},pe=e=>Ce(e,Ce),be=e=>Ce(e,pe),Ve=(e,t,s,n,a=0)=>M((s?Ie:Le)(e,t[a],a>F(t)-2?s:ge),(o=>{if(a>F(t)-2)return n?.(o)&&ve(e,t[a]),o;const r=Ve(o,t,s,n,a+1);return ie(o)&&ve(e,t[a]),r})),me=t=>{const s=e(t);return D(s)||s==a&&E(t)?s:void 0},Ee=(e,t,s,n,a)=>k(a)?e.delCell(t,s,n,!0):e.setCell(t,s,n,a),ke=(e,t,s)=>k(s)?e.delValue(t):e.setValue(t,s),Me=e=>new Set(A(e)||k(e)?e:[e]),De=(e,t)=>e?.add(t),Je=(e,t,s,n,a)=>{const o=e.hasRow,r=ge(),l=ge(),i=ge(),d=ge(),c=ge(),u=ge(),h=(t,s,...n)=>{const a=Ie(u,t,Me);return W(n,(t=>De(a,t)&&s&&e.callListener(t))),n},g=(t,...s)=>M(Le(u,t),(n=>{W($(s)?de(n):s,(t=>{e.delListener(t),he(n,t)})),ie(n)&&ve(u,t)})),f=(e,s)=>{ve(r,e,s),le(l,e)||(ve(l,e,t()),ve(d,e,ge()),ve(c,e,ge()),a(i))},L=e=>{ve(r,e),ve(l,e),ve(d,e),ve(c,e),g(e),a(i)};return[()=>e,()=>fe(r),e=>we(l,e),e=>le(l,e),e=>Le(r,e),e=>Le(l,e),(e,t)=>ve(l,e,t),f,(t,n,a,r,l)=>{f(t,n);const i=ge(),u=ge(),L=Le(d,t),w=Le(c,t),v=t=>{const a=s=>e.getCell(n,t,s),d=Le(L,t),c=o(n,t)?s(r(a,t)):void 0;if(d===c||A(d)&&A(c)&&O(d,c)||ve(i,t,[d,c]),!k(l)){const e=Le(w,t),s=o(n,t)?l(a,t):void 0;e!=s&&ve(u,t,s)}},I=e=>{a((()=>{ue(i,(([,e],t)=>ve(L,t,e))),ue(u,((e,t)=>ve(w,t,e)))}),i,u,L,w,e),ce(i),ce(u)};we(L,v),e.hasTable(n)&&W(e.getRowIds(n),(e=>{le(L,e)||v(e)})),I(!0),g(t),h(t,0,e.addRowListener(n,null,((e,t,s)=>v(s))),e.addTableListener(n,(()=>I())))},L,e=>n(e,i),()=>we(u,L),h,g]},Ae=(n,a)=>e(n)==s?e=>e(n):n??(()=>a??t),xe=e=>{const t=new WeakMap;return s=>(t.has(s)||t.set(s,e(s)),t.get(s))},Fe=/^\d+$/,Qe=()=>{const e=[];let s=0;return[n=>(n?U(e):null)??t+s++,t=>{Fe.test(t)&&F(e)<1e3&&G(e,t)}]},ze=e=>{let s;const[n,a]=Qe(),o=ge();return[(a,r,l,i=[],d=(()=>[]))=>{s??=e();const c=n(1);return ve(o,c,[a,r,l,i,d]),De(Ve(r,l??[t],Me),c),c},(e,n,...a)=>W(((e,s=[t])=>{const n=[],a=(e,t)=>t==F(s)?G(n,e):null===s[t]?ue(e,(e=>a(e,t+1))):W([s[t],null],(s=>a(Le(e,s),t+1)));return a(e,0),n})(e,n),(e=>ue(e,(e=>Le(o,e)[0](s,...n??[],...a))))),e=>M(Le(o,e),(([,s,n])=>(Ve(s,n??[t],void 0,(t=>(he(t,e),ie(t)?1:0))),ve(o,e),a(e),n))),e=>M(Le(o,e),(([e,,t=[],n,a])=>{const o=(...r)=>{const l=F(r);l==F(t)?e(s,...r,...a(r)):k(t[l])?W(n[l]?.(...r)??[],(e=>o(...r,e))):o(...r,t[l])};o()}))]},Ne=xe((e=>{let s,n,a,o=100,r=ge(),l=ge(),i=1;const d=ge(),c=ge(),[u,h,g]=ze((()=>Q)),f=ge(),L=ge(),w=[],v=[],I=(t,s)=>{i=0,e.transaction((()=>{const[n,a]=Le(f,s);ue(n,((s,n)=>ue(s,((s,a)=>ue(s,((s,o)=>Ee(e,n,a,o,s[t]))))))),ue(a,((s,n)=>ke(e,n,s[t])))})),i=1},S=e=>{ve(f,e),ve(L,e),h(c,[e])},R=(e,t)=>W(((e,t)=>e.splice(0,t))(e,t??F(e)),S),T=()=>R(w,F(w)-o),y=()=>M(s,(()=>{G(w,s),T(),R(v),s=void 0,a=1})),C=()=>{s=K(w),a=1},p=e.addCellListener(null,null,null,((e,t,s,n,a,o)=>{if(i){y();const e=Ie(r,t,ge),l=Ie(e,s,ge),i=Ie(l,n,(()=>[o,void 0]));i[1]=a,i[0]===a&&ie(ve(l,n))&&ie(ve(e,s))&&ie(ve(r,t))&&C(),D()}})),b=e.addValueListener(null,((e,t,s,n)=>{if(i){y();const e=Ie(l,t,(()=>[n,void 0]));e[1]=s,e[0]===s&&ie(ve(l,t))&&C(),D()}})),V=(e="")=>(k(s)&&(s=t+n++,ve(f,s,[r,l]),A(s,e),r=ge(),l=ge(),a=1),s),m=()=>{$(w)||(((e,...t)=>{e.unshift(...t)})(v,V()),I(0,s),s=K(w),a=1)},E=()=>{$(v)||(G(w,s),s=U(v),I(1,s),a=1)},D=()=>{a&&(h(d),a=0)},J=e=>{const t=V(e);return D(),t},A=(e,t)=>(x(e)&&Le(L,e)!==t&&(ve(L,e,t),h(c,[e])),Q),x=e=>le(f,e),Q={setSize:e=>(o=e,T(),Q),addCheckpoint:J,setCheckpoint:A,getStore:()=>e,getCheckpointIds:()=>[[...w],s,[...v]],forEachCheckpoint:e=>we(L,e),hasCheckpoint:x,getCheckpoint:e=>Le(L,e),goBackward:()=>(m(),D(),Q),goForward:()=>(E(),D(),Q),goTo:e=>{const t=z(w,e)?m:z(v,e)?E:null;for(;!k(t)&&e!=s;)t();return D(),Q},addCheckpointIdsListener:e=>u(e,d),addCheckpointListener:(e,t)=>u(t,c,[e]),delListener:e=>(g(e),Q),clear:()=>(R(w),R(v),k(s)||S(s),s=void 0,n=0,J(),Q),destroy:()=>{e.delListener(p),e.delListener(b)},getListenerStats:()=>({})};return ee(Q.clear())})),Oe=(e,t)=>(e??0)<(t??0)?-1:1,Pe=xe((e=>{const s=ge(),n=ge(),[a,o,r]=ze((()=>S)),[l,i,d,c,u,h,g,,f,L,w,v]=Je(e,ge,(e=>k(e)?t:A(e)?B(e,b):b(e)),a,o),I=(t,s,n)=>{const a=u(t);ue(n,((t,n)=>s(n,(s=>ue(t,(t=>s(t,(s=>e.forEachCell(a,t,s)))))))))},S={setIndexDefinition:(e,t,a,r,l,i=Oe)=>{const d=k(l)?void 0:([e],[t])=>l(e,t);return f(e,t,((t,a,l,c,u,f)=>{let L=0;const w=Me(),v=Me(),I=h(e);if(ue(a,(([e,t],s)=>{const n=Me(e),a=Me(t);ue(n,(e=>he(a,e)?he(n,e):0)),ue(n,(e=>{De(w,e),M(Le(I,e),(t=>{he(t,s),ie(t)&&(ve(I,e),L=1)}))})),ue(a,(e=>{De(w,e),le(I,e)||(ve(I,e,Me()),L=1),De(Le(I,e),s),k(r)||De(v,e)}))})),t(),ie(u)||(f?we(I,(e=>De(v,e))):we(l,(e=>M(Le(c,e),(e=>De(v,e))))),ue(v,(e=>{const t=(t,s)=>i(Le(u,t),Le(u,s),e),s=[...Le(I,e)];P(s,t)||(ve(I,e,Me(j(s,t))),De(w,e))}))),(L||f)&&!k(d)){const t=[...I];P(t,d)||(g(e,ge(j(t,d))),L=1)}L&&o(s,[e]),ue(w,(t=>o(n,[e,t])))}),Ae(a),M(r,Ae)),S},delIndexDefinition:e=>(L(e),S),getStore:l,getIndexIds:i,forEachIndex:e=>d(((t,s)=>e(t,(e=>I(t,e,s))))),forEachSlice:(e,t)=>I(e,t,h(e)),hasIndex:c,hasSlice:(e,t)=>le(h(e),t),getTableId:u,getSliceIds:e=>fe(h(e)),getSliceRowIds:(e,t)=>de(Le(h(e),t)),addIndexIdsListener:w,addSliceIdsListener:(e,t)=>a(t,s,[e]),addSliceRowIdsListener:(e,t,s)=>a(s,n,[e,t]),delListener:e=>(r(e),S),destroy:v,getListenerStats:()=>({})};return ee(S)})),je=ge([["avg",[(e,t)=>H(e)/t,(e,t,s)=>e+(t-e)/(s+1),(e,t,s)=>e+(e-t)/(s-1),(e,t,s,n)=>e+(t-s)/n]],["max",[e=>V(...e),(e,t)=>V(t,e),(e,t)=>t==e?void 0:e,(e,t,s)=>s==e?void 0:V(t,e)]],["min",[e=>m(...e),(e,t)=>m(t,e),(e,t)=>t==e?void 0:e,(e,t,s)=>s==e?void 0:m(t,e)]],["sum",[e=>H(e),(e,t)=>e+t,(e,t)=>e-t,(e,t,s)=>e-s+t]]]),We=(e,t,s,n,a,o=!1)=>{if(ie(s))return;const[r,l,i,d]=a;return o||=k(e),ue(n,(([s,n])=>{o||(e=k(s)?l?.(e,n,t++):k(n)?i?.(e,s,t--):d?.(e,n,s,t),o||=k(e))})),o?r(de(s),re(s)):e},Be=xe((e=>{const s=ge(),[n,a,o]=ze((()=>v)),[r,l,i,d,c,u,h,,g,f,L,w]=Je(e,Q,(e=>isNaN(e)||k(e)||!0===e||!1===e||e===t?void 0:1*e),n,a),v={setMetricDefinition:(e,t,n,o,r,l,i)=>{const d=J(n)?[n,r,l,i]:Le(je,n)??Le(je,"sum");return g(e,t,((t,n,o,r,l,i)=>{const c=u(e),g=re(r);i||=k(c),t();let f=We(c,g,r,n,d,i);E(f)||(f=void 0),f!=c&&(h(e,f),a(s,[e],f,c))}),Ae(o,1)),v},delMetricDefinition:e=>(f(e),v),getStore:r,getMetricIds:l,forEachMetric:i,hasMetric:d,getTableId:c,getMetric:u,addMetricIdsListener:L,addMetricListener:(e,t)=>n(t,s,[e]),delListener:e=>(o(e),v),destroy:w,getListenerStats:()=>({})};return ee(v)})),He=ge(),$e=ge(),qe=(e,t,s,n,a,o,[r,l]=[],i=[])=>{let d,c,u,h=0,g=0;Ie(He,i,(()=>0)),Ie($e,i,(()=>[]));const f=async e=>(2!=h&&(h=1,await L.schedule((async()=>{await e(),h=0}))),L),L={load:async(s,n)=>await f((async()=>{try{e.setContent(await t())}catch{e.setContent([s,n])}})),startAutoLoad:async(s={},a={})=>(L.stopAutoLoad(),await L.load(s,a),g=1,u=n((async(s,n)=>{if(n){const t=n();await f((async()=>e.setTransactionChanges(t)))}else await f((async()=>{try{e.setContent(s?.()??await t())}catch(e){o?.(e)}}))})),L),stopAutoLoad:()=>(g&&(a(u),u=void 0,g=0),L),save:async t=>(1!=h&&(h=2,await L.schedule((async()=>{try{await s(e.getContent,t)}catch(e){o?.(e)}h=0}))),L),startAutoSave:async()=>(await L.stopAutoSave().save(),d=e.addDidFinishTransactionListener(((e,t)=>{const[s,n]=t();oe(s)&&oe(n)||L.save((()=>[s,n]))})),L),stopAutoSave:()=>(M(d,e.delListener),d=void 0,L),schedule:async(...e)=>(G(Le($e,i),...e),await(async()=>{if(!Le(He,i)){for(ve(He,i,1);!k(c=U(Le($e,i)));)try{await c()}catch(e){o?.(e)}ve(He,i,0)}})(),L),getStore:()=>e,destroy:()=>L.stopAutoLoad().stopAutoSave(),getStats:()=>({})};return r&&(L[r]=()=>l),ee(L)},Ge=xe((e=>{const s=e.createStore,n=s(),a=s(),o=ge(),{addListener:r,callListeners:l,delListener:u}=a,[h,f,L,y,C,,,p,,b,V,m,E,D]=Je(e,(()=>!0),Q,r,l),A=(e,t,...s)=>W(s,(s=>De(Ie(Ie(o,t,ge),e,Me),s))),z=e=>{M(Le(o,e),(e=>{we(e,((e,t)=>ue(t,(t=>e.delListener(t))))),ce(e)})),W([a,n],(t=>t.delTable(e)))},O=(e,t,s)=>A(t,e,t.addStartTransactionListener(s.startTransaction),t.addDidFinishTransactionListener((()=>s.finishTransaction()))),P={setQueryDefinition:(s,o,r)=>{p(s,o),z(s);const l=[],i=[[null,[o,null,null,[],ge()]]],d=[],c=[],u=[];r({select:(e,s)=>{const n=J(e)?[F(l)+t,e]:[k(s)?e:s,t=>t(e,s)];return G(l,n),{as:e=>n[0]=e}},join:(e,t,s)=>{const n=k(s)||J(t)?null:t,a=k(n)?t:s,o=[e,[e,n,J(a)?a:e=>e(a),[],ge()]];return G(i,o),{as:e=>o[0]=e}},where:(e,t,s)=>G(d,J(e)?e:k(s)?s=>s(e)===t:n=>n(e,t)===s),group:(e,t,s,n,a)=>{const o=[e,[e,J(t)?[t,s,n,a]:Le(je,t)??[(e,t)=>t]]];return G(c,o),{as:e=>o[0]=e}},having:(e,t)=>G(u,J(e)?e:s=>s(e)===t)});const h=ge(l);if(ie(h))return P;const g=ge(i);we(g,((e,[,t])=>M(Le(g,t),(({3:t})=>k(e)?0:G(t,e)))));const f=ge(c);let L=n;if(ie(f)&&$(u))L=a;else{O(s,L,a);const e=ge();we(f,((t,[s,n])=>De(Ie(e,s,Me),[t,n])));const t=Me();we(h,(s=>le(e,s)?0:De(t,s)));const n=ge(),o=(t,n,o,r)=>M(t,(([l,i,d,c])=>{we(n,((t,[s])=>{const n=Ie(l,t,ge),a=Le(n,o),i=r?void 0:s;if(a!==i){const s=Me([[a,i]]),r=re(n);ve(n,o,i),ue(Le(e,t),(([e,t])=>{const a=We(c[e],r,n,s,t);c[e]=k(me(a))?null:a}))}})),ie(i)||!N(u,(e=>e((e=>c[e]))))?a.delRow(s,d):k(d)?t[2]=a.addRow(s,c):a.setRow(s,d,c)}));A(L,s,L.addRowListener(s,null,((a,r,l,i)=>{const d=[],c=[],u=ge(),h=L.hasRow(s,l);let g=!h;ue(t,(e=>{const[t,n,a]=i(s,l,e);G(d,n),G(c,a),g||=t})),we(e,(e=>{const[t,,n]=i(s,l,e);(g||t)&&ve(u,e,[n])})),g&&o(Ve(n,d,void 0,(([,e])=>(he(e,l),ie(e)))),u,l,1),h&&o(Ve(n,c,(()=>{const e={};return ue(t,(t=>e[t]=L.getCell(s,l,t))),[ge(),Me(),void 0,e]}),(([,e])=>{De(e,l)})),u,l)})))}O(s,e,L);const w=(t,n,a,r)=>{const l=t=>e.getCell(n,a,t);W(r,(n=>{const[a,,o,r,i]=Le(g,n),d=o?.(l,t),[c,u]=Le(i,t)??[];d!=c&&(k(u)||D(s,u),ve(i,t,k(d)?null:[d,...E(s,1,e.addRowListener(a,d,(()=>w(t,a,d,r))))]))})),(t=>{const n=(s,n)=>e.getCell(...k(n)?[o,t,s]:s===o?[o,t,n]:[Le(g,s)?.[0],Le(Le(g,s)?.[4],t)?.[0],n]);L.transaction((()=>N(d,(e=>e(n)))?we(h,((e,a)=>Ee(L,s,t,e,a(n,t)))):L.delRow(s,t)))})(t)},{3:v}=Le(g,null);return L.transaction((()=>E(s,1,e.addRowListener(o,null,((t,n,a)=>{e.hasRow(o,a)?w(a,o,a,v):(L.delRow(s,a),ue(g,(({4:e})=>M(Le(e,a),(([,t])=>{D(s,t),ve(e,a)})))))}))))),P},delQueryDefinition:e=>(z(e),b(e),P),getStore:h,getQueryIds:f,forEachQuery:L,hasQuery:y,getTableId:C,addQueryIdsListener:e=>V((()=>e(P))),delListener:e=>(u(e),P),destroy:m,getListenerStats:()=>{const{tables:e,tableIds:t,transaction:s,...n}=a.getListenerStats();return n}};return ae({[g]:[1,1],[g+T]:[0,1],[v]:[0,1],[I]:[0,1],[S]:[0,5],[w]:[1,2],[T]:[0,2],[R]:[1,3]},(([e,t],s)=>{W(e?["get","has","forEach"]:["get"],(e=>P[e+d+s]=(...t)=>a[e+s](...t))),P[c+d+s+i]=(...e)=>a[c+s+i](...x(e,0,t),((s,...n)=>e[t](P,...n)),!0)})),ee(P)})),Ke=xe((e=>{const s=ge(),n=ge(),a=ge(),o=ge(),[r,l,i]=ze((()=>y)),[d,c,u,h,g,f,,,L,w,v,I]=Je(e,(()=>[ge(),ge(),ge(),ge()]),(e=>k(e)?void 0:e+t),r,l),S=(e,t,s)=>M(f(e),(([n,,a])=>{if(!le(a,t)){const o=Me();if(g(e)!=T(e))De(o,t);else{let e=t;for(;!k(e)&&!le(o,e);)De(o,e),e=Le(n,e)}if(s)return o;ve(a,t,o)}return Le(a,t)})),R=(e,t)=>M(f(e),(([,,e])=>ve(e,t))),T=e=>Le(s,e),y={setRelationshipDefinition:(e,t,r,i)=>(ve(s,e,r),L(e,t,((t,s)=>{const r=Me(),i=Me(),d=Me(),[c,u]=f(e);ue(s,(([t,s],n)=>{k(t)||(De(i,t),M(Le(u,t),(e=>{he(e,n),ie(e)&&ve(u,t)}))),k(s)||(De(i,s),le(u,s)||ve(u,s,Me()),De(Le(u,s),n)),De(r,n),ve(c,n,s),we(Le(o,e),(t=>{le(S(e,t),n)&&De(d,t)}))})),t(),ue(r,(t=>l(n,[e,t]))),ue(i,(t=>l(a,[e,t]))),ue(d,(t=>{R(e,t),l(o,[e,t])}))}),Ae(i)),y),delRelationshipDefinition:e=>(ve(s,e),w(e),y),getStore:d,getRelationshipIds:c,forEachRelationship:t=>u((s=>t(s,(t=>e.forEachRow(g(s),t))))),hasRelationship:h,getLocalTableId:g,getRemoteTableId:T,getRemoteRowId:(e,t)=>Le(f(e)?.[0],t),getLocalRowIds:(e,t)=>de(Le(f(e)?.[1],t)),getLinkedRowIds:(e,t)=>k(f(e))?[t]:de(S(e,t,!0)),addRelationshipIdsListener:v,addRemoteRowIdListener:(e,t,s)=>r(s,n,[e,t]),addLocalRowIdsListener:(e,t,s)=>r(s,a,[e,t]),addLinkedRowIdsListener:(e,t,s)=>(S(e,t),r(s,o,[e,t])),delListener:e=>(R(...i(e)??[]),y),destroy:I,getListenerStats:()=>({})};return ee(y)})),Ue=e=>[e,e],Xe=()=>[ge(),ge()],Ye=e=>[...e],Ze=([e,t])=>e===t,_e=e=>JSON.stringify(e,((e,t)=>t instanceof Map?X.fromEntries([...t]):t)),et=JSON.parse,tt=(e,t,s)=>k(e)||!te(e)||oe(e)||_(e)?(s?.(),!1):(ae(e,((s,n)=>{t(s,n)||ne(e,n)})),!oe(e)),st=(e,t,s)=>ve(e,t,Le(e,t)==-s?void 0:s),nt=()=>{let e,t,s=!1,n=!1,o=!1,d=!1,h=0;const S=ge(),V=ge(),m=ge(),E=ge(),A=ge(),F=ge(),Q=ge(),N=ge(),P=ge(),H=ge(),$=ge(),q=ge(),K=ge(),U=ge(),X=Me(),Y=ge(),Z=ge(),_=ge(),te=ge(),de=Xe(),Ve=Xe(),Je=Xe(),Ae=Xe(),xe=Xe(),Fe=Xe(),Ne=Xe(),Pe=Xe(),je=Xe(),We=Xe(),Be=Xe(),He=Xe(),$e=Xe(),qe=Xe(),Ge=Xe(),Ke=Xe(),at=Xe(),ot=Xe(),rt=Xe(),lt=Xe(),it=Xe(),dt=Xe(),ct=ge(),ut=Xe(),[ht,gt,ft,Lt]=ze((()=>zs)),wt=e=>{if(!tt(e,((e,t)=>z([r,l],t))))return!1;const t=e[r];return!(!D(t)&&t!=a||(me(e[l])!=t&&ne(e,l),0))},vt=(t,s)=>(!e||le($,s)||Gt(s))&&tt(t,((e,t)=>It(s,t,e)),(()=>Gt(s))),It=(e,t,s,n)=>tt(n?s:yt(s,e,t),((n,a)=>M(St(e,t,a,n),(e=>(s[a]=e,!0)),(()=>!1))),(()=>Gt(e,t))),St=(t,s,n,a)=>e?M(Le(Le($,t),n),(e=>me(a)!=e[r]?Gt(t,s,n,a,e[l]):a),(()=>Gt(t,s,n,a))):k(me(a))?Gt(t,s,n,a):a,Rt=(e,t)=>tt(t?e:Ct(e),((t,s)=>M(Tt(s,t),(t=>(e[s]=t,!0)),(()=>!1))),(()=>Kt())),Tt=(e,s)=>t?M(Le(K,e),(t=>me(s)!=t[r]?Kt(e,s,t[l]):s),(()=>Kt(e,s))):k(me(s))?Kt(e,s):s,yt=(e,t,s)=>(M(Le(q,t),(([n,a])=>{ue(n,((t,s)=>{se(e,s)||(e[s]=t)})),ue(a,(n=>{se(e,n)||Gt(t,s,n)}))})),e),Ct=e=>(t&&(ue(U,((t,s)=>{se(e,s)||(e[s]=t)})),ue(X,(t=>{se(e,t)||Kt(t)}))),e),pt=e=>Se($,e,((e,t,s)=>{const n=ge(),a=Me();Se(Ie($,t,ge),s,((e,t,s)=>{ve(e,t,s),M(s[l],(e=>ve(n,t,e)),(()=>De(a,t)))})),ve(q,t,[n,a])}),((e,t)=>{ve($,t),ve(q,t)})),bt=e=>Se(K,e,((e,t,s)=>{ve(K,t,s),M(s[l],(e=>ve(U,t,e)),(()=>De(X,t)))}),((e,t)=>{ve(K,t),ve(U,t),he(X,t)})),Vt=e=>oe(e)?Es():Cs(e),mt=e=>Se(_,e,((e,t,s)=>Et(t,s)),((e,t)=>zt(t))),Et=(e,t)=>Se(Ie(_,e,(()=>(jt(e,1),ve(Y,e,Qe()),ve(Z,e,ge()),ge()))),t,((t,s,n)=>kt(e,t,s,n)),((t,s)=>Nt(e,t,s))),kt=(e,t,s,n,a)=>Se(Ie(t,s,(()=>(Wt(e,s,1),ge()))),n,((t,n,a)=>Mt(e,s,t,n,a)),((n,o)=>Ot(e,t,s,n,o,a))),Mt=(e,t,s,n,a)=>{le(s,n)||Bt(e,t,n,1);const o=Le(s,n);a!==o&&(Ht(e,t,n,o,a),ve(s,n,a))},Dt=(e,t,s,n,a)=>M(Le(t,s),(t=>Mt(e,s,t,n,a)),(()=>kt(e,t,s,yt({[n]:a},e,s)))),Jt=e=>oe(e)?Ds():ps(e),At=e=>Se(te,e,((e,t,s)=>xt(t,s)),((e,t)=>Pt(t))),xt=(e,t)=>{le(te,e)||$t(e,1);const s=Le(te,e);t!==s&&(qt(e,s,t),ve(te,e,t))},Ft=(e,t)=>{const[s]=Le(Y,e),n=s(t);return le(Le(_,e),n)?Ft(e,t):n},Qt=e=>Le(_,e)??Et(e,{}),zt=e=>Et(e,{}),Nt=(e,t,s)=>{const[,n]=Le(Y,e);n(s),kt(e,t,s,{},!0)},Ot=(e,t,s,n,a,o)=>{const r=Le(Le(q,e)?.[0],a);if(!k(r)&&!o)return Mt(e,s,n,a,r);const l=t=>{Ht(e,s,t,Le(n,t)),Bt(e,s,t,-1),ve(n,t)};k(r)?l(a):we(n,l),ie(n)&&(Wt(e,s,-1),ie(ve(t,s))&&(jt(e,-1),ve(_,e),ve(Y,e),ve(Z,e)))},Pt=e=>{const t=Le(U,e);if(!k(t))return xt(e,t);qt(e,Le(te,e)),$t(e,-1),ve(te,e)},jt=(e,t)=>st(S,e,t),Wt=(e,t,s)=>st(Ie(E,e,ge),t,s)&&ve(m,e,Ie(m,e,(()=>0))+s),Bt=(e,t,s,n)=>{const a=Le(Z,e),o=Le(a,s)??0;(0==o&&1==n||1==o&&-1==n)&&st(Ie(V,e,ge),s,n),ve(a,s,o!=-n?o+n:null),st(Ie(Ie(A,e,ge),t,ge),s,n)},Ht=(e,t,s,n,a)=>Ie(Ie(Ie(F,e,ge),t,ge),s,(()=>[n,0]))[1]=a,$t=(e,t)=>st(Q,e,t),qt=(e,t,s)=>Ie(N,e,(()=>[t,0]))[1]=s,Gt=(e,t,s,n,a)=>(G(Ie(Ie(Ie(P,e,ge),t,ge),s,(()=>[])),n),a),Kt=(e,t,s)=>(G(Ie(H,e,(()=>[])),t),s),Ut=(e,t,s)=>M(Le(Le(Le(F,e),t),s),(([e,t])=>[!0,e,t]),(()=>[!1,...Ue(hs(e,t,s))])),Xt=e=>M(Le(N,e),(([e,t])=>[!0,e,t]),(()=>[!1,...Ue(Ls(e))])),Yt=e=>ie(P)||ie(Ke[e])?0:ue(e?be(P):P,((t,s)=>ue(t,((t,n)=>ue(t,((t,a)=>gt(Ke[e],[s,n,a],t))))))),Zt=e=>ie(H)||ie(at[e])?0:ue(e?Ce(H):H,((t,s)=>gt(at[e],[s],t))),_t=(e,t,s,n)=>{if(!ie(e))return gt(t,n,(()=>Re(e))),we(e,((e,t)=>gt(s,[...n??[],e],1==t))),1},es=e=>{const t=ws();t!=o&>(de[e],void 0,t);const s=ie(We[e]),n=ie($e[e])&&ie(qe[e])&&ie(je[e])&&ie(Be[e])&&ie(Fe[e])&&ie(Ne[e])&&ie(Pe[e])&&s&&ie(Je[e])&&ie(Ae[e]),a=ie(Ge[e])&&ie(He[e])&&ie(xe[e])&&ie(Ve[e]);if(!n||!a){const t=e?[Ce(S),pe(V),Ce(m),pe(E),be(A),be(F)]:[S,V,m,E,A,F];if(!n){_t(t[0],Je[e],Ae[e]),ue(t[1],((t,s)=>_t(t,Fe[e],Ne[e],[s]))),ue(t[2],((t,s)=>{0!=t&>(Pe[e],[s],is(s))}));const n=Me();ue(t[3],((t,a)=>{_t(t,je[e],Be[e],[a])&&!s&&(gt(We[e],[a,null]),De(n,a))})),s||ue(t[5],((t,s)=>{if(!le(n,s)){const n=Me();ue(t,(e=>ue(e,(([t,s],a)=>s!==t?De(n,a):he(e,a))))),ue(n,(t=>gt(We[e],[s,t])))}})),ue(t[4],((t,s)=>ue(t,((t,n)=>_t(t,$e[e],qe[e],[s,n])))))}if(!a){let s;ue(t[5],((t,n)=>{let a;ue(t,((t,o)=>{let r;ue(t,(([t,l],i)=>{l!==t&&(gt(Ge[e],[n,o,i],l,t,Ut),s=a=r=1)})),r&>(He[e],[n,o],Ut)})),a&>(xe[e],[n],Ut)})),s&>(Ve[e],void 0,Ut)}}},ts=e=>{const t=Ts();t!=d&>(ot[e],void 0,t);const s=ie(lt[e])&&ie(it[e]),n=ie(dt[e])&&ie(rt[e]);if(!s||!n){const t=e?[Ce(Q),Ce(N)]:[Q,N];if(s||_t(t[0],lt[e],it[e]),!n){let s;ue(t[1],(([t,n],a)=>{n!==t&&(gt(dt[e],[a],n,t,Xt),s=1)})),s&>(rt[e],void 0,Xt)}}},ss=(e,...t)=>(xs((()=>e(...B(t,b)))),zs),ns=()=>[Re(F,((e,t)=>-1===Le(S,t)?null:Re(e,((e,s)=>-1===Le(Le(E,t),s)?null:Re(e,(([,e])=>e??null),((e,t)=>Ze(t)))),oe)),oe),Re(N,(([,e])=>e??null),((e,t)=>Ze(t)))],as=()=>({cellsTouched:s,valuesTouched:n,changedCells:ye(F,Ye,Ze),invalidCells:ye(P),changedValues:Re(N,Ye,Ze),invalidValues:Re(H),changedTableIds:Re(S),changedRowIds:Te(E),changedCellIds:ye(A),changedValueIds:Re(Q)}),os=()=>ye(_),rs=()=>fe(_),ls=e=>fe(Le(Z,b(e))),is=e=>re(Le(_,b(e))),ds=e=>fe(Le(_,b(e))),cs=(e,t,s,n=0,a)=>{return B(x(j((o=Le(_,b(e)),r=(e,s)=>[k(t)?s:Le(e,b(t)),s],B([...o?.entries()??[]],(([e,t])=>r(t,e)))),(([e],[t])=>Oe(e,t)*(s?-1:1))),n,k(a)?a:n+a),(([,e])=>e));var o,r},us=(e,t)=>fe(Le(Le(_,b(e)),b(t))),hs=(e,t,s)=>Le(Le(Le(_,b(e)),b(t)),b(s)),gs=()=>Re(te),fs=()=>fe(te),Ls=e=>Le(te,b(e)),ws=()=>!ie(_),vs=e=>le(_,b(e)),Is=(e,t)=>le(Le(Z,b(e)),b(t)),Ss=(e,t)=>le(Le(_,b(e)),b(t)),Rs=(e,t,s)=>le(Le(Le(_,b(e)),b(t)),b(s)),Ts=()=>!ie(te),ys=e=>le(te,b(e)),Cs=e=>ss((()=>(e=>tt(e,vt,Gt))(e)?mt(e):0)),ps=e=>ss((()=>Rt(e)?At(e):0)),bs=e=>{try{Vt(et(e))}catch{}return zs},Vs=t=>ss((()=>{if((e=tt(t,(e=>tt(e,wt))))&&(pt(t),!ie(_))){const e=os();Es(),Cs(e)}})),ms=e=>ss((()=>{if(t=(e=>tt(e,wt))(e)){const s=gs();As(),Ds(),t=!0,bt(e),ps(s)}})),Es=()=>ss((()=>mt({}))),ks=e=>ss((e=>le(_,e)?zt(e):0),e),Ms=(e,t)=>ss(((e,t)=>M(Le(_,e),(s=>le(s,t)?Nt(e,s,t):0))),e,t),Ds=()=>ss((()=>At({}))),Js=()=>ss((()=>{pt({}),e=!1})),As=()=>ss((()=>{bt({}),t=!1})),xs=(e,t)=>{if(-1!=h){Fs();const s=e();return Qs(t),s}},Fs=()=>(-1!=h&&h++,1==h&>(ct,void 0,ns,as),zs),Qs=e=>(h>0&&(h--,0==h&&(s=!ie(F),n=!ie(N),h=1,Yt(1),s&&es(1),Zt(1),n&&ts(1),e?.(ns,as)&&(ue(F,((e,t)=>ue(e,((e,s)=>ue(e,(([e],n)=>Ee(zs,t,s,n,e))))))),ue(N,(([e],t)=>ke(zs,t,e))),s=n=!1),gt(ut[0],void 0,ns,as),h=-1,Yt(0),s&&es(0),Zt(0),n&&ts(0),gt(ut[1],void 0,ns,as),h=0,s=n=!1,o=ws(),d=Ts(),W([S,V,m,E,A,F,P,Q,N,H],ce))),zs),zs={getContent:()=>[os(),gs()],getTables:os,getTableIds:rs,getTable:e=>Te(Le(_,b(e))),getTableCellIds:ls,getRowCount:is,getRowIds:ds,getSortedRowIds:cs,getRow:(e,t)=>Re(Le(Le(_,b(e)),b(t))),getCellIds:us,getCell:hs,getValues:gs,getValueIds:fs,getValue:Ls,hasTables:ws,hasTable:vs,hasTableCell:Is,hasRow:Ss,hasCell:Rs,hasValues:Ts,hasValue:ys,getTablesJson:()=>_e(_),getValuesJson:()=>_e(te),getJson:()=>_e([_,te]),getTablesSchemaJson:()=>_e($),getValuesSchemaJson:()=>_e(K),getSchemaJson:()=>_e([$,K]),hasTablesSchema:()=>e,hasValuesSchema:()=>t,setContent:([e,t])=>ss((()=>{(oe(e)?Es:Cs)(e),(oe(t)?Ds:ps)(t)})),setTables:Cs,setTable:(e,t)=>ss((e=>vt(t,e)?Et(e,t):0),e),setRow:(e,t,s)=>ss(((e,t)=>It(e,t,s)?kt(e,Qt(e),t,s):0),e,t),addRow:(e,t,s=!0)=>xs((()=>{let n;return It(e,n,t)&&(e=b(e),kt(e,Qt(e),n=Ft(e,s?1:0),t)),n})),setPartialRow:(e,t,s)=>ss(((e,t)=>{if(It(e,t,s,1)){const n=Qt(e);ae(s,((s,a)=>Dt(e,n,t,a,s)))}}),e,t),setCell:(e,t,s,n)=>ss(((e,t,s)=>M(St(e,t,s,J(n)?n(hs(e,t,s)):n),(n=>Dt(e,Qt(e),t,s,n)))),e,t,s),setValues:ps,setPartialValues:e=>ss((()=>Rt(e,1)?ae(e,((e,t)=>xt(t,e))):0)),setValue:(e,t)=>ss((e=>M(Tt(e,J(t)?t(Ls(e)):t),(t=>xt(e,t)))),e),setTransactionChanges:e=>ss((()=>{ae(e[0],((e,t)=>k(e)?ks(t):ae(e,((e,s)=>k(e)?Ms(t,s):ae(e,((e,n)=>Ee(zs,t,s,n,e))))))),ae(e[1],((e,t)=>ke(zs,t,e)))})),setTablesJson:bs,setValuesJson:e=>{try{Jt(et(e))}catch{}return zs},setJson:e=>ss((()=>{try{const[t,s]=et(e);Vt(t),Jt(s)}catch{bs(e)}})),setTablesSchema:Vs,setValuesSchema:ms,setSchema:(e,t)=>ss((()=>{Vs(e),ms(t)})),delTables:Es,delTable:ks,delRow:Ms,delCell:(e,t,s,n)=>ss(((e,t,s)=>M(Le(_,e),(a=>M(Le(a,t),(o=>le(o,s)?Ot(e,a,t,o,s,n):0))))),e,t,s),delValues:Ds,delValue:e=>ss((e=>le(te,e)?Pt(e):0),e),delTablesSchema:Js,delValuesSchema:As,delSchema:()=>ss((()=>{Js(),As()})),transaction:xs,startTransaction:Fs,finishTransaction:Qs,forEachTable:e=>ue(_,((t,s)=>e(s,(e=>ue(t,((t,s)=>e(s,(e=>we(t,e))))))))),forEachTableCell:(e,t)=>we(Le(Z,b(e)),t),forEachRow:(e,t)=>ue(Le(_,b(e)),((e,s)=>t(s,(t=>we(e,t))))),forEachCell:(e,t,s)=>we(Le(Le(_,b(e)),b(t)),s),forEachValue:e=>we(te,e),addSortedRowIdsListener:(e,t,s,n,a,o,r)=>{let l=cs(e,t,s,n,a);return ht((()=>{const r=cs(e,t,s,n,a);O(r,l)||(l=r,o(zs,e,t,s,n,a,l))}),We[r?1:0],[e,t],[rs])},addStartTransactionListener:e=>ht(e,ct),addWillFinishTransactionListener:e=>ht(e,ut[0]),addDidFinishTransactionListener:e=>ht(e,ut[1]),callListener:e=>(Lt(e),zs),delListener:e=>(ft(e),zs),getListenerStats:()=>({}),createStore:nt,addListener:ht,callListeners:gt};return ae({[u+f]:[0,de,[],()=>[ws()]],[f]:[0,Ve],[L]:[0,Je],[u+g]:[1,Ae,[rs],e=>[vs(...e)]],[g]:[1,xe,[rs]],[g+T]:[1,Fe,[rs]],[u+g+R]:[2,Ne,[rs,ls],e=>[Is(...e)]],[v]:[1,Pe,[rs]],[I]:[1,je,[rs]],[u+w]:[2,Be,[rs,ds],e=>[Ss(...e)]],[w]:[2,He,[rs,ds]],[T]:[2,$e,[rs,ds]],[u+R]:[3,qe,[rs,ds,us],e=>[Rs(...e)]],[R]:[3,Ge,[rs,ds,us],e=>Ue(hs(...e))],InvalidCell:[3,Ke],[u+C]:[0,ot,[],()=>[Ts()]],[C]:[0,rt],[p]:[0,lt],[u+y]:[1,it,[fs],e=>[ys(...e)]],[y]:[1,dt,[fs],e=>Ue(Ls(e[0]))],InvalidValue:[1,at]},(([e,t,s,n],a)=>{zs[c+a+i]=(...a)=>ht(a[e],t[a[e+1]?1:0],e>0?x(a,0,e):void 0,s,n)})),ee(zs)};export{Ne as createCheckpoints,qe as createCustomPersister,Pe as createIndexes,Be as createMetrics,Ge as createQueries,Ke as createRelationships,nt as createStore,Oe as defaultSorter};
|
|
1
|
+
const e=e=>typeof e,t="",s=e(t),n=e(!0),a=e(0),o=e(e),r="type",l="default",i="Listener",d="Result",c="add",u="Has",h="Ids",g="Table",f=g+"s",L=g+h,w="Row",v=w+"Count",I=w+h,S="Sorted"+w+h,R="Cell",T=R+h,y="Value",C=y+"s",p=y+h,b=e=>t+e,V=Math.max,m=Math.min,E=isFinite,k=e=>null==e,M=(e,t,s)=>k(e)?s?.():t(e),D=e=>e==s||e==n,J=t=>e(t)==o,A=e=>Array.isArray(e),x=(e,t,s)=>e.slice(t,s),F=e=>e.length,Q=()=>{},z=(e,t)=>e.includes(t),N=(e,t)=>e.every(t),O=(e,t)=>F(e)===F(t)&&N(e,((e,s)=>t[s]===e)),P=(e,t)=>N(e,((s,n)=>0==n||t(e[n-1],s)<=0)),j=(e,t)=>e.sort(t),W=(e,t)=>e.forEach(t),B=(e,t)=>e.map(t),H=e=>q(e,((e,t)=>e+t),0),$=e=>0==F(e),q=(e,t,s)=>e.reduce(t,s),G=(e,...t)=>e.push(...t),K=e=>e.pop(),U=e=>e.shift(),X=Object,Y=e=>X.getPrototypeOf(e),Z=X.keys,_=X.isFrozen,ee=X.freeze,te=e=>!k(e)&&M(Y(e),(e=>e==X.prototype||k(Y(e))),(()=>!0)),se=(e,t)=>!k(((e,t)=>M(e,(e=>e[t])))(e,t)),ne=(e,t)=>(delete e[t],e),ae=(e,t)=>B(X.entries(e),(([e,s])=>t(s,e))),oe=e=>te(e)&&0==(e=>F(Z(e)))(e),re=e=>e?.size??0,le=(e,t)=>e?.has(t)??!1,ie=e=>k(e)||0==re(e),de=e=>[...e?.values()??[]],ce=e=>e.clear(),ue=(e,t)=>e?.forEach(t),he=(e,t)=>e?.delete(t),ge=e=>new Map(e),fe=e=>[...e?.keys()??[]],Le=(e,t)=>e?.get(t),we=(e,t)=>ue(e,((e,s)=>t(s,e))),ve=(e,t,s)=>k(s)?(he(e,t),e):e?.set(t,s),Ie=(e,t,s)=>(le(e,t)||ve(e,t,s()),Le(e,t)),Se=(e,t,s,n=ve)=>(ae(t,((t,n)=>s(e,n,t))),we(e,(s=>se(t,s)?0:n(e,s))),e),Re=(e,t,s)=>{const n={};return ue(e,((e,a)=>{const o=t?t(e,a):e;!s?.(o,e)&&(n[a]=o)})),n},Te=(e,t,s)=>Re(e,(e=>Re(e,t,s)),oe),ye=(e,t,s)=>Re(e,(e=>Te(e,t,s)),oe),Ce=(e,t)=>{const s=ge();return ue(e,((e,n)=>s.set(n,t?.(e)??e))),s},pe=e=>Ce(e,Ce),be=e=>Ce(e,pe),Ve=(e,t,s,n,a=0)=>M((s?Ie:Le)(e,t[a],a>F(t)-2?s:ge),(o=>{if(a>F(t)-2)return n?.(o)&&ve(e,t[a]),o;const r=Ve(o,t,s,n,a+1);return ie(o)&&ve(e,t[a]),r})),me=t=>{const s=e(t);return D(s)||s==a&&E(t)?s:void 0},Ee=(e,t,s,n,a)=>k(a)?e.delCell(t,s,n,!0):e.setCell(t,s,n,a),ke=(e,t,s)=>k(s)?e.delValue(t):e.setValue(t,s),Me=e=>new Set(A(e)||k(e)?e:[e]),De=(e,t)=>e?.add(t),Je=(e,t,s,n,a)=>{const o=e.hasRow,r=ge(),l=ge(),i=ge(),d=ge(),c=ge(),u=ge(),h=(t,s,...n)=>{const a=Ie(u,t,Me);return W(n,(t=>De(a,t)&&s&&e.callListener(t))),n},g=(t,...s)=>M(Le(u,t),(n=>{W($(s)?de(n):s,(t=>{e.delListener(t),he(n,t)})),ie(n)&&ve(u,t)})),f=(e,s)=>{ve(r,e,s),le(l,e)||(ve(l,e,t()),ve(d,e,ge()),ve(c,e,ge()),a(i))},L=e=>{ve(r,e),ve(l,e),ve(d,e),ve(c,e),g(e),a(i)};return[()=>e,()=>fe(r),e=>we(l,e),e=>le(l,e),e=>Le(r,e),e=>Le(l,e),(e,t)=>ve(l,e,t),f,(t,n,a,r,l)=>{f(t,n);const i=ge(),u=ge(),L=Le(d,t),w=Le(c,t),v=t=>{const a=s=>e.getCell(n,t,s),d=Le(L,t),c=o(n,t)?s(r(a,t)):void 0;if(d===c||A(d)&&A(c)&&O(d,c)||ve(i,t,[d,c]),!k(l)){const e=Le(w,t),s=o(n,t)?l(a,t):void 0;e!=s&&ve(u,t,s)}},I=e=>{a((()=>{ue(i,(([,e],t)=>ve(L,t,e))),ue(u,((e,t)=>ve(w,t,e)))}),i,u,L,w,e),ce(i),ce(u)};we(L,v),e.hasTable(n)&&W(e.getRowIds(n),(e=>{le(L,e)||v(e)})),I(!0),g(t),h(t,0,e.addRowListener(n,null,((e,t,s)=>v(s))),e.addTableListener(n,(()=>I())))},L,e=>n(e,i),()=>we(u,L),h,g]},Ae=(n,a)=>e(n)==s?e=>e(n):n??(()=>a??t),xe=e=>{const t=new WeakMap;return s=>(t.has(s)||t.set(s,e(s)),t.get(s))},Fe=/^\d+$/,Qe=()=>{const e=[];let s=0;return[n=>(n?U(e):null)??t+s++,t=>{Fe.test(t)&&F(e)<1e3&&G(e,t)}]},ze=e=>{let s;const[n,a]=Qe(),o=ge();return[(a,r,l,i=[],d=(()=>[]))=>{s??=e();const c=n(1);return ve(o,c,[a,r,l,i,d]),De(Ve(r,l??[t],Me),c),c},(e,n,...a)=>W(((e,s=[t])=>{const n=[],a=(e,t)=>t==F(s)?G(n,e):null===s[t]?ue(e,(e=>a(e,t+1))):W([s[t],null],(s=>a(Le(e,s),t+1)));return a(e,0),n})(e,n),(e=>ue(e,(e=>Le(o,e)[0](s,...n??[],...a))))),e=>M(Le(o,e),(([,s,n])=>(Ve(s,n??[t],void 0,(t=>(he(t,e),ie(t)?1:0))),ve(o,e),a(e),n))),e=>M(Le(o,e),(([e,,t=[],n,a])=>{const o=(...r)=>{const l=F(r);l==F(t)?e(s,...r,...a(r)):k(t[l])?W(n[l]?.(...r)??[],(e=>o(...r,e))):o(...r,t[l])};o()}))]},Ne=xe((e=>{let s,n,a,o=100,r=ge(),l=ge(),i=1;const d=ge(),c=ge(),[u,h,g]=ze((()=>Q)),f=ge(),L=ge(),w=[],v=[],I=(t,s)=>{i=0,e.transaction((()=>{const[n,a]=Le(f,s);ue(n,((s,n)=>ue(s,((s,a)=>ue(s,((s,o)=>Ee(e,n,a,o,s[t]))))))),ue(a,((s,n)=>ke(e,n,s[t])))})),i=1},S=e=>{ve(f,e),ve(L,e),h(c,[e])},R=(e,t)=>W(((e,t)=>e.splice(0,t))(e,t??F(e)),S),T=()=>R(w,F(w)-o),y=()=>M(s,(()=>{G(w,s),T(),R(v),s=void 0,a=1})),C=()=>{s=K(w),a=1},p=e.addCellListener(null,null,null,((e,t,s,n,a,o)=>{if(i){y();const e=Ie(r,t,ge),l=Ie(e,s,ge),i=Ie(l,n,(()=>[o,void 0]));i[1]=a,i[0]===a&&ie(ve(l,n))&&ie(ve(e,s))&&ie(ve(r,t))&&C(),D()}})),b=e.addValueListener(null,((e,t,s,n)=>{if(i){y();const e=Ie(l,t,(()=>[n,void 0]));e[1]=s,e[0]===s&&ie(ve(l,t))&&C(),D()}})),V=(e="")=>(k(s)&&(s=t+n++,ve(f,s,[r,l]),A(s,e),r=ge(),l=ge(),a=1),s),m=()=>{$(w)||(((e,...t)=>{e.unshift(...t)})(v,V()),I(0,s),s=K(w),a=1)},E=()=>{$(v)||(G(w,s),s=U(v),I(1,s),a=1)},D=()=>{a&&(h(d),a=0)},J=e=>{const t=V(e);return D(),t},A=(e,t)=>(x(e)&&Le(L,e)!==t&&(ve(L,e,t),h(c,[e])),Q),x=e=>le(f,e),Q={setSize:e=>(o=e,T(),Q),addCheckpoint:J,setCheckpoint:A,getStore:()=>e,getCheckpointIds:()=>[[...w],s,[...v]],forEachCheckpoint:e=>we(L,e),hasCheckpoint:x,getCheckpoint:e=>Le(L,e),goBackward:()=>(m(),D(),Q),goForward:()=>(E(),D(),Q),goTo:e=>{const t=z(w,e)?m:z(v,e)?E:null;for(;!k(t)&&e!=s;)t();return D(),Q},addCheckpointIdsListener:e=>u(e,d),addCheckpointListener:(e,t)=>u(t,c,[e]),delListener:e=>(g(e),Q),clear:()=>(R(w),R(v),k(s)||S(s),s=void 0,n=0,J(),Q),clearForward:()=>($(v)||(R(v),h(d)),Q),destroy:()=>{e.delListener(p),e.delListener(b)},getListenerStats:()=>({})};return ee(Q.clear())})),Oe=(e,t)=>(e??0)<(t??0)?-1:1,Pe=xe((e=>{const s=ge(),n=ge(),[a,o,r]=ze((()=>S)),[l,i,d,c,u,h,g,,f,L,w,v]=Je(e,ge,(e=>k(e)?t:A(e)?B(e,b):b(e)),a,o),I=(t,s,n)=>{const a=u(t);ue(n,((t,n)=>s(n,(s=>ue(t,(t=>s(t,(s=>e.forEachCell(a,t,s)))))))))},S={setIndexDefinition:(e,t,a,r,l,i=Oe)=>{const d=k(l)?void 0:([e],[t])=>l(e,t);return f(e,t,((t,a,l,c,u,f)=>{let L=0;const w=Me(),v=Me(),I=h(e);if(ue(a,(([e,t],s)=>{const n=Me(e),a=Me(t);ue(n,(e=>he(a,e)?he(n,e):0)),ue(n,(e=>{De(w,e),M(Le(I,e),(t=>{he(t,s),ie(t)&&(ve(I,e),L=1)}))})),ue(a,(e=>{De(w,e),le(I,e)||(ve(I,e,Me()),L=1),De(Le(I,e),s),k(r)||De(v,e)}))})),t(),ie(u)||(f?we(I,(e=>De(v,e))):we(l,(e=>M(Le(c,e),(e=>De(v,e))))),ue(v,(e=>{const t=(t,s)=>i(Le(u,t),Le(u,s),e),s=[...Le(I,e)];P(s,t)||(ve(I,e,Me(j(s,t))),De(w,e))}))),(L||f)&&!k(d)){const t=[...I];P(t,d)||(g(e,ge(j(t,d))),L=1)}L&&o(s,[e]),ue(w,(t=>o(n,[e,t])))}),Ae(a),M(r,Ae)),S},delIndexDefinition:e=>(L(e),S),getStore:l,getIndexIds:i,forEachIndex:e=>d(((t,s)=>e(t,(e=>I(t,e,s))))),forEachSlice:(e,t)=>I(e,t,h(e)),hasIndex:c,hasSlice:(e,t)=>le(h(e),t),getTableId:u,getSliceIds:e=>fe(h(e)),getSliceRowIds:(e,t)=>de(Le(h(e),t)),addIndexIdsListener:w,addSliceIdsListener:(e,t)=>a(t,s,[e]),addSliceRowIdsListener:(e,t,s)=>a(s,n,[e,t]),delListener:e=>(r(e),S),destroy:v,getListenerStats:()=>({})};return ee(S)})),je=ge([["avg",[(e,t)=>H(e)/t,(e,t,s)=>e+(t-e)/(s+1),(e,t,s)=>e+(e-t)/(s-1),(e,t,s,n)=>e+(t-s)/n]],["max",[e=>V(...e),(e,t)=>V(t,e),(e,t)=>t==e?void 0:e,(e,t,s)=>s==e?void 0:V(t,e)]],["min",[e=>m(...e),(e,t)=>m(t,e),(e,t)=>t==e?void 0:e,(e,t,s)=>s==e?void 0:m(t,e)]],["sum",[e=>H(e),(e,t)=>e+t,(e,t)=>e-t,(e,t,s)=>e-s+t]]]),We=(e,t,s,n,a,o=!1)=>{if(ie(s))return;const[r,l,i,d]=a;return o||=k(e),ue(n,(([s,n])=>{o||(e=k(s)?l?.(e,n,t++):k(n)?i?.(e,s,t--):d?.(e,n,s,t),o||=k(e))})),o?r(de(s),re(s)):e},Be=xe((e=>{const s=ge(),[n,a,o]=ze((()=>v)),[r,l,i,d,c,u,h,,g,f,L,w]=Je(e,Q,(e=>isNaN(e)||k(e)||!0===e||!1===e||e===t?void 0:1*e),n,a),v={setMetricDefinition:(e,t,n,o,r,l,i)=>{const d=J(n)?[n,r,l,i]:Le(je,n)??Le(je,"sum");return g(e,t,((t,n,o,r,l,i)=>{const c=u(e),g=re(r);i||=k(c),t();let f=We(c,g,r,n,d,i);E(f)||(f=void 0),f!=c&&(h(e,f),a(s,[e],f,c))}),Ae(o,1)),v},delMetricDefinition:e=>(f(e),v),getStore:r,getMetricIds:l,forEachMetric:i,hasMetric:d,getTableId:c,getMetric:u,addMetricIdsListener:L,addMetricListener:(e,t)=>n(t,s,[e]),delListener:e=>(o(e),v),destroy:w,getListenerStats:()=>({})};return ee(v)})),He=ge(),$e=ge(),qe=(e,t,s,n,a,o,[r,l]=[],i=[])=>{let d,c,u,h=0,g=0;Ie(He,i,(()=>0)),Ie($e,i,(()=>[]));const f=async e=>(2!=h&&(h=1,await L.schedule((async()=>{await e(),h=0}))),L),L={load:async(s,n)=>await f((async()=>{try{e.setContent(await t())}catch{e.setContent([s,n])}})),startAutoLoad:async(s={},a={})=>(L.stopAutoLoad(),await L.load(s,a),g=1,u=n((async(s,n)=>{if(n){const t=n();await f((async()=>e.setTransactionChanges(t)))}else await f((async()=>{try{e.setContent(s?.()??await t())}catch(e){o?.(e)}}))})),L),stopAutoLoad:()=>(g&&(a(u),u=void 0,g=0),L),save:async t=>(1!=h&&(h=2,await L.schedule((async()=>{try{await s(e.getContent,t)}catch(e){o?.(e)}h=0}))),L),startAutoSave:async()=>(await L.stopAutoSave().save(),d=e.addDidFinishTransactionListener(((e,t)=>{const[s,n]=t();oe(s)&&oe(n)||L.save((()=>[s,n]))})),L),stopAutoSave:()=>(M(d,e.delListener),d=void 0,L),schedule:async(...e)=>(G(Le($e,i),...e),await(async()=>{if(!Le(He,i)){for(ve(He,i,1);!k(c=U(Le($e,i)));)try{await c()}catch(e){o?.(e)}ve(He,i,0)}})(),L),getStore:()=>e,destroy:()=>L.stopAutoLoad().stopAutoSave(),getStats:()=>({})};return r&&(L[r]=()=>l),ee(L)},Ge=xe((e=>{const s=e.createStore,n=s(),a=s(),o=ge(),{addListener:r,callListeners:l,delListener:u}=a,[h,f,L,y,C,,,p,,b,V,m,E,D]=Je(e,(()=>!0),Q,r,l),A=(e,t,...s)=>W(s,(s=>De(Ie(Ie(o,t,ge),e,Me),s))),z=e=>{M(Le(o,e),(e=>{we(e,((e,t)=>ue(t,(t=>e.delListener(t))))),ce(e)})),W([a,n],(t=>t.delTable(e)))},O=(e,t,s)=>A(t,e,t.addStartTransactionListener(s.startTransaction),t.addDidFinishTransactionListener((()=>s.finishTransaction()))),P={setQueryDefinition:(s,o,r)=>{p(s,o),z(s);const l=[],i=[[null,[o,null,null,[],ge()]]],d=[],c=[],u=[];r({select:(e,s)=>{const n=J(e)?[F(l)+t,e]:[k(s)?e:s,t=>t(e,s)];return G(l,n),{as:e=>n[0]=e}},join:(e,t,s)=>{const n=k(s)||J(t)?null:t,a=k(n)?t:s,o=[e,[e,n,J(a)?a:e=>e(a),[],ge()]];return G(i,o),{as:e=>o[0]=e}},where:(e,t,s)=>G(d,J(e)?e:k(s)?s=>s(e)===t:n=>n(e,t)===s),group:(e,t,s,n,a)=>{const o=[e,[e,J(t)?[t,s,n,a]:Le(je,t)??[(e,t)=>t]]];return G(c,o),{as:e=>o[0]=e}},having:(e,t)=>G(u,J(e)?e:s=>s(e)===t)});const h=ge(l);if(ie(h))return P;const g=ge(i);we(g,((e,[,t])=>M(Le(g,t),(({3:t})=>k(e)?0:G(t,e)))));const f=ge(c);let L=n;if(ie(f)&&$(u))L=a;else{O(s,L,a);const e=ge();we(f,((t,[s,n])=>De(Ie(e,s,Me),[t,n])));const t=Me();we(h,(s=>le(e,s)?0:De(t,s)));const n=ge(),o=(t,n,o,r)=>M(t,(([l,i,d,c])=>{we(n,((t,[s])=>{const n=Ie(l,t,ge),a=Le(n,o),i=r?void 0:s;if(a!==i){const s=Me([[a,i]]),r=re(n);ve(n,o,i),ue(Le(e,t),(([e,t])=>{const a=We(c[e],r,n,s,t);c[e]=k(me(a))?null:a}))}})),ie(i)||!N(u,(e=>e((e=>c[e]))))?a.delRow(s,d):k(d)?t[2]=a.addRow(s,c):a.setRow(s,d,c)}));A(L,s,L.addRowListener(s,null,((a,r,l,i)=>{const d=[],c=[],u=ge(),h=L.hasRow(s,l);let g=!h;ue(t,(e=>{const[t,n,a]=i(s,l,e);G(d,n),G(c,a),g||=t})),we(e,(e=>{const[t,,n]=i(s,l,e);(g||t)&&ve(u,e,[n])})),g&&o(Ve(n,d,void 0,(([,e])=>(he(e,l),ie(e)))),u,l,1),h&&o(Ve(n,c,(()=>{const e={};return ue(t,(t=>e[t]=L.getCell(s,l,t))),[ge(),Me(),void 0,e]}),(([,e])=>{De(e,l)})),u,l)})))}O(s,e,L);const w=(t,n,a,r)=>{const l=t=>e.getCell(n,a,t);W(r,(n=>{const[a,,o,r,i]=Le(g,n),d=o?.(l,t),[c,u]=Le(i,t)??[];d!=c&&(k(u)||D(s,u),ve(i,t,k(d)?null:[d,...E(s,1,e.addRowListener(a,d,(()=>w(t,a,d,r))))]))})),(t=>{const n=(s,n)=>e.getCell(...k(n)?[o,t,s]:s===o?[o,t,n]:[Le(g,s)?.[0],Le(Le(g,s)?.[4],t)?.[0],n]);L.transaction((()=>N(d,(e=>e(n)))?we(h,((e,a)=>Ee(L,s,t,e,a(n,t)))):L.delRow(s,t)))})(t)},{3:v}=Le(g,null);return L.transaction((()=>E(s,1,e.addRowListener(o,null,((t,n,a)=>{e.hasRow(o,a)?w(a,o,a,v):(L.delRow(s,a),ue(g,(({4:e})=>M(Le(e,a),(([,t])=>{D(s,t),ve(e,a)})))))}))))),P},delQueryDefinition:e=>(z(e),b(e),P),getStore:h,getQueryIds:f,forEachQuery:L,hasQuery:y,getTableId:C,addQueryIdsListener:e=>V((()=>e(P))),delListener:e=>(u(e),P),destroy:m,getListenerStats:()=>{const{tables:e,tableIds:t,transaction:s,...n}=a.getListenerStats();return n}};return ae({[g]:[1,1],[g+T]:[0,1],[v]:[0,1],[I]:[0,1],[S]:[0,5],[w]:[1,2],[T]:[0,2],[R]:[1,3]},(([e,t],s)=>{W(e?["get","has","forEach"]:["get"],(e=>P[e+d+s]=(...t)=>a[e+s](...t))),P[c+d+s+i]=(...e)=>a[c+s+i](...x(e,0,t),((s,...n)=>e[t](P,...n)),!0)})),ee(P)})),Ke=xe((e=>{const s=ge(),n=ge(),a=ge(),o=ge(),[r,l,i]=ze((()=>y)),[d,c,u,h,g,f,,,L,w,v,I]=Je(e,(()=>[ge(),ge(),ge(),ge()]),(e=>k(e)?void 0:e+t),r,l),S=(e,t,s)=>M(f(e),(([n,,a])=>{if(!le(a,t)){const o=Me();if(g(e)!=T(e))De(o,t);else{let e=t;for(;!k(e)&&!le(o,e);)De(o,e),e=Le(n,e)}if(s)return o;ve(a,t,o)}return Le(a,t)})),R=(e,t)=>M(f(e),(([,,e])=>ve(e,t))),T=e=>Le(s,e),y={setRelationshipDefinition:(e,t,r,i)=>(ve(s,e,r),L(e,t,((t,s)=>{const r=Me(),i=Me(),d=Me(),[c,u]=f(e);ue(s,(([t,s],n)=>{k(t)||(De(i,t),M(Le(u,t),(e=>{he(e,n),ie(e)&&ve(u,t)}))),k(s)||(De(i,s),le(u,s)||ve(u,s,Me()),De(Le(u,s),n)),De(r,n),ve(c,n,s),we(Le(o,e),(t=>{le(S(e,t),n)&&De(d,t)}))})),t(),ue(r,(t=>l(n,[e,t]))),ue(i,(t=>l(a,[e,t]))),ue(d,(t=>{R(e,t),l(o,[e,t])}))}),Ae(i)),y),delRelationshipDefinition:e=>(ve(s,e),w(e),y),getStore:d,getRelationshipIds:c,forEachRelationship:t=>u((s=>t(s,(t=>e.forEachRow(g(s),t))))),hasRelationship:h,getLocalTableId:g,getRemoteTableId:T,getRemoteRowId:(e,t)=>Le(f(e)?.[0],t),getLocalRowIds:(e,t)=>de(Le(f(e)?.[1],t)),getLinkedRowIds:(e,t)=>k(f(e))?[t]:de(S(e,t,!0)),addRelationshipIdsListener:v,addRemoteRowIdListener:(e,t,s)=>r(s,n,[e,t]),addLocalRowIdsListener:(e,t,s)=>r(s,a,[e,t]),addLinkedRowIdsListener:(e,t,s)=>(S(e,t),r(s,o,[e,t])),delListener:e=>(R(...i(e)??[]),y),destroy:I,getListenerStats:()=>({})};return ee(y)})),Ue=e=>[e,e],Xe=()=>[ge(),ge()],Ye=e=>[...e],Ze=([e,t])=>e===t,_e=e=>JSON.stringify(e,((e,t)=>t instanceof Map?X.fromEntries([...t]):t)),et=JSON.parse,tt=(e,t,s)=>k(e)||!te(e)||oe(e)||_(e)?(s?.(),!1):(ae(e,((s,n)=>{t(s,n)||ne(e,n)})),!oe(e)),st=(e,t,s)=>ve(e,t,Le(e,t)==-s?void 0:s),nt=()=>{let e,t,s=!1,n=!1,o=!1,d=!1,h=0;const S=ge(),V=ge(),m=ge(),E=ge(),A=ge(),F=ge(),Q=ge(),N=ge(),P=ge(),H=ge(),$=ge(),q=ge(),K=ge(),U=ge(),X=Me(),Y=ge(),Z=ge(),_=ge(),te=ge(),de=Xe(),Ve=Xe(),Je=Xe(),Ae=Xe(),xe=Xe(),Fe=Xe(),Ne=Xe(),Pe=Xe(),je=Xe(),We=Xe(),Be=Xe(),He=Xe(),$e=Xe(),qe=Xe(),Ge=Xe(),Ke=Xe(),at=Xe(),ot=Xe(),rt=Xe(),lt=Xe(),it=Xe(),dt=Xe(),ct=ge(),ut=Xe(),[ht,gt,ft,Lt]=ze((()=>zs)),wt=e=>{if(!tt(e,((e,t)=>z([r,l],t))))return!1;const t=e[r];return!(!D(t)&&t!=a||(me(e[l])!=t&&ne(e,l),0))},vt=(t,s)=>(!e||le($,s)||Gt(s))&&tt(t,((e,t)=>It(s,t,e)),(()=>Gt(s))),It=(e,t,s,n)=>tt(n?s:yt(s,e,t),((n,a)=>M(St(e,t,a,n),(e=>(s[a]=e,!0)),(()=>!1))),(()=>Gt(e,t))),St=(t,s,n,a)=>e?M(Le(Le($,t),n),(e=>me(a)!=e[r]?Gt(t,s,n,a,e[l]):a),(()=>Gt(t,s,n,a))):k(me(a))?Gt(t,s,n,a):a,Rt=(e,t)=>tt(t?e:Ct(e),((t,s)=>M(Tt(s,t),(t=>(e[s]=t,!0)),(()=>!1))),(()=>Kt())),Tt=(e,s)=>t?M(Le(K,e),(t=>me(s)!=t[r]?Kt(e,s,t[l]):s),(()=>Kt(e,s))):k(me(s))?Kt(e,s):s,yt=(e,t,s)=>(M(Le(q,t),(([n,a])=>{ue(n,((t,s)=>{se(e,s)||(e[s]=t)})),ue(a,(n=>{se(e,n)||Gt(t,s,n)}))})),e),Ct=e=>(t&&(ue(U,((t,s)=>{se(e,s)||(e[s]=t)})),ue(X,(t=>{se(e,t)||Kt(t)}))),e),pt=e=>Se($,e,((e,t,s)=>{const n=ge(),a=Me();Se(Ie($,t,ge),s,((e,t,s)=>{ve(e,t,s),M(s[l],(e=>ve(n,t,e)),(()=>De(a,t)))})),ve(q,t,[n,a])}),((e,t)=>{ve($,t),ve(q,t)})),bt=e=>Se(K,e,((e,t,s)=>{ve(K,t,s),M(s[l],(e=>ve(U,t,e)),(()=>De(X,t)))}),((e,t)=>{ve(K,t),ve(U,t),he(X,t)})),Vt=e=>oe(e)?Es():Cs(e),mt=e=>Se(_,e,((e,t,s)=>Et(t,s)),((e,t)=>zt(t))),Et=(e,t)=>Se(Ie(_,e,(()=>(jt(e,1),ve(Y,e,Qe()),ve(Z,e,ge()),ge()))),t,((t,s,n)=>kt(e,t,s,n)),((t,s)=>Nt(e,t,s))),kt=(e,t,s,n,a)=>Se(Ie(t,s,(()=>(Wt(e,s,1),ge()))),n,((t,n,a)=>Mt(e,s,t,n,a)),((n,o)=>Ot(e,t,s,n,o,a))),Mt=(e,t,s,n,a)=>{le(s,n)||Bt(e,t,n,1);const o=Le(s,n);a!==o&&(Ht(e,t,n,o,a),ve(s,n,a))},Dt=(e,t,s,n,a)=>M(Le(t,s),(t=>Mt(e,s,t,n,a)),(()=>kt(e,t,s,yt({[n]:a},e,s)))),Jt=e=>oe(e)?Ds():ps(e),At=e=>Se(te,e,((e,t,s)=>xt(t,s)),((e,t)=>Pt(t))),xt=(e,t)=>{le(te,e)||$t(e,1);const s=Le(te,e);t!==s&&(qt(e,s,t),ve(te,e,t))},Ft=(e,t)=>{const[s]=Le(Y,e),n=s(t);return le(Le(_,e),n)?Ft(e,t):n},Qt=e=>Le(_,e)??Et(e,{}),zt=e=>Et(e,{}),Nt=(e,t,s)=>{const[,n]=Le(Y,e);n(s),kt(e,t,s,{},!0)},Ot=(e,t,s,n,a,o)=>{const r=Le(Le(q,e)?.[0],a);if(!k(r)&&!o)return Mt(e,s,n,a,r);const l=t=>{Ht(e,s,t,Le(n,t)),Bt(e,s,t,-1),ve(n,t)};k(r)?l(a):we(n,l),ie(n)&&(Wt(e,s,-1),ie(ve(t,s))&&(jt(e,-1),ve(_,e),ve(Y,e),ve(Z,e)))},Pt=e=>{const t=Le(U,e);if(!k(t))return xt(e,t);qt(e,Le(te,e)),$t(e,-1),ve(te,e)},jt=(e,t)=>st(S,e,t),Wt=(e,t,s)=>st(Ie(E,e,ge),t,s)&&ve(m,e,Ie(m,e,(()=>0))+s),Bt=(e,t,s,n)=>{const a=Le(Z,e),o=Le(a,s)??0;(0==o&&1==n||1==o&&-1==n)&&st(Ie(V,e,ge),s,n),ve(a,s,o!=-n?o+n:null),st(Ie(Ie(A,e,ge),t,ge),s,n)},Ht=(e,t,s,n,a)=>Ie(Ie(Ie(F,e,ge),t,ge),s,(()=>[n,0]))[1]=a,$t=(e,t)=>st(Q,e,t),qt=(e,t,s)=>Ie(N,e,(()=>[t,0]))[1]=s,Gt=(e,t,s,n,a)=>(G(Ie(Ie(Ie(P,e,ge),t,ge),s,(()=>[])),n),a),Kt=(e,t,s)=>(G(Ie(H,e,(()=>[])),t),s),Ut=(e,t,s)=>M(Le(Le(Le(F,e),t),s),(([e,t])=>[!0,e,t]),(()=>[!1,...Ue(hs(e,t,s))])),Xt=e=>M(Le(N,e),(([e,t])=>[!0,e,t]),(()=>[!1,...Ue(Ls(e))])),Yt=e=>ie(P)||ie(Ke[e])?0:ue(e?be(P):P,((t,s)=>ue(t,((t,n)=>ue(t,((t,a)=>gt(Ke[e],[s,n,a],t))))))),Zt=e=>ie(H)||ie(at[e])?0:ue(e?Ce(H):H,((t,s)=>gt(at[e],[s],t))),_t=(e,t,s,n)=>{if(!ie(e))return gt(t,n,(()=>Re(e))),we(e,((e,t)=>gt(s,[...n??[],e],1==t))),1},es=e=>{const t=ws();t!=o&>(de[e],void 0,t);const s=ie(We[e]),n=ie($e[e])&&ie(qe[e])&&ie(je[e])&&ie(Be[e])&&ie(Fe[e])&&ie(Ne[e])&&ie(Pe[e])&&s&&ie(Je[e])&&ie(Ae[e]),a=ie(Ge[e])&&ie(He[e])&&ie(xe[e])&&ie(Ve[e]);if(!n||!a){const t=e?[Ce(S),pe(V),Ce(m),pe(E),be(A),be(F)]:[S,V,m,E,A,F];if(!n){_t(t[0],Je[e],Ae[e]),ue(t[1],((t,s)=>_t(t,Fe[e],Ne[e],[s]))),ue(t[2],((t,s)=>{0!=t&>(Pe[e],[s],is(s))}));const n=Me();ue(t[3],((t,a)=>{_t(t,je[e],Be[e],[a])&&!s&&(gt(We[e],[a,null]),De(n,a))})),s||ue(t[5],((t,s)=>{if(!le(n,s)){const n=Me();ue(t,(e=>ue(e,(([t,s],a)=>s!==t?De(n,a):he(e,a))))),ue(n,(t=>gt(We[e],[s,t])))}})),ue(t[4],((t,s)=>ue(t,((t,n)=>_t(t,$e[e],qe[e],[s,n])))))}if(!a){let s;ue(t[5],((t,n)=>{let a;ue(t,((t,o)=>{let r;ue(t,(([t,l],i)=>{l!==t&&(gt(Ge[e],[n,o,i],l,t,Ut),s=a=r=1)})),r&>(He[e],[n,o],Ut)})),a&>(xe[e],[n],Ut)})),s&>(Ve[e],void 0,Ut)}}},ts=e=>{const t=Ts();t!=d&>(ot[e],void 0,t);const s=ie(lt[e])&&ie(it[e]),n=ie(dt[e])&&ie(rt[e]);if(!s||!n){const t=e?[Ce(Q),Ce(N)]:[Q,N];if(s||_t(t[0],lt[e],it[e]),!n){let s;ue(t[1],(([t,n],a)=>{n!==t&&(gt(dt[e],[a],n,t,Xt),s=1)})),s&>(rt[e],void 0,Xt)}}},ss=(e,...t)=>(xs((()=>e(...B(t,b)))),zs),ns=()=>[Re(F,((e,t)=>-1===Le(S,t)?null:Re(e,((e,s)=>-1===Le(Le(E,t),s)?null:Re(e,(([,e])=>e??null),((e,t)=>Ze(t)))),oe)),oe),Re(N,(([,e])=>e??null),((e,t)=>Ze(t)))],as=()=>({cellsTouched:s,valuesTouched:n,changedCells:ye(F,Ye,Ze),invalidCells:ye(P),changedValues:Re(N,Ye,Ze),invalidValues:Re(H),changedTableIds:Re(S),changedRowIds:Te(E),changedCellIds:ye(A),changedValueIds:Re(Q)}),os=()=>ye(_),rs=()=>fe(_),ls=e=>fe(Le(Z,b(e))),is=e=>re(Le(_,b(e))),ds=e=>fe(Le(_,b(e))),cs=(e,t,s,n=0,a)=>{return B(x(j((o=Le(_,b(e)),r=(e,s)=>[k(t)?s:Le(e,b(t)),s],B([...o?.entries()??[]],(([e,t])=>r(t,e)))),(([e],[t])=>Oe(e,t)*(s?-1:1))),n,k(a)?a:n+a),(([,e])=>e));var o,r},us=(e,t)=>fe(Le(Le(_,b(e)),b(t))),hs=(e,t,s)=>Le(Le(Le(_,b(e)),b(t)),b(s)),gs=()=>Re(te),fs=()=>fe(te),Ls=e=>Le(te,b(e)),ws=()=>!ie(_),vs=e=>le(_,b(e)),Is=(e,t)=>le(Le(Z,b(e)),b(t)),Ss=(e,t)=>le(Le(_,b(e)),b(t)),Rs=(e,t,s)=>le(Le(Le(_,b(e)),b(t)),b(s)),Ts=()=>!ie(te),ys=e=>le(te,b(e)),Cs=e=>ss((()=>(e=>tt(e,vt,Gt))(e)?mt(e):0)),ps=e=>ss((()=>Rt(e)?At(e):0)),bs=e=>{try{Vt(et(e))}catch{}return zs},Vs=t=>ss((()=>{if((e=tt(t,(e=>tt(e,wt))))&&(pt(t),!ie(_))){const e=os();Es(),Cs(e)}})),ms=e=>ss((()=>{if(t=(e=>tt(e,wt))(e)){const s=gs();As(),Ds(),t=!0,bt(e),ps(s)}})),Es=()=>ss((()=>mt({}))),ks=e=>ss((e=>le(_,e)?zt(e):0),e),Ms=(e,t)=>ss(((e,t)=>M(Le(_,e),(s=>le(s,t)?Nt(e,s,t):0))),e,t),Ds=()=>ss((()=>At({}))),Js=()=>ss((()=>{pt({}),e=!1})),As=()=>ss((()=>{bt({}),t=!1})),xs=(e,t)=>{if(-1!=h){Fs();const s=e();return Qs(t),s}},Fs=()=>(-1!=h&&h++,1==h&>(ct,void 0,ns,as),zs),Qs=e=>(h>0&&(h--,0==h&&(s=!ie(F),n=!ie(N),h=1,Yt(1),s&&es(1),Zt(1),n&&ts(1),e?.(ns,as)&&(ue(F,((e,t)=>ue(e,((e,s)=>ue(e,(([e],n)=>Ee(zs,t,s,n,e))))))),ue(N,(([e],t)=>ke(zs,t,e))),s=n=!1),gt(ut[0],void 0,ns,as),h=-1,Yt(0),s&&es(0),Zt(0),n&&ts(0),gt(ut[1],void 0,ns,as),h=0,s=n=!1,o=ws(),d=Ts(),W([S,V,m,E,A,F,P,Q,N,H],ce))),zs),zs={getContent:()=>[os(),gs()],getTables:os,getTableIds:rs,getTable:e=>Te(Le(_,b(e))),getTableCellIds:ls,getRowCount:is,getRowIds:ds,getSortedRowIds:cs,getRow:(e,t)=>Re(Le(Le(_,b(e)),b(t))),getCellIds:us,getCell:hs,getValues:gs,getValueIds:fs,getValue:Ls,hasTables:ws,hasTable:vs,hasTableCell:Is,hasRow:Ss,hasCell:Rs,hasValues:Ts,hasValue:ys,getTablesJson:()=>_e(_),getValuesJson:()=>_e(te),getJson:()=>_e([_,te]),getTablesSchemaJson:()=>_e($),getValuesSchemaJson:()=>_e(K),getSchemaJson:()=>_e([$,K]),hasTablesSchema:()=>e,hasValuesSchema:()=>t,setContent:([e,t])=>ss((()=>{(oe(e)?Es:Cs)(e),(oe(t)?Ds:ps)(t)})),setTables:Cs,setTable:(e,t)=>ss((e=>vt(t,e)?Et(e,t):0),e),setRow:(e,t,s)=>ss(((e,t)=>It(e,t,s)?kt(e,Qt(e),t,s):0),e,t),addRow:(e,t,s=!0)=>xs((()=>{let n;return It(e,n,t)&&(e=b(e),kt(e,Qt(e),n=Ft(e,s?1:0),t)),n})),setPartialRow:(e,t,s)=>ss(((e,t)=>{if(It(e,t,s,1)){const n=Qt(e);ae(s,((s,a)=>Dt(e,n,t,a,s)))}}),e,t),setCell:(e,t,s,n)=>ss(((e,t,s)=>M(St(e,t,s,J(n)?n(hs(e,t,s)):n),(n=>Dt(e,Qt(e),t,s,n)))),e,t,s),setValues:ps,setPartialValues:e=>ss((()=>Rt(e,1)?ae(e,((e,t)=>xt(t,e))):0)),setValue:(e,t)=>ss((e=>M(Tt(e,J(t)?t(Ls(e)):t),(t=>xt(e,t)))),e),setTransactionChanges:e=>ss((()=>{ae(e[0],((e,t)=>k(e)?ks(t):ae(e,((e,s)=>k(e)?Ms(t,s):ae(e,((e,n)=>Ee(zs,t,s,n,e))))))),ae(e[1],((e,t)=>ke(zs,t,e)))})),setTablesJson:bs,setValuesJson:e=>{try{Jt(et(e))}catch{}return zs},setJson:e=>ss((()=>{try{const[t,s]=et(e);Vt(t),Jt(s)}catch{bs(e)}})),setTablesSchema:Vs,setValuesSchema:ms,setSchema:(e,t)=>ss((()=>{Vs(e),ms(t)})),delTables:Es,delTable:ks,delRow:Ms,delCell:(e,t,s,n)=>ss(((e,t,s)=>M(Le(_,e),(a=>M(Le(a,t),(o=>le(o,s)?Ot(e,a,t,o,s,n):0))))),e,t,s),delValues:Ds,delValue:e=>ss((e=>le(te,e)?Pt(e):0),e),delTablesSchema:Js,delValuesSchema:As,delSchema:()=>ss((()=>{Js(),As()})),transaction:xs,startTransaction:Fs,finishTransaction:Qs,forEachTable:e=>ue(_,((t,s)=>e(s,(e=>ue(t,((t,s)=>e(s,(e=>we(t,e))))))))),forEachTableCell:(e,t)=>we(Le(Z,b(e)),t),forEachRow:(e,t)=>ue(Le(_,b(e)),((e,s)=>t(s,(t=>we(e,t))))),forEachCell:(e,t,s)=>we(Le(Le(_,b(e)),b(t)),s),forEachValue:e=>we(te,e),addSortedRowIdsListener:(e,t,s,n,a,o,r)=>{let l=cs(e,t,s,n,a);return ht((()=>{const r=cs(e,t,s,n,a);O(r,l)||(l=r,o(zs,e,t,s,n,a,l))}),We[r?1:0],[e,t],[rs])},addStartTransactionListener:e=>ht(e,ct),addWillFinishTransactionListener:e=>ht(e,ut[0]),addDidFinishTransactionListener:e=>ht(e,ut[1]),callListener:e=>(Lt(e),zs),delListener:e=>(ft(e),zs),getListenerStats:()=>({}),createStore:nt,addListener:ht,callListeners:gt};return ae({[u+f]:[0,de,[],()=>[ws()]],[f]:[0,Ve],[L]:[0,Je],[u+g]:[1,Ae,[rs],e=>[vs(...e)]],[g]:[1,xe,[rs]],[g+T]:[1,Fe,[rs]],[u+g+R]:[2,Ne,[rs,ls],e=>[Is(...e)]],[v]:[1,Pe,[rs]],[I]:[1,je,[rs]],[u+w]:[2,Be,[rs,ds],e=>[Ss(...e)]],[w]:[2,He,[rs,ds]],[T]:[2,$e,[rs,ds]],[u+R]:[3,qe,[rs,ds,us],e=>[Rs(...e)]],[R]:[3,Ge,[rs,ds,us],e=>Ue(hs(...e))],InvalidCell:[3,Ke],[u+C]:[0,ot,[],()=>[Ts()]],[C]:[0,rt],[p]:[0,lt],[u+y]:[1,it,[fs],e=>[ys(...e)]],[y]:[1,dt,[fs],e=>Ue(Ls(e[0]))],InvalidValue:[1,at]},(([e,t,s,n],a)=>{zs[c+a+i]=(...a)=>ht(a[e],t[a[e+1]?1:0],e>0?x(a,0,e):void 0,s,n)})),ee(zs)};export{Ne as createCheckpoints,qe as createCustomPersister,Pe as createIndexes,Be as createMetrics,Ge as createQueries,Ke as createRelationships,nt as createStore,Oe as defaultSorter};
|
package/lib/tinybase.js.gz
CHANGED
|
Binary file
|
|
@@ -785,16 +785,14 @@ export interface Checkpoints {
|
|
|
785
785
|
* removing all the checkpoints it has been managing.
|
|
786
786
|
*
|
|
787
787
|
* Obviously this method should be used with caution as it destroys the
|
|
788
|
-
* ability to undo recent changes to the Store (though of course the
|
|
789
|
-
* itself is not reset by this method).
|
|
788
|
+
* ability to undo or redo recent changes to the Store (though of course the
|
|
789
|
+
* Store itself is not reset by this method).
|
|
790
790
|
*
|
|
791
791
|
* This method can be useful when a Store is being loaded via a Persister
|
|
792
792
|
* asynchronously after the Checkpoints object has been attached, and you
|
|
793
793
|
* don't want users to be able to undo the initial load of the data. In this
|
|
794
|
-
* you could call the clear method immediately after the initial load so
|
|
795
|
-
* that is the baseline from which all subsequent changes are tracked.
|
|
796
|
-
*
|
|
797
|
-
* If you are listening to
|
|
794
|
+
* case you could call the clear method immediately after the initial load so
|
|
795
|
+
* that that is the baseline from which all subsequent changes are tracked.
|
|
798
796
|
* @returns A reference to the Checkpoints object.
|
|
799
797
|
* @example
|
|
800
798
|
* This example creates a Store, a Checkpoints object, adds a listener, makes
|
|
@@ -837,6 +835,60 @@ export interface Checkpoints {
|
|
|
837
835
|
*/
|
|
838
836
|
clear(): Checkpoints;
|
|
839
837
|
|
|
838
|
+
/**
|
|
839
|
+
* The clearForward method resets just the 'redo' checkpoints it has been
|
|
840
|
+
* managing.
|
|
841
|
+
*
|
|
842
|
+
* Obviously this method should be used with caution as it destroys the
|
|
843
|
+
* ability to redo recent changes to the Store (though of course the Store
|
|
844
|
+
* itself is not reset by this method).
|
|
845
|
+
*
|
|
846
|
+
* This method can be useful when you want to prohibit a user from redoing
|
|
847
|
+
* changes they have undone. The 'backward' redo stack, and current checkpoint
|
|
848
|
+
* are not affected.
|
|
849
|
+
* @returns A reference to the Checkpoints object.
|
|
850
|
+
* @example
|
|
851
|
+
* This example creates a Store, a Checkpoints object, adds a listener, makes
|
|
852
|
+
* a change and then clears the forward checkpoints.
|
|
853
|
+
*
|
|
854
|
+
* ```js
|
|
855
|
+
* const store = createStore().setTables({pets: {fido: {sold: false}}});
|
|
856
|
+
*
|
|
857
|
+
* const checkpoints = createCheckpoints(store);
|
|
858
|
+
* console.log(checkpoints.getCheckpointIds());
|
|
859
|
+
* // -> [[], '0', []]
|
|
860
|
+
*
|
|
861
|
+
* const listenerId = checkpoints.addCheckpointIdsListener(() => {
|
|
862
|
+
* console.log('checkpoints changed');
|
|
863
|
+
* });
|
|
864
|
+
*
|
|
865
|
+
* store.setCell('pets', 'fido', 'color', 'brown');
|
|
866
|
+
* // -> 'checkpoints changed'
|
|
867
|
+
* checkpoints.addCheckpoint();
|
|
868
|
+
* // -> 'checkpoints changed'
|
|
869
|
+
* store.setCell('pets', 'fido', 'sold', true);
|
|
870
|
+
* // -> 'checkpoints changed'
|
|
871
|
+
* checkpoints.addCheckpoint();
|
|
872
|
+
* // -> 'checkpoints changed'
|
|
873
|
+
* checkpoints.goBackward();
|
|
874
|
+
* // -> 'checkpoints changed'
|
|
875
|
+
*
|
|
876
|
+
* console.log(store.getTables());
|
|
877
|
+
* // -> {pets: {fido: {color: 'brown', sold: false}}}
|
|
878
|
+
* console.log(checkpoints.getCheckpointIds());
|
|
879
|
+
* // -> [['0'], '1', ['2']]
|
|
880
|
+
*
|
|
881
|
+
* checkpoints.clearForward();
|
|
882
|
+
* // -> 'checkpoints changed'
|
|
883
|
+
*
|
|
884
|
+
* console.log(checkpoints.getCheckpointIds());
|
|
885
|
+
* // -> [['0'], '1', []]
|
|
886
|
+
* ```
|
|
887
|
+
* @category Lifecycle
|
|
888
|
+
* @since v4.5.3
|
|
889
|
+
*/
|
|
890
|
+
clearForward(): Checkpoints;
|
|
891
|
+
|
|
840
892
|
/**
|
|
841
893
|
* The destroy method should be called when this Checkpoints object is no
|
|
842
894
|
* longer used.
|
|
@@ -0,0 +1,164 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The persister-electric-sql module of the TinyBase project lets you save and
|
|
3
|
+
* load Store data to and from a local ElectricSQL database (in an appropriate
|
|
4
|
+
* environment).
|
|
5
|
+
* @see Persisting Data guide
|
|
6
|
+
* @packageDocumentation
|
|
7
|
+
* @module persister-sqlite3
|
|
8
|
+
* @since v4.6.0
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import {DatabasePersisterConfig, Persister} from '../persisters';
|
|
12
|
+
import {ElectricClient} from 'electric-sql/client/model';
|
|
13
|
+
import {Store} from '../store';
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* The ElectricSqlPersister interface is a minor extension to the Persister
|
|
17
|
+
* interface.
|
|
18
|
+
*
|
|
19
|
+
* It simply provides an extra getElectricClient method for accessing a
|
|
20
|
+
* reference to the Electric client the Store is being persisted to.
|
|
21
|
+
* @since v4.6.0
|
|
22
|
+
*/
|
|
23
|
+
export interface ElectricSqlPersister extends Persister {
|
|
24
|
+
/**
|
|
25
|
+
* The getElectricClient method returns a reference to the Electric client the
|
|
26
|
+
* Store is being persisted to.
|
|
27
|
+
* @returns A reference to the Electric client.
|
|
28
|
+
* @example
|
|
29
|
+
* This example creates a Persister object against a newly-created Store and
|
|
30
|
+
* then gets the Electric client back out again.
|
|
31
|
+
*
|
|
32
|
+
* ```js yolo
|
|
33
|
+
* const electricClient = await electrify(
|
|
34
|
+
* await ElectricDatabase.init('electric.db', ''),
|
|
35
|
+
* schema,
|
|
36
|
+
* {url: ELECTRIC_URL},
|
|
37
|
+
* );
|
|
38
|
+
* const store = createStore().setTables({pets: {fido: {species: 'dog'}}});
|
|
39
|
+
* const persister = createElectricSqlPersister(
|
|
40
|
+
* store,
|
|
41
|
+
* electricClient,
|
|
42
|
+
* 'my_tinybase',
|
|
43
|
+
* );
|
|
44
|
+
*
|
|
45
|
+
* console.log(persister.getElectricClient() == electricClient);
|
|
46
|
+
* // -> true
|
|
47
|
+
*
|
|
48
|
+
* persister.destroy();
|
|
49
|
+
* ```
|
|
50
|
+
* @category Getter
|
|
51
|
+
* @since v4.6.0
|
|
52
|
+
*/
|
|
53
|
+
getElectricClient: () => ElectricClient<any>;
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* The createElectricSqlPersister function creates a Persister object that can
|
|
58
|
+
* persist the Store to a local ElectricSQL database (in an appropriate
|
|
59
|
+
* environment).
|
|
60
|
+
*
|
|
61
|
+
* As well as providing a reference to the Store to persist, you must provide a
|
|
62
|
+
* `electricClient` parameter which identifies the Electric client.
|
|
63
|
+
*
|
|
64
|
+
* A database Persister uses one of two modes: either a JSON serialization of
|
|
65
|
+
* the whole Store stored in a single row of a table (the default), or a tabular
|
|
66
|
+
* mapping of Table Ids to database table names and vice-versa).
|
|
67
|
+
*
|
|
68
|
+
* The third argument is a DatabasePersisterConfig object that configures which
|
|
69
|
+
* of those modes to use, and settings for each. If the third argument is simply
|
|
70
|
+
* a string, it is used as the `storeTableName` property of the JSON
|
|
71
|
+
* serialization.
|
|
72
|
+
*
|
|
73
|
+
* See the documentation for the DpcJson and DpcTabular types for more
|
|
74
|
+
* information on how both of those modes can be configured.
|
|
75
|
+
* @param store The Store to persist.
|
|
76
|
+
* @param electricClient The Electric client that was returned from `await
|
|
77
|
+
* electrify(...)`.
|
|
78
|
+
* @param configOrStoreTableName A DatabasePersisterConfig to configure the
|
|
79
|
+
* persistence mode (or a string to set the `storeTableName` property of the
|
|
80
|
+
* JSON serialization).
|
|
81
|
+
* @param onSqlCommand An optional handler called every time the Persister
|
|
82
|
+
* executes a SQL command or query. This is suitable for logging persistence
|
|
83
|
+
* behavior in a development environment.
|
|
84
|
+
* @param onIgnoredError An optional handler for the errors that the Persister
|
|
85
|
+
* would otherwise ignore when trying to save or load data. This is suitable for
|
|
86
|
+
* debugging persistence issues in a development environment.
|
|
87
|
+
* @returns A reference to the new ElectricSqlPersister object.
|
|
88
|
+
* @example
|
|
89
|
+
* This example creates a ElectricSqlPersister object and persists the Store to
|
|
90
|
+
* a local ElectricSql database as a JSON serialization into the `my_tinybase`
|
|
91
|
+
* table. It makes a change to the database directly and then reloads it back
|
|
92
|
+
* into the Store.
|
|
93
|
+
*
|
|
94
|
+
* ```js yolo
|
|
95
|
+
* const electricClient = await electrify(
|
|
96
|
+
* await ElectricDatabase.init('electric.db', ''),
|
|
97
|
+
* schema,
|
|
98
|
+
* {url: ELECTRIC_URL},
|
|
99
|
+
* );
|
|
100
|
+
* const store = createStore().setTables({pets: {fido: {species: 'dog'}}});
|
|
101
|
+
* const persister = createElectricSqlPersister(
|
|
102
|
+
* store,
|
|
103
|
+
* electricClient,
|
|
104
|
+
* 'my_tinybase',
|
|
105
|
+
* );
|
|
106
|
+
*
|
|
107
|
+
* await persister.save();
|
|
108
|
+
* // Store will be saved to the database.
|
|
109
|
+
*
|
|
110
|
+
* console.log(
|
|
111
|
+
* await electricClient.db.raw({sql: 'SELECT * FROM my_tinybase;'}),
|
|
112
|
+
* );
|
|
113
|
+
* // -> [{_id: '_', store: '[{"pets":{"fido":{"species":"dog"}}},{}]'}]
|
|
114
|
+
*
|
|
115
|
+
* await electricClient.db.raw({
|
|
116
|
+
* sql:
|
|
117
|
+
* 'UPDATE my_tinybase SET store = ' +
|
|
118
|
+
* `'[{"pets":{"felix":{"species":"cat"}}},{}]' WHERE _id = '_';`,
|
|
119
|
+
* });
|
|
120
|
+
* await persister.load();
|
|
121
|
+
* console.log(store.getTables());
|
|
122
|
+
* // -> {pets: {felix: {species: 'cat'}}}
|
|
123
|
+
*
|
|
124
|
+
* persister.destroy();
|
|
125
|
+
* ```
|
|
126
|
+
* @example
|
|
127
|
+
* This example creates a ElectricSqlPersister object and persists the Store to
|
|
128
|
+
* a local ElectricSql database with tabular mapping.
|
|
129
|
+
*
|
|
130
|
+
* ```js yolo
|
|
131
|
+
* const electricClient = await electrify(
|
|
132
|
+
* await ElectricDatabase.init('electric.db', ''),
|
|
133
|
+
* schema,
|
|
134
|
+
* {url: ELECTRIC_URL},
|
|
135
|
+
* );
|
|
136
|
+
* const store = createStore().setTables({pets: {fido: {species: 'dog'}}});
|
|
137
|
+
* const persister = createElectricSqlPersister(store, electricClient, {
|
|
138
|
+
* mode: 'tabular',
|
|
139
|
+
* tables: {load: {pets: 'pets'}, save: {pets: 'pets'}},
|
|
140
|
+
* });
|
|
141
|
+
*
|
|
142
|
+
* await persister.save();
|
|
143
|
+
* console.log(await electricClient.db.raw({sql: 'SELECT * FROM pets;'}));
|
|
144
|
+
* // -> [{_id: 'fido', species: 'dog'}]
|
|
145
|
+
*
|
|
146
|
+
* await electricClient.db.raw({
|
|
147
|
+
* sql: `INSERT INTO pets (_id, species) VALUES ('felix', 'cat')`,
|
|
148
|
+
* });
|
|
149
|
+
* await persister.load();
|
|
150
|
+
* console.log(store.getTables());
|
|
151
|
+
* // -> {pets: {fido: {species: 'dog'}, felix: {species: 'cat'}}}
|
|
152
|
+
*
|
|
153
|
+
* persister.destroy();
|
|
154
|
+
* ```
|
|
155
|
+
* @category Creation
|
|
156
|
+
* @since v4.6.0
|
|
157
|
+
*/
|
|
158
|
+
export function createElectricSqlPersister(
|
|
159
|
+
store: Store,
|
|
160
|
+
electricClient: ElectricClient<any>,
|
|
161
|
+
configOrStoreTableName?: DatabasePersisterConfig | string,
|
|
162
|
+
onSqlCommand?: (sql: string, args?: any[]) => void,
|
|
163
|
+
onIgnoredError?: (error: any) => void,
|
|
164
|
+
): ElectricSqlPersister;
|
|
@@ -87,10 +87,10 @@ export interface ExpoSqliteNextPersister extends Persister {
|
|
|
87
87
|
* JSON serialization).
|
|
88
88
|
* @param onSqlCommand An optional handler called every time the Persister
|
|
89
89
|
* executes a SQL command or query. This is suitable for logging persistence
|
|
90
|
-
* behavior in a development environment
|
|
90
|
+
* behavior in a development environment.
|
|
91
91
|
* @param onIgnoredError An optional handler for the errors that the Persister
|
|
92
92
|
* would otherwise ignore when trying to save or load data. This is suitable for
|
|
93
|
-
* debugging persistence issues in a development environment
|
|
93
|
+
* debugging persistence issues in a development environment.
|
|
94
94
|
* @returns A reference to the new ExpoSqliteNextPersister object.
|
|
95
95
|
* @example
|
|
96
96
|
* This example creates a ExpoSqliteNextPersister object and persists the Store
|
|
@@ -22,6 +22,7 @@ import {
|
|
|
22
22
|
Cell,
|
|
23
23
|
CellOrUndefined,
|
|
24
24
|
Tables,
|
|
25
|
+
TransactionChanges,
|
|
25
26
|
Value,
|
|
26
27
|
ValueOrUndefined,
|
|
27
28
|
Values,
|
|
@@ -248,7 +249,7 @@ export class TinyBasePartyKitServer implements Server {
|
|
|
248
249
|
tableId: Id,
|
|
249
250
|
initialSave: boolean,
|
|
250
251
|
requestOrConnection: Request | Connection,
|
|
251
|
-
): boolean
|
|
252
|
+
): Promise<boolean>;
|
|
252
253
|
/**
|
|
253
254
|
* The canDelTable method lets you allow or disallow deletions of a Table
|
|
254
255
|
* stored on the server, as sent from a client.
|
|
@@ -280,7 +281,7 @@ export class TinyBasePartyKitServer implements Server {
|
|
|
280
281
|
* @category Sanitization
|
|
281
282
|
* @since v4.3.12
|
|
282
283
|
*/
|
|
283
|
-
canDelTable(tableId: Id, connection: Connection): boolean
|
|
284
|
+
canDelTable(tableId: Id, connection: Connection): Promise<boolean>;
|
|
284
285
|
/**
|
|
285
286
|
* The canSetRow method lets you allow or disallow any changes to a Row stored
|
|
286
287
|
* on the server, as sent from a client.
|
|
@@ -323,7 +324,7 @@ export class TinyBasePartyKitServer implements Server {
|
|
|
323
324
|
rowId: Id,
|
|
324
325
|
initialSave: boolean,
|
|
325
326
|
requestOrConnection: Request | Connection,
|
|
326
|
-
): boolean
|
|
327
|
+
): Promise<boolean>;
|
|
327
328
|
/**
|
|
328
329
|
* The canDelRow method lets you allow or disallow deletions of a Row stored
|
|
329
330
|
* on the server, as sent from a client.
|
|
@@ -356,7 +357,7 @@ export class TinyBasePartyKitServer implements Server {
|
|
|
356
357
|
* @category Sanitization
|
|
357
358
|
* @since v4.3.12
|
|
358
359
|
*/
|
|
359
|
-
canDelRow(tableId: Id, rowId: Id, connection: Connection): boolean
|
|
360
|
+
canDelRow(tableId: Id, rowId: Id, connection: Connection): Promise<boolean>;
|
|
360
361
|
/**
|
|
361
362
|
* The canSetCell method lets you allow or disallow any changes to a Cell
|
|
362
363
|
* stored on the server, as sent from a client.
|
|
@@ -405,7 +406,7 @@ export class TinyBasePartyKitServer implements Server {
|
|
|
405
406
|
initialSave: boolean,
|
|
406
407
|
requestOrConnection: Request | Connection,
|
|
407
408
|
oldCell: CellOrUndefined,
|
|
408
|
-
): boolean
|
|
409
|
+
): Promise<boolean>;
|
|
409
410
|
/**
|
|
410
411
|
* The canDelCell method lets you allow or disallow deletions of a Cell stored
|
|
411
412
|
* on the server, as sent from a client.
|
|
@@ -443,7 +444,7 @@ export class TinyBasePartyKitServer implements Server {
|
|
|
443
444
|
rowId: Id,
|
|
444
445
|
cellId: Id,
|
|
445
446
|
connection: Connection,
|
|
446
|
-
): boolean
|
|
447
|
+
): Promise<boolean>;
|
|
447
448
|
/**
|
|
448
449
|
* The canSetValue method lets you allow or disallow any changes to a Value
|
|
449
450
|
* stored on the server, as sent from a client.
|
|
@@ -490,7 +491,7 @@ export class TinyBasePartyKitServer implements Server {
|
|
|
490
491
|
initialSave: boolean,
|
|
491
492
|
requestOrConnection: Request | Connection,
|
|
492
493
|
oldValue: ValueOrUndefined,
|
|
493
|
-
): boolean
|
|
494
|
+
): Promise<boolean>;
|
|
494
495
|
/**
|
|
495
496
|
* The canDelValue method lets you allow or disallow deletions of a Value
|
|
496
497
|
* stored on the server, as sent from a client.
|
|
@@ -522,7 +523,7 @@ export class TinyBasePartyKitServer implements Server {
|
|
|
522
523
|
* @category Sanitization
|
|
523
524
|
* @since v4.3.12
|
|
524
525
|
*/
|
|
525
|
-
canDelValue(valueId: Id, connection: Connection): boolean
|
|
526
|
+
canDelValue(valueId: Id, connection: Connection): Promise<boolean>;
|
|
526
527
|
}
|
|
527
528
|
|
|
528
529
|
/**
|
|
@@ -573,3 +574,26 @@ export function loadStoreFromStorage(
|
|
|
573
574
|
storage: Storage,
|
|
574
575
|
storagePrefix?: string,
|
|
575
576
|
): Promise<[Tables, Values]>;
|
|
577
|
+
|
|
578
|
+
/**
|
|
579
|
+
* The broadcastTransactionChanges function allows you to broadcast Store
|
|
580
|
+
* changes to all the client connections of a TinyBasePartyKitServer.
|
|
581
|
+
*
|
|
582
|
+
* This is intended for specialist applications that require the ability to
|
|
583
|
+
* update clients of a TinyBasePartyKitServer in their own custom ways.
|
|
584
|
+
*
|
|
585
|
+
* The function is asynchronous, so you should use the `await` keyword or handle
|
|
586
|
+
* its completion as a promise.
|
|
587
|
+
* @param server A reference to the TinyBasePartyKitServer object.
|
|
588
|
+
* @param transactionChanges The Store changes to broadcast to the server's
|
|
589
|
+
* clients.
|
|
590
|
+
* @param without An optional array of client connection Ids to exclude from the
|
|
591
|
+
* broadcast.
|
|
592
|
+
* @category Connection
|
|
593
|
+
* @since v4.5.1
|
|
594
|
+
*/
|
|
595
|
+
export function broadcastTransactionChanges(
|
|
596
|
+
server: TinyBasePartyKitServer,
|
|
597
|
+
transactionChanges: TransactionChanges,
|
|
598
|
+
without?: string[],
|
|
599
|
+
): Promise<void>;
|
|
@@ -15,11 +15,13 @@
|
|
|
15
15
|
* |persister-indexed-db|createIndexedDbPersister|Browser IndexedDB|
|
|
16
16
|
* |persister-remote|createRemotePersister|Remote server|
|
|
17
17
|
* |persister-file|createFilePersister|Local file (where possible)|
|
|
18
|
+
* |persister-partykit-client|createPartyKitPersister|PartyKit with the persister-partykit-server module|
|
|
18
19
|
* |persister-sqlite3|createSqlite3Persister|SQLite in Node, via [sqlite3](https://github.com/TryGhost/node-sqlite3)|
|
|
19
20
|
* |persister-sqlite-wasm|createSqliteWasmPersister|SQLite in a browser, via [sqlite-wasm](https://github.com/tomayac/sqlite-wasm)|
|
|
20
21
|
* |persister-cr-sqlite-wasm|createCrSqliteWasmPersister|SQLite CRDTs, via [cr-sqlite-wasm](https://github.com/vlcn-io/cr-sqlite)|
|
|
21
22
|
* |persister-expo-sqlite|createExpoSqlitePersister|SQLite in React Native, via [expo-sqlite](https://github.com/expo/expo/tree/main/packages/expo-sqlite)|
|
|
22
23
|
* |persister-expo-sqlite-next|createExpoSqliteNextPersister|SQLite in React Native, via [expo-sqlite/next](https://github.com/expo/expo/tree/main/packages/expo-sqlite/next)|
|
|
24
|
+
* |persister-electric-sql|createElectricSqlPersister|Electric SQL, via [electric-sql](https://github.com/electric-sql/electric)|
|
|
23
25
|
* |persister-yjs|createYjsPersister|Yjs CRDTs, via [yjs](https://github.com/yjs/yjs)|
|
|
24
26
|
* |persister-automerge|createSqliteWasmPersister|Automerge CRDTs, via [automerge-repo](https://github.com/automerge/automerge-repo)|
|
|
25
27
|
*
|