tinybase 1.0.1 → 1.0.5
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.d.ts +66 -0
- package/lib/checkpoints.js +1 -1
- package/lib/checkpoints.js.gz +0 -0
- package/lib/debug/checkpoints.d.ts +66 -0
- package/lib/debug/checkpoints.js +8 -4
- package/lib/debug/indexes.d.ts +167 -6
- package/lib/debug/indexes.js +31 -0
- package/lib/debug/metrics.d.ts +72 -0
- package/lib/debug/metrics.js +8 -0
- package/lib/debug/relationships.d.ts +86 -1
- package/lib/debug/relationships.js +14 -0
- package/lib/debug/store.d.ts +28 -5
- package/lib/debug/store.js +2 -0
- package/lib/debug/tinybase.js +53 -4
- package/lib/indexes.d.ts +167 -6
- package/lib/indexes.js +1 -1
- package/lib/indexes.js.gz +0 -0
- package/lib/metrics.d.ts +72 -0
- package/lib/metrics.js +1 -1
- package/lib/metrics.js.gz +0 -0
- package/lib/relationships.d.ts +86 -1
- package/lib/relationships.js +1 -1
- package/lib/relationships.js.gz +0 -0
- package/lib/store.d.ts +28 -5
- package/lib/store.js +1 -1
- package/lib/store.js.gz +0 -0
- package/lib/tinybase.js +1 -1
- package/lib/tinybase.js.gz +0 -0
- package/lib/umd/checkpoints.js +1 -1
- package/lib/umd/checkpoints.js.gz +0 -0
- package/lib/umd/indexes.js +1 -1
- package/lib/umd/indexes.js.gz +0 -0
- package/lib/umd/metrics.js +1 -1
- package/lib/umd/metrics.js.gz +0 -0
- package/lib/umd/relationships.js +1 -1
- package/lib/umd/relationships.js.gz +0 -0
- package/lib/umd/store.js +1 -1
- package/lib/umd/store.js.gz +0 -0
- package/lib/umd/tinybase.js +1 -1
- package/lib/umd/tinybase.js.gz +0 -0
- package/package.json +18 -11
- package/readme.md +2 -2
package/lib/umd/store.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var e,t;e=this,t=function(e){"use strict";const t=e=>typeof e,s=t(""),n=t(!0),r=t(0),
|
|
1
|
+
var e,t;e=this,t=function(e){"use strict";const t=e=>typeof e,s=t(""),n=t(!0),r=t(0),l=t(t),o="type",a="default",d=(e,t)=>e.forEach(t),c=e=>e.length,i=e=>0==c(e),u=e=>e.slice(1),f=e=>JSON.stringify(e,((e,t)=>{return p(t,Map)?(s=[...t],n=(e,[t,s])=>(e[t]=s,e),r={},s.reduce(n,r)):t;var s,n,r})),h=JSON.parse,b=isFinite,p=(e,t)=>e instanceof t,T=e=>null==e,g=(e,t,s)=>T(e)?s?.():t(e),y=e=>e==s||e==n,w=(e,t)=>e?.has(t)??!1,L=e=>T(e)||0==(e=>e.size)(e),R=e=>e.clear(),S=(e,t)=>e?.forEach(t),C=(e,t)=>e?.delete(t),v=e=>new Map(e),I=(e=v)=>[e(),e()],m=e=>[...e?.keys()??[]],E=(e,t)=>e?.get(t),J=(e,t)=>S(e,((e,s)=>t(s,e))),O=(e,t,s)=>T(s)?(C(e,t),e):e?.set(t,s),j=(e,t,s,n)=>(w(e,t)||(n?.(s),e.set(t,s)),E(e,t)),x=(e,t)=>{const s={},n=t??(e=>e);return S(e,((e,t)=>s[t]=n(e))),s},z=(e,t)=>{const s=v(),n=t??(e=>e);return S(e,((e,t)=>s.set(t,n(e)))),s},M=Object,k=M.keys,F=M.isFrozen,N=M.freeze,P=(e,t)=>!T(((e,t)=>g(e,(e=>e[t])))(e,t)),_=(e,t)=>delete e[t],B=(e,t)=>d(M.entries(e),(([e,s])=>t(s,e))),q=e=>new Set(e),A=(e,t,s)=>c(s)<2?((e,t)=>e?.add(t))(i(s)?e:j(e,s[0],q()),t):A(j(e,s[0],v()),t,u(s)),D=e=>{const t=(s,n,...r)=>g(s,(s=>i(r)?e(s,n):d([r[0],null],(e=>t(E(s,e),n,...u(r))))));return t},G=(e,t,s,n=O)=>{const r=(l=m(e),o=e=>!P(t,e),l.filter(o));var l,o;return d(k(t),(n=>s(e,n,t[n]))),d(r,(t=>n(e,t))),e},H=e=>{const s=t(e);return y(s)||s==r&&b(e)?s:void 0},K=(e,t)=>!(T(e)||!(e=>p(e,M)&&e.constructor==M)(e)||F(e)||(B(e,((s,n)=>{t(s,n)||_(e,n)})),(e=>i(k(e)))(e))),Q=(e,t,s)=>O(e,t,E(e,t)==-s?void 0:s);e.createStore=()=>{let e,s=0,n=0;const i=v(),u=v(),b=v(),p=v(),M=v(),k=v(),F=v(),U=I(q),V=I(q),W=I(),X=I(),Y=I(),Z=I(),$=I(),[ee,te,se,ne]=(e=>{let t,s=0;const n=[],r=v();return[(l,o,a=[])=>{t??=e();const d=n.pop()??""+s++;return O(r,d,[l,o,a]),A(o,d,a),d},(e,s=[],...n)=>D(S)(e,(e=>g(E(r,e),(([e])=>e(t,...s,...n)))),...s),e=>g(E(r,e),(([,t,s])=>(D(C)(t,e,...s),O(r,e),c(n)<1e3&&n.push(e),s)),(()=>[])),(e,s,n)=>g(E(r,e),(([e,,r])=>{const l=(...o)=>{const a=c(o);a==c(r)?e(t,...o,...n(o)):T(r[a])?d(s[a](...o),(e=>l(...o,e))):l(...o,r[a])};l()}))]})((()=>ke)),re=(t,s)=>(!e||w(M,s))&&K(t,(e=>le(s,e))),le=(e,t,s)=>K(s?t:ae(t,e),((s,n)=>g(oe(e,n,s),(e=>(t[n]=e,!0)),(()=>!1)))),oe=(t,s,n)=>e?g(E(E(M,t),s),(e=>H(n)!=e.type?e.default:n)):T(H(n))?void 0:n,ae=(e,t)=>(g(E(k,t),(t=>B(t,((t,s)=>{P(e,s)||(e[s]=t)})))),e),de=e=>G(M,e,((e,t,s)=>{const n={};G(j(M,t,v()),s,((e,t,s)=>{O(e,t,s),g(s.default,(e=>n[t]=e))})),O(k,t,n)}),((e,t)=>{O(M,t),O(k,t)})),ce=e=>G(F,e,((e,t,s)=>ie(t,s)),((e,t)=>ge(t))),ie=(e,t)=>G(j(F,e,v(),(()=>Le(e,1))),t,((t,s,n)=>ue(e,t,s,n)),((t,s)=>ye(e,t,s))),ue=(e,t,s,n,r)=>G(j(t,s,v(),(()=>Re(e,s,1))),n,((t,n,r)=>fe(e,s,t,n,r)),((n,l)=>we(e,t,s,n,l,r))),fe=(e,t,s,n,r)=>{w(s,n)||Se(e,t,n,1);const l=E(s,n);r!==l&&(Ce(e,t,n,l),O(s,n,r))},he=(e,t,s)=>Me((()=>ue(e,Te(e),t,s))),be=(e,t,s,n,r)=>g(E(t,s),(t=>fe(e,s,t,n,r)),(()=>ue(e,t,s,ae({[n]:r},e)))),pe=e=>{const t=""+s++;return w(e,t)?pe(e):t},Te=e=>E(F,e)??ie(e,{}),ge=e=>ie(e,{}),ye=(e,t,s)=>ue(e,t,s,{},!0),we=(e,t,s,n,r,l)=>{const o=E(k,e)?.[r];if(!T(o)&&!l)return fe(e,s,n,r,o);const a=t=>{Ce(e,s,t,E(n,t)),Se(e,s,t,-1),O(n,t)};T(o)?a(r):J(n,a),L(n)&&(Re(e,s,-1),L(O(t,s))&&(Le(e,-1),O(F,e)))},Le=(e,t)=>Q(i,e,t),Re=(e,t,s)=>Q(j(u,e,v()),t,s),Se=(e,t,s,n)=>Q(j(j(b,e,v()),t,v()),s,n),Ce=(e,t,s,n)=>j(j(j(p,e,v()),t,v()),s,n),ve=(e,t,s)=>{const n=E(E(p,e),t),r=je(e,t,s);return w(n,s)?[!0,E(n,s),r]:[!1,r,r]},Ie=e=>{const t=L(Z[e])&&L(X[e])&&L(V[e]),s=L($[e])&&L(Y[e])&&L(W[e])&&L(U[e]);if(t&&s)return;const n=e?[z(i),z(u,z),z(b,(e=>z(e,z))),z(p,(e=>z(e,z)))]:[i,u,b,p];if(t||(S(n[2],((t,s)=>S(t,((t,n)=>{L(t)||te(Z[e],[s,n])})))),S(n[1],((t,s)=>{L(t)||te(X[e],[s])})),L(n[0])||te(V[e])),!s){let t;S(n[3],((s,n)=>{let r;S(s,((s,l)=>{let o;S(s,((s,a)=>{const d=je(n,l,a);d!==s&&(te($[e],[n,l,a],d,s,ve),t=r=o=1)})),o&&te(Y[e],[n,l],ve)})),r&&te(W[e],[n],ve)})),t&&te(U[e],[],ve)}},me=()=>x(F,(e=>x(e,x))),Ee=()=>m(F),Je=e=>m(E(F,e)),Oe=(e,t)=>m(E(E(F,e),t)),je=(e,t,s)=>E(E(E(F,e),t),s),xe=e=>((e=>K(e,re))(e)&&Me((()=>ce(e))),ke),ze=()=>(Me((()=>ce({}))),ke),Me=e=>{if(-1==n)return;n++;const t=e();return n--,0==n&&(n=1,Ie(1),n=-1,Ie(0),n=0,d([p,i,u,b],R)),t},ke={getTables:me,getTableIds:Ee,getTable:e=>x(E(F,e),x),getRowIds:Je,getRow:(e,t)=>x(E(E(F,e),t)),getCellIds:Oe,getCell:je,hasTables:()=>!L(F),hasTable:e=>w(F,e),hasRow:(e,t)=>w(E(F,e),t),hasCell:(e,t,s)=>w(E(E(F,e),t),s),getJson:()=>f(F),getSchemaJson:()=>f(M),setTables:xe,setTable:(e,t)=>(re(t,e)&&Me((()=>ie(e,t))),ke),setRow:(e,t,s)=>(le(e,s)&&he(e,t,s),ke),addRow:(e,t)=>{let s;return le(e,t)&&(s=pe(E(F,e)),he(e,s,t)),s},setPartialRow:(e,t,s)=>(le(e,s,1)&&Me((()=>{const n=Te(e);B(s,((s,r)=>be(e,n,t,r,s)))})),ke),setCell:(e,s,n,r)=>(g(oe(e,n,t(r)==l?r(je(e,s,n)):r),(t=>Me((()=>be(e,Te(e),s,n,t))))),ke),setJson:e=>{try{"{}"===e?ze():xe(h(e))}catch{}return ke},setSchema:t=>{if((e=(e=>K(e,(e=>K(e,(e=>{if(!K(e,((e,t)=>[o,a].includes(t))))return!1;const t=e.type;return!(!y(t)&&t!=r||(H(e.default)!=t&&_(e,a),0))})))))(t))&&(de(t),!L(F))){const e=me();ze(),xe(e)}return ke},delTables:ze,delTable:e=>(w(F,e)&&Me((()=>ge(e))),ke),delRow:(e,t)=>(g(E(F,e),(s=>{w(s,t)&&Me((()=>ye(e,s,t)))})),ke),delCell:(e,t,s,n)=>(g(E(F,e),(r=>g(E(r,t),(l=>{w(l,s)&&Me((()=>we(e,r,t,l,s,n)))})))),ke),delSchema:()=>(de({}),e=!1,ke),transaction:Me,forEachTable:e=>S(F,((t,s)=>e(s,(e=>S(t,((t,s)=>e(s,(e=>J(t,e))))))))),forEachRow:(e,t)=>S(E(F,e),((e,s)=>t(s,(t=>J(e,t))))),forEachCell:(e,t,s)=>J(E(E(F,e),t),s),addTablesListener:(e,t)=>ee(e,U[t?1:0]),addTableIdsListener:(e,t)=>ee(e,V[t?1:0]),addTableListener:(e,t,s)=>ee(t,W[s?1:0],[e]),addRowIdsListener:(e,t,s)=>ee(t,X[s?1:0],[e]),addRowListener:(e,t,s,n)=>ee(s,Y[n?1:0],[e,t]),addCellIdsListener:(e,t,s,n)=>ee(s,Z[n?1:0],[e,t]),addCellListener:(e,t,s,n,r)=>ee(n,$[r?1:0],[e,t,s]),callListener:e=>(ne(e,[Ee,Je,Oe],(e=>T(e[2])?[]:[,,].fill(je(...e)))),ke),delListener:e=>(se(e),ke),getListenerStats:()=>({})};return N(ke)},Object.defineProperty(e,"__esModule",{value:!0})},"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).TinyBaseStore={});
|
package/lib/umd/store.js.gz
CHANGED
|
Binary file
|
package/lib/umd/tinybase.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var e,t;e=this,t=function(e,t){"use strict";const s=e=>typeof e,n="",o=s(n),r=s(!0),a=s(0),i=s(s),d="type",l="default",c="utf8",u=(e,t)=>e.includes(t),f=(e,t)=>e.every(((s,n)=>0==n||t(e[n-1],s)<=0)),g=(e,t)=>e.sort(t),h=(e,t)=>e.forEach(t),p=e=>w(e,((e,t)=>e+t),0),L=e=>e.length,v=e=>0==L(e),w=(e,t,s)=>e.reduce(t,s),y=e=>e.slice(1),I=e=>JSON.stringify(e,((e,t)=>m(t,Map)?w([...t],((e,[t,s])=>(e[t]=s,e)),{}):t)),S=JSON.parse,R=Math.max,T=Math.min,b=isFinite,m=(e,t)=>e instanceof t,C=e=>null==e,k=(e,t,s)=>C(e)?s?.():t(e),M=e=>e==o||e==r,x=e=>s(e)==i,A=()=>{},E=e=>e.size,P=(e,t)=>e?.has(t)??!1,D=e=>C(e)||0==E(e),J=e=>[...e?.values()??[]],F=e=>e.clear(),O=(e,t)=>e?.forEach(t),j=(e,t)=>e?.delete(t),z=e=>new Map(e),N=(e=z)=>[e(),e()],B=e=>[...e?.keys()??[]],_=(e,t)=>e?.get(t),q=(e,t)=>O(e,((e,s)=>t(s,e))),H=(e,t,s)=>C(s)?(j(e,t),e):e?.set(t,s),W=(e,t,s,n)=>(P(e,t)||(n?.(s),e.set(t,s)),_(e,t)),G=(e,t)=>{const s={},n=t??(e=>e);return O(e,((e,t)=>s[t]=n(e))),s},K=(e,t)=>{const s=z(),n=t??(e=>e);return O(e,((e,t)=>s.set(t,n(e)))),s},Q=e=>new Set(e),U=(e,t)=>e?.add(t),V=(e,t,s)=>{const n=e.hasRow,o=z(),r=z(),a=z(),i=z(),d=z(),l=t=>k(_(d,t),(s=>{O(s,e.delListener),H(d,t)})),c=e=>{H(o,e),H(r,e),H(a,e),H(i,e),l(e)};return[()=>e,()=>B(o),e=>_(o,e),e=>_(r,e),(e,t)=>H(r,e,t),(c,u,f,g,p)=>{const L=z(),v=z();H(o,c,u),P(r,c)||(H(r,c,t()),H(a,c,z()),H(i,c,z()));const w=_(a,c),y=_(i,c),I=t=>{const o=s=>e.getCell(u,t,s),r=_(w,t),a=n(u,t)?s(g(o,t)):void 0;if(r!=a&&H(L,t,[r,a]),!C(p)){const e=_(y,t),s=n(u,t)?p(o,t):void 0;e!=s&&H(v,t,s)}},S=e=>{f((()=>{O(L,(([,e],t)=>H(w,t,e))),O(v,((e,t)=>H(y,t,e)))}),L,v,w,y,e),F(L),F(v)};q(w,I),e.hasTable(u)&&h(e.getRowIds(u),(e=>{P(w,e)||I(e)})),S(!0),l(c),H(d,c,Q([e.addRowListener(u,null,((e,t,s)=>I(s))),e.addTableListener(u,(()=>S()))]))},c,()=>q(d,c)]},X=(e,t)=>s(e)==o?t=>t(e):e??(()=>t??n),Y=e=>{const t=new WeakMap;return s=>(t.has(s)||t.set(s,e(s)),t.get(s))},Z=(e,t,s)=>L(s)<2?U(v(s)?e:W(e,s[0],Q()),t):Z(W(e,s[0],z()),t,y(s)),$=e=>{const t=(s,n,...o)=>k(s,(s=>v(o)?e(s,n):h([o[0],null],(e=>t(_(s,e),n,...y(o))))));return t},ee=e=>{let t,s=0;const n=[],o=z();return[(r,a,i=[])=>{t??=e();const d=n.pop()??""+s++;return H(o,d,[r,a,i]),Z(a,d,i),d},(e,s=[],...n)=>$(O)(e,(e=>k(_(o,e),(([e])=>e(t,...s,...n)))),...s),e=>k(_(o,e),(([,t,s])=>($(j)(t,e,...s),H(o,e),L(n)<1e3&&n.push(e),s)),(()=>[])),(e,s,n)=>k(_(o,e),(([e,,o])=>{const r=(...a)=>{const i=L(a);i==L(o)?e(t,...a,...n(a)):C(o[i])?h(s[i](...a),(e=>r(...a,e))):r(...a,o[i])};r()}))]},te=Object,se=te.keys,ne=te.isFrozen,oe=te.freeze,re=(e,t)=>!C(((e,t)=>k(e,(e=>e[t])))(e,t)),ae=(e,t)=>delete e[t],ie=(e,t)=>h(te.entries(e),(([e,s])=>t(s,e))),de=Y((e=>{let t,s,n,o=100,r=z(),a=1;const i=Q(),d=z(),[l,c,f]=ee((()=>F)),g=z(),p=z(),w=[],y=[],I=(t,s)=>{a=0,e.transaction((()=>O(_(g,s),((s,n)=>O(s,((s,o)=>O(s,((s,r)=>C(s[t])?e.delCell(n,o,r,!0):e.setCell(n,o,r,s[t]))))))))),a=1},S=e=>{H(g,e),H(p,e),c(d,[e])},R=(e,t)=>h(((e,t)=>e.splice(0,t))(e,t??L(e)),S),T=()=>R(w,L(w)-o),b=e.addCellListener(null,null,null,((e,s,o,i,d,l)=>{if(a){k(t,(()=>{w.push(t),T(),R(y),t=void 0,n=1}));const e=W(r,s,z()),a=W(e,o,z()),c=W(a,i,[void 0,void 0],(e=>e[0]=l));c[1]=d,c[0]===c[1]&&D(H(a,i))&&D(H(e,o))&&D(H(r,s))&&(t=w.pop(),n=1),A()}})),m=(e="")=>(C(t)&&(t=""+s++,H(g,t,r),J(t,e),r=z(),n=1),t),M=()=>{v(w)||(y.unshift(m()),I(0,t),t=w.pop(),n=1)},x=()=>{v(y)||(w.push(t),t=y.shift(),I(1,t),n=1)},A=()=>{n&&(c(i),n=0)},E=e=>{const t=m(e);return A(),t},J=(e,t)=>(P(g,e)&&_(p,e)!==t&&(H(p,e,t),c(d,[e])),F),F={setSize:e=>(o=e,T(),F),addCheckpoint:E,setCheckpoint:J,getStore:()=>e,getCheckpointIds:()=>[[...w],t,[...y]],getCheckpoint:e=>_(p,e),goBackward:()=>(M(),A(),F),goForward:()=>(x(),A(),F),goTo:e=>{const s=u(w,e)?M:u(y,e)?x:null;for(;!C(s)&&e!=t;)s();return A(),F},addCheckpointIdsListener:e=>l(e,i),addCheckpointListener:(e,t)=>l(t,d,[e]),delListener:e=>(f(e),F),clear:()=>(R(w),R(y),C(t)||S(t),t=void 0,s=0,E(),F),destroy:()=>{e.delListener(b)},getListenerStats:()=>({})};return oe(F.clear())})),le=(e,t)=>e<t?-1:1,ce=Y((e=>{const t=z(),s=z(),[o,r,a,i,d,l,c,u]=V(e,z,(e=>C(e)?n:e+n)),[h,p,L]=ee((()=>v)),v={setIndexDefinition:(e,n,o,r,a,c=le)=>{const u=C(a)?void 0:([e],[t])=>a(e,t);return l(e,n,((n,o,a,l,h,L)=>{let v=0;const w=Q(),y=Q(),I=i(e);if(O(o,(([e,t],s)=>{C(e)||(U(w,e),k(_(I,e),(t=>{j(t,s),D(t)&&(H(I,e),v=1)}))),C(t)||(U(w,t),P(I,t)||(H(I,t,Q()),v=1),U(_(I,t),s),C(r)||U(y,t))})),n(),D(h)||(L?q(I,(e=>U(y,e))):q(a,(e=>k(_(l,e),(e=>U(y,e))))),O(y,(e=>{const t=(t,s)=>c(_(h,t),_(h,s),e),s=[..._(I,e)];f(s,t)||(H(I,e,Q(g(s,t))),U(w,e))}))),(v||L)&&!C(u)){const t=[...I];f(t,u)||(d(e,z(g(t,u))),v=1)}v&&p(t,[e]),O(w,(t=>p(s,[e,t])))}),X(o),k(r,X)),v},delIndexDefinition:e=>(c(e),v),getStore:o,getIndexIds:r,getTableId:a,getSliceIds:e=>B(i(e)),getSliceRowIds:(e,t)=>J(_(i(e),t)),addSliceIdsListener:(e,s)=>h(s,t,[e]),addSliceRowIdsListener:(e,t,n)=>h(n,s,[e,t]),delListener:e=>(L(e),v),destroy:u,getListenerStats:()=>({})};return oe(v)})),ue=z([["avg",[(e,t)=>p(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=>R(...e),(e,t)=>R(t,e),(e,t)=>t==e?void 0:e,(e,t,s)=>s==e?void 0:R(t,e)]],["min",[e=>T(...e),(e,t)=>T(t,e),(e,t)=>t==e?void 0:e,(e,t,s)=>s==e?void 0:T(t,e)]],["sum",[e=>p(e),(e,t)=>e+t,(e,t)=>e-t,(e,t,s)=>e-s+t]]]),fe=Y((e=>{const t=z(),[s,o,r,a,i,d,l,c]=V(e,A,(e=>isNaN(e)||C(e)||!0===e||!1===e||e===n?void 0:1*e)),[u,f,g]=ee((()=>h)),h={setMetricDefinition:(e,s,n,o,r,l,c)=>{const u=x(n)?[n,r,l,c]:_(ue,n)??_(ue,"sum");return d(e,s,((s,n,o,r,d,l)=>{let c=a(e),g=E(r);const[h,p,L,v]=u;l=l||C(c),O(n,(([e,t])=>{l||(c=C(e)?p?.(c,t,g++):C(t)?L?.(c,e,g--):v?.(c,t,e,g)),l=l||C(c)})),s(),D(r)?c=void 0:l&&(c=h(J(r),E(r))),b(c)||(c=void 0);const w=a(e);c!=w&&(i(e,c),f(t,[e],c,w))}),X(o,1)),h},delMetricDefinition:e=>(l(e),h),getStore:s,getMetricIds:o,getTableId:r,getMetric:a,addMetricListener:(e,s)=>u(s,t,[e]),delListener:e=>(g(e),h),destroy:c,getListenerStats:()=>({})};return oe(h)})),ge=(e,t,s,n,o)=>{let r,a=0;const i={load:async s=>{if(2!=a){a=1;const n=await t();C(n)||""==n?e.setTables(s):e.setJson(n),a=0}return i},startAutoLoad:async e=>(i.stopAutoLoad(),await i.load(e),n(i.load),i),stopAutoLoad:()=>(o(),i),save:async()=>(1!=a&&(a=2,await s(e.getJson()),a=0),i),startAutoSave:async()=>(await i.stopAutoSave().save(),r=e.addTablesListener((()=>i.save())),i),stopAutoSave:()=>(k(r,e.delListener),i),getStore:()=>e,destroy:()=>i.stopAutoLoad().stopAutoSave(),getStats:()=>({})};return oe(i)},he="storage",pe=globalThis.window,Le=(e,t,s)=>{let n;return ge(e,(async()=>s.getItem(t)),(async e=>s.setItem(t,e)),(e=>{n=n=>{n.storageArea===s&&n.key===t&&e()},pe.addEventListener(he,n)}),(()=>{pe.removeEventListener(he,n),n=void 0}))},ve=e=>e.headers.get("ETag"),we=Y((e=>{const t=z(),s=z(),o=z(),r=z(),[a,i,d,l,c,u,f,g]=V(e,(()=>[z(),z(),z(),z()]),(e=>C(e)?void 0:e+n)),[h,p,L]=ee((()=>I)),v=(e,t,s)=>k(l(e),(([n,,o])=>{if(!P(o,t)){const r=Q();if(d(e)!=y(e))U(r,t);else{let e=t;for(;!C(e)&&!P(r,e);)U(r,e),e=_(n,e)}if(s)return r;H(o,t,r)}return _(o,t)})),w=(e,t)=>k(l(e),(([,,e])=>H(e,t))),y=e=>_(t,e),I={setRelationshipDefinition:(e,n,a,i)=>(H(t,e,a),u(e,n,((t,n)=>{const a=Q(),i=Q(),d=Q(),[c,u]=l(e);O(n,(([t,s],n)=>{C(t)||(U(i,t),k(_(u,t),(e=>{j(e,n),D(e)&&H(u,t)}))),C(s)||(U(i,s),P(u,s)||H(u,s,Q()),U(_(u,s),n)),U(a,n),H(c,n,s),q(_(r,e),(t=>{P(v(e,t),n)&&U(d,t)}))})),t(),O(a,(t=>p(s,[e,t]))),O(i,(t=>p(o,[e,t]))),O(d,(t=>{w(e,t),p(r,[e,t])}))}),X(i)),I),delRelationshipDefinition:e=>(H(t,e),f(e),I),getStore:a,getRelationshipIds:i,getLocalTableId:d,getRemoteTableId:y,getRemoteRowId:(e,t)=>_(l(e)?.[0],t),getLocalRowIds:(e,t)=>J(_(l(e)?.[1],t)),getLinkedRowIds:(e,t)=>C(l(e))?[t]:J(v(e,t,!0)),addRemoteRowIdListener:(e,t,n)=>h(n,s,[e,t]),addLocalRowIdsListener:(e,t,s)=>h(s,o,[e,t]),addLinkedRowIdsListener:(e,t,s)=>(v(e,t),h(s,r,[e,t])),delListener:e=>(w(...L(e)),I),destroy:g,getListenerStats:()=>({})};return oe(I)})),ye=(e,t,s,n=H)=>{const o=(r=B(e),a=e=>!re(t,e),r.filter(a));var r,a;return h(se(t),(n=>s(e,n,t[n]))),h(o,(t=>n(e,t))),e},Ie=e=>{const t=s(e);return M(t)||t==a&&b(e)?t:void 0},Se=(e,t)=>!(C(e)||!(e=>m(e,te)&&e.constructor==te)(e)||ne(e)||(ie(e,((s,n)=>{t(s,n)||ae(e,n)})),(e=>v(se(e)))(e))),Re=(e,t,s)=>H(e,t,_(e,t)==-s?void 0:s);e.createCheckpoints=de,e.createCustomPersister=ge,e.createFilePersister=(e,s)=>{let n;return ge(e,(async()=>{try{return await t.promises.readFile(s,c)}catch{}}),(async e=>{try{await t.promises.writeFile(s,e,c)}catch{}}),(e=>{n=t.watch(s,e)}),(()=>{n?.close(),n=void 0}))},e.createIndexes=ce,e.createLocalPersister=(e,t)=>Le(e,t,localStorage),e.createMetrics=fe,e.createRelationships=we,e.createRemotePersister=(e,t,s,n)=>{let o,r;return ge(e,(async()=>{const e=await fetch(t);return r=ve(e),e.text()}),(async e=>await fetch(s,{method:"POST",headers:{"Content-Type":"application/json"},body:e})),(e=>{o=setInterval((async()=>{const s=await fetch(t,{method:"HEAD"}),n=ve(s);C(r)||C(n)||n==r||(r=n,e())}),1e3*n)}),(()=>{k(o,clearInterval),o=void 0}))},e.createSessionPersister=(e,t)=>Le(e,t,sessionStorage),e.createStore=()=>{let e,t=0,s=0;const n=z(),o=z(),r=z(),i=z(),c=z(),f=z(),g=z(),p=N(Q),L=N(Q),v=N(),w=N(),y=N(),R=N(),T=N(),[b,m,A,E]=ee((()=>Ee)),J=(t,s)=>(!e||P(c,s))&&Se(t,(e=>j(s,e))),j=(e,t,s)=>Se(s?t:V(t,e),((s,n)=>k(U(e,n,s),(e=>(t[n]=e,!0)),(()=>!1)))),U=(t,s,n)=>e?k(_(_(c,t),s),(e=>Ie(n)!=e.type?e.default:n)):C(Ie(n))?void 0:n,V=(e,t)=>(k(_(f,t),(t=>ie(t,((t,s)=>{re(e,s)||(e[s]=t)})))),e),X=e=>ye(c,e,((e,t,s)=>{const n={};ye(W(c,t,z()),s,((e,t,s)=>{H(e,t,s),k(s.default,(e=>n[t]=e))})),H(f,t,n)}),((e,t)=>{H(c,t),H(f,t)})),Y=e=>ye(g,e,((e,t,s)=>Z(t,s)),((e,t)=>ce(t))),Z=(e,t)=>ye(W(g,e,z(),(()=>ge(e,1))),t,((t,s,n)=>$(e,t,s,n)),((t,s)=>ue(e,t,s))),$=(e,t,s,n,o)=>ye(W(t,s,z(),(()=>he(e,s,1))),n,((t,n,o)=>te(e,s,t,n,o)),((n,r)=>fe(e,t,s,n,r,o))),te=(e,t,s,n,o)=>{P(s,n)||pe(e,t,n,1);const r=_(s,n);o!==r&&(Le(e,t,n,r),H(s,n,o))},se=(e,t,s)=>Ae((()=>$(e,le(e),t,s))),ne=(e,t,s,n,o)=>k(_(t,s),(t=>te(e,s,t,n,o)),(()=>$(e,t,s,V({[n]:o},e)))),de=e=>{const s=""+t++;return P(e,s)?de(e):s},le=e=>_(g,e)??Z(e,{}),ce=e=>Z(e,{}),ue=(e,t,s)=>$(e,t,s,{},!0),fe=(e,t,s,n,o,r)=>{const a=_(f,e)?.[o];if(!C(a)&&!r)return te(e,s,n,o,a);const i=t=>{Le(e,s,t,_(n,t)),pe(e,s,t,-1),H(n,t)};C(a)?i(o):q(n,i),D(n)&&(he(e,s,-1),D(H(t,s))&&(ge(e,-1),H(g,e)))},ge=(e,t)=>Re(n,e,t),he=(e,t,s)=>Re(W(o,e,z()),t,s),pe=(e,t,s,n)=>Re(W(W(r,e,z()),t,z()),s,n),Le=(e,t,s,n)=>W(W(W(i,e,z()),t,z()),s,n),ve=(e,t,s)=>{const n=_(_(i,e),t),o=ke(e,t,s);return P(n,s)?[!0,_(n,s),o]:[!1,o,o]},we=e=>{const t=D(R[e])&&D(w[e])&&D(L[e]),s=D(T[e])&&D(y[e])&&D(v[e])&&D(p[e]);if(t&&s)return;const a=e?[K(n),K(o,K),K(r,(e=>K(e,K))),K(i,(e=>K(e,K)))]:[n,o,r,i];if(t||(O(a[2],((t,s)=>O(t,((t,n)=>{D(t)||m(R[e],[s,n])})))),O(a[1],((t,s)=>{D(t)||m(w[e],[s])})),D(a[0])||m(L[e])),!s){let t;O(a[3],((s,n)=>{let o;O(s,((s,r)=>{let a;O(s,((s,i)=>{const d=ke(n,r,i);d!==s&&(m(T[e],[n,r,i],d,s,ve),t=o=a=1)})),a&&m(y[e],[n,r],ve)})),o&&m(v[e],[n],ve)})),t&&m(p[e],[],ve)}},Te=()=>G(g,(e=>G(e,G))),be=()=>B(g),me=e=>B(_(g,e)),Ce=(e,t)=>B(_(_(g,e),t)),ke=(e,t,s)=>_(_(_(g,e),t),s),Me=e=>((e=>Se(e,J))(e)&&Ae((()=>Y(e))),Ee),xe=()=>(Ae((()=>Y({}))),Ee),Ae=e=>{if(-1==s)return;s++;const t=e();return s--,0==s&&(s=1,we(1),s=-1,we(0),s=0,h([i,n,o,r],F)),t},Ee={getTables:Te,getTableIds:be,getTable:e=>G(_(g,e),G),getRowIds:me,getRow:(e,t)=>G(_(_(g,e),t)),getCellIds:Ce,getCell:ke,hasTable:e=>P(g,e),hasRow:(e,t)=>P(_(g,e),t),hasCell:(e,t,s)=>P(_(_(g,e),t),s),getJson:()=>I(g),getSchemaJson:()=>I(c),setTables:Me,setTable:(e,t)=>(J(t,e)&&Ae((()=>Z(e,t))),Ee),setRow:(e,t,s)=>(j(e,s)&&se(e,t,s),Ee),addRow:(e,t)=>{let s;return j(e,t)&&(s=de(_(g,e)),se(e,s,t)),s},setPartialRow:(e,t,s)=>(j(e,s,1)&&Ae((()=>{const n=le(e);ie(s,((s,o)=>ne(e,n,t,o,s)))})),Ee),setCell:(e,t,s,n)=>(k(U(e,s,x(n)?n(ke(e,t,s)):n),(n=>Ae((()=>ne(e,le(e),t,s,n))))),Ee),setJson:e=>{try{"{}"===e?xe():Me(S(e))}catch{}return Ee},setSchema:t=>{if((e=(e=>Se(e,(e=>Se(e,(e=>{if(!Se(e,((e,t)=>u([d,l],t))))return!1;const t=e.type;return!(!M(t)&&t!=a||(Ie(e.default)!=t&&ae(e,l),0))})))))(t))&&(X(t),!D(g))){const e=Te();xe(),Me(e)}return Ee},delTables:xe,delTable:e=>(P(g,e)&&Ae((()=>ce(e))),Ee),delRow:(e,t)=>(k(_(g,e),(s=>{P(s,t)&&Ae((()=>ue(e,s,t)))})),Ee),delCell:(e,t,s,n)=>(k(_(g,e),(o=>k(_(o,t),(r=>{P(r,s)&&Ae((()=>fe(e,o,t,r,s,n)))})))),Ee),delSchema:()=>(X({}),e=!1,Ee),transaction:Ae,forEachTable:e=>O(g,((t,s)=>e(s,(e=>O(t,((t,s)=>e(s,(e=>q(t,e))))))))),forEachRow:(e,t)=>O(_(g,e),((e,s)=>t(s,(t=>q(e,t))))),forEachCell:(e,t,s)=>q(_(_(g,e),t),s),addTablesListener:(e,t)=>b(e,p[t?1:0]),addTableIdsListener:(e,t)=>b(e,L[t?1:0]),addTableListener:(e,t,s)=>b(t,v[s?1:0],[e]),addRowIdsListener:(e,t,s)=>b(t,w[s?1:0],[e]),addRowListener:(e,t,s,n)=>b(s,y[n?1:0],[e,t]),addCellIdsListener:(e,t,s,n)=>b(s,R[n?1:0],[e,t]),addCellListener:(e,t,s,n,o)=>b(n,T[o?1:0],[e,t,s]),callListener:e=>(E(e,[be,me,Ce],(e=>C(e[2])?[]:[,,].fill(ke(...e)))),Ee),delListener:e=>(A(e),Ee),getListenerStats:()=>({})};return oe(Ee)},e.defaultSorter=le,Object.defineProperty(e,"__esModule",{value:!0})},"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("fs")):"function"==typeof define&&define.amd?define(["exports","fs"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).TinyBase={},e.fs);
|
|
1
|
+
var e,t;e=this,t=function(e,t){"use strict";const s=e=>typeof e,o="",n=s(o),r=s(!0),a=s(0),i=s(s),d="type",l="default",c="utf8",u=(e,t)=>e.includes(t),f=(e,t)=>e.every(((s,o)=>0==o||t(e[o-1],s)<=0)),h=(e,t)=>e.sort(t),g=(e,t)=>e.forEach(t),p=e=>v(e,((e,t)=>e+t),0),L=e=>e.length,w=e=>0==L(e),v=(e,t,s)=>e.reduce(t,s),y=e=>e.slice(1),I=e=>JSON.stringify(e,((e,t)=>C(t,Map)?v([...t],((e,[t,s])=>(e[t]=s,e)),{}):t)),S=JSON.parse,R=Math.max,T=Math.min,b=isFinite,C=(e,t)=>e instanceof t,m=e=>null==e,k=(e,t,s)=>m(e)?s?.():t(e),E=e=>e==n||e==r,M=e=>s(e)==i,x=()=>{},A=e=>e.size,P=(e,t)=>e?.has(t)??!1,D=e=>m(e)||0==A(e),J=e=>[...e?.values()??[]],F=e=>e.clear(),O=(e,t)=>e?.forEach(t),j=(e,t)=>e?.delete(t),z=e=>new Map(e),N=(e=z)=>[e(),e()],B=e=>[...e?.keys()??[]],_=(e,t)=>e?.get(t),q=(e,t)=>O(e,((e,s)=>t(s,e))),H=(e,t,s)=>m(s)?(j(e,t),e):e?.set(t,s),W=(e,t,s,o)=>(P(e,t)||(o?.(s),e.set(t,s)),_(e,t)),G=(e,t)=>{const s={},o=t??(e=>e);return O(e,((e,t)=>s[t]=o(e))),s},K=(e,t)=>{const s=z(),o=t??(e=>e);return O(e,((e,t)=>s.set(t,o(e)))),s},Q=e=>new Set(e),U=(e,t)=>e?.add(t),V=(e,t,s)=>{const o=e.hasRow,n=z(),r=z(),a=z(),i=z(),d=z(),l=t=>k(_(d,t),(s=>{O(s,e.delListener),H(d,t)})),c=e=>{H(n,e),H(r,e),H(a,e),H(i,e),l(e)};return[()=>e,()=>B(n),e=>q(r,e),e=>P(r,e),e=>_(n,e),e=>_(r,e),(e,t)=>H(r,e,t),(c,u,f,h,p)=>{const L=z(),w=z();H(n,c,u),P(r,c)||(H(r,c,t()),H(a,c,z()),H(i,c,z()));const v=_(a,c),y=_(i,c),I=t=>{const n=s=>e.getCell(u,t,s),r=_(v,t),a=o(u,t)?s(h(n,t)):void 0;if(r!=a&&H(L,t,[r,a]),!m(p)){const e=_(y,t),s=o(u,t)?p(n,t):void 0;e!=s&&H(w,t,s)}},S=e=>{f((()=>{O(L,(([,e],t)=>H(v,t,e))),O(w,((e,t)=>H(y,t,e)))}),L,w,v,y,e),F(L),F(w)};q(v,I),e.hasTable(u)&&g(e.getRowIds(u),(e=>{P(v,e)||I(e)})),S(!0),l(c),H(d,c,Q([e.addRowListener(u,null,((e,t,s)=>I(s))),e.addTableListener(u,(()=>S()))]))},c,()=>q(d,c)]},X=(e,t)=>s(e)==n?t=>t(e):e??(()=>t??o),Y=e=>{const t=new WeakMap;return s=>(t.has(s)||t.set(s,e(s)),t.get(s))},Z=(e,t,s)=>L(s)<2?U(w(s)?e:W(e,s[0],Q()),t):Z(W(e,s[0],z()),t,y(s)),$=e=>{const t=(s,o,...n)=>k(s,(s=>w(n)?e(s,o):g([n[0],null],(e=>t(_(s,e),o,...y(n))))));return t},ee=e=>{let t,s=0;const o=[],n=z();return[(r,a,i=[])=>{t??=e();const d=o.pop()??""+s++;return H(n,d,[r,a,i]),Z(a,d,i),d},(e,s=[],...o)=>$(O)(e,(e=>k(_(n,e),(([e])=>e(t,...s,...o)))),...s),e=>k(_(n,e),(([,t,s])=>($(j)(t,e,...s),H(n,e),L(o)<1e3&&o.push(e),s)),(()=>[])),(e,s,o)=>k(_(n,e),(([e,,n])=>{const r=(...a)=>{const i=L(a);i==L(n)?e(t,...a,...o(a)):m(n[i])?g(s[i](...a),(e=>r(...a,e))):r(...a,n[i])};r()}))]},te=Object,se=te.keys,oe=te.isFrozen,ne=te.freeze,re=(e,t)=>!m(((e,t)=>k(e,(e=>e[t])))(e,t)),ae=(e,t)=>delete e[t],ie=(e,t)=>g(te.entries(e),(([e,s])=>t(s,e))),de=Y((e=>{let t,s,o,n=100,r=z(),a=1;const i=Q(),d=z(),[l,c,f]=ee((()=>j)),h=z(),p=z(),v=[],y=[],I=(t,s)=>{a=0,e.transaction((()=>O(_(h,s),((s,o)=>O(s,((s,n)=>O(s,((s,r)=>m(s[t])?e.delCell(o,n,r,!0):e.setCell(o,n,r,s[t]))))))))),a=1},S=e=>{H(h,e),H(p,e),c(d,[e])},R=(e,t)=>g(((e,t)=>e.splice(0,t))(e,t??L(e)),S),T=()=>R(v,L(v)-n),b=e.addCellListener(null,null,null,((e,s,n,i,d,l)=>{if(a){k(t,(()=>{v.push(t),T(),R(y),t=void 0,o=1}));const e=W(r,s,z()),a=W(e,n,z()),c=W(a,i,[void 0,void 0],(e=>e[0]=l));c[1]=d,c[0]===c[1]&&D(H(a,i))&&D(H(e,n))&&D(H(r,s))&&(t=v.pop(),o=1),x()}})),C=(e="")=>(m(t)&&(t=""+s++,H(h,t,r),J(t,e),r=z(),o=1),t),E=()=>{w(v)||(y.unshift(C()),I(0,t),t=v.pop(),o=1)},M=()=>{w(y)||(v.push(t),t=y.shift(),I(1,t),o=1)},x=()=>{o&&(c(i),o=0)},A=e=>{const t=C(e);return x(),t},J=(e,t)=>(F(e)&&_(p,e)!==t&&(H(p,e,t),c(d,[e])),j),F=e=>P(h,e),j={setSize:e=>(n=e,T(),j),addCheckpoint:A,setCheckpoint:J,getStore:()=>e,getCheckpointIds:()=>[[...v],t,[...y]],forEachCheckpoint:e=>q(p,e),hasCheckpoint:F,getCheckpoint:e=>_(p,e),goBackward:()=>(E(),x(),j),goForward:()=>(M(),x(),j),goTo:e=>{const s=u(v,e)?E:u(y,e)?M:null;for(;!m(s)&&e!=t;)s();return x(),j},addCheckpointIdsListener:e=>l(e,i),addCheckpointListener:(e,t)=>l(t,d,[e]),delListener:e=>(f(e),j),clear:()=>(R(v),R(y),m(t)||S(t),t=void 0,s=0,A(),j),destroy:()=>{e.delListener(b)},getListenerStats:()=>({})};return ne(j.clear())})),le=(e,t)=>e<t?-1:1,ce=Y((e=>{const t=z(),s=z(),[n,r,a,i,d,l,c,u,g,p]=V(e,z,(e=>m(e)?o:e+o)),[L,w,v]=ee((()=>I)),y=(t,s,o)=>{const n=d(t);O(o,((t,o)=>s(o,(s=>O(t,(t=>s(t,(s=>e.forEachCell(n,t,s)))))))))},I={setIndexDefinition:(e,o,n,r,a,i=le)=>{const d=m(a)?void 0:([e],[t])=>a(e,t);return u(e,o,((o,n,a,u,g,p)=>{let L=0;const v=Q(),y=Q(),I=l(e);if(O(n,(([e,t],s)=>{m(e)||(U(v,e),k(_(I,e),(t=>{j(t,s),D(t)&&(H(I,e),L=1)}))),m(t)||(U(v,t),P(I,t)||(H(I,t,Q()),L=1),U(_(I,t),s),m(r)||U(y,t))})),o(),D(g)||(p?q(I,(e=>U(y,e))):q(a,(e=>k(_(u,e),(e=>U(y,e))))),O(y,(e=>{const t=(t,s)=>i(_(g,t),_(g,s),e),s=[..._(I,e)];f(s,t)||(H(I,e,Q(h(s,t))),U(v,e))}))),(L||p)&&!m(d)){const t=[...I];f(t,d)||(c(e,z(h(t,d))),L=1)}L&&w(t,[e]),O(v,(t=>w(s,[e,t])))}),X(n),k(r,X)),I},delIndexDefinition:e=>(g(e),I),getStore:n,getIndexIds:r,forEachIndex:e=>a(((t,s)=>e(t,(e=>y(t,e,s))))),forEachSlice:(e,t)=>y(e,t,l(e)),hasIndex:i,hasSlice:(e,t)=>P(l(e),t),getTableId:d,getSliceIds:e=>B(l(e)),getSliceRowIds:(e,t)=>J(_(l(e),t)),addSliceIdsListener:(e,s)=>L(s,t,[e]),addSliceRowIdsListener:(e,t,o)=>L(o,s,[e,t]),delListener:e=>(v(e),I),destroy:p,getListenerStats:()=>({})};return ne(I)})),ue=z([["avg",[(e,t)=>p(e)/t,(e,t,s)=>e+(t-e)/(s+1),(e,t,s)=>e+(e-t)/(s-1),(e,t,s,o)=>e+(t-s)/o]],["max",[e=>R(...e),(e,t)=>R(t,e),(e,t)=>t==e?void 0:e,(e,t,s)=>s==e?void 0:R(t,e)]],["min",[e=>T(...e),(e,t)=>T(t,e),(e,t)=>t==e?void 0:e,(e,t,s)=>s==e?void 0:T(t,e)]],["sum",[e=>p(e),(e,t)=>e+t,(e,t)=>e-t,(e,t,s)=>e-s+t]]]),fe=Y((e=>{const t=z(),[s,n,r,a,i,d,l,c,u,f]=V(e,x,(e=>isNaN(e)||m(e)||!0===e||!1===e||e===o?void 0:1*e)),[h,g,p]=ee((()=>L)),L={setMetricDefinition:(e,s,o,n,r,a,i)=>{const u=M(o)?[o,r,a,i]:_(ue,o)??_(ue,"sum");return c(e,s,((s,o,n,r,a,i)=>{let c=d(e),f=A(r);const[h,p,L,w]=u;i=i||m(c),O(o,(([e,t])=>{i||(c=m(e)?p?.(c,t,f++):m(t)?L?.(c,e,f--):w?.(c,t,e,f)),i=i||m(c)})),s(),D(r)?c=void 0:i&&(c=h(J(r),A(r))),b(c)||(c=void 0);const v=d(e);c!=v&&(l(e,c),g(t,[e],c,v))}),X(n,1)),L},delMetricDefinition:e=>(u(e),L),getStore:s,getMetricIds:n,forEachMetric:r,hasMetric:a,getTableId:i,getMetric:d,addMetricListener:(e,s)=>h(s,t,[e]),delListener:e=>(p(e),L),destroy:f,getListenerStats:()=>({})};return ne(L)})),he=(e,t,s,o,n)=>{let r,a=0;const i={load:async s=>{if(2!=a){a=1;const o=await t();m(o)||""==o?e.setTables(s):e.setJson(o),a=0}return i},startAutoLoad:async e=>(i.stopAutoLoad(),await i.load(e),o(i.load),i),stopAutoLoad:()=>(n(),i),save:async()=>(1!=a&&(a=2,await s(e.getJson()),a=0),i),startAutoSave:async()=>(await i.stopAutoSave().save(),r=e.addTablesListener((()=>i.save())),i),stopAutoSave:()=>(k(r,e.delListener),i),getStore:()=>e,destroy:()=>i.stopAutoLoad().stopAutoSave(),getStats:()=>({})};return ne(i)},ge="storage",pe=globalThis.window,Le=(e,t,s)=>{let o;return he(e,(async()=>s.getItem(t)),(async e=>s.setItem(t,e)),(e=>{o=o=>{o.storageArea===s&&o.key===t&&e()},pe.addEventListener(ge,o)}),(()=>{pe.removeEventListener(ge,o),o=void 0}))},we=e=>e.headers.get("ETag"),ve=Y((e=>{const t=z(),s=z(),n=z(),r=z(),[a,i,d,l,c,u,f,h,g,p]=V(e,(()=>[z(),z(),z(),z()]),(e=>m(e)?void 0:e+o)),[L,w,v]=ee((()=>R)),y=(e,t,s)=>k(u(e),(([o,,n])=>{if(!P(n,t)){const r=Q();if(c(e)!=S(e))U(r,t);else{let e=t;for(;!m(e)&&!P(r,e);)U(r,e),e=_(o,e)}if(s)return r;H(n,t,r)}return _(n,t)})),I=(e,t)=>k(u(e),(([,,e])=>H(e,t))),S=e=>_(t,e),R={setRelationshipDefinition:(e,o,a,i)=>(H(t,e,a),h(e,o,((t,o)=>{const a=Q(),i=Q(),d=Q(),[l,c]=u(e);O(o,(([t,s],o)=>{m(t)||(U(i,t),k(_(c,t),(e=>{j(e,o),D(e)&&H(c,t)}))),m(s)||(U(i,s),P(c,s)||H(c,s,Q()),U(_(c,s),o)),U(a,o),H(l,o,s),q(_(r,e),(t=>{P(y(e,t),o)&&U(d,t)}))})),t(),O(a,(t=>w(s,[e,t]))),O(i,(t=>w(n,[e,t]))),O(d,(t=>{I(e,t),w(r,[e,t])}))}),X(i)),R),delRelationshipDefinition:e=>(H(t,e),g(e),R),getStore:a,getRelationshipIds:i,forEachRelationship:t=>d((s=>t(s,(t=>e.forEachRow(c(s),t))))),hasRelationship:l,getLocalTableId:c,getRemoteTableId:S,getRemoteRowId:(e,t)=>_(u(e)?.[0],t),getLocalRowIds:(e,t)=>J(_(u(e)?.[1],t)),getLinkedRowIds:(e,t)=>m(u(e))?[t]:J(y(e,t,!0)),addRemoteRowIdListener:(e,t,o)=>L(o,s,[e,t]),addLocalRowIdsListener:(e,t,s)=>L(s,n,[e,t]),addLinkedRowIdsListener:(e,t,s)=>(y(e,t),L(s,r,[e,t])),delListener:e=>(I(...v(e)),R),destroy:p,getListenerStats:()=>({})};return ne(R)})),ye=(e,t,s,o=H)=>{const n=(r=B(e),a=e=>!re(t,e),r.filter(a));var r,a;return g(se(t),(o=>s(e,o,t[o]))),g(n,(t=>o(e,t))),e},Ie=e=>{const t=s(e);return E(t)||t==a&&b(e)?t:void 0},Se=(e,t)=>!(m(e)||!(e=>C(e,te)&&e.constructor==te)(e)||oe(e)||(ie(e,((s,o)=>{t(s,o)||ae(e,o)})),(e=>w(se(e)))(e))),Re=(e,t,s)=>H(e,t,_(e,t)==-s?void 0:s);e.createCheckpoints=de,e.createCustomPersister=he,e.createFilePersister=(e,s)=>{let o;return he(e,(async()=>{try{return await t.promises.readFile(s,c)}catch{}}),(async e=>{try{await t.promises.writeFile(s,e,c)}catch{}}),(e=>{o=t.watch(s,e)}),(()=>{o?.close(),o=void 0}))},e.createIndexes=ce,e.createLocalPersister=(e,t)=>Le(e,t,localStorage),e.createMetrics=fe,e.createRelationships=ve,e.createRemotePersister=(e,t,s,o)=>{let n,r;return he(e,(async()=>{const e=await fetch(t);return r=we(e),e.text()}),(async e=>await fetch(s,{method:"POST",headers:{"Content-Type":"application/json"},body:e})),(e=>{n=setInterval((async()=>{const s=await fetch(t,{method:"HEAD"}),o=we(s);m(r)||m(o)||o==r||(r=o,e())}),1e3*o)}),(()=>{k(n,clearInterval),n=void 0}))},e.createSessionPersister=(e,t)=>Le(e,t,sessionStorage),e.createStore=()=>{let e,t=0,s=0;const o=z(),n=z(),r=z(),i=z(),c=z(),f=z(),h=z(),p=N(Q),L=N(Q),w=N(),v=N(),y=N(),R=N(),T=N(),[b,C,x,A]=ee((()=>Ae)),J=(t,s)=>(!e||P(c,s))&&Se(t,(e=>j(s,e))),j=(e,t,s)=>Se(s?t:V(t,e),((s,o)=>k(U(e,o,s),(e=>(t[o]=e,!0)),(()=>!1)))),U=(t,s,o)=>e?k(_(_(c,t),s),(e=>Ie(o)!=e.type?e.default:o)):m(Ie(o))?void 0:o,V=(e,t)=>(k(_(f,t),(t=>ie(t,((t,s)=>{re(e,s)||(e[s]=t)})))),e),X=e=>ye(c,e,((e,t,s)=>{const o={};ye(W(c,t,z()),s,((e,t,s)=>{H(e,t,s),k(s.default,(e=>o[t]=e))})),H(f,t,o)}),((e,t)=>{H(c,t),H(f,t)})),Y=e=>ye(h,e,((e,t,s)=>Z(t,s)),((e,t)=>ce(t))),Z=(e,t)=>ye(W(h,e,z(),(()=>he(e,1))),t,((t,s,o)=>$(e,t,s,o)),((t,s)=>ue(e,t,s))),$=(e,t,s,o,n)=>ye(W(t,s,z(),(()=>ge(e,s,1))),o,((t,o,n)=>te(e,s,t,o,n)),((o,r)=>fe(e,t,s,o,r,n))),te=(e,t,s,o,n)=>{P(s,o)||pe(e,t,o,1);const r=_(s,o);n!==r&&(Le(e,t,o,r),H(s,o,n))},se=(e,t,s)=>xe((()=>$(e,le(e),t,s))),oe=(e,t,s,o,n)=>k(_(t,s),(t=>te(e,s,t,o,n)),(()=>$(e,t,s,V({[o]:n},e)))),de=e=>{const s=""+t++;return P(e,s)?de(e):s},le=e=>_(h,e)??Z(e,{}),ce=e=>Z(e,{}),ue=(e,t,s)=>$(e,t,s,{},!0),fe=(e,t,s,o,n,r)=>{const a=_(f,e)?.[n];if(!m(a)&&!r)return te(e,s,o,n,a);const i=t=>{Le(e,s,t,_(o,t)),pe(e,s,t,-1),H(o,t)};m(a)?i(n):q(o,i),D(o)&&(ge(e,s,-1),D(H(t,s))&&(he(e,-1),H(h,e)))},he=(e,t)=>Re(o,e,t),ge=(e,t,s)=>Re(W(n,e,z()),t,s),pe=(e,t,s,o)=>Re(W(W(r,e,z()),t,z()),s,o),Le=(e,t,s,o)=>W(W(W(i,e,z()),t,z()),s,o),we=(e,t,s)=>{const o=_(_(i,e),t),n=ke(e,t,s);return P(o,s)?[!0,_(o,s),n]:[!1,n,n]},ve=e=>{const t=D(R[e])&&D(v[e])&&D(L[e]),s=D(T[e])&&D(y[e])&&D(w[e])&&D(p[e]);if(t&&s)return;const a=e?[K(o),K(n,K),K(r,(e=>K(e,K))),K(i,(e=>K(e,K)))]:[o,n,r,i];if(t||(O(a[2],((t,s)=>O(t,((t,o)=>{D(t)||C(R[e],[s,o])})))),O(a[1],((t,s)=>{D(t)||C(v[e],[s])})),D(a[0])||C(L[e])),!s){let t;O(a[3],((s,o)=>{let n;O(s,((s,r)=>{let a;O(s,((s,i)=>{const d=ke(o,r,i);d!==s&&(C(T[e],[o,r,i],d,s,we),t=n=a=1)})),a&&C(y[e],[o,r],we)})),n&&C(w[e],[o],we)})),t&&C(p[e],[],we)}},Te=()=>G(h,(e=>G(e,G))),be=()=>B(h),Ce=e=>B(_(h,e)),me=(e,t)=>B(_(_(h,e),t)),ke=(e,t,s)=>_(_(_(h,e),t),s),Ee=e=>((e=>Se(e,J))(e)&&xe((()=>Y(e))),Ae),Me=()=>(xe((()=>Y({}))),Ae),xe=e=>{if(-1==s)return;s++;const t=e();return s--,0==s&&(s=1,ve(1),s=-1,ve(0),s=0,g([i,o,n,r],F)),t},Ae={getTables:Te,getTableIds:be,getTable:e=>G(_(h,e),G),getRowIds:Ce,getRow:(e,t)=>G(_(_(h,e),t)),getCellIds:me,getCell:ke,hasTables:()=>!D(h),hasTable:e=>P(h,e),hasRow:(e,t)=>P(_(h,e),t),hasCell:(e,t,s)=>P(_(_(h,e),t),s),getJson:()=>I(h),getSchemaJson:()=>I(c),setTables:Ee,setTable:(e,t)=>(J(t,e)&&xe((()=>Z(e,t))),Ae),setRow:(e,t,s)=>(j(e,s)&&se(e,t,s),Ae),addRow:(e,t)=>{let s;return j(e,t)&&(s=de(_(h,e)),se(e,s,t)),s},setPartialRow:(e,t,s)=>(j(e,s,1)&&xe((()=>{const o=le(e);ie(s,((s,n)=>oe(e,o,t,n,s)))})),Ae),setCell:(e,t,s,o)=>(k(U(e,s,M(o)?o(ke(e,t,s)):o),(o=>xe((()=>oe(e,le(e),t,s,o))))),Ae),setJson:e=>{try{"{}"===e?Me():Ee(S(e))}catch{}return Ae},setSchema:t=>{if((e=(e=>Se(e,(e=>Se(e,(e=>{if(!Se(e,((e,t)=>u([d,l],t))))return!1;const t=e.type;return!(!E(t)&&t!=a||(Ie(e.default)!=t&&ae(e,l),0))})))))(t))&&(X(t),!D(h))){const e=Te();Me(),Ee(e)}return Ae},delTables:Me,delTable:e=>(P(h,e)&&xe((()=>ce(e))),Ae),delRow:(e,t)=>(k(_(h,e),(s=>{P(s,t)&&xe((()=>ue(e,s,t)))})),Ae),delCell:(e,t,s,o)=>(k(_(h,e),(n=>k(_(n,t),(r=>{P(r,s)&&xe((()=>fe(e,n,t,r,s,o)))})))),Ae),delSchema:()=>(X({}),e=!1,Ae),transaction:xe,forEachTable:e=>O(h,((t,s)=>e(s,(e=>O(t,((t,s)=>e(s,(e=>q(t,e))))))))),forEachRow:(e,t)=>O(_(h,e),((e,s)=>t(s,(t=>q(e,t))))),forEachCell:(e,t,s)=>q(_(_(h,e),t),s),addTablesListener:(e,t)=>b(e,p[t?1:0]),addTableIdsListener:(e,t)=>b(e,L[t?1:0]),addTableListener:(e,t,s)=>b(t,w[s?1:0],[e]),addRowIdsListener:(e,t,s)=>b(t,v[s?1:0],[e]),addRowListener:(e,t,s,o)=>b(s,y[o?1:0],[e,t]),addCellIdsListener:(e,t,s,o)=>b(s,R[o?1:0],[e,t]),addCellListener:(e,t,s,o,n)=>b(o,T[n?1:0],[e,t,s]),callListener:e=>(A(e,[be,Ce,me],(e=>m(e[2])?[]:[,,].fill(ke(...e)))),Ae),delListener:e=>(x(e),Ae),getListenerStats:()=>({})};return ne(Ae)},e.defaultSorter=le,Object.defineProperty(e,"__esModule",{value:!0})},"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("fs")):"function"==typeof define&&define.amd?define(["exports","fs"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).TinyBase={},e.fs);
|
package/lib/umd/tinybase.js.gz
CHANGED
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tinybase",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.5",
|
|
4
4
|
"author": "jamesgpearce",
|
|
5
5
|
"repository": "github:tinyplex/tinybase",
|
|
6
6
|
"license": "MIT",
|
|
@@ -21,7 +21,14 @@
|
|
|
21
21
|
".": "./lib/tinybase.js",
|
|
22
22
|
"./*": "./lib/*.js"
|
|
23
23
|
},
|
|
24
|
-
"
|
|
24
|
+
"typesVersions": {
|
|
25
|
+
"*": {
|
|
26
|
+
"*": [
|
|
27
|
+
"./lib/*.d.ts",
|
|
28
|
+
"./lib/tinybase.d.ts"
|
|
29
|
+
]
|
|
30
|
+
}
|
|
31
|
+
},
|
|
25
32
|
"browser": {
|
|
26
33
|
"fs": false
|
|
27
34
|
},
|
|
@@ -49,8 +56,8 @@
|
|
|
49
56
|
},
|
|
50
57
|
"devDependencies": {
|
|
51
58
|
"@babel/cli": "^7.16.8",
|
|
52
|
-
"@babel/core": "^7.16.
|
|
53
|
-
"@babel/preset-env": "^7.16.
|
|
59
|
+
"@babel/core": "^7.16.10",
|
|
60
|
+
"@babel/preset-env": "^7.16.11",
|
|
54
61
|
"@babel/preset-react": "^7.16.7",
|
|
55
62
|
"@babel/preset-typescript": "^7.16.7",
|
|
56
63
|
"@rollup/plugin-replace": "^3.0.1",
|
|
@@ -65,19 +72,19 @@
|
|
|
65
72
|
"@types/react-dom": "^17.0.11",
|
|
66
73
|
"@types/react-test-renderer": "^17.0.1",
|
|
67
74
|
"@types/tmp": "^0.2.3",
|
|
68
|
-
"@typescript-eslint/eslint-plugin": "^5.
|
|
69
|
-
"@typescript-eslint/parser": "^5.
|
|
75
|
+
"@typescript-eslint/eslint-plugin": "^5.10.0",
|
|
76
|
+
"@typescript-eslint/parser": "^5.10.0",
|
|
70
77
|
"asciichart": "^1.5.25",
|
|
71
78
|
"babel-eslint": "^10.1.0",
|
|
72
79
|
"babel-jest": "^27.4.6",
|
|
73
80
|
"babel-preset-minify": "^0.5.1",
|
|
74
81
|
"country-flag-emoji-json": "^2.0.0",
|
|
75
|
-
"cspell": "^5.
|
|
76
|
-
"esbuild": "^0.14.
|
|
82
|
+
"cspell": "^5.16.0",
|
|
83
|
+
"esbuild": "^0.14.12",
|
|
77
84
|
"eslint": "^8.7.0",
|
|
78
85
|
"eslint-config-prettier": "^8.3.0",
|
|
79
86
|
"eslint-plugin-jest": "^25.7.0",
|
|
80
|
-
"eslint-plugin-jsdoc": "^37.6.
|
|
87
|
+
"eslint-plugin-jsdoc": "^37.6.2",
|
|
81
88
|
"eslint-plugin-react": "^7.28.0",
|
|
82
89
|
"eslint-plugin-react-hooks": "^4.3.0",
|
|
83
90
|
"gulp": "^4.0.2",
|
|
@@ -88,7 +95,7 @@
|
|
|
88
95
|
"jest-puppeteer": "^6.0.3",
|
|
89
96
|
"less": "^4.1.2",
|
|
90
97
|
"prettier": "^2.5.1",
|
|
91
|
-
"puppeteer": "^13.
|
|
98
|
+
"puppeteer": "^13.1.1",
|
|
92
99
|
"react": "^17.0.2",
|
|
93
100
|
"react-dom": "^17.0.2",
|
|
94
101
|
"react-test-renderer": "^17.0.2",
|
|
@@ -100,7 +107,7 @@
|
|
|
100
107
|
"tinydocs": "^0.1.10",
|
|
101
108
|
"tmp": "^0.2.1",
|
|
102
109
|
"ts-unused-exports": "^7.0.3",
|
|
103
|
-
"typescript": "4.5.
|
|
110
|
+
"typescript": "4.5.5"
|
|
104
111
|
},
|
|
105
112
|
"peerDependencies": {
|
|
106
113
|
"react": "^17.0.2"
|
package/readme.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<section id="hero"><h2 id="a-javascript-library-for-structured-state">A JavaScript library for <em>structured state</em>.</h2><p>Using plain old JavaScript objects to manage data gets old very quickly. It's error-prone, tricky to track changes efficiently, and easy to mistakenly incur performance costs.</p><p><em>TinyBase is a smarter way to structure your application state:</em></p><ul><li>Familiar concepts of <a href="#set-and-get-tables-rows-and-cells">tables, rows, and cells</a>, and <a href="#apply-schemas-to-tables">schematization</a> to model your data domain.</li><li><a href="#register-listeners-at-any-granularity">Flexibly reactive</a> to reconciled updates, so you only spend cycles on the data that changes.</li><li><a href="#create-indexes-for-fast-lookups">Indexing</a>, <a href="#define-metrics-and-aggregations">metrics</a>, <a href="#configure-relationships-between-tables">relationships</a> - and even an <a href="#use-checkpoints-for-an-easy-undo-stack">undo stack</a> for your app state! - out of the box.</li><li>Easily <a href="#persist-data-to-browser-file-or-server">sync your data</a> to local or remote storage, and use <a href="#call-react-hooks-to-bind-to-data">idiomatic bindings</a> to your React UI.</li></ul><p><em>Tiny by name, tiny by nature</em>, TinyBase only costs <a href="#did-we-say-tiny">2.6kB - 5.
|
|
1
|
+
<section id="hero"><h2 id="a-javascript-library-for-structured-state">A JavaScript library for <em>structured state</em>.</h2><p>Using plain old JavaScript objects to manage data gets old very quickly. It's error-prone, tricky to track changes efficiently, and easy to mistakenly incur performance costs.</p><p><em>TinyBase is a smarter way to structure your application state:</em></p><ul><li>Familiar concepts of <a href="#set-and-get-tables-rows-and-cells">tables, rows, and cells</a>, and <a href="#apply-schemas-to-tables">schematization</a> to model your data domain.</li><li><a href="#register-listeners-at-any-granularity">Flexibly reactive</a> to reconciled updates, so you only spend cycles on the data that changes.</li><li><a href="#create-indexes-for-fast-lookups">Indexing</a>, <a href="#define-metrics-and-aggregations">metrics</a>, <a href="#configure-relationships-between-tables">relationships</a> - and even an <a href="#use-checkpoints-for-an-easy-undo-stack">undo stack</a> for your app state! - out of the box.</li><li>Easily <a href="#persist-data-to-browser-file-or-server">sync your data</a> to local or remote storage, and use <a href="#call-react-hooks-to-bind-to-data">idiomatic bindings</a> to your React UI.</li></ul><p><em>Tiny by name, tiny by nature</em>, TinyBase only costs <a href="#did-we-say-tiny">2.6kB - 5.7kB</a> when compressed, and has zero dependencies. And of course it's <a href="#well-tested-and-documented">well tested</a>, <a href="https://tinybase.org/guides/the-basics/getting-started">fully documented</a>, and <a href="https://github.com/tinyplex/tinybase">open source</a>. Other <a href="https://tinybase.org/guides/faq/">FAQs</a>?</p></section><hr><p><a id="start" href="https://tinybase.org/guides/the-basics/getting-started">Get started</a></p><p><a href="https://tinybase.org/demos">Try the demos</a></p><p><a href="https://tinybase.org/api/store/interfaces/store/store/">Read the docs</a></p><hr><section><h2 id="set-and-get-tables-rows-and-cells">Set and get tables, rows, and cells.</h2><p>Creating a <a href="https://tinybase.org/api/store/interfaces/store/store"><code>Store</code></a> requires just a simple call to the <a href="https://tinybase.org/api/store/functions/creation/createstore"><code>createStore</code></a> function. Once you have one, you can easily set <a href="https://tinybase.org/api/store/type-aliases/store/table"><code>Table</code></a>, <a href="https://tinybase.org/api/store/type-aliases/store/row"><code>Row</code></a>, or <a href="https://tinybase.org/api/store/type-aliases/store/cell"><code>Cell</code></a> values by their <a href="https://tinybase.org/api/common/type-aliases/identity/id"><code>Id</code></a>. And of course you can easily get the values back out again.</p><p>Read more about setting and changing data in <a href="https://tinybase.org/guides/the-basics">The Basics</a> guide.</p></section>
|
|
2
2
|
|
|
3
3
|
```js
|
|
4
4
|
const store = createStore()
|
|
@@ -192,4 +192,4 @@ console.log(store.getCell('pets', 'felix', 'sold'));
|
|
|
192
192
|
// -> false
|
|
193
193
|
```
|
|
194
194
|
|
|
195
|
-
<section><h2 id="did-we-say-tiny">Did we say tiny?</h2><p>If you use the basic <a href="https://tinybase.org/api/store"><code>store</code></a> module alone, you'll only add a gzipped <em>2.6kB</em> to your app. You can incrementally add the other modules as you need more functionality, or get it all for <em>5.
|
|
195
|
+
<section><h2 id="did-we-say-tiny">Did we say tiny?</h2><p>If you use the basic <a href="https://tinybase.org/api/store"><code>store</code></a> module alone, you'll only add a gzipped <em>2.6kB</em> to your app. You can incrementally add the other modules as you need more functionality, or get it all for <em>5.7kB</em>. The <code>ui-react</code> adaptor is just another <em>2.6kB</em>, and everything is fast.</p><p>Life's easy when you have zero dependencies.</p><p>Read more about how TinyBase is structured in the <a href="https://tinybase.org/guides/how-tinybase-is-built/architecture">Architecture</a> guide.</p></section><div class="table"><table class="fixed"><tbody><tr><th width="30%"> </th><th>.js.gz</th><th>.js</th><th>debug.js</th><th>.d.ts</th></tr><tr><th class="right"><a href="https://tinybase.org/api/store">store</a></th><td>2.6kB</td><td>5.9kB</td><td>23.9kB</td><td>87.5kB</td></tr><tr><th class="right"><a href="https://tinybase.org/api/indexes">indexes</a></th><td>1.6kB</td><td>3.2kB</td><td>14.0kB</td><td>32.9kB</td></tr><tr><th class="right"><a href="https://tinybase.org/api/metrics">metrics</a></th><td>1.5kB</td><td>3.1kB</td><td>12.5kB</td><td>29.1kB</td></tr><tr><th class="right"><a href="https://tinybase.org/api/relationships">relationships</a></th><td>1.6kB</td><td>3.2kB</td><td>14.7kB</td><td>42.1kB</td></tr><tr><th class="right"><a href="https://tinybase.org/api/checkpoints">checkpoints</a></th><td>1.3kB</td><td>2.5kB</td><td>10.3kB</td><td>33.0kB</td></tr><tr><th class="right"><a href="https://tinybase.org/api/persisters">persisters</a></th><td>0.8kB</td><td>1.6kB</td><td>4.9kB</td><td>26.7kB</td></tr><tr><th class="right"><a href="https://tinybase.org/api/common">common</a></th><td>0.1kB</td><td>0.1kB</td><td>0.1kB</td><td>3.5kB</td></tr><tr><th class="right"><a href="https://tinybase.org/api/tinybase">tinybase</a></th><td>5.7kB</td><td>13.4kB</td><td>55.6kB</td><td>0.3kB</td></tr></tbody></table></div><section><h2 id="well-tested-and-documented">Well tested and documented.</h2><p>TinyBase has <em>100.0%</em> test coverage, including the code throughout the documentation - even on this page! The guides, demos, and API examples are designed to make it as easy as possible to get up and running.</p><p>Read more about how TinyBase is tested in the Unit <a href="https://tinybase.org/guides/how-tinybase-is-built/testing">Testing</a> guide.</p></section><div class="table"><table class="fixed"><tbody><tr><th width="30%"> </th><th>Total</th><th>Tested</th><th>Coverage</th></tr><tr><th class="right">Lines</th><td>957</td><td>957</td><td>100.0%</td></tr><tr><th class="right">Statements</th><td>1,047</td><td>1,047</td><td>100.0%</td></tr><tr><th class="right">Functions</th><td>384</td><td>384</td><td>100.0%</td></tr><tr><th class="right">Branches</th><td>341</td><td>341</td><td>100.0%</td></tr><tr><th class="right">Tests</th><td colspan="3">1,731</td></tr><tr><th class="right">Assertions</th><td colspan="3">8,036</td></tr></tbody></table></div><hr><p><a id="start" href="https://tinybase.org/guides/the-basics/getting-started">Get started</a></p><p><a href="https://tinybase.org/demos">Try the demos</a></p><p><a href="https://tinybase.org/api/store/interfaces/store/store/">Read the docs</a></p><hr><section><h2 id="follow">Follow</h2><ul><li>News and updates on <a href="https://twitter.com/tinybasejs">Twitter</a> and <a href="https://facebook.com/tinybasejs">Facebook</a>.</li><li><a href="https://github.com/tinyplex/tinybase/issues">Issues</a> and <a href="https://github.com/tinyplex/tinybase/releases">release notes</a> on <a href="https://github.com/tinyplex/tinybase">GitHub</a></li><li>Packages on <a href="https://www.npmjs.com/package/tinybase/v/1.0.5">NPM</a>.</li></ul></section><section><h2 id="about">About</h2><p>Building TinyBase was an interesting exercise in API design, minification, and documentation. It's not <a href="https://www.linkedin.com/in/jamespearce">my day job</a>, but I do intend to maintain it, so please provide feedback. I could not have done this without these great <a href="https://tinybase.org/guides/how-tinybase-is-built/credits/#giants">projects</a> and <a href="https://tinybase.org/guides/how-tinybase-is-built/credits/#and-friends">friends</a>, and I hope you enjoy using it!</p></section>
|