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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tinybase",
3
- "version": "6.1.0-beta.5",
3
+ "version": "6.2.0-beta.0",
4
4
  "author": "jamesgpearce",
5
5
  "repository": "github:tinyplex/tinybase",
6
6
  "license": "MIT",
@@ -22,15 +22,15 @@
22
22
  "sideEffects": false,
23
23
  "peerDependencies": {
24
24
  "@automerge/automerge-repo": "^1.2.1",
25
- "@cloudflare/workers-types": "^4.20250513.0",
25
+ "@cloudflare/workers-types": "^4.20250515.0",
26
26
  "@electric-sql/pglite": "^0.2.17",
27
- "@libsql/client": "^0.15.5",
27
+ "@libsql/client": "^0.15.6",
28
28
  "@powersync/common": "^1.30.0",
29
- "@sqlite.org/sqlite-wasm": "^3.49.1-build4",
29
+ "@sqlite.org/sqlite-wasm": "^3.49.2-build1",
30
30
  "@vlcn.io/crsqlite-wasm": "^0.16.0",
31
31
  "bun": "^1.2.13",
32
32
  "electric-sql": "^0.12.1",
33
- "expo": "^53.0.7",
33
+ "expo": "^53.0.9",
34
34
  "expo-sqlite": "^15.2.10",
35
35
  "partykit": "^0.0.114",
36
36
  "partysocket": "^1.1.4",
@@ -39,7 +39,7 @@
39
39
  "react-dom": "^19.0.0",
40
40
  "sqlite3": "^5.1.7",
41
41
  "ws": "^8.18.2",
42
- "yjs": "^13.6.26"
42
+ "yjs": "^13.6.27"
43
43
  },
44
44
  "peerDependenciesMeta": {
45
45
  "@automerge/automerge-repo": {
@@ -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
 
@@ -405,6 +408,25 @@ const createCustomPersister = (
405
408
  return persister;
406
409
  };
407
410
  const isAutoSaving = () => !isUndefined(autoSaveListenerId);
411
+ const startAutoPersisting = async (
412
+ initialContent,
413
+ startSaveFirst = false,
414
+ ) => {
415
+ const [call1, call2] = startSaveFirst
416
+ ? [startAutoSave, startAutoLoad]
417
+ : [startAutoLoad, startAutoSave];
418
+ await call1(initialContent);
419
+ await call2(initialContent);
420
+ return persister;
421
+ };
422
+ const stopAutoPersisting = async (stopSaveFirst = false) => {
423
+ const [call1, call2] = stopSaveFirst
424
+ ? [stopAutoSave, stopAutoLoad]
425
+ : [stopAutoLoad, stopAutoSave];
426
+ await call1();
427
+ await call2();
428
+ return persister;
429
+ };
408
430
  const getStatus = () => status;
409
431
  const addStatusListener = (listener) =>
410
432
  addListener(listener, statusListeners);
@@ -418,10 +440,9 @@ const createCustomPersister = (
418
440
  return persister;
419
441
  };
420
442
  const getStore = () => store;
421
- const destroy = async () => {
443
+ const destroy = () => {
422
444
  arrayClear(mapGet(scheduleActions, scheduleId));
423
- await persister.stopAutoLoad();
424
- return await persister.stopAutoSave();
445
+ return stopAutoPersisting();
425
446
  };
426
447
  const getStats = () => ({loads, saves});
427
448
  const persister = {
@@ -433,6 +454,8 @@ const createCustomPersister = (
433
454
  startAutoSave,
434
455
  stopAutoSave,
435
456
  isAutoSaving,
457
+ startAutoPersisting,
458
+ stopAutoPersisting,
436
459
  getStatus,
437
460
  addStatusListener,
438
461
  delListener,
@@ -491,7 +514,11 @@ const getWrappedCommand = (executeCommand, onSqlCommand) =>
491
514
  return await executeCommand(sql, params);
492
515
  }
493
516
  : executeCommand;
494
- const escapeId = (str) => `"${strReplace(str, /"/g, '""')}"`;
517
+ const escapeId = (str) =>
518
+ arrayJoin(
519
+ arrayMap(strSplit(str, DOT), (part) => `"${strReplace(part, /"/g, '""')}"`),
520
+ DOT,
521
+ );
495
522
  const escapeIds = (...ids) => escapeId(arrayJoin(ids, '_'));
496
523
  const escapeColumnNames = (...columnNames) =>
497
524
  arrayJoin(arrayMap(columnNames, escapeId), COMMA);
@@ -927,8 +954,7 @@ const createJsonPersister = (
927
954
  );
928
955
  });
929
956
  const destroy = async () => {
930
- await persister.stopAutoLoad();
931
- await persister.stopAutoSave();
957
+ await persister.stopAutoPersisting();
932
958
  extraDestroy();
933
959
  return persister;
934
960
  };
@@ -1062,8 +1088,7 @@ const createTabularPersister = (
1062
1088
  }
1063
1089
  });
1064
1090
  const destroy = async () => {
1065
- await persister.stopAutoLoad();
1066
- await persister.stopAutoSave();
1091
+ await persister.stopAutoPersisting();
1067
1092
  extraDestroy();
1068
1093
  return persister;
1069
1094
  };
@@ -373,6 +373,25 @@ const createCustomPersister = (
373
373
  return persister;
374
374
  };
375
375
  const isAutoSaving = () => !isUndefined(autoSaveListenerId);
376
+ const startAutoPersisting = async (
377
+ initialContent,
378
+ startSaveFirst = false,
379
+ ) => {
380
+ const [call1, call2] = startSaveFirst
381
+ ? [startAutoSave, startAutoLoad]
382
+ : [startAutoLoad, startAutoSave];
383
+ await call1(initialContent);
384
+ await call2(initialContent);
385
+ return persister;
386
+ };
387
+ const stopAutoPersisting = async (stopSaveFirst = false) => {
388
+ const [call1, call2] = stopSaveFirst
389
+ ? [stopAutoSave, stopAutoLoad]
390
+ : [stopAutoLoad, stopAutoSave];
391
+ await call1();
392
+ await call2();
393
+ return persister;
394
+ };
376
395
  const getStatus = () => status;
377
396
  const addStatusListener = (listener) =>
378
397
  addListener(listener, statusListeners);
@@ -386,10 +405,9 @@ const createCustomPersister = (
386
405
  return persister;
387
406
  };
388
407
  const getStore = () => store;
389
- const destroy = async () => {
408
+ const destroy = () => {
390
409
  arrayClear(mapGet(scheduleActions, scheduleId));
391
- await persister.stopAutoLoad();
392
- return await persister.stopAutoSave();
410
+ return stopAutoPersisting();
393
411
  };
394
412
  const getStats = () => ({loads, saves});
395
413
  const persister = {
@@ -401,6 +419,8 @@ const createCustomPersister = (
401
419
  startAutoSave,
402
420
  stopAutoSave,
403
421
  isAutoSaving,
422
+ startAutoPersisting,
423
+ stopAutoPersisting,
404
424
  getStatus,
405
425
  addStatusListener,
406
426
  delListener,
@@ -373,6 +373,25 @@ const createCustomPersister = (
373
373
  return persister;
374
374
  };
375
375
  const isAutoSaving = () => !isUndefined(autoSaveListenerId);
376
+ const startAutoPersisting = async (
377
+ initialContent,
378
+ startSaveFirst = false,
379
+ ) => {
380
+ const [call1, call2] = startSaveFirst
381
+ ? [startAutoSave, startAutoLoad]
382
+ : [startAutoLoad, startAutoSave];
383
+ await call1(initialContent);
384
+ await call2(initialContent);
385
+ return persister;
386
+ };
387
+ const stopAutoPersisting = async (stopSaveFirst = false) => {
388
+ const [call1, call2] = stopSaveFirst
389
+ ? [stopAutoSave, stopAutoLoad]
390
+ : [stopAutoLoad, stopAutoSave];
391
+ await call1();
392
+ await call2();
393
+ return persister;
394
+ };
376
395
  const getStatus = () => status;
377
396
  const addStatusListener = (listener) =>
378
397
  addListener(listener, statusListeners);
@@ -386,10 +405,9 @@ const createCustomPersister = (
386
405
  return persister;
387
406
  };
388
407
  const getStore = () => store;
389
- const destroy = async () => {
408
+ const destroy = () => {
390
409
  arrayClear(mapGet(scheduleActions, scheduleId));
391
- await persister.stopAutoLoad();
392
- return await persister.stopAutoSave();
410
+ return stopAutoPersisting();
393
411
  };
394
412
  const getStats = () => ({loads, saves});
395
413
  const persister = {
@@ -401,6 +419,8 @@ const createCustomPersister = (
401
419
  startAutoSave,
402
420
  stopAutoSave,
403
421
  isAutoSaving,
422
+ startAutoPersisting,
423
+ stopAutoPersisting,
404
424
  getStatus,
405
425
  addStatusListener,
406
426
  delListener,
@@ -363,6 +363,25 @@ const createCustomPersister = (
363
363
  return persister;
364
364
  };
365
365
  const isAutoSaving = () => !isUndefined(autoSaveListenerId);
366
+ const startAutoPersisting = async (
367
+ initialContent,
368
+ startSaveFirst = false,
369
+ ) => {
370
+ const [call1, call2] = startSaveFirst
371
+ ? [startAutoSave, startAutoLoad]
372
+ : [startAutoLoad, startAutoSave];
373
+ await call1(initialContent);
374
+ await call2(initialContent);
375
+ return persister;
376
+ };
377
+ const stopAutoPersisting = async (stopSaveFirst = false) => {
378
+ const [call1, call2] = stopSaveFirst
379
+ ? [stopAutoSave, stopAutoLoad]
380
+ : [stopAutoLoad, stopAutoSave];
381
+ await call1();
382
+ await call2();
383
+ return persister;
384
+ };
366
385
  const getStatus = () => status;
367
386
  const addStatusListener = (listener) =>
368
387
  addListener(listener, statusListeners);
@@ -376,10 +395,9 @@ const createCustomPersister = (
376
395
  return persister;
377
396
  };
378
397
  const getStore = () => store;
379
- const destroy = async () => {
398
+ const destroy = () => {
380
399
  arrayClear(mapGet(scheduleActions, scheduleId));
381
- await persister.stopAutoLoad();
382
- return await persister.stopAutoSave();
400
+ return stopAutoPersisting();
383
401
  };
384
402
  const getStats = () => ({loads, saves});
385
403
  const persister = {
@@ -391,6 +409,8 @@ const createCustomPersister = (
391
409
  startAutoSave,
392
410
  stopAutoSave,
393
411
  isAutoSaving,
412
+ startAutoPersisting,
413
+ stopAutoPersisting,
394
414
  getStatus,
395
415
  addStatusListener,
396
416
  delListener,
@@ -363,6 +363,25 @@ const createCustomPersister = (
363
363
  return persister;
364
364
  };
365
365
  const isAutoSaving = () => !isUndefined(autoSaveListenerId);
366
+ const startAutoPersisting = async (
367
+ initialContent,
368
+ startSaveFirst = false,
369
+ ) => {
370
+ const [call1, call2] = startSaveFirst
371
+ ? [startAutoSave, startAutoLoad]
372
+ : [startAutoLoad, startAutoSave];
373
+ await call1(initialContent);
374
+ await call2(initialContent);
375
+ return persister;
376
+ };
377
+ const stopAutoPersisting = async (stopSaveFirst = false) => {
378
+ const [call1, call2] = stopSaveFirst
379
+ ? [stopAutoSave, stopAutoLoad]
380
+ : [stopAutoLoad, stopAutoSave];
381
+ await call1();
382
+ await call2();
383
+ return persister;
384
+ };
366
385
  const getStatus = () => status;
367
386
  const addStatusListener = (listener) =>
368
387
  addListener(listener, statusListeners);
@@ -376,10 +395,9 @@ const createCustomPersister = (
376
395
  return persister;
377
396
  };
378
397
  const getStore = () => store;
379
- const destroy = async () => {
398
+ const destroy = () => {
380
399
  arrayClear(mapGet(scheduleActions, scheduleId));
381
- await persister.stopAutoLoad();
382
- return await persister.stopAutoSave();
400
+ return stopAutoPersisting();
383
401
  };
384
402
  const getStats = () => ({loads, saves});
385
403
  const persister = {
@@ -391,6 +409,8 @@ const createCustomPersister = (
391
409
  startAutoSave,
392
410
  stopAutoSave,
393
411
  isAutoSaving,
412
+ startAutoPersisting,
413
+ stopAutoPersisting,
394
414
  getStatus,
395
415
  addStatusListener,
396
416
  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
  };
@@ -393,6 +393,25 @@ const createCustomPersister = (
393
393
  return persister;
394
394
  };
395
395
  const isAutoSaving = () => !isUndefined(autoSaveListenerId);
396
+ const startAutoPersisting = async (
397
+ initialContent,
398
+ startSaveFirst = false,
399
+ ) => {
400
+ const [call1, call2] = startSaveFirst
401
+ ? [startAutoSave, startAutoLoad]
402
+ : [startAutoLoad, startAutoSave];
403
+ await call1(initialContent);
404
+ await call2(initialContent);
405
+ return persister;
406
+ };
407
+ const stopAutoPersisting = async (stopSaveFirst = false) => {
408
+ const [call1, call2] = stopSaveFirst
409
+ ? [stopAutoSave, stopAutoLoad]
410
+ : [stopAutoLoad, stopAutoSave];
411
+ await call1();
412
+ await call2();
413
+ return persister;
414
+ };
396
415
  const getStatus = () => status;
397
416
  const addStatusListener = (listener) =>
398
417
  addListener(listener, statusListeners);
@@ -406,10 +425,9 @@ const createCustomPersister = (
406
425
  return persister;
407
426
  };
408
427
  const getStore = () => store;
409
- const destroy = async () => {
428
+ const destroy = () => {
410
429
  arrayClear(mapGet(scheduleActions, scheduleId));
411
- await persister.stopAutoLoad();
412
- return await persister.stopAutoSave();
430
+ return stopAutoPersisting();
413
431
  };
414
432
  const getStats = () => ({loads, saves});
415
433
  const persister = {
@@ -421,6 +439,8 @@ const createCustomPersister = (
421
439
  startAutoSave,
422
440
  stopAutoSave,
423
441
  isAutoSaving,
442
+ startAutoPersisting,
443
+ stopAutoPersisting,
424
444
  getStatus,
425
445
  addStatusListener,
426
446
  delListener,
@@ -393,6 +393,25 @@ const createCustomPersister = (
393
393
  return persister;
394
394
  };
395
395
  const isAutoSaving = () => !isUndefined(autoSaveListenerId);
396
+ const startAutoPersisting = async (
397
+ initialContent,
398
+ startSaveFirst = false,
399
+ ) => {
400
+ const [call1, call2] = startSaveFirst
401
+ ? [startAutoSave, startAutoLoad]
402
+ : [startAutoLoad, startAutoSave];
403
+ await call1(initialContent);
404
+ await call2(initialContent);
405
+ return persister;
406
+ };
407
+ const stopAutoPersisting = async (stopSaveFirst = false) => {
408
+ const [call1, call2] = stopSaveFirst
409
+ ? [stopAutoSave, stopAutoLoad]
410
+ : [stopAutoLoad, stopAutoSave];
411
+ await call1();
412
+ await call2();
413
+ return persister;
414
+ };
396
415
  const getStatus = () => status;
397
416
  const addStatusListener = (listener) =>
398
417
  addListener(listener, statusListeners);
@@ -406,10 +425,9 @@ const createCustomPersister = (
406
425
  return persister;
407
426
  };
408
427
  const getStore = () => store;
409
- const destroy = async () => {
428
+ const destroy = () => {
410
429
  arrayClear(mapGet(scheduleActions, scheduleId));
411
- await persister.stopAutoLoad();
412
- return await persister.stopAutoSave();
430
+ return stopAutoPersisting();
413
431
  };
414
432
  const getStats = () => ({loads, saves});
415
433
  const persister = {
@@ -421,6 +439,8 @@ const createCustomPersister = (
421
439
  startAutoSave,
422
440
  stopAutoSave,
423
441
  isAutoSaving,
442
+ startAutoPersisting,
443
+ stopAutoPersisting,
424
444
  getStatus,
425
445
  addStatusListener,
426
446
  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
  };