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/index.js CHANGED
@@ -35,6 +35,7 @@ const VALUE = 'Value';
35
35
  const VALUES = VALUE + 's';
36
36
  const VALUE_IDS = VALUE + IDS;
37
37
  const TRANSACTION = 'Transaction';
38
+ const REQUIRED = 'required';
38
39
  const JSON_PREFIX = '\uFFFD';
39
40
  const id = (key) => EMPTY_STRING + key;
40
41
  const strStartsWith = (str, prefix) => str.startsWith(prefix);
@@ -929,7 +930,9 @@ const defaultSorter = (sortKey1, sortKey2) =>
929
930
  (sortKey1 ?? 0) < (sortKey2 ?? 0) ? -1 : 1;
930
931
 
931
932
  const createIndexes = getCreateFunction((store) => {
933
+ const hasIndexListeners = mapNew();
932
934
  const sliceIdsListeners = mapNew();
935
+ const hasSliceListeners = mapNew();
933
936
  const sliceRowIdsListeners = mapNew();
934
937
  const [addListener, callListeners, delListenerImpl] = getListenerFunctions(
935
938
  () => indexes,
@@ -968,6 +971,7 @@ const createIndexes = getCreateFunction((store) => {
968
971
  sliceIdSorter,
969
972
  rowIdSorter = defaultSorter,
970
973
  ) => {
974
+ const hadIndex = hasIndex(indexId);
971
975
  const sliceIdArraySorter = isUndefined(sliceIdSorter)
972
976
  ? void 0
973
977
  : ([id1], [id2]) => sliceIdSorter(id1, id2);
@@ -984,8 +988,14 @@ const createIndexes = getCreateFunction((store) => {
984
988
  ) => {
985
989
  let sliceIdsChanged = 0;
986
990
  const changedSlices = setNew();
991
+ const hadSlices = mapNew();
987
992
  const unsortedSlices = setNew();
988
993
  const index = getIndex(indexId);
994
+ const setHadSlice = (sliceId) => {
995
+ if (!collHas(hadSlices, sliceId)) {
996
+ mapSet(hadSlices, sliceId, collHas(index, sliceId));
997
+ }
998
+ };
989
999
  collForEach(
990
1000
  changedSliceIds,
991
1001
  ([oldSliceIdOrIds, newSliceIdOrIds], rowId) => {
@@ -997,6 +1007,7 @@ const createIndexes = getCreateFunction((store) => {
997
1007
  : 0,
998
1008
  );
999
1009
  collForEach(oldSliceIds, (oldSliceId) => {
1010
+ setHadSlice(oldSliceId);
1000
1011
  setAdd(changedSlices, oldSliceId);
1001
1012
  ifNotUndefined(mapGet(index, oldSliceId), (oldSlice) => {
1002
1013
  collDel(oldSlice, rowId);
@@ -1007,6 +1018,7 @@ const createIndexes = getCreateFunction((store) => {
1007
1018
  });
1008
1019
  });
1009
1020
  collForEach(newSliceIds, (newSliceId) => {
1021
+ setHadSlice(newSliceId);
1010
1022
  setAdd(changedSlices, newSliceId);
1011
1023
  if (!collHas(index, newSliceId)) {
1012
1024
  mapSet(index, newSliceId, setNew());
@@ -1068,6 +1080,12 @@ const createIndexes = getCreateFunction((store) => {
1068
1080
  if (sliceIdsChanged) {
1069
1081
  callListeners(sliceIdsListeners, [indexId]);
1070
1082
  }
1083
+ mapForEach(hadSlices, (sliceId, hadSlice) => {
1084
+ const hasSliceNow = collHas(index, sliceId);
1085
+ if (hadSlice != hasSliceNow) {
1086
+ callListeners(hasSliceListeners, [indexId, sliceId], hasSliceNow);
1087
+ }
1088
+ });
1071
1089
  collForEach(changedSlices, (sliceId) =>
1072
1090
  callListeners(sliceRowIdsListeners, [indexId, sliceId]),
1073
1091
  );
@@ -1075,6 +1093,9 @@ const createIndexes = getCreateFunction((store) => {
1075
1093
  getRowCellFunction(getSliceIdOrIds),
1076
1094
  ifNotUndefined(getSortKey, getRowCellFunction),
1077
1095
  );
1096
+ if (!hadIndex) {
1097
+ callListeners(hasIndexListeners, [indexId], true);
1098
+ }
1078
1099
  return indexes;
1079
1100
  };
1080
1101
  const forEachIndex = (indexCallback) =>
@@ -1098,7 +1119,20 @@ const createIndexes = getCreateFunction((store) => {
1098
1119
  );
1099
1120
  };
1100
1121
  const delIndexDefinition = (indexId) => {
1122
+ const index = getIndex(indexId);
1123
+ const hadIndex = hasIndex(indexId);
1124
+ const sliceIds = hadIndex ? mapKeys(index) : [];
1101
1125
  delDefinition(indexId);
1126
+ if (hadIndex) {
1127
+ callListeners(hasIndexListeners, [indexId], false);
1128
+ if (sliceIds.length > 0) {
1129
+ callListeners(sliceIdsListeners, [indexId]);
1130
+ arrayForEach(sliceIds, (sliceId) => {
1131
+ callListeners(hasSliceListeners, [indexId, sliceId], false);
1132
+ callListeners(sliceRowIdsListeners, [indexId, sliceId]);
1133
+ });
1134
+ }
1135
+ }
1102
1136
  return indexes;
1103
1137
  };
1104
1138
  const getSliceIds = (indexId) => mapKeys(getIndex(indexId));
@@ -1106,6 +1140,10 @@ const createIndexes = getCreateFunction((store) => {
1106
1140
  collValues(mapGet(getIndex(indexId), sliceId));
1107
1141
  const addSliceIdsListener = (indexId, listener) =>
1108
1142
  addListener(listener, sliceIdsListeners, [indexId]);
1143
+ const addHasIndexListener = (indexId, listener) =>
1144
+ addListener(listener, hasIndexListeners, [indexId]);
1145
+ const addHasSliceListener = (indexId, sliceId, listener) =>
1146
+ addListener(listener, hasSliceListeners, [indexId, sliceId]);
1109
1147
  const addSliceRowIdsListener = (indexId, sliceId, listener) =>
1110
1148
  addListener(listener, sliceRowIdsListeners, [indexId, sliceId]);
1111
1149
  const delListener = (listenerId) => {
@@ -1129,7 +1167,9 @@ const createIndexes = getCreateFunction((store) => {
1129
1167
  getSliceIds,
1130
1168
  getSliceRowIds,
1131
1169
  addIndexIdsListener,
1170
+ addHasIndexListener,
1132
1171
  addSliceIdsListener,
1172
+ addHasSliceListener,
1133
1173
  addSliceRowIdsListener,
1134
1174
  delListener,
1135
1175
  destroy,
@@ -1236,6 +1276,7 @@ const createStore = () => {
1236
1276
  const valuesSchemaMap = mapNew();
1237
1277
  const valuesDefaulted = mapNew();
1238
1278
  const valuesNonDefaulted = setNew();
1279
+ const valuesRequiredNonDefaulted = setNew();
1239
1280
  const tablePoolFunctions = mapNew();
1240
1281
  const tableCellIds = mapNew();
1241
1282
  const tablesMap = mapNew();
@@ -1288,7 +1329,7 @@ const createStore = () => {
1288
1329
  const validateCellOrValueSchema = (schema) => {
1289
1330
  if (
1290
1331
  !objValidate(schema, (_child, id2) =>
1291
- arrayHas([TYPE, DEFAULT, ALLOW_NULL], id2),
1332
+ arrayHas([TYPE, DEFAULT, ALLOW_NULL, REQUIRED], id2),
1292
1333
  )
1293
1334
  ) {
1294
1335
  return false;
@@ -1323,20 +1364,32 @@ const createStore = () => {
1323
1364
  (row, rowId) => validateRow(tableId, rowId, row),
1324
1365
  () => cellInvalid(tableId),
1325
1366
  );
1326
- const validateRow = (tableId, rowId, row, skipDefaults) =>
1327
- objValidate(
1328
- skipDefaults ? row : addDefaultsToRow(row, tableId, rowId),
1329
- (cell, cellId) =>
1330
- ifNotUndefined(
1331
- getValidatedCell(tableId, rowId, cellId, cell),
1332
- (validCell) => {
1333
- row[cellId] = validCell;
1334
- return true;
1335
- },
1336
- () => false,
1337
- ),
1338
- () => cellInvalid(tableId, rowId),
1367
+ const validateRow = (tableId, rowId, row, skipDefaults) => {
1368
+ const rowWithDefaults = skipDefaults
1369
+ ? row
1370
+ : addDefaultsToRow(row, tableId, rowId);
1371
+ return (
1372
+ objValidate(
1373
+ rowWithDefaults,
1374
+ (cell, cellId) =>
1375
+ ifNotUndefined(
1376
+ getValidatedCell(tableId, rowId, cellId, cell),
1377
+ (validCell) => {
1378
+ row[cellId] = validCell;
1379
+ return true;
1380
+ },
1381
+ () => false,
1382
+ ),
1383
+ () => cellInvalid(tableId, rowId),
1384
+ ) &&
1385
+ (skipDefaults
1386
+ ? true
1387
+ : arrayEvery(
1388
+ collValues(mapGet(tablesSchemaRowCache, tableId)?.[2]),
1389
+ (cellId) => objHas(rowWithDefaults, cellId),
1390
+ ))
1339
1391
  );
1392
+ };
1340
1393
  const getValidatedCell = (tableId, rowId, cellId, cell) =>
1341
1394
  hasTablesSchema
1342
1395
  ? ifNotUndefined(
@@ -1362,20 +1415,31 @@ const createStore = () => {
1362
1415
  : isUndefined(getCellOrValueType(cell))
1363
1416
  ? cellInvalid(tableId, rowId, cellId, cell)
1364
1417
  : encodeIfJson(cell);
1365
- const validateValues = (values, skipDefaults) =>
1366
- objValidate(
1367
- skipDefaults ? values : addDefaultsToValues(values),
1368
- (value, valueId) =>
1369
- ifNotUndefined(
1370
- getValidatedValue(valueId, value),
1371
- (validValue) => {
1372
- values[valueId] = validValue;
1373
- return true;
1374
- },
1375
- () => false,
1376
- ),
1377
- () => valueInvalid(),
1418
+ const validateValues = (values, skipDefaults) => {
1419
+ const valuesWithDefaults = skipDefaults
1420
+ ? values
1421
+ : addDefaultsToValues(values);
1422
+ return (
1423
+ objValidate(
1424
+ valuesWithDefaults,
1425
+ (value, valueId) =>
1426
+ ifNotUndefined(
1427
+ getValidatedValue(valueId, value),
1428
+ (validValue) => {
1429
+ values[valueId] = validValue;
1430
+ return true;
1431
+ },
1432
+ () => false,
1433
+ ),
1434
+ () => valueInvalid(),
1435
+ ) &&
1436
+ (skipDefaults
1437
+ ? true
1438
+ : arrayEvery(collValues(valuesRequiredNonDefaulted), (valueId) =>
1439
+ objHas(valuesWithDefaults, valueId),
1440
+ ))
1378
1441
  );
1442
+ };
1379
1443
  const getValidatedValue = (valueId, value) =>
1380
1444
  hasValuesSchema
1381
1445
  ? ifNotUndefined(
@@ -1446,6 +1510,7 @@ const createStore = () => {
1446
1510
  (_tablesSchema, tableId, tableSchema) => {
1447
1511
  const rowDefaulted = mapNew();
1448
1512
  const rowNonDefaulted = setNew();
1513
+ const rowRequiredNonDefaulted = setNew();
1449
1514
  mapMatch(
1450
1515
  mapEnsure(tablesSchemaMap, tableId, mapNew),
1451
1516
  tableSchema,
@@ -1453,12 +1518,23 @@ const createStore = () => {
1453
1518
  mapSet(tableSchemaMap, cellId, cellSchema);
1454
1519
  ifNotUndefined(
1455
1520
  cellSchema[DEFAULT],
1456
- (def) => mapSet(rowDefaulted, cellId, def),
1457
- () => setAdd(rowNonDefaulted, cellId),
1521
+ (defaultCell) => {
1522
+ mapSet(rowDefaulted, cellId, defaultCell);
1523
+ },
1524
+ () => {
1525
+ setAdd(rowNonDefaulted, cellId);
1526
+ if (cellSchema[REQUIRED] === true) {
1527
+ setAdd(rowRequiredNonDefaulted, cellId);
1528
+ }
1529
+ },
1458
1530
  );
1459
1531
  },
1460
1532
  );
1461
- mapSet(tablesSchemaRowCache, tableId, [rowDefaulted, rowNonDefaulted]);
1533
+ mapSet(tablesSchemaRowCache, tableId, [
1534
+ rowDefaulted,
1535
+ rowNonDefaulted,
1536
+ rowRequiredNonDefaulted,
1537
+ ]);
1462
1538
  },
1463
1539
  (_tablesSchema, tableId) => {
1464
1540
  mapSet(tablesSchemaMap, tableId);
@@ -1473,14 +1549,27 @@ const createStore = () => {
1473
1549
  mapSet(valuesSchemaMap, valueId, valueSchema);
1474
1550
  ifNotUndefined(
1475
1551
  valueSchema[DEFAULT],
1476
- (def) => mapSet(valuesDefaulted, valueId, def),
1477
- () => setAdd(valuesNonDefaulted, valueId),
1552
+ (defaultValue) => {
1553
+ mapSet(valuesDefaulted, valueId, defaultValue);
1554
+ collDel(valuesNonDefaulted, valueId);
1555
+ collDel(valuesRequiredNonDefaulted, valueId);
1556
+ },
1557
+ () => {
1558
+ mapSet(valuesDefaulted, valueId);
1559
+ setAdd(valuesNonDefaulted, valueId);
1560
+ if (valueSchema[REQUIRED] === true) {
1561
+ setAdd(valuesRequiredNonDefaulted, valueId);
1562
+ } else {
1563
+ collDel(valuesRequiredNonDefaulted, valueId);
1564
+ }
1565
+ },
1478
1566
  );
1479
1567
  },
1480
1568
  (_valuesSchema, valueId) => {
1481
1569
  mapSet(valuesSchemaMap, valueId);
1482
1570
  mapSet(valuesDefaulted, valueId);
1483
1571
  collDel(valuesNonDefaulted, valueId);
1572
+ collDel(valuesRequiredNonDefaulted, valueId);
1484
1573
  },
1485
1574
  );
1486
1575
  const setOrDelTables = (tables) =>
@@ -2153,13 +2242,36 @@ const createStore = () => {
2153
2242
  listener,
2154
2243
  mutator,
2155
2244
  ) => {
2156
- let sortedRowIds = getSortedRowIds(tableId, cellId, ...otherArgs);
2245
+ const [descending, offset, limit, sorter] = otherArgs;
2246
+ let sortedRowIds = getSortedRowIds(
2247
+ tableId,
2248
+ cellId,
2249
+ descending,
2250
+ offset,
2251
+ limit,
2252
+ sorter,
2253
+ );
2157
2254
  return addListener(
2158
2255
  () => {
2159
- const newSortedRowIds = getSortedRowIds(tableId, cellId, ...otherArgs);
2256
+ const newSortedRowIds = getSortedRowIds(
2257
+ tableId,
2258
+ cellId,
2259
+ descending,
2260
+ offset,
2261
+ limit,
2262
+ sorter,
2263
+ );
2160
2264
  if (!arrayIsEqual(newSortedRowIds, sortedRowIds)) {
2161
2265
  sortedRowIds = newSortedRowIds;
2162
- listener(store, tableId, cellId, ...otherArgs, sortedRowIds);
2266
+ listener(
2267
+ store,
2268
+ tableId,
2269
+ cellId,
2270
+ descending,
2271
+ offset,
2272
+ limit,
2273
+ sortedRowIds,
2274
+ );
2163
2275
  }
2164
2276
  },
2165
2277
  sortedRowIdsListeners[mutator ? 1 : 0],
@@ -2213,6 +2325,7 @@ const createStore = () => {
2213
2325
  descending,
2214
2326
  offset = 0,
2215
2327
  limit,
2328
+ sorter = defaultSorter,
2216
2329
  ) =>
2217
2330
  isObject(tableIdOrArgs)
2218
2331
  ? getSortedRowIds(
@@ -2221,16 +2334,19 @@ const createStore = () => {
2221
2334
  tableIdOrArgs.descending,
2222
2335
  tableIdOrArgs.offset,
2223
2336
  tableIdOrArgs.limit,
2337
+ tableIdOrArgs.sorter,
2224
2338
  )
2225
2339
  : arrayMap(
2226
2340
  slice(
2227
2341
  arraySort(
2228
2342
  mapMap(mapGet(tablesMap, id(tableIdOrArgs)), (row, rowId) => [
2229
- isUndefined(cellId) ? rowId : mapGet(row, id(cellId)),
2343
+ isUndefined(cellId)
2344
+ ? rowId
2345
+ : decodeIfJson(mapGet(row, id(cellId))),
2230
2346
  rowId,
2231
2347
  ]),
2232
2348
  ([cell1], [cell2]) =>
2233
- defaultSorter(cell1, cell2) * (descending ? -1 : 1),
2349
+ sorter(cell1, cell2) * (descending ? -1 : 1),
2234
2350
  ),
2235
2351
  offset,
2236
2352
  isUndefined(limit) ? limit : offset + limit,
@@ -2708,6 +2824,7 @@ const createStore = () => {
2708
2824
  tableIdOrArgs.descending ?? false,
2709
2825
  tableIdOrArgs.offset ?? 0,
2710
2826
  tableIdOrArgs.limit,
2827
+ tableIdOrArgs.sorter,
2711
2828
  ],
2712
2829
  cellIdOrListener,
2713
2830
  descendingOrMutator,
@@ -2715,7 +2832,7 @@ const createStore = () => {
2715
2832
  : addSortedRowIdsListenerImpl(
2716
2833
  tableIdOrArgs,
2717
2834
  cellIdOrListener,
2718
- [descendingOrMutator, offset, limit],
2835
+ [descendingOrMutator, offset, limit, void 0],
2719
2836
  listener,
2720
2837
  mutator,
2721
2838
  );
package/indexes/index.js CHANGED
@@ -339,7 +339,9 @@ const getListenerFunctions = (getThing) => {
339
339
  };
340
340
 
341
341
  const createIndexes = getCreateFunction((store) => {
342
+ const hasIndexListeners = mapNew();
342
343
  const sliceIdsListeners = mapNew();
344
+ const hasSliceListeners = mapNew();
343
345
  const sliceRowIdsListeners = mapNew();
344
346
  const [addListener, callListeners, delListenerImpl] = getListenerFunctions(
345
347
  () => indexes,
@@ -378,6 +380,7 @@ const createIndexes = getCreateFunction((store) => {
378
380
  sliceIdSorter,
379
381
  rowIdSorter = defaultSorter,
380
382
  ) => {
383
+ const hadIndex = hasIndex(indexId);
381
384
  const sliceIdArraySorter = isUndefined(sliceIdSorter)
382
385
  ? void 0
383
386
  : ([id1], [id2]) => sliceIdSorter(id1, id2);
@@ -394,8 +397,14 @@ const createIndexes = getCreateFunction((store) => {
394
397
  ) => {
395
398
  let sliceIdsChanged = 0;
396
399
  const changedSlices = setNew();
400
+ const hadSlices = mapNew();
397
401
  const unsortedSlices = setNew();
398
402
  const index = getIndex(indexId);
403
+ const setHadSlice = (sliceId) => {
404
+ if (!collHas(hadSlices, sliceId)) {
405
+ mapSet(hadSlices, sliceId, collHas(index, sliceId));
406
+ }
407
+ };
399
408
  collForEach(
400
409
  changedSliceIds,
401
410
  ([oldSliceIdOrIds, newSliceIdOrIds], rowId) => {
@@ -407,6 +416,7 @@ const createIndexes = getCreateFunction((store) => {
407
416
  : 0,
408
417
  );
409
418
  collForEach(oldSliceIds, (oldSliceId) => {
419
+ setHadSlice(oldSliceId);
410
420
  setAdd(changedSlices, oldSliceId);
411
421
  ifNotUndefined(mapGet(index, oldSliceId), (oldSlice) => {
412
422
  collDel(oldSlice, rowId);
@@ -417,6 +427,7 @@ const createIndexes = getCreateFunction((store) => {
417
427
  });
418
428
  });
419
429
  collForEach(newSliceIds, (newSliceId) => {
430
+ setHadSlice(newSliceId);
420
431
  setAdd(changedSlices, newSliceId);
421
432
  if (!collHas(index, newSliceId)) {
422
433
  mapSet(index, newSliceId, setNew());
@@ -478,6 +489,12 @@ const createIndexes = getCreateFunction((store) => {
478
489
  if (sliceIdsChanged) {
479
490
  callListeners(sliceIdsListeners, [indexId]);
480
491
  }
492
+ mapForEach(hadSlices, (sliceId, hadSlice) => {
493
+ const hasSliceNow = collHas(index, sliceId);
494
+ if (hadSlice != hasSliceNow) {
495
+ callListeners(hasSliceListeners, [indexId, sliceId], hasSliceNow);
496
+ }
497
+ });
481
498
  collForEach(changedSlices, (sliceId) =>
482
499
  callListeners(sliceRowIdsListeners, [indexId, sliceId]),
483
500
  );
@@ -485,6 +502,9 @@ const createIndexes = getCreateFunction((store) => {
485
502
  getRowCellFunction(getSliceIdOrIds),
486
503
  ifNotUndefined(getSortKey, getRowCellFunction),
487
504
  );
505
+ if (!hadIndex) {
506
+ callListeners(hasIndexListeners, [indexId], true);
507
+ }
488
508
  return indexes;
489
509
  };
490
510
  const forEachIndex = (indexCallback) =>
@@ -508,7 +528,20 @@ const createIndexes = getCreateFunction((store) => {
508
528
  );
509
529
  };
510
530
  const delIndexDefinition = (indexId) => {
531
+ const index = getIndex(indexId);
532
+ const hadIndex = hasIndex(indexId);
533
+ const sliceIds = hadIndex ? mapKeys(index) : [];
511
534
  delDefinition(indexId);
535
+ if (hadIndex) {
536
+ callListeners(hasIndexListeners, [indexId], false);
537
+ if (sliceIds.length > 0) {
538
+ callListeners(sliceIdsListeners, [indexId]);
539
+ arrayForEach(sliceIds, (sliceId) => {
540
+ callListeners(hasSliceListeners, [indexId, sliceId], false);
541
+ callListeners(sliceRowIdsListeners, [indexId, sliceId]);
542
+ });
543
+ }
544
+ }
512
545
  return indexes;
513
546
  };
514
547
  const getSliceIds = (indexId) => mapKeys(getIndex(indexId));
@@ -516,6 +549,10 @@ const createIndexes = getCreateFunction((store) => {
516
549
  collValues(mapGet(getIndex(indexId), sliceId));
517
550
  const addSliceIdsListener = (indexId, listener) =>
518
551
  addListener(listener, sliceIdsListeners, [indexId]);
552
+ const addHasIndexListener = (indexId, listener) =>
553
+ addListener(listener, hasIndexListeners, [indexId]);
554
+ const addHasSliceListener = (indexId, sliceId, listener) =>
555
+ addListener(listener, hasSliceListeners, [indexId, sliceId]);
519
556
  const addSliceRowIdsListener = (indexId, sliceId, listener) =>
520
557
  addListener(listener, sliceRowIdsListeners, [indexId, sliceId]);
521
558
  const delListener = (listenerId) => {
@@ -539,7 +576,9 @@ const createIndexes = getCreateFunction((store) => {
539
576
  getSliceIds,
540
577
  getSliceRowIds,
541
578
  addIndexIdsListener,
579
+ addHasIndexListener,
542
580
  addSliceIdsListener,
581
+ addHasSliceListener,
543
582
  addSliceRowIdsListener,
544
583
  delListener,
545
584
  destroy,
@@ -339,7 +339,9 @@ const getListenerFunctions = (getThing) => {
339
339
  };
340
340
 
341
341
  const createIndexes = getCreateFunction((store) => {
342
+ const hasIndexListeners = mapNew();
342
343
  const sliceIdsListeners = mapNew();
344
+ const hasSliceListeners = mapNew();
343
345
  const sliceRowIdsListeners = mapNew();
344
346
  const [addListener, callListeners, delListenerImpl] = getListenerFunctions(
345
347
  () => indexes,
@@ -378,6 +380,7 @@ const createIndexes = getCreateFunction((store) => {
378
380
  sliceIdSorter,
379
381
  rowIdSorter = defaultSorter,
380
382
  ) => {
383
+ const hadIndex = hasIndex(indexId);
381
384
  const sliceIdArraySorter = isUndefined(sliceIdSorter)
382
385
  ? void 0
383
386
  : ([id1], [id2]) => sliceIdSorter(id1, id2);
@@ -394,8 +397,14 @@ const createIndexes = getCreateFunction((store) => {
394
397
  ) => {
395
398
  let sliceIdsChanged = 0;
396
399
  const changedSlices = setNew();
400
+ const hadSlices = mapNew();
397
401
  const unsortedSlices = setNew();
398
402
  const index = getIndex(indexId);
403
+ const setHadSlice = (sliceId) => {
404
+ if (!collHas(hadSlices, sliceId)) {
405
+ mapSet(hadSlices, sliceId, collHas(index, sliceId));
406
+ }
407
+ };
399
408
  collForEach(
400
409
  changedSliceIds,
401
410
  ([oldSliceIdOrIds, newSliceIdOrIds], rowId) => {
@@ -407,6 +416,7 @@ const createIndexes = getCreateFunction((store) => {
407
416
  : 0,
408
417
  );
409
418
  collForEach(oldSliceIds, (oldSliceId) => {
419
+ setHadSlice(oldSliceId);
410
420
  setAdd(changedSlices, oldSliceId);
411
421
  ifNotUndefined(mapGet(index, oldSliceId), (oldSlice) => {
412
422
  collDel(oldSlice, rowId);
@@ -417,6 +427,7 @@ const createIndexes = getCreateFunction((store) => {
417
427
  });
418
428
  });
419
429
  collForEach(newSliceIds, (newSliceId) => {
430
+ setHadSlice(newSliceId);
420
431
  setAdd(changedSlices, newSliceId);
421
432
  if (!collHas(index, newSliceId)) {
422
433
  mapSet(index, newSliceId, setNew());
@@ -478,6 +489,12 @@ const createIndexes = getCreateFunction((store) => {
478
489
  if (sliceIdsChanged) {
479
490
  callListeners(sliceIdsListeners, [indexId]);
480
491
  }
492
+ mapForEach(hadSlices, (sliceId, hadSlice) => {
493
+ const hasSliceNow = collHas(index, sliceId);
494
+ if (hadSlice != hasSliceNow) {
495
+ callListeners(hasSliceListeners, [indexId, sliceId], hasSliceNow);
496
+ }
497
+ });
481
498
  collForEach(changedSlices, (sliceId) =>
482
499
  callListeners(sliceRowIdsListeners, [indexId, sliceId]),
483
500
  );
@@ -485,6 +502,9 @@ const createIndexes = getCreateFunction((store) => {
485
502
  getRowCellFunction(getSliceIdOrIds),
486
503
  ifNotUndefined(getSortKey, getRowCellFunction),
487
504
  );
505
+ if (!hadIndex) {
506
+ callListeners(hasIndexListeners, [indexId], true);
507
+ }
488
508
  return indexes;
489
509
  };
490
510
  const forEachIndex = (indexCallback) =>
@@ -508,7 +528,20 @@ const createIndexes = getCreateFunction((store) => {
508
528
  );
509
529
  };
510
530
  const delIndexDefinition = (indexId) => {
531
+ const index = getIndex(indexId);
532
+ const hadIndex = hasIndex(indexId);
533
+ const sliceIds = hadIndex ? mapKeys(index) : [];
511
534
  delDefinition(indexId);
535
+ if (hadIndex) {
536
+ callListeners(hasIndexListeners, [indexId], false);
537
+ if (sliceIds.length > 0) {
538
+ callListeners(sliceIdsListeners, [indexId]);
539
+ arrayForEach(sliceIds, (sliceId) => {
540
+ callListeners(hasSliceListeners, [indexId, sliceId], false);
541
+ callListeners(sliceRowIdsListeners, [indexId, sliceId]);
542
+ });
543
+ }
544
+ }
512
545
  return indexes;
513
546
  };
514
547
  const getSliceIds = (indexId) => mapKeys(getIndex(indexId));
@@ -516,6 +549,10 @@ const createIndexes = getCreateFunction((store) => {
516
549
  collValues(mapGet(getIndex(indexId), sliceId));
517
550
  const addSliceIdsListener = (indexId, listener) =>
518
551
  addListener(listener, sliceIdsListeners, [indexId]);
552
+ const addHasIndexListener = (indexId, listener) =>
553
+ addListener(listener, hasIndexListeners, [indexId]);
554
+ const addHasSliceListener = (indexId, sliceId, listener) =>
555
+ addListener(listener, hasSliceListeners, [indexId, sliceId]);
519
556
  const addSliceRowIdsListener = (indexId, sliceId, listener) =>
520
557
  addListener(listener, sliceRowIdsListeners, [indexId, sliceId]);
521
558
  const delListener = (listenerId) => {
@@ -539,7 +576,9 @@ const createIndexes = getCreateFunction((store) => {
539
576
  getSliceIds,
540
577
  getSliceRowIds,
541
578
  addIndexIdsListener,
579
+ addHasIndexListener,
542
580
  addSliceIdsListener,
581
+ addHasSliceListener,
543
582
  addSliceRowIdsListener,
544
583
  delListener,
545
584
  destroy,