tinybase 2.0.0-beta.4 → 2.0.0
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/debug/checkpoints.js +19 -7
- package/lib/debug/indexes.js +18 -7
- package/lib/debug/metrics.js +18 -7
- package/lib/debug/queries.d.ts +40 -38
- package/lib/debug/queries.js +24 -25
- package/lib/debug/relationships.js +18 -7
- package/lib/debug/store.js +42 -22
- package/lib/debug/tinybase.js +67 -47
- package/lib/debug/ui-react.d.ts +1 -0
- package/lib/indexes.js +1 -1
- package/lib/indexes.js.gz +0 -0
- package/lib/metrics.js +1 -1
- package/lib/metrics.js.gz +0 -0
- package/lib/queries.d.ts +40 -38
- package/lib/queries.js +1 -1
- package/lib/queries.js.gz +0 -0
- package/lib/relationships.js +1 -1
- package/lib/relationships.js.gz +0 -0
- 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/ui-react.d.ts +1 -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/queries.js +1 -1
- package/lib/umd/queries.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 +10 -10
- package/readme.md +55 -12
package/lib/debug/tinybase.js
CHANGED
|
@@ -49,6 +49,7 @@ const arraySlice = (array, start, end) => array.slice(start, end);
|
|
|
49
49
|
const arrayClear = (array, to) => array.splice(0, to);
|
|
50
50
|
const arrayPush = (array, ...values) => array.push(...values);
|
|
51
51
|
const arrayPop = (array) => array.pop();
|
|
52
|
+
const arrayShift = (array) => array.shift();
|
|
52
53
|
|
|
53
54
|
const jsonString = (obj) =>
|
|
54
55
|
JSON.stringify(obj, (_key, value) =>
|
|
@@ -295,6 +296,20 @@ const getCreateFunction = (getFunction) => {
|
|
|
295
296
|
};
|
|
296
297
|
};
|
|
297
298
|
|
|
299
|
+
const INTEGER = /^\d+$/;
|
|
300
|
+
const getPoolFunctions = () => {
|
|
301
|
+
const pool = [];
|
|
302
|
+
let nextId = 0;
|
|
303
|
+
return [
|
|
304
|
+
() => arrayShift(pool) ?? EMPTY_STRING + nextId++,
|
|
305
|
+
(id) => {
|
|
306
|
+
if (INTEGER.test(id) && arrayLength(pool) < 1e3) {
|
|
307
|
+
arrayPush(pool, id);
|
|
308
|
+
}
|
|
309
|
+
},
|
|
310
|
+
];
|
|
311
|
+
};
|
|
312
|
+
|
|
298
313
|
const getWildcardedLeaves = (deepIdSet, path = [EMPTY_STRING]) => {
|
|
299
314
|
const leaves = [];
|
|
300
315
|
const deep = (node, p) =>
|
|
@@ -308,12 +323,11 @@ const getWildcardedLeaves = (deepIdSet, path = [EMPTY_STRING]) => {
|
|
|
308
323
|
};
|
|
309
324
|
const getListenerFunctions = (getThing) => {
|
|
310
325
|
let thing;
|
|
311
|
-
|
|
312
|
-
const listenerPool = [];
|
|
326
|
+
const [getId, releaseId] = getPoolFunctions();
|
|
313
327
|
const allListeners = mapNew();
|
|
314
328
|
const addListener = (listener, idSetNode, path) => {
|
|
315
329
|
thing ??= getThing();
|
|
316
|
-
const id =
|
|
330
|
+
const id = getId();
|
|
317
331
|
mapSet(allListeners, id, [listener, idSetNode, path]);
|
|
318
332
|
setAdd(visitTree(idSetNode, path ?? [EMPTY_STRING], setNew), id);
|
|
319
333
|
return id;
|
|
@@ -331,9 +345,7 @@ const getListenerFunctions = (getThing) => {
|
|
|
331
345
|
return collIsEmpty(idSet) ? 1 : 0;
|
|
332
346
|
});
|
|
333
347
|
mapSet(allListeners, id);
|
|
334
|
-
|
|
335
|
-
arrayPush(listenerPool, id);
|
|
336
|
-
}
|
|
348
|
+
releaseId(id);
|
|
337
349
|
return idOrNulls;
|
|
338
350
|
});
|
|
339
351
|
const callListener = (id, idNullGetters, extraArgsGetter) =>
|
|
@@ -470,7 +482,7 @@ const createCheckpoints = getCreateFunction((store) => {
|
|
|
470
482
|
const goForwardImpl = () => {
|
|
471
483
|
if (!arrayIsEmpty(forwardIds)) {
|
|
472
484
|
arrayPush(backwardIds, currentId);
|
|
473
|
-
currentId = forwardIds
|
|
485
|
+
currentId = arrayShift(forwardIds);
|
|
474
486
|
updateStore(1, currentId);
|
|
475
487
|
checkpointsChanged = 1;
|
|
476
488
|
}
|
|
@@ -1123,10 +1135,16 @@ const createQueries = getCreateFunction((store) => {
|
|
|
1123
1135
|
),
|
|
1124
1136
|
);
|
|
1125
1137
|
const resetPreStores = (queryId) => {
|
|
1126
|
-
|
|
1127
|
-
|
|
1128
|
-
|
|
1129
|
-
|
|
1138
|
+
ifNotUndefined(
|
|
1139
|
+
mapGet(preStoreListenerIds, queryId),
|
|
1140
|
+
(queryPreStoreListenerIds) => {
|
|
1141
|
+
mapForEach(queryPreStoreListenerIds, (preStore2, listenerIds) =>
|
|
1142
|
+
collForEach(listenerIds, (listenerId) =>
|
|
1143
|
+
preStore2.delListener(listenerId),
|
|
1144
|
+
),
|
|
1145
|
+
);
|
|
1146
|
+
collClear(queryPreStoreListenerIds);
|
|
1147
|
+
},
|
|
1130
1148
|
);
|
|
1131
1149
|
arrayForEach([resultStore, preStore], (store2) => store2.delTable(queryId));
|
|
1132
1150
|
};
|
|
@@ -1286,12 +1304,18 @@ const createQueries = getCreateFunction((store) => {
|
|
|
1286
1304
|
}
|
|
1287
1305
|
},
|
|
1288
1306
|
);
|
|
1289
|
-
(
|
|
1307
|
+
if (
|
|
1308
|
+
collIsEmpty(selectedRowIds) ||
|
|
1290
1309
|
!arrayEvery(havings, (having2) =>
|
|
1291
1310
|
having2((cellId) => groupRow[cellId]),
|
|
1292
1311
|
)
|
|
1293
|
-
|
|
1294
|
-
|
|
1312
|
+
) {
|
|
1313
|
+
resultStore.delRow(queryId, groupRowId);
|
|
1314
|
+
} else if (isUndefined(groupRowId)) {
|
|
1315
|
+
leaf[2] = resultStore.addRow(queryId, groupRow);
|
|
1316
|
+
} else {
|
|
1317
|
+
resultStore.setRow(queryId, groupRowId, groupRow);
|
|
1318
|
+
}
|
|
1295
1319
|
},
|
|
1296
1320
|
);
|
|
1297
1321
|
addPreStoreListener(
|
|
@@ -1331,18 +1355,10 @@ const createQueries = getCreateFunction((store) => {
|
|
|
1331
1355
|
});
|
|
1332
1356
|
if (changedLeaf) {
|
|
1333
1357
|
writeGroupRow(
|
|
1334
|
-
visitTree(
|
|
1335
|
-
|
|
1336
|
-
|
|
1337
|
-
|
|
1338
|
-
([, selectedRowIds, groupRowId]) => {
|
|
1339
|
-
collDel(selectedRowIds, selectedRowId);
|
|
1340
|
-
if (collIsEmpty(selectedRowIds)) {
|
|
1341
|
-
resultStore.delRow(queryId, groupRowId);
|
|
1342
|
-
return 1;
|
|
1343
|
-
}
|
|
1344
|
-
},
|
|
1345
|
-
),
|
|
1358
|
+
visitTree(tree, oldPath, void 0, ([, selectedRowIds]) => {
|
|
1359
|
+
collDel(selectedRowIds, selectedRowId);
|
|
1360
|
+
return collIsEmpty(selectedRowIds);
|
|
1361
|
+
}),
|
|
1346
1362
|
changedGroupedSelectedCells,
|
|
1347
1363
|
selectedRowId,
|
|
1348
1364
|
1,
|
|
@@ -1365,12 +1381,7 @@ const createQueries = getCreateFunction((store) => {
|
|
|
1365
1381
|
selectedCellId,
|
|
1366
1382
|
)),
|
|
1367
1383
|
);
|
|
1368
|
-
return [
|
|
1369
|
-
mapNew(),
|
|
1370
|
-
setNew(),
|
|
1371
|
-
resultStore.addRow(queryId, groupRow, 1),
|
|
1372
|
-
groupRow,
|
|
1373
|
-
];
|
|
1384
|
+
return [mapNew(), setNew(), void 0, groupRow];
|
|
1374
1385
|
},
|
|
1375
1386
|
([, selectedRowIds]) => {
|
|
1376
1387
|
setAdd(selectedRowIds, selectedRowId);
|
|
@@ -1750,7 +1761,6 @@ const idsChanged = (changedIds, id2, added) =>
|
|
|
1750
1761
|
const createStore = () => {
|
|
1751
1762
|
let hasSchema;
|
|
1752
1763
|
let cellsTouched;
|
|
1753
|
-
let nextRowId = 0;
|
|
1754
1764
|
let transactions = 0;
|
|
1755
1765
|
const changedTableIds = mapNew();
|
|
1756
1766
|
const changedRowIds = mapNew();
|
|
@@ -1759,6 +1769,7 @@ const createStore = () => {
|
|
|
1759
1769
|
const invalidCells = mapNew();
|
|
1760
1770
|
const schemaMap = mapNew();
|
|
1761
1771
|
const schemaRowCache = mapNew();
|
|
1772
|
+
const tablePoolFunctions = mapNew();
|
|
1762
1773
|
const tablesMap = mapNew();
|
|
1763
1774
|
const tablesListeners = pairNewMap();
|
|
1764
1775
|
const tableIdsListeners = pairNewMap();
|
|
@@ -1921,18 +1932,26 @@ const createStore = () => {
|
|
|
1921
1932
|
addDefaultsToRow({[cellId]: validCell}, tableId, rowId),
|
|
1922
1933
|
),
|
|
1923
1934
|
);
|
|
1924
|
-
const getNewRowId = (
|
|
1925
|
-
const
|
|
1926
|
-
|
|
1935
|
+
const getNewRowId = (tableId) => {
|
|
1936
|
+
const [getId] = mapEnsure(tablePoolFunctions, tableId, getPoolFunctions);
|
|
1937
|
+
const rowId = getId();
|
|
1938
|
+
if (!collHas(mapGet(tablesMap, tableId), rowId)) {
|
|
1927
1939
|
return rowId;
|
|
1928
1940
|
}
|
|
1929
|
-
return getNewRowId(
|
|
1941
|
+
return getNewRowId(tableId);
|
|
1930
1942
|
};
|
|
1931
1943
|
const getOrCreateTable = (tableId) =>
|
|
1932
1944
|
mapGet(tablesMap, tableId) ?? setValidTable(tableId, {});
|
|
1933
1945
|
const delValidTable = (tableId) => setValidTable(tableId, {});
|
|
1934
|
-
const delValidRow = (tableId, tableMap, rowId) =>
|
|
1946
|
+
const delValidRow = (tableId, tableMap, rowId) => {
|
|
1947
|
+
const [, releaseId] = mapEnsure(
|
|
1948
|
+
tablePoolFunctions,
|
|
1949
|
+
tableId,
|
|
1950
|
+
getPoolFunctions,
|
|
1951
|
+
);
|
|
1952
|
+
releaseId(rowId);
|
|
1935
1953
|
setValidRow(tableId, tableMap, rowId, {}, true);
|
|
1954
|
+
};
|
|
1936
1955
|
const delValidCell = (tableId, table, rowId, row, cellId, forceDel) => {
|
|
1937
1956
|
const defaultCell = mapGet(mapGet(schemaRowCache, tableId)?.[0], cellId);
|
|
1938
1957
|
if (!isUndefined(defaultCell) && !forceDel) {
|
|
@@ -2178,16 +2197,17 @@ const createStore = () => {
|
|
|
2178
2197
|
tableId,
|
|
2179
2198
|
rowId,
|
|
2180
2199
|
);
|
|
2181
|
-
const addRow = (tableId, row
|
|
2200
|
+
const addRow = (tableId, row) =>
|
|
2182
2201
|
transaction(() => {
|
|
2183
|
-
|
|
2184
|
-
|
|
2185
|
-
|
|
2186
|
-
|
|
2187
|
-
|
|
2188
|
-
|
|
2189
|
-
|
|
2190
|
-
|
|
2202
|
+
let rowId = void 0;
|
|
2203
|
+
if (validateRow(tableId, rowId, row)) {
|
|
2204
|
+
tableId = id(tableId);
|
|
2205
|
+
setValidRow(
|
|
2206
|
+
tableId,
|
|
2207
|
+
getOrCreateTable(tableId),
|
|
2208
|
+
(rowId = getNewRowId(tableId)),
|
|
2209
|
+
row,
|
|
2210
|
+
);
|
|
2191
2211
|
}
|
|
2192
2212
|
return rowId;
|
|
2193
2213
|
});
|
package/lib/debug/ui-react.d.ts
CHANGED
|
@@ -14,6 +14,7 @@
|
|
|
14
14
|
* @see Building UIs With Metrics guide
|
|
15
15
|
* @see Building UIs With Indexes guide
|
|
16
16
|
* @see Building UIs With Relationships guide
|
|
17
|
+
* @see Building UIs With Queries guide
|
|
17
18
|
* @see Building UIs With Checkpoints guide
|
|
18
19
|
* @see Countries demo
|
|
19
20
|
* @see Todo App demos
|
package/lib/indexes.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const e=e=>typeof e,t=e(""),n=(e,t)=>((e,t)=>e.every(t))(e,((n,s)=>0==s||t(e[s-1],n)<=0)),s=(e,t)=>e.sort(t),
|
|
1
|
+
const e=e=>typeof e,t=e(""),n=(e,t)=>((e,t)=>e.every(t))(e,((n,s)=>0==s||t(e[s-1],n)<=0)),s=(e,t)=>e.sort(t),r=(e,t)=>e.forEach(t),o=e=>e.length,c=(e,...t)=>e.push(...t),l=e=>null==e,d=(e,t,n)=>l(e)?n?.():t(e),i=(e,t)=>e?.has(t)??!1,a=e=>l(e)||0==(e=>e.size)(e),u=e=>[...e?.values()??[]],h=e=>e.clear(),f=(e,t)=>e?.forEach(t),I=(e,t)=>e?.delete(t),g=e=>new Map(e),S=e=>[...e?.keys()??[]],w=(e,t)=>e?.get(t),L=(e,t)=>f(e,((e,n)=>t(n,e))),v=(e,t,n)=>l(n)?(I(e,t),e):e?.set(t,n),x=(e,t,n)=>(i(e,t)||v(e,t,n()),w(e,t)),p=(e,t,n,s,r=0)=>d((n?x:w)(e,t[r],r>o(t)-2?n:g),(c=>{if(r>o(t)-2)return s?.(c)&&v(e,t[r]),c;const l=p(c,t,n,s,r+1);return a(c)&&v(e,t[r]),l})),E=e=>new Set(e),R=(e,t)=>e?.add(t),b=(e,t,n)=>{const s=e.hasRow,c=g(),p=g(),b=g(),y=g(),T=g(),k=(t,n,...s)=>{const o=x(T,t,E);return r(s,(t=>R(o,t)&&n&&e.callListener(t))),s},z=(t,...n)=>d(w(T,t),(s=>{r(0==o(n)?u(s):n,(t=>{e.delListener(t),I(s,t)})),a(s)&&v(T,t)})),C=(e,n)=>{v(c,e,n),i(p,e)||(v(p,e,t()),v(b,e,g()),v(y,e,g()))},D=e=>{v(c,e),v(p,e),v(b,e),v(y,e),z(e)};return[()=>e,()=>S(c),e=>L(p,e),e=>i(p,e),e=>w(c,e),e=>w(p,e),(e,t)=>v(p,e,t),C,(t,o,c,d,a)=>{C(t,o);const u=g(),I=g(),S=w(b,t),x=w(y,t),p=t=>{const r=n=>e.getCell(o,t,n),c=w(S,t),i=s(o,t)?n(d(r,t)):void 0;if(c!=i&&v(u,t,[c,i]),!l(a)){const e=w(x,t),n=s(o,t)?a(r,t):void 0;e!=n&&v(I,t,n)}},E=e=>{c((()=>{f(u,(([,e],t)=>v(S,t,e))),f(I,((e,t)=>v(x,t,e)))}),u,I,S,x,e),h(u),h(I)};L(S,p),e.hasTable(o)&&r(e.getRowIds(o),(e=>{i(S,e)||p(e)})),E(!0),z(t),k(t,0,e.addRowListener(o,null,((e,t,n)=>p(n))),e.addTableListener(o,(()=>E())))},D,()=>L(T,D),k,z]},y=(n,s)=>e(n)==t?e=>e(n):n??(()=>s??""),T=(e,t)=>e<t?-1:1,k=/^\d+$/,z=e=>{let t;const[n,s]=(()=>{const e=[];let t=0;return[()=>e.shift()??""+t++,t=>{k.test(t)&&o(e)<1e3&&c(e,t)}]})(),i=g();return[(s,r,o)=>{t??=e();const c=n();return v(i,c,[s,r,o]),R(p(r,o??[""],E),c),c},(e,n,...s)=>r(((e,t=[""])=>{const n=[],s=(e,l)=>l==o(t)?c(n,e):null===t[l]?f(e,(e=>s(e,l+1))):r([t[l],null],(t=>s(w(e,t),l+1)));return s(e,0),n})(e,n),(e=>f(e,(e=>w(i,e)[0](t,...n??[],...s))))),e=>d(w(i,e),(([,t,n])=>(p(t,n??[""],void 0,(t=>(I(t,e),a(t)?1:0))),v(i,e),s(e),n))),(e,n,s)=>d(w(i,e),(([e,,c=[]])=>{const d=(...i)=>{const a=o(i);a==o(c)?e(t,...i,...s(i)):l(c[a])?r(n[a](...i),(e=>d(...i,e))):d(...i,c[a])};d()}))]},C=Object.freeze,D=(e=>{const t=new WeakMap;return n=>(t.has(n)||t.set(n,e(n)),t.get(n))})((e=>{const t=g(),r=g(),[o,c,h,x,p,k,D,,M,j,O]=b(e,g,(e=>l(e)?"":e+"")),[W,$,m]=z((()=>A)),q=(t,n,s)=>{const r=p(t);f(s,((t,s)=>n(s,(n=>f(t,(t=>n(t,(n=>e.forEachCell(r,t,n)))))))))},A={setIndexDefinition:(e,o,c,u,h,S=T)=>{const x=l(h)?void 0:([e],[t])=>h(e,t);return M(e,o,((o,c,h,p,b,y)=>{let T=0;const z=E(),C=E(),M=k(e);if(f(c,(([e,t],n)=>{l(e)||(R(z,e),d(w(M,e),(t=>{I(t,n),a(t)&&(v(M,e),T=1)}))),l(t)||(R(z,t),i(M,t)||(v(M,t,E()),T=1),R(w(M,t),n),l(u)||R(C,t))})),o(),a(b)||(y?L(M,(e=>R(C,e))):L(h,(e=>d(w(p,e),(e=>R(C,e))))),f(C,(e=>{const t=(t,n)=>S(w(b,t),w(b,n),e),r=[...w(M,e)];n(r,t)||(v(M,e,E(s(r,t))),R(z,e))}))),(T||y)&&!l(x)){const t=[...M];n(t,x)||(D(e,g(s(t,x))),T=1)}T&&$(t,[e]),f(z,(t=>$(r,[e,t])))}),y(c),d(u,y)),A},delIndexDefinition:e=>(j(e),A),getStore:o,getIndexIds:c,forEachIndex:e=>h(((t,n)=>e(t,(e=>q(t,e,n))))),forEachSlice:(e,t)=>q(e,t,k(e)),hasIndex:x,hasSlice:(e,t)=>i(k(e),t),getTableId:p,getSliceIds:e=>S(k(e)),getSliceRowIds:(e,t)=>u(w(k(e),t)),addSliceIdsListener:(e,n)=>W(n,t,[e]),addSliceRowIdsListener:(e,t,n)=>W(n,r,[e,t]),delListener:e=>(m(e),A),destroy:O,getListenerStats:()=>({})};return C(A)}));export{D as createIndexes};
|
package/lib/indexes.js.gz
CHANGED
|
Binary file
|
package/lib/metrics.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const e=e=>typeof e,t=e(""),n=e(e),r=(e,t)=>e.forEach(t),s=e=>o(e,((e,t)=>e+t),0),i=e=>e.length,o=(e,t,n)=>e.reduce(t,n),c=(e,...t)=>e.push(...t),a=Math.max,d=Math.min,l=isFinite,u=e=>null==e,h=(e,t,n)=>u(e)?n?.():t(e),
|
|
1
|
+
const e=e=>typeof e,t=e(""),n=e(e),r=(e,t)=>e.forEach(t),s=e=>o(e,((e,t)=>e+t),0),i=e=>e.length,o=(e,t,n)=>e.reduce(t,n),c=(e,...t)=>e.push(...t),a=Math.max,d=Math.min,l=isFinite,u=e=>null==e,h=(e,t,n)=>u(e)?n?.():t(e),f=()=>{},g=e=>e.size,v=(e,t)=>e?.has(t)??!1,M=e=>u(e)||0==g(e),L=e=>[...e?.values()??[]],m=e=>e.clear(),w=(e,t)=>e?.forEach(t),p=(e,t)=>e?.delete(t),b=e=>new Map(e),x=(e,t)=>e?.get(t),y=(e,t)=>w(e,((e,n)=>t(n,e))),E=(e,t,n)=>u(n)?(p(e,t),e):e?.set(t,n),I=(e,t,n)=>(v(e,t)||E(e,t,n()),x(e,t)),R=(e,t,n,r,s=0)=>h((n?I:x)(e,t[s],s>i(t)-2?n:b),(o=>{if(s>i(t)-2)return r?.(o)&&E(e,t[s]),o;const c=R(o,t,n,r,s+1);return M(o)&&E(e,t[s]),c})),S=b([["avg",[(e,t)=>s(e)/t,(e,t,n)=>e+(t-e)/(n+1),(e,t,n)=>e+(e-t)/(n-1),(e,t,n,r)=>e+(t-n)/r]],["max",[e=>a(...e),(e,t)=>a(t,e),(e,t)=>t==e?void 0:e,(e,t,n)=>n==e?void 0:a(t,e)]],["min",[e=>d(...e),(e,t)=>d(t,e),(e,t)=>t==e?void 0:e,(e,t,n)=>n==e?void 0:d(t,e)]],["sum",[e=>s(e),(e,t)=>e+t,(e,t)=>e-t,(e,t,n)=>e-n+t]]]),T=e=>new Set(e),k=(e,t)=>e?.add(t),z=(e,t,n)=>{const s=e.hasRow,o=b(),c=b(),a=b(),d=b(),l=b(),f=(t,n,...s)=>{const i=I(l,t,T);return r(s,(t=>k(i,t)&&n&&e.callListener(t))),s},g=(t,...n)=>h(x(l,t),(s=>{r(0==i(n)?L(s):n,(t=>{e.delListener(t),p(s,t)})),M(s)&&E(l,t)})),R=(e,n)=>{E(o,e,n),v(c,e)||(E(c,e,t()),E(a,e,b()),E(d,e,b()))},S=e=>{E(o,e),E(c,e),E(a,e),E(d,e),g(e)};return[()=>e,()=>[...o?.keys()??[]],e=>y(c,e),e=>v(c,e),e=>x(o,e),e=>x(c,e),(e,t)=>E(c,e,t),R,(t,i,o,c,l)=>{R(t,i);const h=b(),M=b(),L=x(a,t),p=x(d,t),I=t=>{const r=n=>e.getCell(i,t,n),o=x(L,t),a=s(i,t)?n(c(r,t)):void 0;if(o!=a&&E(h,t,[o,a]),!u(l)){const e=x(p,t),n=s(i,t)?l(r,t):void 0;e!=n&&E(M,t,n)}},S=e=>{o((()=>{w(h,(([,e],t)=>E(L,t,e))),w(M,((e,t)=>E(p,t,e)))}),h,M,L,p,e),m(h),m(M)};y(L,I),e.hasTable(i)&&r(e.getRowIds(i),(e=>{v(L,e)||I(e)})),S(!0),g(t),f(t,0,e.addRowListener(i,null,((e,t,n)=>I(n))),e.addTableListener(i,(()=>S())))},S,()=>y(l,S),f,g]},D=(n,r)=>e(n)==t?e=>e(n):n??(()=>r??""),N=/^\d+$/,j=e=>{let t;const[n,s]=(()=>{const e=[];let t=0;return[()=>e.shift()??""+t++,t=>{N.test(t)&&i(e)<1e3&&c(e,t)}]})(),o=b();return[(r,s,i)=>{t??=e();const c=n();return E(o,c,[r,s,i]),k(R(s,i??[""],T),c),c},(e,n,...s)=>r(((e,t=[""])=>{const n=[],s=(e,o)=>o==i(t)?c(n,e):null===t[o]?w(e,(e=>s(e,o+1))):r([t[o],null],(t=>s(x(e,t),o+1)));return s(e,0),n})(e,n),(e=>w(e,(e=>x(o,e)[0](t,...n??[],...s))))),e=>h(x(o,e),(([,t,n])=>(R(t,n??[""],void 0,(t=>(p(t,e),M(t)?1:0))),E(o,e),s(e),n))),(e,n,s)=>h(x(o,e),(([e,,o=[]])=>{const c=(...a)=>{const d=i(a);d==i(o)?e(t,...a,...s(a)):u(o[d])?r(n[d](...a),(e=>c(...a,e))):c(...a,o[d])};c()}))]},C=Object.freeze,F=(e=>{const t=new WeakMap;return n=>(t.has(n)||t.set(n,e(n)),t.get(n))})((t=>{const r=b(),[s,i,o,c,a,d,h,,v,m,p]=z(t,f,(e=>isNaN(e)||u(e)||!0===e||!1===e||""===e?void 0:1*e)),[y,E,I]=j((()=>R)),R={setMetricDefinition:(t,s,i,o,c,a,f)=>{const m=e(i)==n?[i,c,a,f]:x(S,i)??x(S,"sum");return v(t,s,((e,n,s,i,o,c)=>{const a=d(t),f=g(i);c||=u(a),e();let v=((e,t,n,r,s,i=!1)=>{if(M(n))return;const[o,c,a,d]=s;return i||=u(e),w(r,(([n,r])=>{i||(e=u(n)?c?.(e,r,t++):u(r)?a?.(e,n,t--):d?.(e,r,n,t),i||=u(e))})),i?o(L(n),g(n)):e})(a,f,i,n,m,c);l(v)||(v=void 0),v!=a&&(h(t,v),E(r,[t],v,a))}),D(o,1)),R},delMetricDefinition:e=>(m(e),R),getStore:s,getMetricIds:i,forEachMetric:o,hasMetric:c,getTableId:a,getMetric:d,addMetricListener:(e,t)=>y(t,r,[e]),delListener:e=>(I(e),R),destroy:p,getListenerStats:()=>({})};return C(R)}));export{F as createMetrics};
|
package/lib/metrics.js.gz
CHANGED
|
Binary file
|
package/lib/queries.d.ts
CHANGED
|
@@ -2,10 +2,10 @@
|
|
|
2
2
|
* The queries module of the TinyBase project provides the ability to create and
|
|
3
3
|
* track queries of the data in Store objects.
|
|
4
4
|
*
|
|
5
|
-
* The main entry point to
|
|
6
|
-
* returns a new Queries object.
|
|
7
|
-
* definitions, access
|
|
8
|
-
* when
|
|
5
|
+
* The main entry point to using the queries module is the createQueries
|
|
6
|
+
* function, which returns a new Queries object. That object in turn has methods
|
|
7
|
+
* that let you create new query definitions, access their results directly, and
|
|
8
|
+
* register listeners for when those results change.
|
|
9
9
|
*
|
|
10
10
|
* @packageDocumentation
|
|
11
11
|
* @module queries
|
|
@@ -385,18 +385,18 @@ export type GetTableCell = {
|
|
|
385
385
|
* The Select type describes a function that lets you specify a Cell or
|
|
386
386
|
* calculated value for including into the query's result.
|
|
387
387
|
*
|
|
388
|
-
* The Select function is provided
|
|
389
|
-
*
|
|
390
|
-
*
|
|
388
|
+
* The Select function is provided to the third `query` parameter of the
|
|
389
|
+
* setQueryDefinition method. A query definition must call the Select function
|
|
390
|
+
* at least once, otherwise it will be meaningless and return no data.
|
|
391
391
|
*
|
|
392
392
|
* @example
|
|
393
393
|
* This example shows a query that selects two Cells from the main query Table.
|
|
394
394
|
*
|
|
395
395
|
* ```js
|
|
396
396
|
* const store = createStore().setTable('pets', {
|
|
397
|
-
* fido: {species: 'dog', color: 'brown'},
|
|
398
|
-
* felix: {species: 'cat', color: 'black'},
|
|
399
|
-
* cujo: {species: 'dog', color: 'black'},
|
|
397
|
+
* fido: {species: 'dog', color: 'brown', legs: 4},
|
|
398
|
+
* felix: {species: 'cat', color: 'black', legs: 4},
|
|
399
|
+
* cujo: {species: 'dog', color: 'black', legs: 4},
|
|
400
400
|
* });
|
|
401
401
|
*
|
|
402
402
|
* const queries = createQueries(store);
|
|
@@ -572,9 +572,9 @@ export type SelectedAs = {
|
|
|
572
572
|
|
|
573
573
|
/**
|
|
574
574
|
* The Join type describes a function that lets you specify a Cell or calculated
|
|
575
|
-
* value to join the main query Table to
|
|
575
|
+
* value to join the main query Table to other Tables, by their Row Id.
|
|
576
576
|
*
|
|
577
|
-
* The Join function is provided
|
|
577
|
+
* The Join function is provided to the third `query` parameter of the
|
|
578
578
|
* setQueryDefinition method.
|
|
579
579
|
*
|
|
580
580
|
* You can join zero, one, or many Tables. You can join the same underlying
|
|
@@ -856,8 +856,8 @@ export type JoinedAs = {as: (joinedTableId: Id) => void};
|
|
|
856
856
|
* The Where type describes a function that lets you specify conditions to
|
|
857
857
|
* filter results, based on the underlying Cells of the main or joined Tables.
|
|
858
858
|
*
|
|
859
|
-
* The Where function is provided
|
|
860
|
-
*
|
|
859
|
+
* The Where function is provided to the third `query` parameter of the
|
|
860
|
+
* setQueryDefinition method.
|
|
861
861
|
*
|
|
862
862
|
* If you do not specify a Where clause, you should expect every non-empty Row
|
|
863
863
|
* of the main Table to appear in the query's results.
|
|
@@ -867,10 +867,10 @@ export type JoinedAs = {as: (joinedTableId: Id) => void};
|
|
|
867
867
|
* wish to create an 'or' expression, use the single parameter version of the
|
|
868
868
|
* type that allows arbitrary programmatic conditions.
|
|
869
869
|
*
|
|
870
|
-
* The Where
|
|
871
|
-
* conditions that should be met by underlying Cell values (whether
|
|
872
|
-
* not), and the latter describes conditions based on calculated and
|
|
873
|
-
* values - after Group clauses have been applied.
|
|
870
|
+
* The Where keyword differs from the Having keyword in that the former
|
|
871
|
+
* describes conditions that should be met by underlying Cell values (whether
|
|
872
|
+
* selected or not), and the latter describes conditions based on calculated and
|
|
873
|
+
* aggregated values - after Group clauses have been applied.
|
|
874
874
|
*
|
|
875
875
|
* @example
|
|
876
876
|
* This example shows a query that filters the results from a single Table by
|
|
@@ -1006,8 +1006,8 @@ export type Where = {
|
|
|
1006
1006
|
* The Group type describes a function that lets you specify that the values of
|
|
1007
1007
|
* a Cell in multiple result Rows should be aggregated together.
|
|
1008
1008
|
*
|
|
1009
|
-
* The Group function is provided
|
|
1010
|
-
*
|
|
1009
|
+
* The Group function is provided to the third `query` parameter of the
|
|
1010
|
+
* setQueryDefinition method. When called, it should refer to a Cell Id (or
|
|
1011
1011
|
* aliased Id) specified in one of the Select functions, and indicate how the
|
|
1012
1012
|
* values should be aggregated.
|
|
1013
1013
|
*
|
|
@@ -1225,18 +1225,18 @@ export type GroupedAs = {as: (groupedCellId: Id) => void};
|
|
|
1225
1225
|
* The Having type describes a function that lets you specify conditions to
|
|
1226
1226
|
* filter results, based on the grouped Cells resulting from a Group clause.
|
|
1227
1227
|
*
|
|
1228
|
-
* The Having function is provided
|
|
1229
|
-
*
|
|
1228
|
+
* The Having function is provided to the third `query` parameter of the
|
|
1229
|
+
* setQueryDefinition method.
|
|
1230
1230
|
*
|
|
1231
1231
|
* A Having condition has to be true for a Row to be included in the results.
|
|
1232
1232
|
* Each Having class is additive, as though combined with a logical 'and'. If
|
|
1233
1233
|
* you wish to create an 'or' expression, use the single parameter version of
|
|
1234
1234
|
* the type that allows arbitrary programmatic conditions.
|
|
1235
1235
|
*
|
|
1236
|
-
* The Where
|
|
1237
|
-
* conditions that should be met by underlying Cell values (whether
|
|
1238
|
-
* not), and the latter describes conditions based on calculated and
|
|
1239
|
-
* values - after Group clauses have been applied.
|
|
1236
|
+
* The Where keyword differs from the Having keyword in that the former
|
|
1237
|
+
* describes conditions that should be met by underlying Cell values (whether
|
|
1238
|
+
* selected or not), and the latter describes conditions based on calculated and
|
|
1239
|
+
* aggregated values - after Group clauses have been applied.
|
|
1240
1240
|
*
|
|
1241
1241
|
* Whilst it is technically possible to use a Having clause even if the results
|
|
1242
1242
|
* have not been grouped with a Group clause, you should expect it to be less
|
|
@@ -1269,8 +1269,8 @@ export type GroupedAs = {as: (groupedCellId: Id) => void};
|
|
|
1269
1269
|
* queries.forEachResultRow('query', (rowId) => {
|
|
1270
1270
|
* console.log({[rowId]: queries.getResultRow('query', rowId)});
|
|
1271
1271
|
* });
|
|
1272
|
-
* // -> {
|
|
1273
|
-
* // -> {
|
|
1272
|
+
* // -> {0: {species: 'cat', minPrice: 3, maxPrice: 4}}
|
|
1273
|
+
* // -> {1: {species: 'parrot', minPrice: 3, maxPrice: 3}}
|
|
1274
1274
|
* ```
|
|
1275
1275
|
* @example
|
|
1276
1276
|
* This example shows a query that filters the results from a grouped Table with
|
|
@@ -1421,7 +1421,9 @@ export type Having = {
|
|
|
1421
1421
|
* queries.delListener(listenerId);
|
|
1422
1422
|
* queries.destroy();
|
|
1423
1423
|
* ```
|
|
1424
|
-
* @see Queries guides
|
|
1424
|
+
* @see Making Queries guides
|
|
1425
|
+
* @see Car Analysis demo
|
|
1426
|
+
* @see Movie Database demo
|
|
1425
1427
|
* @category Queries
|
|
1426
1428
|
* @since v2.0.0
|
|
1427
1429
|
*/
|
|
@@ -1436,11 +1438,11 @@ export interface Queries {
|
|
|
1436
1438
|
* The definition must specify this 'main' Table (by its Id) to be aggregated.
|
|
1437
1439
|
* Other Tables can be joined to that using Join clauses.
|
|
1438
1440
|
*
|
|
1439
|
-
* The third `
|
|
1440
|
-
* query. That callback is provided with a `
|
|
1441
|
-
*
|
|
1442
|
-
* see how that is used in the simple example below. The following
|
|
1443
|
-
* clause types are supported:
|
|
1441
|
+
* The third `query` parameter is a callback that you provide to define the
|
|
1442
|
+
* query. That callback is provided with a `keywords` object that contains the
|
|
1443
|
+
* functions you use to define the query, like `select`, `join`, and so on.
|
|
1444
|
+
* You can see how that is used in the simple example below. The following
|
|
1445
|
+
* five clause types are supported:
|
|
1444
1446
|
*
|
|
1445
1447
|
* - The Select type describes a function that lets you specify a Cell or
|
|
1446
1448
|
* calculated value for including into the query's result.
|
|
@@ -1456,14 +1458,14 @@ export interface Queries {
|
|
|
1456
1458
|
*
|
|
1457
1459
|
* Full documentation and examples are provided in the sections for each of
|
|
1458
1460
|
* those clause types.
|
|
1459
|
-
*
|
|
1461
|
+
*
|
|
1460
1462
|
* Additionally, you can use the getResultSortedRowIds method and
|
|
1461
1463
|
* addResultSortedRowIdsListener method to sort and paginate the results.
|
|
1462
1464
|
*
|
|
1463
1465
|
* @param queryId The Id of the query to define.
|
|
1464
1466
|
* @param tableId The Id of the main Table the query will be based on.
|
|
1465
|
-
* @param
|
|
1466
|
-
the
|
|
1467
|
+
* @param query A callback which can take a `keywords` object and which uses
|
|
1468
|
+
the functions it contains to define the query.
|
|
1467
1469
|
* @returns A reference to the Queries object.
|
|
1468
1470
|
* @example
|
|
1469
1471
|
* This example creates a Store, creates a Queries object, and defines a
|
|
@@ -1492,7 +1494,7 @@ export interface Queries {
|
|
|
1492
1494
|
setQueryDefinition(
|
|
1493
1495
|
queryId: Id,
|
|
1494
1496
|
tableId: Id,
|
|
1495
|
-
|
|
1497
|
+
query: (keywords: {
|
|
1496
1498
|
select: Select;
|
|
1497
1499
|
join: Join;
|
|
1498
1500
|
where: Where;
|
package/lib/queries.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const e=e=>typeof e,t=e(""),n=e(!0),s=e(0),r=e(e),o=(e,t)=>e.every(t),l=(e,t)=>e.forEach(t),a=e=>c(e,((e,t)=>e+t),0),i=e=>e.length,d=e=>0==i(e),c=(e,t,n)=>e.reduce(t,n),u=(e,...t)=>e.push(...t),h=Math.max,w=Math.min,
|
|
1
|
+
const e=e=>typeof e,t=e(""),n=e(!0),s=e(0),r=e(e),o=(e,t)=>e.every(t),l=(e,t)=>e.forEach(t),a=e=>c(e,((e,t)=>e+t),0),i=e=>e.length,d=e=>0==i(e),c=(e,t,n)=>e.reduce(t,n),u=(e,...t)=>e.push(...t),h=Math.max,w=Math.min,g=isFinite,R=e=>null==e,v=(e,t,n)=>R(e)?n?.():t(e),L=t=>e(t)==r,f=()=>{},y=e=>e.size,T=(e,t)=>e?.has(t)??!1,b=e=>R(e)||0==y(e),C=e=>[...e?.values()??[]],I=e=>e.clear(),p=(e,t)=>e?.forEach(t),S=(e,t)=>e?.delete(t),m=e=>new Map(e),Q=(e,t)=>e?.get(t),E=(e,t)=>p(e,((e,n)=>t(n,e))),M=(e,t,n)=>R(n)?(S(e,t),e):e?.set(t,n),x=(e,t,n)=>(T(e,t)||M(e,t,n()),Q(e,t)),D=(e,t,n,s,r=0)=>v((n?x:Q)(e,t[r],r>i(t)-2?n:m),(o=>{if(r>i(t)-2)return s?.(o)&&M(e,t[r]),o;const l=D(o,t,n,s,r+1);return b(o)&&M(e,t[r]),l})),F=e=>new Set(e),j=(e,t)=>e?.add(t),k=m([["avg",[(e,t)=>a(e)/t,(e,t,n)=>e+(t-e)/(n+1),(e,t,n)=>e+(e-t)/(n-1),(e,t,n,s)=>e+(t-n)/s]],["max",[e=>h(...e),(e,t)=>h(t,e),(e,t)=>t==e?void 0:e,(e,t,n)=>n==e?void 0:h(t,e)]],["min",[e=>w(...e),(e,t)=>w(t,e),(e,t)=>t==e?void 0:e,(e,t,n)=>n==e?void 0:w(t,e)]],["sum",[e=>a(e),(e,t)=>e+t,(e,t)=>e-t,(e,t,n)=>e-n+t]]]),z=r=>{const o=e(r);return(e=>e==t||e==n)(o)||o==s&&g(r)?o:void 0},W=Object,O=W.freeze,q=(e=>{const t=new WeakMap;return n=>(t.has(n)||t.set(n,e(n)),t.get(n))})((e=>{const t=e.createStore,[n,s,r,a,c,,,h,,w,g,q,A]=((e,t,n)=>{const s=e.hasRow,r=m(),o=m(),a=m(),i=m(),c=m(),u=(t,n,...s)=>{const r=x(c,t,F);return l(s,(t=>j(r,t)&&n&&e.callListener(t))),s},h=(t,...n)=>v(Q(c,t),(s=>{l(d(n)?C(s):n,(t=>{e.delListener(t),S(s,t)})),b(s)&&M(c,t)})),w=(e,n)=>{M(r,e,n),T(o,e)||(M(o,e,t()),M(a,e,m()),M(i,e,m()))},g=e=>{M(r,e),M(o,e),M(a,e),M(i,e),h(e)};return[()=>e,()=>[...r?.keys()??[]],e=>E(o,e),e=>T(o,e),e=>Q(r,e),e=>Q(o,e),(e,t)=>M(o,e,t),w,(t,r,o,d,c)=>{w(t,r);const g=m(),v=m(),L=Q(a,t),f=Q(i,t),y=t=>{const o=n=>e.getCell(r,t,n),l=Q(L,t),a=s(r,t)?n(d(o,t)):void 0;if(l!=a&&M(g,t,[l,a]),!R(c)){const e=Q(f,t),n=s(r,t)?c(o,t):void 0;e!=n&&M(v,t,n)}},b=e=>{o((()=>{p(g,(([,e],t)=>M(L,t,e))),p(v,((e,t)=>M(f,t,e)))}),g,v,L,f,e),I(g),I(v)};E(L,y),e.hasTable(r)&&l(e.getRowIds(r),(e=>{T(L,e)||y(e)})),b(!0),h(t),u(t,0,e.addRowListener(r,null,((e,t,n)=>y(n))),e.addTableListener(r,(()=>b())))},g,()=>E(c,g),u,h]})(e,(()=>!0),f),B=t(),G=t(),H=m(),J=(e,t,...n)=>l(n,(n=>j(x(x(H,t,m),e,F),n))),K=e=>{v(Q(H,e),(e=>{E(e,((e,t)=>p(t,(t=>e.delListener(t))))),I(e)})),l([G,B],(t=>t.delTable(e)))},N=(e,t,n)=>J(t,e,t.addWillFinishTransactionListener(n.startTransaction),t.addDidFinishTransactionListener((()=>n.finishTransaction()))),P={setQueryDefinition:(t,n,s)=>{h(t,n),K(t);const r=[],a=[[null,[n,null,null,[],m()]]],c=[],w=[],g=[];s({select:(e,t)=>{const n=L(e)?[i(r)+"",e]:[R(t)?e:t,n=>n(e,t)];return u(r,n),{as:e=>n[0]=e}},join:(e,t,n)=>{const s=R(n)||L(t)?null:t,r=R(s)?t:n,o=[e,[e,s,L(r)?r:e=>e(r),[],m()]];return u(a,o),{as:e=>o[0]=e}},where:(e,t,n)=>u(c,L(e)?e:R(n)?n=>n(e)===t:s=>s(e,t)===n),group:(e,t,n,s,r)=>{const o=[e,[e,L(t)?[t,n,s,r]:Q(k,t)??[(e,t)=>t]]];return u(w,o),{as:e=>o[0]=e}},having:(e,t)=>u(g,L(e)?e:n=>n(e)===t)});const f=m(r);if(b(f))return P;const I=m(a);E(I,((e,[,t])=>v(Q(I,t),(({3:t})=>R(e)?0:u(t,e)))));const W=m(w);let O=B;if(b(W)&&d(g))O=G;else{N(t,O,G);const e=m();E(W,((t,[n,s])=>j(x(e,n,F),[t,s])));const n=F();E(f,(t=>T(e,t)?0:j(n,t)));const s=m(),r=(n,s,r,l)=>v(n,(([a,i,d,c])=>{E(s,((t,[n])=>{const s=x(a,t,m),o=Q(s,r),i=l?void 0:n;if(o!==i){const n=F([[o,i]]),l=y(s);M(s,r,i),p(Q(e,t),(([e,t])=>{const r=((e,t,n,s,r,o=!1)=>{if(b(n))return;const[l,a,i,d]=r;return o||=R(e),p(s,(([n,s])=>{o||(e=R(n)?a?.(e,s,t++):R(s)?i?.(e,n,t--):d?.(e,s,n,t),o||=R(e))})),o?l(C(n),y(n)):e})(c[e],l,s,n,t);c[e]=R(z(r))?null:r}))}})),b(i)||!o(g,(e=>e((e=>c[e]))))?G.delRow(t,d):R(d)?n[2]=G.addRow(t,c):G.setRow(t,d,c)}));J(O,t,O.addRowListener(t,null,((o,l,a,i)=>{const d=[],c=[],h=m(),w=O.hasRow(t,a);let g=!w;p(n,(e=>{const[n,s,r]=i(t,a,e);u(d,s),u(c,r),g||=n})),E(e,(e=>{const[n,,s]=i(t,a,e);(g||n)&&M(h,e,[s])})),g&&r(D(s,d,void 0,(([,e])=>(S(e,a),b(e)))),h,a,1),w&&r(D(s,c,(()=>{const e={};return p(n,(n=>e[n]=O.getCell(t,a,n))),[m(),F(),void 0,e]}),(([,e])=>{j(e,a)})),h,a)})))}N(t,e,O);const H=s=>{const r=(t,r)=>e.getCell(...R(r)?[n,s,t]:t===n?[n,s,r]:[Q(I,t)?.[0],Q(Q(I,t)?.[4],s)?.[0],r]);O.transaction((()=>o(c,(e=>e(r)))?E(f,((e,n)=>((e,t,n,s,r)=>R(r)?e.delCell(t,n,s,!0):e.setCell(t,n,s,r))(O,t,s,e,n(r,s)))):O.delRow(t,s)))},U=(n,s,r,o)=>{const a=t=>e.getCell(s,r,t);l(o,(s=>{const[r,,o,l,i]=Q(I,s),d=o?.(a,n),[c,u]=Q(i,n)??[];d!=c&&(R(u)||A(t,u),M(i,n,R(d)?null:[d,...q(t,1,e.addRowListener(r,d,(()=>U(n,r,d,l))))]))})),H(n)},{3:V}=Q(I,null);return O.transaction((()=>q(t,1,e.addRowListener(n,null,((s,r,o)=>{e.hasRow(n,o)?U(o,n,o,V):(O.delRow(t,o),p(I,(({4:e})=>v(Q(e,o),(([,n])=>{A(t,n),M(e,o)})))))}))))),P},delQueryDefinition:e=>(K(e),w(e),P),getStore:n,getQueryIds:s,forEachQuery:r,hasQuery:a,getTableId:c,delListener:e=>(G.delListener(e),P),destroy:g,getListenerStats:()=>{const{tables:e,tableIds:t,transaction:n,...s}=G.getListenerStats();return s}};var U,V;return U={Table:[1,1],RowIds:[0,1],SortedRowIds:[0,5],Row:[1,2],CellIds:[0,2],Cell:[1,3]},V=([e,t],n)=>{l(e?["get","has","forEach"]:["get"],(e=>P[e+"Result"+n]=(...t)=>G[e+n](...t))),P["addResult"+n+"Listener"]=(...e)=>{return G["add"+n+"Listener"](...(s=e,r=0,o=t,s.slice(r,o)),((n,...s)=>e[t](P,...s)));var s,r,o}},l(W.entries(U),(([e,t])=>V(t,e))),O(P)}));export{q as createQueries};
|
package/lib/queries.js.gz
CHANGED
|
Binary file
|
package/lib/relationships.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const e=e=>typeof e,t=e(""),n=(e,t)=>e.forEach(t),
|
|
1
|
+
const e=e=>typeof e,t=e(""),n=(e,t)=>e.forEach(t),s=e=>e.length,o=(e,...t)=>e.push(...t),r=e=>null==e,i=(e,t,n)=>r(e)?n?.():t(e),l=(e,t)=>e?.has(t)??!1,a=e=>r(e)||0==(e=>e.size)(e),d=e=>[...e?.values()??[]],c=e=>e.clear(),u=(e,t)=>e?.forEach(t),R=(e,t)=>e?.delete(t),h=e=>new Map(e),f=(e,t)=>e?.get(t),L=(e,t)=>u(e,((e,n)=>t(n,e))),g=(e,t,n)=>r(n)?(R(e,t),e):e?.set(t,n),w=(e,t,n)=>(l(e,t)||g(e,t,n()),f(e,t)),p=(e,t,n,o,r=0)=>i((n?w:f)(e,t[r],r>s(t)-2?n:h),(i=>{if(r>s(t)-2)return o?.(i)&&g(e,t[r]),i;const l=p(i,t,n,o,r+1);return a(i)&&g(e,t[r]),l})),I=e=>new Set(e),b=(e,t)=>e?.add(t),v=(e,t,o)=>{const p=e.hasRow,v=h(),k=h(),E=h(),T=h(),m=h(),y=(t,s,...o)=>{const r=w(m,t,I);return n(o,(t=>b(r,t)&&s&&e.callListener(t))),o},S=(t,...o)=>i(f(m,t),(r=>{n(0==s(o)?d(r):o,(t=>{e.delListener(t),R(r,t)})),a(r)&&g(m,t)})),z=(e,n)=>{g(v,e,n),l(k,e)||(g(k,e,t()),g(E,e,h()),g(T,e,h()))},D=e=>{g(v,e),g(k,e),g(E,e),g(T,e),S(e)};return[()=>e,()=>[...v?.keys()??[]],e=>L(k,e),e=>l(k,e),e=>f(v,e),e=>f(k,e),(e,t)=>g(k,e,t),z,(t,s,i,a,d)=>{z(t,s);const R=h(),w=h(),I=f(E,t),b=f(T,t),v=t=>{const n=n=>e.getCell(s,t,n),i=f(I,t),l=p(s,t)?o(a(n,t)):void 0;if(i!=l&&g(R,t,[i,l]),!r(d)){const e=f(b,t),o=p(s,t)?d(n,t):void 0;e!=o&&g(w,t,o)}},k=e=>{i((()=>{u(R,(([,e],t)=>g(I,t,e))),u(w,((e,t)=>g(b,t,e)))}),R,w,I,b,e),c(R),c(w)};L(I,v),e.hasTable(s)&&n(e.getRowIds(s),(e=>{l(I,e)||v(e)})),k(!0),S(t),y(t,0,e.addRowListener(s,null,((e,t,n)=>v(n))),e.addTableListener(s,(()=>k())))},D,()=>L(m,D),y,S]},k=(n,s)=>e(n)==t?e=>e(n):n??(()=>s??""),E=/^\d+$/,T=e=>{let t;const[l,d]=(()=>{const e=[];let t=0;return[()=>e.shift()??""+t++,t=>{E.test(t)&&s(e)<1e3&&o(e,t)}]})(),c=h();return[(n,s,o)=>{t??=e();const r=l();return g(c,r,[n,s,o]),b(p(s,o??[""],I),r),r},(e,r,...i)=>n(((e,t=[""])=>{const r=[],i=(e,l)=>l==s(t)?o(r,e):null===t[l]?u(e,(e=>i(e,l+1))):n([t[l],null],(t=>i(f(e,t),l+1)));return i(e,0),r})(e,r),(e=>u(e,(e=>f(c,e)[0](t,...r??[],...i))))),e=>i(f(c,e),(([,t,n])=>(p(t,n??[""],void 0,(t=>(R(t,e),a(t)?1:0))),g(c,e),d(e),n))),(e,o,l)=>i(f(c,e),(([e,,i=[]])=>{const a=(...d)=>{const c=s(d);c==s(i)?e(t,...d,...l(d)):r(i[c])?n(o[c](...d),(e=>a(...d,e))):a(...d,i[c])};a()}))]},m=Object.freeze,y=(e=>{const t=new WeakMap;return n=>(t.has(n)||t.set(n,e(n)),t.get(n))})((e=>{const t=h(),n=h(),s=h(),o=h(),[c,w,p,E,y,S,,,z,D,M]=v(e,(()=>[h(),h(),h(),h()]),(e=>r(e)?void 0:e+"")),[j,x,C]=T((()=>q)),O=(e,t,n)=>i(S(e),(([s,,o])=>{if(!l(o,t)){const i=I();if(y(e)!=$(e))b(i,t);else{let e=t;for(;!r(e)&&!l(i,e);)b(i,e),e=f(s,e)}if(n)return i;g(o,t,i)}return f(o,t)})),W=(e,t)=>i(S(e),(([,,e])=>g(e,t))),$=e=>f(t,e),q={setRelationshipDefinition:(e,d,c,h)=>(g(t,e,c),z(e,d,((t,d)=>{const c=I(),h=I(),w=I(),[p,v]=S(e);u(d,(([t,n],s)=>{r(t)||(b(h,t),i(f(v,t),(e=>{R(e,s),a(e)&&g(v,t)}))),r(n)||(b(h,n),l(v,n)||g(v,n,I()),b(f(v,n),s)),b(c,s),g(p,s,n),L(f(o,e),(t=>{l(O(e,t),s)&&b(w,t)}))})),t(),u(c,(t=>x(n,[e,t]))),u(h,(t=>x(s,[e,t]))),u(w,(t=>{W(e,t),x(o,[e,t])}))}),k(h)),q),delRelationshipDefinition:e=>(g(t,e),D(e),q),getStore:c,getRelationshipIds:w,forEachRelationship:t=>p((n=>t(n,(t=>e.forEachRow(y(n),t))))),hasRelationship:E,getLocalTableId:y,getRemoteTableId:$,getRemoteRowId:(e,t)=>f(S(e)?.[0],t),getLocalRowIds:(e,t)=>d(f(S(e)?.[1],t)),getLinkedRowIds:(e,t)=>r(S(e))?[t]:d(O(e,t,!0)),addRemoteRowIdListener:(e,t,s)=>j(s,n,[e,t]),addLocalRowIdsListener:(e,t,n)=>j(n,s,[e,t]),addLinkedRowIdsListener:(e,t,n)=>(O(e,t),j(n,o,[e,t])),delListener:e=>(W(...C(e)),q),destroy:M,getListenerStats:()=>({})};return m(q)}));export{y as createRelationships};
|
package/lib/relationships.js.gz
CHANGED
|
Binary file
|
package/lib/store.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const e=e=>typeof e,t=e(""),
|
|
1
|
+
const e=e=>typeof e,t=e(""),s=e(!0),n=e(0),r=e(e),l=(e,t)=>e.forEach(t),o=(e,t)=>e.map(t),a=e=>e.length,c=(e,t,s)=>e.slice(t,s),i=(e,...t)=>e.push(...t),d=e=>JSON.stringify(e,((e,t)=>{return h(t,Map)?(s=[...t],n=(e,[t,s])=>(e[t]=s,e),r={},s.reduce(n,r)):t;var s,n,r})),u=JSON.parse,f=isFinite,h=(e,t)=>e instanceof t,T=e=>null==e,b=(e,t,s)=>T(e)?s?.():t(e),g=e=>e==t||e==s,w=(e,t)=>e?.has(t)??!1,v=e=>T(e)||0==(e=>e.size)(e),R=e=>e.clear(),C=(e,t)=>e?.forEach(t),p=(e,t)=>e?.delete(t),S=e=>new Map(e),y=e=>[...e?.keys()??[]],I=(e,t)=>e?.get(t),L=(e,t)=>C(e,((e,s)=>t(s,e))),E=(e,t,s)=>T(s)?(p(e,t),e):e?.set(t,s),J=(e,t,s)=>(w(e,t)||E(e,t,s()),I(e,t)),m=(e,t,s)=>{const n={},r=t??(e=>e);return C(e,((e,t)=>b(r(e),(e=>s?.(e)?0:n[t]=e)))),n},F=(e,t)=>{const s=S(),n=t??(e=>e);return C(e,((e,t)=>s.set(t,n(e)))),s},z=e=>F(e,F),O=(e,t,s,n,r=0)=>b((s?J:I)(e,t[r],r>a(t)-2?s:S),(l=>{if(r>a(t)-2)return n?.(l)&&E(e,t[r]),l;const o=O(l,t,s,n,r+1);return v(l)&&E(e,t[r]),o})),k=Object,M=k.keys,N=k.isFrozen,j=k.freeze,x=(e,t)=>!T(((e,t)=>b(e,(e=>e[t])))(e,t)),D=(e,t)=>delete e[t],P=(e,t)=>l(k.entries(e),(([e,s])=>t(s,e))),W=e=>{return t=M(e),0==a(t);var t},$=e=>new Set(e),q=(e,t)=>e?.add(t),A=/^\d+$/,B=()=>{const e=[];let t=0;return[()=>e.shift()??""+t++,t=>{A.test(t)&&a(e)<1e3&&i(e,t)}]},G=e=>{let t;const[s,n]=B(),r=S();return[(n,l,o)=>{t??=e();const a=s();return E(r,a,[n,l,o]),q(O(l,o??[""],$),a),a},(e,s,...n)=>l(((e,t=[""])=>{const s=[],n=(e,r)=>r==a(t)?i(s,e):null===t[r]?C(e,(e=>n(e,r+1))):l([t[r],null],(t=>n(I(e,t),r+1)));return n(e,0),s})(e,s),(e=>C(e,(e=>I(r,e)[0](t,...s??[],...n))))),e=>b(I(r,e),(([,t,s])=>(O(t,s??[""],void 0,(t=>(p(t,e),v(t)?1:0))),E(r,e),n(e),s))),(e,s,n)=>b(I(r,e),(([e,,r=[]])=>{const o=(...c)=>{const i=a(c);i==a(r)?e(t,...c,...n(c)):T(r[i])?l(s[i](...c),(e=>o(...c,e))):o(...c,r[i])};o()}))]},H=e=>[e,e],K=()=>[S(),S()],Q=t=>{const s=e(t);return g(s)||s==n&&f(t)?s:void 0},U=e=>""+e,V=(e,t,s,n=E)=>{const r=(o=y(e),a=e=>!x(t,e),o.filter(a));var o,a;return l(M(t),(n=>s(e,n,t[n]))),l(r,(t=>n(e,t))),e},X=(e,t,s)=>T(e)||!(e=>h(e,k)&&e.constructor==k)(e)||W(e)||N(e)?(s?.(),!1):(P(e,((s,n)=>{t(s,n)||D(e,n)})),!W(e)),Y=(e,t,s)=>E(e,t,I(e,t)==-s?void 0:s),Z=()=>{let t,s,f=0;const h=S(),O=S(),k=S(),M=S(),N=S(),A=S(),_=S(),ee=S(),te=S(),se=K(),ne=K(),re=K(),le=K(),oe=K(),ae=K(),ce=K(),ie=K(),de=K(),ue=K(),[fe,he,Te,be]=G((()=>Ze)),ge=(e,s)=>(!t||w(A,s)||je(s))&&X(e,((e,t)=>we(s,t,e)),(()=>je(s))),we=(e,t,s,n)=>X(n?s:Re(s,e,t),((n,r)=>b(ve(e,t,r,n),(e=>(s[r]=e,!0)),(()=>!1))),(()=>je(e,t))),ve=(e,s,n,r)=>t?b(I(I(A,e),n),(t=>Q(r)!=t.type?je(e,s,n,r,t.default):r),(()=>je(e,s,n,r))):T(Q(r))?je(e,s,n,r):r,Re=(e,t,s)=>(b(I(_,t),(([n,r])=>{C(n,((t,s)=>{x(e,s)||(e[s]=t)})),C(r,(n=>{x(e,n)||je(t,s,n)}))})),e),Ce=e=>V(A,e,((e,t,s)=>{const n=S(),r=$();V(J(A,t,S),s,((e,t,s)=>{E(e,t,s),b(s.default,(e=>E(n,t,e)),(()=>q(r,t)))})),E(_,t,[n,r])}),((e,t)=>{E(A,t),E(_,t)})),pe=e=>V(te,e,((e,t,s)=>Se(t,s)),((e,t)=>me(t))),Se=(e,t)=>V(J(te,e,(()=>(Oe(e,1),S()))),t,((t,s,n)=>ye(e,t,s,n)),((t,s)=>Fe(e,t,s))),ye=(e,t,s,n,r)=>V(J(t,s,(()=>(ke(e,s,1),S()))),n,((t,n,r)=>Ie(e,s,t,n,r)),((n,l)=>ze(e,t,s,n,l,r))),Ie=(e,t,s,n,r)=>{w(s,n)||Me(e,t,n,1);const l=I(s,n);r!==l&&(Ne(e,t,n,l,r),E(s,n,r))},Le=(e,t,s,n,r)=>b(I(t,s),(t=>Ie(e,s,t,n,r)),(()=>ye(e,t,s,Re({[n]:r},e,s)))),Ee=e=>{const[t]=J(ee,e,B),s=t();return w(I(te,e),s)?Ee(e):s},Je=e=>I(te,e)??Se(e,{}),me=e=>Se(e,{}),Fe=(e,t,s)=>{const[,n]=J(ee,e,B);n(s),ye(e,t,s,{},!0)},ze=(e,t,s,n,r,l)=>{const o=I(I(_,e)?.[0],r);if(!T(o)&&!l)return Ie(e,s,n,r,o);const a=t=>{Ne(e,s,t,I(n,t)),Me(e,s,t,-1),E(n,t)};T(o)?a(r):L(n,a),v(n)&&(ke(e,s,-1),v(E(t,s))&&(Oe(e,-1),E(te,e)))},Oe=(e,t)=>Y(h,e,t),ke=(e,t,s)=>Y(J(O,e,S),t,s),Me=(e,t,s,n)=>Y(J(J(k,e,S),t,S),s,n),Ne=(e,t,s,n,r)=>J(J(J(M,e,S),t,S),s,(()=>[n,0]))[1]=r,je=(e,t,s,n,r)=>(i(J(J(J(N,e,S),t,S),s,(()=>[])),n),r),xe=(e,t,s)=>b(I(I(I(M,e),t),s),(([e,t])=>[!0,e,t]),(()=>[!1,...H(Ke(e,t,s))])),De=e=>v(N)||v(de[e])?0:C(e?F(N,z):N,((t,s)=>C(t,((t,n)=>C(t,((t,r)=>he(de[e],[s,n,r],t))))))),Pe=(e,t,s)=>{if(!v(t))return he(e,s),1},We=e=>{const t=v(oe[e]),s=v(ce[e])&&v(le[e])&&t&&v(ne[e]),n=v(ie[e])&&v(ae[e])&&v(re[e])&&v(se[e]);if(!s||!n){const r=e?[F(h),z(O),F(k,z),F(M,z)]:[h,O,k,M];if(!s){C(r[2],((t,s)=>C(t,((t,n)=>Pe(ce[e],t,[s,n])))));const s=$();C(r[1],((n,r)=>{Pe(le[e],n,[r])&&!t&&(he(oe[e],[r,null]),q(s,r))})),t||C(r[3],((t,n)=>{if(!w(s,n)){const s=$();C(t,(e=>C(e,(([t,n],r)=>n!==t?q(s,r):p(e,r))))),C(s,(t=>he(oe[e],[n,t])))}})),Pe(ne[e],r[0])}if(!n){let t;C(r[3],((s,n)=>{let r;C(s,((s,l)=>{let o;C(s,(([s,a],c)=>{a!==s&&(he(ie[e],[n,l,c],a,s,xe),t=r=o=1)})),o&&he(ae[e],[n,l],xe)})),r&&he(re[e],[n],xe)})),t&&he(se[e],void 0,xe)}}},$e=(e,...t)=>(Ve((()=>e(...o(t,U)))),Ze),qe=()=>m(te,(e=>m(e,m))),Ae=()=>y(te),Be=e=>y(I(te,U(e))),Ge=(e,t,s,n=0,r)=>{const l=[];return L(I(te,U(e)),((e,s)=>i(l,[T(t)?e:I(s,U(t)),e]))),o(c(l.sort((([e],[t])=>(e<t?-1:1)*(s?-1:1))),n,T(r)?r:n+r),(([,e])=>e))},He=(e,t)=>y(I(I(te,U(e)),U(t))),Ke=(e,t,s)=>I(I(I(te,U(e)),U(t)),U(s)),Qe=e=>$e((()=>(e=>X(e,ge,je))(e)?pe(e):0)),Ue=()=>$e((()=>pe({}))),Ve=(e,t)=>{if(-1==f)return;Xe();const s=e?.();return Ye(t),s},Xe=()=>(f++,Ze),Ye=e=>(f>0&&(f--,0==f&&(s=!v(M),f=1,De(1),s&&We(1),f=-1,e?.(m(M,(e=>m(e,(e=>m(e,(e=>[...e]),(([e,t])=>e===t))),W)),W),m(N,(e=>m(e,m))))&&(f=1,C(M,((e,t)=>C(e,((e,s)=>C(e,(([e],n)=>((e,t,s,n,r)=>T(r)?e.delCell(t,s,n,!0):e.setCell(t,s,n,r))(Ze,t,s,n,e))))))),f=-1,s=!1),he(ue[0],void 0,s),De(0),s&&We(0),he(ue[1],void 0,s),f=0,l([M,N,h,O,k],R))),Ze),Ze={getTables:qe,getTableIds:Ae,getTable:e=>m(I(te,U(e)),m),getRowIds:Be,getSortedRowIds:Ge,getRow:(e,t)=>m(I(I(te,U(e)),U(t))),getCellIds:He,getCell:Ke,hasTables:()=>!v(te),hasTable:e=>w(te,U(e)),hasRow:(e,t)=>w(I(te,U(e)),U(t)),hasCell:(e,t,s)=>w(I(I(te,U(e)),U(t)),U(s)),getJson:()=>d(te),getSchemaJson:()=>d(A),setTables:Qe,setTable:(e,t)=>$e((e=>ge(t,e)?Se(e,t):0),e),setRow:(e,t,s)=>$e(((e,t)=>we(U(e),U(t),s)?ye(U(e),Je(U(e)),U(t),s):0),e,t),addRow:(e,t)=>Ve((()=>{let s;return we(e,s,t)&&(e=U(e),ye(e,Je(e),s=Ee(e),t)),s})),setPartialRow:(e,t,s)=>$e(((e,t)=>{if(we(e,t,s,1)){const n=Je(e);P(s,((s,r)=>Le(e,n,t,r,s)))}}),e,t),setCell:(t,s,n,l)=>$e(((t,s,n)=>b(ve(t,s,n,e(l)==r?l(Ke(t,s,n)):l),(e=>Le(t,Je(t),s,n,e)))),t,s,n),setJson:e=>{try{"{}"===e?Ue():Qe(u(e))}catch{}return Ze},setSchema:e=>$e((()=>{if((t=(e=>X(e,(e=>X(e,(e=>{if(!X(e,((e,t)=>["type","default"].includes(t))))return!1;const t=e.type;return!(!g(t)&&t!=n||(Q(e.default)!=t&&D(e,"default"),0))})))))(e))&&(Ce(e),!v(te))){const e=qe();Ue(),Qe(e)}})),delTables:Ue,delTable:e=>$e((e=>w(te,e)?me(e):0),e),delRow:(e,t)=>$e(((e,t)=>b(I(te,e),(s=>w(s,t)?Fe(e,s,t):0))),e,t),delCell:(e,t,s,n)=>$e(((e,t,s)=>b(I(te,e),(r=>b(I(r,t),(l=>w(l,s)?ze(e,r,t,l,s,n):0))))),e,t,s),delSchema:()=>$e((()=>{Ce({}),t=!1})),transaction:Ve,startTransaction:Xe,finishTransaction:Ye,forEachTable:e=>C(te,((t,s)=>e(s,(e=>C(t,((t,s)=>e(s,(e=>L(t,e))))))))),forEachRow:(e,t)=>C(I(te,U(e)),((e,s)=>t(s,(t=>L(e,t))))),forEachCell:(e,t,s)=>L(I(I(te,U(e)),U(t)),s),addSortedRowIdsListener:(e,t,s,n,r,l,o)=>{let c=Ge(e,t,s,n,r);return fe((()=>{const o=Ge(e,t,s,n,r);var i,d,u;d=c,a(i=o)===a(d)&&(u=(e,t)=>d[t]===e,i.every(u))||(c=o,l(Ze,e,t,s,n,r,c))}),oe[o?1:0],[e,t])},addWillFinishTransactionListener:e=>fe(e,ue[0]),addDidFinishTransactionListener:e=>fe(e,ue[1]),callListener:e=>(be(e,[Ae,Be,He],(e=>T(e[2])?[]:H(Ke(...e)))),Ze),delListener:e=>(Te(e),Ze),getListenerStats:()=>({}),createStore:Z};return P({Tables:[0,se],TableIds:[0,ne],Table:[1,re],RowIds:[1,le],Row:[2,ae],CellIds:[2,ce],Cell:[3,ie],InvalidCell:[3,de]},(([e,t],s)=>{Ze["add"+s+"Listener"]=(...s)=>fe(s[e],t[s[e+1]?1:0],e>0?c(s,0,e):void 0)})),j(Ze)};export{Z as createStore};
|
package/lib/store.js.gz
CHANGED
|
Binary file
|