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
@@ -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
  };
@@ -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
  };
@@ -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
 
@@ -80,7 +83,11 @@ const getWrappedCommand = (executeCommand, onSqlCommand) =>
80
83
  return await executeCommand(sql, params);
81
84
  }
82
85
  : executeCommand;
83
- const escapeId = (str) => `"${strReplace(str, /"/g, '""')}"`;
86
+ const escapeId = (str) =>
87
+ arrayJoin(
88
+ arrayMap(strSplit(str, DOT), (part) => `"${strReplace(part, /"/g, '""')}"`),
89
+ DOT,
90
+ );
84
91
  const escapeColumnNames = (...columnNames) =>
85
92
  arrayJoin(arrayMap(columnNames, escapeId), COMMA);
86
93
  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
 
@@ -80,7 +83,11 @@ const getWrappedCommand = (executeCommand, onSqlCommand) =>
80
83
  return await executeCommand(sql, params);
81
84
  }
82
85
  : executeCommand;
83
- const escapeId = (str) => `"${strReplace(str, /"/g, '""')}"`;
86
+ const escapeId = (str) =>
87
+ arrayJoin(
88
+ arrayMap(strSplit(str, DOT), (part) => `"${strReplace(part, /"/g, '""')}"`),
89
+ DOT,
90
+ );
84
91
  const escapeColumnNames = (...columnNames) =>
85
92
  arrayJoin(arrayMap(columnNames, escapeId), COMMA);
86
93
  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
  };
@@ -375,6 +375,25 @@ const createCustomPersister = (
375
375
  return persister;
376
376
  };
377
377
  const isAutoSaving = () => !isUndefined(autoSaveListenerId);
378
+ const startAutoPersisting = async (
379
+ initialContent,
380
+ startSaveFirst = false,
381
+ ) => {
382
+ const [call1, call2] = startSaveFirst
383
+ ? [startAutoSave, startAutoLoad]
384
+ : [startAutoLoad, startAutoSave];
385
+ await call1(initialContent);
386
+ await call2(initialContent);
387
+ return persister;
388
+ };
389
+ const stopAutoPersisting = async (stopSaveFirst = false) => {
390
+ const [call1, call2] = stopSaveFirst
391
+ ? [stopAutoSave, stopAutoLoad]
392
+ : [stopAutoLoad, stopAutoSave];
393
+ await call1();
394
+ await call2();
395
+ return persister;
396
+ };
378
397
  const getStatus = () => status;
379
398
  const addStatusListener = (listener) =>
380
399
  addListener(listener, statusListeners);
@@ -388,10 +407,9 @@ const createCustomPersister = (
388
407
  return persister;
389
408
  };
390
409
  const getStore = () => store;
391
- const destroy = async () => {
410
+ const destroy = () => {
392
411
  arrayClear(mapGet(scheduleActions, scheduleId));
393
- await persister.stopAutoLoad();
394
- return await persister.stopAutoSave();
412
+ return stopAutoPersisting();
395
413
  };
396
414
  const getStats = () => ({loads, saves});
397
415
  const persister = {
@@ -403,6 +421,8 @@ const createCustomPersister = (
403
421
  startAutoSave,
404
422
  stopAutoSave,
405
423
  isAutoSaving,
424
+ startAutoPersisting,
425
+ stopAutoPersisting,
406
426
  getStatus,
407
427
  addStatusListener,
408
428
  delListener,
@@ -375,6 +375,25 @@ const createCustomPersister = (
375
375
  return persister;
376
376
  };
377
377
  const isAutoSaving = () => !isUndefined(autoSaveListenerId);
378
+ const startAutoPersisting = async (
379
+ initialContent,
380
+ startSaveFirst = false,
381
+ ) => {
382
+ const [call1, call2] = startSaveFirst
383
+ ? [startAutoSave, startAutoLoad]
384
+ : [startAutoLoad, startAutoSave];
385
+ await call1(initialContent);
386
+ await call2(initialContent);
387
+ return persister;
388
+ };
389
+ const stopAutoPersisting = async (stopSaveFirst = false) => {
390
+ const [call1, call2] = stopSaveFirst
391
+ ? [stopAutoSave, stopAutoLoad]
392
+ : [stopAutoLoad, stopAutoSave];
393
+ await call1();
394
+ await call2();
395
+ return persister;
396
+ };
378
397
  const getStatus = () => status;
379
398
  const addStatusListener = (listener) =>
380
399
  addListener(listener, statusListeners);
@@ -388,10 +407,9 @@ const createCustomPersister = (
388
407
  return persister;
389
408
  };
390
409
  const getStore = () => store;
391
- const destroy = async () => {
410
+ const destroy = () => {
392
411
  arrayClear(mapGet(scheduleActions, scheduleId));
393
- await persister.stopAutoLoad();
394
- return await persister.stopAutoSave();
412
+ return stopAutoPersisting();
395
413
  };
396
414
  const getStats = () => ({loads, saves});
397
415
  const persister = {
@@ -403,6 +421,8 @@ const createCustomPersister = (
403
421
  startAutoSave,
404
422
  stopAutoSave,
405
423
  isAutoSaving,
424
+ startAutoPersisting,
425
+ stopAutoPersisting,
406
426
  getStatus,
407
427
  addStatusListener,
408
428
  delListener,