tinybase 1.0.5 → 1.1.0-beta.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 +8 -6
- package/lib/debug/indexes.js +4 -2
- package/lib/debug/metrics.js +4 -2
- package/lib/debug/relationships.js +4 -2
- package/lib/debug/store.d.ts +159 -0
- package/lib/debug/store.js +87 -31
- package/lib/debug/tinybase.js +91 -35
- package/lib/store.d.ts +159 -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/umd/checkpoints.js +1 -1
- package/lib/umd/checkpoints.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 +12 -12
- package/readme.md +2 -2
package/lib/debug/tinybase.js
CHANGED
|
@@ -29,6 +29,8 @@ const arrayReduce = (array, cb, initial) => array.reduce(cb, initial);
|
|
|
29
29
|
const arrayFilter = (array, cb) => array.filter(cb);
|
|
30
30
|
const arrayFromSecond = (ids) => ids.slice(1);
|
|
31
31
|
const arrayClear = (array, to) => array.splice(0, to);
|
|
32
|
+
const arrayPush = (array, value) => array.push(value);
|
|
33
|
+
const arrayPop = (array) => array.pop();
|
|
32
34
|
|
|
33
35
|
const jsonString = (obj) =>
|
|
34
36
|
JSON.stringify(obj, (_key, value) =>
|
|
@@ -254,7 +256,7 @@ const getListenerFunctions = (getThing) => {
|
|
|
254
256
|
const allListeners = mapNew();
|
|
255
257
|
const addListener = (listener, deepSet, idOrNulls = []) => {
|
|
256
258
|
thing ??= getThing();
|
|
257
|
-
const id = listenerPool
|
|
259
|
+
const id = arrayPop(listenerPool) ?? '' + nextId++;
|
|
258
260
|
mapSet(allListeners, id, [listener, deepSet, idOrNulls]);
|
|
259
261
|
addDeepSet(deepSet, id, idOrNulls);
|
|
260
262
|
return id;
|
|
@@ -275,7 +277,7 @@ const getListenerFunctions = (getThing) => {
|
|
|
275
277
|
forDeepSet(collDel)(deepSet, id, ...idOrNulls);
|
|
276
278
|
mapSet(allListeners, id);
|
|
277
279
|
if (arrayLength(listenerPool) < 1e3) {
|
|
278
|
-
listenerPool
|
|
280
|
+
arrayPush(listenerPool, id);
|
|
279
281
|
}
|
|
280
282
|
return idOrNulls;
|
|
281
283
|
},
|
|
@@ -361,7 +363,7 @@ const createCheckpoints = getCreateFunction((store) => {
|
|
|
361
363
|
(_store, tableId, rowId, cellId, newCell, oldCell) => {
|
|
362
364
|
if (listening) {
|
|
363
365
|
ifNotUndefined(currentId, () => {
|
|
364
|
-
backwardIds
|
|
366
|
+
arrayPush(backwardIds, currentId);
|
|
365
367
|
trimBackwardsIds();
|
|
366
368
|
clearCheckpointIds(forwardIds);
|
|
367
369
|
currentId = void 0;
|
|
@@ -380,7 +382,7 @@ const createCheckpoints = getCreateFunction((store) => {
|
|
|
380
382
|
if (collIsEmpty(mapSet(row, cellId))) {
|
|
381
383
|
if (collIsEmpty(mapSet(table, rowId))) {
|
|
382
384
|
if (collIsEmpty(mapSet(delta, tableId))) {
|
|
383
|
-
currentId = backwardIds
|
|
385
|
+
currentId = arrayPop(backwardIds);
|
|
384
386
|
checkpointsChanged = 1;
|
|
385
387
|
}
|
|
386
388
|
}
|
|
@@ -404,13 +406,13 @@ const createCheckpoints = getCreateFunction((store) => {
|
|
|
404
406
|
if (!arrayIsEmpty(backwardIds)) {
|
|
405
407
|
forwardIds.unshift(addCheckpointImpl());
|
|
406
408
|
updateStore(0, currentId);
|
|
407
|
-
currentId = backwardIds
|
|
409
|
+
currentId = arrayPop(backwardIds);
|
|
408
410
|
checkpointsChanged = 1;
|
|
409
411
|
}
|
|
410
412
|
};
|
|
411
413
|
const goForwardImpl = () => {
|
|
412
414
|
if (!arrayIsEmpty(forwardIds)) {
|
|
413
|
-
backwardIds
|
|
415
|
+
arrayPush(backwardIds, currentId);
|
|
414
416
|
currentId = forwardIds.shift();
|
|
415
417
|
updateStore(1, currentId);
|
|
416
418
|
checkpointsChanged = 1;
|
|
@@ -1233,6 +1235,7 @@ const createStore = () => {
|
|
|
1233
1235
|
const changedRowIds = mapNew();
|
|
1234
1236
|
const changedCellIds = mapNew();
|
|
1235
1237
|
const changedCells = mapNew();
|
|
1238
|
+
const invalidCells = mapNew();
|
|
1236
1239
|
const schemaMap = mapNew();
|
|
1237
1240
|
const schemaDefaultRows = mapNew();
|
|
1238
1241
|
const tablesMap = mapNew();
|
|
@@ -1243,6 +1246,7 @@ const createStore = () => {
|
|
|
1243
1246
|
const rowListeners = mapNewPair();
|
|
1244
1247
|
const cellIdsListeners = mapNewPair();
|
|
1245
1248
|
const cellListeners = mapNewPair();
|
|
1249
|
+
const invalidCellListeners = mapNewPair();
|
|
1246
1250
|
const [addListener, callListeners, delListenerImpl, callListenerImpl] =
|
|
1247
1251
|
getListenerFunctions(() => store);
|
|
1248
1252
|
const validateSchema = (schema) =>
|
|
@@ -1266,13 +1270,13 @@ const createStore = () => {
|
|
|
1266
1270
|
const validateTables = (tables) => validate(tables, validateTable);
|
|
1267
1271
|
const validateTable = (table, tableId) =>
|
|
1268
1272
|
(!hasSchema || collHas(schemaMap, tableId)) &&
|
|
1269
|
-
validate(table, (row) => validateRow(tableId, row));
|
|
1270
|
-
const validateRow = (tableId, row, skipDefaults) =>
|
|
1273
|
+
validate(table, (row, rowId) => validateRow(tableId, rowId, row));
|
|
1274
|
+
const validateRow = (tableId, rowId, row, skipDefaults) =>
|
|
1271
1275
|
validate(
|
|
1272
1276
|
skipDefaults ? row : addDefaultsToRow(row, tableId),
|
|
1273
1277
|
(cell, cellId) =>
|
|
1274
1278
|
ifNotUndefined(
|
|
1275
|
-
getValidatedCell(tableId, cellId, cell),
|
|
1279
|
+
getValidatedCell(tableId, rowId, cellId, cell),
|
|
1276
1280
|
(validCell) => {
|
|
1277
1281
|
row[cellId] = validCell;
|
|
1278
1282
|
return true;
|
|
@@ -1280,15 +1284,17 @@ const createStore = () => {
|
|
|
1280
1284
|
() => false,
|
|
1281
1285
|
),
|
|
1282
1286
|
);
|
|
1283
|
-
const getValidatedCell = (tableId, cellId, cell) =>
|
|
1287
|
+
const getValidatedCell = (tableId, rowId, cellId, cell) =>
|
|
1284
1288
|
hasSchema
|
|
1285
1289
|
? ifNotUndefined(
|
|
1286
1290
|
mapGet(mapGet(schemaMap, tableId), cellId),
|
|
1287
1291
|
(cellSchema) =>
|
|
1288
|
-
getCellType(cell) != cellSchema[TYPE]
|
|
1292
|
+
getCellType(cell) != cellSchema[TYPE]
|
|
1293
|
+
? cellInvalid(tableId, rowId, cellId, cell, cellSchema[DEFAULT])
|
|
1294
|
+
: cell,
|
|
1289
1295
|
)
|
|
1290
1296
|
: isUndefined(getCellType(cell))
|
|
1291
|
-
?
|
|
1297
|
+
? cellInvalid(tableId, rowId, cellId, cell)
|
|
1292
1298
|
: cell;
|
|
1293
1299
|
const addDefaultsToRow = (row, tableId) => {
|
|
1294
1300
|
ifNotUndefined(mapGet(schemaDefaultRows, tableId), (defaultRow) =>
|
|
@@ -1424,6 +1430,17 @@ const createStore = () => {
|
|
|
1424
1430
|
cellId,
|
|
1425
1431
|
oldCell,
|
|
1426
1432
|
);
|
|
1433
|
+
const cellInvalid = (tableId, rowId, cellId, invalidCell, defaultedCell) => {
|
|
1434
|
+
arrayPush(
|
|
1435
|
+
mapEnsure(
|
|
1436
|
+
mapEnsure(mapEnsure(invalidCells, tableId, mapNew()), rowId, mapNew()),
|
|
1437
|
+
cellId,
|
|
1438
|
+
[],
|
|
1439
|
+
),
|
|
1440
|
+
invalidCell,
|
|
1441
|
+
);
|
|
1442
|
+
return defaultedCell;
|
|
1443
|
+
};
|
|
1427
1444
|
const getCellChange = (tableId, rowId, cellId) => {
|
|
1428
1445
|
const changedRow = mapGet(mapGet(changedCells, tableId), rowId);
|
|
1429
1446
|
const newCell = getCell(tableId, rowId, cellId);
|
|
@@ -1431,6 +1448,25 @@ const createStore = () => {
|
|
|
1431
1448
|
? [true, mapGet(changedRow, cellId), newCell]
|
|
1432
1449
|
: [false, newCell, newCell];
|
|
1433
1450
|
};
|
|
1451
|
+
const callInvalidCellListeners = (mutator) => {
|
|
1452
|
+
if (!collIsEmpty(invalidCellListeners[mutator])) {
|
|
1453
|
+
collForEach(
|
|
1454
|
+
mutator
|
|
1455
|
+
? mapClone(invalidCells, (table) => mapClone(table, mapClone))
|
|
1456
|
+
: invalidCells,
|
|
1457
|
+
(rows, tableId) =>
|
|
1458
|
+
collForEach(rows, (cells, rowId) =>
|
|
1459
|
+
collForEach(cells, (invalidCell, cellId) =>
|
|
1460
|
+
callListeners(
|
|
1461
|
+
invalidCellListeners[mutator],
|
|
1462
|
+
[tableId, rowId, cellId],
|
|
1463
|
+
invalidCell,
|
|
1464
|
+
),
|
|
1465
|
+
),
|
|
1466
|
+
),
|
|
1467
|
+
);
|
|
1468
|
+
}
|
|
1469
|
+
};
|
|
1434
1470
|
const callListenersForChanges = (mutator) => {
|
|
1435
1471
|
const emptyIdListeners =
|
|
1436
1472
|
collIsEmpty(cellIdsListeners[mutator]) &&
|
|
@@ -1524,46 +1560,50 @@ const createStore = () => {
|
|
|
1524
1560
|
const getJson = () => jsonString(tablesMap);
|
|
1525
1561
|
const getSchemaJson = () => jsonString(schemaMap);
|
|
1526
1562
|
const setTables = (tables) => {
|
|
1527
|
-
|
|
1528
|
-
transaction(() => setValidTables(tables))
|
|
1529
|
-
|
|
1563
|
+
validateTables(tables)
|
|
1564
|
+
? transaction(() => setValidTables(tables))
|
|
1565
|
+
: transaction();
|
|
1530
1566
|
return store;
|
|
1531
1567
|
};
|
|
1532
1568
|
const setTable = (tableId, table) => {
|
|
1533
|
-
|
|
1534
|
-
transaction(() => setValidTable(tableId, table))
|
|
1535
|
-
|
|
1569
|
+
validateTable(table, tableId)
|
|
1570
|
+
? transaction(() => setValidTable(tableId, table))
|
|
1571
|
+
: transaction();
|
|
1536
1572
|
return store;
|
|
1537
1573
|
};
|
|
1538
1574
|
const setRow = (tableId, rowId, row) => {
|
|
1539
|
-
|
|
1540
|
-
setValidRowTransaction(tableId, rowId, row)
|
|
1541
|
-
|
|
1575
|
+
validateRow(tableId, rowId, row)
|
|
1576
|
+
? setValidRowTransaction(tableId, rowId, row)
|
|
1577
|
+
: transaction();
|
|
1542
1578
|
return store;
|
|
1543
1579
|
};
|
|
1544
1580
|
const addRow = (tableId, row) => {
|
|
1545
1581
|
let rowId = void 0;
|
|
1546
|
-
|
|
1547
|
-
|
|
1548
|
-
|
|
1549
|
-
|
|
1582
|
+
validateRow(tableId, rowId, row)
|
|
1583
|
+
? setValidRowTransaction(
|
|
1584
|
+
tableId,
|
|
1585
|
+
(rowId = getNewRowId(mapGet(tablesMap, tableId))),
|
|
1586
|
+
row,
|
|
1587
|
+
)
|
|
1588
|
+
: transaction();
|
|
1550
1589
|
return rowId;
|
|
1551
1590
|
};
|
|
1552
1591
|
const setPartialRow = (tableId, rowId, partialRow) => {
|
|
1553
|
-
|
|
1554
|
-
transaction(() => {
|
|
1555
|
-
|
|
1556
|
-
|
|
1557
|
-
|
|
1558
|
-
|
|
1559
|
-
|
|
1560
|
-
|
|
1592
|
+
validateRow(tableId, rowId, partialRow, 1)
|
|
1593
|
+
? transaction(() => {
|
|
1594
|
+
const table = getOrCreateTable(tableId);
|
|
1595
|
+
objForEach(partialRow, (cell, cellId) =>
|
|
1596
|
+
setCellIntoDefaultRow(tableId, table, rowId, cellId, cell),
|
|
1597
|
+
);
|
|
1598
|
+
})
|
|
1599
|
+
: transaction();
|
|
1561
1600
|
return store;
|
|
1562
1601
|
};
|
|
1563
1602
|
const setCell = (tableId, rowId, cellId, cell) => {
|
|
1564
1603
|
ifNotUndefined(
|
|
1565
1604
|
getValidatedCell(
|
|
1566
1605
|
tableId,
|
|
1606
|
+
rowId,
|
|
1567
1607
|
cellId,
|
|
1568
1608
|
isFunction(cell) ? cell(getCell(tableId, rowId, cellId)) : cell,
|
|
1569
1609
|
),
|
|
@@ -1577,6 +1617,7 @@ const createStore = () => {
|
|
|
1577
1617
|
validCell,
|
|
1578
1618
|
),
|
|
1579
1619
|
),
|
|
1620
|
+
transaction,
|
|
1580
1621
|
);
|
|
1581
1622
|
return store;
|
|
1582
1623
|
};
|
|
@@ -1637,16 +1678,24 @@ const createStore = () => {
|
|
|
1637
1678
|
return;
|
|
1638
1679
|
}
|
|
1639
1680
|
transactions++;
|
|
1640
|
-
const result = actions();
|
|
1681
|
+
const result = actions?.();
|
|
1641
1682
|
transactions--;
|
|
1642
1683
|
if (transactions == 0) {
|
|
1643
1684
|
transactions = 1;
|
|
1685
|
+
callInvalidCellListeners(1);
|
|
1644
1686
|
callListenersForChanges(1);
|
|
1645
1687
|
transactions = -1;
|
|
1688
|
+
callInvalidCellListeners(0);
|
|
1646
1689
|
callListenersForChanges(0);
|
|
1647
1690
|
transactions = 0;
|
|
1648
1691
|
arrayForEach(
|
|
1649
|
-
[
|
|
1692
|
+
[
|
|
1693
|
+
changedCells,
|
|
1694
|
+
invalidCells,
|
|
1695
|
+
changedTableIds,
|
|
1696
|
+
changedRowIds,
|
|
1697
|
+
changedCellIds,
|
|
1698
|
+
],
|
|
1650
1699
|
collClear,
|
|
1651
1700
|
);
|
|
1652
1701
|
}
|
|
@@ -1686,6 +1735,12 @@ const createStore = () => {
|
|
|
1686
1735
|
rowId,
|
|
1687
1736
|
cellId,
|
|
1688
1737
|
]);
|
|
1738
|
+
const addInvalidCellListener = (tableId, rowId, cellId, listener, mutator) =>
|
|
1739
|
+
addListener(listener, invalidCellListeners[mutator ? 1 : 0], [
|
|
1740
|
+
tableId,
|
|
1741
|
+
rowId,
|
|
1742
|
+
cellId,
|
|
1743
|
+
]);
|
|
1689
1744
|
const callListener = (listenerId) => {
|
|
1690
1745
|
callListenerImpl(listenerId, [getTableIds, getRowIds, getCellIds], (ids) =>
|
|
1691
1746
|
isUndefined(ids[2]) ? [] : Array(2).fill(getCell(...ids)),
|
|
@@ -1743,6 +1798,7 @@ const createStore = () => {
|
|
|
1743
1798
|
addRowListener,
|
|
1744
1799
|
addCellIdsListener,
|
|
1745
1800
|
addCellListener,
|
|
1801
|
+
addInvalidCellListener,
|
|
1746
1802
|
callListener,
|
|
1747
1803
|
delListener,
|
|
1748
1804
|
getListenerStats,
|
package/lib/store.d.ts
CHANGED
|
@@ -332,6 +332,35 @@ export type CellListener = (
|
|
|
332
332
|
getCellChange: GetCellChange | undefined,
|
|
333
333
|
) => void;
|
|
334
334
|
|
|
335
|
+
/**
|
|
336
|
+
* The InvalidCellListener type describes a function that is used to listen to
|
|
337
|
+
* attempts to set invalid data to a Cell.
|
|
338
|
+
*
|
|
339
|
+
* A InvalidCellListener is provided when using the addInvalidCellListener
|
|
340
|
+
* method. See that method for specific examples.
|
|
341
|
+
*
|
|
342
|
+
* When called, a InvalidCellListener is given a reference to the Store, the Id
|
|
343
|
+
* of the Table, the Id of the Row, and the Id of Cell that were being attempted
|
|
344
|
+
* to be changed. It is also given the invalid value of the Cell, which could
|
|
345
|
+
* have been of absolutely any type. Since there could have been multiple failed
|
|
346
|
+
* attempts to set the Cell within a single transaction, this is an array
|
|
347
|
+
* containing each attempt, chronologically.
|
|
348
|
+
*
|
|
349
|
+
* @param store A reference to the Store that was being changed.
|
|
350
|
+
* @param tableId The Id of the Table that was being changed.
|
|
351
|
+
* @param rowId The Id of the Row that was being changed.
|
|
352
|
+
* @param cellId The Id of the Cell that was being changed.
|
|
353
|
+
* @param invalidCells An array of the values of the Cell that were invalid.
|
|
354
|
+
* @category Listener
|
|
355
|
+
*/
|
|
356
|
+
export type InvalidCellListener = (
|
|
357
|
+
store: Store,
|
|
358
|
+
tableId: Id,
|
|
359
|
+
rowId: Id,
|
|
360
|
+
cellId: Id,
|
|
361
|
+
invalidCells: any[],
|
|
362
|
+
) => void;
|
|
363
|
+
|
|
335
364
|
/**
|
|
336
365
|
* The GetCellChange type describes a function that returns information about
|
|
337
366
|
* any Cell's changes during a transaction.
|
|
@@ -545,6 +574,9 @@ export type StoreListenerStats = {
|
|
|
545
574
|
* unique Id. And the setPartialRow method lets you update multiple Cell values
|
|
546
575
|
* in a Row without affecting the others.
|
|
547
576
|
*
|
|
577
|
+
* You can listen to attempts to write invalid data to a Cell with the
|
|
578
|
+
* addInvalidCellListener method.
|
|
579
|
+
*
|
|
548
580
|
* The transaction method is used to wrap multiple changes to the Store so that
|
|
549
581
|
* the relevant listeners only fire once.
|
|
550
582
|
*
|
|
@@ -2371,6 +2403,133 @@ export interface Store {
|
|
|
2371
2403
|
mutator?: boolean,
|
|
2372
2404
|
): Id;
|
|
2373
2405
|
|
|
2406
|
+
/**
|
|
2407
|
+
* The addInvalidCellListener method registers a listener function with the
|
|
2408
|
+
* Store that will be called whenever invalid data was attempted to be written
|
|
2409
|
+
* to a Cell.
|
|
2410
|
+
*
|
|
2411
|
+
* You can either listen to a single Cell (by specifying the Table Id, Row Id,
|
|
2412
|
+
* and Cell Id as the method's first three parameters) or invalid attempts to
|
|
2413
|
+
* change any Cell (by providing `null` wildcards).
|
|
2414
|
+
*
|
|
2415
|
+
* All, some, or none of the `tableId`, `rowId`, and `cellId` parameters can
|
|
2416
|
+
* be wildcarded with `null`. You can listen to a specific Cell in a specific
|
|
2417
|
+
* Row in a specific Table, any Cell in any Row in any Table, for example - or
|
|
2418
|
+
* every other combination of wildcards.
|
|
2419
|
+
*
|
|
2420
|
+
* The provided listener is an InvalidCellListener function, and will be
|
|
2421
|
+
* called with a reference to the Store, the Id of the Table, the Id of the
|
|
2422
|
+
* Row, and the Id of Cell that were being attempted to be changed. It is also
|
|
2423
|
+
* given the invalid value of the Cell, which could have been of absolutely
|
|
2424
|
+
* any type. Since there could have been multiple failed attempts to set the
|
|
2425
|
+
* Cell within a single transaction, this is an array containing each attempt,
|
|
2426
|
+
* chronologically.
|
|
2427
|
+
*
|
|
2428
|
+
* Use the optional mutator parameter to indicate that there is code in the
|
|
2429
|
+
* listener that will mutate Store data. If set to `false` (or omitted), such
|
|
2430
|
+
* mutations will be silently ignored. All relevant mutator listeners (with
|
|
2431
|
+
* this flag set to `true`) are called _before_ any non-mutator listeners
|
|
2432
|
+
* (since the latter may become relevant due to changes made in the former).
|
|
2433
|
+
* The changes made by mutator listeners do not fire other mutating listeners,
|
|
2434
|
+
* though they will fire non-mutator listeners.
|
|
2435
|
+
*
|
|
2436
|
+
* @param tableId The Id of the Table to listen to, or `null` as a wildcard.
|
|
2437
|
+
* @param rowId The Id of the Row to listen to, or `null` as a wildcard.
|
|
2438
|
+
* @param cellId The Id of the Cell to listen to, or `null` as a wildcard.
|
|
2439
|
+
* @param listener The function that will be called whenever an attempt to
|
|
2440
|
+
* write invalid data to the matching Cell was made.
|
|
2441
|
+
* @param mutator An optional boolean that indicates that the listener mutates
|
|
2442
|
+
* Store data.
|
|
2443
|
+
* @returns A unique Id for the listener that can later be used to call it
|
|
2444
|
+
* explicitly, or to remove it.
|
|
2445
|
+
* @example
|
|
2446
|
+
* This example registers a listener that responds to any invalid changes to a
|
|
2447
|
+
* specific Cell.
|
|
2448
|
+
*
|
|
2449
|
+
* ```js
|
|
2450
|
+
* const store = createStore().setTables({
|
|
2451
|
+
* pets: {fido: {species: 'dog', color: 'brown'}},
|
|
2452
|
+
* });
|
|
2453
|
+
* const listenerId = store.addInvalidCellListener(
|
|
2454
|
+
* 'pets',
|
|
2455
|
+
* 'fido',
|
|
2456
|
+
* 'color',
|
|
2457
|
+
* (store, tableId, rowId, cellId, invalidCells) => {
|
|
2458
|
+
* console.log('Invalid color cell in fido row in pets table');
|
|
2459
|
+
* console.log(invalidCells);
|
|
2460
|
+
* },
|
|
2461
|
+
* );
|
|
2462
|
+
*
|
|
2463
|
+
* store.setCell('pets', 'fido', 'color', {r: '96', g: '4B', b: '00'});
|
|
2464
|
+
* // -> 'Invalid color cell in fido row in pets table'
|
|
2465
|
+
* // -> [{r: '96', g: '4B', b: '00'}]
|
|
2466
|
+
*
|
|
2467
|
+
* store.delListener(listenerId);
|
|
2468
|
+
* ```
|
|
2469
|
+
* @example
|
|
2470
|
+
* This example registers a listener that responds to any invalid changes to
|
|
2471
|
+
* any Cell.
|
|
2472
|
+
*
|
|
2473
|
+
* ```js
|
|
2474
|
+
* const store = createStore().setTables({
|
|
2475
|
+
* pets: {fido: {species: 'dog', color: 'brown'}},
|
|
2476
|
+
* });
|
|
2477
|
+
* const listenerId = store.addInvalidCellListener(
|
|
2478
|
+
* null,
|
|
2479
|
+
* null,
|
|
2480
|
+
* null,
|
|
2481
|
+
* (store, tableId, rowId, cellId) => {
|
|
2482
|
+
* console.log(
|
|
2483
|
+
* `Invalid ${cellId} cell in ${rowId} row in ${tableId} table`,
|
|
2484
|
+
* );
|
|
2485
|
+
* },
|
|
2486
|
+
* );
|
|
2487
|
+
*
|
|
2488
|
+
* store.setCell('pets', 'fido', 'color', {r: '96', g: '4B', b: '00'});
|
|
2489
|
+
* // -> 'Invalid color cell in fido row in pets table'
|
|
2490
|
+
* store.setTable('sales', {fido: {date: new Date()}});
|
|
2491
|
+
* // -> 'Invalid date cell in fido row in sales table'
|
|
2492
|
+
*
|
|
2493
|
+
* store.delListener(listenerId);
|
|
2494
|
+
* ```
|
|
2495
|
+
* @example
|
|
2496
|
+
* This example registers a listener that responds to any changes to a
|
|
2497
|
+
* specific Cell, and which also mutates the Store itself.
|
|
2498
|
+
*
|
|
2499
|
+
* ```js
|
|
2500
|
+
* const store = createStore().setTables({
|
|
2501
|
+
* pets: {fido: {species: 'dog', color: 'brown'}},
|
|
2502
|
+
* });
|
|
2503
|
+
* const listenerId = store.addInvalidCellListener(
|
|
2504
|
+
* 'pets',
|
|
2505
|
+
* 'fido',
|
|
2506
|
+
* 'color',
|
|
2507
|
+
* (store, tableId, rowId, cellId, invalidCells) =>
|
|
2508
|
+
* store.setCell(
|
|
2509
|
+
* 'meta',
|
|
2510
|
+
* 'invalid_updates',
|
|
2511
|
+
* `${tableId}_${rowId}_${cellId}`,
|
|
2512
|
+
* JSON.stringify(invalidCells[0]),
|
|
2513
|
+
* ),
|
|
2514
|
+
* true,
|
|
2515
|
+
* );
|
|
2516
|
+
*
|
|
2517
|
+
* store.setCell('pets', 'fido', 'color', {r: '96', g: '4B', b: '00'});
|
|
2518
|
+
* console.log(store.getRow('meta', 'invalid_updates'));
|
|
2519
|
+
* // -> {'pets_fido_color': '{"r":"96","g":"4B","b":"00"}'}
|
|
2520
|
+
*
|
|
2521
|
+
* store.delListener(listenerId);
|
|
2522
|
+
* ```
|
|
2523
|
+
* @category Listener
|
|
2524
|
+
*/
|
|
2525
|
+
addInvalidCellListener(
|
|
2526
|
+
tableId: IdOrNull,
|
|
2527
|
+
rowId: IdOrNull,
|
|
2528
|
+
cellId: IdOrNull,
|
|
2529
|
+
listener: InvalidCellListener,
|
|
2530
|
+
mutator?: boolean,
|
|
2531
|
+
): Id;
|
|
2532
|
+
|
|
2374
2533
|
/**
|
|
2375
2534
|
* The callListener method provides a way for you to manually provoke a
|
|
2376
2535
|
* listener to be called, even if the underlying data hasn't changed.
|
package/lib/store.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
const e=e=>typeof e,t=e(""),s=e(!0),n=e(0),r=e(e),l=(e,t)=>e.forEach(t),a=e=>e.length,o=e=>0==a(e),c=e=>e.slice(1),d=e=>JSON.stringify(e,((e,t)=>{return
|
|
1
|
+
const e=e=>typeof e,t=e(""),s=e(!0),n=e(0),r=e(e),l=(e,t)=>e.forEach(t),a=e=>e.length,o=e=>0==a(e),c=e=>e.slice(1),d=(e,t)=>e.push(t),i=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,b=e=>null==e,g=(e,t,s)=>b(e)?s?.():t(e),T=e=>e==t||e==s,w=(e,t)=>e?.has(t)??!1,p=e=>b(e)||0==(e=>e.size)(e),L=e=>e.clear(),R=(e,t)=>e?.forEach(t),C=(e,t)=>e?.delete(t),y=e=>new Map(e),I=(e=y)=>[e(),e()],S=e=>[...e?.keys()??[]],v=(e,t)=>e?.get(t),E=(e,t)=>R(e,((e,s)=>t(s,e))),J=(e,t,s)=>b(s)?(C(e,t),e):e?.set(t,s),m=(e,t,s,n)=>(w(e,t)||(n?.(s),e.set(t,s)),v(e,t)),z=(e,t)=>{const s={},n=t??(e=>e);return R(e,((e,t)=>s[t]=n(e))),s},O=(e,t)=>{const s=y(),n=t??(e=>e);return R(e,((e,t)=>s.set(t,n(e)))),s},k=Object,F=k.keys,M=k.isFrozen,N=k.freeze,j=(e,t)=>!b(((e,t)=>g(e,(e=>e[t])))(e,t)),x=(e,t)=>delete e[t],P=(e,t)=>l(k.entries(e),(([e,s])=>t(s,e))),q=e=>new Set(e),A=(e,t,s)=>a(s)<2?((e,t)=>e?.add(t))(o(s)?e:m(e,s[0],q()),t):A(m(e,s[0],y()),t,c(s)),B=e=>{const t=(s,n,...r)=>g(s,(s=>o(r)?e(s,n):l([r[0],null],(e=>t(v(s,e),n,...c(r))))));return t},D=(e,t,s,n=J)=>{const r=(a=S(e),o=e=>!j(t,e),a.filter(o));var a,o;return l(F(t),(n=>s(e,n,t[n]))),l(r,(t=>n(e,t))),e},G=t=>{const s=e(t);return T(s)||s==n&&f(t)?s:void 0},H=(e,t)=>!(b(e)||!(e=>h(e,k)&&e.constructor==k)(e)||M(e))&&(P(e,((s,n)=>{t(s,n)||x(e,n)})),!(e=>o(F(e)))(e)),K=(e,t,s)=>J(e,t,v(e,t)==-s?void 0:s),Q=()=>{let t,s=0,o=0;const c=y(),f=y(),h=y(),k=y(),F=y(),M=y(),Q=y(),U=y(),V=I(q),W=I(q),X=I(),Y=I(),Z=I(),$=I(),_=I(),ee=I(),[te,se,ne,re]=(e=>{let t,s=0;const n=[],r=y();return[(l,a,o=[])=>{t??=e();const c=n.pop()??""+s++;return J(r,c,[l,a,o]),A(a,c,o),c},(e,s=[],...n)=>B(R)(e,(e=>g(v(r,e),(([e])=>e(t,...s,...n)))),...s),e=>g(v(r,e),(([,t,s])=>(B(C)(t,e,...s),J(r,e),a(n)<1e3&&d(n,e),s)),(()=>[])),(e,s,n)=>g(v(r,e),(([e,,r])=>{const o=(...c)=>{const d=a(c);d==a(r)?e(t,...c,...n(c)):b(r[d])?l(s[d](...c),(e=>o(...c,e))):o(...c,r[d])};o()}))]})((()=>Pe)),le=(e,s)=>(!t||w(M,s))&&H(e,((e,t)=>ae(s,t,e))),ae=(e,t,s,n)=>H(n?s:ce(s,e),((n,r)=>g(oe(e,t,r,n),(e=>(s[r]=e,!0)),(()=>!1)))),oe=(e,s,n,r)=>t?g(v(v(M,e),n),(t=>G(r)!=t.type?ve(e,s,n,r,t.default):r)):b(G(r))?ve(e,s,n,r):r,ce=(e,t)=>(g(v(Q,t),(t=>P(t,((t,s)=>{j(e,s)||(e[s]=t)})))),e),de=e=>D(M,e,((e,t,s)=>{const n={};D(m(M,t,y()),s,((e,t,s)=>{J(e,t,s),g(s.default,(e=>n[t]=e))})),J(Q,t,n)}),((e,t)=>{J(M,t),J(Q,t)})),ie=e=>D(U,e,((e,t,s)=>ue(t,s)),((e,t)=>pe(t))),ue=(e,t)=>D(m(U,e,y(),(()=>Ce(e,1))),t,((t,s,n)=>fe(e,t,s,n)),((t,s)=>Le(e,t,s))),fe=(e,t,s,n,r)=>D(m(t,s,y(),(()=>ye(e,s,1))),n,((t,n,r)=>he(e,s,t,n,r)),((n,l)=>Re(e,t,s,n,l,r))),he=(e,t,s,n,r)=>{w(s,n)||Ie(e,t,n,1);const l=v(s,n);r!==l&&(Se(e,t,n,l),J(s,n,r))},be=(e,t,s)=>xe((()=>fe(e,we(e),t,s))),ge=(e,t,s,n,r)=>g(v(t,s),(t=>he(e,s,t,n,r)),(()=>fe(e,t,s,ce({[n]:r},e)))),Te=e=>{const t=""+s++;return w(e,t)?Te(e):t},we=e=>v(U,e)??ue(e,{}),pe=e=>ue(e,{}),Le=(e,t,s)=>fe(e,t,s,{},!0),Re=(e,t,s,n,r,l)=>{const a=v(Q,e)?.[r];if(!b(a)&&!l)return he(e,s,n,r,a);const o=t=>{Se(e,s,t,v(n,t)),Ie(e,s,t,-1),J(n,t)};b(a)?o(r):E(n,o),p(n)&&(ye(e,s,-1),p(J(t,s))&&(Ce(e,-1),J(U,e)))},Ce=(e,t)=>K(c,e,t),ye=(e,t,s)=>K(m(f,e,y()),t,s),Ie=(e,t,s,n)=>K(m(m(h,e,y()),t,y()),s,n),Se=(e,t,s,n)=>m(m(m(k,e,y()),t,y()),s,n),ve=(e,t,s,n,r)=>(d(m(m(m(F,e,y()),t,y()),s,[]),n),r),Ee=(e,t,s)=>{const n=v(v(k,e),t),r=Me(e,t,s);return w(n,s)?[!0,v(n,s),r]:[!1,r,r]},Je=e=>{p(ee[e])||R(e?O(F,(e=>O(e,O))):F,((t,s)=>R(t,((t,n)=>R(t,((t,r)=>se(ee[e],[s,n,r],t)))))))},me=e=>{const t=p($[e])&&p(Y[e])&&p(W[e]),s=p(_[e])&&p(Z[e])&&p(X[e])&&p(V[e]);if(t&&s)return;const n=e?[O(c),O(f,O),O(h,(e=>O(e,O))),O(k,(e=>O(e,O)))]:[c,f,h,k];if(t||(R(n[2],((t,s)=>R(t,((t,n)=>{p(t)||se($[e],[s,n])})))),R(n[1],((t,s)=>{p(t)||se(Y[e],[s])})),p(n[0])||se(W[e])),!s){let t;R(n[3],((s,n)=>{let r;R(s,((s,l)=>{let a;R(s,((s,o)=>{const c=Me(n,l,o);c!==s&&(se(_[e],[n,l,o],c,s,Ee),t=r=a=1)})),a&&se(Z[e],[n,l],Ee)})),r&&se(X[e],[n],Ee)})),t&&se(V[e],[],Ee)}},ze=()=>z(U,(e=>z(e,z))),Oe=()=>S(U),ke=e=>S(v(U,e)),Fe=(e,t)=>S(v(v(U,e),t)),Me=(e,t,s)=>v(v(v(U,e),t),s),Ne=e=>((e=>H(e,le))(e)?xe((()=>ie(e))):xe(),Pe),je=()=>(xe((()=>ie({}))),Pe),xe=e=>{if(-1==o)return;o++;const t=e?.();return o--,0==o&&(o=1,Je(1),me(1),o=-1,Je(0),me(0),o=0,l([k,F,c,f,h],L)),t},Pe={getTables:ze,getTableIds:Oe,getTable:e=>z(v(U,e),z),getRowIds:ke,getRow:(e,t)=>z(v(v(U,e),t)),getCellIds:Fe,getCell:Me,hasTables:()=>!p(U),hasTable:e=>w(U,e),hasRow:(e,t)=>w(v(U,e),t),hasCell:(e,t,s)=>w(v(v(U,e),t),s),getJson:()=>i(U),getSchemaJson:()=>i(M),setTables:Ne,setTable:(e,t)=>(le(t,e)?xe((()=>ue(e,t))):xe(),Pe),setRow:(e,t,s)=>(ae(e,t,s)?be(e,t,s):xe(),Pe),addRow:(e,t)=>{let s;return ae(e,s,t)?be(e,s=Te(v(U,e)),t):xe(),s},setPartialRow:(e,t,s)=>(ae(e,t,s,1)?xe((()=>{const n=we(e);P(s,((s,r)=>ge(e,n,t,r,s)))})):xe(),Pe),setCell:(t,s,n,l)=>(g(oe(t,s,n,e(l)==r?l(Me(t,s,n)):l),(e=>xe((()=>ge(t,we(t),s,n,e)))),xe),Pe),setJson:e=>{try{"{}"===e?je():Ne(u(e))}catch{}return Pe},setSchema:e=>{if((t=(e=>H(e,(e=>H(e,(e=>{if(!H(e,((e,t)=>["type","default"].includes(t))))return!1;const t=e.type;return!(!T(t)&&t!=n||(G(e.default)!=t&&x(e,"default"),0))})))))(e))&&(de(e),!p(U))){const e=ze();je(),Ne(e)}return Pe},delTables:je,delTable:e=>(w(U,e)&&xe((()=>pe(e))),Pe),delRow:(e,t)=>(g(v(U,e),(s=>{w(s,t)&&xe((()=>Le(e,s,t)))})),Pe),delCell:(e,t,s,n)=>(g(v(U,e),(r=>g(v(r,t),(l=>{w(l,s)&&xe((()=>Re(e,r,t,l,s,n)))})))),Pe),delSchema:()=>(de({}),t=!1,Pe),transaction:xe,forEachTable:e=>R(U,((t,s)=>e(s,(e=>R(t,((t,s)=>e(s,(e=>E(t,e))))))))),forEachRow:(e,t)=>R(v(U,e),((e,s)=>t(s,(t=>E(e,t))))),forEachCell:(e,t,s)=>E(v(v(U,e),t),s),addTablesListener:(e,t)=>te(e,V[t?1:0]),addTableIdsListener:(e,t)=>te(e,W[t?1:0]),addTableListener:(e,t,s)=>te(t,X[s?1:0],[e]),addRowIdsListener:(e,t,s)=>te(t,Y[s?1:0],[e]),addRowListener:(e,t,s,n)=>te(s,Z[n?1:0],[e,t]),addCellIdsListener:(e,t,s,n)=>te(s,$[n?1:0],[e,t]),addCellListener:(e,t,s,n,r)=>te(n,_[r?1:0],[e,t,s]),addInvalidCellListener:(e,t,s,n,r)=>te(n,ee[r?1:0],[e,t,s]),callListener:e=>(re(e,[Oe,ke,Fe],(e=>b(e[2])?[]:[,,].fill(Me(...e)))),Pe),delListener:e=>(ne(e),Pe),getListenerStats:()=>({})};return N(Pe)};export{Q as createStore};
|
package/lib/store.js.gz
CHANGED
|
Binary file
|
package/lib/tinybase.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
import{promises as e,watch as t}from"fs";const s=e=>typeof e,n=s(""),o=s(!0),r=s(0),a=s(s),i=(e,t)=>e.includes(t),d=(e,t)=>e.every(((s,n)=>0==n||t(e[n-1],s)<=0)),l=(e,t)=>e.sort(t),c=(e,t)=>e.forEach(t),u=e=>f(e,((e,t)=>e+t),0),h=e=>e.length,g=e=>0==h(e),f=(e,t,s)=>e.reduce(t,s),L=e=>e.slice(1),p=e=>JSON.stringify(e,((e,t)=>y(t,Map)?f([...t],((e,[t,s])=>(e[t]=s,e)),{}):t)),w=JSON.parse,v=Math.max,I=Math.min,S=isFinite,y=(e,t)=>e instanceof t,R=e=>null==e,T=(e,t,s)=>R(e)?s?.():t(e),b=e=>e==n||e==o,C=e=>s(e)==a,m=()=>{},E=e=>e.size,k=(e,t)=>e?.has(t)??!1,M=e=>R(e)||0==E(e),A=e=>[...e?.values()??[]],x=e=>e.clear(),D=(e,t)=>e?.forEach(t),J=(e,t)=>e?.delete(t),F=e=>new Map(e),z=(e=F)=>[e(),e()],N=e=>[...e?.keys()??[]],O=(e,t)=>e?.get(t),j=(e,t)=>D(e,((e,s)=>t(s,e))),P=(e,t,s)=>R(s)?(J(e,t),e):e?.set(t,s),B=(e,t,s,n)=>(k(e,t)||(n?.(s),e.set(t,s)),O(e,t)),H=(e,t)=>{const s={},n=t??(e=>e);return D(e,((e,t)=>s[t]=n(e))),s},W=(e,t)=>{const s=F(),n=t??(e=>e);return D(e,((e,t)=>s.set(t,n(e)))),s},q=e=>new Set(e),G=(e,t)=>e?.add(t),K=(e,t,s)=>{const n=e.hasRow,o=F(),r=F(),a=F(),i=F(),d=F(),l=t=>T(O(d,t),(s=>{D(s,e.delListener),P(d,t)})),u=e=>{P(o,e),P(r,e),P(a,e),P(i,e),l(e)};return[()=>e,()=>N(o),e=>j(r,e),e=>k(r,e),e=>O(o,e),e=>O(r,e),(e,t)=>P(r,e,t),(u,h,g,f,L)=>{const p=F(),w=F();P(o,u,h),k(r,u)||(P(r,u,t()),P(a,u,F()),P(i,u,F()));const v=O(a,u),I=O(i,u),S=t=>{const o=s=>e.getCell(h,t,s),r=O(v,t),a=n(h,t)?s(f(o,t)):void 0;if(r!=a&&P(p,t,[r,a]),!R(L)){const e=O(I,t),s=n(h,t)?L(o,t):void 0;e!=s&&P(w,t,s)}},y=e=>{g((()=>{D(p,(([,e],t)=>P(v,t,e))),D(w,((e,t)=>P(I,t,e)))}),p,w,v,I,e),x(p),x(w)};j(v,S),e.hasTable(h)&&c(e.getRowIds(h),(e=>{k(v,e)||S(e)})),y(!0),l(u),P(d,u,q([e.addRowListener(h,null,((e,t,s)=>S(s))),e.addTableListener(h,(()=>y()))]))},u,()=>j(d,u)]},Q=(e,t)=>s(e)==n?t=>t(e):e??(()=>t??""),U=e=>{const t=new WeakMap;return s=>(t.has(s)||t.set(s,e(s)),t.get(s))},V=(e,t,s)=>h(s)<2?G(g(s)?e:B(e,s[0],q()),t):V(B(e,s[0],F()),t,L(s)),X=e=>{const t=(s,n,...o)=>T(s,(s=>g(o)?e(s,n):c([o[0],null],(e=>t(O(s,e),n,...L(o))))));return t},Y=e=>{let t,s=0;const n=[],o=F();return[(r,a,i=[])=>{t??=e();const d=n.pop()??""+s++;return P(o,d,[r,a,i]),V(a,d,i),d},(e,s=[],...n)=>X(D)(e,(e=>T(O(o,e),(([e])=>e(t,...s,...n)))),...s),e=>T(O(o,e),(([,t,s])=>(X(J)(t,e,...s),P(o,e),h(n)<1e3&&n.push(e),s)),(()=>[])),(e,s,n)=>T(O(o,e),(([e,,o])=>{const r=(...a)=>{const i=h(a);i==h(o)?e(t,...a,...n(a)):R(o[i])?c(s[i](...a),(e=>r(...a,e))):r(...a,o[i])};r()}))]},Z=Object,$=Z.keys,_=Z.isFrozen,ee=Z.freeze,te=(e,t)=>!R(((e,t)=>T(e,(e=>e[t])))(e,t)),se=(e,t)=>delete e[t],ne=(e,t)=>c(Z.entries(e),(([e,s])=>t(s,e))),oe=U((e=>{let t,s,n,o=100,r=F(),a=1;const d=q(),l=F(),[u,f,L]=Y((()=>W)),p=F(),w=F(),v=[],I=[],S=(t,s)=>{a=0,e.transaction((()=>D(O(p,s),((s,n)=>D(s,((s,o)=>D(s,((s,r)=>R(s[t])?e.delCell(n,o,r,!0):e.setCell(n,o,r,s[t]))))))))),a=1},y=e=>{P(p,e),P(w,e),f(l,[e])},b=(e,t)=>c(((e,t)=>e.splice(0,t))(e,t??h(e)),y),C=()=>b(v,h(v)-o),m=e.addCellListener(null,null,null,((e,s,o,i,d,l)=>{if(a){T(t,(()=>{v.push(t),C(),b(I),t=void 0,n=1}));const e=B(r,s,F()),a=B(e,o,F()),c=B(a,i,[void 0,void 0],(e=>e[0]=l));c[1]=d,c[0]===c[1]&&M(P(a,i))&&M(P(e,o))&&M(P(r,s))&&(t=v.pop(),n=1),J()}})),E=(e="")=>(R(t)&&(t=""+s++,P(p,t,r),N(t,e),r=F(),n=1),t),A=()=>{g(v)||(I.unshift(E()),S(0,t),t=v.pop(),n=1)},x=()=>{g(I)||(v.push(t),t=I.shift(),S(1,t),n=1)},J=()=>{n&&(f(d),n=0)},z=e=>{const t=E(e);return J(),t},N=(e,t)=>(H(e)&&O(w,e)!==t&&(P(w,e,t),f(l,[e])),W),H=e=>k(p,e),W={setSize:e=>(o=e,C(),W),addCheckpoint:z,setCheckpoint:N,getStore:()=>e,getCheckpointIds:()=>[[...v],t,[...I]],forEachCheckpoint:e=>j(w,e),hasCheckpoint:H,getCheckpoint:e=>O(w,e),goBackward:()=>(A(),J(),W),goForward:()=>(x(),J(),W),goTo:e=>{const s=i(v,e)?A:i(I,e)?x:null;for(;!R(s)&&e!=t;)s();return J(),W},addCheckpointIdsListener:e=>u(e,d),addCheckpointListener:(e,t)=>u(t,l,[e]),delListener:e=>(L(e),W),clear:()=>(b(v),b(I),R(t)||y(t),t=void 0,s=0,z(),W),destroy:()=>{e.delListener(m)},getListenerStats:()=>({})};return ee(W.clear())})),re=(e,t)=>e<t?-1:1,ae=U((e=>{const t=F(),s=F(),[n,o,r,a,i,c,u,h,g,f]=K(e,F,(e=>R(e)?"":e+"")),[L,p,w]=Y((()=>I)),v=(t,s,n)=>{const o=i(t);D(n,((t,n)=>s(n,(s=>D(t,(t=>s(t,(s=>e.forEachCell(o,t,s)))))))))},I={setIndexDefinition:(e,n,o,r,a,i=re)=>{const g=R(a)?void 0:([e],[t])=>a(e,t);return h(e,n,((n,o,a,h,f,L)=>{let w=0;const v=q(),I=q(),S=c(e);if(D(o,(([e,t],s)=>{R(e)||(G(v,e),T(O(S,e),(t=>{J(t,s),M(t)&&(P(S,e),w=1)}))),R(t)||(G(v,t),k(S,t)||(P(S,t,q()),w=1),G(O(S,t),s),R(r)||G(I,t))})),n(),M(f)||(L?j(S,(e=>G(I,e))):j(a,(e=>T(O(h,e),(e=>G(I,e))))),D(I,(e=>{const t=(t,s)=>i(O(f,t),O(f,s),e),s=[...O(S,e)];d(s,t)||(P(S,e,q(l(s,t))),G(v,e))}))),(w||L)&&!R(g)){const t=[...S];d(t,g)||(u(e,F(l(t,g))),w=1)}w&&p(t,[e]),D(v,(t=>p(s,[e,t])))}),Q(o),T(r,Q)),I},delIndexDefinition:e=>(g(e),I),getStore:n,getIndexIds:o,forEachIndex:e=>r(((t,s)=>e(t,(e=>v(t,e,s))))),forEachSlice:(e,t)=>v(e,t,c(e)),hasIndex:a,hasSlice:(e,t)=>k(c(e),t),getTableId:i,getSliceIds:e=>N(c(e)),getSliceRowIds:(e,t)=>A(O(c(e),t)),addSliceIdsListener:(e,s)=>L(s,t,[e]),addSliceRowIdsListener:(e,t,n)=>L(n,s,[e,t]),delListener:e=>(w(e),I),destroy:f,getListenerStats:()=>({})};return ee(I)})),ie=F([["avg",[(e,t)=>u(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=>I(...e),(e,t)=>I(t,e),(e,t)=>t==e?void 0:e,(e,t,s)=>s==e?void 0:I(t,e)]],["sum",[e=>u(e),(e,t)=>e+t,(e,t)=>e-t,(e,t,s)=>e-s+t]]]),de=U((e=>{const t=F(),[s,n,o,r,a,i,d,l,c,u]=K(e,m,(e=>isNaN(e)||R(e)||!0===e||!1===e||""===e?void 0:1*e)),[h,g,f]=Y((()=>L)),L={setMetricDefinition:(e,s,n,o,r,a,c)=>{const u=C(n)?[n,r,a,c]:O(ie,n)??O(ie,"sum");return l(e,s,((s,n,o,r,a,l)=>{let c=i(e),h=E(r);const[f,L,p,w]=u;l=l||R(c),D(n,(([e,t])=>{l||(c=R(e)?L?.(c,t,h++):R(t)?p?.(c,e,h--):w?.(c,t,e,h)),l=l||R(c)})),s(),M(r)?c=void 0:l&&(c=f(A(r),E(r))),S(c)||(c=void 0);const v=i(e);c!=v&&(d(e,c),g(t,[e],c,v))}),Q(o,1)),L},delMetricDefinition:e=>(c(e),L),getStore:s,getMetricIds:n,forEachMetric:o,hasMetric:r,getTableId:a,getMetric:i,addMetricListener:(e,s)=>h(s,t,[e]),delListener:e=>(f(e),L),destroy:u,getListenerStats:()=>({})};return ee(L)})),le=(e,t,s,n,o)=>{let r,a=0;const i={load:async s=>{if(2!=a){a=1;const n=await t();R(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:()=>(T(r,e.delListener),i),getStore:()=>e,destroy:()=>i.stopAutoLoad().stopAutoSave(),getStats:()=>({})};return ee(i)},ce=globalThis.window,ue=(e,t,s)=>{let n;return le(e,(async()=>s.getItem(t)),(async e=>s.setItem(t,e)),(e=>{n=n=>{n.storageArea===s&&n.key===t&&e()},ce.addEventListener("storage",n)}),(()=>{ce.removeEventListener("storage",n),n=void 0}))},he=(e,t)=>ue(e,t,localStorage),ge=(e,t)=>ue(e,t,sessionStorage),fe=(s,n)=>{let o;return le(s,(async()=>{try{return await e.readFile(n,"utf8")}catch{}}),(async t=>{try{await e.writeFile(n,t,"utf8")}catch{}}),(e=>{o=t(n,e)}),(()=>{o?.close(),o=void 0}))},Le=e=>e.headers.get("ETag"),pe=(e,t,s,n)=>{let o,r;return le(e,(async()=>{const e=await fetch(t);return r=Le(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=Le(s);R(r)||R(n)||n==r||(r=n,e())}),1e3*n)}),(()=>{T(o,clearInterval),o=void 0}))},we=U((e=>{const t=F(),s=F(),n=F(),o=F(),[r,a,i,d,l,c,u,h,g,f]=K(e,(()=>[F(),F(),F(),F()]),(e=>R(e)?void 0:e+"")),[L,p,w]=Y((()=>y)),v=(e,t,s)=>T(c(e),(([n,,o])=>{if(!k(o,t)){const r=q();if(l(e)!=S(e))G(r,t);else{let e=t;for(;!R(e)&&!k(r,e);)G(r,e),e=O(n,e)}if(s)return r;P(o,t,r)}return O(o,t)})),I=(e,t)=>T(c(e),(([,,e])=>P(e,t))),S=e=>O(t,e),y={setRelationshipDefinition:(e,r,a,i)=>(P(t,e,a),h(e,r,((t,r)=>{const a=q(),i=q(),d=q(),[l,u]=c(e);D(r,(([t,s],n)=>{R(t)||(G(i,t),T(O(u,t),(e=>{J(e,n),M(e)&&P(u,t)}))),R(s)||(G(i,s),k(u,s)||P(u,s,q()),G(O(u,s),n)),G(a,n),P(l,n,s),j(O(o,e),(t=>{k(v(e,t),n)&&G(d,t)}))})),t(),D(a,(t=>p(s,[e,t]))),D(i,(t=>p(n,[e,t]))),D(d,(t=>{I(e,t),p(o,[e,t])}))}),Q(i)),y),delRelationshipDefinition:e=>(P(t,e),g(e),y),getStore:r,getRelationshipIds:a,forEachRelationship:t=>i((s=>t(s,(t=>e.forEachRow(l(s),t))))),hasRelationship:d,getLocalTableId:l,getRemoteTableId:S,getRemoteRowId:(e,t)=>O(c(e)?.[0],t),getLocalRowIds:(e,t)=>A(O(c(e)?.[1],t)),getLinkedRowIds:(e,t)=>R(c(e))?[t]:A(v(e,t,!0)),addRemoteRowIdListener:(e,t,n)=>L(n,s,[e,t]),addLocalRowIdsListener:(e,t,s)=>L(s,n,[e,t]),addLinkedRowIdsListener:(e,t,s)=>(v(e,t),L(s,o,[e,t])),delListener:e=>(I(...w(e)),y),destroy:f,getListenerStats:()=>({})};return ee(y)})),ve=(e,t,s,n=P)=>{const o=(r=N(e),a=e=>!te(t,e),r.filter(a));var r,a;return c($(t),(n=>s(e,n,t[n]))),c(o,(t=>n(e,t))),e},Ie=e=>{const t=s(e);return b(t)||t==r&&S(e)?t:void 0},Se=(e,t)=>!(R(e)||!(e=>y(e,Z)&&e.constructor==Z)(e)||_(e))&&(ne(e,((s,n)=>{t(s,n)||se(e,n)})),!(e=>g($(e)))(e)),ye=(e,t,s)=>P(e,t,O(e,t)==-s?void 0:s),Re=()=>{let e,t=0,s=0;const n=F(),o=F(),a=F(),d=F(),l=F(),u=F(),h=F(),g=z(q),f=z(q),L=z(),v=z(),I=z(),S=z(),y=z(),[m,E,A,J]=Y((()=>Me)),G=(t,s)=>(!e||k(l,s))&&Se(t,(e=>K(s,e))),K=(e,t,s)=>Se(s?t:U(t,e),((s,n)=>T(Q(e,n,s),(e=>(t[n]=e,!0)),(()=>!1)))),Q=(t,s,n)=>e?T(O(O(l,t),s),(e=>Ie(n)!=e.type?e.default:n)):R(Ie(n))?void 0:n,U=(e,t)=>(T(O(u,t),(t=>ne(t,((t,s)=>{te(e,s)||(e[s]=t)})))),e),V=e=>ve(l,e,((e,t,s)=>{const n={};ve(B(l,t,F()),s,((e,t,s)=>{P(e,t,s),T(s.default,(e=>n[t]=e))})),P(u,t,n)}),((e,t)=>{P(l,t),P(u,t)})),X=e=>ve(h,e,((e,t,s)=>Z(t,s)),((e,t)=>de(t))),Z=(e,t)=>ve(B(h,e,F(),(()=>ue(e,1))),t,((t,s,n)=>$(e,t,s,n)),((t,s)=>le(e,t,s))),$=(e,t,s,n,o)=>ve(B(t,s,F(),(()=>he(e,s,1))),n,((t,n,o)=>_(e,s,t,n,o)),((n,r)=>ce(e,t,s,n,r,o))),_=(e,t,s,n,o)=>{k(s,n)||ge(e,t,n,1);const r=O(s,n);o!==r&&(fe(e,t,n,r),P(s,n,o))},oe=(e,t,s)=>ke((()=>$(e,ie(e),t,s))),re=(e,t,s,n,o)=>T(O(t,s),(t=>_(e,s,t,n,o)),(()=>$(e,t,s,U({[n]:o},e)))),ae=e=>{const s=""+t++;return k(e,s)?ae(e):s},ie=e=>O(h,e)??Z(e,{}),de=e=>Z(e,{}),le=(e,t,s)=>$(e,t,s,{},!0),ce=(e,t,s,n,o,r)=>{const a=O(u,e)?.[o];if(!R(a)&&!r)return _(e,s,n,o,a);const i=t=>{fe(e,s,t,O(n,t)),ge(e,s,t,-1),P(n,t)};R(a)?i(o):j(n,i),M(n)&&(he(e,s,-1),M(P(t,s))&&(ue(e,-1),P(h,e)))},ue=(e,t)=>ye(n,e,t),he=(e,t,s)=>ye(B(o,e,F()),t,s),ge=(e,t,s,n)=>ye(B(B(a,e,F()),t,F()),s,n),fe=(e,t,s,n)=>B(B(B(d,e,F()),t,F()),s,n),Le=(e,t,s)=>{const n=O(O(d,e),t),o=Ce(e,t,s);return k(n,s)?[!0,O(n,s),o]:[!1,o,o]},pe=e=>{const t=M(S[e])&&M(v[e])&&M(f[e]),s=M(y[e])&&M(I[e])&&M(L[e])&&M(g[e]);if(t&&s)return;const r=e?[W(n),W(o,W),W(a,(e=>W(e,W))),W(d,(e=>W(e,W)))]:[n,o,a,d];if(t||(D(r[2],((t,s)=>D(t,((t,n)=>{M(t)||E(S[e],[s,n])})))),D(r[1],((t,s)=>{M(t)||E(v[e],[s])})),M(r[0])||E(f[e])),!s){let t;D(r[3],((s,n)=>{let o;D(s,((s,r)=>{let a;D(s,((s,i)=>{const d=Ce(n,r,i);d!==s&&(E(y[e],[n,r,i],d,s,Le),t=o=a=1)})),a&&E(I[e],[n,r],Le)})),o&&E(L[e],[n],Le)})),t&&E(g[e],[],Le)}},we=()=>H(h,(e=>H(e,H))),Re=()=>N(h),Te=e=>N(O(h,e)),be=(e,t)=>N(O(O(h,e),t)),Ce=(e,t,s)=>O(O(O(h,e),t),s),me=e=>((e=>Se(e,G))(e)&&ke((()=>X(e))),Me),Ee=()=>(ke((()=>X({}))),Me),ke=e=>{if(-1==s)return;s++;const t=e();return s--,0==s&&(s=1,pe(1),s=-1,pe(0),s=0,c([d,n,o,a],x)),t},Me={getTables:we,getTableIds:Re,getTable:e=>H(O(h,e),H),getRowIds:Te,getRow:(e,t)=>H(O(O(h,e),t)),getCellIds:be,getCell:Ce,hasTables:()=>!M(h),hasTable:e=>k(h,e),hasRow:(e,t)=>k(O(h,e),t),hasCell:(e,t,s)=>k(O(O(h,e),t),s),getJson:()=>p(h),getSchemaJson:()=>p(l),setTables:me,setTable:(e,t)=>(G(t,e)&&ke((()=>Z(e,t))),Me),setRow:(e,t,s)=>(K(e,s)&&oe(e,t,s),Me),addRow:(e,t)=>{let s;return K(e,t)&&(s=ae(O(h,e)),oe(e,s,t)),s},setPartialRow:(e,t,s)=>(K(e,s,1)&&ke((()=>{const n=ie(e);ne(s,((s,o)=>re(e,n,t,o,s)))})),Me),setCell:(e,t,s,n)=>(T(Q(e,s,C(n)?n(Ce(e,t,s)):n),(n=>ke((()=>re(e,ie(e),t,s,n))))),Me),setJson:e=>{try{"{}"===e?Ee():me(w(e))}catch{}return Me},setSchema:t=>{if((e=(e=>Se(e,(e=>Se(e,(e=>{if(!Se(e,((e,t)=>i(["type","default"],t))))return!1;const t=e.type;return!(!b(t)&&t!=r||(Ie(e.default)!=t&&se(e,"default"),0))})))))(t))&&(V(t),!M(h))){const e=we();Ee(),me(e)}return Me},delTables:Ee,delTable:e=>(k(h,e)&&ke((()=>de(e))),Me),delRow:(e,t)=>(T(O(h,e),(s=>{k(s,t)&&ke((()=>le(e,s,t)))})),Me),delCell:(e,t,s,n)=>(T(O(h,e),(o=>T(O(o,t),(r=>{k(r,s)&&ke((()=>ce(e,o,t,r,s,n)))})))),Me),delSchema:()=>(V({}),e=!1,Me),transaction:ke,forEachTable:e=>D(h,((t,s)=>e(s,(e=>D(t,((t,s)=>e(s,(e=>j(t,e))))))))),forEachRow:(e,t)=>D(O(h,e),((e,s)=>t(s,(t=>j(e,t))))),forEachCell:(e,t,s)=>j(O(O(h,e),t),s),addTablesListener:(e,t)=>m(e,g[t?1:0]),addTableIdsListener:(e,t)=>m(e,f[t?1:0]),addTableListener:(e,t,s)=>m(t,L[s?1:0],[e]),addRowIdsListener:(e,t,s)=>m(t,v[s?1:0],[e]),addRowListener:(e,t,s,n)=>m(s,I[n?1:0],[e,t]),addCellIdsListener:(e,t,s,n)=>m(s,S[n?1:0],[e,t]),addCellListener:(e,t,s,n,o)=>m(n,y[o?1:0],[e,t,s]),callListener:e=>(J(e,[Re,Te,be],(e=>R(e[2])?[]:[,,].fill(Ce(...e)))),Me),delListener:e=>(A(e),Me),getListenerStats:()=>({})};return ee(Me)};export{oe as createCheckpoints,le as createCustomPersister,fe as createFilePersister,ae as createIndexes,he as createLocalPersister,de as createMetrics,we as createRelationships,pe as createRemotePersister,ge as createSessionPersister,Re as createStore,re as defaultSorter};
|
|
1
|
+
import{promises as e,watch as t}from"fs";const s=e=>typeof e,n=s(""),o=s(!0),r=s(0),a=s(s),i=(e,t)=>e.includes(t),d=(e,t)=>e.every(((s,n)=>0==n||t(e[n-1],s)<=0)),l=(e,t)=>e.sort(t),c=(e,t)=>e.forEach(t),u=e=>f(e,((e,t)=>e+t),0),h=e=>e.length,g=e=>0==h(e),f=(e,t,s)=>e.reduce(t,s),L=e=>e.slice(1),w=(e,t)=>e.push(t),v=e=>e.pop(),p=e=>JSON.stringify(e,((e,t)=>T(t,Map)?f([...t],((e,[t,s])=>(e[t]=s,e)),{}):t)),I=JSON.parse,S=Math.max,y=Math.min,R=isFinite,T=(e,t)=>e instanceof t,b=e=>null==e,C=(e,t,s)=>b(e)?s?.():t(e),m=e=>e==n||e==o,E=e=>s(e)==a,k=()=>{},M=e=>e.size,A=(e,t)=>e?.has(t)??!1,x=e=>b(e)||0==M(e),D=e=>[...e?.values()??[]],J=e=>e.clear(),F=(e,t)=>e?.forEach(t),z=(e,t)=>e?.delete(t),N=e=>new Map(e),O=(e=N)=>[e(),e()],j=e=>[...e?.keys()??[]],P=(e,t)=>e?.get(t),B=(e,t)=>F(e,((e,s)=>t(s,e))),H=(e,t,s)=>b(s)?(z(e,t),e):e?.set(t,s),W=(e,t,s,n)=>(A(e,t)||(n?.(s),e.set(t,s)),P(e,t)),q=(e,t)=>{const s={},n=t??(e=>e);return F(e,((e,t)=>s[t]=n(e))),s},G=(e,t)=>{const s=N(),n=t??(e=>e);return F(e,((e,t)=>s.set(t,n(e)))),s},K=e=>new Set(e),Q=(e,t)=>e?.add(t),U=(e,t,s)=>{const n=e.hasRow,o=N(),r=N(),a=N(),i=N(),d=N(),l=t=>C(P(d,t),(s=>{F(s,e.delListener),H(d,t)})),u=e=>{H(o,e),H(r,e),H(a,e),H(i,e),l(e)};return[()=>e,()=>j(o),e=>B(r,e),e=>A(r,e),e=>P(o,e),e=>P(r,e),(e,t)=>H(r,e,t),(u,h,g,f,L)=>{const w=N(),v=N();H(o,u,h),A(r,u)||(H(r,u,t()),H(a,u,N()),H(i,u,N()));const p=P(a,u),I=P(i,u),S=t=>{const o=s=>e.getCell(h,t,s),r=P(p,t),a=n(h,t)?s(f(o,t)):void 0;if(r!=a&&H(w,t,[r,a]),!b(L)){const e=P(I,t),s=n(h,t)?L(o,t):void 0;e!=s&&H(v,t,s)}},y=e=>{g((()=>{F(w,(([,e],t)=>H(p,t,e))),F(v,((e,t)=>H(I,t,e)))}),w,v,p,I,e),J(w),J(v)};B(p,S),e.hasTable(h)&&c(e.getRowIds(h),(e=>{A(p,e)||S(e)})),y(!0),l(u),H(d,u,K([e.addRowListener(h,null,((e,t,s)=>S(s))),e.addTableListener(h,(()=>y()))]))},u,()=>B(d,u)]},V=(e,t)=>s(e)==n?t=>t(e):e??(()=>t??""),X=e=>{const t=new WeakMap;return s=>(t.has(s)||t.set(s,e(s)),t.get(s))},Y=(e,t,s)=>h(s)<2?Q(g(s)?e:W(e,s[0],K()),t):Y(W(e,s[0],N()),t,L(s)),Z=e=>{const t=(s,n,...o)=>C(s,(s=>g(o)?e(s,n):c([o[0],null],(e=>t(P(s,e),n,...L(o))))));return t},$=e=>{let t,s=0;const n=[],o=N();return[(r,a,i=[])=>{t??=e();const d=v(n)??""+s++;return H(o,d,[r,a,i]),Y(a,d,i),d},(e,s=[],...n)=>Z(F)(e,(e=>C(P(o,e),(([e])=>e(t,...s,...n)))),...s),e=>C(P(o,e),(([,t,s])=>(Z(z)(t,e,...s),H(o,e),h(n)<1e3&&w(n,e),s)),(()=>[])),(e,s,n)=>C(P(o,e),(([e,,o])=>{const r=(...a)=>{const i=h(a);i==h(o)?e(t,...a,...n(a)):b(o[i])?c(s[i](...a),(e=>r(...a,e))):r(...a,o[i])};r()}))]},_=Object,ee=_.keys,te=_.isFrozen,se=_.freeze,ne=(e,t)=>!b(((e,t)=>C(e,(e=>e[t])))(e,t)),oe=(e,t)=>delete e[t],re=(e,t)=>c(_.entries(e),(([e,s])=>t(s,e))),ae=X((e=>{let t,s,n,o=100,r=N(),a=1;const d=K(),l=N(),[u,f,L]=$((()=>G)),p=N(),I=N(),S=[],y=[],R=(t,s)=>{a=0,e.transaction((()=>F(P(p,s),((s,n)=>F(s,((s,o)=>F(s,((s,r)=>b(s[t])?e.delCell(n,o,r,!0):e.setCell(n,o,r,s[t]))))))))),a=1},T=e=>{H(p,e),H(I,e),f(l,[e])},m=(e,t)=>c(((e,t)=>e.splice(0,t))(e,t??h(e)),T),E=()=>m(S,h(S)-o),k=e.addCellListener(null,null,null,((e,s,o,i,d,l)=>{if(a){C(t,(()=>{w(S,t),E(),m(y),t=void 0,n=1}));const e=W(r,s,N()),a=W(e,o,N()),c=W(a,i,[void 0,void 0],(e=>e[0]=l));c[1]=d,c[0]===c[1]&&x(H(a,i))&&x(H(e,o))&&x(H(r,s))&&(t=v(S),n=1),z()}})),M=(e="")=>(b(t)&&(t=""+s++,H(p,t,r),j(t,e),r=N(),n=1),t),D=()=>{g(S)||(y.unshift(M()),R(0,t),t=v(S),n=1)},J=()=>{g(y)||(w(S,t),t=y.shift(),R(1,t),n=1)},z=()=>{n&&(f(d),n=0)},O=e=>{const t=M(e);return z(),t},j=(e,t)=>(q(e)&&P(I,e)!==t&&(H(I,e,t),f(l,[e])),G),q=e=>A(p,e),G={setSize:e=>(o=e,E(),G),addCheckpoint:O,setCheckpoint:j,getStore:()=>e,getCheckpointIds:()=>[[...S],t,[...y]],forEachCheckpoint:e=>B(I,e),hasCheckpoint:q,getCheckpoint:e=>P(I,e),goBackward:()=>(D(),z(),G),goForward:()=>(J(),z(),G),goTo:e=>{const s=i(S,e)?D:i(y,e)?J:null;for(;!b(s)&&e!=t;)s();return z(),G},addCheckpointIdsListener:e=>u(e,d),addCheckpointListener:(e,t)=>u(t,l,[e]),delListener:e=>(L(e),G),clear:()=>(m(S),m(y),b(t)||T(t),t=void 0,s=0,O(),G),destroy:()=>{e.delListener(k)},getListenerStats:()=>({})};return se(G.clear())})),ie=(e,t)=>e<t?-1:1,de=X((e=>{const t=N(),s=N(),[n,o,r,a,i,c,u,h,g,f]=U(e,N,(e=>b(e)?"":e+"")),[L,w,v]=$((()=>I)),p=(t,s,n)=>{const o=i(t);F(n,((t,n)=>s(n,(s=>F(t,(t=>s(t,(s=>e.forEachCell(o,t,s)))))))))},I={setIndexDefinition:(e,n,o,r,a,i=ie)=>{const g=b(a)?void 0:([e],[t])=>a(e,t);return h(e,n,((n,o,a,h,f,L)=>{let v=0;const p=K(),I=K(),S=c(e);if(F(o,(([e,t],s)=>{b(e)||(Q(p,e),C(P(S,e),(t=>{z(t,s),x(t)&&(H(S,e),v=1)}))),b(t)||(Q(p,t),A(S,t)||(H(S,t,K()),v=1),Q(P(S,t),s),b(r)||Q(I,t))})),n(),x(f)||(L?B(S,(e=>Q(I,e))):B(a,(e=>C(P(h,e),(e=>Q(I,e))))),F(I,(e=>{const t=(t,s)=>i(P(f,t),P(f,s),e),s=[...P(S,e)];d(s,t)||(H(S,e,K(l(s,t))),Q(p,e))}))),(v||L)&&!b(g)){const t=[...S];d(t,g)||(u(e,N(l(t,g))),v=1)}v&&w(t,[e]),F(p,(t=>w(s,[e,t])))}),V(o),C(r,V)),I},delIndexDefinition:e=>(g(e),I),getStore:n,getIndexIds:o,forEachIndex:e=>r(((t,s)=>e(t,(e=>p(t,e,s))))),forEachSlice:(e,t)=>p(e,t,c(e)),hasIndex:a,hasSlice:(e,t)=>A(c(e),t),getTableId:i,getSliceIds:e=>j(c(e)),getSliceRowIds:(e,t)=>D(P(c(e),t)),addSliceIdsListener:(e,s)=>L(s,t,[e]),addSliceRowIdsListener:(e,t,n)=>L(n,s,[e,t]),delListener:e=>(v(e),I),destroy:f,getListenerStats:()=>({})};return se(I)})),le=N([["avg",[(e,t)=>u(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=>S(...e),(e,t)=>S(t,e),(e,t)=>t==e?void 0:e,(e,t,s)=>s==e?void 0:S(t,e)]],["min",[e=>y(...e),(e,t)=>y(t,e),(e,t)=>t==e?void 0:e,(e,t,s)=>s==e?void 0:y(t,e)]],["sum",[e=>u(e),(e,t)=>e+t,(e,t)=>e-t,(e,t,s)=>e-s+t]]]),ce=X((e=>{const t=N(),[s,n,o,r,a,i,d,l,c,u]=U(e,k,(e=>isNaN(e)||b(e)||!0===e||!1===e||""===e?void 0:1*e)),[h,g,f]=$((()=>L)),L={setMetricDefinition:(e,s,n,o,r,a,c)=>{const u=E(n)?[n,r,a,c]:P(le,n)??P(le,"sum");return l(e,s,((s,n,o,r,a,l)=>{let c=i(e),h=M(r);const[f,L,w,v]=u;l=l||b(c),F(n,(([e,t])=>{l||(c=b(e)?L?.(c,t,h++):b(t)?w?.(c,e,h--):v?.(c,t,e,h)),l=l||b(c)})),s(),x(r)?c=void 0:l&&(c=f(D(r),M(r))),R(c)||(c=void 0);const p=i(e);c!=p&&(d(e,c),g(t,[e],c,p))}),V(o,1)),L},delMetricDefinition:e=>(c(e),L),getStore:s,getMetricIds:n,forEachMetric:o,hasMetric:r,getTableId:a,getMetric:i,addMetricListener:(e,s)=>h(s,t,[e]),delListener:e=>(f(e),L),destroy:u,getListenerStats:()=>({})};return se(L)})),ue=(e,t,s,n,o)=>{let r,a=0;const i={load:async s=>{if(2!=a){a=1;const n=await t();b(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:()=>(C(r,e.delListener),i),getStore:()=>e,destroy:()=>i.stopAutoLoad().stopAutoSave(),getStats:()=>({})};return se(i)},he=globalThis.window,ge=(e,t,s)=>{let n;return ue(e,(async()=>s.getItem(t)),(async e=>s.setItem(t,e)),(e=>{n=n=>{n.storageArea===s&&n.key===t&&e()},he.addEventListener("storage",n)}),(()=>{he.removeEventListener("storage",n),n=void 0}))},fe=(e,t)=>ge(e,t,localStorage),Le=(e,t)=>ge(e,t,sessionStorage),we=(s,n)=>{let o;return ue(s,(async()=>{try{return await e.readFile(n,"utf8")}catch{}}),(async t=>{try{await e.writeFile(n,t,"utf8")}catch{}}),(e=>{o=t(n,e)}),(()=>{o?.close(),o=void 0}))},ve=e=>e.headers.get("ETag"),pe=(e,t,s,n)=>{let o,r;return ue(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);b(r)||b(n)||n==r||(r=n,e())}),1e3*n)}),(()=>{C(o,clearInterval),o=void 0}))},Ie=X((e=>{const t=N(),s=N(),n=N(),o=N(),[r,a,i,d,l,c,u,h,g,f]=U(e,(()=>[N(),N(),N(),N()]),(e=>b(e)?void 0:e+"")),[L,w,v]=$((()=>y)),p=(e,t,s)=>C(c(e),(([n,,o])=>{if(!A(o,t)){const r=K();if(l(e)!=S(e))Q(r,t);else{let e=t;for(;!b(e)&&!A(r,e);)Q(r,e),e=P(n,e)}if(s)return r;H(o,t,r)}return P(o,t)})),I=(e,t)=>C(c(e),(([,,e])=>H(e,t))),S=e=>P(t,e),y={setRelationshipDefinition:(e,r,a,i)=>(H(t,e,a),h(e,r,((t,r)=>{const a=K(),i=K(),d=K(),[l,u]=c(e);F(r,(([t,s],n)=>{b(t)||(Q(i,t),C(P(u,t),(e=>{z(e,n),x(e)&&H(u,t)}))),b(s)||(Q(i,s),A(u,s)||H(u,s,K()),Q(P(u,s),n)),Q(a,n),H(l,n,s),B(P(o,e),(t=>{A(p(e,t),n)&&Q(d,t)}))})),t(),F(a,(t=>w(s,[e,t]))),F(i,(t=>w(n,[e,t]))),F(d,(t=>{I(e,t),w(o,[e,t])}))}),V(i)),y),delRelationshipDefinition:e=>(H(t,e),g(e),y),getStore:r,getRelationshipIds:a,forEachRelationship:t=>i((s=>t(s,(t=>e.forEachRow(l(s),t))))),hasRelationship:d,getLocalTableId:l,getRemoteTableId:S,getRemoteRowId:(e,t)=>P(c(e)?.[0],t),getLocalRowIds:(e,t)=>D(P(c(e)?.[1],t)),getLinkedRowIds:(e,t)=>b(c(e))?[t]:D(p(e,t,!0)),addRemoteRowIdListener:(e,t,n)=>L(n,s,[e,t]),addLocalRowIdsListener:(e,t,s)=>L(s,n,[e,t]),addLinkedRowIdsListener:(e,t,s)=>(p(e,t),L(s,o,[e,t])),delListener:e=>(I(...v(e)),y),destroy:f,getListenerStats:()=>({})};return se(y)})),Se=(e,t,s,n=H)=>{const o=(r=j(e),a=e=>!ne(t,e),r.filter(a));var r,a;return c(ee(t),(n=>s(e,n,t[n]))),c(o,(t=>n(e,t))),e},ye=e=>{const t=s(e);return m(t)||t==r&&R(e)?t:void 0},Re=(e,t)=>!(b(e)||!(e=>T(e,_)&&e.constructor==_)(e)||te(e))&&(re(e,((s,n)=>{t(s,n)||oe(e,n)})),!(e=>g(ee(e)))(e)),Te=(e,t,s)=>H(e,t,P(e,t)==-s?void 0:s),be=()=>{let e,t=0,s=0;const n=N(),o=N(),a=N(),d=N(),l=N(),u=N(),h=N(),g=N(),f=O(K),L=O(K),v=O(),S=O(),y=O(),R=O(),T=O(),k=O(),[M,D,z,Q]=$((()=>Fe)),U=(t,s)=>(!e||A(u,s))&&Re(t,((e,t)=>V(s,t,e))),V=(e,t,s,n)=>Re(n?s:Y(s,e),((n,o)=>C(X(e,t,o,n),(e=>(s[o]=e,!0)),(()=>!1)))),X=(t,s,n,o)=>e?C(P(P(u,t),n),(e=>ye(o)!=e.type?pe(t,s,n,o,e.default):o)):b(ye(o))?pe(t,s,n,o):o,Y=(e,t)=>(C(P(h,t),(t=>re(t,((t,s)=>{ne(e,s)||(e[s]=t)})))),e),Z=e=>Se(u,e,((e,t,s)=>{const n={};Se(W(u,t,N()),s,((e,t,s)=>{H(e,t,s),C(s.default,(e=>n[t]=e))})),H(h,t,n)}),((e,t)=>{H(u,t),H(h,t)})),_=e=>Se(g,e,((e,t,s)=>ee(t,s)),((e,t)=>ue(t))),ee=(e,t)=>Se(W(g,e,N(),(()=>fe(e,1))),t,((t,s,n)=>te(e,t,s,n)),((t,s)=>he(e,t,s))),te=(e,t,s,n,o)=>Se(W(t,s,N(),(()=>Le(e,s,1))),n,((t,n,o)=>ae(e,s,t,n,o)),((n,r)=>ge(e,t,s,n,r,o))),ae=(e,t,s,n,o)=>{A(s,n)||we(e,t,n,1);const r=P(s,n);o!==r&&(ve(e,t,n,r),H(s,n,o))},ie=(e,t,s)=>Je((()=>te(e,ce(e),t,s))),de=(e,t,s,n,o)=>C(P(t,s),(t=>ae(e,s,t,n,o)),(()=>te(e,t,s,Y({[n]:o},e)))),le=e=>{const s=""+t++;return A(e,s)?le(e):s},ce=e=>P(g,e)??ee(e,{}),ue=e=>ee(e,{}),he=(e,t,s)=>te(e,t,s,{},!0),ge=(e,t,s,n,o,r)=>{const a=P(h,e)?.[o];if(!b(a)&&!r)return ae(e,s,n,o,a);const i=t=>{ve(e,s,t,P(n,t)),we(e,s,t,-1),H(n,t)};b(a)?i(o):B(n,i),x(n)&&(Le(e,s,-1),x(H(t,s))&&(fe(e,-1),H(g,e)))},fe=(e,t)=>Te(n,e,t),Le=(e,t,s)=>Te(W(o,e,N()),t,s),we=(e,t,s,n)=>Te(W(W(a,e,N()),t,N()),s,n),ve=(e,t,s,n)=>W(W(W(d,e,N()),t,N()),s,n),pe=(e,t,s,n,o)=>(w(W(W(W(l,e,N()),t,N()),s,[]),n),o),Ie=(e,t,s)=>{const n=P(P(d,e),t),o=Ae(e,t,s);return A(n,s)?[!0,P(n,s),o]:[!1,o,o]},be=e=>{x(k[e])||F(e?G(l,(e=>G(e,G))):l,((t,s)=>F(t,((t,n)=>F(t,((t,o)=>D(k[e],[s,n,o],t)))))))},Ce=e=>{const t=x(R[e])&&x(S[e])&&x(L[e]),s=x(T[e])&&x(y[e])&&x(v[e])&&x(f[e]);if(t&&s)return;const r=e?[G(n),G(o,G),G(a,(e=>G(e,G))),G(d,(e=>G(e,G)))]:[n,o,a,d];if(t||(F(r[2],((t,s)=>F(t,((t,n)=>{x(t)||D(R[e],[s,n])})))),F(r[1],((t,s)=>{x(t)||D(S[e],[s])})),x(r[0])||D(L[e])),!s){let t;F(r[3],((s,n)=>{let o;F(s,((s,r)=>{let a;F(s,((s,i)=>{const d=Ae(n,r,i);d!==s&&(D(T[e],[n,r,i],d,s,Ie),t=o=a=1)})),a&&D(y[e],[n,r],Ie)})),o&&D(v[e],[n],Ie)})),t&&D(f[e],[],Ie)}},me=()=>q(g,(e=>q(e,q))),Ee=()=>j(g),ke=e=>j(P(g,e)),Me=(e,t)=>j(P(P(g,e),t)),Ae=(e,t,s)=>P(P(P(g,e),t),s),xe=e=>((e=>Re(e,U))(e)?Je((()=>_(e))):Je(),Fe),De=()=>(Je((()=>_({}))),Fe),Je=e=>{if(-1==s)return;s++;const t=e?.();return s--,0==s&&(s=1,be(1),Ce(1),s=-1,be(0),Ce(0),s=0,c([d,l,n,o,a],J)),t},Fe={getTables:me,getTableIds:Ee,getTable:e=>q(P(g,e),q),getRowIds:ke,getRow:(e,t)=>q(P(P(g,e),t)),getCellIds:Me,getCell:Ae,hasTables:()=>!x(g),hasTable:e=>A(g,e),hasRow:(e,t)=>A(P(g,e),t),hasCell:(e,t,s)=>A(P(P(g,e),t),s),getJson:()=>p(g),getSchemaJson:()=>p(u),setTables:xe,setTable:(e,t)=>(U(t,e)?Je((()=>ee(e,t))):Je(),Fe),setRow:(e,t,s)=>(V(e,t,s)?ie(e,t,s):Je(),Fe),addRow:(e,t)=>{let s;return V(e,s,t)?ie(e,s=le(P(g,e)),t):Je(),s},setPartialRow:(e,t,s)=>(V(e,t,s,1)?Je((()=>{const n=ce(e);re(s,((s,o)=>de(e,n,t,o,s)))})):Je(),Fe),setCell:(e,t,s,n)=>(C(X(e,t,s,E(n)?n(Ae(e,t,s)):n),(n=>Je((()=>de(e,ce(e),t,s,n)))),Je),Fe),setJson:e=>{try{"{}"===e?De():xe(I(e))}catch{}return Fe},setSchema:t=>{if((e=(e=>Re(e,(e=>Re(e,(e=>{if(!Re(e,((e,t)=>i(["type","default"],t))))return!1;const t=e.type;return!(!m(t)&&t!=r||(ye(e.default)!=t&&oe(e,"default"),0))})))))(t))&&(Z(t),!x(g))){const e=me();De(),xe(e)}return Fe},delTables:De,delTable:e=>(A(g,e)&&Je((()=>ue(e))),Fe),delRow:(e,t)=>(C(P(g,e),(s=>{A(s,t)&&Je((()=>he(e,s,t)))})),Fe),delCell:(e,t,s,n)=>(C(P(g,e),(o=>C(P(o,t),(r=>{A(r,s)&&Je((()=>ge(e,o,t,r,s,n)))})))),Fe),delSchema:()=>(Z({}),e=!1,Fe),transaction:Je,forEachTable:e=>F(g,((t,s)=>e(s,(e=>F(t,((t,s)=>e(s,(e=>B(t,e))))))))),forEachRow:(e,t)=>F(P(g,e),((e,s)=>t(s,(t=>B(e,t))))),forEachCell:(e,t,s)=>B(P(P(g,e),t),s),addTablesListener:(e,t)=>M(e,f[t?1:0]),addTableIdsListener:(e,t)=>M(e,L[t?1:0]),addTableListener:(e,t,s)=>M(t,v[s?1:0],[e]),addRowIdsListener:(e,t,s)=>M(t,S[s?1:0],[e]),addRowListener:(e,t,s,n)=>M(s,y[n?1:0],[e,t]),addCellIdsListener:(e,t,s,n)=>M(s,R[n?1:0],[e,t]),addCellListener:(e,t,s,n,o)=>M(n,T[o?1:0],[e,t,s]),addInvalidCellListener:(e,t,s,n,o)=>M(n,k[o?1:0],[e,t,s]),callListener:e=>(Q(e,[Ee,ke,Me],(e=>b(e[2])?[]:[,,].fill(Ae(...e)))),Fe),delListener:e=>(z(e),Fe),getListenerStats:()=>({})};return se(Fe)};export{ae as createCheckpoints,ue as createCustomPersister,we as createFilePersister,de as createIndexes,fe as createLocalPersister,ce as createMetrics,Ie as createRelationships,pe as createRemotePersister,Le as createSessionPersister,be as createStore,ie as defaultSorter};
|
package/lib/tinybase.js.gz
CHANGED
|
Binary file
|
package/lib/umd/checkpoints.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var e,t;e=this,t=function(e){"use strict";const t=(e,t)=>e.includes(t),n=(e,t)=>e.forEach(t),o=e=>e.length,s=e=>0==o(e),r=e=>e.slice(1),i=e=>null==e,
|
|
1
|
+
var e,t;e=this,t=function(e){"use strict";const t=(e,t)=>e.includes(t),n=(e,t)=>e.forEach(t),o=e=>e.length,s=e=>0==o(e),r=e=>e.slice(1),i=(e,t)=>e.push(t),c=e=>e.pop(),l=e=>null==e,d=(e,t,n)=>l(e)?n?.():t(e),a=(e,t)=>e?.has(t)??!1,u=e=>l(e)||0==(e=>e.size)(e),p=(e,t)=>e?.forEach(t),h=(e,t)=>e?.delete(t),f=e=>new Map(e),C=(e,t)=>e?.get(t),g=(e,t,n)=>l(n)?(h(e,t),e):e?.set(t,n),k=(e,t,n,o)=>(a(e,t)||(o?.(n),e.set(t,n)),C(e,t)),v=e=>new Set(e),y=(e,t,n)=>o(n)<2?((e,t)=>e?.add(t))(s(n)?e:k(e,n[0],v()),t):y(k(e,n[0],f()),t,r(n)),L=e=>{const t=(o,i,...c)=>d(o,(o=>s(c)?e(o,i):n([c[0],null],(e=>t(C(o,e),i,...r(c))))));return t},b=Object.freeze,w=(e=>{const t=new WeakMap;return n=>(t.has(n)||t.set(n,e(n)),t.get(n))})((e=>{let r,w,S,T=100,j=f(),x=1;const z=v(),E=f(),[M,m,B]=(e=>{let t,s=0;const r=[],a=f();return[(n,o,i=[])=>{t??=e();const l=c(r)??""+s++;return g(a,l,[n,o,i]),y(o,l,i),l},(e,n=[],...o)=>L(p)(e,(e=>d(C(a,e),(([e])=>e(t,...n,...o)))),...n),e=>d(C(a,e),(([,t,n])=>(L(h)(t,e,...n),g(a,e),o(r)<1e3&&i(r,e),n)),(()=>[])),(e,s,r)=>d(C(a,e),(([e,,i])=>{const c=(...d)=>{const a=o(d);a==o(i)?e(t,...d,...r(d)):l(i[a])?n(s[a](...d),(e=>c(...d,e))):c(...d,i[a])};c()}))]})((()=>U)),I=f(),O=f(),_=[],F=[],P=(t,n)=>{x=0,e.transaction((()=>p(C(I,n),((n,o)=>p(n,((n,s)=>p(n,((n,r)=>l(n[t])?e.delCell(o,s,r,!0):e.setCell(o,s,r,n[t]))))))))),x=1},W=e=>{g(I,e),g(O,e),m(E,[e])},q=(e,t)=>n(((e,t)=>e.splice(0,t))(e,t??o(e)),W),A=()=>q(_,o(_)-T),D=e.addCellListener(null,null,null,((e,t,n,o,s,l)=>{if(x){d(r,(()=>{i(_,r),A(),q(F),r=void 0,S=1}));const e=k(j,t,f()),a=k(e,n,f()),p=k(a,o,[void 0,void 0],(e=>e[0]=l));p[1]=s,p[0]===p[1]&&u(g(a,o))&&u(g(e,n))&&u(g(j,t))&&(r=c(_),S=1),K()}})),G=(e="")=>(l(r)&&(r=""+w++,g(I,r,j),Q(r,e),j=f(),S=1),r),H=()=>{s(_)||(F.unshift(G()),P(0,r),r=c(_),S=1)},J=()=>{s(F)||(i(_,r),r=F.shift(),P(1,r),S=1)},K=()=>{S&&(m(z),S=0)},N=e=>{const t=G(e);return K(),t},Q=(e,t)=>(R(e)&&C(O,e)!==t&&(g(O,e,t),m(E,[e])),U),R=e=>a(I,e),U={setSize:e=>(T=e,A(),U),addCheckpoint:N,setCheckpoint:Q,getStore:()=>e,getCheckpointIds:()=>[[..._],r,[...F]],forEachCheckpoint:e=>{return t=e,p(O,((e,n)=>t(n,e)));var t},hasCheckpoint:R,getCheckpoint:e=>C(O,e),goBackward:()=>(H(),K(),U),goForward:()=>(J(),K(),U),goTo:e=>{const n=t(_,e)?H:t(F,e)?J:null;for(;!l(n)&&e!=r;)n();return K(),U},addCheckpointIdsListener:e=>M(e,z),addCheckpointListener:(e,t)=>M(t,E,[e]),delListener:e=>(B(e),U),clear:()=>(q(_),q(F),l(r)||W(r),r=void 0,w=0,N(),U),destroy:()=>{e.delListener(D)},getListenerStats:()=>({})};return b(U.clear())}));e.createCheckpoints=w,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).TinyBaseCheckpoints={});
|
|
Binary file
|