tinybase 9.1.0-beta.0 → 9.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.
Files changed (106) hide show
  1. package/@types/_internal/store/with-schemas/index.d.ts +133 -2
  2. package/@types/common/index.d.ts +17 -2
  3. package/@types/common/with-schemas/index.d.ts +18 -2
  4. package/@types/indexes/index.d.ts +97 -0
  5. package/@types/indexes/with-schemas/index.d.ts +137 -0
  6. package/@types/store/index.d.ts +133 -25
  7. package/@types/store/with-schemas/index.d.ts +145 -51
  8. package/@types/ui-react/index.d.ts +48 -2
  9. package/@types/ui-react/with-schemas/index.d.ts +108 -34
  10. package/@types/ui-solid/index.d.ts +51 -2
  11. package/@types/ui-solid/with-schemas/index.d.ts +111 -34
  12. package/@types/ui-svelte/index.d.ts +84 -2
  13. package/@types/ui-svelte/with-schemas/index.d.ts +122 -25
  14. package/index.js +155 -38
  15. package/indexes/index.js +39 -0
  16. package/indexes/with-schemas/index.js +39 -0
  17. package/mergeable-store/index.js +116 -38
  18. package/mergeable-store/with-schemas/index.js +116 -38
  19. package/min/index.js +1 -1
  20. package/min/index.js.gz +0 -0
  21. package/min/indexes/index.js +1 -1
  22. package/min/indexes/index.js.gz +0 -0
  23. package/min/indexes/with-schemas/index.js +1 -1
  24. package/min/indexes/with-schemas/index.js.gz +0 -0
  25. package/min/mergeable-store/index.js +1 -1
  26. package/min/mergeable-store/index.js.gz +0 -0
  27. package/min/mergeable-store/with-schemas/index.js +1 -1
  28. package/min/mergeable-store/with-schemas/index.js.gz +0 -0
  29. package/min/omni/index.js +1 -1
  30. package/min/omni/index.js.gz +0 -0
  31. package/min/omni/with-schemas/index.js +1 -1
  32. package/min/omni/with-schemas/index.js.gz +0 -0
  33. package/min/store/index.js +1 -1
  34. package/min/store/index.js.gz +0 -0
  35. package/min/store/with-schemas/index.js +1 -1
  36. package/min/store/with-schemas/index.js.gz +0 -0
  37. package/min/ui-react/index.js +1 -1
  38. package/min/ui-react/index.js.gz +0 -0
  39. package/min/ui-react/with-schemas/index.js +1 -1
  40. package/min/ui-react/with-schemas/index.js.gz +0 -0
  41. package/min/ui-react-dom/index.js +1 -1
  42. package/min/ui-react-dom/index.js.gz +0 -0
  43. package/min/ui-react-dom/with-schemas/index.js +1 -1
  44. package/min/ui-react-dom/with-schemas/index.js.gz +0 -0
  45. package/min/ui-react-dom-charts/index.js +1 -1
  46. package/min/ui-react-dom-charts/index.js.gz +0 -0
  47. package/min/ui-react-dom-charts/with-schemas/index.js +1 -1
  48. package/min/ui-react-dom-charts/with-schemas/index.js.gz +0 -0
  49. package/min/ui-react-inspector/index.js +1 -1
  50. package/min/ui-react-inspector/index.js.gz +0 -0
  51. package/min/ui-react-inspector/with-schemas/index.js +1 -1
  52. package/min/ui-react-inspector/with-schemas/index.js.gz +0 -0
  53. package/min/ui-solid/index.js +1 -1
  54. package/min/ui-solid/index.js.gz +0 -0
  55. package/min/ui-solid/with-schemas/index.js +1 -1
  56. package/min/ui-solid/with-schemas/index.js.gz +0 -0
  57. package/min/ui-solid-dom/index.js +1 -1
  58. package/min/ui-solid-dom/index.js.gz +0 -0
  59. package/min/ui-solid-dom/with-schemas/index.js +1 -1
  60. package/min/ui-solid-dom/with-schemas/index.js.gz +0 -0
  61. package/min/ui-solid-inspector/index.js +1 -1
  62. package/min/ui-solid-inspector/index.js.gz +0 -0
  63. package/min/ui-solid-inspector/with-schemas/index.js +1 -1
  64. package/min/ui-solid-inspector/with-schemas/index.js.gz +0 -0
  65. package/min/ui-svelte/index.js +1 -1
  66. package/min/ui-svelte/index.js.gz +0 -0
  67. package/min/ui-svelte/with-schemas/index.js +1 -1
  68. package/min/ui-svelte/with-schemas/index.js.gz +0 -0
  69. package/min/ui-svelte-dom/index.js +1 -1
  70. package/min/ui-svelte-dom/index.js.gz +0 -0
  71. package/min/ui-svelte-dom/with-schemas/index.js +1 -1
  72. package/min/ui-svelte-dom/with-schemas/index.js.gz +0 -0
  73. package/min/ui-svelte-inspector/index.js +1 -1
  74. package/min/ui-svelte-inspector/index.js.gz +0 -0
  75. package/min/ui-svelte-inspector/with-schemas/index.js +1 -1
  76. package/min/ui-svelte-inspector/with-schemas/index.js.gz +0 -0
  77. package/min/with-schemas/index.js +1 -1
  78. package/min/with-schemas/index.js.gz +0 -0
  79. package/omni/index.js +155 -38
  80. package/omni/with-schemas/index.js +155 -38
  81. package/package.json +3 -3
  82. package/readme.md +14 -14
  83. package/releases.md +101 -60
  84. package/store/index.js +116 -38
  85. package/store/with-schemas/index.js +116 -38
  86. package/ui-react/index.js +52 -6
  87. package/ui-react/with-schemas/index.js +52 -6
  88. package/ui-react-dom/index.js +24 -4
  89. package/ui-react-dom/with-schemas/index.js +24 -4
  90. package/ui-react-dom-charts/index.js +24 -4
  91. package/ui-react-dom-charts/with-schemas/index.js +24 -4
  92. package/ui-react-inspector/index.js +140 -42
  93. package/ui-react-inspector/with-schemas/index.js +140 -42
  94. package/ui-solid/index.js +48 -2
  95. package/ui-solid/with-schemas/index.js +48 -2
  96. package/ui-solid-dom/index.js +17 -1
  97. package/ui-solid-dom/with-schemas/index.js +17 -1
  98. package/ui-solid-inspector/index.js +133 -39
  99. package/ui-solid-inspector/with-schemas/index.js +133 -39
  100. package/ui-svelte/index.js +91 -31
  101. package/ui-svelte/with-schemas/index.js +91 -31
  102. package/ui-svelte-dom/index.js +35 -14
  103. package/ui-svelte-dom/with-schemas/index.js +35 -14
  104. package/ui-svelte-inspector/index.js +151 -52
  105. package/ui-svelte-inspector/with-schemas/index.js +151 -52
  106. package/with-schemas/index.js +155 -38
package/store/index.js CHANGED
@@ -25,6 +25,7 @@ const CELL_IDS = CELL + IDS;
25
25
  const VALUE = 'Value';
26
26
  const VALUES = VALUE + 's';
27
27
  const VALUE_IDS = VALUE + IDS;
28
+ const REQUIRED = 'required';
28
29
  const JSON_PREFIX = '\uFFFD';
29
30
  const id = (key) => EMPTY_STRING + key;
30
31
 
@@ -397,6 +398,7 @@ const createStore = () => {
397
398
  const valuesSchemaMap = mapNew();
398
399
  const valuesDefaulted = mapNew();
399
400
  const valuesNonDefaulted = setNew();
401
+ const valuesRequiredNonDefaulted = setNew();
400
402
  const tablePoolFunctions = mapNew();
401
403
  const tableCellIds = mapNew();
402
404
  const tablesMap = mapNew();
@@ -449,7 +451,7 @@ const createStore = () => {
449
451
  const validateCellOrValueSchema = (schema) => {
450
452
  if (
451
453
  !objValidate(schema, (_child, id2) =>
452
- arrayHas([TYPE, DEFAULT, ALLOW_NULL], id2),
454
+ arrayHas([TYPE, DEFAULT, ALLOW_NULL, REQUIRED], id2),
453
455
  )
454
456
  ) {
455
457
  return false;
@@ -484,20 +486,32 @@ const createStore = () => {
484
486
  (row, rowId) => validateRow(tableId, rowId, row),
485
487
  () => cellInvalid(tableId),
486
488
  );
487
- const validateRow = (tableId, rowId, row, skipDefaults) =>
488
- objValidate(
489
- skipDefaults ? row : addDefaultsToRow(row, tableId, rowId),
490
- (cell, cellId) =>
491
- ifNotUndefined(
492
- getValidatedCell(tableId, rowId, cellId, cell),
493
- (validCell) => {
494
- row[cellId] = validCell;
495
- return true;
496
- },
497
- () => false,
498
- ),
499
- () => cellInvalid(tableId, rowId),
489
+ const validateRow = (tableId, rowId, row, skipDefaults) => {
490
+ const rowWithDefaults = skipDefaults
491
+ ? row
492
+ : addDefaultsToRow(row, tableId, rowId);
493
+ return (
494
+ objValidate(
495
+ rowWithDefaults,
496
+ (cell, cellId) =>
497
+ ifNotUndefined(
498
+ getValidatedCell(tableId, rowId, cellId, cell),
499
+ (validCell) => {
500
+ row[cellId] = validCell;
501
+ return true;
502
+ },
503
+ () => false,
504
+ ),
505
+ () => cellInvalid(tableId, rowId),
506
+ ) &&
507
+ (skipDefaults
508
+ ? true
509
+ : arrayEvery(
510
+ collValues(mapGet(tablesSchemaRowCache, tableId)?.[2]),
511
+ (cellId) => objHas(rowWithDefaults, cellId),
512
+ ))
500
513
  );
514
+ };
501
515
  const getValidatedCell = (tableId, rowId, cellId, cell) =>
502
516
  hasTablesSchema
503
517
  ? ifNotUndefined(
@@ -523,20 +537,31 @@ const createStore = () => {
523
537
  : isUndefined(getCellOrValueType(cell))
524
538
  ? cellInvalid(tableId, rowId, cellId, cell)
525
539
  : encodeIfJson(cell);
526
- const validateValues = (values, skipDefaults) =>
527
- objValidate(
528
- skipDefaults ? values : addDefaultsToValues(values),
529
- (value, valueId) =>
530
- ifNotUndefined(
531
- getValidatedValue(valueId, value),
532
- (validValue) => {
533
- values[valueId] = validValue;
534
- return true;
535
- },
536
- () => false,
537
- ),
538
- () => valueInvalid(),
540
+ const validateValues = (values, skipDefaults) => {
541
+ const valuesWithDefaults = skipDefaults
542
+ ? values
543
+ : addDefaultsToValues(values);
544
+ return (
545
+ objValidate(
546
+ valuesWithDefaults,
547
+ (value, valueId) =>
548
+ ifNotUndefined(
549
+ getValidatedValue(valueId, value),
550
+ (validValue) => {
551
+ values[valueId] = validValue;
552
+ return true;
553
+ },
554
+ () => false,
555
+ ),
556
+ () => valueInvalid(),
557
+ ) &&
558
+ (skipDefaults
559
+ ? true
560
+ : arrayEvery(collValues(valuesRequiredNonDefaulted), (valueId) =>
561
+ objHas(valuesWithDefaults, valueId),
562
+ ))
539
563
  );
564
+ };
540
565
  const getValidatedValue = (valueId, value) =>
541
566
  hasValuesSchema
542
567
  ? ifNotUndefined(
@@ -607,6 +632,7 @@ const createStore = () => {
607
632
  (_tablesSchema, tableId, tableSchema) => {
608
633
  const rowDefaulted = mapNew();
609
634
  const rowNonDefaulted = setNew();
635
+ const rowRequiredNonDefaulted = setNew();
610
636
  mapMatch(
611
637
  mapEnsure(tablesSchemaMap, tableId, mapNew),
612
638
  tableSchema,
@@ -614,12 +640,23 @@ const createStore = () => {
614
640
  mapSet(tableSchemaMap, cellId, cellSchema);
615
641
  ifNotUndefined(
616
642
  cellSchema[DEFAULT],
617
- (def) => mapSet(rowDefaulted, cellId, def),
618
- () => setAdd(rowNonDefaulted, cellId),
643
+ (defaultCell) => {
644
+ mapSet(rowDefaulted, cellId, defaultCell);
645
+ },
646
+ () => {
647
+ setAdd(rowNonDefaulted, cellId);
648
+ if (cellSchema[REQUIRED] === true) {
649
+ setAdd(rowRequiredNonDefaulted, cellId);
650
+ }
651
+ },
619
652
  );
620
653
  },
621
654
  );
622
- mapSet(tablesSchemaRowCache, tableId, [rowDefaulted, rowNonDefaulted]);
655
+ mapSet(tablesSchemaRowCache, tableId, [
656
+ rowDefaulted,
657
+ rowNonDefaulted,
658
+ rowRequiredNonDefaulted,
659
+ ]);
623
660
  },
624
661
  (_tablesSchema, tableId) => {
625
662
  mapSet(tablesSchemaMap, tableId);
@@ -634,14 +671,27 @@ const createStore = () => {
634
671
  mapSet(valuesSchemaMap, valueId, valueSchema);
635
672
  ifNotUndefined(
636
673
  valueSchema[DEFAULT],
637
- (def) => mapSet(valuesDefaulted, valueId, def),
638
- () => setAdd(valuesNonDefaulted, valueId),
674
+ (defaultValue) => {
675
+ mapSet(valuesDefaulted, valueId, defaultValue);
676
+ collDel(valuesNonDefaulted, valueId);
677
+ collDel(valuesRequiredNonDefaulted, valueId);
678
+ },
679
+ () => {
680
+ mapSet(valuesDefaulted, valueId);
681
+ setAdd(valuesNonDefaulted, valueId);
682
+ if (valueSchema[REQUIRED] === true) {
683
+ setAdd(valuesRequiredNonDefaulted, valueId);
684
+ } else {
685
+ collDel(valuesRequiredNonDefaulted, valueId);
686
+ }
687
+ },
639
688
  );
640
689
  },
641
690
  (_valuesSchema, valueId) => {
642
691
  mapSet(valuesSchemaMap, valueId);
643
692
  mapSet(valuesDefaulted, valueId);
644
693
  collDel(valuesNonDefaulted, valueId);
694
+ collDel(valuesRequiredNonDefaulted, valueId);
645
695
  },
646
696
  );
647
697
  const setOrDelTables = (tables) =>
@@ -1314,13 +1364,36 @@ const createStore = () => {
1314
1364
  listener,
1315
1365
  mutator,
1316
1366
  ) => {
1317
- let sortedRowIds = getSortedRowIds(tableId, cellId, ...otherArgs);
1367
+ const [descending, offset, limit, sorter] = otherArgs;
1368
+ let sortedRowIds = getSortedRowIds(
1369
+ tableId,
1370
+ cellId,
1371
+ descending,
1372
+ offset,
1373
+ limit,
1374
+ sorter,
1375
+ );
1318
1376
  return addListener(
1319
1377
  () => {
1320
- const newSortedRowIds = getSortedRowIds(tableId, cellId, ...otherArgs);
1378
+ const newSortedRowIds = getSortedRowIds(
1379
+ tableId,
1380
+ cellId,
1381
+ descending,
1382
+ offset,
1383
+ limit,
1384
+ sorter,
1385
+ );
1321
1386
  if (!arrayIsEqual(newSortedRowIds, sortedRowIds)) {
1322
1387
  sortedRowIds = newSortedRowIds;
1323
- listener(store, tableId, cellId, ...otherArgs, sortedRowIds);
1388
+ listener(
1389
+ store,
1390
+ tableId,
1391
+ cellId,
1392
+ descending,
1393
+ offset,
1394
+ limit,
1395
+ sortedRowIds,
1396
+ );
1324
1397
  }
1325
1398
  },
1326
1399
  sortedRowIdsListeners[mutator ? 1 : 0],
@@ -1374,6 +1447,7 @@ const createStore = () => {
1374
1447
  descending,
1375
1448
  offset = 0,
1376
1449
  limit,
1450
+ sorter = defaultSorter,
1377
1451
  ) =>
1378
1452
  isObject(tableIdOrArgs)
1379
1453
  ? getSortedRowIds(
@@ -1382,16 +1456,19 @@ const createStore = () => {
1382
1456
  tableIdOrArgs.descending,
1383
1457
  tableIdOrArgs.offset,
1384
1458
  tableIdOrArgs.limit,
1459
+ tableIdOrArgs.sorter,
1385
1460
  )
1386
1461
  : arrayMap(
1387
1462
  slice(
1388
1463
  arraySort(
1389
1464
  mapMap(mapGet(tablesMap, id(tableIdOrArgs)), (row, rowId) => [
1390
- isUndefined(cellId) ? rowId : mapGet(row, id(cellId)),
1465
+ isUndefined(cellId)
1466
+ ? rowId
1467
+ : decodeIfJson(mapGet(row, id(cellId))),
1391
1468
  rowId,
1392
1469
  ]),
1393
1470
  ([cell1], [cell2]) =>
1394
- defaultSorter(cell1, cell2) * (descending ? -1 : 1),
1471
+ sorter(cell1, cell2) * (descending ? -1 : 1),
1395
1472
  ),
1396
1473
  offset,
1397
1474
  isUndefined(limit) ? limit : offset + limit,
@@ -1869,6 +1946,7 @@ const createStore = () => {
1869
1946
  tableIdOrArgs.descending ?? false,
1870
1947
  tableIdOrArgs.offset ?? 0,
1871
1948
  tableIdOrArgs.limit,
1949
+ tableIdOrArgs.sorter,
1872
1950
  ],
1873
1951
  cellIdOrListener,
1874
1952
  descendingOrMutator,
@@ -1876,7 +1954,7 @@ const createStore = () => {
1876
1954
  : addSortedRowIdsListenerImpl(
1877
1955
  tableIdOrArgs,
1878
1956
  cellIdOrListener,
1879
- [descendingOrMutator, offset, limit],
1957
+ [descendingOrMutator, offset, limit, void 0],
1880
1958
  listener,
1881
1959
  mutator,
1882
1960
  );
@@ -25,6 +25,7 @@ const CELL_IDS = CELL + IDS;
25
25
  const VALUE = 'Value';
26
26
  const VALUES = VALUE + 's';
27
27
  const VALUE_IDS = VALUE + IDS;
28
+ const REQUIRED = 'required';
28
29
  const JSON_PREFIX = '\uFFFD';
29
30
  const id = (key) => EMPTY_STRING + key;
30
31
 
@@ -397,6 +398,7 @@ const createStore = () => {
397
398
  const valuesSchemaMap = mapNew();
398
399
  const valuesDefaulted = mapNew();
399
400
  const valuesNonDefaulted = setNew();
401
+ const valuesRequiredNonDefaulted = setNew();
400
402
  const tablePoolFunctions = mapNew();
401
403
  const tableCellIds = mapNew();
402
404
  const tablesMap = mapNew();
@@ -449,7 +451,7 @@ const createStore = () => {
449
451
  const validateCellOrValueSchema = (schema) => {
450
452
  if (
451
453
  !objValidate(schema, (_child, id2) =>
452
- arrayHas([TYPE, DEFAULT, ALLOW_NULL], id2),
454
+ arrayHas([TYPE, DEFAULT, ALLOW_NULL, REQUIRED], id2),
453
455
  )
454
456
  ) {
455
457
  return false;
@@ -484,20 +486,32 @@ const createStore = () => {
484
486
  (row, rowId) => validateRow(tableId, rowId, row),
485
487
  () => cellInvalid(tableId),
486
488
  );
487
- const validateRow = (tableId, rowId, row, skipDefaults) =>
488
- objValidate(
489
- skipDefaults ? row : addDefaultsToRow(row, tableId, rowId),
490
- (cell, cellId) =>
491
- ifNotUndefined(
492
- getValidatedCell(tableId, rowId, cellId, cell),
493
- (validCell) => {
494
- row[cellId] = validCell;
495
- return true;
496
- },
497
- () => false,
498
- ),
499
- () => cellInvalid(tableId, rowId),
489
+ const validateRow = (tableId, rowId, row, skipDefaults) => {
490
+ const rowWithDefaults = skipDefaults
491
+ ? row
492
+ : addDefaultsToRow(row, tableId, rowId);
493
+ return (
494
+ objValidate(
495
+ rowWithDefaults,
496
+ (cell, cellId) =>
497
+ ifNotUndefined(
498
+ getValidatedCell(tableId, rowId, cellId, cell),
499
+ (validCell) => {
500
+ row[cellId] = validCell;
501
+ return true;
502
+ },
503
+ () => false,
504
+ ),
505
+ () => cellInvalid(tableId, rowId),
506
+ ) &&
507
+ (skipDefaults
508
+ ? true
509
+ : arrayEvery(
510
+ collValues(mapGet(tablesSchemaRowCache, tableId)?.[2]),
511
+ (cellId) => objHas(rowWithDefaults, cellId),
512
+ ))
500
513
  );
514
+ };
501
515
  const getValidatedCell = (tableId, rowId, cellId, cell) =>
502
516
  hasTablesSchema
503
517
  ? ifNotUndefined(
@@ -523,20 +537,31 @@ const createStore = () => {
523
537
  : isUndefined(getCellOrValueType(cell))
524
538
  ? cellInvalid(tableId, rowId, cellId, cell)
525
539
  : encodeIfJson(cell);
526
- const validateValues = (values, skipDefaults) =>
527
- objValidate(
528
- skipDefaults ? values : addDefaultsToValues(values),
529
- (value, valueId) =>
530
- ifNotUndefined(
531
- getValidatedValue(valueId, value),
532
- (validValue) => {
533
- values[valueId] = validValue;
534
- return true;
535
- },
536
- () => false,
537
- ),
538
- () => valueInvalid(),
540
+ const validateValues = (values, skipDefaults) => {
541
+ const valuesWithDefaults = skipDefaults
542
+ ? values
543
+ : addDefaultsToValues(values);
544
+ return (
545
+ objValidate(
546
+ valuesWithDefaults,
547
+ (value, valueId) =>
548
+ ifNotUndefined(
549
+ getValidatedValue(valueId, value),
550
+ (validValue) => {
551
+ values[valueId] = validValue;
552
+ return true;
553
+ },
554
+ () => false,
555
+ ),
556
+ () => valueInvalid(),
557
+ ) &&
558
+ (skipDefaults
559
+ ? true
560
+ : arrayEvery(collValues(valuesRequiredNonDefaulted), (valueId) =>
561
+ objHas(valuesWithDefaults, valueId),
562
+ ))
539
563
  );
564
+ };
540
565
  const getValidatedValue = (valueId, value) =>
541
566
  hasValuesSchema
542
567
  ? ifNotUndefined(
@@ -607,6 +632,7 @@ const createStore = () => {
607
632
  (_tablesSchema, tableId, tableSchema) => {
608
633
  const rowDefaulted = mapNew();
609
634
  const rowNonDefaulted = setNew();
635
+ const rowRequiredNonDefaulted = setNew();
610
636
  mapMatch(
611
637
  mapEnsure(tablesSchemaMap, tableId, mapNew),
612
638
  tableSchema,
@@ -614,12 +640,23 @@ const createStore = () => {
614
640
  mapSet(tableSchemaMap, cellId, cellSchema);
615
641
  ifNotUndefined(
616
642
  cellSchema[DEFAULT],
617
- (def) => mapSet(rowDefaulted, cellId, def),
618
- () => setAdd(rowNonDefaulted, cellId),
643
+ (defaultCell) => {
644
+ mapSet(rowDefaulted, cellId, defaultCell);
645
+ },
646
+ () => {
647
+ setAdd(rowNonDefaulted, cellId);
648
+ if (cellSchema[REQUIRED] === true) {
649
+ setAdd(rowRequiredNonDefaulted, cellId);
650
+ }
651
+ },
619
652
  );
620
653
  },
621
654
  );
622
- mapSet(tablesSchemaRowCache, tableId, [rowDefaulted, rowNonDefaulted]);
655
+ mapSet(tablesSchemaRowCache, tableId, [
656
+ rowDefaulted,
657
+ rowNonDefaulted,
658
+ rowRequiredNonDefaulted,
659
+ ]);
623
660
  },
624
661
  (_tablesSchema, tableId) => {
625
662
  mapSet(tablesSchemaMap, tableId);
@@ -634,14 +671,27 @@ const createStore = () => {
634
671
  mapSet(valuesSchemaMap, valueId, valueSchema);
635
672
  ifNotUndefined(
636
673
  valueSchema[DEFAULT],
637
- (def) => mapSet(valuesDefaulted, valueId, def),
638
- () => setAdd(valuesNonDefaulted, valueId),
674
+ (defaultValue) => {
675
+ mapSet(valuesDefaulted, valueId, defaultValue);
676
+ collDel(valuesNonDefaulted, valueId);
677
+ collDel(valuesRequiredNonDefaulted, valueId);
678
+ },
679
+ () => {
680
+ mapSet(valuesDefaulted, valueId);
681
+ setAdd(valuesNonDefaulted, valueId);
682
+ if (valueSchema[REQUIRED] === true) {
683
+ setAdd(valuesRequiredNonDefaulted, valueId);
684
+ } else {
685
+ collDel(valuesRequiredNonDefaulted, valueId);
686
+ }
687
+ },
639
688
  );
640
689
  },
641
690
  (_valuesSchema, valueId) => {
642
691
  mapSet(valuesSchemaMap, valueId);
643
692
  mapSet(valuesDefaulted, valueId);
644
693
  collDel(valuesNonDefaulted, valueId);
694
+ collDel(valuesRequiredNonDefaulted, valueId);
645
695
  },
646
696
  );
647
697
  const setOrDelTables = (tables) =>
@@ -1314,13 +1364,36 @@ const createStore = () => {
1314
1364
  listener,
1315
1365
  mutator,
1316
1366
  ) => {
1317
- let sortedRowIds = getSortedRowIds(tableId, cellId, ...otherArgs);
1367
+ const [descending, offset, limit, sorter] = otherArgs;
1368
+ let sortedRowIds = getSortedRowIds(
1369
+ tableId,
1370
+ cellId,
1371
+ descending,
1372
+ offset,
1373
+ limit,
1374
+ sorter,
1375
+ );
1318
1376
  return addListener(
1319
1377
  () => {
1320
- const newSortedRowIds = getSortedRowIds(tableId, cellId, ...otherArgs);
1378
+ const newSortedRowIds = getSortedRowIds(
1379
+ tableId,
1380
+ cellId,
1381
+ descending,
1382
+ offset,
1383
+ limit,
1384
+ sorter,
1385
+ );
1321
1386
  if (!arrayIsEqual(newSortedRowIds, sortedRowIds)) {
1322
1387
  sortedRowIds = newSortedRowIds;
1323
- listener(store, tableId, cellId, ...otherArgs, sortedRowIds);
1388
+ listener(
1389
+ store,
1390
+ tableId,
1391
+ cellId,
1392
+ descending,
1393
+ offset,
1394
+ limit,
1395
+ sortedRowIds,
1396
+ );
1324
1397
  }
1325
1398
  },
1326
1399
  sortedRowIdsListeners[mutator ? 1 : 0],
@@ -1374,6 +1447,7 @@ const createStore = () => {
1374
1447
  descending,
1375
1448
  offset = 0,
1376
1449
  limit,
1450
+ sorter = defaultSorter,
1377
1451
  ) =>
1378
1452
  isObject(tableIdOrArgs)
1379
1453
  ? getSortedRowIds(
@@ -1382,16 +1456,19 @@ const createStore = () => {
1382
1456
  tableIdOrArgs.descending,
1383
1457
  tableIdOrArgs.offset,
1384
1458
  tableIdOrArgs.limit,
1459
+ tableIdOrArgs.sorter,
1385
1460
  )
1386
1461
  : arrayMap(
1387
1462
  slice(
1388
1463
  arraySort(
1389
1464
  mapMap(mapGet(tablesMap, id(tableIdOrArgs)), (row, rowId) => [
1390
- isUndefined(cellId) ? rowId : mapGet(row, id(cellId)),
1465
+ isUndefined(cellId)
1466
+ ? rowId
1467
+ : decodeIfJson(mapGet(row, id(cellId))),
1391
1468
  rowId,
1392
1469
  ]),
1393
1470
  ([cell1], [cell2]) =>
1394
- defaultSorter(cell1, cell2) * (descending ? -1 : 1),
1471
+ sorter(cell1, cell2) * (descending ? -1 : 1),
1395
1472
  ),
1396
1473
  offset,
1397
1474
  isUndefined(limit) ? limit : offset + limit,
@@ -1869,6 +1946,7 @@ const createStore = () => {
1869
1946
  tableIdOrArgs.descending ?? false,
1870
1947
  tableIdOrArgs.offset ?? 0,
1871
1948
  tableIdOrArgs.limit,
1949
+ tableIdOrArgs.sorter,
1872
1950
  ],
1873
1951
  cellIdOrListener,
1874
1952
  descendingOrMutator,
@@ -1876,7 +1954,7 @@ const createStore = () => {
1876
1954
  : addSortedRowIdsListenerImpl(
1877
1955
  tableIdOrArgs,
1878
1956
  cellIdOrListener,
1879
- [descendingOrMutator, offset, limit],
1957
+ [descendingOrMutator, offset, limit, void 0],
1880
1958
  listener,
1881
1959
  mutator,
1882
1960
  );
package/ui-react/index.js CHANGED
@@ -536,33 +536,56 @@ const useSortedRowIdsImpl = (
536
536
  descending,
537
537
  offset,
538
538
  limit,
539
+ sorter,
539
540
  storeOrStoreId,
540
- ) =>
541
- useListenable(
541
+ ) => {
542
+ const sortedRowIdsArgs = useMemo(
543
+ () => ({
544
+ tableId,
545
+ cellId,
546
+ descending: descending ?? false,
547
+ offset: offset ?? 0,
548
+ limit,
549
+ sorter,
550
+ }),
551
+ [tableId, cellId, descending, offset, limit, sorter],
552
+ );
553
+ return useListenable(
542
554
  SORTED_ROW_IDS,
543
555
  useStoreOrStoreById(storeOrStoreId),
544
556
  1 /* Array */,
545
- [tableId, cellId, descending, offset, limit],
557
+ isUndefined(sorter)
558
+ ? [tableId, cellId, descending, offset, limit]
559
+ : [sortedRowIdsArgs],
546
560
  );
561
+ };
547
562
  const useSortedRowIdsListenerImpl = (
548
563
  tableId,
549
564
  cellId,
550
565
  descending,
551
566
  offset,
552
567
  limit,
568
+ sorter,
553
569
  listener,
554
570
  listenerDeps,
555
571
  mutator,
556
572
  storeOrStoreId,
557
- ) =>
573
+ ) => {
574
+ const sortedRowIdsArgs = useMemo(
575
+ () => ({tableId, cellId, descending, offset, limit, sorter}),
576
+ [tableId, cellId, descending, offset, limit, sorter],
577
+ );
558
578
  useListener(
559
579
  SORTED_ROW_IDS,
560
580
  useStoreOrStoreById(storeOrStoreId),
561
581
  listener,
562
582
  listenerDeps,
563
- [tableId, cellId, descending, offset, limit],
583
+ isUndefined(sorter)
584
+ ? [tableId, cellId, descending, offset, limit]
585
+ : [sortedRowIdsArgs],
564
586
  mutator,
565
587
  );
588
+ };
566
589
  const useCreateStore = (create, createDeps = EMPTY_ARRAY) =>
567
590
  useMemo(create, createDeps);
568
591
  const useStoreIds = () => useThingIds(OFFSET_STORE);
@@ -632,6 +655,7 @@ const useSortedRowIds = (
632
655
  descending,
633
656
  offset,
634
657
  limit,
658
+ sorterOrStoreOrStoreId,
635
659
  storeOrStoreId,
636
660
  ) =>
637
661
  useSortedRowIdsImpl(
@@ -642,6 +666,7 @@ const useSortedRowIds = (
642
666
  tableIdOrArgs.descending ?? false,
643
667
  tableIdOrArgs.offset ?? 0,
644
668
  tableIdOrArgs.limit,
669
+ tableIdOrArgs.sorter,
645
670
  cellIdOrStoreOrStoreId,
646
671
  ]
647
672
  : [
@@ -650,7 +675,10 @@ const useSortedRowIds = (
650
675
  descending,
651
676
  offset,
652
677
  limit,
653
- storeOrStoreId,
678
+ isFunction(sorterOrStoreOrStoreId) ? sorterOrStoreOrStoreId : void 0,
679
+ isFunction(sorterOrStoreOrStoreId)
680
+ ? storeOrStoreId
681
+ : sorterOrStoreOrStoreId,
654
682
  ]),
655
683
  );
656
684
  const useHasRow = (tableId, rowId, storeOrStoreId) =>
@@ -1057,6 +1085,7 @@ const useSortedRowIdsListener = (
1057
1085
  tableIdOrArgs.descending ?? false,
1058
1086
  tableIdOrArgs.offset ?? 0,
1059
1087
  tableIdOrArgs.limit,
1088
+ tableIdOrArgs.sorter,
1060
1089
  cellIdOrListener,
1061
1090
  descendingOrListenerDeps,
1062
1091
  offsetOrMutator,
@@ -1068,6 +1097,7 @@ const useSortedRowIdsListener = (
1068
1097
  descendingOrListenerDeps,
1069
1098
  offsetOrMutator,
1070
1099
  limitOrStoreOrStoreId,
1100
+ void 0,
1071
1101
  listener,
1072
1102
  listenerDeps,
1073
1103
  mutator,
@@ -1302,6 +1332,13 @@ const useIndexIds = (indexesOrIndexesId) =>
1302
1332
  useIndexesOrIndexesById(indexesOrIndexesId),
1303
1333
  1 /* Array */,
1304
1334
  );
1335
+ const useHasIndex = (indexId, indexesOrIndexesId) =>
1336
+ useListenable(
1337
+ INDEX,
1338
+ useIndexesOrIndexesById(indexesOrIndexesId),
1339
+ 6 /* Boolean */,
1340
+ [indexId],
1341
+ );
1305
1342
  const useSliceRowIds = (indexId, sliceId, indexesOrIndexesId) =>
1306
1343
  useListenable(
1307
1344
  SLICE + ROW_IDS,
@@ -1309,6 +1346,13 @@ const useSliceRowIds = (indexId, sliceId, indexesOrIndexesId) =>
1309
1346
  1 /* Array */,
1310
1347
  [indexId, sliceId],
1311
1348
  );
1349
+ const useHasSlice = (indexId, sliceId, indexesOrIndexesId) =>
1350
+ useListenable(
1351
+ SLICE,
1352
+ useIndexesOrIndexesById(indexesOrIndexesId),
1353
+ 6 /* Boolean */,
1354
+ [indexId, sliceId],
1355
+ );
1312
1356
  const useSliceIdsListener = (
1313
1357
  indexId,
1314
1358
  listener,
@@ -2431,8 +2475,10 @@ export {
2431
2475
  useGoToCallback,
2432
2476
  useHasCell,
2433
2477
  useHasCellListener,
2478
+ useHasIndex,
2434
2479
  useHasRow,
2435
2480
  useHasRowListener,
2481
+ useHasSlice,
2436
2482
  useHasTable,
2437
2483
  useHasTableCell,
2438
2484
  useHasTableCellListener,