tinybase 8.6.0-beta.0 → 9.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (253) hide show
  1. package/@types/_internal/queries/with-schemas/index.d.ts +1 -2
  2. package/@types/_internal/ui/with-schemas/index.d.ts +8 -16
  3. package/@types/mergeable-store/index.d.ts +4 -4
  4. package/@types/mergeable-store/with-schemas/index.d.ts +41 -17
  5. package/@types/persisters/index.d.ts +34 -13
  6. package/@types/persisters/persister-durable-object-sql-storage/index.d.ts +9 -8
  7. package/@types/persisters/persister-durable-object-sql-storage/with-schemas/index.d.ts +10 -10
  8. package/@types/persisters/with-schemas/index.d.ts +72 -30
  9. package/@types/queries/index.d.ts +5 -7
  10. package/@types/queries/with-schemas/index.d.ts +9 -15
  11. package/@types/store/index.d.ts +1 -2
  12. package/@types/store/with-schemas/index.d.ts +19 -29
  13. package/@types/synchronizers/synchronizer-ws-client/index.d.ts +9 -3
  14. package/@types/synchronizers/synchronizer-ws-client/with-schemas/index.d.ts +10 -3
  15. package/@types/synchronizers/synchronizer-ws-server/index.d.ts +15 -2
  16. package/@types/synchronizers/synchronizer-ws-server/with-schemas/index.d.ts +17 -2
  17. package/@types/synchronizers/synchronizer-ws-server-durable-object/index.d.ts +51 -0
  18. package/@types/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.d.ts +51 -0
  19. package/@types/ui-react/with-schemas/index.d.ts +3 -6
  20. package/@types/ui-react-dom/with-schemas/index.d.ts +6 -12
  21. package/@types/ui-react-dom-charts/with-schemas/index.d.ts +3 -4
  22. package/@types/ui-solid/with-schemas/index.d.ts +4 -8
  23. package/@types/ui-solid-dom/with-schemas/index.d.ts +6 -12
  24. package/@types/ui-svelte-dom/with-schemas/index.d.ts +6 -12
  25. package/index.js +67 -25
  26. package/indexes/index.js +6 -8
  27. package/indexes/with-schemas/index.js +6 -8
  28. package/mergeable-store/index.js +46 -6
  29. package/mergeable-store/with-schemas/index.js +46 -6
  30. package/metrics/index.js +6 -8
  31. package/metrics/with-schemas/index.js +6 -8
  32. package/min/index.js +1 -1
  33. package/min/index.js.gz +0 -0
  34. package/min/mergeable-store/index.js +1 -1
  35. package/min/mergeable-store/index.js.gz +0 -0
  36. package/min/mergeable-store/with-schemas/index.js +1 -1
  37. package/min/mergeable-store/with-schemas/index.js.gz +0 -0
  38. package/min/omni/index.js +1 -1
  39. package/min/omni/index.js.gz +0 -0
  40. package/min/omni/with-schemas/index.js +1 -1
  41. package/min/omni/with-schemas/index.js.gz +0 -0
  42. package/min/persisters/index.js +1 -1
  43. package/min/persisters/index.js.gz +0 -0
  44. package/min/persisters/persister-automerge/index.js +1 -1
  45. package/min/persisters/persister-automerge/index.js.gz +0 -0
  46. package/min/persisters/persister-automerge/with-schemas/index.js +1 -1
  47. package/min/persisters/persister-automerge/with-schemas/index.js.gz +0 -0
  48. package/min/persisters/persister-browser/index.js +1 -1
  49. package/min/persisters/persister-browser/index.js.gz +0 -0
  50. package/min/persisters/persister-browser/with-schemas/index.js +1 -1
  51. package/min/persisters/persister-browser/with-schemas/index.js.gz +0 -0
  52. package/min/persisters/persister-cr-sqlite-wasm/index.js +1 -1
  53. package/min/persisters/persister-cr-sqlite-wasm/index.js.gz +0 -0
  54. package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +1 -1
  55. package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js.gz +0 -0
  56. package/min/persisters/persister-durable-object-sql-storage/index.js +1 -1
  57. package/min/persisters/persister-durable-object-sql-storage/index.js.gz +0 -0
  58. package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js +1 -1
  59. package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js.gz +0 -0
  60. package/min/persisters/persister-durable-object-storage/index.js +1 -1
  61. package/min/persisters/persister-durable-object-storage/index.js.gz +0 -0
  62. package/min/persisters/persister-durable-object-storage/with-schemas/index.js +1 -1
  63. package/min/persisters/persister-durable-object-storage/with-schemas/index.js.gz +0 -0
  64. package/min/persisters/persister-electric-sql/index.js +1 -1
  65. package/min/persisters/persister-electric-sql/index.js.gz +0 -0
  66. package/min/persisters/persister-electric-sql/with-schemas/index.js +1 -1
  67. package/min/persisters/persister-electric-sql/with-schemas/index.js.gz +0 -0
  68. package/min/persisters/persister-expo-sqlite/index.js +1 -1
  69. package/min/persisters/persister-expo-sqlite/index.js.gz +0 -0
  70. package/min/persisters/persister-expo-sqlite/with-schemas/index.js +1 -1
  71. package/min/persisters/persister-expo-sqlite/with-schemas/index.js.gz +0 -0
  72. package/min/persisters/persister-file/index.js +1 -1
  73. package/min/persisters/persister-file/index.js.gz +0 -0
  74. package/min/persisters/persister-file/with-schemas/index.js +1 -1
  75. package/min/persisters/persister-file/with-schemas/index.js.gz +0 -0
  76. package/min/persisters/persister-indexed-db/index.js +1 -1
  77. package/min/persisters/persister-indexed-db/index.js.gz +0 -0
  78. package/min/persisters/persister-indexed-db/with-schemas/index.js +1 -1
  79. package/min/persisters/persister-indexed-db/with-schemas/index.js.gz +0 -0
  80. package/min/persisters/persister-libsql/index.js +1 -1
  81. package/min/persisters/persister-libsql/index.js.gz +0 -0
  82. package/min/persisters/persister-libsql/with-schemas/index.js +1 -1
  83. package/min/persisters/persister-libsql/with-schemas/index.js.gz +0 -0
  84. package/min/persisters/persister-partykit-client/index.js +1 -1
  85. package/min/persisters/persister-partykit-client/index.js.gz +0 -0
  86. package/min/persisters/persister-partykit-client/with-schemas/index.js +1 -1
  87. package/min/persisters/persister-partykit-client/with-schemas/index.js.gz +0 -0
  88. package/min/persisters/persister-pglite/index.js +1 -1
  89. package/min/persisters/persister-pglite/index.js.gz +0 -0
  90. package/min/persisters/persister-pglite/with-schemas/index.js +1 -1
  91. package/min/persisters/persister-pglite/with-schemas/index.js.gz +0 -0
  92. package/min/persisters/persister-postgres/index.js +1 -1
  93. package/min/persisters/persister-postgres/index.js.gz +0 -0
  94. package/min/persisters/persister-postgres/with-schemas/index.js +1 -1
  95. package/min/persisters/persister-postgres/with-schemas/index.js.gz +0 -0
  96. package/min/persisters/persister-powersync/index.js +1 -1
  97. package/min/persisters/persister-powersync/index.js.gz +0 -0
  98. package/min/persisters/persister-powersync/with-schemas/index.js +1 -1
  99. package/min/persisters/persister-powersync/with-schemas/index.js.gz +0 -0
  100. package/min/persisters/persister-react-native-mmkv/index.js +1 -1
  101. package/min/persisters/persister-react-native-mmkv/index.js.gz +0 -0
  102. package/min/persisters/persister-react-native-mmkv/with-schemas/index.js +1 -1
  103. package/min/persisters/persister-react-native-mmkv/with-schemas/index.js.gz +0 -0
  104. package/min/persisters/persister-react-native-sqlite/index.js +1 -1
  105. package/min/persisters/persister-react-native-sqlite/index.js.gz +0 -0
  106. package/min/persisters/persister-react-native-sqlite/with-schemas/index.js +1 -1
  107. package/min/persisters/persister-react-native-sqlite/with-schemas/index.js.gz +0 -0
  108. package/min/persisters/persister-remote/index.js +1 -1
  109. package/min/persisters/persister-remote/index.js.gz +0 -0
  110. package/min/persisters/persister-remote/with-schemas/index.js +1 -1
  111. package/min/persisters/persister-remote/with-schemas/index.js.gz +0 -0
  112. package/min/persisters/persister-sqlite-bun/index.js +1 -1
  113. package/min/persisters/persister-sqlite-bun/index.js.gz +0 -0
  114. package/min/persisters/persister-sqlite-bun/with-schemas/index.js +1 -1
  115. package/min/persisters/persister-sqlite-bun/with-schemas/index.js.gz +0 -0
  116. package/min/persisters/persister-sqlite-wasm/index.js +1 -1
  117. package/min/persisters/persister-sqlite-wasm/index.js.gz +0 -0
  118. package/min/persisters/persister-sqlite-wasm/with-schemas/index.js +1 -1
  119. package/min/persisters/persister-sqlite-wasm/with-schemas/index.js.gz +0 -0
  120. package/min/persisters/persister-sqlite3/index.js +1 -1
  121. package/min/persisters/persister-sqlite3/index.js.gz +0 -0
  122. package/min/persisters/persister-sqlite3/with-schemas/index.js +1 -1
  123. package/min/persisters/persister-sqlite3/with-schemas/index.js.gz +0 -0
  124. package/min/persisters/persister-yjs/index.js +1 -1
  125. package/min/persisters/persister-yjs/index.js.gz +0 -0
  126. package/min/persisters/persister-yjs/with-schemas/index.js +1 -1
  127. package/min/persisters/persister-yjs/with-schemas/index.js.gz +0 -0
  128. package/min/persisters/with-schemas/index.js +1 -1
  129. package/min/persisters/with-schemas/index.js.gz +0 -0
  130. package/min/queries/index.js +1 -1
  131. package/min/queries/index.js.gz +0 -0
  132. package/min/queries/with-schemas/index.js +1 -1
  133. package/min/queries/with-schemas/index.js.gz +0 -0
  134. package/min/store/index.js +1 -1
  135. package/min/store/index.js.gz +0 -0
  136. package/min/store/with-schemas/index.js +1 -1
  137. package/min/store/with-schemas/index.js.gz +0 -0
  138. package/min/synchronizers/index.js +1 -1
  139. package/min/synchronizers/index.js.gz +0 -0
  140. package/min/synchronizers/synchronizer-broadcast-channel/index.js +1 -1
  141. package/min/synchronizers/synchronizer-broadcast-channel/index.js.gz +0 -0
  142. package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +1 -1
  143. package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js.gz +0 -0
  144. package/min/synchronizers/synchronizer-local/index.js +1 -1
  145. package/min/synchronizers/synchronizer-local/index.js.gz +0 -0
  146. package/min/synchronizers/synchronizer-local/with-schemas/index.js +1 -1
  147. package/min/synchronizers/synchronizer-local/with-schemas/index.js.gz +0 -0
  148. package/min/synchronizers/synchronizer-ws-client/index.js +1 -1
  149. package/min/synchronizers/synchronizer-ws-client/index.js.gz +0 -0
  150. package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js +1 -1
  151. package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js.gz +0 -0
  152. package/min/synchronizers/synchronizer-ws-server/index.js +1 -1
  153. package/min/synchronizers/synchronizer-ws-server/index.js.gz +0 -0
  154. package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js +1 -1
  155. package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js.gz +0 -0
  156. package/min/synchronizers/synchronizer-ws-server-durable-object/index.js +1 -1
  157. package/min/synchronizers/synchronizer-ws-server-durable-object/index.js.gz +0 -0
  158. package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +1 -1
  159. package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js.gz +0 -0
  160. package/min/synchronizers/with-schemas/index.js +1 -1
  161. package/min/synchronizers/with-schemas/index.js.gz +0 -0
  162. package/min/ui-react-inspector/index.js +1 -1
  163. package/min/ui-react-inspector/index.js.gz +0 -0
  164. package/min/ui-react-inspector/with-schemas/index.js +1 -1
  165. package/min/ui-react-inspector/with-schemas/index.js.gz +0 -0
  166. package/min/ui-solid-inspector/index.js +1 -1
  167. package/min/ui-solid-inspector/index.js.gz +0 -0
  168. package/min/ui-solid-inspector/with-schemas/index.js +1 -1
  169. package/min/ui-solid-inspector/with-schemas/index.js.gz +0 -0
  170. package/min/ui-svelte-inspector/index.js +1 -1
  171. package/min/ui-svelte-inspector/index.js.gz +0 -0
  172. package/min/ui-svelte-inspector/with-schemas/index.js +1 -1
  173. package/min/ui-svelte-inspector/with-schemas/index.js.gz +0 -0
  174. package/min/with-schemas/index.js +1 -1
  175. package/min/with-schemas/index.js.gz +0 -0
  176. package/omni/index.js +364 -155
  177. package/omni/with-schemas/index.js +364 -155
  178. package/package.json +8 -8
  179. package/persisters/index.js +133 -40
  180. package/persisters/persister-automerge/index.js +4 -3
  181. package/persisters/persister-automerge/with-schemas/index.js +4 -3
  182. package/persisters/persister-browser/index.js +4 -3
  183. package/persisters/persister-browser/with-schemas/index.js +4 -3
  184. package/persisters/persister-cr-sqlite-wasm/index.js +133 -40
  185. package/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +133 -40
  186. package/persisters/persister-durable-object-sql-storage/index.js +275 -113
  187. package/persisters/persister-durable-object-sql-storage/with-schemas/index.js +275 -113
  188. package/persisters/persister-durable-object-storage/index.js +4 -3
  189. package/persisters/persister-durable-object-storage/with-schemas/index.js +4 -3
  190. package/persisters/persister-electric-sql/index.js +133 -40
  191. package/persisters/persister-electric-sql/with-schemas/index.js +133 -40
  192. package/persisters/persister-expo-sqlite/index.js +133 -40
  193. package/persisters/persister-expo-sqlite/with-schemas/index.js +133 -40
  194. package/persisters/persister-file/index.js +4 -3
  195. package/persisters/persister-file/with-schemas/index.js +4 -3
  196. package/persisters/persister-indexed-db/index.js +4 -3
  197. package/persisters/persister-indexed-db/with-schemas/index.js +4 -3
  198. package/persisters/persister-libsql/index.js +133 -40
  199. package/persisters/persister-libsql/with-schemas/index.js +133 -40
  200. package/persisters/persister-partykit-client/index.js +4 -3
  201. package/persisters/persister-partykit-client/with-schemas/index.js +4 -3
  202. package/persisters/persister-pglite/index.js +134 -40
  203. package/persisters/persister-pglite/with-schemas/index.js +134 -40
  204. package/persisters/persister-postgres/index.js +134 -40
  205. package/persisters/persister-postgres/with-schemas/index.js +134 -40
  206. package/persisters/persister-powersync/index.js +186 -120
  207. package/persisters/persister-powersync/with-schemas/index.js +186 -120
  208. package/persisters/persister-react-native-mmkv/index.js +4 -3
  209. package/persisters/persister-react-native-mmkv/with-schemas/index.js +4 -3
  210. package/persisters/persister-react-native-sqlite/index.js +133 -40
  211. package/persisters/persister-react-native-sqlite/with-schemas/index.js +133 -40
  212. package/persisters/persister-remote/index.js +4 -3
  213. package/persisters/persister-remote/with-schemas/index.js +4 -3
  214. package/persisters/persister-sqlite-bun/index.js +133 -40
  215. package/persisters/persister-sqlite-bun/with-schemas/index.js +133 -40
  216. package/persisters/persister-sqlite-wasm/index.js +133 -40
  217. package/persisters/persister-sqlite-wasm/with-schemas/index.js +133 -40
  218. package/persisters/persister-sqlite3/index.js +133 -40
  219. package/persisters/persister-sqlite3/with-schemas/index.js +133 -40
  220. package/persisters/persister-yjs/index.js +4 -3
  221. package/persisters/persister-yjs/with-schemas/index.js +4 -3
  222. package/persisters/with-schemas/index.js +133 -40
  223. package/queries/index.js +21 -19
  224. package/queries/with-schemas/index.js +21 -19
  225. package/readme.md +14 -14
  226. package/relationships/index.js +6 -8
  227. package/relationships/with-schemas/index.js +6 -8
  228. package/releases.md +72 -57
  229. package/store/index.js +33 -2
  230. package/store/with-schemas/index.js +33 -2
  231. package/synchronizers/index.js +4 -3
  232. package/synchronizers/synchronizer-broadcast-channel/index.js +4 -3
  233. package/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +4 -3
  234. package/synchronizers/synchronizer-local/index.js +4 -3
  235. package/synchronizers/synchronizer-local/with-schemas/index.js +4 -3
  236. package/synchronizers/synchronizer-ws-client/index.js +120 -45
  237. package/synchronizers/synchronizer-ws-client/with-schemas/index.js +120 -45
  238. package/synchronizers/synchronizer-ws-server/index.js +116 -36
  239. package/synchronizers/synchronizer-ws-server/with-schemas/index.js +116 -36
  240. package/synchronizers/synchronizer-ws-server-durable-object/index.js +125 -41
  241. package/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +125 -41
  242. package/synchronizers/with-schemas/index.js +4 -3
  243. package/ui-react-inspector/index.js +36 -5
  244. package/ui-react-inspector/with-schemas/index.js +36 -5
  245. package/ui-solid-inspector/index.js +36 -5
  246. package/ui-solid-inspector/with-schemas/index.js +36 -5
  247. package/ui-svelte/index.js +1 -1
  248. package/ui-svelte/with-schemas/index.js +1 -1
  249. package/ui-svelte-dom/index.js +2 -2
  250. package/ui-svelte-dom/with-schemas/index.js +2 -2
  251. package/ui-svelte-inspector/index.js +38 -7
  252. package/ui-svelte-inspector/with-schemas/index.js +38 -7
  253. package/with-schemas/index.js +67 -25
@@ -51,6 +51,7 @@ const tryCatch = async (action, then1, then2) => {
51
51
  }
52
52
  };
53
53
 
54
+ const arrayHas = (array, value) => array.includes(value);
54
55
  const arrayForEach = (array, cb) => array.forEach(cb);
55
56
  const arrayJoin = (array, sep = EMPTY_STRING) => array.join(sep);
56
57
  const arrayMap = (array, cb) => array.map(cb);
@@ -60,6 +61,14 @@ const arrayClear = (array, to) => array.splice(0, to);
60
61
  const arrayPush = (array, ...values) => array.push(...values);
61
62
  const arrayShift = (array) => array.shift();
62
63
 
64
+ const collSize = (coll) => coll?.size ?? 0;
65
+ const collHas = (coll, keyOrValue) => coll?.has(keyOrValue) ?? false;
66
+ const collIsEmpty = (coll) => isUndefined(coll) || collSize(coll) == 0;
67
+ const collValues = (coll) => [...(coll?.values() ?? [])];
68
+ const collClear = (coll) => coll.clear();
69
+ const collForEach = (coll, cb) => coll?.forEach(cb);
70
+ const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
71
+
63
72
  const object = Object;
64
73
  const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
65
74
  const objEntries = object.entries;
@@ -115,13 +124,13 @@ const replaceUndefinedString = (obj) =>
115
124
  ? objMap(obj, replaceUndefinedString)
116
125
  : obj;
117
126
 
118
- const collSize = (coll) => coll?.size ?? 0;
119
- const collHas = (coll, keyOrValue) => coll?.has(keyOrValue) ?? false;
120
- const collIsEmpty = (coll) => isUndefined(coll) || collSize(coll) == 0;
121
- const collValues = (coll) => [...(coll?.values() ?? [])];
122
- const collClear = (coll) => coll.clear();
123
- const collForEach = (coll, cb) => coll?.forEach(cb);
124
- const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
127
+ const setNew = (entryOrEntries) =>
128
+ new Set(
129
+ isArray(entryOrEntries) || isUndefined(entryOrEntries)
130
+ ? entryOrEntries
131
+ : [entryOrEntries],
132
+ );
133
+ const setAdd = (set, value) => set?.add(value);
125
134
 
126
135
  const map = Map;
127
136
  const mapNew = (entries) => new map(entries);
@@ -184,14 +193,6 @@ const getPoolFunctions = () => {
184
193
  ];
185
194
  };
186
195
 
187
- const setNew = (entryOrEntries) =>
188
- new Set(
189
- isArray(entryOrEntries) || isUndefined(entryOrEntries)
190
- ? entryOrEntries
191
- : [entryOrEntries],
192
- );
193
- const setAdd = (set, value) => set?.add(value);
194
-
195
196
  const getWildcardedLeaves = (deepIdSet, path = [EMPTY_STRING]) => {
196
197
  const leaves = [];
197
198
  const deep = (node, p) =>
@@ -364,13 +365,14 @@ const createCustomPersister = (
364
365
  const content = await getPersisted();
365
366
  if (isArray(content)) {
366
367
  setContentOrChanges(content);
367
- } else if (initialContent) {
368
+ } else if (isUndefined(content) && initialContent) {
368
369
  setDefaultContent(initialContent);
369
- } else {
370
+ } else if (!isUndefined(content)) {
370
371
  errorNew(`Content is not an array: ${content}`);
371
372
  }
372
373
  },
373
- () => {
374
+ (error) => {
375
+ onIgnoredError?.(error);
374
376
  if (initialContent) {
375
377
  setDefaultContent(initialContent);
376
378
  }
@@ -573,6 +575,8 @@ const DEFAULT_TABULAR_VALUES_CONFIG = {
573
575
  save: 0,
574
576
  [TABLE_NAME]: TINYBASE + '_values',
575
577
  };
578
+ const getValuesIn = (config) => (isArray(config) ? config : void 0);
579
+ const hasValues = (config) => isTrue(config) || isArray(config);
576
580
  const getDefaultedConfig = (configOrStoreTableName) =>
577
581
  objMerge(
578
582
  DEFAULT_CONFIG,
@@ -623,11 +627,15 @@ const getConfigStructures = (configOrStoreTableName) => {
623
627
  ];
624
628
  }
625
629
  const {tables: {load = {}, save = {}} = {}, values = {}} = config;
626
- const valuesConfig = slice(
627
- objValues(objMerge(DEFAULT_TABULAR_VALUES_CONFIG, values)),
628
- 0,
629
- objSize(DEFAULT_TABULAR_VALUES_CONFIG),
630
- );
630
+ const valuesConfigObj = objMerge(DEFAULT_TABULAR_VALUES_CONFIG, values);
631
+ const {load: valuesLoad, save: valuesSave} = valuesConfigObj;
632
+ const valuesConfig = [
633
+ hasValues(valuesLoad),
634
+ hasValues(valuesSave),
635
+ valuesConfigObj[TABLE_NAME],
636
+ getValuesIn(valuesLoad),
637
+ getValuesIn(valuesSave),
638
+ ];
631
639
  const valuesTable = valuesConfig[2];
632
640
  const managedTableNames = setNew(valuesTable);
633
641
  const excludedTableNames = setNew(valuesTable);
@@ -689,8 +697,18 @@ const getCommandFunctions = (
689
697
  ({tn, cn}) => setAdd(mapEnsure(schemaMap, tn, setNew), cn),
690
698
  );
691
699
  };
692
- const loadTable = async (tableName, rowIdColumnName, condition) =>
693
- canSelect(tableName, rowIdColumnName)
700
+ const loadTable = async (
701
+ tableName,
702
+ rowIdColumnName,
703
+ condition,
704
+ contentSubIds,
705
+ ) => {
706
+ const contentSubIdSet = isUndefined(contentSubIds)
707
+ ? void 0
708
+ : setNew(contentSubIds);
709
+ const includeContentSubId = (contentSubId) =>
710
+ isUndefined(contentSubIdSet) || collHas(contentSubIdSet, contentSubId);
711
+ return canSelect(tableName, rowIdColumnName)
694
712
  ? objNew(
695
713
  arrayFilter(
696
714
  arrayMap(
@@ -699,17 +717,35 @@ const getCommandFunctions = (
699
717
  escapeId(tableName) +
700
718
  getWhereCondition(tableName, condition),
701
719
  ),
702
- (row) => [
703
- row[rowIdColumnName],
704
- decode
720
+ (row) => {
721
+ const rowId = row[rowIdColumnName];
722
+ const rowContent = decode
705
723
  ? objMap(objDel(row, rowIdColumnName), decode)
706
- : objDel(row, rowIdColumnName),
707
- ],
724
+ : objDel(row, rowIdColumnName);
725
+ return [
726
+ rowId,
727
+ isUndefined(contentSubIdSet)
728
+ ? rowContent
729
+ : objNew(
730
+ arrayFilter(
731
+ objToArray(
732
+ rowContent,
733
+ (cellOrValue, contentSubId) => [
734
+ contentSubId,
735
+ cellOrValue,
736
+ ],
737
+ ),
738
+ ([contentSubId]) => includeContentSubId(contentSubId),
739
+ ),
740
+ ),
741
+ ];
742
+ },
708
743
  ),
709
744
  (entry) => !isUndefined(entry[0]) && !objIsEmpty(entry[1]),
710
745
  ),
711
746
  )
712
747
  : {};
748
+ };
713
749
  const saveTable = async (
714
750
  tableName,
715
751
  rowIdColumnName,
@@ -718,15 +754,23 @@ const getCommandFunctions = (
718
754
  deleteEmptyTable,
719
755
  partial = false,
720
756
  condition = TRUE,
757
+ contentSubIds,
721
758
  ) => {
759
+ const contentSubIdSet = isUndefined(contentSubIds)
760
+ ? void 0
761
+ : setNew(contentSubIds);
762
+ const includeContentSubId = (contentSubId) =>
763
+ isUndefined(contentSubIdSet) || collHas(contentSubIdSet, contentSubId);
722
764
  const settingColumnNameSet = setNew();
723
765
  objMap(content ?? {}, (contentRow) =>
724
- arrayMap(objIds(contentRow ?? {}), (cellOrValueId) =>
725
- setAdd(settingColumnNameSet, cellOrValueId),
766
+ arrayMap(
767
+ arrayFilter(objIds(contentRow ?? {}), includeContentSubId),
768
+ (cellOrValueId) => setAdd(settingColumnNameSet, cellOrValueId),
726
769
  ),
727
770
  );
728
771
  const settingColumnNames = collValues(settingColumnNameSet);
729
772
  if (
773
+ isUndefined(contentSubIdSet) &&
730
774
  !partial &&
731
775
  deleteEmptyTable &&
732
776
  condition == TRUE &&
@@ -738,7 +782,13 @@ const getCommandFunctions = (
738
782
  return;
739
783
  }
740
784
  const currentColumnNames = mapGet(schemaMap, tableName);
741
- const unaccountedColumnNames = setNew(collValues(currentColumnNames));
785
+ const unaccountedColumnNames = setNew(
786
+ arrayFilter(
787
+ collValues(currentColumnNames),
788
+ (columnName) =>
789
+ columnName == rowIdColumnName || includeContentSubId(columnName),
790
+ ),
791
+ );
742
792
  if (!arrayIsEmpty(settingColumnNames)) {
743
793
  if (!collHas(schemaMap, tableName)) {
744
794
  await databaseExecuteCommand(
@@ -804,11 +854,13 @@ const getCommandFunctions = (
804
854
  ]);
805
855
  if (partial) {
806
856
  if (isUndefined(content)) {
807
- await databaseExecuteCommand(
808
- DELETE_FROM +
809
- escapeId(tableName) +
810
- getWhereCondition(tableName, condition),
811
- );
857
+ if (isUndefined(contentSubIdSet)) {
858
+ await databaseExecuteCommand(
859
+ DELETE_FROM +
860
+ escapeId(tableName) +
861
+ getWhereCondition(tableName, condition),
862
+ );
863
+ }
812
864
  } else {
813
865
  await promiseAll(
814
866
  objToArray(content, async (row, rowId) => {
@@ -821,18 +873,24 @@ const getCommandFunctions = (
821
873
  [rowId],
822
874
  );
823
875
  } else if (!arrayIsEmpty(settingColumnNames)) {
824
- await upsert(
825
- databaseExecuteCommand,
826
- tableName,
827
- rowIdColumnName,
876
+ const changingColumnNames = arrayFilter(
828
877
  objIds(row),
829
- {
830
- [rowId]: encode
831
- ? arrayMap(objValues(row), encode)
832
- : objValues(row),
833
- },
834
- currentColumnNames,
878
+ includeContentSubId,
835
879
  );
880
+ if (!arrayIsEmpty(changingColumnNames)) {
881
+ await upsert(
882
+ databaseExecuteCommand,
883
+ tableName,
884
+ rowIdColumnName,
885
+ changingColumnNames,
886
+ {
887
+ [rowId]: arrayMap(changingColumnNames, (cellId) =>
888
+ encode ? encode(row[cellId]) : row[cellId],
889
+ ),
890
+ },
891
+ currentColumnNames,
892
+ );
893
+ }
836
894
  }
837
895
  }),
838
896
  );
@@ -841,7 +899,9 @@ const getCommandFunctions = (
841
899
  if (!arrayIsEmpty(settingColumnNames)) {
842
900
  const changingColumnNames = arrayFilter(
843
901
  collValues(mapGet(schemaMap, tableName)),
844
- (changingColumnName) => changingColumnName != rowIdColumnName,
902
+ (changingColumnName) =>
903
+ changingColumnName != rowIdColumnName &&
904
+ includeContentSubId(changingColumnName),
845
905
  );
846
906
  const rows = {};
847
907
  const deleteRowIds = [];
@@ -857,6 +917,7 @@ const getCommandFunctions = (
857
917
  rowIdColumnName,
858
918
  changingColumnNames,
859
919
  rows,
920
+ currentColumnNames,
860
921
  );
861
922
  await databaseExecuteCommand(
862
923
  DELETE_FROM +
@@ -865,7 +926,10 @@ const getCommandFunctions = (
865
926
  `AND${escapeId(rowIdColumnName)}NOT IN(${getPlaceholders(deleteRowIds)})`,
866
927
  deleteRowIds,
867
928
  );
868
- } else if (collHas(schemaMap, tableName)) {
929
+ } else if (
930
+ isUndefined(contentSubIdSet) &&
931
+ collHas(schemaMap, tableName)
932
+ ) {
869
933
  await databaseExecuteCommand(
870
934
  DELETE_FROM +
871
935
  escapeId(tableName) +
@@ -1004,7 +1068,13 @@ const createTabularPersister = (
1004
1068
  [
1005
1069
  tablesLoadConfig,
1006
1070
  tablesSaveConfig,
1007
- [valuesLoad, valuesSave, valuesTableName],
1071
+ [
1072
+ valuesLoad,
1073
+ valuesSave,
1074
+ valuesTableName,
1075
+ valuesLoadValueIds,
1076
+ valuesSaveValueIds,
1077
+ ],
1008
1078
  ],
1009
1079
  managedTableNames,
1010
1080
  querySchema,
@@ -1054,15 +1124,33 @@ const createTabularPersister = (
1054
1124
  },
1055
1125
  ),
1056
1126
  );
1127
+ const getValuesSubset = (values, valueIds, partial) =>
1128
+ objNew(
1129
+ partial == true
1130
+ ? arrayFilter(
1131
+ objToArray(values, (value, valueId) => [valueId, value]),
1132
+ ([valueId]) => arrayHas(valueIds, valueId),
1133
+ )
1134
+ : arrayFilter(
1135
+ arrayMap(valueIds, (valueId) => [valueId, values[valueId]]),
1136
+ ([, value]) => !isUndefined(value),
1137
+ ),
1138
+ );
1057
1139
  const saveValues = async (values, partial) =>
1058
1140
  valuesSave
1059
1141
  ? await saveTable(
1060
1142
  valuesTableName,
1061
1143
  DEFAULT_ROW_ID_COLUMN_NAME,
1062
- {[SINGLE_ROW_ID]: values},
1144
+ {
1145
+ [SINGLE_ROW_ID]: isUndefined(valuesSaveValueIds)
1146
+ ? values
1147
+ : getValuesSubset(values, valuesSaveValueIds, partial),
1148
+ },
1063
1149
  true,
1064
1150
  true,
1065
1151
  partial,
1152
+ void 0,
1153
+ valuesSaveValueIds,
1066
1154
  )
1067
1155
  : null;
1068
1156
  const loadTables = async () =>
@@ -1082,9 +1170,14 @@ const createTabularPersister = (
1082
1170
  );
1083
1171
  const loadValues = async () =>
1084
1172
  valuesLoad
1085
- ? (await loadTable(valuesTableName, DEFAULT_ROW_ID_COLUMN_NAME))[
1086
- SINGLE_ROW_ID
1087
- ]
1173
+ ? (
1174
+ await loadTable(
1175
+ valuesTableName,
1176
+ DEFAULT_ROW_ID_COLUMN_NAME,
1177
+ void 0,
1178
+ valuesLoadValueIds,
1179
+ )
1180
+ )[SINGLE_ROW_ID]
1088
1181
  : {};
1089
1182
  const getPersisted = () =>
1090
1183
  transaction(async () => {
@@ -1217,6 +1310,8 @@ const createCustomSqlitePersister = (
1217
1310
  );
1218
1311
  };
1219
1312
 
1313
+ const getSqlRows = (sqlStorage, sql, ...params) =>
1314
+ sqlStorage.exec(sql, ...params).toArray();
1220
1315
  const createDurableObjectSqlStoragePersister = (
1221
1316
  store,
1222
1317
  sqlStorage,
@@ -1241,7 +1336,7 @@ const createDurableObjectSqlStoragePersister = (
1241
1336
  async (sql, params = []) => {
1242
1337
  if (!['BEGIN', 'END'].includes(sql)) {
1243
1338
  sql = sql.replace(/\$\d+/g, '?');
1244
- return sqlStorage.exec(sql, ...params).toArray();
1339
+ return getSqlRows(sqlStorage, sql, ...params);
1245
1340
  }
1246
1341
  return [];
1247
1342
  },
@@ -1266,6 +1361,10 @@ const createDurableObjectFragmentedSqlStoragePersister = (
1266
1361
  const tablePrefix = storagePrefix.replace(/[^a-zA-Z0-9_]/g, '_');
1267
1362
  const tablesTable = `${tablePrefix}tinybase_tables`;
1268
1363
  const valuesTable = `${tablePrefix}tinybase_values`;
1364
+ const insertTableSql = `INSERT INTO ${tablesTable} (type, table_id, row_id, cell_id, value_data, timestamp, hash) VALUES (?, ?, ?, ?, ?, ?, ?)`;
1365
+ const insertValueSql = `INSERT INTO ${valuesTable} (value_id, value_data, timestamp, hash) VALUES (?, ?, ?, ?)`;
1366
+ const getRowKey = (tableId, rowId) =>
1367
+ jsonStringWithUndefined([tableId, rowId]);
1269
1368
  const initializeTables = () => {
1270
1369
  sqlStorage.exec(`
1271
1370
  CREATE TABLE IF NOT EXISTS ${tablesTable} (
@@ -1288,11 +1387,74 @@ const createDurableObjectFragmentedSqlStoragePersister = (
1288
1387
  `);
1289
1388
  };
1290
1389
  initializeTables();
1390
+ const getCondition = (params, column, value) =>
1391
+ isNull(value)
1392
+ ? `${column} IS NULL`
1393
+ : (arrayPush(params, value), `${column} = ?`);
1394
+ const delTablesRow = (tableId, rowId, cellId) => {
1395
+ const params = [T];
1396
+ sqlStorage.exec(
1397
+ `DELETE FROM ${tablesTable} WHERE type = ? AND ` +
1398
+ getCondition(params, 'table_id', tableId) +
1399
+ ` AND ` +
1400
+ getCondition(params, 'row_id', rowId) +
1401
+ ` AND ` +
1402
+ getCondition(params, 'cell_id', cellId),
1403
+ ...params,
1404
+ );
1405
+ };
1406
+ const setTablesRow = (tableId, rowId, cellId, valueData, timestamp, hash) => {
1407
+ delTablesRow(tableId, rowId, cellId);
1408
+ sqlStorage.exec(
1409
+ insertTableSql,
1410
+ T,
1411
+ tableId,
1412
+ rowId,
1413
+ cellId,
1414
+ valueData,
1415
+ timestamp,
1416
+ hash,
1417
+ );
1418
+ };
1419
+ const delCellRows = (tableId, rowId) =>
1420
+ sqlStorage.exec(
1421
+ `DELETE FROM ${tablesTable} WHERE type = ? AND table_id = ? AND row_id = ? AND cell_id IS NOT NULL`,
1422
+ T,
1423
+ tableId,
1424
+ rowId,
1425
+ );
1426
+ const delValuesRow = (valueId) => {
1427
+ const params = [];
1428
+ sqlStorage.exec(
1429
+ `DELETE FROM ${valuesTable} WHERE ` +
1430
+ getCondition(params, 'value_id', valueId),
1431
+ ...params,
1432
+ );
1433
+ };
1434
+ const setValuesRow = (valueId, valueData, timestamp, hash) => {
1435
+ delValuesRow(valueId);
1436
+ sqlStorage.exec(insertValueSql, valueId, valueData, timestamp, hash);
1437
+ };
1291
1438
  const getPersisted = async () => {
1292
1439
  const tables = stampNewObjectWithHash();
1293
1440
  const values = stampNewObjectWithHash();
1294
- const tablesResult = sqlStorage.exec(`SELECT * FROM ${tablesTable}`);
1295
- for (const row of tablesResult.toArray()) {
1441
+ const rowDataKeys = setNew();
1442
+ const tablesRows = getSqlRows(sqlStorage, `SELECT * FROM ${tablesTable}`);
1443
+ arrayForEach(tablesRows, (row) => {
1444
+ const table_id = row.table_id ? string(row.table_id) : null;
1445
+ const row_id = row.row_id ? string(row.row_id) : null;
1446
+ const cell_id = row.cell_id ? string(row.cell_id) : null;
1447
+ const value_data = string(row.value_data);
1448
+ const timestamp = string(row.timestamp);
1449
+ const hash = number(row.hash);
1450
+ const [zeroOrCells] = jsonParseWithUndefined(value_data);
1451
+ if (table_id && row_id && !cell_id && isObject(zeroOrCells)) {
1452
+ const table = objEnsure(tables[0], table_id, stampNewObjectWithHash);
1453
+ table[0][row_id] = [zeroOrCells, timestamp, hash];
1454
+ setAdd(rowDataKeys, getRowKey(table_id, row_id));
1455
+ }
1456
+ });
1457
+ arrayForEach(tablesRows, (row) => {
1296
1458
  const type = string(row.type);
1297
1459
  const table_id = row.table_id ? string(row.table_id) : null;
1298
1460
  const row_id = row.row_id ? string(row.row_id) : null;
@@ -1300,16 +1462,36 @@ const createDurableObjectFragmentedSqlStoragePersister = (
1300
1462
  const value_data = string(row.value_data);
1301
1463
  const timestamp = string(row.timestamp);
1302
1464
  const hash = number(row.hash);
1303
- const [zeroOrCellOrValue] = JSON.parse(value_data);
1465
+ const [zeroOrCellOrValue] = jsonParseWithUndefined(value_data);
1304
1466
  if (type === T) {
1305
1467
  if (table_id && row_id && cell_id) {
1306
- const table = objEnsure(tables[0], table_id, stampNewObjectWithHash);
1307
- const tableRow = objEnsure(table[0], row_id, stampNewObjectWithHash);
1308
- tableRow[0][cell_id] = [zeroOrCellOrValue, timestamp, hash];
1468
+ if (!collHas(rowDataKeys, getRowKey(table_id, row_id))) {
1469
+ const table = objEnsure(
1470
+ tables[0],
1471
+ table_id,
1472
+ stampNewObjectWithHash,
1473
+ );
1474
+ const tableRow = objEnsure(
1475
+ table[0],
1476
+ row_id,
1477
+ stampNewObjectWithHash,
1478
+ );
1479
+ tableRow[0][cell_id] = [zeroOrCellOrValue, timestamp, hash];
1480
+ }
1309
1481
  } else if (table_id && row_id) {
1310
- const table = objEnsure(tables[0], table_id, stampNewObjectWithHash);
1311
- const tableRow = objEnsure(table[0], row_id, stampNewObjectWithHash);
1312
- stampUpdate(tableRow, timestamp, hash);
1482
+ if (!isObject(zeroOrCellOrValue)) {
1483
+ const table = objEnsure(
1484
+ tables[0],
1485
+ table_id,
1486
+ stampNewObjectWithHash,
1487
+ );
1488
+ const tableRow = objEnsure(
1489
+ table[0],
1490
+ row_id,
1491
+ stampNewObjectWithHash,
1492
+ );
1493
+ stampUpdate(tableRow, timestamp, hash);
1494
+ }
1313
1495
  } else if (table_id) {
1314
1496
  const table = objEnsure(tables[0], table_id, stampNewObjectWithHash);
1315
1497
  stampUpdate(table, timestamp, hash);
@@ -1317,20 +1499,22 @@ const createDurableObjectFragmentedSqlStoragePersister = (
1317
1499
  stampUpdate(tables, timestamp, hash);
1318
1500
  }
1319
1501
  }
1320
- }
1321
- const valuesResult = sqlStorage.exec(`SELECT * FROM ${valuesTable}`);
1322
- for (const row of valuesResult.toArray()) {
1323
- const value_id = row.value_id ? string(row.value_id) : null;
1324
- const value_data = string(row.value_data);
1325
- const timestamp = string(row.timestamp);
1326
- const hash = number(row.hash);
1327
- const [zeroOrCellOrValue] = JSON.parse(value_data);
1328
- if (value_id) {
1329
- values[0][value_id] = [zeroOrCellOrValue, timestamp, hash];
1330
- } else {
1331
- stampUpdate(values, timestamp, hash);
1332
- }
1333
- }
1502
+ });
1503
+ arrayForEach(
1504
+ getSqlRows(sqlStorage, `SELECT * FROM ${valuesTable}`),
1505
+ (row) => {
1506
+ const value_id = row.value_id ? string(row.value_id) : null;
1507
+ const value_data = string(row.value_data);
1508
+ const timestamp = string(row.timestamp);
1509
+ const hash = number(row.hash);
1510
+ const [zeroOrCellOrValue] = jsonParseWithUndefined(value_data);
1511
+ if (value_id) {
1512
+ values[0][value_id] = [zeroOrCellOrValue, timestamp, hash];
1513
+ } else {
1514
+ stampUpdate(values, timestamp, hash);
1515
+ }
1516
+ },
1517
+ );
1334
1518
  return [tables, values];
1335
1519
  };
1336
1520
  const setPersisted = async (
@@ -1340,64 +1524,42 @@ const createDurableObjectFragmentedSqlStoragePersister = (
1340
1524
  [valuesObj, valuesTime, valuesHash],
1341
1525
  ] = getContent(),
1342
1526
  ) => {
1343
- sqlStorage.exec(
1344
- `INSERT OR REPLACE INTO ${tablesTable} (type, table_id, row_id, cell_id, value_data, timestamp, hash) VALUES (?, ?, ?, ?, ?, ?, ?)`,
1345
- T,
1527
+ const [fullTablesObj] = getContent()[0];
1528
+ setTablesRow(
1346
1529
  null,
1347
1530
  null,
1348
1531
  null,
1349
- JSON.stringify([0]),
1532
+ jsonStringWithUndefined([0]),
1350
1533
  tablesTime,
1351
1534
  tablesHash,
1352
1535
  );
1353
1536
  objForEach(tablesObj, ([tableObj, tableTime, tableHash], tableId) => {
1354
- sqlStorage.exec(
1355
- `INSERT OR REPLACE INTO ${tablesTable} (type, table_id, row_id, cell_id, value_data, timestamp, hash) VALUES (?, ?, ?, ?, ?, ?, ?)`,
1356
- T,
1537
+ setTablesRow(
1357
1538
  tableId,
1358
1539
  null,
1359
1540
  null,
1360
- JSON.stringify([0]),
1541
+ jsonStringWithUndefined([0]),
1361
1542
  tableTime,
1362
1543
  tableHash,
1363
1544
  );
1364
1545
  objForEach(tableObj, ([rowObj, rowTime, rowHash], rowId) => {
1365
- sqlStorage.exec(
1366
- `INSERT OR REPLACE INTO ${tablesTable} (type, table_id, row_id, cell_id, value_data, timestamp, hash) VALUES (?, ?, ?, ?, ?, ?, ?)`,
1367
- T,
1546
+ const fullRowObj = fullTablesObj[tableId]?.[0]?.[rowId]?.[0] ?? rowObj;
1547
+ delCellRows(tableId, rowId);
1548
+ setTablesRow(
1368
1549
  tableId,
1369
1550
  rowId,
1370
1551
  null,
1371
- JSON.stringify([0]),
1552
+ jsonStringWithUndefined([fullRowObj]),
1372
1553
  rowTime,
1373
1554
  rowHash,
1374
1555
  );
1375
- objForEach(rowObj, (cellStamp, cellId) => {
1376
- sqlStorage.exec(
1377
- `INSERT OR REPLACE INTO ${tablesTable} (type, table_id, row_id, cell_id, value_data, timestamp, hash) VALUES (?, ?, ?, ?, ?, ?, ?)`,
1378
- T,
1379
- tableId,
1380
- rowId,
1381
- cellId,
1382
- JSON.stringify([cellStamp[0]]),
1383
- cellStamp[1],
1384
- cellStamp[2],
1385
- );
1386
- });
1387
1556
  });
1388
1557
  });
1389
- sqlStorage.exec(
1390
- `INSERT OR REPLACE INTO ${valuesTable} (value_id, value_data, timestamp, hash) VALUES (?, ?, ?, ?)`,
1391
- null,
1392
- JSON.stringify([0]),
1393
- valuesTime,
1394
- valuesHash,
1395
- );
1558
+ setValuesRow(null, jsonStringWithUndefined([0]), valuesTime, valuesHash);
1396
1559
  objForEach(valuesObj, (valueStamp, valueId) => {
1397
- sqlStorage.exec(
1398
- `INSERT OR REPLACE INTO ${valuesTable} (value_id, value_data, timestamp, hash) VALUES (?, ?, ?, ?)`,
1560
+ setValuesRow(
1399
1561
  valueId,
1400
- JSON.stringify([valueStamp[0]]),
1562
+ jsonStringWithUndefined([valueStamp[0]]),
1401
1563
  valueStamp[1],
1402
1564
  valueStamp[2],
1403
1565
  );