tinybase 6.1.0-beta.5 → 6.1.0

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 +120 -0
  6. package/@types/ui-react/with-schemas/index.d.ts +179 -37
  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 +6 -6
  170. package/releases.md +23 -11
  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
@@ -367,6 +367,25 @@ const createCustomPersister = (
367
367
  return persister;
368
368
  };
369
369
  const isAutoSaving = () => !isUndefined(autoSaveListenerId);
370
+ const startAutoPersisting = async (
371
+ initialContent,
372
+ startSaveFirst = false,
373
+ ) => {
374
+ const [call1, call2] = startSaveFirst
375
+ ? [startAutoSave, startAutoLoad]
376
+ : [startAutoLoad, startAutoSave];
377
+ await call1(initialContent);
378
+ await call2(initialContent);
379
+ return persister;
380
+ };
381
+ const stopAutoPersisting = async (stopSaveFirst = false) => {
382
+ const [call1, call2] = stopSaveFirst
383
+ ? [stopAutoSave, stopAutoLoad]
384
+ : [stopAutoLoad, stopAutoSave];
385
+ await call1();
386
+ await call2();
387
+ return persister;
388
+ };
370
389
  const getStatus = () => status;
371
390
  const addStatusListener = (listener) =>
372
391
  addListener(listener, statusListeners);
@@ -380,10 +399,9 @@ const createCustomPersister = (
380
399
  return persister;
381
400
  };
382
401
  const getStore = () => store;
383
- const destroy = async () => {
402
+ const destroy = () => {
384
403
  arrayClear(mapGet(scheduleActions, scheduleId));
385
- await persister.stopAutoLoad();
386
- return await persister.stopAutoSave();
404
+ return stopAutoPersisting();
387
405
  };
388
406
  const getStats = () => ({loads, saves});
389
407
  const persister = {
@@ -395,6 +413,8 @@ const createCustomPersister = (
395
413
  startAutoSave,
396
414
  stopAutoSave,
397
415
  isAutoSaving,
416
+ startAutoPersisting,
417
+ stopAutoPersisting,
398
418
  getStatus,
399
419
  addStatusListener,
400
420
  delListener,
@@ -2,10 +2,13 @@ const getTypeOf = (thing) => typeof thing;
2
2
  const TINYBASE = 'tinybase';
3
3
  const EMPTY_STRING = '';
4
4
  const COMMA = ',';
5
+ const DOT = '.';
5
6
  const STRING = getTypeOf(EMPTY_STRING);
6
7
  const TRUE = 'true';
7
8
  const UNDEFINED = '\uFFFC';
8
9
  const strMatch = (str, regex) => str?.match(regex);
10
+ const strSplit = (str, separator = EMPTY_STRING, limit) =>
11
+ str.split(separator, limit);
9
12
  const strReplace = (str, searchValue, replaceValue) =>
10
13
  str.replace(searchValue, replaceValue);
11
14
 
@@ -161,7 +164,11 @@ const getWrappedCommand = (executeCommand, onSqlCommand) =>
161
164
  return await executeCommand(sql, params);
162
165
  }
163
166
  : executeCommand;
164
- const escapeId = (str) => `"${strReplace(str, /"/g, '""')}"`;
167
+ const escapeId = (str) =>
168
+ arrayJoin(
169
+ arrayMap(strSplit(str, DOT), (part) => `"${strReplace(part, /"/g, '""')}"`),
170
+ DOT,
171
+ );
165
172
  const escapeIds = (...ids) => escapeId(arrayJoin(ids, '_'));
166
173
  const escapeColumnNames = (...columnNames) =>
167
174
  arrayJoin(arrayMap(columnNames, escapeId), COMMA);
@@ -564,6 +571,25 @@ const createCustomPersister = (
564
571
  return persister;
565
572
  };
566
573
  const isAutoSaving = () => !isUndefined(autoSaveListenerId);
574
+ const startAutoPersisting = async (
575
+ initialContent,
576
+ startSaveFirst = false,
577
+ ) => {
578
+ const [call1, call2] = startSaveFirst
579
+ ? [startAutoSave, startAutoLoad]
580
+ : [startAutoLoad, startAutoSave];
581
+ await call1(initialContent);
582
+ await call2(initialContent);
583
+ return persister;
584
+ };
585
+ const stopAutoPersisting = async (stopSaveFirst = false) => {
586
+ const [call1, call2] = stopSaveFirst
587
+ ? [stopAutoSave, stopAutoLoad]
588
+ : [stopAutoLoad, stopAutoSave];
589
+ await call1();
590
+ await call2();
591
+ return persister;
592
+ };
567
593
  const getStatus = () => status;
568
594
  const addStatusListener = (listener) =>
569
595
  addListener(listener, statusListeners);
@@ -577,10 +603,9 @@ const createCustomPersister = (
577
603
  return persister;
578
604
  };
579
605
  const getStore = () => store;
580
- const destroy = async () => {
606
+ const destroy = () => {
581
607
  arrayClear(mapGet(scheduleActions, scheduleId));
582
- await persister.stopAutoLoad();
583
- return await persister.stopAutoSave();
608
+ return stopAutoPersisting();
584
609
  };
585
610
  const getStats = () => ({loads, saves});
586
611
  const persister = {
@@ -592,6 +617,8 @@ const createCustomPersister = (
592
617
  startAutoSave,
593
618
  stopAutoSave,
594
619
  isAutoSaving,
620
+ startAutoPersisting,
621
+ stopAutoPersisting,
595
622
  getStatus,
596
623
  addStatusListener,
597
624
  delListener,
@@ -909,8 +936,7 @@ const createJsonPersister = (
909
936
  );
910
937
  });
911
938
  const destroy = async () => {
912
- await persister.stopAutoLoad();
913
- await persister.stopAutoSave();
939
+ await persister.stopAutoPersisting();
914
940
  extraDestroy();
915
941
  return persister;
916
942
  };
@@ -1044,8 +1070,7 @@ const createTabularPersister = (
1044
1070
  }
1045
1071
  });
1046
1072
  const destroy = async () => {
1047
- await persister.stopAutoLoad();
1048
- await persister.stopAutoSave();
1073
+ await persister.stopAutoPersisting();
1049
1074
  extraDestroy();
1050
1075
  return persister;
1051
1076
  };
@@ -2,10 +2,13 @@ const getTypeOf = (thing) => typeof thing;
2
2
  const TINYBASE = 'tinybase';
3
3
  const EMPTY_STRING = '';
4
4
  const COMMA = ',';
5
+ const DOT = '.';
5
6
  const STRING = getTypeOf(EMPTY_STRING);
6
7
  const TRUE = 'true';
7
8
  const UNDEFINED = '\uFFFC';
8
9
  const strMatch = (str, regex) => str?.match(regex);
10
+ const strSplit = (str, separator = EMPTY_STRING, limit) =>
11
+ str.split(separator, limit);
9
12
  const strReplace = (str, searchValue, replaceValue) =>
10
13
  str.replace(searchValue, replaceValue);
11
14
 
@@ -161,7 +164,11 @@ const getWrappedCommand = (executeCommand, onSqlCommand) =>
161
164
  return await executeCommand(sql, params);
162
165
  }
163
166
  : executeCommand;
164
- const escapeId = (str) => `"${strReplace(str, /"/g, '""')}"`;
167
+ const escapeId = (str) =>
168
+ arrayJoin(
169
+ arrayMap(strSplit(str, DOT), (part) => `"${strReplace(part, /"/g, '""')}"`),
170
+ DOT,
171
+ );
165
172
  const escapeIds = (...ids) => escapeId(arrayJoin(ids, '_'));
166
173
  const escapeColumnNames = (...columnNames) =>
167
174
  arrayJoin(arrayMap(columnNames, escapeId), COMMA);
@@ -564,6 +571,25 @@ const createCustomPersister = (
564
571
  return persister;
565
572
  };
566
573
  const isAutoSaving = () => !isUndefined(autoSaveListenerId);
574
+ const startAutoPersisting = async (
575
+ initialContent,
576
+ startSaveFirst = false,
577
+ ) => {
578
+ const [call1, call2] = startSaveFirst
579
+ ? [startAutoSave, startAutoLoad]
580
+ : [startAutoLoad, startAutoSave];
581
+ await call1(initialContent);
582
+ await call2(initialContent);
583
+ return persister;
584
+ };
585
+ const stopAutoPersisting = async (stopSaveFirst = false) => {
586
+ const [call1, call2] = stopSaveFirst
587
+ ? [stopAutoSave, stopAutoLoad]
588
+ : [stopAutoLoad, stopAutoSave];
589
+ await call1();
590
+ await call2();
591
+ return persister;
592
+ };
567
593
  const getStatus = () => status;
568
594
  const addStatusListener = (listener) =>
569
595
  addListener(listener, statusListeners);
@@ -577,10 +603,9 @@ const createCustomPersister = (
577
603
  return persister;
578
604
  };
579
605
  const getStore = () => store;
580
- const destroy = async () => {
606
+ const destroy = () => {
581
607
  arrayClear(mapGet(scheduleActions, scheduleId));
582
- await persister.stopAutoLoad();
583
- return await persister.stopAutoSave();
608
+ return stopAutoPersisting();
584
609
  };
585
610
  const getStats = () => ({loads, saves});
586
611
  const persister = {
@@ -592,6 +617,8 @@ const createCustomPersister = (
592
617
  startAutoSave,
593
618
  stopAutoSave,
594
619
  isAutoSaving,
620
+ startAutoPersisting,
621
+ stopAutoPersisting,
595
622
  getStatus,
596
623
  addStatusListener,
597
624
  delListener,
@@ -909,8 +936,7 @@ const createJsonPersister = (
909
936
  );
910
937
  });
911
938
  const destroy = async () => {
912
- await persister.stopAutoLoad();
913
- await persister.stopAutoSave();
939
+ await persister.stopAutoPersisting();
914
940
  extraDestroy();
915
941
  return persister;
916
942
  };
@@ -1044,8 +1070,7 @@ const createTabularPersister = (
1044
1070
  }
1045
1071
  });
1046
1072
  const destroy = async () => {
1047
- await persister.stopAutoLoad();
1048
- await persister.stopAutoSave();
1073
+ await persister.stopAutoPersisting();
1049
1074
  extraDestroy();
1050
1075
  return persister;
1051
1076
  };
@@ -2,10 +2,13 @@ const getTypeOf = (thing) => typeof thing;
2
2
  const TINYBASE = 'tinybase';
3
3
  const EMPTY_STRING = '';
4
4
  const COMMA = ',';
5
+ const DOT = '.';
5
6
  const STRING = getTypeOf(EMPTY_STRING);
6
7
  const TRUE = 'true';
7
8
  const UNDEFINED = '\uFFFC';
8
9
  const strMatch = (str, regex) => str?.match(regex);
10
+ const strSplit = (str, separator = EMPTY_STRING, limit) =>
11
+ str.split(separator, limit);
9
12
  const strReplace = (str, searchValue, replaceValue) =>
10
13
  str.replace(searchValue, replaceValue);
11
14
 
@@ -160,7 +163,11 @@ const getWrappedCommand = (executeCommand, onSqlCommand) =>
160
163
  return await executeCommand(sql, params);
161
164
  }
162
165
  : executeCommand;
163
- const escapeId = (str) => `"${strReplace(str, /"/g, '""')}"`;
166
+ const escapeId = (str) =>
167
+ arrayJoin(
168
+ arrayMap(strSplit(str, DOT), (part) => `"${strReplace(part, /"/g, '""')}"`),
169
+ DOT,
170
+ );
164
171
  const escapeIds = (...ids) => escapeId(arrayJoin(ids, '_'));
165
172
  const escapeColumnNames = (...columnNames) =>
166
173
  arrayJoin(arrayMap(columnNames, escapeId), COMMA);
@@ -563,6 +570,25 @@ const createCustomPersister = (
563
570
  return persister;
564
571
  };
565
572
  const isAutoSaving = () => !isUndefined(autoSaveListenerId);
573
+ const startAutoPersisting = async (
574
+ initialContent,
575
+ startSaveFirst = false,
576
+ ) => {
577
+ const [call1, call2] = startSaveFirst
578
+ ? [startAutoSave, startAutoLoad]
579
+ : [startAutoLoad, startAutoSave];
580
+ await call1(initialContent);
581
+ await call2(initialContent);
582
+ return persister;
583
+ };
584
+ const stopAutoPersisting = async (stopSaveFirst = false) => {
585
+ const [call1, call2] = stopSaveFirst
586
+ ? [stopAutoSave, stopAutoLoad]
587
+ : [stopAutoLoad, stopAutoSave];
588
+ await call1();
589
+ await call2();
590
+ return persister;
591
+ };
566
592
  const getStatus = () => status;
567
593
  const addStatusListener = (listener) =>
568
594
  addListener(listener, statusListeners);
@@ -576,10 +602,9 @@ const createCustomPersister = (
576
602
  return persister;
577
603
  };
578
604
  const getStore = () => store;
579
- const destroy = async () => {
605
+ const destroy = () => {
580
606
  arrayClear(mapGet(scheduleActions, scheduleId));
581
- await persister.stopAutoLoad();
582
- return await persister.stopAutoSave();
607
+ return stopAutoPersisting();
583
608
  };
584
609
  const getStats = () => ({loads, saves});
585
610
  const persister = {
@@ -591,6 +616,8 @@ const createCustomPersister = (
591
616
  startAutoSave,
592
617
  stopAutoSave,
593
618
  isAutoSaving,
619
+ startAutoPersisting,
620
+ stopAutoPersisting,
594
621
  getStatus,
595
622
  addStatusListener,
596
623
  delListener,
@@ -908,8 +935,7 @@ const createJsonPersister = (
908
935
  );
909
936
  });
910
937
  const destroy = async () => {
911
- await persister.stopAutoLoad();
912
- await persister.stopAutoSave();
938
+ await persister.stopAutoPersisting();
913
939
  extraDestroy();
914
940
  return persister;
915
941
  };
@@ -1043,8 +1069,7 @@ const createTabularPersister = (
1043
1069
  }
1044
1070
  });
1045
1071
  const destroy = async () => {
1046
- await persister.stopAutoLoad();
1047
- await persister.stopAutoSave();
1072
+ await persister.stopAutoPersisting();
1048
1073
  extraDestroy();
1049
1074
  return persister;
1050
1075
  };
@@ -2,10 +2,13 @@ const getTypeOf = (thing) => typeof thing;
2
2
  const TINYBASE = 'tinybase';
3
3
  const EMPTY_STRING = '';
4
4
  const COMMA = ',';
5
+ const DOT = '.';
5
6
  const STRING = getTypeOf(EMPTY_STRING);
6
7
  const TRUE = 'true';
7
8
  const UNDEFINED = '\uFFFC';
8
9
  const strMatch = (str, regex) => str?.match(regex);
10
+ const strSplit = (str, separator = EMPTY_STRING, limit) =>
11
+ str.split(separator, limit);
9
12
  const strReplace = (str, searchValue, replaceValue) =>
10
13
  str.replace(searchValue, replaceValue);
11
14
 
@@ -160,7 +163,11 @@ const getWrappedCommand = (executeCommand, onSqlCommand) =>
160
163
  return await executeCommand(sql, params);
161
164
  }
162
165
  : executeCommand;
163
- const escapeId = (str) => `"${strReplace(str, /"/g, '""')}"`;
166
+ const escapeId = (str) =>
167
+ arrayJoin(
168
+ arrayMap(strSplit(str, DOT), (part) => `"${strReplace(part, /"/g, '""')}"`),
169
+ DOT,
170
+ );
164
171
  const escapeIds = (...ids) => escapeId(arrayJoin(ids, '_'));
165
172
  const escapeColumnNames = (...columnNames) =>
166
173
  arrayJoin(arrayMap(columnNames, escapeId), COMMA);
@@ -563,6 +570,25 @@ const createCustomPersister = (
563
570
  return persister;
564
571
  };
565
572
  const isAutoSaving = () => !isUndefined(autoSaveListenerId);
573
+ const startAutoPersisting = async (
574
+ initialContent,
575
+ startSaveFirst = false,
576
+ ) => {
577
+ const [call1, call2] = startSaveFirst
578
+ ? [startAutoSave, startAutoLoad]
579
+ : [startAutoLoad, startAutoSave];
580
+ await call1(initialContent);
581
+ await call2(initialContent);
582
+ return persister;
583
+ };
584
+ const stopAutoPersisting = async (stopSaveFirst = false) => {
585
+ const [call1, call2] = stopSaveFirst
586
+ ? [stopAutoSave, stopAutoLoad]
587
+ : [stopAutoLoad, stopAutoSave];
588
+ await call1();
589
+ await call2();
590
+ return persister;
591
+ };
566
592
  const getStatus = () => status;
567
593
  const addStatusListener = (listener) =>
568
594
  addListener(listener, statusListeners);
@@ -576,10 +602,9 @@ const createCustomPersister = (
576
602
  return persister;
577
603
  };
578
604
  const getStore = () => store;
579
- const destroy = async () => {
605
+ const destroy = () => {
580
606
  arrayClear(mapGet(scheduleActions, scheduleId));
581
- await persister.stopAutoLoad();
582
- return await persister.stopAutoSave();
607
+ return stopAutoPersisting();
583
608
  };
584
609
  const getStats = () => ({loads, saves});
585
610
  const persister = {
@@ -591,6 +616,8 @@ const createCustomPersister = (
591
616
  startAutoSave,
592
617
  stopAutoSave,
593
618
  isAutoSaving,
619
+ startAutoPersisting,
620
+ stopAutoPersisting,
594
621
  getStatus,
595
622
  addStatusListener,
596
623
  delListener,
@@ -908,8 +935,7 @@ const createJsonPersister = (
908
935
  );
909
936
  });
910
937
  const destroy = async () => {
911
- await persister.stopAutoLoad();
912
- await persister.stopAutoSave();
938
+ await persister.stopAutoPersisting();
913
939
  extraDestroy();
914
940
  return persister;
915
941
  };
@@ -1043,8 +1069,7 @@ const createTabularPersister = (
1043
1069
  }
1044
1070
  });
1045
1071
  const destroy = async () => {
1046
- await persister.stopAutoLoad();
1047
- await persister.stopAutoSave();
1072
+ await persister.stopAutoPersisting();
1048
1073
  extraDestroy();
1049
1074
  return persister;
1050
1075
  };
@@ -2,9 +2,12 @@ const getTypeOf = (thing) => typeof thing;
2
2
  const TINYBASE = 'tinybase';
3
3
  const EMPTY_STRING = '';
4
4
  const COMMA = ',';
5
+ const DOT = '.';
5
6
  const STRING = getTypeOf(EMPTY_STRING);
6
7
  const TRUE = 'true';
7
8
  const UNDEFINED = '\uFFFC';
9
+ const strSplit = (str, separator = EMPTY_STRING, limit) =>
10
+ str.split(separator, limit);
8
11
  const strReplace = (str, searchValue, replaceValue) =>
9
12
  str.replace(searchValue, replaceValue);
10
13
 
@@ -119,7 +122,11 @@ const getWrappedCommand = (executeCommand, onSqlCommand) =>
119
122
  return await executeCommand(sql, params);
120
123
  }
121
124
  : executeCommand;
122
- const escapeId = (str) => `"${strReplace(str, /"/g, '""')}"`;
125
+ const escapeId = (str) =>
126
+ arrayJoin(
127
+ arrayMap(strSplit(str, DOT), (part) => `"${strReplace(part, /"/g, '""')}"`),
128
+ DOT,
129
+ );
123
130
  const escapeColumnNames = (...columnNames) =>
124
131
  arrayJoin(arrayMap(columnNames, escapeId), COMMA);
125
132
  const getPlaceholders = (array, offset = [1]) =>
@@ -558,6 +565,25 @@ const createCustomPersister = (
558
565
  return persister;
559
566
  };
560
567
  const isAutoSaving = () => !isUndefined(autoSaveListenerId);
568
+ const startAutoPersisting = async (
569
+ initialContent,
570
+ startSaveFirst = false,
571
+ ) => {
572
+ const [call1, call2] = startSaveFirst
573
+ ? [startAutoSave, startAutoLoad]
574
+ : [startAutoLoad, startAutoSave];
575
+ await call1(initialContent);
576
+ await call2(initialContent);
577
+ return persister;
578
+ };
579
+ const stopAutoPersisting = async (stopSaveFirst = false) => {
580
+ const [call1, call2] = stopSaveFirst
581
+ ? [stopAutoSave, stopAutoLoad]
582
+ : [stopAutoLoad, stopAutoSave];
583
+ await call1();
584
+ await call2();
585
+ return persister;
586
+ };
561
587
  const getStatus = () => status;
562
588
  const addStatusListener = (listener) =>
563
589
  addListener(listener, statusListeners);
@@ -571,10 +597,9 @@ const createCustomPersister = (
571
597
  return persister;
572
598
  };
573
599
  const getStore = () => store;
574
- const destroy = async () => {
600
+ const destroy = () => {
575
601
  arrayClear(mapGet(scheduleActions, scheduleId));
576
- await persister.stopAutoLoad();
577
- return await persister.stopAutoSave();
602
+ return stopAutoPersisting();
578
603
  };
579
604
  const getStats = () => ({loads, saves});
580
605
  const persister = {
@@ -586,6 +611,8 @@ const createCustomPersister = (
586
611
  startAutoSave,
587
612
  stopAutoSave,
588
613
  isAutoSaving,
614
+ startAutoPersisting,
615
+ stopAutoPersisting,
589
616
  getStatus,
590
617
  addStatusListener,
591
618
  delListener,
@@ -903,8 +930,7 @@ const createJsonPersister = (
903
930
  );
904
931
  });
905
932
  const destroy = async () => {
906
- await persister.stopAutoLoad();
907
- await persister.stopAutoSave();
933
+ await persister.stopAutoPersisting();
908
934
  extraDestroy();
909
935
  return persister;
910
936
  };
@@ -1038,8 +1064,7 @@ const createTabularPersister = (
1038
1064
  }
1039
1065
  });
1040
1066
  const destroy = async () => {
1041
- await persister.stopAutoLoad();
1042
- await persister.stopAutoSave();
1067
+ await persister.stopAutoPersisting();
1043
1068
  extraDestroy();
1044
1069
  return persister;
1045
1070
  };
@@ -2,9 +2,12 @@ const getTypeOf = (thing) => typeof thing;
2
2
  const TINYBASE = 'tinybase';
3
3
  const EMPTY_STRING = '';
4
4
  const COMMA = ',';
5
+ const DOT = '.';
5
6
  const STRING = getTypeOf(EMPTY_STRING);
6
7
  const TRUE = 'true';
7
8
  const UNDEFINED = '\uFFFC';
9
+ const strSplit = (str, separator = EMPTY_STRING, limit) =>
10
+ str.split(separator, limit);
8
11
  const strReplace = (str, searchValue, replaceValue) =>
9
12
  str.replace(searchValue, replaceValue);
10
13
 
@@ -119,7 +122,11 @@ const getWrappedCommand = (executeCommand, onSqlCommand) =>
119
122
  return await executeCommand(sql, params);
120
123
  }
121
124
  : executeCommand;
122
- const escapeId = (str) => `"${strReplace(str, /"/g, '""')}"`;
125
+ const escapeId = (str) =>
126
+ arrayJoin(
127
+ arrayMap(strSplit(str, DOT), (part) => `"${strReplace(part, /"/g, '""')}"`),
128
+ DOT,
129
+ );
123
130
  const escapeColumnNames = (...columnNames) =>
124
131
  arrayJoin(arrayMap(columnNames, escapeId), COMMA);
125
132
  const getPlaceholders = (array, offset = [1]) =>
@@ -558,6 +565,25 @@ const createCustomPersister = (
558
565
  return persister;
559
566
  };
560
567
  const isAutoSaving = () => !isUndefined(autoSaveListenerId);
568
+ const startAutoPersisting = async (
569
+ initialContent,
570
+ startSaveFirst = false,
571
+ ) => {
572
+ const [call1, call2] = startSaveFirst
573
+ ? [startAutoSave, startAutoLoad]
574
+ : [startAutoLoad, startAutoSave];
575
+ await call1(initialContent);
576
+ await call2(initialContent);
577
+ return persister;
578
+ };
579
+ const stopAutoPersisting = async (stopSaveFirst = false) => {
580
+ const [call1, call2] = stopSaveFirst
581
+ ? [stopAutoSave, stopAutoLoad]
582
+ : [stopAutoLoad, stopAutoSave];
583
+ await call1();
584
+ await call2();
585
+ return persister;
586
+ };
561
587
  const getStatus = () => status;
562
588
  const addStatusListener = (listener) =>
563
589
  addListener(listener, statusListeners);
@@ -571,10 +597,9 @@ const createCustomPersister = (
571
597
  return persister;
572
598
  };
573
599
  const getStore = () => store;
574
- const destroy = async () => {
600
+ const destroy = () => {
575
601
  arrayClear(mapGet(scheduleActions, scheduleId));
576
- await persister.stopAutoLoad();
577
- return await persister.stopAutoSave();
602
+ return stopAutoPersisting();
578
603
  };
579
604
  const getStats = () => ({loads, saves});
580
605
  const persister = {
@@ -586,6 +611,8 @@ const createCustomPersister = (
586
611
  startAutoSave,
587
612
  stopAutoSave,
588
613
  isAutoSaving,
614
+ startAutoPersisting,
615
+ stopAutoPersisting,
589
616
  getStatus,
590
617
  addStatusListener,
591
618
  delListener,
@@ -903,8 +930,7 @@ const createJsonPersister = (
903
930
  );
904
931
  });
905
932
  const destroy = async () => {
906
- await persister.stopAutoLoad();
907
- await persister.stopAutoSave();
933
+ await persister.stopAutoPersisting();
908
934
  extraDestroy();
909
935
  return persister;
910
936
  };
@@ -1038,8 +1064,7 @@ const createTabularPersister = (
1038
1064
  }
1039
1065
  });
1040
1066
  const destroy = async () => {
1041
- await persister.stopAutoLoad();
1042
- await persister.stopAutoSave();
1067
+ await persister.stopAutoPersisting();
1043
1068
  extraDestroy();
1044
1069
  return persister;
1045
1070
  };
@@ -366,6 +366,25 @@ const createCustomPersister = (
366
366
  return persister;
367
367
  };
368
368
  const isAutoSaving = () => !isUndefined(autoSaveListenerId);
369
+ const startAutoPersisting = async (
370
+ initialContent,
371
+ startSaveFirst = false,
372
+ ) => {
373
+ const [call1, call2] = startSaveFirst
374
+ ? [startAutoSave, startAutoLoad]
375
+ : [startAutoLoad, startAutoSave];
376
+ await call1(initialContent);
377
+ await call2(initialContent);
378
+ return persister;
379
+ };
380
+ const stopAutoPersisting = async (stopSaveFirst = false) => {
381
+ const [call1, call2] = stopSaveFirst
382
+ ? [stopAutoSave, stopAutoLoad]
383
+ : [stopAutoLoad, stopAutoSave];
384
+ await call1();
385
+ await call2();
386
+ return persister;
387
+ };
369
388
  const getStatus = () => status;
370
389
  const addStatusListener = (listener) =>
371
390
  addListener(listener, statusListeners);
@@ -379,10 +398,9 @@ const createCustomPersister = (
379
398
  return persister;
380
399
  };
381
400
  const getStore = () => store;
382
- const destroy = async () => {
401
+ const destroy = () => {
383
402
  arrayClear(mapGet(scheduleActions, scheduleId));
384
- await persister.stopAutoLoad();
385
- return await persister.stopAutoSave();
403
+ return stopAutoPersisting();
386
404
  };
387
405
  const getStats = () => ({loads, saves});
388
406
  const persister = {
@@ -394,6 +412,8 @@ const createCustomPersister = (
394
412
  startAutoSave,
395
413
  stopAutoSave,
396
414
  isAutoSaving,
415
+ startAutoPersisting,
416
+ stopAutoPersisting,
397
417
  getStatus,
398
418
  addStatusListener,
399
419
  delListener,
@@ -366,6 +366,25 @@ const createCustomPersister = (
366
366
  return persister;
367
367
  };
368
368
  const isAutoSaving = () => !isUndefined(autoSaveListenerId);
369
+ const startAutoPersisting = async (
370
+ initialContent,
371
+ startSaveFirst = false,
372
+ ) => {
373
+ const [call1, call2] = startSaveFirst
374
+ ? [startAutoSave, startAutoLoad]
375
+ : [startAutoLoad, startAutoSave];
376
+ await call1(initialContent);
377
+ await call2(initialContent);
378
+ return persister;
379
+ };
380
+ const stopAutoPersisting = async (stopSaveFirst = false) => {
381
+ const [call1, call2] = stopSaveFirst
382
+ ? [stopAutoSave, stopAutoLoad]
383
+ : [stopAutoLoad, stopAutoSave];
384
+ await call1();
385
+ await call2();
386
+ return persister;
387
+ };
369
388
  const getStatus = () => status;
370
389
  const addStatusListener = (listener) =>
371
390
  addListener(listener, statusListeners);
@@ -379,10 +398,9 @@ const createCustomPersister = (
379
398
  return persister;
380
399
  };
381
400
  const getStore = () => store;
382
- const destroy = async () => {
401
+ const destroy = () => {
383
402
  arrayClear(mapGet(scheduleActions, scheduleId));
384
- await persister.stopAutoLoad();
385
- return await persister.stopAutoSave();
403
+ return stopAutoPersisting();
386
404
  };
387
405
  const getStats = () => ({loads, saves});
388
406
  const persister = {
@@ -394,6 +412,8 @@ const createCustomPersister = (
394
412
  startAutoSave,
395
413
  stopAutoSave,
396
414
  isAutoSaving,
415
+ startAutoPersisting,
416
+ stopAutoPersisting,
397
417
  getStatus,
398
418
  addStatusListener,
399
419
  delListener,