tinybase 6.1.0-beta.5 → 6.1.1

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 (191) hide show
  1. package/@types/persisters/index.d.ts +82 -0
  2. package/@types/persisters/with-schemas/index.d.ts +91 -0
  3. package/@types/store/index.d.ts +123 -1
  4. package/@types/store/with-schemas/index.d.ts +159 -24
  5. package/@types/ui-react/index.d.ts +575 -7
  6. package/@types/ui-react/with-schemas/index.d.ts +184 -40
  7. package/index.js +73 -53
  8. package/mergeable-store/index.js +73 -53
  9. package/mergeable-store/with-schemas/index.js +73 -53
  10. package/min/index.js +1 -1
  11. package/min/index.js.gz +0 -0
  12. package/min/mergeable-store/index.js +1 -1
  13. package/min/mergeable-store/index.js.gz +0 -0
  14. package/min/mergeable-store/with-schemas/index.js +1 -1
  15. package/min/mergeable-store/with-schemas/index.js.gz +0 -0
  16. package/min/persisters/index.js +1 -1
  17. package/min/persisters/index.js.gz +0 -0
  18. package/min/persisters/persister-automerge/index.js +1 -1
  19. package/min/persisters/persister-automerge/index.js.gz +0 -0
  20. package/min/persisters/persister-automerge/with-schemas/index.js +1 -1
  21. package/min/persisters/persister-automerge/with-schemas/index.js.gz +0 -0
  22. package/min/persisters/persister-browser/index.js +1 -1
  23. package/min/persisters/persister-browser/index.js.gz +0 -0
  24. package/min/persisters/persister-browser/with-schemas/index.js +1 -1
  25. package/min/persisters/persister-browser/with-schemas/index.js.gz +0 -0
  26. package/min/persisters/persister-cr-sqlite-wasm/index.js +1 -1
  27. package/min/persisters/persister-cr-sqlite-wasm/index.js.gz +0 -0
  28. package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +1 -1
  29. package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js.gz +0 -0
  30. package/min/persisters/persister-durable-object-storage/index.js +1 -1
  31. package/min/persisters/persister-durable-object-storage/index.js.gz +0 -0
  32. package/min/persisters/persister-durable-object-storage/with-schemas/index.js +1 -1
  33. package/min/persisters/persister-durable-object-storage/with-schemas/index.js.gz +0 -0
  34. package/min/persisters/persister-electric-sql/index.js +1 -1
  35. package/min/persisters/persister-electric-sql/index.js.gz +0 -0
  36. package/min/persisters/persister-electric-sql/with-schemas/index.js +1 -1
  37. package/min/persisters/persister-electric-sql/with-schemas/index.js.gz +0 -0
  38. package/min/persisters/persister-expo-sqlite/index.js +1 -1
  39. package/min/persisters/persister-expo-sqlite/index.js.gz +0 -0
  40. package/min/persisters/persister-expo-sqlite/with-schemas/index.js +1 -1
  41. package/min/persisters/persister-expo-sqlite/with-schemas/index.js.gz +0 -0
  42. package/min/persisters/persister-file/index.js +1 -1
  43. package/min/persisters/persister-file/index.js.gz +0 -0
  44. package/min/persisters/persister-file/with-schemas/index.js +1 -1
  45. package/min/persisters/persister-file/with-schemas/index.js.gz +0 -0
  46. package/min/persisters/persister-indexed-db/index.js +1 -1
  47. package/min/persisters/persister-indexed-db/index.js.gz +0 -0
  48. package/min/persisters/persister-indexed-db/with-schemas/index.js +1 -1
  49. package/min/persisters/persister-indexed-db/with-schemas/index.js.gz +0 -0
  50. package/min/persisters/persister-libsql/index.js +1 -1
  51. package/min/persisters/persister-libsql/index.js.gz +0 -0
  52. package/min/persisters/persister-libsql/with-schemas/index.js +1 -1
  53. package/min/persisters/persister-libsql/with-schemas/index.js.gz +0 -0
  54. package/min/persisters/persister-partykit-client/index.js +1 -1
  55. package/min/persisters/persister-partykit-client/index.js.gz +0 -0
  56. package/min/persisters/persister-partykit-client/with-schemas/index.js +1 -1
  57. package/min/persisters/persister-partykit-client/with-schemas/index.js.gz +0 -0
  58. package/min/persisters/persister-pglite/index.js +1 -1
  59. package/min/persisters/persister-pglite/index.js.gz +0 -0
  60. package/min/persisters/persister-pglite/with-schemas/index.js +1 -1
  61. package/min/persisters/persister-pglite/with-schemas/index.js.gz +0 -0
  62. package/min/persisters/persister-postgres/index.js +1 -1
  63. package/min/persisters/persister-postgres/index.js.gz +0 -0
  64. package/min/persisters/persister-postgres/with-schemas/index.js +1 -1
  65. package/min/persisters/persister-postgres/with-schemas/index.js.gz +0 -0
  66. package/min/persisters/persister-powersync/index.js +1 -1
  67. package/min/persisters/persister-powersync/index.js.gz +0 -0
  68. package/min/persisters/persister-powersync/with-schemas/index.js +1 -1
  69. package/min/persisters/persister-powersync/with-schemas/index.js.gz +0 -0
  70. package/min/persisters/persister-remote/index.js +1 -1
  71. package/min/persisters/persister-remote/index.js.gz +0 -0
  72. package/min/persisters/persister-remote/with-schemas/index.js +1 -1
  73. package/min/persisters/persister-remote/with-schemas/index.js.gz +0 -0
  74. package/min/persisters/persister-sqlite-bun/index.js +1 -1
  75. package/min/persisters/persister-sqlite-bun/index.js.gz +0 -0
  76. package/min/persisters/persister-sqlite-bun/with-schemas/index.js +1 -1
  77. package/min/persisters/persister-sqlite-bun/with-schemas/index.js.gz +0 -0
  78. package/min/persisters/persister-sqlite-wasm/index.js +1 -1
  79. package/min/persisters/persister-sqlite-wasm/index.js.gz +0 -0
  80. package/min/persisters/persister-sqlite-wasm/with-schemas/index.js +1 -1
  81. package/min/persisters/persister-sqlite-wasm/with-schemas/index.js.gz +0 -0
  82. package/min/persisters/persister-sqlite3/index.js +1 -1
  83. package/min/persisters/persister-sqlite3/index.js.gz +0 -0
  84. package/min/persisters/persister-sqlite3/with-schemas/index.js +1 -1
  85. package/min/persisters/persister-sqlite3/with-schemas/index.js.gz +0 -0
  86. package/min/persisters/persister-yjs/index.js +1 -1
  87. package/min/persisters/persister-yjs/index.js.gz +0 -0
  88. package/min/persisters/persister-yjs/with-schemas/index.js +1 -1
  89. package/min/persisters/persister-yjs/with-schemas/index.js.gz +0 -0
  90. package/min/persisters/with-schemas/index.js +1 -1
  91. package/min/persisters/with-schemas/index.js.gz +0 -0
  92. package/min/store/index.js +1 -1
  93. package/min/store/index.js.gz +0 -0
  94. package/min/store/with-schemas/index.js +1 -1
  95. package/min/store/with-schemas/index.js.gz +0 -0
  96. package/min/synchronizers/index.js +1 -1
  97. package/min/synchronizers/index.js.gz +0 -0
  98. package/min/synchronizers/synchronizer-broadcast-channel/index.js +1 -1
  99. package/min/synchronizers/synchronizer-broadcast-channel/index.js.gz +0 -0
  100. package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +1 -1
  101. package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js.gz +0 -0
  102. package/min/synchronizers/synchronizer-local/index.js +1 -1
  103. package/min/synchronizers/synchronizer-local/index.js.gz +0 -0
  104. package/min/synchronizers/synchronizer-local/with-schemas/index.js +1 -1
  105. package/min/synchronizers/synchronizer-local/with-schemas/index.js.gz +0 -0
  106. package/min/synchronizers/synchronizer-ws-client/index.js +1 -1
  107. package/min/synchronizers/synchronizer-ws-client/index.js.gz +0 -0
  108. package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js +1 -1
  109. package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js.gz +0 -0
  110. package/min/synchronizers/synchronizer-ws-server/index.js +1 -1
  111. package/min/synchronizers/synchronizer-ws-server/index.js.gz +0 -0
  112. package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js +1 -1
  113. package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js.gz +0 -0
  114. package/min/synchronizers/synchronizer-ws-server-durable-object/index.js +1 -1
  115. package/min/synchronizers/synchronizer-ws-server-durable-object/index.js.gz +0 -0
  116. package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +1 -1
  117. package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js.gz +0 -0
  118. package/min/synchronizers/with-schemas/index.js +1 -1
  119. package/min/synchronizers/with-schemas/index.js.gz +0 -0
  120. package/min/ui-react/index.js +1 -1
  121. package/min/ui-react/index.js.gz +0 -0
  122. package/min/ui-react/with-schemas/index.js +1 -1
  123. package/min/ui-react/with-schemas/index.js.gz +0 -0
  124. package/min/ui-react-inspector/index.js +1 -1
  125. package/min/ui-react-inspector/index.js.gz +0 -0
  126. package/min/ui-react-inspector/with-schemas/index.js +1 -1
  127. package/min/ui-react-inspector/with-schemas/index.js.gz +0 -0
  128. package/min/with-schemas/index.js +1 -1
  129. package/min/with-schemas/index.js.gz +0 -0
  130. package/package.json +6 -6
  131. package/persisters/index.js +33 -8
  132. package/persisters/persister-automerge/index.js +23 -3
  133. package/persisters/persister-automerge/with-schemas/index.js +23 -3
  134. package/persisters/persister-browser/index.js +23 -3
  135. package/persisters/persister-browser/with-schemas/index.js +23 -3
  136. package/persisters/persister-cr-sqlite-wasm/index.js +33 -8
  137. package/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +33 -8
  138. package/persisters/persister-durable-object-storage/index.js +23 -3
  139. package/persisters/persister-durable-object-storage/with-schemas/index.js +23 -3
  140. package/persisters/persister-electric-sql/index.js +33 -8
  141. package/persisters/persister-electric-sql/with-schemas/index.js +33 -8
  142. package/persisters/persister-expo-sqlite/index.js +33 -8
  143. package/persisters/persister-expo-sqlite/with-schemas/index.js +33 -8
  144. package/persisters/persister-file/index.js +23 -3
  145. package/persisters/persister-file/with-schemas/index.js +23 -3
  146. package/persisters/persister-indexed-db/index.js +23 -3
  147. package/persisters/persister-indexed-db/with-schemas/index.js +23 -3
  148. package/persisters/persister-libsql/index.js +33 -8
  149. package/persisters/persister-libsql/with-schemas/index.js +33 -8
  150. package/persisters/persister-partykit-client/index.js +23 -3
  151. package/persisters/persister-partykit-client/with-schemas/index.js +23 -3
  152. package/persisters/persister-pglite/index.js +33 -8
  153. package/persisters/persister-pglite/with-schemas/index.js +33 -8
  154. package/persisters/persister-postgres/index.js +33 -8
  155. package/persisters/persister-postgres/with-schemas/index.js +33 -8
  156. package/persisters/persister-powersync/index.js +33 -8
  157. package/persisters/persister-powersync/with-schemas/index.js +33 -8
  158. package/persisters/persister-remote/index.js +23 -3
  159. package/persisters/persister-remote/with-schemas/index.js +23 -3
  160. package/persisters/persister-sqlite-bun/index.js +33 -8
  161. package/persisters/persister-sqlite-bun/with-schemas/index.js +33 -8
  162. package/persisters/persister-sqlite-wasm/index.js +33 -8
  163. package/persisters/persister-sqlite-wasm/with-schemas/index.js +33 -8
  164. package/persisters/persister-sqlite3/index.js +33 -8
  165. package/persisters/persister-sqlite3/with-schemas/index.js +33 -8
  166. package/persisters/persister-yjs/index.js +23 -3
  167. package/persisters/persister-yjs/with-schemas/index.js +23 -3
  168. package/persisters/with-schemas/index.js +33 -8
  169. package/readme.md +17 -17
  170. package/releases.md +60 -36
  171. package/store/index.js +73 -53
  172. package/store/with-schemas/index.js +73 -53
  173. package/synchronizers/index.js +27 -9
  174. package/synchronizers/synchronizer-broadcast-channel/index.js +27 -9
  175. package/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +27 -9
  176. package/synchronizers/synchronizer-local/index.js +27 -9
  177. package/synchronizers/synchronizer-local/with-schemas/index.js +27 -9
  178. package/synchronizers/synchronizer-ws-client/index.js +27 -9
  179. package/synchronizers/synchronizer-ws-client/with-schemas/index.js +27 -9
  180. package/synchronizers/synchronizer-ws-server/index.js +27 -9
  181. package/synchronizers/synchronizer-ws-server/with-schemas/index.js +27 -9
  182. package/synchronizers/synchronizer-ws-server-durable-object/index.js +27 -9
  183. package/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +27 -9
  184. package/synchronizers/with-schemas/index.js +27 -9
  185. package/ui-react/index.js +84 -20
  186. package/ui-react/with-schemas/index.js +84 -20
  187. package/ui-react-dom/index.js +1 -1
  188. package/ui-react-dom/with-schemas/index.js +1 -1
  189. package/ui-react-inspector/index.js +97 -57
  190. package/ui-react-inspector/with-schemas/index.js +97 -57
  191. package/with-schemas/index.js +73 -53
@@ -294,6 +294,39 @@ const useCheckpointAction = (checkpointsOrCheckpointsId, action, arg) => {
294
294
  [checkpoints, action, arg],
295
295
  );
296
296
  };
297
+ const useSortedRowIdsImpl = (
298
+ tableId,
299
+ cellId,
300
+ descending,
301
+ offset,
302
+ limit,
303
+ storeOrStoreId,
304
+ ) =>
305
+ useListenable(
306
+ SORTED_ROW_IDS,
307
+ useStoreOrStoreById(storeOrStoreId),
308
+ 1 /* Array */,
309
+ [tableId, cellId, descending, offset, limit],
310
+ );
311
+ const useSortedRowIdsListenerImpl = (
312
+ tableId,
313
+ cellId,
314
+ descending,
315
+ offset,
316
+ limit,
317
+ listener,
318
+ listenerDeps,
319
+ mutator,
320
+ storeOrStoreId,
321
+ ) =>
322
+ useListener(
323
+ SORTED_ROW_IDS,
324
+ useStoreOrStoreById(storeOrStoreId),
325
+ listener,
326
+ listenerDeps,
327
+ [tableId, cellId, descending, offset, limit],
328
+ mutator,
329
+ );
297
330
  const useCreateStore = (create, createDeps = EMPTY_ARRAY) =>
298
331
  useMemo(create, createDeps);
299
332
  const useStoreIds = () => useThingIds(Offsets.Store);
@@ -350,18 +383,31 @@ const useRowIds = (tableId, storeOrStoreId) =>
350
383
  tableId,
351
384
  ]);
352
385
  const useSortedRowIds = (
353
- tableId,
354
- cellId,
386
+ tableIdOrArgs,
387
+ cellIdOrStoreOrStoreId,
355
388
  descending,
356
- offset = 0,
389
+ offset,
357
390
  limit,
358
391
  storeOrStoreId,
359
392
  ) =>
360
- useListenable(
361
- SORTED_ROW_IDS,
362
- useStoreOrStoreById(storeOrStoreId),
363
- 1 /* Array */,
364
- [tableId, cellId, descending, offset, limit],
393
+ useSortedRowIdsImpl(
394
+ ...(isObject(tableIdOrArgs)
395
+ ? [
396
+ tableIdOrArgs.tableId,
397
+ tableIdOrArgs.cellId,
398
+ tableIdOrArgs.descending ?? false,
399
+ tableIdOrArgs.offset ?? 0,
400
+ tableIdOrArgs.limit,
401
+ cellIdOrStoreOrStoreId,
402
+ ]
403
+ : [
404
+ tableIdOrArgs,
405
+ cellIdOrStoreOrStoreId,
406
+ descending,
407
+ offset,
408
+ limit,
409
+ storeOrStoreId,
410
+ ]),
365
411
  );
366
412
  const useHasRow = (tableId, rowId, storeOrStoreId) =>
367
413
  useListenable(ROW, useStoreOrStoreById(storeOrStoreId), 4 /* Boolean */, [
@@ -733,23 +779,40 @@ const useRowIdsListener = (
733
779
  mutator,
734
780
  );
735
781
  const useSortedRowIdsListener = (
736
- tableId,
737
- cellId,
738
- descending,
739
- offset,
740
- limit,
782
+ tableIdOrArgs,
783
+ cellIdOrListener,
784
+ descendingOrListenerDeps,
785
+ offsetOrMutator,
786
+ limitOrStoreOrStoreId,
741
787
  listener,
742
788
  listenerDeps,
743
789
  mutator,
744
790
  storeOrStoreId,
745
791
  ) =>
746
- useListener(
747
- SORTED_ROW_IDS,
748
- useStoreOrStoreById(storeOrStoreId),
749
- listener,
750
- listenerDeps,
751
- [tableId, cellId, descending, offset, limit],
752
- mutator,
792
+ useSortedRowIdsListenerImpl(
793
+ ...(isObject(tableIdOrArgs)
794
+ ? [
795
+ tableIdOrArgs.tableId,
796
+ tableIdOrArgs.cellId,
797
+ tableIdOrArgs.descending ?? false,
798
+ tableIdOrArgs.offset ?? 0,
799
+ tableIdOrArgs.limit,
800
+ cellIdOrListener,
801
+ descendingOrListenerDeps,
802
+ offsetOrMutator,
803
+ limitOrStoreOrStoreId,
804
+ ]
805
+ : [
806
+ tableIdOrArgs,
807
+ cellIdOrListener,
808
+ descendingOrListenerDeps,
809
+ offsetOrMutator,
810
+ limitOrStoreOrStoreId,
811
+ listener,
812
+ listenerDeps,
813
+ mutator,
814
+ storeOrStoreId,
815
+ ]),
753
816
  );
754
817
  const useHasRowListener = (
755
818
  tableId,
@@ -2231,6 +2294,7 @@ export {
2231
2294
  useSliceRowIdsListener,
2232
2295
  useSortedRowIds,
2233
2296
  useSortedRowIdsListener,
2297
+ useSortedRowIdsListenerImpl,
2234
2298
  useStartTransactionListener,
2235
2299
  useStore,
2236
2300
  useStoreIds,
@@ -26,6 +26,7 @@ import {
26
26
 
27
27
  const getTypeOf = (thing) => typeof thing;
28
28
  const EMPTY_STRING = '';
29
+ const DOT = '.';
29
30
  const STRING = getTypeOf(EMPTY_STRING);
30
31
  const BOOLEAN = getTypeOf(true);
31
32
  const NUMBER = getTypeOf(0);
@@ -90,7 +91,6 @@ const getIndexStoreTableId = (indexes, indexId) => [
90
91
  indexes?.getTableId(indexId),
91
92
  ];
92
93
 
93
- const DOT = '.';
94
94
  const EDITABLE = 'editable';
95
95
  const LEFT_ARROW = '\u2190';
96
96
  const UP_ARROW = '\u2191';
@@ -26,6 +26,7 @@ import {
26
26
 
27
27
  const getTypeOf = (thing) => typeof thing;
28
28
  const EMPTY_STRING = '';
29
+ const DOT = '.';
29
30
  const STRING = getTypeOf(EMPTY_STRING);
30
31
  const BOOLEAN = getTypeOf(true);
31
32
  const NUMBER = getTypeOf(0);
@@ -90,7 +91,6 @@ const getIndexStoreTableId = (indexes, indexId) => [
90
91
  indexes?.getTableId(indexId),
91
92
  ];
92
93
 
93
- const DOT = '.';
94
94
  const EDITABLE = 'editable';
95
95
  const LEFT_ARROW = '\u2190';
96
96
  const UP_ARROW = '\u2191';
@@ -45,6 +45,7 @@ import {
45
45
 
46
46
  const getTypeOf = (thing) => typeof thing;
47
47
  const EMPTY_STRING = '';
48
+ const DOT = '.';
48
49
  const STRING = getTypeOf(EMPTY_STRING);
49
50
  const BOOLEAN = getTypeOf(true);
50
51
  const NUMBER = getTypeOf(0);
@@ -539,6 +540,25 @@ const createCustomPersister = (
539
540
  return persister;
540
541
  };
541
542
  const isAutoSaving = () => !isUndefined(autoSaveListenerId);
543
+ const startAutoPersisting = async (
544
+ initialContent,
545
+ startSaveFirst = false,
546
+ ) => {
547
+ const [call1, call2] = startSaveFirst
548
+ ? [startAutoSave, startAutoLoad]
549
+ : [startAutoLoad, startAutoSave];
550
+ await call1(initialContent);
551
+ await call2(initialContent);
552
+ return persister;
553
+ };
554
+ const stopAutoPersisting = async (stopSaveFirst = false) => {
555
+ const [call1, call2] = stopSaveFirst
556
+ ? [stopAutoSave, stopAutoLoad]
557
+ : [stopAutoLoad, stopAutoSave];
558
+ await call1();
559
+ await call2();
560
+ return persister;
561
+ };
542
562
  const getStatus = () => status;
543
563
  const addStatusListener = (listener) =>
544
564
  addListener(listener, statusListeners);
@@ -552,10 +572,9 @@ const createCustomPersister = (
552
572
  return persister;
553
573
  };
554
574
  const getStore = () => store;
555
- const destroy = async () => {
575
+ const destroy = () => {
556
576
  arrayClear(mapGet(scheduleActions, scheduleId));
557
- await persister.stopAutoLoad();
558
- return await persister.stopAutoSave();
577
+ return stopAutoPersisting();
559
578
  };
560
579
  const getStats = () => ({loads, saves});
561
580
  const persister = {
@@ -567,6 +586,8 @@ const createCustomPersister = (
567
586
  startAutoSave,
568
587
  stopAutoSave,
569
588
  isAutoSaving,
589
+ startAutoPersisting,
590
+ stopAutoPersisting,
570
591
  getStatus,
571
592
  addStatusListener,
572
593
  delListener,
@@ -1309,6 +1330,27 @@ const createStore = () => {
1309
1330
  transaction(() => actions(...arrayMap(args, id)));
1310
1331
  return store;
1311
1332
  };
1333
+ const addSortedRowIdsListenerImpl = (
1334
+ tableId,
1335
+ cellId,
1336
+ otherArgs,
1337
+ listener,
1338
+ mutator,
1339
+ ) => {
1340
+ let sortedRowIds = getSortedRowIds(tableId, cellId, ...otherArgs);
1341
+ return addListener(
1342
+ () => {
1343
+ const newSortedRowIds = getSortedRowIds(tableId, cellId, ...otherArgs);
1344
+ if (!arrayIsEqual(newSortedRowIds, sortedRowIds)) {
1345
+ sortedRowIds = newSortedRowIds;
1346
+ listener(store, tableId, cellId, ...otherArgs, sortedRowIds);
1347
+ }
1348
+ },
1349
+ sortedRowIdsListeners[mutator ? 1 : 0],
1350
+ [tableId, cellId],
1351
+ [getTableIds],
1352
+ );
1353
+ };
1312
1354
  const getContent = () => [getTables(), getValues()];
1313
1355
  const getTables = () => mapToObj3(tablesMap);
1314
1356
  const getTableIds = () => mapKeys(tablesMap);
@@ -1317,22 +1359,36 @@ const createStore = () => {
1317
1359
  mapKeys(mapGet(tableCellIds, id(tableId)));
1318
1360
  const getRowCount = (tableId) => collSize(mapGet(tablesMap, id(tableId)));
1319
1361
  const getRowIds = (tableId) => mapKeys(mapGet(tablesMap, id(tableId)));
1320
- const getSortedRowIds = (tableId, cellId, descending, offset = 0, limit) =>
1321
- arrayMap(
1322
- slice(
1323
- arraySort(
1324
- mapMap(mapGet(tablesMap, id(tableId)), (row, rowId) => [
1325
- isUndefined(cellId) ? rowId : mapGet(row, id(cellId)),
1326
- rowId,
1327
- ]),
1328
- ([cell1], [cell2]) =>
1329
- defaultSorter(cell1, cell2) * (descending ? -1 : 1),
1330
- ),
1331
- offset,
1332
- isUndefined(limit) ? limit : offset + limit,
1333
- ),
1334
- ([, rowId]) => rowId,
1335
- );
1362
+ const getSortedRowIds = (
1363
+ tableIdOrArgs,
1364
+ cellId,
1365
+ descending,
1366
+ offset = 0,
1367
+ limit,
1368
+ ) =>
1369
+ isObject(tableIdOrArgs)
1370
+ ? getSortedRowIds(
1371
+ tableIdOrArgs.tableId,
1372
+ tableIdOrArgs.cellId,
1373
+ tableIdOrArgs.descending,
1374
+ tableIdOrArgs.offset,
1375
+ tableIdOrArgs.limit,
1376
+ )
1377
+ : arrayMap(
1378
+ slice(
1379
+ arraySort(
1380
+ mapMap(mapGet(tablesMap, id(tableIdOrArgs)), (row, rowId) => [
1381
+ isUndefined(cellId) ? rowId : mapGet(row, id(cellId)),
1382
+ rowId,
1383
+ ]),
1384
+ ([cell1], [cell2]) =>
1385
+ defaultSorter(cell1, cell2) * (descending ? -1 : 1),
1386
+ ),
1387
+ offset,
1388
+ isUndefined(limit) ? limit : offset + limit,
1389
+ ),
1390
+ ([, rowId]) => rowId,
1391
+ );
1336
1392
  const getRow = (tableId, rowId) =>
1337
1393
  mapToObj(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)));
1338
1394
  const getCellIds = (tableId, rowId) =>
@@ -1724,48 +1780,33 @@ const createStore = () => {
1724
1780
  mapForEach(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)), cellCallback);
1725
1781
  const forEachValue = (valueCallback) => mapForEach(valuesMap, valueCallback);
1726
1782
  const addSortedRowIdsListener = (
1727
- tableId,
1728
- cellId,
1729
- descending,
1783
+ tableIdOrArgs,
1784
+ cellIdOrListener,
1785
+ descendingOrMutator,
1730
1786
  offset,
1731
1787
  limit,
1732
1788
  listener,
1733
1789
  mutator,
1734
- ) => {
1735
- let sortedRowIds = getSortedRowIds(
1736
- tableId,
1737
- cellId,
1738
- descending,
1739
- offset,
1740
- limit,
1741
- );
1742
- return addListener(
1743
- () => {
1744
- const newSortedRowIds = getSortedRowIds(
1745
- tableId,
1746
- cellId,
1747
- descending,
1748
- offset,
1749
- limit,
1790
+ ) =>
1791
+ isObject(tableIdOrArgs)
1792
+ ? addSortedRowIdsListenerImpl(
1793
+ tableIdOrArgs.tableId,
1794
+ tableIdOrArgs.cellId,
1795
+ [
1796
+ tableIdOrArgs.descending ?? false,
1797
+ tableIdOrArgs.offset ?? 0,
1798
+ tableIdOrArgs.limit,
1799
+ ],
1800
+ cellIdOrListener,
1801
+ descendingOrMutator,
1802
+ )
1803
+ : addSortedRowIdsListenerImpl(
1804
+ tableIdOrArgs,
1805
+ cellIdOrListener,
1806
+ [descendingOrMutator, offset, limit],
1807
+ listener,
1808
+ mutator,
1750
1809
  );
1751
- if (!arrayIsEqual(newSortedRowIds, sortedRowIds)) {
1752
- sortedRowIds = newSortedRowIds;
1753
- listener(
1754
- store,
1755
- tableId,
1756
- cellId,
1757
- descending,
1758
- offset,
1759
- limit,
1760
- sortedRowIds,
1761
- );
1762
- }
1763
- },
1764
- sortedRowIdsListeners[mutator ? 1 : 0],
1765
- [tableId, cellId],
1766
- [getTableIds],
1767
- );
1768
- };
1769
1810
  const addStartTransactionListener = (listener) =>
1770
1811
  addListener(listener, startTransactionListeners);
1771
1812
  const addWillFinishTransactionListener = (listener) =>
@@ -2034,7 +2075,6 @@ const Nub = ({s}) => {
2034
2075
  });
2035
2076
  };
2036
2077
 
2037
- const DOT = '.';
2038
2078
  const EDITABLE = 'editable';
2039
2079
  const LEFT_ARROW = '\u2190';
2040
2080
  const UP_ARROW = '\u2191';
@@ -45,6 +45,7 @@ import {
45
45
 
46
46
  const getTypeOf = (thing) => typeof thing;
47
47
  const EMPTY_STRING = '';
48
+ const DOT = '.';
48
49
  const STRING = getTypeOf(EMPTY_STRING);
49
50
  const BOOLEAN = getTypeOf(true);
50
51
  const NUMBER = getTypeOf(0);
@@ -539,6 +540,25 @@ const createCustomPersister = (
539
540
  return persister;
540
541
  };
541
542
  const isAutoSaving = () => !isUndefined(autoSaveListenerId);
543
+ const startAutoPersisting = async (
544
+ initialContent,
545
+ startSaveFirst = false,
546
+ ) => {
547
+ const [call1, call2] = startSaveFirst
548
+ ? [startAutoSave, startAutoLoad]
549
+ : [startAutoLoad, startAutoSave];
550
+ await call1(initialContent);
551
+ await call2(initialContent);
552
+ return persister;
553
+ };
554
+ const stopAutoPersisting = async (stopSaveFirst = false) => {
555
+ const [call1, call2] = stopSaveFirst
556
+ ? [stopAutoSave, stopAutoLoad]
557
+ : [stopAutoLoad, stopAutoSave];
558
+ await call1();
559
+ await call2();
560
+ return persister;
561
+ };
542
562
  const getStatus = () => status;
543
563
  const addStatusListener = (listener) =>
544
564
  addListener(listener, statusListeners);
@@ -552,10 +572,9 @@ const createCustomPersister = (
552
572
  return persister;
553
573
  };
554
574
  const getStore = () => store;
555
- const destroy = async () => {
575
+ const destroy = () => {
556
576
  arrayClear(mapGet(scheduleActions, scheduleId));
557
- await persister.stopAutoLoad();
558
- return await persister.stopAutoSave();
577
+ return stopAutoPersisting();
559
578
  };
560
579
  const getStats = () => ({loads, saves});
561
580
  const persister = {
@@ -567,6 +586,8 @@ const createCustomPersister = (
567
586
  startAutoSave,
568
587
  stopAutoSave,
569
588
  isAutoSaving,
589
+ startAutoPersisting,
590
+ stopAutoPersisting,
570
591
  getStatus,
571
592
  addStatusListener,
572
593
  delListener,
@@ -1309,6 +1330,27 @@ const createStore = () => {
1309
1330
  transaction(() => actions(...arrayMap(args, id)));
1310
1331
  return store;
1311
1332
  };
1333
+ const addSortedRowIdsListenerImpl = (
1334
+ tableId,
1335
+ cellId,
1336
+ otherArgs,
1337
+ listener,
1338
+ mutator,
1339
+ ) => {
1340
+ let sortedRowIds = getSortedRowIds(tableId, cellId, ...otherArgs);
1341
+ return addListener(
1342
+ () => {
1343
+ const newSortedRowIds = getSortedRowIds(tableId, cellId, ...otherArgs);
1344
+ if (!arrayIsEqual(newSortedRowIds, sortedRowIds)) {
1345
+ sortedRowIds = newSortedRowIds;
1346
+ listener(store, tableId, cellId, ...otherArgs, sortedRowIds);
1347
+ }
1348
+ },
1349
+ sortedRowIdsListeners[mutator ? 1 : 0],
1350
+ [tableId, cellId],
1351
+ [getTableIds],
1352
+ );
1353
+ };
1312
1354
  const getContent = () => [getTables(), getValues()];
1313
1355
  const getTables = () => mapToObj3(tablesMap);
1314
1356
  const getTableIds = () => mapKeys(tablesMap);
@@ -1317,22 +1359,36 @@ const createStore = () => {
1317
1359
  mapKeys(mapGet(tableCellIds, id(tableId)));
1318
1360
  const getRowCount = (tableId) => collSize(mapGet(tablesMap, id(tableId)));
1319
1361
  const getRowIds = (tableId) => mapKeys(mapGet(tablesMap, id(tableId)));
1320
- const getSortedRowIds = (tableId, cellId, descending, offset = 0, limit) =>
1321
- arrayMap(
1322
- slice(
1323
- arraySort(
1324
- mapMap(mapGet(tablesMap, id(tableId)), (row, rowId) => [
1325
- isUndefined(cellId) ? rowId : mapGet(row, id(cellId)),
1326
- rowId,
1327
- ]),
1328
- ([cell1], [cell2]) =>
1329
- defaultSorter(cell1, cell2) * (descending ? -1 : 1),
1330
- ),
1331
- offset,
1332
- isUndefined(limit) ? limit : offset + limit,
1333
- ),
1334
- ([, rowId]) => rowId,
1335
- );
1362
+ const getSortedRowIds = (
1363
+ tableIdOrArgs,
1364
+ cellId,
1365
+ descending,
1366
+ offset = 0,
1367
+ limit,
1368
+ ) =>
1369
+ isObject(tableIdOrArgs)
1370
+ ? getSortedRowIds(
1371
+ tableIdOrArgs.tableId,
1372
+ tableIdOrArgs.cellId,
1373
+ tableIdOrArgs.descending,
1374
+ tableIdOrArgs.offset,
1375
+ tableIdOrArgs.limit,
1376
+ )
1377
+ : arrayMap(
1378
+ slice(
1379
+ arraySort(
1380
+ mapMap(mapGet(tablesMap, id(tableIdOrArgs)), (row, rowId) => [
1381
+ isUndefined(cellId) ? rowId : mapGet(row, id(cellId)),
1382
+ rowId,
1383
+ ]),
1384
+ ([cell1], [cell2]) =>
1385
+ defaultSorter(cell1, cell2) * (descending ? -1 : 1),
1386
+ ),
1387
+ offset,
1388
+ isUndefined(limit) ? limit : offset + limit,
1389
+ ),
1390
+ ([, rowId]) => rowId,
1391
+ );
1336
1392
  const getRow = (tableId, rowId) =>
1337
1393
  mapToObj(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)));
1338
1394
  const getCellIds = (tableId, rowId) =>
@@ -1724,48 +1780,33 @@ const createStore = () => {
1724
1780
  mapForEach(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)), cellCallback);
1725
1781
  const forEachValue = (valueCallback) => mapForEach(valuesMap, valueCallback);
1726
1782
  const addSortedRowIdsListener = (
1727
- tableId,
1728
- cellId,
1729
- descending,
1783
+ tableIdOrArgs,
1784
+ cellIdOrListener,
1785
+ descendingOrMutator,
1730
1786
  offset,
1731
1787
  limit,
1732
1788
  listener,
1733
1789
  mutator,
1734
- ) => {
1735
- let sortedRowIds = getSortedRowIds(
1736
- tableId,
1737
- cellId,
1738
- descending,
1739
- offset,
1740
- limit,
1741
- );
1742
- return addListener(
1743
- () => {
1744
- const newSortedRowIds = getSortedRowIds(
1745
- tableId,
1746
- cellId,
1747
- descending,
1748
- offset,
1749
- limit,
1790
+ ) =>
1791
+ isObject(tableIdOrArgs)
1792
+ ? addSortedRowIdsListenerImpl(
1793
+ tableIdOrArgs.tableId,
1794
+ tableIdOrArgs.cellId,
1795
+ [
1796
+ tableIdOrArgs.descending ?? false,
1797
+ tableIdOrArgs.offset ?? 0,
1798
+ tableIdOrArgs.limit,
1799
+ ],
1800
+ cellIdOrListener,
1801
+ descendingOrMutator,
1802
+ )
1803
+ : addSortedRowIdsListenerImpl(
1804
+ tableIdOrArgs,
1805
+ cellIdOrListener,
1806
+ [descendingOrMutator, offset, limit],
1807
+ listener,
1808
+ mutator,
1750
1809
  );
1751
- if (!arrayIsEqual(newSortedRowIds, sortedRowIds)) {
1752
- sortedRowIds = newSortedRowIds;
1753
- listener(
1754
- store,
1755
- tableId,
1756
- cellId,
1757
- descending,
1758
- offset,
1759
- limit,
1760
- sortedRowIds,
1761
- );
1762
- }
1763
- },
1764
- sortedRowIdsListeners[mutator ? 1 : 0],
1765
- [tableId, cellId],
1766
- [getTableIds],
1767
- );
1768
- };
1769
1810
  const addStartTransactionListener = (listener) =>
1770
1811
  addListener(listener, startTransactionListeners);
1771
1812
  const addWillFinishTransactionListener = (listener) =>
@@ -2034,7 +2075,6 @@ const Nub = ({s}) => {
2034
2075
  });
2035
2076
  };
2036
2077
 
2037
- const DOT = '.';
2038
2078
  const EDITABLE = 'editable';
2039
2079
  const LEFT_ARROW = '\u2190';
2040
2080
  const UP_ARROW = '\u2191';