tinybase 1.1.0-beta.1 → 1.1.0-beta.2
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/debug/store.d.ts +103 -1
- package/lib/debug/store.js +83 -76
- package/lib/debug/tinybase.js +83 -76
- package/lib/store.d.ts +103 -1
- 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/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 -11
- package/readme.md +2 -2
package/lib/debug/store.d.ts
CHANGED
|
@@ -2433,6 +2433,21 @@ export interface Store {
|
|
|
2433
2433
|
* The changes made by mutator listeners do not fire other mutating listeners,
|
|
2434
2434
|
* though they will fire non-mutator listeners.
|
|
2435
2435
|
*
|
|
2436
|
+
* Special note should be made for how the listener will be called when a
|
|
2437
|
+
* Schema is present. The listener will be called:
|
|
2438
|
+
*
|
|
2439
|
+
* - if a Table is being updated that is not specified in the Schema
|
|
2440
|
+
* - if a Cell is of the wrong type specified in the Schema
|
|
2441
|
+
* - if a Cell is omitted and is not defaulted in the Schema
|
|
2442
|
+
* - if an empty Row is provided and there are no Cell defaults in the Schema
|
|
2443
|
+
*
|
|
2444
|
+
* The listener will not be called if Cell that is defaulted in the Schema is
|
|
2445
|
+
* not provided, as long as all of the Cells that are _not_ defaulted _are_
|
|
2446
|
+
* provided.
|
|
2447
|
+
*
|
|
2448
|
+
* To help understand all of these schema-based conditions, please see the
|
|
2449
|
+
* Schema example below.
|
|
2450
|
+
*
|
|
2436
2451
|
* @param tableId The Id of the Table to listen to, or `null` as a wildcard.
|
|
2437
2452
|
* @param rowId The Id of the Row to listen to, or `null` as a wildcard.
|
|
2438
2453
|
* @param cellId The Id of the Cell to listen to, or `null` as a wildcard.
|
|
@@ -2468,7 +2483,9 @@ export interface Store {
|
|
|
2468
2483
|
* ```
|
|
2469
2484
|
* @example
|
|
2470
2485
|
* This example registers a listener that responds to any invalid changes to
|
|
2471
|
-
* any Cell.
|
|
2486
|
+
* any Cell - in a Store _without_ a Schema. Note also how it then responds to
|
|
2487
|
+
* cases where an empty or invalid Row objects, or Table objects, or Tables
|
|
2488
|
+
* objects are provided.
|
|
2472
2489
|
*
|
|
2473
2490
|
* ```js
|
|
2474
2491
|
* const store = createStore().setTables({
|
|
@@ -2490,6 +2507,91 @@ export interface Store {
|
|
|
2490
2507
|
* store.setTable('sales', {fido: {date: new Date()}});
|
|
2491
2508
|
* // -> 'Invalid date cell in fido row in sales table'
|
|
2492
2509
|
*
|
|
2510
|
+
* store.setRow('pets', 'felix', {});
|
|
2511
|
+
* // -> 'Invalid undefined cell in felix row in pets table'
|
|
2512
|
+
*
|
|
2513
|
+
* store.setRow('filter', 'name', /[a-z]?/);
|
|
2514
|
+
* // -> 'Invalid undefined cell in name row in filter table'
|
|
2515
|
+
*
|
|
2516
|
+
* store.setRow('sales', '2021', {forecast: undefined});
|
|
2517
|
+
* // -> 'Invalid forecast cell in 2021 row in sales table'
|
|
2518
|
+
*
|
|
2519
|
+
* store.addRow('filter', /[0-9]?/);
|
|
2520
|
+
* // -> 'Invalid undefined cell in undefined row in filter table'
|
|
2521
|
+
*
|
|
2522
|
+
* store.setTable('raw', {});
|
|
2523
|
+
* // -> 'Invalid undefined cell in undefined row in raw table'
|
|
2524
|
+
*
|
|
2525
|
+
* store.setTable('raw', ['row1', 'row2']);
|
|
2526
|
+
* // -> 'Invalid undefined cell in undefined row in raw table'
|
|
2527
|
+
*
|
|
2528
|
+
* store.setTables(['table1', 'table2']);
|
|
2529
|
+
* // -> 'Invalid undefined cell in undefined row in undefined table'
|
|
2530
|
+
*
|
|
2531
|
+
* store.delListener(listenerId);
|
|
2532
|
+
* ```
|
|
2533
|
+
* @example
|
|
2534
|
+
* This example registers a listener that responds to any invalid changes to
|
|
2535
|
+
* any Cell - in a Store _with_ a Schema. Note how it responds to cases where
|
|
2536
|
+
* missing parameters are provided for optional, and defaulted Cell values in
|
|
2537
|
+
* a Row.
|
|
2538
|
+
*
|
|
2539
|
+
* ```js
|
|
2540
|
+
* const store = createStore().setSchema({
|
|
2541
|
+
* pets: {
|
|
2542
|
+
* species: {type: 'string'},
|
|
2543
|
+
* color: {type: 'string', default: 'unknown'},
|
|
2544
|
+
* },
|
|
2545
|
+
* });
|
|
2546
|
+
*
|
|
2547
|
+
* const listenerId = store.addInvalidCellListener(
|
|
2548
|
+
* null,
|
|
2549
|
+
* null,
|
|
2550
|
+
* null,
|
|
2551
|
+
* (store, tableId, rowId, cellId) => {
|
|
2552
|
+
* console.log(
|
|
2553
|
+
* `Invalid ${cellId} cell in ${rowId} row in ${tableId} table`,
|
|
2554
|
+
* );
|
|
2555
|
+
* },
|
|
2556
|
+
* );
|
|
2557
|
+
*
|
|
2558
|
+
* store.setRow('sales', 'fido', {price: 5});
|
|
2559
|
+
* // -> 'Invalid price cell in fido row in sales table'
|
|
2560
|
+
* // The listener is called, because the sales Table is not in the schema
|
|
2561
|
+
*
|
|
2562
|
+
* store.setRow('pets', 'felix', {species: true});
|
|
2563
|
+
* // -> 'Invalid species cell in felix row in pets table'
|
|
2564
|
+
* // The listener is called, because species is invalid...
|
|
2565
|
+
* console.log(store.getRow('pets', 'felix'));
|
|
2566
|
+
* // -> {color: 'unknown'}
|
|
2567
|
+
* // ...even though a Row was set with the default value
|
|
2568
|
+
*
|
|
2569
|
+
* store.setRow('pets', 'fido', {color: 'brown'});
|
|
2570
|
+
* // -> 'Invalid species cell in fido row in pets table'
|
|
2571
|
+
* // The listener is called, because species is missing and not defaulted...
|
|
2572
|
+
* console.log(store.getRow('pets', 'fido'));
|
|
2573
|
+
* // -> {color: 'brown'}
|
|
2574
|
+
* // ...even though a Row was set
|
|
2575
|
+
*
|
|
2576
|
+
* store.setRow('pets', 'rex', {species: 'dog'});
|
|
2577
|
+
* console.log(store.getRow('pets', 'rex'));
|
|
2578
|
+
* // -> {species: 'dog', color: 'unknown'}
|
|
2579
|
+
* // The listener is not called, because color is defaulted
|
|
2580
|
+
*
|
|
2581
|
+
* store.delTables().setSchema({
|
|
2582
|
+
* pets: {
|
|
2583
|
+
* species: {type: 'string'},
|
|
2584
|
+
* color: {type: 'string'},
|
|
2585
|
+
* },
|
|
2586
|
+
* });
|
|
2587
|
+
*
|
|
2588
|
+
* store.setRow('pets', 'cujo', {});
|
|
2589
|
+
* // -> 'Invalid species cell in cujo row in pets table'
|
|
2590
|
+
* // -> 'Invalid color cell in cujo row in pets table'
|
|
2591
|
+
* // -> 'Invalid undefined cell in cujo row in pets table'
|
|
2592
|
+
* // The listener is called multiple times, because neither Cell is defaulted
|
|
2593
|
+
* // and the Row as a whole is empty
|
|
2594
|
+
*
|
|
2493
2595
|
* store.delListener(listenerId);
|
|
2494
2596
|
* ```
|
|
2495
2597
|
* @example
|
package/lib/debug/store.js
CHANGED
|
@@ -212,7 +212,7 @@ const createStore = () => {
|
|
|
212
212
|
const changedCells = mapNew();
|
|
213
213
|
const invalidCells = mapNew();
|
|
214
214
|
const schemaMap = mapNew();
|
|
215
|
-
const
|
|
215
|
+
const schemaRowCache = mapNew();
|
|
216
216
|
const tablesMap = mapNew();
|
|
217
217
|
const tablesListeners = mapNewPair(setNew);
|
|
218
218
|
const tableIdsListeners = mapNewPair(setNew);
|
|
@@ -253,7 +253,7 @@ const createStore = () => {
|
|
|
253
253
|
);
|
|
254
254
|
const validateRow = (tableId, rowId, row, skipDefaults) =>
|
|
255
255
|
validate(
|
|
256
|
-
skipDefaults ? row : addDefaultsToRow(row, tableId),
|
|
256
|
+
skipDefaults ? row : addDefaultsToRow(row, tableId, rowId),
|
|
257
257
|
(cell, cellId) =>
|
|
258
258
|
ifNotUndefined(
|
|
259
259
|
getValidatedCell(tableId, rowId, cellId, cell),
|
|
@@ -278,13 +278,21 @@ const createStore = () => {
|
|
|
278
278
|
: isUndefined(getCellType(cell))
|
|
279
279
|
? cellInvalid(tableId, rowId, cellId, cell)
|
|
280
280
|
: cell;
|
|
281
|
-
const addDefaultsToRow = (row, tableId) => {
|
|
282
|
-
ifNotUndefined(
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
281
|
+
const addDefaultsToRow = (row, tableId, rowId) => {
|
|
282
|
+
ifNotUndefined(
|
|
283
|
+
mapGet(schemaRowCache, tableId),
|
|
284
|
+
([rowDefaulted, rowNonDefaulted]) => {
|
|
285
|
+
collForEach(rowDefaulted, (cell, cellId) => {
|
|
286
|
+
if (!objHas(row, cellId)) {
|
|
287
|
+
row[cellId] = cell;
|
|
288
|
+
}
|
|
289
|
+
});
|
|
290
|
+
collForEach(rowNonDefaulted, (cellId) => {
|
|
291
|
+
if (!objHas(row, cellId)) {
|
|
292
|
+
cellInvalid(tableId, rowId, cellId);
|
|
293
|
+
}
|
|
294
|
+
});
|
|
295
|
+
},
|
|
288
296
|
);
|
|
289
297
|
return row;
|
|
290
298
|
};
|
|
@@ -293,7 +301,8 @@ const createStore = () => {
|
|
|
293
301
|
schemaMap,
|
|
294
302
|
schema,
|
|
295
303
|
(_schema, tableId, tableSchema) => {
|
|
296
|
-
const
|
|
304
|
+
const rowDefaulted = mapNew();
|
|
305
|
+
const rowNonDefaulted = setNew();
|
|
297
306
|
transformMap(
|
|
298
307
|
mapEnsure(schemaMap, tableId, mapNew()),
|
|
299
308
|
tableSchema,
|
|
@@ -301,15 +310,16 @@ const createStore = () => {
|
|
|
301
310
|
mapSet(tableSchemaMap, cellId, cellSchema);
|
|
302
311
|
ifNotUndefined(
|
|
303
312
|
cellSchema[DEFAULT],
|
|
304
|
-
(def) => (
|
|
313
|
+
(def) => mapSet(rowDefaulted, cellId, def),
|
|
314
|
+
() => setAdd(rowNonDefaulted, cellId),
|
|
305
315
|
);
|
|
306
316
|
},
|
|
307
317
|
);
|
|
308
|
-
mapSet(
|
|
318
|
+
mapSet(schemaRowCache, tableId, [rowDefaulted, rowNonDefaulted]);
|
|
309
319
|
},
|
|
310
320
|
(_schema, tableId) => {
|
|
311
321
|
mapSet(schemaMap, tableId);
|
|
312
|
-
mapSet(
|
|
322
|
+
mapSet(schemaRowCache, tableId);
|
|
313
323
|
},
|
|
314
324
|
);
|
|
315
325
|
const setValidTables = (tables) =>
|
|
@@ -358,7 +368,7 @@ const createStore = () => {
|
|
|
358
368
|
tableId,
|
|
359
369
|
tableMap,
|
|
360
370
|
rowId,
|
|
361
|
-
addDefaultsToRow({[cellId]: validCell}, tableId),
|
|
371
|
+
addDefaultsToRow({[cellId]: validCell}, tableId, rowId),
|
|
362
372
|
),
|
|
363
373
|
);
|
|
364
374
|
const getNewRowId = (tableMap) => {
|
|
@@ -374,7 +384,7 @@ const createStore = () => {
|
|
|
374
384
|
const delValidRow = (tableId, tableMap, rowId) =>
|
|
375
385
|
setValidRow(tableId, tableMap, rowId, {}, true);
|
|
376
386
|
const delValidCell = (tableId, table, rowId, row, cellId, forceDel) => {
|
|
377
|
-
const defaultCell = mapGet(
|
|
387
|
+
const defaultCell = mapGet(mapGet(schemaRowCache, tableId)?.[0], cellId);
|
|
378
388
|
if (!isUndefined(defaultCell) && !forceDel) {
|
|
379
389
|
return setValidCell(tableId, rowId, row, cellId, defaultCell);
|
|
380
390
|
}
|
|
@@ -445,79 +455,76 @@ const createStore = () => {
|
|
|
445
455
|
)
|
|
446
456
|
: 0;
|
|
447
457
|
const callListenersForChanges = (mutator) => {
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
(
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
(
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
458
|
+
if (!collIsEmpty(changedCells)) {
|
|
459
|
+
const emptyIdListeners =
|
|
460
|
+
collIsEmpty(cellIdsListeners[mutator]) &&
|
|
461
|
+
collIsEmpty(rowIdsListeners[mutator]) &&
|
|
462
|
+
collIsEmpty(tableIdsListeners[mutator]);
|
|
463
|
+
const emptyOtherListeners =
|
|
464
|
+
collIsEmpty(cellListeners[mutator]) &&
|
|
465
|
+
collIsEmpty(rowListeners[mutator]) &&
|
|
466
|
+
collIsEmpty(tableListeners[mutator]) &&
|
|
467
|
+
collIsEmpty(tablesListeners[mutator]);
|
|
468
|
+
if (!(emptyIdListeners && emptyOtherListeners)) {
|
|
469
|
+
const changes = mutator
|
|
470
|
+
? [
|
|
471
|
+
mapClone(changedTableIds),
|
|
472
|
+
mapClone(changedRowIds, mapClone),
|
|
473
|
+
mapClone(changedCellIds, (table) => mapClone(table, mapClone)),
|
|
474
|
+
mapClone(changedCells, (table) => mapClone(table, mapClone)),
|
|
475
|
+
]
|
|
476
|
+
: [changedTableIds, changedRowIds, changedCellIds, changedCells];
|
|
477
|
+
if (!emptyIdListeners) {
|
|
478
|
+
collForEach(changes[2], (rowCellIds, tableId) =>
|
|
479
|
+
collForEach(rowCellIds, (changedIds, rowId) => {
|
|
480
|
+
if (!collIsEmpty(changedIds)) {
|
|
481
|
+
callListeners(cellIdsListeners[mutator], [tableId, rowId]);
|
|
482
|
+
}
|
|
483
|
+
}),
|
|
484
|
+
);
|
|
485
|
+
collForEach(changes[1], (changedIds, tableId) => {
|
|
474
486
|
if (!collIsEmpty(changedIds)) {
|
|
475
|
-
callListeners(
|
|
487
|
+
callListeners(rowIdsListeners[mutator], [tableId]);
|
|
476
488
|
}
|
|
477
|
-
})
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
if (!collIsEmpty(changedIds)) {
|
|
481
|
-
callListeners(rowIdsListeners[mutator], [tableId]);
|
|
489
|
+
});
|
|
490
|
+
if (!collIsEmpty(changes[0])) {
|
|
491
|
+
callListeners(tableIdsListeners[mutator]);
|
|
482
492
|
}
|
|
483
|
-
});
|
|
484
|
-
if (!collIsEmpty(changes[0])) {
|
|
485
|
-
callListeners(tableIdsListeners[mutator]);
|
|
486
493
|
}
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
494
|
+
if (!emptyOtherListeners) {
|
|
495
|
+
let tablesChanged;
|
|
496
|
+
collForEach(changes[3], (rows, tableId) => {
|
|
497
|
+
let tableChanged;
|
|
498
|
+
collForEach(rows, (cells, rowId) => {
|
|
499
|
+
let rowChanged;
|
|
500
|
+
collForEach(cells, (oldCell, cellId) => {
|
|
501
|
+
const newCell = getCell(tableId, rowId, cellId);
|
|
502
|
+
if (newCell !== oldCell) {
|
|
503
|
+
callListeners(
|
|
504
|
+
cellListeners[mutator],
|
|
505
|
+
[tableId, rowId, cellId],
|
|
506
|
+
newCell,
|
|
507
|
+
oldCell,
|
|
508
|
+
getCellChange,
|
|
509
|
+
);
|
|
510
|
+
tablesChanged = tableChanged = rowChanged = 1;
|
|
511
|
+
}
|
|
512
|
+
});
|
|
513
|
+
if (rowChanged) {
|
|
497
514
|
callListeners(
|
|
498
|
-
|
|
499
|
-
[tableId, rowId
|
|
500
|
-
newCell,
|
|
501
|
-
oldCell,
|
|
515
|
+
rowListeners[mutator],
|
|
516
|
+
[tableId, rowId],
|
|
502
517
|
getCellChange,
|
|
503
518
|
);
|
|
504
|
-
tablesChanged = tableChanged = rowChanged = 1;
|
|
505
519
|
}
|
|
506
520
|
});
|
|
507
|
-
if (
|
|
508
|
-
callListeners(
|
|
509
|
-
rowListeners[mutator],
|
|
510
|
-
[tableId, rowId],
|
|
511
|
-
getCellChange,
|
|
512
|
-
);
|
|
521
|
+
if (tableChanged) {
|
|
522
|
+
callListeners(tableListeners[mutator], [tableId], getCellChange);
|
|
513
523
|
}
|
|
514
524
|
});
|
|
515
|
-
if (
|
|
516
|
-
callListeners(
|
|
525
|
+
if (tablesChanged) {
|
|
526
|
+
callListeners(tablesListeners[mutator], [], getCellChange);
|
|
517
527
|
}
|
|
518
|
-
});
|
|
519
|
-
if (tablesChanged) {
|
|
520
|
-
callListeners(tablesListeners[mutator], [], getCellChange);
|
|
521
528
|
}
|
|
522
529
|
}
|
|
523
530
|
}
|
package/lib/debug/tinybase.js
CHANGED
|
@@ -1238,7 +1238,7 @@ const createStore = () => {
|
|
|
1238
1238
|
const changedCells = mapNew();
|
|
1239
1239
|
const invalidCells = mapNew();
|
|
1240
1240
|
const schemaMap = mapNew();
|
|
1241
|
-
const
|
|
1241
|
+
const schemaRowCache = mapNew();
|
|
1242
1242
|
const tablesMap = mapNew();
|
|
1243
1243
|
const tablesListeners = mapNewPair(setNew);
|
|
1244
1244
|
const tableIdsListeners = mapNewPair(setNew);
|
|
@@ -1279,7 +1279,7 @@ const createStore = () => {
|
|
|
1279
1279
|
);
|
|
1280
1280
|
const validateRow = (tableId, rowId, row, skipDefaults) =>
|
|
1281
1281
|
validate(
|
|
1282
|
-
skipDefaults ? row : addDefaultsToRow(row, tableId),
|
|
1282
|
+
skipDefaults ? row : addDefaultsToRow(row, tableId, rowId),
|
|
1283
1283
|
(cell, cellId) =>
|
|
1284
1284
|
ifNotUndefined(
|
|
1285
1285
|
getValidatedCell(tableId, rowId, cellId, cell),
|
|
@@ -1304,13 +1304,21 @@ const createStore = () => {
|
|
|
1304
1304
|
: isUndefined(getCellType(cell))
|
|
1305
1305
|
? cellInvalid(tableId, rowId, cellId, cell)
|
|
1306
1306
|
: cell;
|
|
1307
|
-
const addDefaultsToRow = (row, tableId) => {
|
|
1308
|
-
ifNotUndefined(
|
|
1309
|
-
|
|
1310
|
-
|
|
1311
|
-
|
|
1312
|
-
|
|
1313
|
-
|
|
1307
|
+
const addDefaultsToRow = (row, tableId, rowId) => {
|
|
1308
|
+
ifNotUndefined(
|
|
1309
|
+
mapGet(schemaRowCache, tableId),
|
|
1310
|
+
([rowDefaulted, rowNonDefaulted]) => {
|
|
1311
|
+
collForEach(rowDefaulted, (cell, cellId) => {
|
|
1312
|
+
if (!objHas(row, cellId)) {
|
|
1313
|
+
row[cellId] = cell;
|
|
1314
|
+
}
|
|
1315
|
+
});
|
|
1316
|
+
collForEach(rowNonDefaulted, (cellId) => {
|
|
1317
|
+
if (!objHas(row, cellId)) {
|
|
1318
|
+
cellInvalid(tableId, rowId, cellId);
|
|
1319
|
+
}
|
|
1320
|
+
});
|
|
1321
|
+
},
|
|
1314
1322
|
);
|
|
1315
1323
|
return row;
|
|
1316
1324
|
};
|
|
@@ -1319,7 +1327,8 @@ const createStore = () => {
|
|
|
1319
1327
|
schemaMap,
|
|
1320
1328
|
schema,
|
|
1321
1329
|
(_schema, tableId, tableSchema) => {
|
|
1322
|
-
const
|
|
1330
|
+
const rowDefaulted = mapNew();
|
|
1331
|
+
const rowNonDefaulted = setNew();
|
|
1323
1332
|
transformMap(
|
|
1324
1333
|
mapEnsure(schemaMap, tableId, mapNew()),
|
|
1325
1334
|
tableSchema,
|
|
@@ -1327,15 +1336,16 @@ const createStore = () => {
|
|
|
1327
1336
|
mapSet(tableSchemaMap, cellId, cellSchema);
|
|
1328
1337
|
ifNotUndefined(
|
|
1329
1338
|
cellSchema[DEFAULT],
|
|
1330
|
-
(def) => (
|
|
1339
|
+
(def) => mapSet(rowDefaulted, cellId, def),
|
|
1340
|
+
() => setAdd(rowNonDefaulted, cellId),
|
|
1331
1341
|
);
|
|
1332
1342
|
},
|
|
1333
1343
|
);
|
|
1334
|
-
mapSet(
|
|
1344
|
+
mapSet(schemaRowCache, tableId, [rowDefaulted, rowNonDefaulted]);
|
|
1335
1345
|
},
|
|
1336
1346
|
(_schema, tableId) => {
|
|
1337
1347
|
mapSet(schemaMap, tableId);
|
|
1338
|
-
mapSet(
|
|
1348
|
+
mapSet(schemaRowCache, tableId);
|
|
1339
1349
|
},
|
|
1340
1350
|
);
|
|
1341
1351
|
const setValidTables = (tables) =>
|
|
@@ -1384,7 +1394,7 @@ const createStore = () => {
|
|
|
1384
1394
|
tableId,
|
|
1385
1395
|
tableMap,
|
|
1386
1396
|
rowId,
|
|
1387
|
-
addDefaultsToRow({[cellId]: validCell}, tableId),
|
|
1397
|
+
addDefaultsToRow({[cellId]: validCell}, tableId, rowId),
|
|
1388
1398
|
),
|
|
1389
1399
|
);
|
|
1390
1400
|
const getNewRowId = (tableMap) => {
|
|
@@ -1400,7 +1410,7 @@ const createStore = () => {
|
|
|
1400
1410
|
const delValidRow = (tableId, tableMap, rowId) =>
|
|
1401
1411
|
setValidRow(tableId, tableMap, rowId, {}, true);
|
|
1402
1412
|
const delValidCell = (tableId, table, rowId, row, cellId, forceDel) => {
|
|
1403
|
-
const defaultCell = mapGet(
|
|
1413
|
+
const defaultCell = mapGet(mapGet(schemaRowCache, tableId)?.[0], cellId);
|
|
1404
1414
|
if (!isUndefined(defaultCell) && !forceDel) {
|
|
1405
1415
|
return setValidCell(tableId, rowId, row, cellId, defaultCell);
|
|
1406
1416
|
}
|
|
@@ -1471,79 +1481,76 @@ const createStore = () => {
|
|
|
1471
1481
|
)
|
|
1472
1482
|
: 0;
|
|
1473
1483
|
const callListenersForChanges = (mutator) => {
|
|
1474
|
-
|
|
1475
|
-
|
|
1476
|
-
|
|
1477
|
-
|
|
1478
|
-
(
|
|
1479
|
-
|
|
1480
|
-
|
|
1481
|
-
|
|
1482
|
-
(
|
|
1483
|
-
|
|
1484
|
-
|
|
1485
|
-
|
|
1486
|
-
|
|
1487
|
-
|
|
1488
|
-
|
|
1489
|
-
|
|
1490
|
-
|
|
1491
|
-
|
|
1492
|
-
|
|
1493
|
-
|
|
1494
|
-
|
|
1495
|
-
|
|
1496
|
-
|
|
1497
|
-
|
|
1498
|
-
|
|
1499
|
-
|
|
1484
|
+
if (!collIsEmpty(changedCells)) {
|
|
1485
|
+
const emptyIdListeners =
|
|
1486
|
+
collIsEmpty(cellIdsListeners[mutator]) &&
|
|
1487
|
+
collIsEmpty(rowIdsListeners[mutator]) &&
|
|
1488
|
+
collIsEmpty(tableIdsListeners[mutator]);
|
|
1489
|
+
const emptyOtherListeners =
|
|
1490
|
+
collIsEmpty(cellListeners[mutator]) &&
|
|
1491
|
+
collIsEmpty(rowListeners[mutator]) &&
|
|
1492
|
+
collIsEmpty(tableListeners[mutator]) &&
|
|
1493
|
+
collIsEmpty(tablesListeners[mutator]);
|
|
1494
|
+
if (!(emptyIdListeners && emptyOtherListeners)) {
|
|
1495
|
+
const changes = mutator
|
|
1496
|
+
? [
|
|
1497
|
+
mapClone(changedTableIds),
|
|
1498
|
+
mapClone(changedRowIds, mapClone),
|
|
1499
|
+
mapClone(changedCellIds, (table) => mapClone(table, mapClone)),
|
|
1500
|
+
mapClone(changedCells, (table) => mapClone(table, mapClone)),
|
|
1501
|
+
]
|
|
1502
|
+
: [changedTableIds, changedRowIds, changedCellIds, changedCells];
|
|
1503
|
+
if (!emptyIdListeners) {
|
|
1504
|
+
collForEach(changes[2], (rowCellIds, tableId) =>
|
|
1505
|
+
collForEach(rowCellIds, (changedIds, rowId) => {
|
|
1506
|
+
if (!collIsEmpty(changedIds)) {
|
|
1507
|
+
callListeners(cellIdsListeners[mutator], [tableId, rowId]);
|
|
1508
|
+
}
|
|
1509
|
+
}),
|
|
1510
|
+
);
|
|
1511
|
+
collForEach(changes[1], (changedIds, tableId) => {
|
|
1500
1512
|
if (!collIsEmpty(changedIds)) {
|
|
1501
|
-
callListeners(
|
|
1513
|
+
callListeners(rowIdsListeners[mutator], [tableId]);
|
|
1502
1514
|
}
|
|
1503
|
-
})
|
|
1504
|
-
|
|
1505
|
-
|
|
1506
|
-
if (!collIsEmpty(changedIds)) {
|
|
1507
|
-
callListeners(rowIdsListeners[mutator], [tableId]);
|
|
1515
|
+
});
|
|
1516
|
+
if (!collIsEmpty(changes[0])) {
|
|
1517
|
+
callListeners(tableIdsListeners[mutator]);
|
|
1508
1518
|
}
|
|
1509
|
-
});
|
|
1510
|
-
if (!collIsEmpty(changes[0])) {
|
|
1511
|
-
callListeners(tableIdsListeners[mutator]);
|
|
1512
1519
|
}
|
|
1513
|
-
|
|
1514
|
-
|
|
1515
|
-
|
|
1516
|
-
|
|
1517
|
-
|
|
1518
|
-
|
|
1519
|
-
|
|
1520
|
-
|
|
1521
|
-
|
|
1522
|
-
|
|
1520
|
+
if (!emptyOtherListeners) {
|
|
1521
|
+
let tablesChanged;
|
|
1522
|
+
collForEach(changes[3], (rows, tableId) => {
|
|
1523
|
+
let tableChanged;
|
|
1524
|
+
collForEach(rows, (cells, rowId) => {
|
|
1525
|
+
let rowChanged;
|
|
1526
|
+
collForEach(cells, (oldCell, cellId) => {
|
|
1527
|
+
const newCell = getCell(tableId, rowId, cellId);
|
|
1528
|
+
if (newCell !== oldCell) {
|
|
1529
|
+
callListeners(
|
|
1530
|
+
cellListeners[mutator],
|
|
1531
|
+
[tableId, rowId, cellId],
|
|
1532
|
+
newCell,
|
|
1533
|
+
oldCell,
|
|
1534
|
+
getCellChange,
|
|
1535
|
+
);
|
|
1536
|
+
tablesChanged = tableChanged = rowChanged = 1;
|
|
1537
|
+
}
|
|
1538
|
+
});
|
|
1539
|
+
if (rowChanged) {
|
|
1523
1540
|
callListeners(
|
|
1524
|
-
|
|
1525
|
-
[tableId, rowId
|
|
1526
|
-
newCell,
|
|
1527
|
-
oldCell,
|
|
1541
|
+
rowListeners[mutator],
|
|
1542
|
+
[tableId, rowId],
|
|
1528
1543
|
getCellChange,
|
|
1529
1544
|
);
|
|
1530
|
-
tablesChanged = tableChanged = rowChanged = 1;
|
|
1531
1545
|
}
|
|
1532
1546
|
});
|
|
1533
|
-
if (
|
|
1534
|
-
callListeners(
|
|
1535
|
-
rowListeners[mutator],
|
|
1536
|
-
[tableId, rowId],
|
|
1537
|
-
getCellChange,
|
|
1538
|
-
);
|
|
1547
|
+
if (tableChanged) {
|
|
1548
|
+
callListeners(tableListeners[mutator], [tableId], getCellChange);
|
|
1539
1549
|
}
|
|
1540
1550
|
});
|
|
1541
|
-
if (
|
|
1542
|
-
callListeners(
|
|
1551
|
+
if (tablesChanged) {
|
|
1552
|
+
callListeners(tablesListeners[mutator], [], getCellChange);
|
|
1543
1553
|
}
|
|
1544
|
-
});
|
|
1545
|
-
if (tablesChanged) {
|
|
1546
|
-
callListeners(tablesListeners[mutator], [], getCellChange);
|
|
1547
1554
|
}
|
|
1548
1555
|
}
|
|
1549
1556
|
}
|
package/lib/store.d.ts
CHANGED
|
@@ -2433,6 +2433,21 @@ export interface Store {
|
|
|
2433
2433
|
* The changes made by mutator listeners do not fire other mutating listeners,
|
|
2434
2434
|
* though they will fire non-mutator listeners.
|
|
2435
2435
|
*
|
|
2436
|
+
* Special note should be made for how the listener will be called when a
|
|
2437
|
+
* Schema is present. The listener will be called:
|
|
2438
|
+
*
|
|
2439
|
+
* - if a Table is being updated that is not specified in the Schema
|
|
2440
|
+
* - if a Cell is of the wrong type specified in the Schema
|
|
2441
|
+
* - if a Cell is omitted and is not defaulted in the Schema
|
|
2442
|
+
* - if an empty Row is provided and there are no Cell defaults in the Schema
|
|
2443
|
+
*
|
|
2444
|
+
* The listener will not be called if Cell that is defaulted in the Schema is
|
|
2445
|
+
* not provided, as long as all of the Cells that are _not_ defaulted _are_
|
|
2446
|
+
* provided.
|
|
2447
|
+
*
|
|
2448
|
+
* To help understand all of these schema-based conditions, please see the
|
|
2449
|
+
* Schema example below.
|
|
2450
|
+
*
|
|
2436
2451
|
* @param tableId The Id of the Table to listen to, or `null` as a wildcard.
|
|
2437
2452
|
* @param rowId The Id of the Row to listen to, or `null` as a wildcard.
|
|
2438
2453
|
* @param cellId The Id of the Cell to listen to, or `null` as a wildcard.
|
|
@@ -2468,7 +2483,9 @@ export interface Store {
|
|
|
2468
2483
|
* ```
|
|
2469
2484
|
* @example
|
|
2470
2485
|
* This example registers a listener that responds to any invalid changes to
|
|
2471
|
-
* any Cell.
|
|
2486
|
+
* any Cell - in a Store _without_ a Schema. Note also how it then responds to
|
|
2487
|
+
* cases where an empty or invalid Row objects, or Table objects, or Tables
|
|
2488
|
+
* objects are provided.
|
|
2472
2489
|
*
|
|
2473
2490
|
* ```js
|
|
2474
2491
|
* const store = createStore().setTables({
|
|
@@ -2490,6 +2507,91 @@ export interface Store {
|
|
|
2490
2507
|
* store.setTable('sales', {fido: {date: new Date()}});
|
|
2491
2508
|
* // -> 'Invalid date cell in fido row in sales table'
|
|
2492
2509
|
*
|
|
2510
|
+
* store.setRow('pets', 'felix', {});
|
|
2511
|
+
* // -> 'Invalid undefined cell in felix row in pets table'
|
|
2512
|
+
*
|
|
2513
|
+
* store.setRow('filter', 'name', /[a-z]?/);
|
|
2514
|
+
* // -> 'Invalid undefined cell in name row in filter table'
|
|
2515
|
+
*
|
|
2516
|
+
* store.setRow('sales', '2021', {forecast: undefined});
|
|
2517
|
+
* // -> 'Invalid forecast cell in 2021 row in sales table'
|
|
2518
|
+
*
|
|
2519
|
+
* store.addRow('filter', /[0-9]?/);
|
|
2520
|
+
* // -> 'Invalid undefined cell in undefined row in filter table'
|
|
2521
|
+
*
|
|
2522
|
+
* store.setTable('raw', {});
|
|
2523
|
+
* // -> 'Invalid undefined cell in undefined row in raw table'
|
|
2524
|
+
*
|
|
2525
|
+
* store.setTable('raw', ['row1', 'row2']);
|
|
2526
|
+
* // -> 'Invalid undefined cell in undefined row in raw table'
|
|
2527
|
+
*
|
|
2528
|
+
* store.setTables(['table1', 'table2']);
|
|
2529
|
+
* // -> 'Invalid undefined cell in undefined row in undefined table'
|
|
2530
|
+
*
|
|
2531
|
+
* store.delListener(listenerId);
|
|
2532
|
+
* ```
|
|
2533
|
+
* @example
|
|
2534
|
+
* This example registers a listener that responds to any invalid changes to
|
|
2535
|
+
* any Cell - in a Store _with_ a Schema. Note how it responds to cases where
|
|
2536
|
+
* missing parameters are provided for optional, and defaulted Cell values in
|
|
2537
|
+
* a Row.
|
|
2538
|
+
*
|
|
2539
|
+
* ```js
|
|
2540
|
+
* const store = createStore().setSchema({
|
|
2541
|
+
* pets: {
|
|
2542
|
+
* species: {type: 'string'},
|
|
2543
|
+
* color: {type: 'string', default: 'unknown'},
|
|
2544
|
+
* },
|
|
2545
|
+
* });
|
|
2546
|
+
*
|
|
2547
|
+
* const listenerId = store.addInvalidCellListener(
|
|
2548
|
+
* null,
|
|
2549
|
+
* null,
|
|
2550
|
+
* null,
|
|
2551
|
+
* (store, tableId, rowId, cellId) => {
|
|
2552
|
+
* console.log(
|
|
2553
|
+
* `Invalid ${cellId} cell in ${rowId} row in ${tableId} table`,
|
|
2554
|
+
* );
|
|
2555
|
+
* },
|
|
2556
|
+
* );
|
|
2557
|
+
*
|
|
2558
|
+
* store.setRow('sales', 'fido', {price: 5});
|
|
2559
|
+
* // -> 'Invalid price cell in fido row in sales table'
|
|
2560
|
+
* // The listener is called, because the sales Table is not in the schema
|
|
2561
|
+
*
|
|
2562
|
+
* store.setRow('pets', 'felix', {species: true});
|
|
2563
|
+
* // -> 'Invalid species cell in felix row in pets table'
|
|
2564
|
+
* // The listener is called, because species is invalid...
|
|
2565
|
+
* console.log(store.getRow('pets', 'felix'));
|
|
2566
|
+
* // -> {color: 'unknown'}
|
|
2567
|
+
* // ...even though a Row was set with the default value
|
|
2568
|
+
*
|
|
2569
|
+
* store.setRow('pets', 'fido', {color: 'brown'});
|
|
2570
|
+
* // -> 'Invalid species cell in fido row in pets table'
|
|
2571
|
+
* // The listener is called, because species is missing and not defaulted...
|
|
2572
|
+
* console.log(store.getRow('pets', 'fido'));
|
|
2573
|
+
* // -> {color: 'brown'}
|
|
2574
|
+
* // ...even though a Row was set
|
|
2575
|
+
*
|
|
2576
|
+
* store.setRow('pets', 'rex', {species: 'dog'});
|
|
2577
|
+
* console.log(store.getRow('pets', 'rex'));
|
|
2578
|
+
* // -> {species: 'dog', color: 'unknown'}
|
|
2579
|
+
* // The listener is not called, because color is defaulted
|
|
2580
|
+
*
|
|
2581
|
+
* store.delTables().setSchema({
|
|
2582
|
+
* pets: {
|
|
2583
|
+
* species: {type: 'string'},
|
|
2584
|
+
* color: {type: 'string'},
|
|
2585
|
+
* },
|
|
2586
|
+
* });
|
|
2587
|
+
*
|
|
2588
|
+
* store.setRow('pets', 'cujo', {});
|
|
2589
|
+
* // -> 'Invalid species cell in cujo row in pets table'
|
|
2590
|
+
* // -> 'Invalid color cell in cujo row in pets table'
|
|
2591
|
+
* // -> 'Invalid undefined cell in cujo row in pets table'
|
|
2592
|
+
* // The listener is called multiple times, because neither Cell is defaulted
|
|
2593
|
+
* // and the Row as a whole is empty
|
|
2594
|
+
*
|
|
2493
2595
|
* store.delListener(listenerId);
|
|
2494
2596
|
* ```
|
|
2495
2597
|
* @example
|
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),
|
|
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=>o(F(e)),A=e=>new Set(e),B=(e,t)=>e?.add(t),D=(e,t,s)=>a(s)<2?B(o(s)?e:m(e,s[0],A()),t):D(m(e,s[0],y()),t,c(s)),G=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},H=(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},K=t=>{const s=e(t);return T(s)||s==n&&f(t)?s:void 0},Q=(e,t,s)=>b(e)||!(e=>h(e,k)&&e.constructor==k)(e)||q(e)||M(e)?(s?.(),!1):(P(e,((s,n)=>{t(s,n)||x(e,n)})),!q(e)),U=(e,t,s)=>J(e,t,v(e,t)==-s?void 0:s),V=()=>{let t,s=0,o=0;const c=y(),f=y(),h=y(),k=y(),F=y(),M=y(),q=y(),V=y(),W=I(A),X=I(A),Y=I(),Z=I(),$=I(),_=I(),ee=I(),te=I(),[se,ne,re,le]=(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]),D(a,c,o),c},(e,s=[],...n)=>G(R)(e,(e=>g(v(r,e),(([e])=>e(t,...s,...n)))),...s),e=>g(v(r,e),(([,t,s])=>(G(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()}))]})((()=>qe)),ae=(e,s)=>(!t||w(M,s)||ve(s))&&Q(e,((e,t)=>oe(s,t,e)),(()=>ve(s))),oe=(e,t,s,n)=>Q(n?s:de(s,e,t),((n,r)=>g(ce(e,t,r,n),(e=>(s[r]=e,!0)),(()=>!1))),(()=>ve(e,t))),ce=(e,s,n,r)=>t?g(v(v(M,e),n),(t=>K(r)!=t.type?ve(e,s,n,r,t.default):r),(()=>ve(e,s,n,r))):b(K(r))?ve(e,s,n,r):r,de=(e,t,s)=>(g(v(q,t),(([n,r])=>{R(n,((t,s)=>{j(e,s)||(e[s]=t)})),R(r,(n=>{j(e,n)||ve(t,s,n)}))})),e),ie=e=>H(M,e,((e,t,s)=>{const n=y(),r=A();H(m(M,t,y()),s,((e,t,s)=>{J(e,t,s),g(s.default,(e=>J(n,t,e)),(()=>B(r,t)))})),J(q,t,[n,r])}),((e,t)=>{J(M,t),J(q,t)})),ue=e=>H(V,e,((e,t,s)=>fe(t,s)),((e,t)=>pe(t))),fe=(e,t)=>H(m(V,e,y(),(()=>Ce(e,1))),t,((t,s,n)=>he(e,t,s,n)),((t,s)=>Le(e,t,s))),he=(e,t,s,n,r)=>H(m(t,s,y(),(()=>ye(e,s,1))),n,((t,n,r)=>be(e,s,t,n,r)),((n,l)=>Re(e,t,s,n,l,r))),be=(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))},ge=(e,t,s,n,r)=>g(v(t,s),(t=>be(e,s,t,n,r)),(()=>he(e,t,s,de({[n]:r},e,s)))),Te=e=>{const t=""+s++;return w(e,t)?Te(e):t},we=e=>v(V,e)??fe(e,{}),pe=e=>fe(e,{}),Le=(e,t,s)=>he(e,t,s,{},!0),Re=(e,t,s,n,r,l)=>{const a=v(v(q,e)?.[0],r);if(!b(a)&&!l)return be(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(V,e)))},Ce=(e,t)=>U(c,e,t),ye=(e,t,s)=>U(m(f,e,y()),t,s),Ie=(e,t,s,n)=>U(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=Ne(e,t,s);return w(n,s)?[!0,v(n,s),r]:[!1,r,r]},Je=e=>p(F)||p(te[e])?0:R(e?O(F,(e=>O(e,O))):F,((t,s)=>R(t,((t,n)=>R(t,((t,r)=>ne(te[e],[s,n,r],t))))))),me=e=>{if(!p(k)){const t=p(_[e])&&p(Z[e])&&p(X[e]),s=p(ee[e])&&p($[e])&&p(Y[e])&&p(W[e]);if(!t||!s){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)||ne(_[e],[s,n])})))),R(n[1],((t,s)=>{p(t)||ne(Z[e],[s])})),p(n[0])||ne(X[e])),!s){let t;R(n[3],((s,n)=>{let r;R(s,((s,l)=>{let a;R(s,((s,o)=>{const c=Ne(n,l,o);c!==s&&(ne(ee[e],[n,l,o],c,s,Ee),t=r=a=1)})),a&&ne($[e],[n,l],Ee)})),r&&ne(Y[e],[n],Ee)})),t&&ne(W[e],[],Ee)}}}},ze=e=>(Pe(e),qe),Oe=()=>z(V,(e=>z(e,z))),ke=()=>S(V),Fe=e=>S(v(V,e)),Me=(e,t)=>S(v(v(V,e),t)),Ne=(e,t,s)=>v(v(v(V,e),t),s),je=e=>ze((()=>(e=>Q(e,ae,ve))(e)?ue(e):0)),xe=()=>ze((()=>ue({}))),Pe=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},qe={getTables:Oe,getTableIds:ke,getTable:e=>z(v(V,e),z),getRowIds:Fe,getRow:(e,t)=>z(v(v(V,e),t)),getCellIds:Me,getCell:Ne,hasTables:()=>!p(V),hasTable:e=>w(V,e),hasRow:(e,t)=>w(v(V,e),t),hasCell:(e,t,s)=>w(v(v(V,e),t),s),getJson:()=>i(V),getSchemaJson:()=>i(M),setTables:je,setTable:(e,t)=>ze((()=>ae(t,e)?fe(e,t):0)),setRow:(e,t,s)=>ze((()=>oe(e,t,s)?he(e,we(e),t,s):0)),addRow:(e,t)=>Pe((()=>{let s;return oe(e,s,t)&&he(e,we(e),s=Te(v(V,e)),t),s})),setPartialRow:(e,t,s)=>ze((()=>{if(oe(e,t,s,1)){const n=we(e);P(s,((s,r)=>ge(e,n,t,r,s)))}})),setCell:(t,s,n,l)=>ze((()=>g(ce(t,s,n,e(l)==r?l(Ne(t,s,n)):l),(e=>ge(t,we(t),s,n,e))))),setJson:e=>{try{"{}"===e?xe():je(u(e))}catch{}return qe},setSchema:e=>ze((()=>{if((t=(e=>Q(e,(e=>Q(e,(e=>{if(!Q(e,((e,t)=>["type","default"].includes(t))))return!1;const t=e.type;return!(!T(t)&&t!=n||(K(e.default)!=t&&x(e,"default"),0))})))))(e))&&(ie(e),!p(V))){const e=Oe();xe(),je(e)}})),delTables:xe,delTable:e=>ze((()=>w(V,e)?pe(e):0)),delRow:(e,t)=>ze((()=>g(v(V,e),(s=>w(s,t)?Le(e,s,t):0)))),delCell:(e,t,s,n)=>ze((()=>g(v(V,e),(r=>g(v(r,t),(l=>w(l,s)?Re(e,r,t,l,s,n):0)))))),delSchema:()=>ze((()=>{ie({}),t=!1})),transaction:Pe,forEachTable:e=>R(V,((t,s)=>e(s,(e=>R(t,((t,s)=>e(s,(e=>E(t,e))))))))),forEachRow:(e,t)=>R(v(V,e),((e,s)=>t(s,(t=>E(e,t))))),forEachCell:(e,t,s)=>E(v(v(V,e),t),s),addTablesListener:(e,t)=>se(e,W[t?1:0]),addTableIdsListener:(e,t)=>se(e,X[t?1:0]),addTableListener:(e,t,s)=>se(t,Y[s?1:0],[e]),addRowIdsListener:(e,t,s)=>se(t,Z[s?1:0],[e]),addRowListener:(e,t,s,n)=>se(s,$[n?1:0],[e,t]),addCellIdsListener:(e,t,s,n)=>se(s,_[n?1:0],[e,t]),addCellListener:(e,t,s,n,r)=>se(n,ee[r?1:0],[e,t,s]),addInvalidCellListener:(e,t,s,n,r)=>se(n,te[r?1:0],[e,t,s]),callListener:e=>(le(e,[ke,Fe,Me],(e=>b(e[2])?[]:[,,].fill(Ne(...e)))),qe),delListener:e=>(re(e),qe),getListenerStats:()=>({})};return N(qe)};export{V 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),a=s(0),r=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)==r,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(),a=N(),r=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(a,e),H(r,e),H(i,e),l(e)};return[()=>e,()=>j(o),e=>B(a,e),e=>A(a,e),e=>P(o,e),e=>P(a,e),(e,t)=>H(a,e,t),(u,h,g,f,L)=>{const w=N(),v=N();H(o,u,h),A(a,u)||(H(a,u,t()),H(r,u,N()),H(i,u,N()));const p=P(r,u),I=P(i,u),S=t=>{const o=s=>e.getCell(h,t,s),a=P(p,t),r=n(h,t)?s(f(o,t)):void 0;if(a!=r&&H(w,t,[a,r]),!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[(a,r,i=[])=>{t??=e();const d=v(n)??""+s++;return H(o,d,[a,r,i]),Y(r,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 a=(...r)=>{const i=h(r);i==h(o)?e(t,...r,...n(r)):b(o[i])?c(s[i](...r),(e=>a(...r,e))):a(...r,o[i])};a()}))]},_=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],ae=(e,t)=>c(_.entries(e),(([e,s])=>t(s,e))),re=e=>g(ee(e)),ie=X((e=>{let t,s,n,o=100,a=N(),r=1;const d=K(),l=N(),[u,f,L]=$((()=>G)),p=N(),I=N(),S=[],y=[],R=(t,s)=>{r=0,e.transaction((()=>F(P(p,s),((s,n)=>F(s,((s,o)=>F(s,((s,a)=>b(s[t])?e.delCell(n,o,a,!0):e.setCell(n,o,a,s[t]))))))))),r=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(r){C(t,(()=>{w(S,t),E(),m(y),t=void 0,n=1}));const e=W(a,s,N()),r=W(e,o,N()),c=W(r,i,[void 0,void 0],(e=>e[0]=l));c[1]=d,c[0]===c[1]&&x(H(r,i))&&x(H(e,o))&&x(H(a,s))&&(t=v(S),n=1),z()}})),M=(e="")=>(b(t)&&(t=""+s++,H(p,t,a),j(t,e),a=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())})),de=(e,t)=>e<t?-1:1,le=X((e=>{const t=N(),s=N(),[n,o,a,r,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,a,r,i=de)=>{const g=b(r)?void 0:([e],[t])=>r(e,t);return h(e,n,((n,o,r,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(a)||Q(I,t))})),n(),x(f)||(L?B(S,(e=>Q(I,e))):B(r,(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(a,V)),I},delIndexDefinition:e=>(g(e),I),getStore:n,getIndexIds:o,forEachIndex:e=>a(((t,s)=>e(t,(e=>p(t,e,s))))),forEachSlice:(e,t)=>p(e,t,c(e)),hasIndex:r,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)})),ce=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]]]),ue=X((e=>{const t=N(),[s,n,o,a,r,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,a,r,c)=>{const u=E(n)?[n,a,r,c]:P(ce,n)??P(ce,"sum");return l(e,s,((s,n,o,a,r,l)=>{let c=i(e),h=M(a);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(a)?c=void 0:l&&(c=f(D(a),M(a))),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:a,getTableId:r,getMetric:i,addMetricListener:(e,s)=>h(s,t,[e]),delListener:e=>(f(e),L),destroy:u,getListenerStats:()=>({})};return se(L)})),he=(e,t,s,n,o)=>{let a,r=0;const i={load:async s=>{if(2!=r){r=1;const n=await t();b(n)||""==n?e.setTables(s):e.setJson(n),r=0}return i},startAutoLoad:async e=>(i.stopAutoLoad(),await i.load(e),n(i.load),i),stopAutoLoad:()=>(o(),i),save:async()=>(1!=r&&(r=2,await s(e.getJson()),r=0),i),startAutoSave:async()=>(await i.stopAutoSave().save(),a=e.addTablesListener((()=>i.save())),i),stopAutoSave:()=>(C(a,e.delListener),i),getStore:()=>e,destroy:()=>i.stopAutoLoad().stopAutoSave(),getStats:()=>({})};return se(i)},ge=globalThis.window,fe=(e,t,s)=>{let n;return he(e,(async()=>s.getItem(t)),(async e=>s.setItem(t,e)),(e=>{n=n=>{n.storageArea===s&&n.key===t&&e()},ge.addEventListener("storage",n)}),(()=>{ge.removeEventListener("storage",n),n=void 0}))},Le=(e,t)=>fe(e,t,localStorage),we=(e,t)=>fe(e,t,sessionStorage),ve=(s,n)=>{let o;return he(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}))},pe=e=>e.headers.get("ETag"),Ie=(e,t,s,n)=>{let o,a;return he(e,(async()=>{const e=await fetch(t);return a=pe(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=pe(s);b(a)||b(n)||n==a||(a=n,e())}),1e3*n)}),(()=>{C(o,clearInterval),o=void 0}))},Se=X((e=>{const t=N(),s=N(),n=N(),o=N(),[a,r,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 a=K();if(l(e)!=S(e))Q(a,t);else{let e=t;for(;!b(e)&&!A(a,e);)Q(a,e),e=P(n,e)}if(s)return a;H(o,t,a)}return P(o,t)})),I=(e,t)=>C(c(e),(([,,e])=>H(e,t))),S=e=>P(t,e),y={setRelationshipDefinition:(e,a,r,i)=>(H(t,e,r),h(e,a,((t,a)=>{const r=K(),i=K(),d=K(),[l,u]=c(e);F(a,(([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(r,n),H(l,n,s),B(P(o,e),(t=>{A(p(e,t),n)&&Q(d,t)}))})),t(),F(r,(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:a,getRelationshipIds:r,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)})),ye=(e,t,s,n=H)=>{const o=(a=j(e),r=e=>!ne(t,e),a.filter(r));var a,r;return c(ee(t),(n=>s(e,n,t[n]))),c(o,(t=>n(e,t))),e},Re=e=>{const t=s(e);return m(t)||t==a&&R(e)?t:void 0},Te=(e,t,s)=>b(e)||!(e=>T(e,_)&&e.constructor==_)(e)||re(e)||te(e)?(s?.(),!1):(ae(e,((s,n)=>{t(s,n)||oe(e,n)})),!re(e)),be=(e,t,s)=>H(e,t,P(e,t)==-s?void 0:s),Ce=()=>{let e,t=0,s=0;const n=N(),o=N(),r=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)||ve(s))&&Te(t,((e,t)=>V(s,t,e)),(()=>ve(s))),V=(e,t,s,n)=>Te(n?s:Y(s,e),((n,o)=>C(X(e,t,o,n),(e=>(s[o]=e,!0)),(()=>!1))),(()=>ve(e,t))),X=(t,s,n,o)=>e?C(P(P(u,t),n),(e=>Re(o)!=e.type?ve(t,s,n,o,e.default):o),(()=>ve(t,s,n,o))):b(Re(o))?ve(t,s,n,o):o,Y=(e,t)=>(C(P(h,t),(t=>ae(t,((t,s)=>{ne(e,s)||(e[s]=t)})))),e),Z=e=>ye(u,e,((e,t,s)=>{const n={};ye(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=>ye(g,e,((e,t,s)=>ee(t,s)),((e,t)=>ce(t))),ee=(e,t)=>ye(W(g,e,N(),(()=>ge(e,1))),t,((t,s,n)=>te(e,t,s,n)),((t,s)=>ue(e,t,s))),te=(e,t,s,n,o)=>ye(W(t,s,N(),(()=>fe(e,s,1))),n,((t,n,o)=>re(e,s,t,n,o)),((n,a)=>he(e,t,s,n,a,o))),re=(e,t,s,n,o)=>{A(s,n)||Le(e,t,n,1);const a=P(s,n);o!==a&&(we(e,t,n,a),H(s,n,o))},ie=(e,t,s,n,o)=>C(P(t,s),(t=>re(e,s,t,n,o)),(()=>te(e,t,s,Y({[n]:o},e)))),de=e=>{const s=""+t++;return A(e,s)?de(e):s},le=e=>P(g,e)??ee(e,{}),ce=e=>ee(e,{}),ue=(e,t,s)=>te(e,t,s,{},!0),he=(e,t,s,n,o,a)=>{const r=P(h,e)?.[o];if(!b(r)&&!a)return re(e,s,n,o,r);const i=t=>{we(e,s,t,P(n,t)),Le(e,s,t,-1),H(n,t)};b(r)?i(o):B(n,i),x(n)&&(fe(e,s,-1),x(H(t,s))&&(ge(e,-1),H(g,e)))},ge=(e,t)=>be(n,e,t),fe=(e,t,s)=>be(W(o,e,N()),t,s),Le=(e,t,s,n)=>be(W(W(r,e,N()),t,N()),s,n),we=(e,t,s,n)=>W(W(W(d,e,N()),t,N()),s,n),ve=(e,t,s,n,o)=>(w(W(W(W(l,e,N()),t,N()),s,[]),n),o),pe=(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]},Ie=e=>x(l)||x(k[e])?0: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))))))),Se=e=>{let t,s;if(!(x(d)||(t=x(R[e])&&x(S[e])&&x(L[e]))&&(s=x(T[e])&&x(y[e])&&x(v[e])&&x(f[e])))){const a=e?[G(n),G(o,G),G(r,(e=>G(e,G))),G(d,(e=>G(e,G)))]:[n,o,r,d];if(t||(F(a[2],((t,s)=>F(t,((t,n)=>{x(t)||D(R[e],[s,n])})))),F(a[1],((t,s)=>{x(t)||D(S[e],[s])})),x(a[0])||D(L[e])),!s){let t;F(a[3],((s,n)=>{let o;F(s,((s,a)=>{let r;F(s,((s,i)=>{const d=Ae(n,a,i);d!==s&&(D(T[e],[n,a,i],d,s,pe),t=o=r=1)})),r&&D(y[e],[n,a],pe)})),o&&D(v[e],[n],pe)})),t&&D(f[e],[],pe)}}},Ce=e=>(Je(e),Fe),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=>Ce((()=>(e=>Te(e,U,ve))(e)?_(e):0)),De=()=>Ce((()=>_({}))),Je=e=>{if(-1==s)return;s++;const t=e?.();return s--,0==s&&(s=1,Ie(1),Se(1),s=-1,Ie(0),Se(0),s=0,c([d,l,n,o,r],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)=>Ce((()=>U(t,e)?ee(e,t):0)),setRow:(e,t,s)=>Ce((()=>V(e,t,s)?te(e,le(e),t,s):0)),addRow:(e,t)=>Je((()=>{let s;return V(e,s,t)&&te(e,le(e),s=de(P(g,e)),t),s})),setPartialRow:(e,t,s)=>Ce((()=>{if(V(e,t,s,1)){const n=le(e);ae(s,((s,o)=>ie(e,n,t,o,s)))}})),setCell:(e,t,s,n)=>Ce((()=>C(X(e,t,s,E(n)?n(Ae(e,t,s)):n),(n=>ie(e,le(e),t,s,n))))),setJson:e=>{try{"{}"===e?De():xe(I(e))}catch{}return Fe},setSchema:t=>Ce((()=>{if((e=(e=>Te(e,(e=>Te(e,(e=>{if(!Te(e,((e,t)=>i(["type","default"],t))))return!1;const t=e.type;return!(!m(t)&&t!=a||(Re(e.default)!=t&&oe(e,"default"),0))})))))(t))&&(Z(t),!x(g))){const e=me();De(),xe(e)}})),delTables:De,delTable:e=>Ce((()=>A(g,e)?ce(e):0)),delRow:(e,t)=>Ce((()=>C(P(g,e),(s=>A(s,t)?ue(e,s,t):0)))),delCell:(e,t,s,n)=>Ce((()=>C(P(g,e),(o=>C(P(o,t),(a=>A(a,s)?he(e,o,t,a,s,n):0)))))),delSchema:()=>Ce((()=>{Z({}),e=!1})),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{ie as createCheckpoints,he as createCustomPersister,ve as createFilePersister,le as createIndexes,Le as createLocalPersister,ue as createMetrics,Se as createRelationships,Ie as createRemotePersister,we as createSessionPersister,Ce as createStore,de as defaultSorter};
|
|
1
|
+
import{promises as e,watch as t}from"fs";const s=e=>typeof e,n=s(""),o=s(!0),a=s(0),r=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=>g(e,((e,t)=>e+t),0),h=e=>e.length,f=e=>0==h(e),g=(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)?g([...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)==r,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(),a=N(),r=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(a,e),H(r,e),H(i,e),l(e)};return[()=>e,()=>j(o),e=>B(a,e),e=>A(a,e),e=>P(o,e),e=>P(a,e),(e,t)=>H(a,e,t),(u,h,f,g,L)=>{const w=N(),v=N();H(o,u,h),A(a,u)||(H(a,u,t()),H(r,u,N()),H(i,u,N()));const p=P(r,u),I=P(i,u),S=t=>{const o=s=>e.getCell(h,t,s),a=P(p,t),r=n(h,t)?s(g(o,t)):void 0;if(a!=r&&H(w,t,[a,r]),!b(L)){const e=P(I,t),s=n(h,t)?L(o,t):void 0;e!=s&&H(v,t,s)}},y=e=>{f((()=>{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(f(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=>f(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[(a,r,i=[])=>{t??=e();const d=v(n)??""+s++;return H(o,d,[a,r,i]),Y(r,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 a=(...r)=>{const i=h(r);i==h(o)?e(t,...r,...n(r)):b(o[i])?c(s[i](...r),(e=>a(...r,e))):a(...r,o[i])};a()}))]},_=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],ae=(e,t)=>c(_.entries(e),(([e,s])=>t(s,e))),re=e=>f(ee(e)),ie=X((e=>{let t,s,n,o=100,a=N(),r=1;const d=K(),l=N(),[u,g,L]=$((()=>G)),p=N(),I=N(),S=[],y=[],R=(t,s)=>{r=0,e.transaction((()=>F(P(p,s),((s,n)=>F(s,((s,o)=>F(s,((s,a)=>b(s[t])?e.delCell(n,o,a,!0):e.setCell(n,o,a,s[t]))))))))),r=1},T=e=>{H(p,e),H(I,e),g(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(r){C(t,(()=>{w(S,t),E(),m(y),t=void 0,n=1}));const e=W(a,s,N()),r=W(e,o,N()),c=W(r,i,[void 0,void 0],(e=>e[0]=l));c[1]=d,c[0]===c[1]&&x(H(r,i))&&x(H(e,o))&&x(H(a,s))&&(t=v(S),n=1),z()}})),M=(e="")=>(b(t)&&(t=""+s++,H(p,t,a),j(t,e),a=N(),n=1),t),D=()=>{f(S)||(y.unshift(M()),R(0,t),t=v(S),n=1)},J=()=>{f(y)||(w(S,t),t=y.shift(),R(1,t),n=1)},z=()=>{n&&(g(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),g(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())})),de=(e,t)=>e<t?-1:1,le=X((e=>{const t=N(),s=N(),[n,o,a,r,i,c,u,h,f,g]=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,a,r,i=de)=>{const f=b(r)?void 0:([e],[t])=>r(e,t);return h(e,n,((n,o,r,h,g,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(a)||Q(I,t))})),n(),x(g)||(L?B(S,(e=>Q(I,e))):B(r,(e=>C(P(h,e),(e=>Q(I,e))))),F(I,(e=>{const t=(t,s)=>i(P(g,t),P(g,s),e),s=[...P(S,e)];d(s,t)||(H(S,e,K(l(s,t))),Q(p,e))}))),(v||L)&&!b(f)){const t=[...S];d(t,f)||(u(e,N(l(t,f))),v=1)}v&&w(t,[e]),F(p,(t=>w(s,[e,t])))}),V(o),C(a,V)),I},delIndexDefinition:e=>(f(e),I),getStore:n,getIndexIds:o,forEachIndex:e=>a(((t,s)=>e(t,(e=>p(t,e,s))))),forEachSlice:(e,t)=>p(e,t,c(e)),hasIndex:r,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:g,getListenerStats:()=>({})};return se(I)})),ce=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]]]),ue=X((e=>{const t=N(),[s,n,o,a,r,i,d,l,c,u]=U(e,k,(e=>isNaN(e)||b(e)||!0===e||!1===e||""===e?void 0:1*e)),[h,f,g]=$((()=>L)),L={setMetricDefinition:(e,s,n,o,a,r,c)=>{const u=E(n)?[n,a,r,c]:P(ce,n)??P(ce,"sum");return l(e,s,((s,n,o,a,r,l)=>{let c=i(e),h=M(a);const[g,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(a)?c=void 0:l&&(c=g(D(a),M(a))),R(c)||(c=void 0);const p=i(e);c!=p&&(d(e,c),f(t,[e],c,p))}),V(o,1)),L},delMetricDefinition:e=>(c(e),L),getStore:s,getMetricIds:n,forEachMetric:o,hasMetric:a,getTableId:r,getMetric:i,addMetricListener:(e,s)=>h(s,t,[e]),delListener:e=>(g(e),L),destroy:u,getListenerStats:()=>({})};return se(L)})),he=(e,t,s,n,o)=>{let a,r=0;const i={load:async s=>{if(2!=r){r=1;const n=await t();b(n)||""==n?e.setTables(s):e.setJson(n),r=0}return i},startAutoLoad:async e=>(i.stopAutoLoad(),await i.load(e),n(i.load),i),stopAutoLoad:()=>(o(),i),save:async()=>(1!=r&&(r=2,await s(e.getJson()),r=0),i),startAutoSave:async()=>(await i.stopAutoSave().save(),a=e.addTablesListener((()=>i.save())),i),stopAutoSave:()=>(C(a,e.delListener),i),getStore:()=>e,destroy:()=>i.stopAutoLoad().stopAutoSave(),getStats:()=>({})};return se(i)},fe=globalThis.window,ge=(e,t,s)=>{let n;return he(e,(async()=>s.getItem(t)),(async e=>s.setItem(t,e)),(e=>{n=n=>{n.storageArea===s&&n.key===t&&e()},fe.addEventListener("storage",n)}),(()=>{fe.removeEventListener("storage",n),n=void 0}))},Le=(e,t)=>ge(e,t,localStorage),we=(e,t)=>ge(e,t,sessionStorage),ve=(s,n)=>{let o;return he(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}))},pe=e=>e.headers.get("ETag"),Ie=(e,t,s,n)=>{let o,a;return he(e,(async()=>{const e=await fetch(t);return a=pe(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=pe(s);b(a)||b(n)||n==a||(a=n,e())}),1e3*n)}),(()=>{C(o,clearInterval),o=void 0}))},Se=X((e=>{const t=N(),s=N(),n=N(),o=N(),[a,r,i,d,l,c,u,h,f,g]=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 a=K();if(l(e)!=S(e))Q(a,t);else{let e=t;for(;!b(e)&&!A(a,e);)Q(a,e),e=P(n,e)}if(s)return a;H(o,t,a)}return P(o,t)})),I=(e,t)=>C(c(e),(([,,e])=>H(e,t))),S=e=>P(t,e),y={setRelationshipDefinition:(e,a,r,i)=>(H(t,e,r),h(e,a,((t,a)=>{const r=K(),i=K(),d=K(),[l,u]=c(e);F(a,(([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(r,n),H(l,n,s),B(P(o,e),(t=>{A(p(e,t),n)&&Q(d,t)}))})),t(),F(r,(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),f(e),y),getStore:a,getRelationshipIds:r,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:g,getListenerStats:()=>({})};return se(y)})),ye=(e,t,s,n=H)=>{const o=(a=j(e),r=e=>!ne(t,e),a.filter(r));var a,r;return c(ee(t),(n=>s(e,n,t[n]))),c(o,(t=>n(e,t))),e},Re=e=>{const t=s(e);return m(t)||t==a&&R(e)?t:void 0},Te=(e,t,s)=>b(e)||!(e=>T(e,_)&&e.constructor==_)(e)||re(e)||te(e)?(s?.(),!1):(ae(e,((s,n)=>{t(s,n)||oe(e,n)})),!re(e)),be=(e,t,s)=>H(e,t,P(e,t)==-s?void 0:s),Ce=()=>{let e,t=0,s=0;const n=N(),o=N(),r=N(),d=N(),l=N(),u=N(),h=N(),f=N(),g=O(K),L=O(K),v=O(),S=O(),y=O(),R=O(),T=O(),k=O(),[M,D,z,U]=$((()=>ze)),V=(t,s)=>(!e||A(u,s)||pe(s))&&Te(t,((e,t)=>X(s,t,e)),(()=>pe(s))),X=(e,t,s,n)=>Te(n?s:Z(s,e,t),((n,o)=>C(Y(e,t,o,n),(e=>(s[o]=e,!0)),(()=>!1))),(()=>pe(e,t))),Y=(t,s,n,o)=>e?C(P(P(u,t),n),(e=>Re(o)!=e.type?pe(t,s,n,o,e.default):o),(()=>pe(t,s,n,o))):b(Re(o))?pe(t,s,n,o):o,Z=(e,t,s)=>(C(P(h,t),(([n,o])=>{F(n,((t,s)=>{ne(e,s)||(e[s]=t)})),F(o,(n=>{ne(e,n)||pe(t,s,n)}))})),e),_=e=>ye(u,e,((e,t,s)=>{const n=N(),o=K();ye(W(u,t,N()),s,((e,t,s)=>{H(e,t,s),C(s.default,(e=>H(n,t,e)),(()=>Q(o,t)))})),H(h,t,[n,o])}),((e,t)=>{H(u,t),H(h,t)})),ee=e=>ye(f,e,((e,t,s)=>te(t,s)),((e,t)=>ue(t))),te=(e,t)=>ye(W(f,e,N(),(()=>ge(e,1))),t,((t,s,n)=>re(e,t,s,n)),((t,s)=>he(e,t,s))),re=(e,t,s,n,o)=>ye(W(t,s,N(),(()=>Le(e,s,1))),n,((t,n,o)=>ie(e,s,t,n,o)),((n,a)=>fe(e,t,s,n,a,o))),ie=(e,t,s,n,o)=>{A(s,n)||we(e,t,n,1);const a=P(s,n);o!==a&&(ve(e,t,n,a),H(s,n,o))},de=(e,t,s,n,o)=>C(P(t,s),(t=>ie(e,s,t,n,o)),(()=>re(e,t,s,Z({[n]:o},e,s)))),le=e=>{const s=""+t++;return A(e,s)?le(e):s},ce=e=>P(f,e)??te(e,{}),ue=e=>te(e,{}),he=(e,t,s)=>re(e,t,s,{},!0),fe=(e,t,s,n,o,a)=>{const r=P(P(h,e)?.[0],o);if(!b(r)&&!a)return ie(e,s,n,o,r);const i=t=>{ve(e,s,t,P(n,t)),we(e,s,t,-1),H(n,t)};b(r)?i(o):B(n,i),x(n)&&(Le(e,s,-1),x(H(t,s))&&(ge(e,-1),H(f,e)))},ge=(e,t)=>be(n,e,t),Le=(e,t,s)=>be(W(o,e,N()),t,s),we=(e,t,s,n)=>be(W(W(r,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=xe(e,t,s);return A(n,s)?[!0,P(n,s),o]:[!1,o,o]},Se=e=>x(l)||x(k[e])?0: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=>{if(!x(d)){const t=x(R[e])&&x(S[e])&&x(L[e]),s=x(T[e])&&x(y[e])&&x(v[e])&&x(g[e]);if(!t||!s){const a=e?[G(n),G(o,G),G(r,(e=>G(e,G))),G(d,(e=>G(e,G)))]:[n,o,r,d];if(t||(F(a[2],((t,s)=>F(t,((t,n)=>{x(t)||D(R[e],[s,n])})))),F(a[1],((t,s)=>{x(t)||D(S[e],[s])})),x(a[0])||D(L[e])),!s){let t;F(a[3],((s,n)=>{let o;F(s,((s,a)=>{let r;F(s,((s,i)=>{const d=xe(n,a,i);d!==s&&(D(T[e],[n,a,i],d,s,Ie),t=o=r=1)})),r&&D(y[e],[n,a],Ie)})),o&&D(v[e],[n],Ie)})),t&&D(g[e],[],Ie)}}}},me=e=>(Fe(e),ze),Ee=()=>q(f,(e=>q(e,q))),ke=()=>j(f),Me=e=>j(P(f,e)),Ae=(e,t)=>j(P(P(f,e),t)),xe=(e,t,s)=>P(P(P(f,e),t),s),De=e=>me((()=>(e=>Te(e,V,pe))(e)?ee(e):0)),Je=()=>me((()=>ee({}))),Fe=e=>{if(-1==s)return;s++;const t=e?.();return s--,0==s&&(s=1,Se(1),Ce(1),s=-1,Se(0),Ce(0),s=0,c([d,l,n,o,r],J)),t},ze={getTables:Ee,getTableIds:ke,getTable:e=>q(P(f,e),q),getRowIds:Me,getRow:(e,t)=>q(P(P(f,e),t)),getCellIds:Ae,getCell:xe,hasTables:()=>!x(f),hasTable:e=>A(f,e),hasRow:(e,t)=>A(P(f,e),t),hasCell:(e,t,s)=>A(P(P(f,e),t),s),getJson:()=>p(f),getSchemaJson:()=>p(u),setTables:De,setTable:(e,t)=>me((()=>V(t,e)?te(e,t):0)),setRow:(e,t,s)=>me((()=>X(e,t,s)?re(e,ce(e),t,s):0)),addRow:(e,t)=>Fe((()=>{let s;return X(e,s,t)&&re(e,ce(e),s=le(P(f,e)),t),s})),setPartialRow:(e,t,s)=>me((()=>{if(X(e,t,s,1)){const n=ce(e);ae(s,((s,o)=>de(e,n,t,o,s)))}})),setCell:(e,t,s,n)=>me((()=>C(Y(e,t,s,E(n)?n(xe(e,t,s)):n),(n=>de(e,ce(e),t,s,n))))),setJson:e=>{try{"{}"===e?Je():De(I(e))}catch{}return ze},setSchema:t=>me((()=>{if((e=(e=>Te(e,(e=>Te(e,(e=>{if(!Te(e,((e,t)=>i(["type","default"],t))))return!1;const t=e.type;return!(!m(t)&&t!=a||(Re(e.default)!=t&&oe(e,"default"),0))})))))(t))&&(_(t),!x(f))){const e=Ee();Je(),De(e)}})),delTables:Je,delTable:e=>me((()=>A(f,e)?ue(e):0)),delRow:(e,t)=>me((()=>C(P(f,e),(s=>A(s,t)?he(e,s,t):0)))),delCell:(e,t,s,n)=>me((()=>C(P(f,e),(o=>C(P(o,t),(a=>A(a,s)?fe(e,o,t,a,s,n):0)))))),delSchema:()=>me((()=>{_({}),e=!1})),transaction:Fe,forEachTable:e=>F(f,((t,s)=>e(s,(e=>F(t,((t,s)=>e(s,(e=>B(t,e))))))))),forEachRow:(e,t)=>F(P(f,e),((e,s)=>t(s,(t=>B(e,t))))),forEachCell:(e,t,s)=>B(P(P(f,e),t),s),addTablesListener:(e,t)=>M(e,g[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=>(U(e,[ke,Me,Ae],(e=>b(e[2])?[]:[,,].fill(xe(...e)))),ze),delListener:e=>(z(e),ze),getListenerStats:()=>({})};return se(ze)};export{ie as createCheckpoints,he as createCustomPersister,ve as createFilePersister,le as createIndexes,Le as createLocalPersister,ue as createMetrics,Se as createRelationships,Ie as createRemotePersister,we as createSessionPersister,Ce as createStore,de as defaultSorter};
|
package/lib/tinybase.js.gz
CHANGED
|
Binary file
|
package/lib/umd/store.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var e,t;e=this,t=function(e){"use strict";const t=e=>typeof e,s=t(""),n=t(!0),r=t(0),l=t(t),o="type",a="default",d=(e,t)=>e.forEach(t),c=e=>e.length,i=e=>0==c(e),
|
|
1
|
+
var e,t;e=this,t=function(e){"use strict";const t=e=>typeof e,s=t(""),n=t(!0),r=t(0),l=t(t),o="type",a="default",d=(e,t)=>e.forEach(t),c=e=>e.length,i=e=>0==c(e),f=e=>e.slice(1),u=(e,t)=>e.push(t),h=e=>JSON.stringify(e,((e,t)=>{return T(t,Map)?(s=[...t],n=(e,[t,s])=>(e[t]=s,e),r={},s.reduce(n,r)):t;var s,n,r})),b=JSON.parse,p=isFinite,T=(e,t)=>e instanceof t,g=e=>null==e,y=(e,t,s)=>g(e)?s?.():t(e),w=e=>e==s||e==n,L=(e,t)=>e?.has(t)??!1,R=e=>g(e)||0==(e=>e.size)(e),C=e=>e.clear(),S=(e,t)=>e?.forEach(t),v=(e,t)=>e?.delete(t),I=e=>new Map(e),m=(e=I)=>[e(),e()],E=e=>[...e?.keys()??[]],J=(e,t)=>e?.get(t),O=(e,t)=>S(e,((e,s)=>t(s,e))),j=(e,t,s)=>g(s)?(v(e,t),e):e?.set(t,s),x=(e,t,s,n)=>(L(e,t)||(n?.(s),e.set(t,s)),J(e,t)),z=(e,t)=>{const s={},n=t??(e=>e);return S(e,((e,t)=>s[t]=n(e))),s},M=(e,t)=>{const s=I(),n=t??(e=>e);return S(e,((e,t)=>s.set(t,n(e)))),s},k=Object,F=k.keys,N=k.isFrozen,P=k.freeze,_=(e,t)=>!g(((e,t)=>y(e,(e=>e[t])))(e,t)),B=(e,t)=>delete e[t],q=(e,t)=>d(k.entries(e),(([e,s])=>t(s,e))),A=e=>i(F(e)),D=e=>new Set(e),G=(e,t)=>e?.add(t),H=(e,t,s)=>c(s)<2?G(i(s)?e:x(e,s[0],D()),t):H(x(e,s[0],I()),t,f(s)),K=e=>{const t=(s,n,...r)=>y(s,(s=>i(r)?e(s,n):d([r[0],null],(e=>t(J(s,e),n,...f(r))))));return t},Q=(e,t,s,n=j)=>{const r=(l=E(e),o=e=>!_(t,e),l.filter(o));var l,o;return d(F(t),(n=>s(e,n,t[n]))),d(r,(t=>n(e,t))),e},U=e=>{const s=t(e);return w(s)||s==r&&p(e)?s:void 0},V=(e,t,s)=>g(e)||!(e=>T(e,k)&&e.constructor==k)(e)||A(e)||N(e)?(s?.(),!1):(q(e,((s,n)=>{t(s,n)||B(e,n)})),!A(e)),W=(e,t,s)=>j(e,t,J(e,t)==-s?void 0:s);e.createStore=()=>{let e,s=0,n=0;const i=I(),f=I(),p=I(),T=I(),k=I(),F=I(),N=I(),A=I(),X=m(D),Y=m(D),Z=m(),$=m(),ee=m(),te=m(),se=m(),ne=m(),[re,le,oe,ae]=(e=>{let t,s=0;const n=[],r=I();return[(l,o,a=[])=>{t??=e();const d=n.pop()??""+s++;return j(r,d,[l,o,a]),H(o,d,a),d},(e,s=[],...n)=>K(S)(e,(e=>y(J(r,e),(([e])=>e(t,...s,...n)))),...s),e=>y(J(r,e),(([,t,s])=>(K(v)(t,e,...s),j(r,e),c(n)<1e3&&u(n,e),s)),(()=>[])),(e,s,n)=>y(J(r,e),(([e,,r])=>{const l=(...o)=>{const a=c(o);a==c(r)?e(t,...o,...n(o)):g(r[a])?d(s[a](...o),(e=>l(...o,e))):l(...o,r[a])};l()}))]})((()=>qe)),de=(t,s)=>(!e||L(F,s)||Ee(s))&&V(t,((e,t)=>ce(s,t,e)),(()=>Ee(s))),ce=(e,t,s,n)=>V(n?s:fe(s,e,t),((n,r)=>y(ie(e,t,r,n),(e=>(s[r]=e,!0)),(()=>!1))),(()=>Ee(e,t))),ie=(t,s,n,r)=>e?y(J(J(F,t),n),(e=>U(r)!=e.type?Ee(t,s,n,r,e.default):r),(()=>Ee(t,s,n,r))):g(U(r))?Ee(t,s,n,r):r,fe=(e,t,s)=>(y(J(N,t),(([n,r])=>{S(n,((t,s)=>{_(e,s)||(e[s]=t)})),S(r,(n=>{_(e,n)||Ee(t,s,n)}))})),e),ue=e=>Q(F,e,((e,t,s)=>{const n=I(),r=D();Q(x(F,t,I()),s,((e,t,s)=>{j(e,t,s),y(s.default,(e=>j(n,t,e)),(()=>G(r,t)))})),j(N,t,[n,r])}),((e,t)=>{j(F,t),j(N,t)})),he=e=>Q(A,e,((e,t,s)=>be(t,s)),((e,t)=>Le(t))),be=(e,t)=>Q(x(A,e,I(),(()=>Se(e,1))),t,((t,s,n)=>pe(e,t,s,n)),((t,s)=>Re(e,t,s))),pe=(e,t,s,n,r)=>Q(x(t,s,I(),(()=>ve(e,s,1))),n,((t,n,r)=>Te(e,s,t,n,r)),((n,l)=>Ce(e,t,s,n,l,r))),Te=(e,t,s,n,r)=>{L(s,n)||Ie(e,t,n,1);const l=J(s,n);r!==l&&(me(e,t,n,l),j(s,n,r))},ge=(e,t,s,n,r)=>y(J(t,s),(t=>Te(e,s,t,n,r)),(()=>pe(e,t,s,fe({[n]:r},e,s)))),ye=e=>{const t=""+s++;return L(e,t)?ye(e):t},we=e=>J(A,e)??be(e,{}),Le=e=>be(e,{}),Re=(e,t,s)=>pe(e,t,s,{},!0),Ce=(e,t,s,n,r,l)=>{const o=J(J(N,e)?.[0],r);if(!g(o)&&!l)return Te(e,s,n,r,o);const a=t=>{me(e,s,t,J(n,t)),Ie(e,s,t,-1),j(n,t)};g(o)?a(r):O(n,a),R(n)&&(ve(e,s,-1),R(j(t,s))&&(Se(e,-1),j(A,e)))},Se=(e,t)=>W(i,e,t),ve=(e,t,s)=>W(x(f,e,I()),t,s),Ie=(e,t,s,n)=>W(x(x(p,e,I()),t,I()),s,n),me=(e,t,s,n)=>x(x(x(T,e,I()),t,I()),s,n),Ee=(e,t,s,n,r)=>(u(x(x(x(k,e,I()),t,I()),s,[]),n),r),Je=(e,t,s)=>{const n=J(J(T,e),t),r=Ne(e,t,s);return L(n,s)?[!0,J(n,s),r]:[!1,r,r]},Oe=e=>R(k)||R(ne[e])?0:S(e?M(k,(e=>M(e,M))):k,((t,s)=>S(t,((t,n)=>S(t,((t,r)=>le(ne[e],[s,n,r],t))))))),je=e=>{if(!R(T)){const t=R(te[e])&&R($[e])&&R(Y[e]),s=R(se[e])&&R(ee[e])&&R(Z[e])&&R(X[e]);if(!t||!s){const n=e?[M(i),M(f,M),M(p,(e=>M(e,M))),M(T,(e=>M(e,M)))]:[i,f,p,T];if(t||(S(n[2],((t,s)=>S(t,((t,n)=>{R(t)||le(te[e],[s,n])})))),S(n[1],((t,s)=>{R(t)||le($[e],[s])})),R(n[0])||le(Y[e])),!s){let t;S(n[3],((s,n)=>{let r;S(s,((s,l)=>{let o;S(s,((s,a)=>{const d=Ne(n,l,a);d!==s&&(le(se[e],[n,l,a],d,s,Je),t=r=o=1)})),o&&le(ee[e],[n,l],Je)})),r&&le(Z[e],[n],Je)})),t&&le(X[e],[],Je)}}}},xe=e=>(Be(e),qe),ze=()=>z(A,(e=>z(e,z))),Me=()=>E(A),ke=e=>E(J(A,e)),Fe=(e,t)=>E(J(J(A,e),t)),Ne=(e,t,s)=>J(J(J(A,e),t),s),Pe=e=>xe((()=>(e=>V(e,de,Ee))(e)?he(e):0)),_e=()=>xe((()=>he({}))),Be=e=>{if(-1==n)return;n++;const t=e?.();return n--,0==n&&(n=1,Oe(1),je(1),n=-1,Oe(0),je(0),n=0,d([T,k,i,f,p],C)),t},qe={getTables:ze,getTableIds:Me,getTable:e=>z(J(A,e),z),getRowIds:ke,getRow:(e,t)=>z(J(J(A,e),t)),getCellIds:Fe,getCell:Ne,hasTables:()=>!R(A),hasTable:e=>L(A,e),hasRow:(e,t)=>L(J(A,e),t),hasCell:(e,t,s)=>L(J(J(A,e),t),s),getJson:()=>h(A),getSchemaJson:()=>h(F),setTables:Pe,setTable:(e,t)=>xe((()=>de(t,e)?be(e,t):0)),setRow:(e,t,s)=>xe((()=>ce(e,t,s)?pe(e,we(e),t,s):0)),addRow:(e,t)=>Be((()=>{let s;return ce(e,s,t)&&pe(e,we(e),s=ye(J(A,e)),t),s})),setPartialRow:(e,t,s)=>xe((()=>{if(ce(e,t,s,1)){const n=we(e);q(s,((s,r)=>ge(e,n,t,r,s)))}})),setCell:(e,s,n,r)=>xe((()=>y(ie(e,s,n,t(r)==l?r(Ne(e,s,n)):r),(t=>ge(e,we(e),s,n,t))))),setJson:e=>{try{"{}"===e?_e():Pe(b(e))}catch{}return qe},setSchema:t=>xe((()=>{if((e=(e=>V(e,(e=>V(e,(e=>{if(!V(e,((e,t)=>[o,a].includes(t))))return!1;const t=e.type;return!(!w(t)&&t!=r||(U(e.default)!=t&&B(e,a),0))})))))(t))&&(ue(t),!R(A))){const e=ze();_e(),Pe(e)}})),delTables:_e,delTable:e=>xe((()=>L(A,e)?Le(e):0)),delRow:(e,t)=>xe((()=>y(J(A,e),(s=>L(s,t)?Re(e,s,t):0)))),delCell:(e,t,s,n)=>xe((()=>y(J(A,e),(r=>y(J(r,t),(l=>L(l,s)?Ce(e,r,t,l,s,n):0)))))),delSchema:()=>xe((()=>{ue({}),e=!1})),transaction:Be,forEachTable:e=>S(A,((t,s)=>e(s,(e=>S(t,((t,s)=>e(s,(e=>O(t,e))))))))),forEachRow:(e,t)=>S(J(A,e),((e,s)=>t(s,(t=>O(e,t))))),forEachCell:(e,t,s)=>O(J(J(A,e),t),s),addTablesListener:(e,t)=>re(e,X[t?1:0]),addTableIdsListener:(e,t)=>re(e,Y[t?1:0]),addTableListener:(e,t,s)=>re(t,Z[s?1:0],[e]),addRowIdsListener:(e,t,s)=>re(t,$[s?1:0],[e]),addRowListener:(e,t,s,n)=>re(s,ee[n?1:0],[e,t]),addCellIdsListener:(e,t,s,n)=>re(s,te[n?1:0],[e,t]),addCellListener:(e,t,s,n,r)=>re(n,se[r?1:0],[e,t,s]),addInvalidCellListener:(e,t,s,n,r)=>re(n,ne[r?1:0],[e,t,s]),callListener:e=>(ae(e,[Me,ke,Fe],(e=>g(e[2])?[]:[,,].fill(Ne(...e)))),qe),delListener:e=>(oe(e),qe),getListenerStats:()=>({})};return P(qe)},Object.defineProperty(e,"__esModule",{value:!0})},"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).TinyBaseStore={});
|
package/lib/umd/store.js.gz
CHANGED
|
Binary file
|
package/lib/umd/tinybase.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var e,t;e=this,t=function(e,t){"use strict";const s=e=>typeof e,n="",o=s(n),r=s(!0),a=s(0),i=s(s),d="type",l="default",c="utf8",u=(e,t)=>e.includes(t),f=(e,t)=>e.every(((s,n)=>0==n||t(e[n-1],s)<=0)),h=(e,t)=>e.sort(t),g=(e,t)=>e.forEach(t),p=e=>v(e,((e,t)=>e+t),0),L=e=>e.length,w=e=>0==L(e),v=(e,t,s)=>e.reduce(t,s),I=e=>e.slice(1),y=(e,t)=>e.push(t),S=e=>e.pop(),R=e=>JSON.stringify(e,((e,t)=>k(t,Map)?v([...t],((e,[t,s])=>(e[t]=s,e)),{}):t)),T=JSON.parse,b=Math.max,C=Math.min,m=isFinite,k=(e,t)=>e instanceof t,E=e=>null==e,M=(e,t,s)=>E(e)?s?.():t(e),x=e=>e==o||e==r,A=e=>s(e)==i,P=()=>{},D=e=>e.size,J=(e,t)=>e?.has(t)??!1,F=e=>E(e)||0==D(e),O=e=>[...e?.values()??[]],j=e=>e.clear(),z=(e,t)=>e?.forEach(t),N=(e,t)=>e?.delete(t),B=e=>new Map(e),_=(e=B)=>[e(),e()],q=e=>[...e?.keys()??[]],H=(e,t)=>e?.get(t),W=(e,t)=>z(e,((e,s)=>t(s,e))),G=(e,t,s)=>E(s)?(N(e,t),e):e?.set(t,s),K=(e,t,s,n)=>(J(e,t)||(n?.(s),e.set(t,s)),H(e,t)),Q=(e,t)=>{const s={},n=t??(e=>e);return z(e,((e,t)=>s[t]=n(e))),s},U=(e,t)=>{const s=B(),n=t??(e=>e);return z(e,((e,t)=>s.set(t,n(e)))),s},V=e=>new Set(e),X=(e,t)=>e?.add(t),Y=(e,t,s)=>{const n=e.hasRow,o=B(),r=B(),a=B(),i=B(),d=B(),l=t=>M(H(d,t),(s=>{z(s,e.delListener),G(d,t)})),c=e=>{G(o,e),G(r,e),G(a,e),G(i,e),l(e)};return[()=>e,()=>q(o),e=>W(r,e),e=>J(r,e),e=>H(o,e),e=>H(r,e),(e,t)=>G(r,e,t),(c,u,f,h,p)=>{const L=B(),w=B();G(o,c,u),J(r,c)||(G(r,c,t()),G(a,c,B()),G(i,c,B()));const v=H(a,c),I=H(i,c),y=t=>{const o=s=>e.getCell(u,t,s),r=H(v,t),a=n(u,t)?s(h(o,t)):void 0;if(r!=a&&G(L,t,[r,a]),!E(p)){const e=H(I,t),s=n(u,t)?p(o,t):void 0;e!=s&&G(w,t,s)}},S=e=>{f((()=>{z(L,(([,e],t)=>G(v,t,e))),z(w,((e,t)=>G(I,t,e)))}),L,w,v,I,e),j(L),j(w)};W(v,y),e.hasTable(u)&&g(e.getRowIds(u),(e=>{J(v,e)||y(e)})),S(!0),l(c),G(d,c,V([e.addRowListener(u,null,((e,t,s)=>y(s))),e.addTableListener(u,(()=>S()))]))},c,()=>W(d,c)]},Z=(e,t)=>s(e)==o?t=>t(e):e??(()=>t??n),$=e=>{const t=new WeakMap;return s=>(t.has(s)||t.set(s,e(s)),t.get(s))},ee=(e,t,s)=>L(s)<2?X(w(s)?e:K(e,s[0],V()),t):ee(K(e,s[0],B()),t,I(s)),te=e=>{const t=(s,n,...o)=>M(s,(s=>w(o)?e(s,n):g([o[0],null],(e=>t(H(s,e),n,...I(o))))));return t},se=e=>{let t,s=0;const n=[],o=B();return[(r,a,i=[])=>{t??=e();const d=S(n)??""+s++;return G(o,d,[r,a,i]),ee(a,d,i),d},(e,s=[],...n)=>te(z)(e,(e=>M(H(o,e),(([e])=>e(t,...s,...n)))),...s),e=>M(H(o,e),(([,t,s])=>(te(N)(t,e,...s),G(o,e),L(n)<1e3&&y(n,e),s)),(()=>[])),(e,s,n)=>M(H(o,e),(([e,,o])=>{const r=(...a)=>{const i=L(a);i==L(o)?e(t,...a,...n(a)):E(o[i])?g(s[i](...a),(e=>r(...a,e))):r(...a,o[i])};r()}))]},ne=Object,oe=ne.keys,re=ne.isFrozen,ae=ne.freeze,ie=(e,t)=>!E(((e,t)=>M(e,(e=>e[t])))(e,t)),de=(e,t)=>delete e[t],le=(e,t)=>g(ne.entries(e),(([e,s])=>t(s,e))),ce=e=>w(oe(e)),ue=$((e=>{let t,s,n,o=100,r=B(),a=1;const i=V(),d=B(),[l,c,f]=se((()=>N)),h=B(),p=B(),v=[],I=[],R=(t,s)=>{a=0,e.transaction((()=>z(H(h,s),((s,n)=>z(s,((s,o)=>z(s,((s,r)=>E(s[t])?e.delCell(n,o,r,!0):e.setCell(n,o,r,s[t]))))))))),a=1},T=e=>{G(h,e),G(p,e),c(d,[e])},b=(e,t)=>g(((e,t)=>e.splice(0,t))(e,t??L(e)),T),C=()=>b(v,L(v)-o),m=e.addCellListener(null,null,null,((e,s,o,i,d,l)=>{if(a){M(t,(()=>{y(v,t),C(),b(I),t=void 0,n=1}));const e=K(r,s,B()),a=K(e,o,B()),c=K(a,i,[void 0,void 0],(e=>e[0]=l));c[1]=d,c[0]===c[1]&&F(G(a,i))&&F(G(e,o))&&F(G(r,s))&&(t=S(v),n=1),P()}})),k=(e="")=>(E(t)&&(t=""+s++,G(h,t,r),O(t,e),r=B(),n=1),t),x=()=>{w(v)||(I.unshift(k()),R(0,t),t=S(v),n=1)},A=()=>{w(I)||(y(v,t),t=I.shift(),R(1,t),n=1)},P=()=>{n&&(c(i),n=0)},D=e=>{const t=k(e);return P(),t},O=(e,t)=>(j(e)&&H(p,e)!==t&&(G(p,e,t),c(d,[e])),N),j=e=>J(h,e),N={setSize:e=>(o=e,C(),N),addCheckpoint:D,setCheckpoint:O,getStore:()=>e,getCheckpointIds:()=>[[...v],t,[...I]],forEachCheckpoint:e=>W(p,e),hasCheckpoint:j,getCheckpoint:e=>H(p,e),goBackward:()=>(x(),P(),N),goForward:()=>(A(),P(),N),goTo:e=>{const s=u(v,e)?x:u(I,e)?A:null;for(;!E(s)&&e!=t;)s();return P(),N},addCheckpointIdsListener:e=>l(e,i),addCheckpointListener:(e,t)=>l(t,d,[e]),delListener:e=>(f(e),N),clear:()=>(b(v),b(I),E(t)||T(t),t=void 0,s=0,D(),N),destroy:()=>{e.delListener(m)},getListenerStats:()=>({})};return ae(N.clear())})),fe=(e,t)=>e<t?-1:1,he=$((e=>{const t=B(),s=B(),[o,r,a,i,d,l,c,u,g,p]=Y(e,B,(e=>E(e)?n:e+n)),[L,w,v]=se((()=>y)),I=(t,s,n)=>{const o=d(t);z(n,((t,n)=>s(n,(s=>z(t,(t=>s(t,(s=>e.forEachCell(o,t,s)))))))))},y={setIndexDefinition:(e,n,o,r,a,i=fe)=>{const d=E(a)?void 0:([e],[t])=>a(e,t);return u(e,n,((n,o,a,u,g,p)=>{let L=0;const v=V(),I=V(),y=l(e);if(z(o,(([e,t],s)=>{E(e)||(X(v,e),M(H(y,e),(t=>{N(t,s),F(t)&&(G(y,e),L=1)}))),E(t)||(X(v,t),J(y,t)||(G(y,t,V()),L=1),X(H(y,t),s),E(r)||X(I,t))})),n(),F(g)||(p?W(y,(e=>X(I,e))):W(a,(e=>M(H(u,e),(e=>X(I,e))))),z(I,(e=>{const t=(t,s)=>i(H(g,t),H(g,s),e),s=[...H(y,e)];f(s,t)||(G(y,e,V(h(s,t))),X(v,e))}))),(L||p)&&!E(d)){const t=[...y];f(t,d)||(c(e,B(h(t,d))),L=1)}L&&w(t,[e]),z(v,(t=>w(s,[e,t])))}),Z(o),M(r,Z)),y},delIndexDefinition:e=>(g(e),y),getStore:o,getIndexIds:r,forEachIndex:e=>a(((t,s)=>e(t,(e=>I(t,e,s))))),forEachSlice:(e,t)=>I(e,t,l(e)),hasIndex:i,hasSlice:(e,t)=>J(l(e),t),getTableId:d,getSliceIds:e=>q(l(e)),getSliceRowIds:(e,t)=>O(H(l(e),t)),addSliceIdsListener:(e,s)=>L(s,t,[e]),addSliceRowIdsListener:(e,t,n)=>L(n,s,[e,t]),delListener:e=>(v(e),y),destroy:p,getListenerStats:()=>({})};return ae(y)})),ge=B([["avg",[(e,t)=>p(e)/t,(e,t,s)=>e+(t-e)/(s+1),(e,t,s)=>e+(e-t)/(s-1),(e,t,s,n)=>e+(t-s)/n]],["max",[e=>b(...e),(e,t)=>b(t,e),(e,t)=>t==e?void 0:e,(e,t,s)=>s==e?void 0:b(t,e)]],["min",[e=>C(...e),(e,t)=>C(t,e),(e,t)=>t==e?void 0:e,(e,t,s)=>s==e?void 0:C(t,e)]],["sum",[e=>p(e),(e,t)=>e+t,(e,t)=>e-t,(e,t,s)=>e-s+t]]]),pe=$((e=>{const t=B(),[s,o,r,a,i,d,l,c,u,f]=Y(e,P,(e=>isNaN(e)||E(e)||!0===e||!1===e||e===n?void 0:1*e)),[h,g,p]=se((()=>L)),L={setMetricDefinition:(e,s,n,o,r,a,i)=>{const u=A(n)?[n,r,a,i]:H(ge,n)??H(ge,"sum");return c(e,s,((s,n,o,r,a,i)=>{let c=d(e),f=D(r);const[h,p,L,w]=u;i=i||E(c),z(n,(([e,t])=>{i||(c=E(e)?p?.(c,t,f++):E(t)?L?.(c,e,f--):w?.(c,t,e,f)),i=i||E(c)})),s(),F(r)?c=void 0:i&&(c=h(O(r),D(r))),m(c)||(c=void 0);const v=d(e);c!=v&&(l(e,c),g(t,[e],c,v))}),Z(o,1)),L},delMetricDefinition:e=>(u(e),L),getStore:s,getMetricIds:o,forEachMetric:r,hasMetric:a,getTableId:i,getMetric:d,addMetricListener:(e,s)=>h(s,t,[e]),delListener:e=>(p(e),L),destroy:f,getListenerStats:()=>({})};return ae(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();E(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:()=>(M(r,e.delListener),i),getStore:()=>e,destroy:()=>i.stopAutoLoad().stopAutoSave(),getStats:()=>({})};return ae(i)},we="storage",ve=globalThis.window,Ie=(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()},ve.addEventListener(we,n)}),(()=>{ve.removeEventListener(we,n),n=void 0}))},ye=e=>e.headers.get("ETag"),Se=$((e=>{const t=B(),s=B(),o=B(),r=B(),[a,i,d,l,c,u,f,h,g,p]=Y(e,(()=>[B(),B(),B(),B()]),(e=>E(e)?void 0:e+n)),[L,w,v]=se((()=>R)),I=(e,t,s)=>M(u(e),(([n,,o])=>{if(!J(o,t)){const r=V();if(c(e)!=S(e))X(r,t);else{let e=t;for(;!E(e)&&!J(r,e);)X(r,e),e=H(n,e)}if(s)return r;G(o,t,r)}return H(o,t)})),y=(e,t)=>M(u(e),(([,,e])=>G(e,t))),S=e=>H(t,e),R={setRelationshipDefinition:(e,n,a,i)=>(G(t,e,a),h(e,n,((t,n)=>{const a=V(),i=V(),d=V(),[l,c]=u(e);z(n,(([t,s],n)=>{E(t)||(X(i,t),M(H(c,t),(e=>{N(e,n),F(e)&&G(c,t)}))),E(s)||(X(i,s),J(c,s)||G(c,s,V()),X(H(c,s),n)),X(a,n),G(l,n,s),W(H(r,e),(t=>{J(I(e,t),n)&&X(d,t)}))})),t(),z(a,(t=>w(s,[e,t]))),z(i,(t=>w(o,[e,t]))),z(d,(t=>{y(e,t),w(r,[e,t])}))}),Z(i)),R),delRelationshipDefinition:e=>(G(t,e),g(e),R),getStore:a,getRelationshipIds:i,forEachRelationship:t=>d((s=>t(s,(t=>e.forEachRow(c(s),t))))),hasRelationship:l,getLocalTableId:c,getRemoteTableId:S,getRemoteRowId:(e,t)=>H(u(e)?.[0],t),getLocalRowIds:(e,t)=>O(H(u(e)?.[1],t)),getLinkedRowIds:(e,t)=>E(u(e))?[t]:O(I(e,t,!0)),addRemoteRowIdListener:(e,t,n)=>L(n,s,[e,t]),addLocalRowIdsListener:(e,t,s)=>L(s,o,[e,t]),addLinkedRowIdsListener:(e,t,s)=>(I(e,t),L(s,r,[e,t])),delListener:e=>(y(...v(e)),R),destroy:p,getListenerStats:()=>({})};return ae(R)})),Re=(e,t,s,n=G)=>{const o=(r=q(e),a=e=>!ie(t,e),r.filter(a));var r,a;return g(oe(t),(n=>s(e,n,t[n]))),g(o,(t=>n(e,t))),e},Te=e=>{const t=s(e);return x(t)||t==a&&m(e)?t:void 0},be=(e,t,s)=>E(e)||!(e=>k(e,ne)&&e.constructor==ne)(e)||ce(e)||re(e)?(s?.(),!1):(le(e,((s,n)=>{t(s,n)||de(e,n)})),!ce(e)),Ce=(e,t,s)=>G(e,t,H(e,t)==-s?void 0:s);e.createCheckpoints=ue,e.createCustomPersister=Le,e.createFilePersister=(e,s)=>{let n;return Le(e,(async()=>{try{return await t.promises.readFile(s,c)}catch{}}),(async e=>{try{await t.promises.writeFile(s,e,c)}catch{}}),(e=>{n=t.watch(s,e)}),(()=>{n?.close(),n=void 0}))},e.createIndexes=he,e.createLocalPersister=(e,t)=>Ie(e,t,localStorage),e.createMetrics=pe,e.createRelationships=Se,e.createRemotePersister=(e,t,s,n)=>{let o,r;return Le(e,(async()=>{const e=await fetch(t);return r=ye(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=ye(s);E(r)||E(n)||n==r||(r=n,e())}),1e3*n)}),(()=>{M(o,clearInterval),o=void 0}))},e.createSessionPersister=(e,t)=>Ie(e,t,sessionStorage),e.createStore=()=>{let e,t=0,s=0;const n=B(),o=B(),r=B(),i=B(),c=B(),f=B(),h=B(),p=B(),L=_(V),w=_(V),v=_(),I=_(),S=_(),b=_(),C=_(),m=_(),[k,P,D,O]=se((()=>Oe)),N=(t,s)=>(!e||J(f,s)||Ie(s))&&be(t,((e,t)=>X(s,t,e)),(()=>Ie(s))),X=(e,t,s,n)=>be(n?s:Z(s,e),((n,o)=>M(Y(e,t,o,n),(e=>(s[o]=e,!0)),(()=>!1))),(()=>Ie(e,t))),Y=(t,s,n,o)=>e?M(H(H(f,t),n),(e=>Te(o)!=e.type?Ie(t,s,n,o,e.default):o),(()=>Ie(t,s,n,o))):E(Te(o))?Ie(t,s,n,o):o,Z=(e,t)=>(M(H(h,t),(t=>le(t,((t,s)=>{ie(e,s)||(e[s]=t)})))),e),$=e=>Re(f,e,((e,t,s)=>{const n={};Re(K(f,t,B()),s,((e,t,s)=>{G(e,t,s),M(s.default,(e=>n[t]=e))})),G(h,t,n)}),((e,t)=>{G(f,t),G(h,t)})),ee=e=>Re(p,e,((e,t,s)=>te(t,s)),((e,t)=>fe(t))),te=(e,t)=>Re(K(p,e,B(),(()=>pe(e,1))),t,((t,s,n)=>ne(e,t,s,n)),((t,s)=>he(e,t,s))),ne=(e,t,s,n,o)=>Re(K(t,s,B(),(()=>Le(e,s,1))),n,((t,n,o)=>oe(e,s,t,n,o)),((n,r)=>ge(e,t,s,n,r,o))),oe=(e,t,s,n,o)=>{J(s,n)||we(e,t,n,1);const r=H(s,n);o!==r&&(ve(e,t,n,r),G(s,n,o))},re=(e,t,s,n,o)=>M(H(t,s),(t=>oe(e,s,t,n,o)),(()=>ne(e,t,s,Z({[n]:o},e)))),ce=e=>{const s=""+t++;return J(e,s)?ce(e):s},ue=e=>H(p,e)??te(e,{}),fe=e=>te(e,{}),he=(e,t,s)=>ne(e,t,s,{},!0),ge=(e,t,s,n,o,r)=>{const a=H(h,e)?.[o];if(!E(a)&&!r)return oe(e,s,n,o,a);const i=t=>{ve(e,s,t,H(n,t)),we(e,s,t,-1),G(n,t)};E(a)?i(o):W(n,i),F(n)&&(Le(e,s,-1),F(G(t,s))&&(pe(e,-1),G(p,e)))},pe=(e,t)=>Ce(n,e,t),Le=(e,t,s)=>Ce(K(o,e,B()),t,s),we=(e,t,s,n)=>Ce(K(K(r,e,B()),t,B()),s,n),ve=(e,t,s,n)=>K(K(K(i,e,B()),t,B()),s,n),Ie=(e,t,s,n,o)=>(y(K(K(K(c,e,B()),t,B()),s,[]),n),o),ye=(e,t,s)=>{const n=H(H(i,e),t),o=Pe(e,t,s);return J(n,s)?[!0,H(n,s),o]:[!1,o,o]},Se=e=>F(c)||F(m[e])?0:z(e?U(c,(e=>U(e,U))):c,((t,s)=>z(t,((t,n)=>z(t,((t,o)=>P(m[e],[s,n,o],t))))))),me=e=>{let t,s;if(!(F(i)||(t=F(b[e])&&F(I[e])&&F(w[e]))&&(s=F(C[e])&&F(S[e])&&F(v[e])&&F(L[e])))){const a=e?[U(n),U(o,U),U(r,(e=>U(e,U))),U(i,(e=>U(e,U)))]:[n,o,r,i];if(t||(z(a[2],((t,s)=>z(t,((t,n)=>{F(t)||P(b[e],[s,n])})))),z(a[1],((t,s)=>{F(t)||P(I[e],[s])})),F(a[0])||P(w[e])),!s){let t;z(a[3],((s,n)=>{let o;z(s,((s,r)=>{let a;z(s,((s,i)=>{const d=Pe(n,r,i);d!==s&&(P(C[e],[n,r,i],d,s,ye),t=o=a=1)})),a&&P(S[e],[n,r],ye)})),o&&P(v[e],[n],ye)})),t&&P(L[e],[],ye)}}},ke=e=>(Fe(e),Oe),Ee=()=>Q(p,(e=>Q(e,Q))),Me=()=>q(p),xe=e=>q(H(p,e)),Ae=(e,t)=>q(H(H(p,e),t)),Pe=(e,t,s)=>H(H(H(p,e),t),s),De=e=>ke((()=>(e=>be(e,N,Ie))(e)?ee(e):0)),Je=()=>ke((()=>ee({}))),Fe=e=>{if(-1==s)return;s++;const t=e?.();return s--,0==s&&(s=1,Se(1),me(1),s=-1,Se(0),me(0),s=0,g([i,c,n,o,r],j)),t},Oe={getTables:Ee,getTableIds:Me,getTable:e=>Q(H(p,e),Q),getRowIds:xe,getRow:(e,t)=>Q(H(H(p,e),t)),getCellIds:Ae,getCell:Pe,hasTables:()=>!F(p),hasTable:e=>J(p,e),hasRow:(e,t)=>J(H(p,e),t),hasCell:(e,t,s)=>J(H(H(p,e),t),s),getJson:()=>R(p),getSchemaJson:()=>R(f),setTables:De,setTable:(e,t)=>ke((()=>N(t,e)?te(e,t):0)),setRow:(e,t,s)=>ke((()=>X(e,t,s)?ne(e,ue(e),t,s):0)),addRow:(e,t)=>Fe((()=>{let s;return X(e,s,t)&&ne(e,ue(e),s=ce(H(p,e)),t),s})),setPartialRow:(e,t,s)=>ke((()=>{if(X(e,t,s,1)){const n=ue(e);le(s,((s,o)=>re(e,n,t,o,s)))}})),setCell:(e,t,s,n)=>ke((()=>M(Y(e,t,s,A(n)?n(Pe(e,t,s)):n),(n=>re(e,ue(e),t,s,n))))),setJson:e=>{try{"{}"===e?Je():De(T(e))}catch{}return Oe},setSchema:t=>ke((()=>{if((e=(e=>be(e,(e=>be(e,(e=>{if(!be(e,((e,t)=>u([d,l],t))))return!1;const t=e.type;return!(!x(t)&&t!=a||(Te(e.default)!=t&&de(e,l),0))})))))(t))&&($(t),!F(p))){const e=Ee();Je(),De(e)}})),delTables:Je,delTable:e=>ke((()=>J(p,e)?fe(e):0)),delRow:(e,t)=>ke((()=>M(H(p,e),(s=>J(s,t)?he(e,s,t):0)))),delCell:(e,t,s,n)=>ke((()=>M(H(p,e),(o=>M(H(o,t),(r=>J(r,s)?ge(e,o,t,r,s,n):0)))))),delSchema:()=>ke((()=>{$({}),e=!1})),transaction:Fe,forEachTable:e=>z(p,((t,s)=>e(s,(e=>z(t,((t,s)=>e(s,(e=>W(t,e))))))))),forEachRow:(e,t)=>z(H(p,e),((e,s)=>t(s,(t=>W(e,t))))),forEachCell:(e,t,s)=>W(H(H(p,e),t),s),addTablesListener:(e,t)=>k(e,L[t?1:0]),addTableIdsListener:(e,t)=>k(e,w[t?1:0]),addTableListener:(e,t,s)=>k(t,v[s?1:0],[e]),addRowIdsListener:(e,t,s)=>k(t,I[s?1:0],[e]),addRowListener:(e,t,s,n)=>k(s,S[n?1:0],[e,t]),addCellIdsListener:(e,t,s,n)=>k(s,b[n?1:0],[e,t]),addCellListener:(e,t,s,n,o)=>k(n,C[o?1:0],[e,t,s]),addInvalidCellListener:(e,t,s,n,o)=>k(n,m[o?1:0],[e,t,s]),callListener:e=>(O(e,[Me,xe,Ae],(e=>E(e[2])?[]:[,,].fill(Pe(...e)))),Oe),delListener:e=>(D(e),Oe),getListenerStats:()=>({})};return ae(Oe)},e.defaultSorter=fe,Object.defineProperty(e,"__esModule",{value:!0})},"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("fs")):"function"==typeof define&&define.amd?define(["exports","fs"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).TinyBase={},e.fs);
|
|
1
|
+
var e,t;e=this,t=function(e,t){"use strict";const s=e=>typeof e,n="",o=s(n),r=s(!0),a=s(0),i=s(s),d="type",l="default",c="utf8",u=(e,t)=>e.includes(t),f=(e,t)=>e.every(((s,n)=>0==n||t(e[n-1],s)<=0)),h=(e,t)=>e.sort(t),g=(e,t)=>e.forEach(t),p=e=>v(e,((e,t)=>e+t),0),L=e=>e.length,w=e=>0==L(e),v=(e,t,s)=>e.reduce(t,s),I=e=>e.slice(1),y=(e,t)=>e.push(t),S=e=>e.pop(),R=e=>JSON.stringify(e,((e,t)=>k(t,Map)?v([...t],((e,[t,s])=>(e[t]=s,e)),{}):t)),T=JSON.parse,b=Math.max,C=Math.min,m=isFinite,k=(e,t)=>e instanceof t,E=e=>null==e,M=(e,t,s)=>E(e)?s?.():t(e),x=e=>e==o||e==r,A=e=>s(e)==i,P=()=>{},D=e=>e.size,J=(e,t)=>e?.has(t)??!1,F=e=>E(e)||0==D(e),O=e=>[...e?.values()??[]],j=e=>e.clear(),z=(e,t)=>e?.forEach(t),N=(e,t)=>e?.delete(t),B=e=>new Map(e),_=(e=B)=>[e(),e()],q=e=>[...e?.keys()??[]],H=(e,t)=>e?.get(t),W=(e,t)=>z(e,((e,s)=>t(s,e))),G=(e,t,s)=>E(s)?(N(e,t),e):e?.set(t,s),K=(e,t,s,n)=>(J(e,t)||(n?.(s),e.set(t,s)),H(e,t)),Q=(e,t)=>{const s={},n=t??(e=>e);return z(e,((e,t)=>s[t]=n(e))),s},U=(e,t)=>{const s=B(),n=t??(e=>e);return z(e,((e,t)=>s.set(t,n(e)))),s},V=e=>new Set(e),X=(e,t)=>e?.add(t),Y=(e,t,s)=>{const n=e.hasRow,o=B(),r=B(),a=B(),i=B(),d=B(),l=t=>M(H(d,t),(s=>{z(s,e.delListener),G(d,t)})),c=e=>{G(o,e),G(r,e),G(a,e),G(i,e),l(e)};return[()=>e,()=>q(o),e=>W(r,e),e=>J(r,e),e=>H(o,e),e=>H(r,e),(e,t)=>G(r,e,t),(c,u,f,h,p)=>{const L=B(),w=B();G(o,c,u),J(r,c)||(G(r,c,t()),G(a,c,B()),G(i,c,B()));const v=H(a,c),I=H(i,c),y=t=>{const o=s=>e.getCell(u,t,s),r=H(v,t),a=n(u,t)?s(h(o,t)):void 0;if(r!=a&&G(L,t,[r,a]),!E(p)){const e=H(I,t),s=n(u,t)?p(o,t):void 0;e!=s&&G(w,t,s)}},S=e=>{f((()=>{z(L,(([,e],t)=>G(v,t,e))),z(w,((e,t)=>G(I,t,e)))}),L,w,v,I,e),j(L),j(w)};W(v,y),e.hasTable(u)&&g(e.getRowIds(u),(e=>{J(v,e)||y(e)})),S(!0),l(c),G(d,c,V([e.addRowListener(u,null,((e,t,s)=>y(s))),e.addTableListener(u,(()=>S()))]))},c,()=>W(d,c)]},Z=(e,t)=>s(e)==o?t=>t(e):e??(()=>t??n),$=e=>{const t=new WeakMap;return s=>(t.has(s)||t.set(s,e(s)),t.get(s))},ee=(e,t,s)=>L(s)<2?X(w(s)?e:K(e,s[0],V()),t):ee(K(e,s[0],B()),t,I(s)),te=e=>{const t=(s,n,...o)=>M(s,(s=>w(o)?e(s,n):g([o[0],null],(e=>t(H(s,e),n,...I(o))))));return t},se=e=>{let t,s=0;const n=[],o=B();return[(r,a,i=[])=>{t??=e();const d=S(n)??""+s++;return G(o,d,[r,a,i]),ee(a,d,i),d},(e,s=[],...n)=>te(z)(e,(e=>M(H(o,e),(([e])=>e(t,...s,...n)))),...s),e=>M(H(o,e),(([,t,s])=>(te(N)(t,e,...s),G(o,e),L(n)<1e3&&y(n,e),s)),(()=>[])),(e,s,n)=>M(H(o,e),(([e,,o])=>{const r=(...a)=>{const i=L(a);i==L(o)?e(t,...a,...n(a)):E(o[i])?g(s[i](...a),(e=>r(...a,e))):r(...a,o[i])};r()}))]},ne=Object,oe=ne.keys,re=ne.isFrozen,ae=ne.freeze,ie=(e,t)=>!E(((e,t)=>M(e,(e=>e[t])))(e,t)),de=(e,t)=>delete e[t],le=(e,t)=>g(ne.entries(e),(([e,s])=>t(s,e))),ce=e=>w(oe(e)),ue=$((e=>{let t,s,n,o=100,r=B(),a=1;const i=V(),d=B(),[l,c,f]=se((()=>N)),h=B(),p=B(),v=[],I=[],R=(t,s)=>{a=0,e.transaction((()=>z(H(h,s),((s,n)=>z(s,((s,o)=>z(s,((s,r)=>E(s[t])?e.delCell(n,o,r,!0):e.setCell(n,o,r,s[t]))))))))),a=1},T=e=>{G(h,e),G(p,e),c(d,[e])},b=(e,t)=>g(((e,t)=>e.splice(0,t))(e,t??L(e)),T),C=()=>b(v,L(v)-o),m=e.addCellListener(null,null,null,((e,s,o,i,d,l)=>{if(a){M(t,(()=>{y(v,t),C(),b(I),t=void 0,n=1}));const e=K(r,s,B()),a=K(e,o,B()),c=K(a,i,[void 0,void 0],(e=>e[0]=l));c[1]=d,c[0]===c[1]&&F(G(a,i))&&F(G(e,o))&&F(G(r,s))&&(t=S(v),n=1),P()}})),k=(e="")=>(E(t)&&(t=""+s++,G(h,t,r),O(t,e),r=B(),n=1),t),x=()=>{w(v)||(I.unshift(k()),R(0,t),t=S(v),n=1)},A=()=>{w(I)||(y(v,t),t=I.shift(),R(1,t),n=1)},P=()=>{n&&(c(i),n=0)},D=e=>{const t=k(e);return P(),t},O=(e,t)=>(j(e)&&H(p,e)!==t&&(G(p,e,t),c(d,[e])),N),j=e=>J(h,e),N={setSize:e=>(o=e,C(),N),addCheckpoint:D,setCheckpoint:O,getStore:()=>e,getCheckpointIds:()=>[[...v],t,[...I]],forEachCheckpoint:e=>W(p,e),hasCheckpoint:j,getCheckpoint:e=>H(p,e),goBackward:()=>(x(),P(),N),goForward:()=>(A(),P(),N),goTo:e=>{const s=u(v,e)?x:u(I,e)?A:null;for(;!E(s)&&e!=t;)s();return P(),N},addCheckpointIdsListener:e=>l(e,i),addCheckpointListener:(e,t)=>l(t,d,[e]),delListener:e=>(f(e),N),clear:()=>(b(v),b(I),E(t)||T(t),t=void 0,s=0,D(),N),destroy:()=>{e.delListener(m)},getListenerStats:()=>({})};return ae(N.clear())})),fe=(e,t)=>e<t?-1:1,he=$((e=>{const t=B(),s=B(),[o,r,a,i,d,l,c,u,g,p]=Y(e,B,(e=>E(e)?n:e+n)),[L,w,v]=se((()=>y)),I=(t,s,n)=>{const o=d(t);z(n,((t,n)=>s(n,(s=>z(t,(t=>s(t,(s=>e.forEachCell(o,t,s)))))))))},y={setIndexDefinition:(e,n,o,r,a,i=fe)=>{const d=E(a)?void 0:([e],[t])=>a(e,t);return u(e,n,((n,o,a,u,g,p)=>{let L=0;const v=V(),I=V(),y=l(e);if(z(o,(([e,t],s)=>{E(e)||(X(v,e),M(H(y,e),(t=>{N(t,s),F(t)&&(G(y,e),L=1)}))),E(t)||(X(v,t),J(y,t)||(G(y,t,V()),L=1),X(H(y,t),s),E(r)||X(I,t))})),n(),F(g)||(p?W(y,(e=>X(I,e))):W(a,(e=>M(H(u,e),(e=>X(I,e))))),z(I,(e=>{const t=(t,s)=>i(H(g,t),H(g,s),e),s=[...H(y,e)];f(s,t)||(G(y,e,V(h(s,t))),X(v,e))}))),(L||p)&&!E(d)){const t=[...y];f(t,d)||(c(e,B(h(t,d))),L=1)}L&&w(t,[e]),z(v,(t=>w(s,[e,t])))}),Z(o),M(r,Z)),y},delIndexDefinition:e=>(g(e),y),getStore:o,getIndexIds:r,forEachIndex:e=>a(((t,s)=>e(t,(e=>I(t,e,s))))),forEachSlice:(e,t)=>I(e,t,l(e)),hasIndex:i,hasSlice:(e,t)=>J(l(e),t),getTableId:d,getSliceIds:e=>q(l(e)),getSliceRowIds:(e,t)=>O(H(l(e),t)),addSliceIdsListener:(e,s)=>L(s,t,[e]),addSliceRowIdsListener:(e,t,n)=>L(n,s,[e,t]),delListener:e=>(v(e),y),destroy:p,getListenerStats:()=>({})};return ae(y)})),ge=B([["avg",[(e,t)=>p(e)/t,(e,t,s)=>e+(t-e)/(s+1),(e,t,s)=>e+(e-t)/(s-1),(e,t,s,n)=>e+(t-s)/n]],["max",[e=>b(...e),(e,t)=>b(t,e),(e,t)=>t==e?void 0:e,(e,t,s)=>s==e?void 0:b(t,e)]],["min",[e=>C(...e),(e,t)=>C(t,e),(e,t)=>t==e?void 0:e,(e,t,s)=>s==e?void 0:C(t,e)]],["sum",[e=>p(e),(e,t)=>e+t,(e,t)=>e-t,(e,t,s)=>e-s+t]]]),pe=$((e=>{const t=B(),[s,o,r,a,i,d,l,c,u,f]=Y(e,P,(e=>isNaN(e)||E(e)||!0===e||!1===e||e===n?void 0:1*e)),[h,g,p]=se((()=>L)),L={setMetricDefinition:(e,s,n,o,r,a,i)=>{const u=A(n)?[n,r,a,i]:H(ge,n)??H(ge,"sum");return c(e,s,((s,n,o,r,a,i)=>{let c=d(e),f=D(r);const[h,p,L,w]=u;i=i||E(c),z(n,(([e,t])=>{i||(c=E(e)?p?.(c,t,f++):E(t)?L?.(c,e,f--):w?.(c,t,e,f)),i=i||E(c)})),s(),F(r)?c=void 0:i&&(c=h(O(r),D(r))),m(c)||(c=void 0);const v=d(e);c!=v&&(l(e,c),g(t,[e],c,v))}),Z(o,1)),L},delMetricDefinition:e=>(u(e),L),getStore:s,getMetricIds:o,forEachMetric:r,hasMetric:a,getTableId:i,getMetric:d,addMetricListener:(e,s)=>h(s,t,[e]),delListener:e=>(p(e),L),destroy:f,getListenerStats:()=>({})};return ae(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();E(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:()=>(M(r,e.delListener),i),getStore:()=>e,destroy:()=>i.stopAutoLoad().stopAutoSave(),getStats:()=>({})};return ae(i)},we="storage",ve=globalThis.window,Ie=(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()},ve.addEventListener(we,n)}),(()=>{ve.removeEventListener(we,n),n=void 0}))},ye=e=>e.headers.get("ETag"),Se=$((e=>{const t=B(),s=B(),o=B(),r=B(),[a,i,d,l,c,u,f,h,g,p]=Y(e,(()=>[B(),B(),B(),B()]),(e=>E(e)?void 0:e+n)),[L,w,v]=se((()=>R)),I=(e,t,s)=>M(u(e),(([n,,o])=>{if(!J(o,t)){const r=V();if(c(e)!=S(e))X(r,t);else{let e=t;for(;!E(e)&&!J(r,e);)X(r,e),e=H(n,e)}if(s)return r;G(o,t,r)}return H(o,t)})),y=(e,t)=>M(u(e),(([,,e])=>G(e,t))),S=e=>H(t,e),R={setRelationshipDefinition:(e,n,a,i)=>(G(t,e,a),h(e,n,((t,n)=>{const a=V(),i=V(),d=V(),[l,c]=u(e);z(n,(([t,s],n)=>{E(t)||(X(i,t),M(H(c,t),(e=>{N(e,n),F(e)&&G(c,t)}))),E(s)||(X(i,s),J(c,s)||G(c,s,V()),X(H(c,s),n)),X(a,n),G(l,n,s),W(H(r,e),(t=>{J(I(e,t),n)&&X(d,t)}))})),t(),z(a,(t=>w(s,[e,t]))),z(i,(t=>w(o,[e,t]))),z(d,(t=>{y(e,t),w(r,[e,t])}))}),Z(i)),R),delRelationshipDefinition:e=>(G(t,e),g(e),R),getStore:a,getRelationshipIds:i,forEachRelationship:t=>d((s=>t(s,(t=>e.forEachRow(c(s),t))))),hasRelationship:l,getLocalTableId:c,getRemoteTableId:S,getRemoteRowId:(e,t)=>H(u(e)?.[0],t),getLocalRowIds:(e,t)=>O(H(u(e)?.[1],t)),getLinkedRowIds:(e,t)=>E(u(e))?[t]:O(I(e,t,!0)),addRemoteRowIdListener:(e,t,n)=>L(n,s,[e,t]),addLocalRowIdsListener:(e,t,s)=>L(s,o,[e,t]),addLinkedRowIdsListener:(e,t,s)=>(I(e,t),L(s,r,[e,t])),delListener:e=>(y(...v(e)),R),destroy:p,getListenerStats:()=>({})};return ae(R)})),Re=(e,t,s,n=G)=>{const o=(r=q(e),a=e=>!ie(t,e),r.filter(a));var r,a;return g(oe(t),(n=>s(e,n,t[n]))),g(o,(t=>n(e,t))),e},Te=e=>{const t=s(e);return x(t)||t==a&&m(e)?t:void 0},be=(e,t,s)=>E(e)||!(e=>k(e,ne)&&e.constructor==ne)(e)||ce(e)||re(e)?(s?.(),!1):(le(e,((s,n)=>{t(s,n)||de(e,n)})),!ce(e)),Ce=(e,t,s)=>G(e,t,H(e,t)==-s?void 0:s);e.createCheckpoints=ue,e.createCustomPersister=Le,e.createFilePersister=(e,s)=>{let n;return Le(e,(async()=>{try{return await t.promises.readFile(s,c)}catch{}}),(async e=>{try{await t.promises.writeFile(s,e,c)}catch{}}),(e=>{n=t.watch(s,e)}),(()=>{n?.close(),n=void 0}))},e.createIndexes=he,e.createLocalPersister=(e,t)=>Ie(e,t,localStorage),e.createMetrics=pe,e.createRelationships=Se,e.createRemotePersister=(e,t,s,n)=>{let o,r;return Le(e,(async()=>{const e=await fetch(t);return r=ye(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=ye(s);E(r)||E(n)||n==r||(r=n,e())}),1e3*n)}),(()=>{M(o,clearInterval),o=void 0}))},e.createSessionPersister=(e,t)=>Ie(e,t,sessionStorage),e.createStore=()=>{let e,t=0,s=0;const n=B(),o=B(),r=B(),i=B(),c=B(),f=B(),h=B(),p=B(),L=_(V),w=_(V),v=_(),I=_(),S=_(),b=_(),C=_(),m=_(),[k,P,D,O]=se((()=>je)),N=(t,s)=>(!e||J(f,s)||ye(s))&&be(t,((e,t)=>Y(s,t,e)),(()=>ye(s))),Y=(e,t,s,n)=>be(n?s:$(s,e,t),((n,o)=>M(Z(e,t,o,n),(e=>(s[o]=e,!0)),(()=>!1))),(()=>ye(e,t))),Z=(t,s,n,o)=>e?M(H(H(f,t),n),(e=>Te(o)!=e.type?ye(t,s,n,o,e.default):o),(()=>ye(t,s,n,o))):E(Te(o))?ye(t,s,n,o):o,$=(e,t,s)=>(M(H(h,t),(([n,o])=>{z(n,((t,s)=>{ie(e,s)||(e[s]=t)})),z(o,(n=>{ie(e,n)||ye(t,s,n)}))})),e),ee=e=>Re(f,e,((e,t,s)=>{const n=B(),o=V();Re(K(f,t,B()),s,((e,t,s)=>{G(e,t,s),M(s.default,(e=>G(n,t,e)),(()=>X(o,t)))})),G(h,t,[n,o])}),((e,t)=>{G(f,t),G(h,t)})),te=e=>Re(p,e,((e,t,s)=>ne(t,s)),((e,t)=>he(t))),ne=(e,t)=>Re(K(p,e,B(),(()=>Le(e,1))),t,((t,s,n)=>oe(e,t,s,n)),((t,s)=>ge(e,t,s))),oe=(e,t,s,n,o)=>Re(K(t,s,B(),(()=>we(e,s,1))),n,((t,n,o)=>re(e,s,t,n,o)),((n,r)=>pe(e,t,s,n,r,o))),re=(e,t,s,n,o)=>{J(s,n)||ve(e,t,n,1);const r=H(s,n);o!==r&&(Ie(e,t,n,r),G(s,n,o))},ce=(e,t,s,n,o)=>M(H(t,s),(t=>re(e,s,t,n,o)),(()=>oe(e,t,s,$({[n]:o},e,s)))),ue=e=>{const s=""+t++;return J(e,s)?ue(e):s},fe=e=>H(p,e)??ne(e,{}),he=e=>ne(e,{}),ge=(e,t,s)=>oe(e,t,s,{},!0),pe=(e,t,s,n,o,r)=>{const a=H(H(h,e)?.[0],o);if(!E(a)&&!r)return re(e,s,n,o,a);const i=t=>{Ie(e,s,t,H(n,t)),ve(e,s,t,-1),G(n,t)};E(a)?i(o):W(n,i),F(n)&&(we(e,s,-1),F(G(t,s))&&(Le(e,-1),G(p,e)))},Le=(e,t)=>Ce(n,e,t),we=(e,t,s)=>Ce(K(o,e,B()),t,s),ve=(e,t,s,n)=>Ce(K(K(r,e,B()),t,B()),s,n),Ie=(e,t,s,n)=>K(K(K(i,e,B()),t,B()),s,n),ye=(e,t,s,n,o)=>(y(K(K(K(c,e,B()),t,B()),s,[]),n),o),Se=(e,t,s)=>{const n=H(H(i,e),t),o=De(e,t,s);return J(n,s)?[!0,H(n,s),o]:[!1,o,o]},me=e=>F(c)||F(m[e])?0:z(e?U(c,(e=>U(e,U))):c,((t,s)=>z(t,((t,n)=>z(t,((t,o)=>P(m[e],[s,n,o],t))))))),ke=e=>{if(!F(i)){const t=F(b[e])&&F(I[e])&&F(w[e]),s=F(C[e])&&F(S[e])&&F(v[e])&&F(L[e]);if(!t||!s){const a=e?[U(n),U(o,U),U(r,(e=>U(e,U))),U(i,(e=>U(e,U)))]:[n,o,r,i];if(t||(z(a[2],((t,s)=>z(t,((t,n)=>{F(t)||P(b[e],[s,n])})))),z(a[1],((t,s)=>{F(t)||P(I[e],[s])})),F(a[0])||P(w[e])),!s){let t;z(a[3],((s,n)=>{let o;z(s,((s,r)=>{let a;z(s,((s,i)=>{const d=De(n,r,i);d!==s&&(P(C[e],[n,r,i],d,s,Se),t=o=a=1)})),a&&P(S[e],[n,r],Se)})),o&&P(v[e],[n],Se)})),t&&P(L[e],[],Se)}}}},Ee=e=>(Oe(e),je),Me=()=>Q(p,(e=>Q(e,Q))),xe=()=>q(p),Ae=e=>q(H(p,e)),Pe=(e,t)=>q(H(H(p,e),t)),De=(e,t,s)=>H(H(H(p,e),t),s),Je=e=>Ee((()=>(e=>be(e,N,ye))(e)?te(e):0)),Fe=()=>Ee((()=>te({}))),Oe=e=>{if(-1==s)return;s++;const t=e?.();return s--,0==s&&(s=1,me(1),ke(1),s=-1,me(0),ke(0),s=0,g([i,c,n,o,r],j)),t},je={getTables:Me,getTableIds:xe,getTable:e=>Q(H(p,e),Q),getRowIds:Ae,getRow:(e,t)=>Q(H(H(p,e),t)),getCellIds:Pe,getCell:De,hasTables:()=>!F(p),hasTable:e=>J(p,e),hasRow:(e,t)=>J(H(p,e),t),hasCell:(e,t,s)=>J(H(H(p,e),t),s),getJson:()=>R(p),getSchemaJson:()=>R(f),setTables:Je,setTable:(e,t)=>Ee((()=>N(t,e)?ne(e,t):0)),setRow:(e,t,s)=>Ee((()=>Y(e,t,s)?oe(e,fe(e),t,s):0)),addRow:(e,t)=>Oe((()=>{let s;return Y(e,s,t)&&oe(e,fe(e),s=ue(H(p,e)),t),s})),setPartialRow:(e,t,s)=>Ee((()=>{if(Y(e,t,s,1)){const n=fe(e);le(s,((s,o)=>ce(e,n,t,o,s)))}})),setCell:(e,t,s,n)=>Ee((()=>M(Z(e,t,s,A(n)?n(De(e,t,s)):n),(n=>ce(e,fe(e),t,s,n))))),setJson:e=>{try{"{}"===e?Fe():Je(T(e))}catch{}return je},setSchema:t=>Ee((()=>{if((e=(e=>be(e,(e=>be(e,(e=>{if(!be(e,((e,t)=>u([d,l],t))))return!1;const t=e.type;return!(!x(t)&&t!=a||(Te(e.default)!=t&&de(e,l),0))})))))(t))&&(ee(t),!F(p))){const e=Me();Fe(),Je(e)}})),delTables:Fe,delTable:e=>Ee((()=>J(p,e)?he(e):0)),delRow:(e,t)=>Ee((()=>M(H(p,e),(s=>J(s,t)?ge(e,s,t):0)))),delCell:(e,t,s,n)=>Ee((()=>M(H(p,e),(o=>M(H(o,t),(r=>J(r,s)?pe(e,o,t,r,s,n):0)))))),delSchema:()=>Ee((()=>{ee({}),e=!1})),transaction:Oe,forEachTable:e=>z(p,((t,s)=>e(s,(e=>z(t,((t,s)=>e(s,(e=>W(t,e))))))))),forEachRow:(e,t)=>z(H(p,e),((e,s)=>t(s,(t=>W(e,t))))),forEachCell:(e,t,s)=>W(H(H(p,e),t),s),addTablesListener:(e,t)=>k(e,L[t?1:0]),addTableIdsListener:(e,t)=>k(e,w[t?1:0]),addTableListener:(e,t,s)=>k(t,v[s?1:0],[e]),addRowIdsListener:(e,t,s)=>k(t,I[s?1:0],[e]),addRowListener:(e,t,s,n)=>k(s,S[n?1:0],[e,t]),addCellIdsListener:(e,t,s,n)=>k(s,b[n?1:0],[e,t]),addCellListener:(e,t,s,n,o)=>k(n,C[o?1:0],[e,t,s]),addInvalidCellListener:(e,t,s,n,o)=>k(n,m[o?1:0],[e,t,s]),callListener:e=>(O(e,[xe,Ae,Pe],(e=>E(e[2])?[]:[,,].fill(De(...e)))),je),delListener:e=>(D(e),je),getListenerStats:()=>({})};return ae(je)},e.defaultSorter=fe,Object.defineProperty(e,"__esModule",{value:!0})},"object"==typeof exports&&"undefined"!=typeof module?t(exports,require("fs")):"function"==typeof define&&define.amd?define(["exports","fs"],t):t((e="undefined"!=typeof globalThis?globalThis:e||self).TinyBase={},e.fs);
|
package/lib/umd/tinybase.js.gz
CHANGED
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tinybase",
|
|
3
|
-
"version": "1.1.0-beta.
|
|
3
|
+
"version": "1.1.0-beta.2",
|
|
4
4
|
"author": "jamesgpearce",
|
|
5
5
|
"repository": "github:tinyplex/tinybase",
|
|
6
6
|
"license": "MIT",
|
|
@@ -42,6 +42,7 @@
|
|
|
42
42
|
"compileForProd": "gulp compileForProd",
|
|
43
43
|
"testUnit": "gulp testUnit",
|
|
44
44
|
"testUnitCountAsserts": "gulp testUnitCountAsserts",
|
|
45
|
+
"compileAndTestUnitSaveCoverage": "gulp compileAndTestUnitSaveCoverage",
|
|
45
46
|
"testPerf": "gulp testPerf",
|
|
46
47
|
"testE2e": "gulp testE2e",
|
|
47
48
|
"compileAndTestUnit": "gulp compileAndTestUnit",
|
|
@@ -55,8 +56,8 @@
|
|
|
55
56
|
"publishPackage": "gulp publishPackage"
|
|
56
57
|
},
|
|
57
58
|
"devDependencies": {
|
|
58
|
-
"@babel/cli": "^7.
|
|
59
|
-
"@babel/core": "^7.
|
|
59
|
+
"@babel/cli": "^7.17.0",
|
|
60
|
+
"@babel/core": "^7.17.0",
|
|
60
61
|
"@babel/preset-env": "^7.16.11",
|
|
61
62
|
"@babel/preset-react": "^7.16.7",
|
|
62
63
|
"@babel/preset-typescript": "^7.16.7",
|
|
@@ -68,7 +69,7 @@
|
|
|
68
69
|
"@types/jest-environment-puppeteer": "^5.0.0",
|
|
69
70
|
"@types/less": "^3.0.3",
|
|
70
71
|
"@types/puppeteer": "^5.4.4",
|
|
71
|
-
"@types/react": "^17.0.
|
|
72
|
+
"@types/react": "^17.0.39",
|
|
72
73
|
"@types/react-dom": "^17.0.11",
|
|
73
74
|
"@types/react-test-renderer": "^17.0.1",
|
|
74
75
|
"@types/tmp": "^0.2.3",
|
|
@@ -76,30 +77,30 @@
|
|
|
76
77
|
"@typescript-eslint/parser": "^5.10.2",
|
|
77
78
|
"asciichart": "^1.5.25",
|
|
78
79
|
"babel-eslint": "^10.1.0",
|
|
79
|
-
"babel-jest": "^27.
|
|
80
|
+
"babel-jest": "^27.5.0",
|
|
80
81
|
"babel-preset-minify": "^0.5.1",
|
|
81
82
|
"country-flag-emoji-json": "^2.0.0",
|
|
82
|
-
"cspell": "^5.18.
|
|
83
|
-
"esbuild": "^0.14.
|
|
83
|
+
"cspell": "^5.18.3",
|
|
84
|
+
"esbuild": "^0.14.18",
|
|
84
85
|
"eslint": "^8.8.0",
|
|
85
86
|
"eslint-config-prettier": "^8.3.0",
|
|
86
87
|
"eslint-plugin-jest": "^26.0.0",
|
|
87
|
-
"eslint-plugin-jsdoc": "^37.7.
|
|
88
|
+
"eslint-plugin-jsdoc": "^37.7.1",
|
|
88
89
|
"eslint-plugin-react": "^7.28.0",
|
|
89
90
|
"eslint-plugin-react-hooks": "^4.3.0",
|
|
90
91
|
"gulp": "^4.0.2",
|
|
91
92
|
"gulp-gzip": "^1.4.2",
|
|
92
93
|
"http-server": "^14.1.0",
|
|
93
|
-
"jest": "^27.
|
|
94
|
+
"jest": "^27.5.0",
|
|
94
95
|
"jest-fetch-mock": "^3.0.3",
|
|
95
|
-
"jest-puppeteer": "^6.0
|
|
96
|
+
"jest-puppeteer": "^6.1.0",
|
|
96
97
|
"less": "^4.1.2",
|
|
97
98
|
"prettier": "^2.5.1",
|
|
98
99
|
"puppeteer": "^13.1.3",
|
|
99
100
|
"react": "^17.0.2",
|
|
100
101
|
"react-dom": "^17.0.2",
|
|
101
102
|
"react-test-renderer": "^17.0.2",
|
|
102
|
-
"rollup": "^2.
|
|
103
|
+
"rollup": "^2.67.0",
|
|
103
104
|
"rollup-plugin-esbuild": "^4.8.2",
|
|
104
105
|
"rollup-plugin-gzip": "^3.0.0",
|
|
105
106
|
"rollup-plugin-prettier": "^2.2.2",
|
package/readme.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
<section id="hero"><h2 id="a-javascript-library-for-structured-state">A JavaScript library for <em>structured state</em>.</h2><p>Using plain old JavaScript objects to manage data gets old very quickly. It's error-prone, tricky to track changes efficiently, and easy to mistakenly incur performance costs.</p><p><em>TinyBase is a smarter way to structure your application state:</em></p><ul><li>Familiar concepts of <a href="#set-and-get-tables-rows-and-cells">tables, rows, and cells</a>, and <a href="#apply-schemas-to-tables">schematization</a> to model your data domain.</li><li><a href="#register-listeners-at-any-granularity">Flexibly reactive</a> to reconciled updates, so you only spend cycles on the data that changes.</li><li><a href="#create-indexes-for-fast-lookups">Indexing</a>, <a href="#define-metrics-and-aggregations">metrics</a>, <a href="#configure-relationships-between-tables">relationships</a> - and even an <a href="#use-checkpoints-for-an-easy-undo-stack">undo stack</a> for your app state! - out of the box.</li><li>Easily <a href="#persist-data-to-browser-file-or-server">sync your data</a> to local or remote storage, and use <a href="#call-react-hooks-to-bind-to-data">idiomatic bindings</a> to your React UI.</li></ul><p><em>Tiny by name, tiny by nature</em>, TinyBase only costs <a href="#did-we-say-tiny">2.
|
|
1
|
+
<section id="hero"><h2 id="a-javascript-library-for-structured-state">A JavaScript library for <em>structured state</em>.</h2><p>Using plain old JavaScript objects to manage data gets old very quickly. It's error-prone, tricky to track changes efficiently, and easy to mistakenly incur performance costs.</p><p><em>TinyBase is a smarter way to structure your application state:</em></p><ul><li>Familiar concepts of <a href="#set-and-get-tables-rows-and-cells">tables, rows, and cells</a>, and <a href="#apply-schemas-to-tables">schematization</a> to model your data domain.</li><li><a href="#register-listeners-at-any-granularity">Flexibly reactive</a> to reconciled updates, so you only spend cycles on the data that changes.</li><li><a href="#create-indexes-for-fast-lookups">Indexing</a>, <a href="#define-metrics-and-aggregations">metrics</a>, <a href="#configure-relationships-between-tables">relationships</a> - and even an <a href="#use-checkpoints-for-an-easy-undo-stack">undo stack</a> for your app state! - out of the box.</li><li>Easily <a href="#persist-data-to-browser-file-or-server">sync your data</a> to local or remote storage, and use <a href="#call-react-hooks-to-bind-to-data">idiomatic bindings</a> to your React UI.</li></ul><p><em>Tiny by name, tiny by nature</em>, TinyBase only costs <a href="#did-we-say-tiny">2.8kB - 5.8kB</a> when compressed, and has zero dependencies. And of course it's <a href="#well-tested-and-documented">well tested</a>, <a href="https://tinybase.org/guides/the-basics/getting-started">fully documented</a>, and <a href="https://github.com/tinyplex/tinybase">open source</a>. Other <a href="https://tinybase.org/guides/faq/">FAQs</a>?</p></section><hr><p><a id="start" href="https://tinybase.org/guides/the-basics/getting-started">Get started</a></p><p><a href="https://tinybase.org/demos">Try the demos</a></p><p><a href="https://tinybase.org/api/store/interfaces/store/store/">Read the docs</a></p><hr><section><h2 id="set-and-get-tables-rows-and-cells">Set and get tables, rows, and cells.</h2><p>Creating a <a href="https://tinybase.org/api/store/interfaces/store/store"><code>Store</code></a> requires just a simple call to the <a href="https://tinybase.org/api/store/functions/creation/createstore"><code>createStore</code></a> function. Once you have one, you can easily set <a href="https://tinybase.org/api/store/type-aliases/store/table"><code>Table</code></a>, <a href="https://tinybase.org/api/store/type-aliases/store/row"><code>Row</code></a>, or <a href="https://tinybase.org/api/store/type-aliases/store/cell"><code>Cell</code></a> values by their <a href="https://tinybase.org/api/common/type-aliases/identity/id"><code>Id</code></a>. And of course you can easily get the values back out again.</p><p>Read more about setting and changing data in <a href="https://tinybase.org/guides/the-basics">The Basics</a> guide.</p></section>
|
|
2
2
|
|
|
3
3
|
```js
|
|
4
4
|
const store = createStore()
|
|
@@ -192,4 +192,4 @@ console.log(store.getCell('pets', 'felix', 'sold'));
|
|
|
192
192
|
// -> false
|
|
193
193
|
```
|
|
194
194
|
|
|
195
|
-
<section><h2 id="did-we-say-tiny">Did we say tiny?</h2><p>If you use the basic <a href="https://tinybase.org/api/store"><code>store</code></a> module alone, you'll only add a gzipped <em>2.
|
|
195
|
+
<section><h2 id="did-we-say-tiny">Did we say tiny?</h2><p>If you use the basic <a href="https://tinybase.org/api/store"><code>store</code></a> module alone, you'll only add a gzipped <em>2.8kB</em> to your app. You can incrementally add the other modules as you need more functionality, or get it all for <em>5.8kB</em>. The <code>ui-react</code> adaptor is just another <em>2.6kB</em>, and everything is fast.</p><p>Life's easy when you have zero dependencies.</p><p>Read more about how TinyBase is structured in the <a href="https://tinybase.org/guides/how-tinybase-is-built/architecture">Architecture</a> guide.</p></section><div class="table"><table class="fixed"><tbody><tr><th width="30%"> </th><th>.js.gz</th><th>.js</th><th>debug.js</th><th>.d.ts</th></tr><tr><th class="right"><a href="https://tinybase.org/api/store">store</a></th><td>2.8kB</td><td>6.3kB</td><td>26.4kB</td><td>97.7kB</td></tr><tr><th class="right"><a href="https://tinybase.org/api/indexes">indexes</a></th><td>1.6kB</td><td>3.2kB</td><td>14.1kB</td><td>32.9kB</td></tr><tr><th class="right"><a href="https://tinybase.org/api/metrics">metrics</a></th><td>1.5kB</td><td>3.1kB</td><td>12.6kB</td><td>29.1kB</td></tr><tr><th class="right"><a href="https://tinybase.org/api/relationships">relationships</a></th><td>1.6kB</td><td>3.2kB</td><td>14.8kB</td><td>42.1kB</td></tr><tr><th class="right"><a href="https://tinybase.org/api/checkpoints">checkpoints</a></th><td>1.3kB</td><td>2.5kB</td><td>10.4kB</td><td>33.0kB</td></tr><tr><th class="right"><a href="https://tinybase.org/api/persisters">persisters</a></th><td>0.8kB</td><td>1.6kB</td><td>4.9kB</td><td>26.7kB</td></tr><tr><th class="right"><a href="https://tinybase.org/api/common">common</a></th><td>0.1kB</td><td>0.1kB</td><td>0.1kB</td><td>3.5kB</td></tr><tr><th class="right"><a href="https://tinybase.org/api/tinybase">tinybase</a></th><td>5.8kB</td><td>13.8kB</td><td>58.1kB</td><td>0.3kB</td></tr></tbody></table></div><section><h2 id="well-tested-and-documented">Well tested and documented.</h2><p>TinyBase has <em>100.0%</em> test coverage, including the code throughout the documentation - even on this page! The guides, demos, and API examples are designed to make it as easy as possible to get up and running.</p><p>Read more about how TinyBase is tested in the Unit <a href="https://tinybase.org/guides/how-tinybase-is-built/testing">Testing</a> guide.</p></section><div class="table"><table class="fixed"><tbody><tr><th width="30%"> </th><th>Total</th><th>Tested</th><th>Coverage</th></tr><tr><th class="right">Lines</th><td>973</td><td>973</td><td>100.0%</td></tr><tr><th class="right">Statements</th><td>1,061</td><td>1,061</td><td>100.0%</td></tr><tr><th class="right">Functions</th><td>401</td><td>401</td><td>100.0%</td></tr><tr><th class="right">Branches</th><td>355</td><td>355</td><td>100.0%</td></tr><tr><th class="right">Tests</th><td colspan="3">1,757</td></tr><tr><th class="right">Assertions</th><td colspan="3">8,793</td></tr></tbody></table></div><hr><p><a id="start" href="https://tinybase.org/guides/the-basics/getting-started">Get started</a></p><p><a href="https://tinybase.org/demos">Try the demos</a></p><p><a href="https://tinybase.org/api/store/interfaces/store/store/">Read the docs</a></p><hr><section><h2 id="follow">Follow</h2><ul><li>News and updates on <a href="https://twitter.com/tinybasejs">Twitter</a> and <a href="https://facebook.com/tinybasejs">Facebook</a>.</li><li><a href="https://github.com/tinyplex/tinybase/issues">Issues</a> and <a href="https://github.com/tinyplex/tinybase/releases">release notes</a> on <a href="https://github.com/tinyplex/tinybase">GitHub</a></li><li>Packages on <a href="https://www.npmjs.com/package/tinybase/v/1.1.0-beta.2">NPM</a>.</li></ul></section><section><h2 id="about">About</h2><p>Building TinyBase was an interesting exercise in API design, minification, and documentation. It's not <a href="https://www.linkedin.com/in/jamespearce">my day job</a>, but I do intend to maintain it, so please provide feedback. I could not have done this without these great <a href="https://tinybase.org/guides/how-tinybase-is-built/credits/#giants">projects</a> and <a href="https://tinybase.org/guides/how-tinybase-is-built/credits/#and-friends">friends</a>, and I hope you enjoy using it!</p></section>
|