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
@@ -73,6 +73,7 @@ const REMOTE_ROW_ID = 'Remote' + ROW + 'Id';
73
73
  const CURRENT_TARGET = 'currentTarget';
74
74
  const _VALUE = 'value';
75
75
  const EXTRA = 'extra';
76
+ const REQUIRED = 'required';
76
77
  const UNDEFINED = '\uFFFC';
77
78
  const JSON_PREFIX = '\uFFFD';
78
79
  const id = (key) => EMPTY_STRING + key;
@@ -1200,6 +1201,7 @@ const createStore = () => {
1200
1201
  const valuesSchemaMap = mapNew();
1201
1202
  const valuesDefaulted = mapNew();
1202
1203
  const valuesNonDefaulted = setNew();
1204
+ const valuesRequiredNonDefaulted = setNew();
1203
1205
  const tablePoolFunctions = mapNew();
1204
1206
  const tableCellIds = mapNew();
1205
1207
  const tablesMap = mapNew();
@@ -1252,7 +1254,7 @@ const createStore = () => {
1252
1254
  const validateCellOrValueSchema = (schema) => {
1253
1255
  if (
1254
1256
  !objValidate(schema, (_child, id2) =>
1255
- arrayHas([TYPE, DEFAULT, ALLOW_NULL], id2),
1257
+ arrayHas([TYPE, DEFAULT, ALLOW_NULL, REQUIRED], id2),
1256
1258
  )
1257
1259
  ) {
1258
1260
  return false;
@@ -1287,20 +1289,32 @@ const createStore = () => {
1287
1289
  (row, rowId) => validateRow(tableId, rowId, row),
1288
1290
  () => cellInvalid(tableId),
1289
1291
  );
1290
- const validateRow = (tableId, rowId, row, skipDefaults) =>
1291
- objValidate(
1292
- skipDefaults ? row : addDefaultsToRow(row, tableId, rowId),
1293
- (cell, cellId) =>
1294
- ifNotUndefined(
1295
- getValidatedCell(tableId, rowId, cellId, cell),
1296
- (validCell) => {
1297
- row[cellId] = validCell;
1298
- return true;
1299
- },
1300
- () => false,
1301
- ),
1302
- () => cellInvalid(tableId, rowId),
1292
+ const validateRow = (tableId, rowId, row, skipDefaults) => {
1293
+ const rowWithDefaults = skipDefaults
1294
+ ? row
1295
+ : addDefaultsToRow(row, tableId, rowId);
1296
+ return (
1297
+ objValidate(
1298
+ rowWithDefaults,
1299
+ (cell, cellId) =>
1300
+ ifNotUndefined(
1301
+ getValidatedCell(tableId, rowId, cellId, cell),
1302
+ (validCell) => {
1303
+ row[cellId] = validCell;
1304
+ return true;
1305
+ },
1306
+ () => false,
1307
+ ),
1308
+ () => cellInvalid(tableId, rowId),
1309
+ ) &&
1310
+ (skipDefaults
1311
+ ? true
1312
+ : arrayEvery(
1313
+ collValues(mapGet(tablesSchemaRowCache, tableId)?.[2]),
1314
+ (cellId) => objHas(rowWithDefaults, cellId),
1315
+ ))
1303
1316
  );
1317
+ };
1304
1318
  const getValidatedCell = (tableId, rowId, cellId, cell) =>
1305
1319
  hasTablesSchema
1306
1320
  ? ifNotUndefined(
@@ -1326,20 +1340,31 @@ const createStore = () => {
1326
1340
  : isUndefined(getCellOrValueType(cell))
1327
1341
  ? cellInvalid(tableId, rowId, cellId, cell)
1328
1342
  : encodeIfJson(cell);
1329
- const validateValues = (values, skipDefaults) =>
1330
- objValidate(
1331
- skipDefaults ? values : addDefaultsToValues(values),
1332
- (value, valueId) =>
1333
- ifNotUndefined(
1334
- getValidatedValue(valueId, value),
1335
- (validValue) => {
1336
- values[valueId] = validValue;
1337
- return true;
1338
- },
1339
- () => false,
1340
- ),
1341
- () => valueInvalid(),
1343
+ const validateValues = (values, skipDefaults) => {
1344
+ const valuesWithDefaults = skipDefaults
1345
+ ? values
1346
+ : addDefaultsToValues(values);
1347
+ return (
1348
+ objValidate(
1349
+ valuesWithDefaults,
1350
+ (value, valueId) =>
1351
+ ifNotUndefined(
1352
+ getValidatedValue(valueId, value),
1353
+ (validValue) => {
1354
+ values[valueId] = validValue;
1355
+ return true;
1356
+ },
1357
+ () => false,
1358
+ ),
1359
+ () => valueInvalid(),
1360
+ ) &&
1361
+ (skipDefaults
1362
+ ? true
1363
+ : arrayEvery(collValues(valuesRequiredNonDefaulted), (valueId) =>
1364
+ objHas(valuesWithDefaults, valueId),
1365
+ ))
1342
1366
  );
1367
+ };
1343
1368
  const getValidatedValue = (valueId, value) =>
1344
1369
  hasValuesSchema
1345
1370
  ? ifNotUndefined(
@@ -1410,6 +1435,7 @@ const createStore = () => {
1410
1435
  (_tablesSchema, tableId, tableSchema) => {
1411
1436
  const rowDefaulted = mapNew();
1412
1437
  const rowNonDefaulted = setNew();
1438
+ const rowRequiredNonDefaulted = setNew();
1413
1439
  mapMatch(
1414
1440
  mapEnsure(tablesSchemaMap, tableId, mapNew),
1415
1441
  tableSchema,
@@ -1417,12 +1443,23 @@ const createStore = () => {
1417
1443
  mapSet(tableSchemaMap, cellId, cellSchema);
1418
1444
  ifNotUndefined(
1419
1445
  cellSchema[DEFAULT],
1420
- (def) => mapSet(rowDefaulted, cellId, def),
1421
- () => setAdd(rowNonDefaulted, cellId),
1446
+ (defaultCell) => {
1447
+ mapSet(rowDefaulted, cellId, defaultCell);
1448
+ },
1449
+ () => {
1450
+ setAdd(rowNonDefaulted, cellId);
1451
+ if (cellSchema[REQUIRED] === true) {
1452
+ setAdd(rowRequiredNonDefaulted, cellId);
1453
+ }
1454
+ },
1422
1455
  );
1423
1456
  },
1424
1457
  );
1425
- mapSet(tablesSchemaRowCache, tableId, [rowDefaulted, rowNonDefaulted]);
1458
+ mapSet(tablesSchemaRowCache, tableId, [
1459
+ rowDefaulted,
1460
+ rowNonDefaulted,
1461
+ rowRequiredNonDefaulted,
1462
+ ]);
1426
1463
  },
1427
1464
  (_tablesSchema, tableId) => {
1428
1465
  mapSet(tablesSchemaMap, tableId);
@@ -1437,14 +1474,27 @@ const createStore = () => {
1437
1474
  mapSet(valuesSchemaMap, valueId, valueSchema);
1438
1475
  ifNotUndefined(
1439
1476
  valueSchema[DEFAULT],
1440
- (def) => mapSet(valuesDefaulted, valueId, def),
1441
- () => setAdd(valuesNonDefaulted, valueId),
1477
+ (defaultValue) => {
1478
+ mapSet(valuesDefaulted, valueId, defaultValue);
1479
+ collDel(valuesNonDefaulted, valueId);
1480
+ collDel(valuesRequiredNonDefaulted, valueId);
1481
+ },
1482
+ () => {
1483
+ mapSet(valuesDefaulted, valueId);
1484
+ setAdd(valuesNonDefaulted, valueId);
1485
+ if (valueSchema[REQUIRED] === true) {
1486
+ setAdd(valuesRequiredNonDefaulted, valueId);
1487
+ } else {
1488
+ collDel(valuesRequiredNonDefaulted, valueId);
1489
+ }
1490
+ },
1442
1491
  );
1443
1492
  },
1444
1493
  (_valuesSchema, valueId) => {
1445
1494
  mapSet(valuesSchemaMap, valueId);
1446
1495
  mapSet(valuesDefaulted, valueId);
1447
1496
  collDel(valuesNonDefaulted, valueId);
1497
+ collDel(valuesRequiredNonDefaulted, valueId);
1448
1498
  },
1449
1499
  );
1450
1500
  const setOrDelTables = (tables) =>
@@ -2117,13 +2167,36 @@ const createStore = () => {
2117
2167
  listener,
2118
2168
  mutator,
2119
2169
  ) => {
2120
- let sortedRowIds = getSortedRowIds(tableId, cellId, ...otherArgs);
2170
+ const [descending, offset, limit, sorter] = otherArgs;
2171
+ let sortedRowIds = getSortedRowIds(
2172
+ tableId,
2173
+ cellId,
2174
+ descending,
2175
+ offset,
2176
+ limit,
2177
+ sorter,
2178
+ );
2121
2179
  return addListener(
2122
2180
  () => {
2123
- const newSortedRowIds = getSortedRowIds(tableId, cellId, ...otherArgs);
2181
+ const newSortedRowIds = getSortedRowIds(
2182
+ tableId,
2183
+ cellId,
2184
+ descending,
2185
+ offset,
2186
+ limit,
2187
+ sorter,
2188
+ );
2124
2189
  if (!arrayIsEqual(newSortedRowIds, sortedRowIds)) {
2125
2190
  sortedRowIds = newSortedRowIds;
2126
- listener(store, tableId, cellId, ...otherArgs, sortedRowIds);
2191
+ listener(
2192
+ store,
2193
+ tableId,
2194
+ cellId,
2195
+ descending,
2196
+ offset,
2197
+ limit,
2198
+ sortedRowIds,
2199
+ );
2127
2200
  }
2128
2201
  },
2129
2202
  sortedRowIdsListeners[mutator ? 1 : 0],
@@ -2177,6 +2250,7 @@ const createStore = () => {
2177
2250
  descending,
2178
2251
  offset = 0,
2179
2252
  limit,
2253
+ sorter = defaultSorter,
2180
2254
  ) =>
2181
2255
  isObject(tableIdOrArgs)
2182
2256
  ? getSortedRowIds(
@@ -2185,16 +2259,19 @@ const createStore = () => {
2185
2259
  tableIdOrArgs.descending,
2186
2260
  tableIdOrArgs.offset,
2187
2261
  tableIdOrArgs.limit,
2262
+ tableIdOrArgs.sorter,
2188
2263
  )
2189
2264
  : arrayMap(
2190
2265
  slice(
2191
2266
  arraySort(
2192
2267
  mapMap(mapGet(tablesMap, id(tableIdOrArgs)), (row, rowId) => [
2193
- isUndefined(cellId) ? rowId : mapGet(row, id(cellId)),
2268
+ isUndefined(cellId)
2269
+ ? rowId
2270
+ : decodeIfJson(mapGet(row, id(cellId))),
2194
2271
  rowId,
2195
2272
  ]),
2196
2273
  ([cell1], [cell2]) =>
2197
- defaultSorter(cell1, cell2) * (descending ? -1 : 1),
2274
+ sorter(cell1, cell2) * (descending ? -1 : 1),
2198
2275
  ),
2199
2276
  offset,
2200
2277
  isUndefined(limit) ? limit : offset + limit,
@@ -2672,6 +2749,7 @@ const createStore = () => {
2672
2749
  tableIdOrArgs.descending ?? false,
2673
2750
  tableIdOrArgs.offset ?? 0,
2674
2751
  tableIdOrArgs.limit,
2752
+ tableIdOrArgs.sorter,
2675
2753
  ],
2676
2754
  cellIdOrListener,
2677
2755
  descendingOrMutator,
@@ -2679,7 +2757,7 @@ const createStore = () => {
2679
2757
  : addSortedRowIdsListenerImpl(
2680
2758
  tableIdOrArgs,
2681
2759
  cellIdOrListener,
2682
- [descendingOrMutator, offset, limit],
2760
+ [descendingOrMutator, offset, limit, void 0],
2683
2761
  listener,
2684
2762
  mutator,
2685
2763
  );
@@ -3153,14 +3231,29 @@ const useSortedRowIdsImpl = (
3153
3231
  descending,
3154
3232
  offset,
3155
3233
  limit,
3234
+ sorter,
3156
3235
  storeOrStoreId,
3157
- ) =>
3158
- useListenable(
3236
+ ) => {
3237
+ const sortedRowIdsArgs = useMemo(
3238
+ () => ({
3239
+ tableId,
3240
+ cellId,
3241
+ descending: descending ?? false,
3242
+ offset: offset ?? 0,
3243
+ limit,
3244
+ sorter,
3245
+ }),
3246
+ [tableId, cellId, descending, offset, limit, sorter],
3247
+ );
3248
+ return useListenable(
3159
3249
  SORTED_ROW_IDS,
3160
3250
  useStoreOrStoreById(storeOrStoreId),
3161
3251
  1 /* Array */,
3162
- [tableId, cellId, descending, offset, limit],
3252
+ isUndefined(sorter)
3253
+ ? [tableId, cellId, descending, offset, limit]
3254
+ : [sortedRowIdsArgs],
3163
3255
  );
3256
+ };
3164
3257
  const useStoreOrStoreById = (storeOrStoreId) =>
3165
3258
  useThingOrThingById(storeOrStoreId, OFFSET_STORE);
3166
3259
  const useHasTables = (storeOrStoreId) =>
@@ -3194,6 +3287,7 @@ const useSortedRowIds = (
3194
3287
  descending,
3195
3288
  offset,
3196
3289
  limit,
3290
+ sorterOrStoreOrStoreId,
3197
3291
  storeOrStoreId,
3198
3292
  ) =>
3199
3293
  useSortedRowIdsImpl(
@@ -3204,6 +3298,7 @@ const useSortedRowIds = (
3204
3298
  tableIdOrArgs.descending ?? false,
3205
3299
  tableIdOrArgs.offset ?? 0,
3206
3300
  tableIdOrArgs.limit,
3301
+ tableIdOrArgs.sorter,
3207
3302
  cellIdOrStoreOrStoreId,
3208
3303
  ]
3209
3304
  : [
@@ -3212,7 +3307,10 @@ const useSortedRowIds = (
3212
3307
  descending,
3213
3308
  offset,
3214
3309
  limit,
3215
- storeOrStoreId,
3310
+ isFunction(sorterOrStoreOrStoreId) ? sorterOrStoreOrStoreId : void 0,
3311
+ isFunction(sorterOrStoreOrStoreId)
3312
+ ? storeOrStoreId
3313
+ : sorterOrStoreOrStoreId,
3216
3314
  ]),
3217
3315
  );
3218
3316
  const useCell = (tableId, rowId, cellId, storeOrStoreId) =>
@@ -73,6 +73,7 @@ const REMOTE_ROW_ID = 'Remote' + ROW + 'Id';
73
73
  const CURRENT_TARGET = 'currentTarget';
74
74
  const _VALUE = 'value';
75
75
  const EXTRA = 'extra';
76
+ const REQUIRED = 'required';
76
77
  const UNDEFINED = '\uFFFC';
77
78
  const JSON_PREFIX = '\uFFFD';
78
79
  const id = (key) => EMPTY_STRING + key;
@@ -1200,6 +1201,7 @@ const createStore = () => {
1200
1201
  const valuesSchemaMap = mapNew();
1201
1202
  const valuesDefaulted = mapNew();
1202
1203
  const valuesNonDefaulted = setNew();
1204
+ const valuesRequiredNonDefaulted = setNew();
1203
1205
  const tablePoolFunctions = mapNew();
1204
1206
  const tableCellIds = mapNew();
1205
1207
  const tablesMap = mapNew();
@@ -1252,7 +1254,7 @@ const createStore = () => {
1252
1254
  const validateCellOrValueSchema = (schema) => {
1253
1255
  if (
1254
1256
  !objValidate(schema, (_child, id2) =>
1255
- arrayHas([TYPE, DEFAULT, ALLOW_NULL], id2),
1257
+ arrayHas([TYPE, DEFAULT, ALLOW_NULL, REQUIRED], id2),
1256
1258
  )
1257
1259
  ) {
1258
1260
  return false;
@@ -1287,20 +1289,32 @@ const createStore = () => {
1287
1289
  (row, rowId) => validateRow(tableId, rowId, row),
1288
1290
  () => cellInvalid(tableId),
1289
1291
  );
1290
- const validateRow = (tableId, rowId, row, skipDefaults) =>
1291
- objValidate(
1292
- skipDefaults ? row : addDefaultsToRow(row, tableId, rowId),
1293
- (cell, cellId) =>
1294
- ifNotUndefined(
1295
- getValidatedCell(tableId, rowId, cellId, cell),
1296
- (validCell) => {
1297
- row[cellId] = validCell;
1298
- return true;
1299
- },
1300
- () => false,
1301
- ),
1302
- () => cellInvalid(tableId, rowId),
1292
+ const validateRow = (tableId, rowId, row, skipDefaults) => {
1293
+ const rowWithDefaults = skipDefaults
1294
+ ? row
1295
+ : addDefaultsToRow(row, tableId, rowId);
1296
+ return (
1297
+ objValidate(
1298
+ rowWithDefaults,
1299
+ (cell, cellId) =>
1300
+ ifNotUndefined(
1301
+ getValidatedCell(tableId, rowId, cellId, cell),
1302
+ (validCell) => {
1303
+ row[cellId] = validCell;
1304
+ return true;
1305
+ },
1306
+ () => false,
1307
+ ),
1308
+ () => cellInvalid(tableId, rowId),
1309
+ ) &&
1310
+ (skipDefaults
1311
+ ? true
1312
+ : arrayEvery(
1313
+ collValues(mapGet(tablesSchemaRowCache, tableId)?.[2]),
1314
+ (cellId) => objHas(rowWithDefaults, cellId),
1315
+ ))
1303
1316
  );
1317
+ };
1304
1318
  const getValidatedCell = (tableId, rowId, cellId, cell) =>
1305
1319
  hasTablesSchema
1306
1320
  ? ifNotUndefined(
@@ -1326,20 +1340,31 @@ const createStore = () => {
1326
1340
  : isUndefined(getCellOrValueType(cell))
1327
1341
  ? cellInvalid(tableId, rowId, cellId, cell)
1328
1342
  : encodeIfJson(cell);
1329
- const validateValues = (values, skipDefaults) =>
1330
- objValidate(
1331
- skipDefaults ? values : addDefaultsToValues(values),
1332
- (value, valueId) =>
1333
- ifNotUndefined(
1334
- getValidatedValue(valueId, value),
1335
- (validValue) => {
1336
- values[valueId] = validValue;
1337
- return true;
1338
- },
1339
- () => false,
1340
- ),
1341
- () => valueInvalid(),
1343
+ const validateValues = (values, skipDefaults) => {
1344
+ const valuesWithDefaults = skipDefaults
1345
+ ? values
1346
+ : addDefaultsToValues(values);
1347
+ return (
1348
+ objValidate(
1349
+ valuesWithDefaults,
1350
+ (value, valueId) =>
1351
+ ifNotUndefined(
1352
+ getValidatedValue(valueId, value),
1353
+ (validValue) => {
1354
+ values[valueId] = validValue;
1355
+ return true;
1356
+ },
1357
+ () => false,
1358
+ ),
1359
+ () => valueInvalid(),
1360
+ ) &&
1361
+ (skipDefaults
1362
+ ? true
1363
+ : arrayEvery(collValues(valuesRequiredNonDefaulted), (valueId) =>
1364
+ objHas(valuesWithDefaults, valueId),
1365
+ ))
1342
1366
  );
1367
+ };
1343
1368
  const getValidatedValue = (valueId, value) =>
1344
1369
  hasValuesSchema
1345
1370
  ? ifNotUndefined(
@@ -1410,6 +1435,7 @@ const createStore = () => {
1410
1435
  (_tablesSchema, tableId, tableSchema) => {
1411
1436
  const rowDefaulted = mapNew();
1412
1437
  const rowNonDefaulted = setNew();
1438
+ const rowRequiredNonDefaulted = setNew();
1413
1439
  mapMatch(
1414
1440
  mapEnsure(tablesSchemaMap, tableId, mapNew),
1415
1441
  tableSchema,
@@ -1417,12 +1443,23 @@ const createStore = () => {
1417
1443
  mapSet(tableSchemaMap, cellId, cellSchema);
1418
1444
  ifNotUndefined(
1419
1445
  cellSchema[DEFAULT],
1420
- (def) => mapSet(rowDefaulted, cellId, def),
1421
- () => setAdd(rowNonDefaulted, cellId),
1446
+ (defaultCell) => {
1447
+ mapSet(rowDefaulted, cellId, defaultCell);
1448
+ },
1449
+ () => {
1450
+ setAdd(rowNonDefaulted, cellId);
1451
+ if (cellSchema[REQUIRED] === true) {
1452
+ setAdd(rowRequiredNonDefaulted, cellId);
1453
+ }
1454
+ },
1422
1455
  );
1423
1456
  },
1424
1457
  );
1425
- mapSet(tablesSchemaRowCache, tableId, [rowDefaulted, rowNonDefaulted]);
1458
+ mapSet(tablesSchemaRowCache, tableId, [
1459
+ rowDefaulted,
1460
+ rowNonDefaulted,
1461
+ rowRequiredNonDefaulted,
1462
+ ]);
1426
1463
  },
1427
1464
  (_tablesSchema, tableId) => {
1428
1465
  mapSet(tablesSchemaMap, tableId);
@@ -1437,14 +1474,27 @@ const createStore = () => {
1437
1474
  mapSet(valuesSchemaMap, valueId, valueSchema);
1438
1475
  ifNotUndefined(
1439
1476
  valueSchema[DEFAULT],
1440
- (def) => mapSet(valuesDefaulted, valueId, def),
1441
- () => setAdd(valuesNonDefaulted, valueId),
1477
+ (defaultValue) => {
1478
+ mapSet(valuesDefaulted, valueId, defaultValue);
1479
+ collDel(valuesNonDefaulted, valueId);
1480
+ collDel(valuesRequiredNonDefaulted, valueId);
1481
+ },
1482
+ () => {
1483
+ mapSet(valuesDefaulted, valueId);
1484
+ setAdd(valuesNonDefaulted, valueId);
1485
+ if (valueSchema[REQUIRED] === true) {
1486
+ setAdd(valuesRequiredNonDefaulted, valueId);
1487
+ } else {
1488
+ collDel(valuesRequiredNonDefaulted, valueId);
1489
+ }
1490
+ },
1442
1491
  );
1443
1492
  },
1444
1493
  (_valuesSchema, valueId) => {
1445
1494
  mapSet(valuesSchemaMap, valueId);
1446
1495
  mapSet(valuesDefaulted, valueId);
1447
1496
  collDel(valuesNonDefaulted, valueId);
1497
+ collDel(valuesRequiredNonDefaulted, valueId);
1448
1498
  },
1449
1499
  );
1450
1500
  const setOrDelTables = (tables) =>
@@ -2117,13 +2167,36 @@ const createStore = () => {
2117
2167
  listener,
2118
2168
  mutator,
2119
2169
  ) => {
2120
- let sortedRowIds = getSortedRowIds(tableId, cellId, ...otherArgs);
2170
+ const [descending, offset, limit, sorter] = otherArgs;
2171
+ let sortedRowIds = getSortedRowIds(
2172
+ tableId,
2173
+ cellId,
2174
+ descending,
2175
+ offset,
2176
+ limit,
2177
+ sorter,
2178
+ );
2121
2179
  return addListener(
2122
2180
  () => {
2123
- const newSortedRowIds = getSortedRowIds(tableId, cellId, ...otherArgs);
2181
+ const newSortedRowIds = getSortedRowIds(
2182
+ tableId,
2183
+ cellId,
2184
+ descending,
2185
+ offset,
2186
+ limit,
2187
+ sorter,
2188
+ );
2124
2189
  if (!arrayIsEqual(newSortedRowIds, sortedRowIds)) {
2125
2190
  sortedRowIds = newSortedRowIds;
2126
- listener(store, tableId, cellId, ...otherArgs, sortedRowIds);
2191
+ listener(
2192
+ store,
2193
+ tableId,
2194
+ cellId,
2195
+ descending,
2196
+ offset,
2197
+ limit,
2198
+ sortedRowIds,
2199
+ );
2127
2200
  }
2128
2201
  },
2129
2202
  sortedRowIdsListeners[mutator ? 1 : 0],
@@ -2177,6 +2250,7 @@ const createStore = () => {
2177
2250
  descending,
2178
2251
  offset = 0,
2179
2252
  limit,
2253
+ sorter = defaultSorter,
2180
2254
  ) =>
2181
2255
  isObject(tableIdOrArgs)
2182
2256
  ? getSortedRowIds(
@@ -2185,16 +2259,19 @@ const createStore = () => {
2185
2259
  tableIdOrArgs.descending,
2186
2260
  tableIdOrArgs.offset,
2187
2261
  tableIdOrArgs.limit,
2262
+ tableIdOrArgs.sorter,
2188
2263
  )
2189
2264
  : arrayMap(
2190
2265
  slice(
2191
2266
  arraySort(
2192
2267
  mapMap(mapGet(tablesMap, id(tableIdOrArgs)), (row, rowId) => [
2193
- isUndefined(cellId) ? rowId : mapGet(row, id(cellId)),
2268
+ isUndefined(cellId)
2269
+ ? rowId
2270
+ : decodeIfJson(mapGet(row, id(cellId))),
2194
2271
  rowId,
2195
2272
  ]),
2196
2273
  ([cell1], [cell2]) =>
2197
- defaultSorter(cell1, cell2) * (descending ? -1 : 1),
2274
+ sorter(cell1, cell2) * (descending ? -1 : 1),
2198
2275
  ),
2199
2276
  offset,
2200
2277
  isUndefined(limit) ? limit : offset + limit,
@@ -2672,6 +2749,7 @@ const createStore = () => {
2672
2749
  tableIdOrArgs.descending ?? false,
2673
2750
  tableIdOrArgs.offset ?? 0,
2674
2751
  tableIdOrArgs.limit,
2752
+ tableIdOrArgs.sorter,
2675
2753
  ],
2676
2754
  cellIdOrListener,
2677
2755
  descendingOrMutator,
@@ -2679,7 +2757,7 @@ const createStore = () => {
2679
2757
  : addSortedRowIdsListenerImpl(
2680
2758
  tableIdOrArgs,
2681
2759
  cellIdOrListener,
2682
- [descendingOrMutator, offset, limit],
2760
+ [descendingOrMutator, offset, limit, void 0],
2683
2761
  listener,
2684
2762
  mutator,
2685
2763
  );
@@ -3153,14 +3231,29 @@ const useSortedRowIdsImpl = (
3153
3231
  descending,
3154
3232
  offset,
3155
3233
  limit,
3234
+ sorter,
3156
3235
  storeOrStoreId,
3157
- ) =>
3158
- useListenable(
3236
+ ) => {
3237
+ const sortedRowIdsArgs = useMemo(
3238
+ () => ({
3239
+ tableId,
3240
+ cellId,
3241
+ descending: descending ?? false,
3242
+ offset: offset ?? 0,
3243
+ limit,
3244
+ sorter,
3245
+ }),
3246
+ [tableId, cellId, descending, offset, limit, sorter],
3247
+ );
3248
+ return useListenable(
3159
3249
  SORTED_ROW_IDS,
3160
3250
  useStoreOrStoreById(storeOrStoreId),
3161
3251
  1 /* Array */,
3162
- [tableId, cellId, descending, offset, limit],
3252
+ isUndefined(sorter)
3253
+ ? [tableId, cellId, descending, offset, limit]
3254
+ : [sortedRowIdsArgs],
3163
3255
  );
3256
+ };
3164
3257
  const useStoreOrStoreById = (storeOrStoreId) =>
3165
3258
  useThingOrThingById(storeOrStoreId, OFFSET_STORE);
3166
3259
  const useHasTables = (storeOrStoreId) =>
@@ -3194,6 +3287,7 @@ const useSortedRowIds = (
3194
3287
  descending,
3195
3288
  offset,
3196
3289
  limit,
3290
+ sorterOrStoreOrStoreId,
3197
3291
  storeOrStoreId,
3198
3292
  ) =>
3199
3293
  useSortedRowIdsImpl(
@@ -3204,6 +3298,7 @@ const useSortedRowIds = (
3204
3298
  tableIdOrArgs.descending ?? false,
3205
3299
  tableIdOrArgs.offset ?? 0,
3206
3300
  tableIdOrArgs.limit,
3301
+ tableIdOrArgs.sorter,
3207
3302
  cellIdOrStoreOrStoreId,
3208
3303
  ]
3209
3304
  : [
@@ -3212,7 +3307,10 @@ const useSortedRowIds = (
3212
3307
  descending,
3213
3308
  offset,
3214
3309
  limit,
3215
- storeOrStoreId,
3310
+ isFunction(sorterOrStoreOrStoreId) ? sorterOrStoreOrStoreId : void 0,
3311
+ isFunction(sorterOrStoreOrStoreId)
3312
+ ? storeOrStoreId
3313
+ : sorterOrStoreOrStoreId,
3216
3314
  ]),
3217
3315
  );
3218
3316
  const useCell = (tableId, rowId, cellId, storeOrStoreId) =>