tinybase 6.1.0-beta.5 → 6.2.0-beta.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 +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
@@ -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
 
@@ -79,7 +82,11 @@ const getWrappedCommand = (executeCommand, onSqlCommand) =>
79
82
  return await executeCommand(sql, params);
80
83
  }
81
84
  : executeCommand;
82
- const escapeId = (str) => `"${strReplace(str, /"/g, '""')}"`;
85
+ const escapeId = (str) =>
86
+ arrayJoin(
87
+ arrayMap(strSplit(str, DOT), (part) => `"${strReplace(part, /"/g, '""')}"`),
88
+ DOT,
89
+ );
83
90
  const escapeColumnNames = (...columnNames) =>
84
91
  arrayJoin(arrayMap(columnNames, escapeId), COMMA);
85
92
  const getPlaceholders = (array, offset = [1]) =>
@@ -557,6 +564,25 @@ const createCustomPersister = (
557
564
  return persister;
558
565
  };
559
566
  const isAutoSaving = () => !isUndefined(autoSaveListenerId);
567
+ const startAutoPersisting = async (
568
+ initialContent,
569
+ startSaveFirst = false,
570
+ ) => {
571
+ const [call1, call2] = startSaveFirst
572
+ ? [startAutoSave, startAutoLoad]
573
+ : [startAutoLoad, startAutoSave];
574
+ await call1(initialContent);
575
+ await call2(initialContent);
576
+ return persister;
577
+ };
578
+ const stopAutoPersisting = async (stopSaveFirst = false) => {
579
+ const [call1, call2] = stopSaveFirst
580
+ ? [stopAutoSave, stopAutoLoad]
581
+ : [stopAutoLoad, stopAutoSave];
582
+ await call1();
583
+ await call2();
584
+ return persister;
585
+ };
560
586
  const getStatus = () => status;
561
587
  const addStatusListener = (listener) =>
562
588
  addListener(listener, statusListeners);
@@ -570,10 +596,9 @@ const createCustomPersister = (
570
596
  return persister;
571
597
  };
572
598
  const getStore = () => store;
573
- const destroy = async () => {
599
+ const destroy = () => {
574
600
  arrayClear(mapGet(scheduleActions, scheduleId));
575
- await persister.stopAutoLoad();
576
- return await persister.stopAutoSave();
601
+ return stopAutoPersisting();
577
602
  };
578
603
  const getStats = () => ({loads, saves});
579
604
  const persister = {
@@ -585,6 +610,8 @@ const createCustomPersister = (
585
610
  startAutoSave,
586
611
  stopAutoSave,
587
612
  isAutoSaving,
613
+ startAutoPersisting,
614
+ stopAutoPersisting,
588
615
  getStatus,
589
616
  addStatusListener,
590
617
  delListener,
@@ -902,8 +929,7 @@ const createJsonPersister = (
902
929
  );
903
930
  });
904
931
  const destroy = async () => {
905
- await persister.stopAutoLoad();
906
- await persister.stopAutoSave();
932
+ await persister.stopAutoPersisting();
907
933
  extraDestroy();
908
934
  return persister;
909
935
  };
@@ -1037,8 +1063,7 @@ const createTabularPersister = (
1037
1063
  }
1038
1064
  });
1039
1065
  const destroy = async () => {
1040
- await persister.stopAutoLoad();
1041
- await persister.stopAutoSave();
1066
+ await persister.stopAutoPersisting();
1042
1067
  extraDestroy();
1043
1068
  return persister;
1044
1069
  };
@@ -4,9 +4,12 @@ const getTypeOf = (thing) => typeof thing;
4
4
  const TINYBASE = 'tinybase';
5
5
  const EMPTY_STRING = '';
6
6
  const COMMA = ',';
7
+ const DOT = '.';
7
8
  const STRING = getTypeOf(EMPTY_STRING);
8
9
  const TRUE = 'true';
9
10
  const UNDEFINED = '\uFFFC';
11
+ const strSplit = (str, separator = EMPTY_STRING, limit) =>
12
+ str.split(separator, limit);
10
13
  const strReplace = (str, searchValue, replaceValue) =>
11
14
  str.replace(searchValue, replaceValue);
12
15
 
@@ -81,7 +84,11 @@ const getWrappedCommand = (executeCommand, onSqlCommand) =>
81
84
  return await executeCommand(sql, params);
82
85
  }
83
86
  : executeCommand;
84
- const escapeId = (str) => `"${strReplace(str, /"/g, '""')}"`;
87
+ const escapeId = (str) =>
88
+ arrayJoin(
89
+ arrayMap(strSplit(str, DOT), (part) => `"${strReplace(part, /"/g, '""')}"`),
90
+ DOT,
91
+ );
85
92
  const escapeColumnNames = (...columnNames) =>
86
93
  arrayJoin(arrayMap(columnNames, escapeId), COMMA);
87
94
  const getPlaceholders = (array, offset = [1]) =>
@@ -559,6 +566,25 @@ const createCustomPersister = (
559
566
  return persister;
560
567
  };
561
568
  const isAutoSaving = () => !isUndefined(autoSaveListenerId);
569
+ const startAutoPersisting = async (
570
+ initialContent,
571
+ startSaveFirst = false,
572
+ ) => {
573
+ const [call1, call2] = startSaveFirst
574
+ ? [startAutoSave, startAutoLoad]
575
+ : [startAutoLoad, startAutoSave];
576
+ await call1(initialContent);
577
+ await call2(initialContent);
578
+ return persister;
579
+ };
580
+ const stopAutoPersisting = async (stopSaveFirst = false) => {
581
+ const [call1, call2] = stopSaveFirst
582
+ ? [stopAutoSave, stopAutoLoad]
583
+ : [stopAutoLoad, stopAutoSave];
584
+ await call1();
585
+ await call2();
586
+ return persister;
587
+ };
562
588
  const getStatus = () => status;
563
589
  const addStatusListener = (listener) =>
564
590
  addListener(listener, statusListeners);
@@ -572,10 +598,9 @@ const createCustomPersister = (
572
598
  return persister;
573
599
  };
574
600
  const getStore = () => store;
575
- const destroy = async () => {
601
+ const destroy = () => {
576
602
  arrayClear(mapGet(scheduleActions, scheduleId));
577
- await persister.stopAutoLoad();
578
- return await persister.stopAutoSave();
603
+ return stopAutoPersisting();
579
604
  };
580
605
  const getStats = () => ({loads, saves});
581
606
  const persister = {
@@ -587,6 +612,8 @@ const createCustomPersister = (
587
612
  startAutoSave,
588
613
  stopAutoSave,
589
614
  isAutoSaving,
615
+ startAutoPersisting,
616
+ stopAutoPersisting,
590
617
  getStatus,
591
618
  addStatusListener,
592
619
  delListener,
@@ -904,8 +931,7 @@ const createJsonPersister = (
904
931
  );
905
932
  });
906
933
  const destroy = async () => {
907
- await persister.stopAutoLoad();
908
- await persister.stopAutoSave();
934
+ await persister.stopAutoPersisting();
909
935
  extraDestroy();
910
936
  return persister;
911
937
  };
@@ -1039,8 +1065,7 @@ const createTabularPersister = (
1039
1065
  }
1040
1066
  });
1041
1067
  const destroy = async () => {
1042
- await persister.stopAutoLoad();
1043
- await persister.stopAutoSave();
1068
+ await persister.stopAutoPersisting();
1044
1069
  extraDestroy();
1045
1070
  return persister;
1046
1071
  };
@@ -4,9 +4,12 @@ const getTypeOf = (thing) => typeof thing;
4
4
  const TINYBASE = 'tinybase';
5
5
  const EMPTY_STRING = '';
6
6
  const COMMA = ',';
7
+ const DOT = '.';
7
8
  const STRING = getTypeOf(EMPTY_STRING);
8
9
  const TRUE = 'true';
9
10
  const UNDEFINED = '\uFFFC';
11
+ const strSplit = (str, separator = EMPTY_STRING, limit) =>
12
+ str.split(separator, limit);
10
13
  const strReplace = (str, searchValue, replaceValue) =>
11
14
  str.replace(searchValue, replaceValue);
12
15
 
@@ -81,7 +84,11 @@ const getWrappedCommand = (executeCommand, onSqlCommand) =>
81
84
  return await executeCommand(sql, params);
82
85
  }
83
86
  : executeCommand;
84
- const escapeId = (str) => `"${strReplace(str, /"/g, '""')}"`;
87
+ const escapeId = (str) =>
88
+ arrayJoin(
89
+ arrayMap(strSplit(str, DOT), (part) => `"${strReplace(part, /"/g, '""')}"`),
90
+ DOT,
91
+ );
85
92
  const escapeColumnNames = (...columnNames) =>
86
93
  arrayJoin(arrayMap(columnNames, escapeId), COMMA);
87
94
  const getPlaceholders = (array, offset = [1]) =>
@@ -559,6 +566,25 @@ const createCustomPersister = (
559
566
  return persister;
560
567
  };
561
568
  const isAutoSaving = () => !isUndefined(autoSaveListenerId);
569
+ const startAutoPersisting = async (
570
+ initialContent,
571
+ startSaveFirst = false,
572
+ ) => {
573
+ const [call1, call2] = startSaveFirst
574
+ ? [startAutoSave, startAutoLoad]
575
+ : [startAutoLoad, startAutoSave];
576
+ await call1(initialContent);
577
+ await call2(initialContent);
578
+ return persister;
579
+ };
580
+ const stopAutoPersisting = async (stopSaveFirst = false) => {
581
+ const [call1, call2] = stopSaveFirst
582
+ ? [stopAutoSave, stopAutoLoad]
583
+ : [stopAutoLoad, stopAutoSave];
584
+ await call1();
585
+ await call2();
586
+ return persister;
587
+ };
562
588
  const getStatus = () => status;
563
589
  const addStatusListener = (listener) =>
564
590
  addListener(listener, statusListeners);
@@ -572,10 +598,9 @@ const createCustomPersister = (
572
598
  return persister;
573
599
  };
574
600
  const getStore = () => store;
575
- const destroy = async () => {
601
+ const destroy = () => {
576
602
  arrayClear(mapGet(scheduleActions, scheduleId));
577
- await persister.stopAutoLoad();
578
- return await persister.stopAutoSave();
603
+ return stopAutoPersisting();
579
604
  };
580
605
  const getStats = () => ({loads, saves});
581
606
  const persister = {
@@ -587,6 +612,8 @@ const createCustomPersister = (
587
612
  startAutoSave,
588
613
  stopAutoSave,
589
614
  isAutoSaving,
615
+ startAutoPersisting,
616
+ stopAutoPersisting,
590
617
  getStatus,
591
618
  addStatusListener,
592
619
  delListener,
@@ -904,8 +931,7 @@ const createJsonPersister = (
904
931
  );
905
932
  });
906
933
  const destroy = async () => {
907
- await persister.stopAutoLoad();
908
- await persister.stopAutoSave();
934
+ await persister.stopAutoPersisting();
909
935
  extraDestroy();
910
936
  return persister;
911
937
  };
@@ -1039,8 +1065,7 @@ const createTabularPersister = (
1039
1065
  }
1040
1066
  });
1041
1067
  const destroy = async () => {
1042
- await persister.stopAutoLoad();
1043
- await persister.stopAutoSave();
1068
+ await persister.stopAutoPersisting();
1044
1069
  extraDestroy();
1045
1070
  return persister;
1046
1071
  };
@@ -365,6 +365,25 @@ const createCustomPersister = (
365
365
  return persister;
366
366
  };
367
367
  const isAutoSaving = () => !isUndefined(autoSaveListenerId);
368
+ const startAutoPersisting = async (
369
+ initialContent,
370
+ startSaveFirst = false,
371
+ ) => {
372
+ const [call1, call2] = startSaveFirst
373
+ ? [startAutoSave, startAutoLoad]
374
+ : [startAutoLoad, startAutoSave];
375
+ await call1(initialContent);
376
+ await call2(initialContent);
377
+ return persister;
378
+ };
379
+ const stopAutoPersisting = async (stopSaveFirst = false) => {
380
+ const [call1, call2] = stopSaveFirst
381
+ ? [stopAutoSave, stopAutoLoad]
382
+ : [stopAutoLoad, stopAutoSave];
383
+ await call1();
384
+ await call2();
385
+ return persister;
386
+ };
368
387
  const getStatus = () => status;
369
388
  const addStatusListener = (listener) =>
370
389
  addListener(listener, statusListeners);
@@ -378,10 +397,9 @@ const createCustomPersister = (
378
397
  return persister;
379
398
  };
380
399
  const getStore = () => store;
381
- const destroy = async () => {
400
+ const destroy = () => {
382
401
  arrayClear(mapGet(scheduleActions, scheduleId));
383
- await persister.stopAutoLoad();
384
- return await persister.stopAutoSave();
402
+ return stopAutoPersisting();
385
403
  };
386
404
  const getStats = () => ({loads, saves});
387
405
  const persister = {
@@ -393,6 +411,8 @@ const createCustomPersister = (
393
411
  startAutoSave,
394
412
  stopAutoSave,
395
413
  isAutoSaving,
414
+ startAutoPersisting,
415
+ stopAutoPersisting,
396
416
  getStatus,
397
417
  addStatusListener,
398
418
  delListener,
@@ -365,6 +365,25 @@ const createCustomPersister = (
365
365
  return persister;
366
366
  };
367
367
  const isAutoSaving = () => !isUndefined(autoSaveListenerId);
368
+ const startAutoPersisting = async (
369
+ initialContent,
370
+ startSaveFirst = false,
371
+ ) => {
372
+ const [call1, call2] = startSaveFirst
373
+ ? [startAutoSave, startAutoLoad]
374
+ : [startAutoLoad, startAutoSave];
375
+ await call1(initialContent);
376
+ await call2(initialContent);
377
+ return persister;
378
+ };
379
+ const stopAutoPersisting = async (stopSaveFirst = false) => {
380
+ const [call1, call2] = stopSaveFirst
381
+ ? [stopAutoSave, stopAutoLoad]
382
+ : [stopAutoLoad, stopAutoSave];
383
+ await call1();
384
+ await call2();
385
+ return persister;
386
+ };
368
387
  const getStatus = () => status;
369
388
  const addStatusListener = (listener) =>
370
389
  addListener(listener, statusListeners);
@@ -378,10 +397,9 @@ const createCustomPersister = (
378
397
  return persister;
379
398
  };
380
399
  const getStore = () => store;
381
- const destroy = async () => {
400
+ const destroy = () => {
382
401
  arrayClear(mapGet(scheduleActions, scheduleId));
383
- await persister.stopAutoLoad();
384
- return await persister.stopAutoSave();
402
+ return stopAutoPersisting();
385
403
  };
386
404
  const getStats = () => ({loads, saves});
387
405
  const persister = {
@@ -393,6 +411,8 @@ const createCustomPersister = (
393
411
  startAutoSave,
394
412
  stopAutoSave,
395
413
  isAutoSaving,
414
+ startAutoPersisting,
415
+ stopAutoPersisting,
396
416
  getStatus,
397
417
  addStatusListener,
398
418
  delListener,
@@ -371,6 +371,25 @@ const createCustomPersister = (
371
371
  return persister;
372
372
  };
373
373
  const isAutoSaving = () => !isUndefined(autoSaveListenerId);
374
+ const startAutoPersisting = async (
375
+ initialContent,
376
+ startSaveFirst = false,
377
+ ) => {
378
+ const [call1, call2] = startSaveFirst
379
+ ? [startAutoSave, startAutoLoad]
380
+ : [startAutoLoad, startAutoSave];
381
+ await call1(initialContent);
382
+ await call2(initialContent);
383
+ return persister;
384
+ };
385
+ const stopAutoPersisting = async (stopSaveFirst = false) => {
386
+ const [call1, call2] = stopSaveFirst
387
+ ? [stopAutoSave, stopAutoLoad]
388
+ : [stopAutoLoad, stopAutoSave];
389
+ await call1();
390
+ await call2();
391
+ return persister;
392
+ };
374
393
  const getStatus = () => status;
375
394
  const addStatusListener = (listener) =>
376
395
  addListener(listener, statusListeners);
@@ -384,10 +403,9 @@ const createCustomPersister = (
384
403
  return persister;
385
404
  };
386
405
  const getStore = () => store;
387
- const destroy = async () => {
406
+ const destroy = () => {
388
407
  arrayClear(mapGet(scheduleActions, scheduleId));
389
- await persister.stopAutoLoad();
390
- return await persister.stopAutoSave();
408
+ return stopAutoPersisting();
391
409
  };
392
410
  const getStats = () => ({loads, saves});
393
411
  const persister = {
@@ -399,6 +417,8 @@ const createCustomPersister = (
399
417
  startAutoSave,
400
418
  stopAutoSave,
401
419
  isAutoSaving,
420
+ startAutoPersisting,
421
+ stopAutoPersisting,
402
422
  getStatus,
403
423
  addStatusListener,
404
424
  delListener,
@@ -371,6 +371,25 @@ const createCustomPersister = (
371
371
  return persister;
372
372
  };
373
373
  const isAutoSaving = () => !isUndefined(autoSaveListenerId);
374
+ const startAutoPersisting = async (
375
+ initialContent,
376
+ startSaveFirst = false,
377
+ ) => {
378
+ const [call1, call2] = startSaveFirst
379
+ ? [startAutoSave, startAutoLoad]
380
+ : [startAutoLoad, startAutoSave];
381
+ await call1(initialContent);
382
+ await call2(initialContent);
383
+ return persister;
384
+ };
385
+ const stopAutoPersisting = async (stopSaveFirst = false) => {
386
+ const [call1, call2] = stopSaveFirst
387
+ ? [stopAutoSave, stopAutoLoad]
388
+ : [stopAutoLoad, stopAutoSave];
389
+ await call1();
390
+ await call2();
391
+ return persister;
392
+ };
374
393
  const getStatus = () => status;
375
394
  const addStatusListener = (listener) =>
376
395
  addListener(listener, statusListeners);
@@ -384,10 +403,9 @@ const createCustomPersister = (
384
403
  return persister;
385
404
  };
386
405
  const getStore = () => store;
387
- const destroy = async () => {
406
+ const destroy = () => {
388
407
  arrayClear(mapGet(scheduleActions, scheduleId));
389
- await persister.stopAutoLoad();
390
- return await persister.stopAutoSave();
408
+ return stopAutoPersisting();
391
409
  };
392
410
  const getStats = () => ({loads, saves});
393
411
  const persister = {
@@ -399,6 +417,8 @@ const createCustomPersister = (
399
417
  startAutoSave,
400
418
  stopAutoSave,
401
419
  isAutoSaving,
420
+ startAutoPersisting,
421
+ stopAutoPersisting,
402
422
  getStatus,
403
423
  addStatusListener,
404
424
  delListener,
@@ -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
 
@@ -79,7 +82,11 @@ const getWrappedCommand = (executeCommand, onSqlCommand) =>
79
82
  return await executeCommand(sql, params);
80
83
  }
81
84
  : executeCommand;
82
- const escapeId = (str) => `"${strReplace(str, /"/g, '""')}"`;
85
+ const escapeId = (str) =>
86
+ arrayJoin(
87
+ arrayMap(strSplit(str, DOT), (part) => `"${strReplace(part, /"/g, '""')}"`),
88
+ DOT,
89
+ );
83
90
  const escapeColumnNames = (...columnNames) =>
84
91
  arrayJoin(arrayMap(columnNames, escapeId), COMMA);
85
92
  const getPlaceholders = (array, offset = [1]) =>
@@ -557,6 +564,25 @@ const createCustomPersister = (
557
564
  return persister;
558
565
  };
559
566
  const isAutoSaving = () => !isUndefined(autoSaveListenerId);
567
+ const startAutoPersisting = async (
568
+ initialContent,
569
+ startSaveFirst = false,
570
+ ) => {
571
+ const [call1, call2] = startSaveFirst
572
+ ? [startAutoSave, startAutoLoad]
573
+ : [startAutoLoad, startAutoSave];
574
+ await call1(initialContent);
575
+ await call2(initialContent);
576
+ return persister;
577
+ };
578
+ const stopAutoPersisting = async (stopSaveFirst = false) => {
579
+ const [call1, call2] = stopSaveFirst
580
+ ? [stopAutoSave, stopAutoLoad]
581
+ : [stopAutoLoad, stopAutoSave];
582
+ await call1();
583
+ await call2();
584
+ return persister;
585
+ };
560
586
  const getStatus = () => status;
561
587
  const addStatusListener = (listener) =>
562
588
  addListener(listener, statusListeners);
@@ -570,10 +596,9 @@ const createCustomPersister = (
570
596
  return persister;
571
597
  };
572
598
  const getStore = () => store;
573
- const destroy = async () => {
599
+ const destroy = () => {
574
600
  arrayClear(mapGet(scheduleActions, scheduleId));
575
- await persister.stopAutoLoad();
576
- return await persister.stopAutoSave();
601
+ return stopAutoPersisting();
577
602
  };
578
603
  const getStats = () => ({loads, saves});
579
604
  const persister = {
@@ -585,6 +610,8 @@ const createCustomPersister = (
585
610
  startAutoSave,
586
611
  stopAutoSave,
587
612
  isAutoSaving,
613
+ startAutoPersisting,
614
+ stopAutoPersisting,
588
615
  getStatus,
589
616
  addStatusListener,
590
617
  delListener,
@@ -902,8 +929,7 @@ const createJsonPersister = (
902
929
  );
903
930
  });
904
931
  const destroy = async () => {
905
- await persister.stopAutoLoad();
906
- await persister.stopAutoSave();
932
+ await persister.stopAutoPersisting();
907
933
  extraDestroy();
908
934
  return persister;
909
935
  };
@@ -1037,8 +1063,7 @@ const createTabularPersister = (
1037
1063
  }
1038
1064
  });
1039
1065
  const destroy = async () => {
1040
- await persister.stopAutoLoad();
1041
- await persister.stopAutoSave();
1066
+ await persister.stopAutoPersisting();
1042
1067
  extraDestroy();
1043
1068
  return persister;
1044
1069
  };
@@ -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
 
@@ -79,7 +82,11 @@ const getWrappedCommand = (executeCommand, onSqlCommand) =>
79
82
  return await executeCommand(sql, params);
80
83
  }
81
84
  : executeCommand;
82
- const escapeId = (str) => `"${strReplace(str, /"/g, '""')}"`;
85
+ const escapeId = (str) =>
86
+ arrayJoin(
87
+ arrayMap(strSplit(str, DOT), (part) => `"${strReplace(part, /"/g, '""')}"`),
88
+ DOT,
89
+ );
83
90
  const escapeColumnNames = (...columnNames) =>
84
91
  arrayJoin(arrayMap(columnNames, escapeId), COMMA);
85
92
  const getPlaceholders = (array, offset = [1]) =>
@@ -557,6 +564,25 @@ const createCustomPersister = (
557
564
  return persister;
558
565
  };
559
566
  const isAutoSaving = () => !isUndefined(autoSaveListenerId);
567
+ const startAutoPersisting = async (
568
+ initialContent,
569
+ startSaveFirst = false,
570
+ ) => {
571
+ const [call1, call2] = startSaveFirst
572
+ ? [startAutoSave, startAutoLoad]
573
+ : [startAutoLoad, startAutoSave];
574
+ await call1(initialContent);
575
+ await call2(initialContent);
576
+ return persister;
577
+ };
578
+ const stopAutoPersisting = async (stopSaveFirst = false) => {
579
+ const [call1, call2] = stopSaveFirst
580
+ ? [stopAutoSave, stopAutoLoad]
581
+ : [stopAutoLoad, stopAutoSave];
582
+ await call1();
583
+ await call2();
584
+ return persister;
585
+ };
560
586
  const getStatus = () => status;
561
587
  const addStatusListener = (listener) =>
562
588
  addListener(listener, statusListeners);
@@ -570,10 +596,9 @@ const createCustomPersister = (
570
596
  return persister;
571
597
  };
572
598
  const getStore = () => store;
573
- const destroy = async () => {
599
+ const destroy = () => {
574
600
  arrayClear(mapGet(scheduleActions, scheduleId));
575
- await persister.stopAutoLoad();
576
- return await persister.stopAutoSave();
601
+ return stopAutoPersisting();
577
602
  };
578
603
  const getStats = () => ({loads, saves});
579
604
  const persister = {
@@ -585,6 +610,8 @@ const createCustomPersister = (
585
610
  startAutoSave,
586
611
  stopAutoSave,
587
612
  isAutoSaving,
613
+ startAutoPersisting,
614
+ stopAutoPersisting,
588
615
  getStatus,
589
616
  addStatusListener,
590
617
  delListener,
@@ -902,8 +929,7 @@ const createJsonPersister = (
902
929
  );
903
930
  });
904
931
  const destroy = async () => {
905
- await persister.stopAutoLoad();
906
- await persister.stopAutoSave();
932
+ await persister.stopAutoPersisting();
907
933
  extraDestroy();
908
934
  return persister;
909
935
  };
@@ -1037,8 +1063,7 @@ const createTabularPersister = (
1037
1063
  }
1038
1064
  });
1039
1065
  const destroy = async () => {
1040
- await persister.stopAutoLoad();
1041
- await persister.stopAutoSave();
1066
+ await persister.stopAutoPersisting();
1042
1067
  extraDestroy();
1043
1068
  return persister;
1044
1069
  };
@@ -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,