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
@@ -106,6 +106,7 @@ const REMOTE_ROW_ID = 'Remote' + ROW + 'Id';
106
106
  const CURRENT_TARGET = 'currentTarget';
107
107
  const _VALUE = 'value';
108
108
  const EXTRA = 'extra';
109
+ const REQUIRED = 'required';
109
110
  const UNDEFINED = '\uFFFC';
110
111
  const JSON_PREFIX = '\uFFFD';
111
112
  const id = (key) => EMPTY_STRING + key;
@@ -1259,6 +1260,7 @@ const createStore = () => {
1259
1260
  const valuesSchemaMap = mapNew();
1260
1261
  const valuesDefaulted = mapNew();
1261
1262
  const valuesNonDefaulted = setNew();
1263
+ const valuesRequiredNonDefaulted = setNew();
1262
1264
  const tablePoolFunctions = mapNew();
1263
1265
  const tableCellIds = mapNew();
1264
1266
  const tablesMap = mapNew();
@@ -1311,7 +1313,7 @@ const createStore = () => {
1311
1313
  const validateCellOrValueSchema = (schema) => {
1312
1314
  if (
1313
1315
  !objValidate(schema, (_child, id2) =>
1314
- arrayHas([TYPE, DEFAULT, ALLOW_NULL], id2),
1316
+ arrayHas([TYPE, DEFAULT, ALLOW_NULL, REQUIRED], id2),
1315
1317
  )
1316
1318
  ) {
1317
1319
  return false;
@@ -1346,20 +1348,32 @@ const createStore = () => {
1346
1348
  (row, rowId) => validateRow(tableId, rowId, row),
1347
1349
  () => cellInvalid(tableId),
1348
1350
  );
1349
- const validateRow = (tableId, rowId, row, skipDefaults) =>
1350
- objValidate(
1351
- skipDefaults ? row : addDefaultsToRow(row, tableId, rowId),
1352
- (cell, cellId) =>
1353
- ifNotUndefined(
1354
- getValidatedCell(tableId, rowId, cellId, cell),
1355
- (validCell) => {
1356
- row[cellId] = validCell;
1357
- return true;
1358
- },
1359
- () => false,
1360
- ),
1361
- () => cellInvalid(tableId, rowId),
1351
+ const validateRow = (tableId, rowId, row, skipDefaults) => {
1352
+ const rowWithDefaults = skipDefaults
1353
+ ? row
1354
+ : addDefaultsToRow(row, tableId, rowId);
1355
+ return (
1356
+ objValidate(
1357
+ rowWithDefaults,
1358
+ (cell, cellId) =>
1359
+ ifNotUndefined(
1360
+ getValidatedCell(tableId, rowId, cellId, cell),
1361
+ (validCell) => {
1362
+ row[cellId] = validCell;
1363
+ return true;
1364
+ },
1365
+ () => false,
1366
+ ),
1367
+ () => cellInvalid(tableId, rowId),
1368
+ ) &&
1369
+ (skipDefaults
1370
+ ? true
1371
+ : arrayEvery(
1372
+ collValues(mapGet(tablesSchemaRowCache, tableId)?.[2]),
1373
+ (cellId) => objHas(rowWithDefaults, cellId),
1374
+ ))
1362
1375
  );
1376
+ };
1363
1377
  const getValidatedCell = (tableId, rowId, cellId, cell) =>
1364
1378
  hasTablesSchema
1365
1379
  ? ifNotUndefined(
@@ -1385,20 +1399,31 @@ const createStore = () => {
1385
1399
  : isUndefined(getCellOrValueType(cell))
1386
1400
  ? cellInvalid(tableId, rowId, cellId, cell)
1387
1401
  : encodeIfJson(cell);
1388
- const validateValues = (values, skipDefaults) =>
1389
- objValidate(
1390
- skipDefaults ? values : addDefaultsToValues(values),
1391
- (value, valueId) =>
1392
- ifNotUndefined(
1393
- getValidatedValue(valueId, value),
1394
- (validValue) => {
1395
- values[valueId] = validValue;
1396
- return true;
1397
- },
1398
- () => false,
1399
- ),
1400
- () => valueInvalid(),
1402
+ const validateValues = (values, skipDefaults) => {
1403
+ const valuesWithDefaults = skipDefaults
1404
+ ? values
1405
+ : addDefaultsToValues(values);
1406
+ return (
1407
+ objValidate(
1408
+ valuesWithDefaults,
1409
+ (value, valueId) =>
1410
+ ifNotUndefined(
1411
+ getValidatedValue(valueId, value),
1412
+ (validValue) => {
1413
+ values[valueId] = validValue;
1414
+ return true;
1415
+ },
1416
+ () => false,
1417
+ ),
1418
+ () => valueInvalid(),
1419
+ ) &&
1420
+ (skipDefaults
1421
+ ? true
1422
+ : arrayEvery(collValues(valuesRequiredNonDefaulted), (valueId) =>
1423
+ objHas(valuesWithDefaults, valueId),
1424
+ ))
1401
1425
  );
1426
+ };
1402
1427
  const getValidatedValue = (valueId, value) =>
1403
1428
  hasValuesSchema
1404
1429
  ? ifNotUndefined(
@@ -1469,6 +1494,7 @@ const createStore = () => {
1469
1494
  (_tablesSchema, tableId, tableSchema) => {
1470
1495
  const rowDefaulted = mapNew();
1471
1496
  const rowNonDefaulted = setNew();
1497
+ const rowRequiredNonDefaulted = setNew();
1472
1498
  mapMatch(
1473
1499
  mapEnsure(tablesSchemaMap, tableId, mapNew),
1474
1500
  tableSchema,
@@ -1476,12 +1502,23 @@ const createStore = () => {
1476
1502
  mapSet(tableSchemaMap, cellId, cellSchema);
1477
1503
  ifNotUndefined(
1478
1504
  cellSchema[DEFAULT],
1479
- (def) => mapSet(rowDefaulted, cellId, def),
1480
- () => setAdd(rowNonDefaulted, cellId),
1505
+ (defaultCell) => {
1506
+ mapSet(rowDefaulted, cellId, defaultCell);
1507
+ },
1508
+ () => {
1509
+ setAdd(rowNonDefaulted, cellId);
1510
+ if (cellSchema[REQUIRED] === true) {
1511
+ setAdd(rowRequiredNonDefaulted, cellId);
1512
+ }
1513
+ },
1481
1514
  );
1482
1515
  },
1483
1516
  );
1484
- mapSet(tablesSchemaRowCache, tableId, [rowDefaulted, rowNonDefaulted]);
1517
+ mapSet(tablesSchemaRowCache, tableId, [
1518
+ rowDefaulted,
1519
+ rowNonDefaulted,
1520
+ rowRequiredNonDefaulted,
1521
+ ]);
1485
1522
  },
1486
1523
  (_tablesSchema, tableId) => {
1487
1524
  mapSet(tablesSchemaMap, tableId);
@@ -1496,14 +1533,27 @@ const createStore = () => {
1496
1533
  mapSet(valuesSchemaMap, valueId, valueSchema);
1497
1534
  ifNotUndefined(
1498
1535
  valueSchema[DEFAULT],
1499
- (def) => mapSet(valuesDefaulted, valueId, def),
1500
- () => setAdd(valuesNonDefaulted, valueId),
1536
+ (defaultValue) => {
1537
+ mapSet(valuesDefaulted, valueId, defaultValue);
1538
+ collDel(valuesNonDefaulted, valueId);
1539
+ collDel(valuesRequiredNonDefaulted, valueId);
1540
+ },
1541
+ () => {
1542
+ mapSet(valuesDefaulted, valueId);
1543
+ setAdd(valuesNonDefaulted, valueId);
1544
+ if (valueSchema[REQUIRED] === true) {
1545
+ setAdd(valuesRequiredNonDefaulted, valueId);
1546
+ } else {
1547
+ collDel(valuesRequiredNonDefaulted, valueId);
1548
+ }
1549
+ },
1501
1550
  );
1502
1551
  },
1503
1552
  (_valuesSchema, valueId) => {
1504
1553
  mapSet(valuesSchemaMap, valueId);
1505
1554
  mapSet(valuesDefaulted, valueId);
1506
1555
  collDel(valuesNonDefaulted, valueId);
1556
+ collDel(valuesRequiredNonDefaulted, valueId);
1507
1557
  },
1508
1558
  );
1509
1559
  const setOrDelTables = (tables) =>
@@ -2176,13 +2226,36 @@ const createStore = () => {
2176
2226
  listener,
2177
2227
  mutator,
2178
2228
  ) => {
2179
- let sortedRowIds = getSortedRowIds(tableId, cellId, ...otherArgs);
2229
+ const [descending, offset, limit, sorter] = otherArgs;
2230
+ let sortedRowIds = getSortedRowIds(
2231
+ tableId,
2232
+ cellId,
2233
+ descending,
2234
+ offset,
2235
+ limit,
2236
+ sorter,
2237
+ );
2180
2238
  return addListener(
2181
2239
  () => {
2182
- const newSortedRowIds = getSortedRowIds(tableId, cellId, ...otherArgs);
2240
+ const newSortedRowIds = getSortedRowIds(
2241
+ tableId,
2242
+ cellId,
2243
+ descending,
2244
+ offset,
2245
+ limit,
2246
+ sorter,
2247
+ );
2183
2248
  if (!arrayIsEqual(newSortedRowIds, sortedRowIds)) {
2184
2249
  sortedRowIds = newSortedRowIds;
2185
- listener(store, tableId, cellId, ...otherArgs, sortedRowIds);
2250
+ listener(
2251
+ store,
2252
+ tableId,
2253
+ cellId,
2254
+ descending,
2255
+ offset,
2256
+ limit,
2257
+ sortedRowIds,
2258
+ );
2186
2259
  }
2187
2260
  },
2188
2261
  sortedRowIdsListeners[mutator ? 1 : 0],
@@ -2236,6 +2309,7 @@ const createStore = () => {
2236
2309
  descending,
2237
2310
  offset = 0,
2238
2311
  limit,
2312
+ sorter = defaultSorter,
2239
2313
  ) =>
2240
2314
  isObject(tableIdOrArgs)
2241
2315
  ? getSortedRowIds(
@@ -2244,16 +2318,19 @@ const createStore = () => {
2244
2318
  tableIdOrArgs.descending,
2245
2319
  tableIdOrArgs.offset,
2246
2320
  tableIdOrArgs.limit,
2321
+ tableIdOrArgs.sorter,
2247
2322
  )
2248
2323
  : arrayMap(
2249
2324
  slice(
2250
2325
  arraySort(
2251
2326
  mapMap(mapGet(tablesMap, id(tableIdOrArgs)), (row, rowId) => [
2252
- isUndefined(cellId) ? rowId : mapGet(row, id(cellId)),
2327
+ isUndefined(cellId)
2328
+ ? rowId
2329
+ : decodeIfJson(mapGet(row, id(cellId))),
2253
2330
  rowId,
2254
2331
  ]),
2255
2332
  ([cell1], [cell2]) =>
2256
- defaultSorter(cell1, cell2) * (descending ? -1 : 1),
2333
+ sorter(cell1, cell2) * (descending ? -1 : 1),
2257
2334
  ),
2258
2335
  offset,
2259
2336
  isUndefined(limit) ? limit : offset + limit,
@@ -2731,6 +2808,7 @@ const createStore = () => {
2731
2808
  tableIdOrArgs.descending ?? false,
2732
2809
  tableIdOrArgs.offset ?? 0,
2733
2810
  tableIdOrArgs.limit,
2811
+ tableIdOrArgs.sorter,
2734
2812
  ],
2735
2813
  cellIdOrListener,
2736
2814
  descendingOrMutator,
@@ -2738,7 +2816,7 @@ const createStore = () => {
2738
2816
  : addSortedRowIdsListenerImpl(
2739
2817
  tableIdOrArgs,
2740
2818
  cellIdOrListener,
2741
- [descendingOrMutator, offset, limit],
2819
+ [descendingOrMutator, offset, limit, void 0],
2742
2820
  listener,
2743
2821
  mutator,
2744
2822
  );
@@ -3145,13 +3223,25 @@ const useSortedRowIdsImpl = (
3145
3223
  descending,
3146
3224
  offset,
3147
3225
  limit,
3226
+ sorter,
3148
3227
  storeOrStoreId,
3149
3228
  ) =>
3150
3229
  useListenable(
3151
3230
  SORTED_ROW_IDS,
3152
3231
  useStoreOrStoreById(storeOrStoreId),
3153
3232
  1 /* Array */,
3154
- [tableId, cellId, descending, offset, limit],
3233
+ isUndefined(sorter)
3234
+ ? [tableId, cellId, descending, offset, limit]
3235
+ : [
3236
+ () => ({
3237
+ tableId: getThing(tableId),
3238
+ cellId: getThing(cellId),
3239
+ descending: getThing(descending) ?? false,
3240
+ offset: getThing(offset) ?? 0,
3241
+ limit: getThing(limit),
3242
+ sorter: getThing(sorter),
3243
+ }),
3244
+ ],
3155
3245
  );
3156
3246
  const useStoreOrStoreById = (storeOrStoreId) =>
3157
3247
  useThingOrThingById(storeOrStoreId, OFFSET_STORE);
@@ -3179,6 +3269,7 @@ const useSortedRowIds = (
3179
3269
  descending,
3180
3270
  offset,
3181
3271
  limit,
3272
+ sorter,
3182
3273
  storeOrStoreId,
3183
3274
  ) =>
3184
3275
  isObject(tableIdOrArgs)
@@ -3188,6 +3279,7 @@ const useSortedRowIds = (
3188
3279
  tableIdOrArgs.descending ?? false,
3189
3280
  tableIdOrArgs.offset ?? 0,
3190
3281
  tableIdOrArgs.limit,
3282
+ () => tableIdOrArgs.sorter,
3191
3283
  cellIdOrStoreOrStoreId,
3192
3284
  )
3193
3285
  : useSortedRowIdsImpl(
@@ -3196,6 +3288,7 @@ const useSortedRowIds = (
3196
3288
  descending,
3197
3289
  offset,
3198
3290
  limit,
3291
+ isUndefined(sorter) ? void 0 : () => sorter,
3199
3292
  storeOrStoreId,
3200
3293
  );
3201
3294
  const useCell = (tableId, rowId, cellId, storeOrStoreId) =>
@@ -4197,6 +4290,7 @@ const SortedTableInHtmlTable = (props) => {
4197
4290
  () => sortAndOffset()[1],
4198
4291
  () => sortAndOffset()[2],
4199
4292
  () => props.limit,
4293
+ void 0,
4200
4294
  () => props.store,
4201
4295
  ),
4202
4296
  props.extraCellsBefore,
@@ -106,6 +106,7 @@ const REMOTE_ROW_ID = 'Remote' + ROW + 'Id';
106
106
  const CURRENT_TARGET = 'currentTarget';
107
107
  const _VALUE = 'value';
108
108
  const EXTRA = 'extra';
109
+ const REQUIRED = 'required';
109
110
  const UNDEFINED = '\uFFFC';
110
111
  const JSON_PREFIX = '\uFFFD';
111
112
  const id = (key) => EMPTY_STRING + key;
@@ -1259,6 +1260,7 @@ const createStore = () => {
1259
1260
  const valuesSchemaMap = mapNew();
1260
1261
  const valuesDefaulted = mapNew();
1261
1262
  const valuesNonDefaulted = setNew();
1263
+ const valuesRequiredNonDefaulted = setNew();
1262
1264
  const tablePoolFunctions = mapNew();
1263
1265
  const tableCellIds = mapNew();
1264
1266
  const tablesMap = mapNew();
@@ -1311,7 +1313,7 @@ const createStore = () => {
1311
1313
  const validateCellOrValueSchema = (schema) => {
1312
1314
  if (
1313
1315
  !objValidate(schema, (_child, id2) =>
1314
- arrayHas([TYPE, DEFAULT, ALLOW_NULL], id2),
1316
+ arrayHas([TYPE, DEFAULT, ALLOW_NULL, REQUIRED], id2),
1315
1317
  )
1316
1318
  ) {
1317
1319
  return false;
@@ -1346,20 +1348,32 @@ const createStore = () => {
1346
1348
  (row, rowId) => validateRow(tableId, rowId, row),
1347
1349
  () => cellInvalid(tableId),
1348
1350
  );
1349
- const validateRow = (tableId, rowId, row, skipDefaults) =>
1350
- objValidate(
1351
- skipDefaults ? row : addDefaultsToRow(row, tableId, rowId),
1352
- (cell, cellId) =>
1353
- ifNotUndefined(
1354
- getValidatedCell(tableId, rowId, cellId, cell),
1355
- (validCell) => {
1356
- row[cellId] = validCell;
1357
- return true;
1358
- },
1359
- () => false,
1360
- ),
1361
- () => cellInvalid(tableId, rowId),
1351
+ const validateRow = (tableId, rowId, row, skipDefaults) => {
1352
+ const rowWithDefaults = skipDefaults
1353
+ ? row
1354
+ : addDefaultsToRow(row, tableId, rowId);
1355
+ return (
1356
+ objValidate(
1357
+ rowWithDefaults,
1358
+ (cell, cellId) =>
1359
+ ifNotUndefined(
1360
+ getValidatedCell(tableId, rowId, cellId, cell),
1361
+ (validCell) => {
1362
+ row[cellId] = validCell;
1363
+ return true;
1364
+ },
1365
+ () => false,
1366
+ ),
1367
+ () => cellInvalid(tableId, rowId),
1368
+ ) &&
1369
+ (skipDefaults
1370
+ ? true
1371
+ : arrayEvery(
1372
+ collValues(mapGet(tablesSchemaRowCache, tableId)?.[2]),
1373
+ (cellId) => objHas(rowWithDefaults, cellId),
1374
+ ))
1362
1375
  );
1376
+ };
1363
1377
  const getValidatedCell = (tableId, rowId, cellId, cell) =>
1364
1378
  hasTablesSchema
1365
1379
  ? ifNotUndefined(
@@ -1385,20 +1399,31 @@ const createStore = () => {
1385
1399
  : isUndefined(getCellOrValueType(cell))
1386
1400
  ? cellInvalid(tableId, rowId, cellId, cell)
1387
1401
  : encodeIfJson(cell);
1388
- const validateValues = (values, skipDefaults) =>
1389
- objValidate(
1390
- skipDefaults ? values : addDefaultsToValues(values),
1391
- (value, valueId) =>
1392
- ifNotUndefined(
1393
- getValidatedValue(valueId, value),
1394
- (validValue) => {
1395
- values[valueId] = validValue;
1396
- return true;
1397
- },
1398
- () => false,
1399
- ),
1400
- () => valueInvalid(),
1402
+ const validateValues = (values, skipDefaults) => {
1403
+ const valuesWithDefaults = skipDefaults
1404
+ ? values
1405
+ : addDefaultsToValues(values);
1406
+ return (
1407
+ objValidate(
1408
+ valuesWithDefaults,
1409
+ (value, valueId) =>
1410
+ ifNotUndefined(
1411
+ getValidatedValue(valueId, value),
1412
+ (validValue) => {
1413
+ values[valueId] = validValue;
1414
+ return true;
1415
+ },
1416
+ () => false,
1417
+ ),
1418
+ () => valueInvalid(),
1419
+ ) &&
1420
+ (skipDefaults
1421
+ ? true
1422
+ : arrayEvery(collValues(valuesRequiredNonDefaulted), (valueId) =>
1423
+ objHas(valuesWithDefaults, valueId),
1424
+ ))
1401
1425
  );
1426
+ };
1402
1427
  const getValidatedValue = (valueId, value) =>
1403
1428
  hasValuesSchema
1404
1429
  ? ifNotUndefined(
@@ -1469,6 +1494,7 @@ const createStore = () => {
1469
1494
  (_tablesSchema, tableId, tableSchema) => {
1470
1495
  const rowDefaulted = mapNew();
1471
1496
  const rowNonDefaulted = setNew();
1497
+ const rowRequiredNonDefaulted = setNew();
1472
1498
  mapMatch(
1473
1499
  mapEnsure(tablesSchemaMap, tableId, mapNew),
1474
1500
  tableSchema,
@@ -1476,12 +1502,23 @@ const createStore = () => {
1476
1502
  mapSet(tableSchemaMap, cellId, cellSchema);
1477
1503
  ifNotUndefined(
1478
1504
  cellSchema[DEFAULT],
1479
- (def) => mapSet(rowDefaulted, cellId, def),
1480
- () => setAdd(rowNonDefaulted, cellId),
1505
+ (defaultCell) => {
1506
+ mapSet(rowDefaulted, cellId, defaultCell);
1507
+ },
1508
+ () => {
1509
+ setAdd(rowNonDefaulted, cellId);
1510
+ if (cellSchema[REQUIRED] === true) {
1511
+ setAdd(rowRequiredNonDefaulted, cellId);
1512
+ }
1513
+ },
1481
1514
  );
1482
1515
  },
1483
1516
  );
1484
- mapSet(tablesSchemaRowCache, tableId, [rowDefaulted, rowNonDefaulted]);
1517
+ mapSet(tablesSchemaRowCache, tableId, [
1518
+ rowDefaulted,
1519
+ rowNonDefaulted,
1520
+ rowRequiredNonDefaulted,
1521
+ ]);
1485
1522
  },
1486
1523
  (_tablesSchema, tableId) => {
1487
1524
  mapSet(tablesSchemaMap, tableId);
@@ -1496,14 +1533,27 @@ const createStore = () => {
1496
1533
  mapSet(valuesSchemaMap, valueId, valueSchema);
1497
1534
  ifNotUndefined(
1498
1535
  valueSchema[DEFAULT],
1499
- (def) => mapSet(valuesDefaulted, valueId, def),
1500
- () => setAdd(valuesNonDefaulted, valueId),
1536
+ (defaultValue) => {
1537
+ mapSet(valuesDefaulted, valueId, defaultValue);
1538
+ collDel(valuesNonDefaulted, valueId);
1539
+ collDel(valuesRequiredNonDefaulted, valueId);
1540
+ },
1541
+ () => {
1542
+ mapSet(valuesDefaulted, valueId);
1543
+ setAdd(valuesNonDefaulted, valueId);
1544
+ if (valueSchema[REQUIRED] === true) {
1545
+ setAdd(valuesRequiredNonDefaulted, valueId);
1546
+ } else {
1547
+ collDel(valuesRequiredNonDefaulted, valueId);
1548
+ }
1549
+ },
1501
1550
  );
1502
1551
  },
1503
1552
  (_valuesSchema, valueId) => {
1504
1553
  mapSet(valuesSchemaMap, valueId);
1505
1554
  mapSet(valuesDefaulted, valueId);
1506
1555
  collDel(valuesNonDefaulted, valueId);
1556
+ collDel(valuesRequiredNonDefaulted, valueId);
1507
1557
  },
1508
1558
  );
1509
1559
  const setOrDelTables = (tables) =>
@@ -2176,13 +2226,36 @@ const createStore = () => {
2176
2226
  listener,
2177
2227
  mutator,
2178
2228
  ) => {
2179
- let sortedRowIds = getSortedRowIds(tableId, cellId, ...otherArgs);
2229
+ const [descending, offset, limit, sorter] = otherArgs;
2230
+ let sortedRowIds = getSortedRowIds(
2231
+ tableId,
2232
+ cellId,
2233
+ descending,
2234
+ offset,
2235
+ limit,
2236
+ sorter,
2237
+ );
2180
2238
  return addListener(
2181
2239
  () => {
2182
- const newSortedRowIds = getSortedRowIds(tableId, cellId, ...otherArgs);
2240
+ const newSortedRowIds = getSortedRowIds(
2241
+ tableId,
2242
+ cellId,
2243
+ descending,
2244
+ offset,
2245
+ limit,
2246
+ sorter,
2247
+ );
2183
2248
  if (!arrayIsEqual(newSortedRowIds, sortedRowIds)) {
2184
2249
  sortedRowIds = newSortedRowIds;
2185
- listener(store, tableId, cellId, ...otherArgs, sortedRowIds);
2250
+ listener(
2251
+ store,
2252
+ tableId,
2253
+ cellId,
2254
+ descending,
2255
+ offset,
2256
+ limit,
2257
+ sortedRowIds,
2258
+ );
2186
2259
  }
2187
2260
  },
2188
2261
  sortedRowIdsListeners[mutator ? 1 : 0],
@@ -2236,6 +2309,7 @@ const createStore = () => {
2236
2309
  descending,
2237
2310
  offset = 0,
2238
2311
  limit,
2312
+ sorter = defaultSorter,
2239
2313
  ) =>
2240
2314
  isObject(tableIdOrArgs)
2241
2315
  ? getSortedRowIds(
@@ -2244,16 +2318,19 @@ const createStore = () => {
2244
2318
  tableIdOrArgs.descending,
2245
2319
  tableIdOrArgs.offset,
2246
2320
  tableIdOrArgs.limit,
2321
+ tableIdOrArgs.sorter,
2247
2322
  )
2248
2323
  : arrayMap(
2249
2324
  slice(
2250
2325
  arraySort(
2251
2326
  mapMap(mapGet(tablesMap, id(tableIdOrArgs)), (row, rowId) => [
2252
- isUndefined(cellId) ? rowId : mapGet(row, id(cellId)),
2327
+ isUndefined(cellId)
2328
+ ? rowId
2329
+ : decodeIfJson(mapGet(row, id(cellId))),
2253
2330
  rowId,
2254
2331
  ]),
2255
2332
  ([cell1], [cell2]) =>
2256
- defaultSorter(cell1, cell2) * (descending ? -1 : 1),
2333
+ sorter(cell1, cell2) * (descending ? -1 : 1),
2257
2334
  ),
2258
2335
  offset,
2259
2336
  isUndefined(limit) ? limit : offset + limit,
@@ -2731,6 +2808,7 @@ const createStore = () => {
2731
2808
  tableIdOrArgs.descending ?? false,
2732
2809
  tableIdOrArgs.offset ?? 0,
2733
2810
  tableIdOrArgs.limit,
2811
+ tableIdOrArgs.sorter,
2734
2812
  ],
2735
2813
  cellIdOrListener,
2736
2814
  descendingOrMutator,
@@ -2738,7 +2816,7 @@ const createStore = () => {
2738
2816
  : addSortedRowIdsListenerImpl(
2739
2817
  tableIdOrArgs,
2740
2818
  cellIdOrListener,
2741
- [descendingOrMutator, offset, limit],
2819
+ [descendingOrMutator, offset, limit, void 0],
2742
2820
  listener,
2743
2821
  mutator,
2744
2822
  );
@@ -3145,13 +3223,25 @@ const useSortedRowIdsImpl = (
3145
3223
  descending,
3146
3224
  offset,
3147
3225
  limit,
3226
+ sorter,
3148
3227
  storeOrStoreId,
3149
3228
  ) =>
3150
3229
  useListenable(
3151
3230
  SORTED_ROW_IDS,
3152
3231
  useStoreOrStoreById(storeOrStoreId),
3153
3232
  1 /* Array */,
3154
- [tableId, cellId, descending, offset, limit],
3233
+ isUndefined(sorter)
3234
+ ? [tableId, cellId, descending, offset, limit]
3235
+ : [
3236
+ () => ({
3237
+ tableId: getThing(tableId),
3238
+ cellId: getThing(cellId),
3239
+ descending: getThing(descending) ?? false,
3240
+ offset: getThing(offset) ?? 0,
3241
+ limit: getThing(limit),
3242
+ sorter: getThing(sorter),
3243
+ }),
3244
+ ],
3155
3245
  );
3156
3246
  const useStoreOrStoreById = (storeOrStoreId) =>
3157
3247
  useThingOrThingById(storeOrStoreId, OFFSET_STORE);
@@ -3179,6 +3269,7 @@ const useSortedRowIds = (
3179
3269
  descending,
3180
3270
  offset,
3181
3271
  limit,
3272
+ sorter,
3182
3273
  storeOrStoreId,
3183
3274
  ) =>
3184
3275
  isObject(tableIdOrArgs)
@@ -3188,6 +3279,7 @@ const useSortedRowIds = (
3188
3279
  tableIdOrArgs.descending ?? false,
3189
3280
  tableIdOrArgs.offset ?? 0,
3190
3281
  tableIdOrArgs.limit,
3282
+ () => tableIdOrArgs.sorter,
3191
3283
  cellIdOrStoreOrStoreId,
3192
3284
  )
3193
3285
  : useSortedRowIdsImpl(
@@ -3196,6 +3288,7 @@ const useSortedRowIds = (
3196
3288
  descending,
3197
3289
  offset,
3198
3290
  limit,
3291
+ isUndefined(sorter) ? void 0 : () => sorter,
3199
3292
  storeOrStoreId,
3200
3293
  );
3201
3294
  const useCell = (tableId, rowId, cellId, storeOrStoreId) =>
@@ -4197,6 +4290,7 @@ const SortedTableInHtmlTable = (props) => {
4197
4290
  () => sortAndOffset()[1],
4198
4291
  () => sortAndOffset()[2],
4199
4292
  () => props.limit,
4293
+ void 0,
4200
4294
  () => props.store,
4201
4295
  ),
4202
4296
  props.extraCellsBefore,