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
@@ -48,6 +48,7 @@ const tryCatch = async (action, then1, then2) => {
48
48
  }
49
49
  };
50
50
 
51
+ const arrayHas = (array, value) => array.includes(value);
51
52
  const arrayForEach = (array, cb) => array.forEach(cb);
52
53
  const arrayJoin = (array, sep = EMPTY_STRING) => array.join(sep);
53
54
  const arrayMap = (array, cb) => array.map(cb);
@@ -57,14 +58,6 @@ const arrayClear = (array, to) => array.splice(0, to);
57
58
  const arrayPush = (array, ...values) => array.push(...values);
58
59
  const arrayShift = (array) => array.shift();
59
60
 
60
- const collSize = (coll) => coll?.size ?? 0;
61
- const collHas = (coll, keyOrValue) => coll?.has(keyOrValue) ?? false;
62
- const collIsEmpty = (coll) => isUndefined(coll) || collSize(coll) == 0;
63
- const collValues = (coll) => [...(coll?.values() ?? [])];
64
- const collClear = (coll) => coll.clear();
65
- const collForEach = (coll, cb) => coll?.forEach(cb);
66
- const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
67
-
68
61
  const object = Object;
69
62
  const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
70
63
  const objEntries = object.entries;
@@ -96,14 +89,6 @@ const objValues = (obj) => object.values(obj);
96
89
  const objSize = (obj) => size(objIds(obj));
97
90
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
98
91
 
99
- const setNew = (entryOrEntries) =>
100
- new Set(
101
- isArray(entryOrEntries) || isUndefined(entryOrEntries)
102
- ? entryOrEntries
103
- : [entryOrEntries],
104
- );
105
- const setAdd = (set, value) => set?.add(value);
106
-
107
92
  const SINGLE_ROW_ID = '_';
108
93
  const DEFAULT_ROW_ID_COLUMN_NAME = '_id';
109
94
  const SELECT = 'SELECT';
@@ -122,7 +107,6 @@ const SCHEMA_VERSION = 'schema_version';
122
107
  const PRAGMA_TABLE = 'pragma_table_';
123
108
  const CREATE = 'CREATE ';
124
109
  const CREATE_TABLE = CREATE + TABLE;
125
- const OR_REPLACE = 'OR REPLACE ';
126
110
  const TABLE_NAME_PLACEHOLDER = '$tableName';
127
111
  const getWrappedCommand = (executeCommand, onSqlCommand) =>
128
112
  onSqlCommand
@@ -147,6 +131,14 @@ const getWhereCondition = (tableName, condition = TRUE) =>
147
131
  WHERE +
148
132
  `(${strReplace(condition, TABLE_NAME_PLACEHOLDER, escapeId(tableName))})`;
149
133
 
134
+ const collSize = (coll) => coll?.size ?? 0;
135
+ const collHas = (coll, keyOrValue) => coll?.has(keyOrValue) ?? false;
136
+ const collIsEmpty = (coll) => isUndefined(coll) || collSize(coll) == 0;
137
+ const collValues = (coll) => [...(coll?.values() ?? [])];
138
+ const collClear = (coll) => coll.clear();
139
+ const collForEach = (coll, cb) => coll?.forEach(cb);
140
+ const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
141
+
150
142
  const map = Map;
151
143
  const mapNew = (entries) => new map(entries);
152
144
  const mapGet = (map2, key) => map2?.get(key);
@@ -186,6 +178,14 @@ const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
186
178
  },
187
179
  );
188
180
 
181
+ const setNew = (entryOrEntries) =>
182
+ new Set(
183
+ isArray(entryOrEntries) || isUndefined(entryOrEntries)
184
+ ? entryOrEntries
185
+ : [entryOrEntries],
186
+ );
187
+ const setAdd = (set, value) => set?.add(value);
188
+
189
189
  const COLUMN_NAME = 'ColumnName';
190
190
  const STORE = 'store';
191
191
  const JSON$1 = 'json';
@@ -208,6 +208,8 @@ const DEFAULT_TABULAR_VALUES_CONFIG = {
208
208
  save: 0,
209
209
  [TABLE_NAME]: TINYBASE + '_values',
210
210
  };
211
+ const getValuesIn = (config) => (isArray(config) ? config : void 0);
212
+ const hasValues = (config) => isTrue(config) || isArray(config);
211
213
  const getDefaultedConfig = (configOrStoreTableName) =>
212
214
  objMerge(
213
215
  DEFAULT_CONFIG,
@@ -258,11 +260,15 @@ const getConfigStructures = (configOrStoreTableName) => {
258
260
  ];
259
261
  }
260
262
  const {tables: {load = {}, save = {}} = {}, values = {}} = config;
261
- const valuesConfig = slice(
262
- objValues(objMerge(DEFAULT_TABULAR_VALUES_CONFIG, values)),
263
- 0,
264
- objSize(DEFAULT_TABULAR_VALUES_CONFIG),
265
- );
263
+ const valuesConfigObj = objMerge(DEFAULT_TABULAR_VALUES_CONFIG, values);
264
+ const {load: valuesLoad, save: valuesSave} = valuesConfigObj;
265
+ const valuesConfig = [
266
+ hasValues(valuesLoad),
267
+ hasValues(valuesSave),
268
+ valuesConfigObj[TABLE_NAME],
269
+ getValuesIn(valuesLoad),
270
+ getValuesIn(valuesSave),
271
+ ];
266
272
  const valuesTable = valuesConfig[2];
267
273
  const managedTableNames = setNew(valuesTable);
268
274
  const excludedTableNames = setNew(valuesTable);
@@ -506,13 +512,14 @@ const createCustomPersister = (
506
512
  const content = await getPersisted();
507
513
  if (isArray(content)) {
508
514
  setContentOrChanges(content);
509
- } else if (initialContent) {
515
+ } else if (isUndefined(content) && initialContent) {
510
516
  setDefaultContent(initialContent);
511
- } else {
517
+ } else if (!isUndefined(content)) {
512
518
  errorNew(`Content is not an array: ${content}`);
513
519
  }
514
520
  },
515
- () => {
521
+ (error) => {
522
+ onIgnoredError?.(error);
516
523
  if (initialContent) {
517
524
  setDefaultContent(initialContent);
518
525
  }
@@ -671,8 +678,18 @@ const getCommandFunctions = (
671
678
  ({tn, cn}) => setAdd(mapEnsure(schemaMap, tn, setNew), cn),
672
679
  );
673
680
  };
674
- const loadTable = async (tableName, rowIdColumnName, condition) =>
675
- canSelect(tableName, rowIdColumnName)
681
+ const loadTable = async (
682
+ tableName,
683
+ rowIdColumnName,
684
+ condition,
685
+ contentSubIds,
686
+ ) => {
687
+ const contentSubIdSet = isUndefined(contentSubIds)
688
+ ? void 0
689
+ : setNew(contentSubIds);
690
+ const includeContentSubId = (contentSubId) =>
691
+ isUndefined(contentSubIdSet) || collHas(contentSubIdSet, contentSubId);
692
+ return canSelect(tableName, rowIdColumnName)
676
693
  ? objNew(
677
694
  arrayFilter(
678
695
  arrayMap(
@@ -681,17 +698,35 @@ const getCommandFunctions = (
681
698
  escapeId(tableName) +
682
699
  getWhereCondition(tableName, condition),
683
700
  ),
684
- (row) => [
685
- row[rowIdColumnName],
686
- decode
701
+ (row) => {
702
+ const rowId = row[rowIdColumnName];
703
+ const rowContent = decode
687
704
  ? objMap(objDel(row, rowIdColumnName), decode)
688
- : objDel(row, rowIdColumnName),
689
- ],
705
+ : objDel(row, rowIdColumnName);
706
+ return [
707
+ rowId,
708
+ isUndefined(contentSubIdSet)
709
+ ? rowContent
710
+ : objNew(
711
+ arrayFilter(
712
+ objToArray(
713
+ rowContent,
714
+ (cellOrValue, contentSubId) => [
715
+ contentSubId,
716
+ cellOrValue,
717
+ ],
718
+ ),
719
+ ([contentSubId]) => includeContentSubId(contentSubId),
720
+ ),
721
+ ),
722
+ ];
723
+ },
690
724
  ),
691
725
  (entry) => !isUndefined(entry[0]) && !objIsEmpty(entry[1]),
692
726
  ),
693
727
  )
694
728
  : {};
729
+ };
695
730
  const saveTable = async (
696
731
  tableName,
697
732
  rowIdColumnName,
@@ -700,15 +735,23 @@ const getCommandFunctions = (
700
735
  deleteEmptyTable,
701
736
  partial = false,
702
737
  condition = TRUE,
738
+ contentSubIds,
703
739
  ) => {
740
+ const contentSubIdSet = isUndefined(contentSubIds)
741
+ ? void 0
742
+ : setNew(contentSubIds);
743
+ const includeContentSubId = (contentSubId) =>
744
+ isUndefined(contentSubIdSet) || collHas(contentSubIdSet, contentSubId);
704
745
  const settingColumnNameSet = setNew();
705
746
  objMap(content ?? {}, (contentRow) =>
706
- arrayMap(objIds(contentRow ?? {}), (cellOrValueId) =>
707
- setAdd(settingColumnNameSet, cellOrValueId),
747
+ arrayMap(
748
+ arrayFilter(objIds(contentRow ?? {}), includeContentSubId),
749
+ (cellOrValueId) => setAdd(settingColumnNameSet, cellOrValueId),
708
750
  ),
709
751
  );
710
752
  const settingColumnNames = collValues(settingColumnNameSet);
711
753
  if (
754
+ isUndefined(contentSubIdSet) &&
712
755
  !partial &&
713
756
  deleteEmptyTable &&
714
757
  condition == TRUE &&
@@ -720,7 +763,13 @@ const getCommandFunctions = (
720
763
  return;
721
764
  }
722
765
  const currentColumnNames = mapGet(schemaMap, tableName);
723
- const unaccountedColumnNames = setNew(collValues(currentColumnNames));
766
+ const unaccountedColumnNames = setNew(
767
+ arrayFilter(
768
+ collValues(currentColumnNames),
769
+ (columnName) =>
770
+ columnName == rowIdColumnName || includeContentSubId(columnName),
771
+ ),
772
+ );
724
773
  if (!arrayIsEmpty(settingColumnNames)) {
725
774
  if (!collHas(schemaMap, tableName)) {
726
775
  await databaseExecuteCommand(
@@ -786,11 +835,13 @@ const getCommandFunctions = (
786
835
  ]);
787
836
  if (partial) {
788
837
  if (isUndefined(content)) {
789
- await databaseExecuteCommand(
790
- DELETE_FROM +
791
- escapeId(tableName) +
792
- getWhereCondition(tableName, condition),
793
- );
838
+ if (isUndefined(contentSubIdSet)) {
839
+ await databaseExecuteCommand(
840
+ DELETE_FROM +
841
+ escapeId(tableName) +
842
+ getWhereCondition(tableName, condition),
843
+ );
844
+ }
794
845
  } else {
795
846
  await promiseAll(
796
847
  objToArray(content, async (row, rowId) => {
@@ -803,18 +854,24 @@ const getCommandFunctions = (
803
854
  [rowId],
804
855
  );
805
856
  } else if (!arrayIsEmpty(settingColumnNames)) {
806
- await upsert(
807
- databaseExecuteCommand,
808
- tableName,
809
- rowIdColumnName,
857
+ const changingColumnNames = arrayFilter(
810
858
  objIds(row),
811
- {
812
- [rowId]: encode
813
- ? arrayMap(objValues(row), encode)
814
- : objValues(row),
815
- },
816
- currentColumnNames,
859
+ includeContentSubId,
817
860
  );
861
+ if (!arrayIsEmpty(changingColumnNames)) {
862
+ await upsert(
863
+ databaseExecuteCommand,
864
+ tableName,
865
+ rowIdColumnName,
866
+ changingColumnNames,
867
+ {
868
+ [rowId]: arrayMap(changingColumnNames, (cellId) =>
869
+ encode ? encode(row[cellId]) : row[cellId],
870
+ ),
871
+ },
872
+ currentColumnNames,
873
+ );
874
+ }
818
875
  }
819
876
  }),
820
877
  );
@@ -823,7 +880,9 @@ const getCommandFunctions = (
823
880
  if (!arrayIsEmpty(settingColumnNames)) {
824
881
  const changingColumnNames = arrayFilter(
825
882
  collValues(mapGet(schemaMap, tableName)),
826
- (changingColumnName) => changingColumnName != rowIdColumnName,
883
+ (changingColumnName) =>
884
+ changingColumnName != rowIdColumnName &&
885
+ includeContentSubId(changingColumnName),
827
886
  );
828
887
  const rows = {};
829
888
  const deleteRowIds = [];
@@ -839,6 +898,7 @@ const getCommandFunctions = (
839
898
  rowIdColumnName,
840
899
  changingColumnNames,
841
900
  rows,
901
+ currentColumnNames,
842
902
  );
843
903
  await databaseExecuteCommand(
844
904
  DELETE_FROM +
@@ -847,7 +907,10 @@ const getCommandFunctions = (
847
907
  `AND${escapeId(rowIdColumnName)}NOT IN(${getPlaceholders(deleteRowIds)})`,
848
908
  deleteRowIds,
849
909
  );
850
- } else if (collHas(schemaMap, tableName)) {
910
+ } else if (
911
+ isUndefined(contentSubIdSet) &&
912
+ collHas(schemaMap, tableName)
913
+ ) {
851
914
  await databaseExecuteCommand(
852
915
  DELETE_FROM +
853
916
  escapeId(tableName) +
@@ -986,7 +1049,13 @@ const createTabularPersister = (
986
1049
  [
987
1050
  tablesLoadConfig,
988
1051
  tablesSaveConfig,
989
- [valuesLoad, valuesSave, valuesTableName],
1052
+ [
1053
+ valuesLoad,
1054
+ valuesSave,
1055
+ valuesTableName,
1056
+ valuesLoadValueIds,
1057
+ valuesSaveValueIds,
1058
+ ],
990
1059
  ],
991
1060
  managedTableNames,
992
1061
  querySchema,
@@ -1036,15 +1105,33 @@ const createTabularPersister = (
1036
1105
  },
1037
1106
  ),
1038
1107
  );
1108
+ const getValuesSubset = (values, valueIds, partial) =>
1109
+ objNew(
1110
+ partial == true
1111
+ ? arrayFilter(
1112
+ objToArray(values, (value, valueId) => [valueId, value]),
1113
+ ([valueId]) => arrayHas(valueIds, valueId),
1114
+ )
1115
+ : arrayFilter(
1116
+ arrayMap(valueIds, (valueId) => [valueId, values[valueId]]),
1117
+ ([, value]) => !isUndefined(value),
1118
+ ),
1119
+ );
1039
1120
  const saveValues = async (values, partial) =>
1040
1121
  valuesSave
1041
1122
  ? await saveTable(
1042
1123
  valuesTableName,
1043
1124
  DEFAULT_ROW_ID_COLUMN_NAME,
1044
- {[SINGLE_ROW_ID]: values},
1125
+ {
1126
+ [SINGLE_ROW_ID]: isUndefined(valuesSaveValueIds)
1127
+ ? values
1128
+ : getValuesSubset(values, valuesSaveValueIds, partial),
1129
+ },
1045
1130
  true,
1046
1131
  true,
1047
1132
  partial,
1133
+ void 0,
1134
+ valuesSaveValueIds,
1048
1135
  )
1049
1136
  : null;
1050
1137
  const loadTables = async () =>
@@ -1064,9 +1151,14 @@ const createTabularPersister = (
1064
1151
  );
1065
1152
  const loadValues = async () =>
1066
1153
  valuesLoad
1067
- ? (await loadTable(valuesTableName, DEFAULT_ROW_ID_COLUMN_NAME))[
1068
- SINGLE_ROW_ID
1069
- ]
1154
+ ? (
1155
+ await loadTable(
1156
+ valuesTableName,
1157
+ DEFAULT_ROW_ID_COLUMN_NAME,
1158
+ void 0,
1159
+ valuesLoadValueIds,
1160
+ )
1161
+ )[SINGLE_ROW_ID]
1070
1162
  : {};
1071
1163
  const getPersisted = () =>
1072
1164
  transaction(async () => {
@@ -1241,83 +1333,57 @@ const createPowerSyncPersister = (
1241
1333
  // StoreOnly,
1242
1334
  powerSync,
1243
1335
  'getPowerSync',
1244
- viewUpsert,
1336
+ powerSyncUpdateThenInsert,
1245
1337
  );
1246
1338
  };
1247
- const viewUpsert = async (
1339
+ const powerSyncUpdateThenInsert = async (
1248
1340
  executeCommand,
1249
1341
  tableName,
1250
1342
  rowIdColumnName,
1251
1343
  changingColumnNames,
1252
1344
  rows,
1253
- currentColumnNames,
1254
1345
  ) => {
1255
- const offset = [1];
1256
- const changingColumnNamesSet = setNew(changingColumnNames);
1257
- const unchangingColumnNames = currentColumnNames
1258
- ? arrayFilter(
1259
- [...currentColumnNames],
1260
- (currentColumnName) =>
1261
- currentColumnName != rowIdColumnName &&
1262
- !collHas(changingColumnNamesSet, currentColumnName),
1263
- )
1264
- : [];
1265
- if (!arrayIsEmpty(unchangingColumnNames)) {
1266
- const ids = objIds(rows);
1267
- const unchangingData = objNew(
1268
- arrayMap(
1346
+ const assignments = arrayJoin(
1347
+ arrayMap(
1348
+ changingColumnNames,
1349
+ (columnName, index) => escapeId(columnName) + '=$' + (index + 1),
1350
+ ),
1351
+ COMMA,
1352
+ );
1353
+ for (const [id, row] of objToArray(rows, (row2, id2) => [id2, row2])) {
1354
+ const rowParams = arrayMap(row, (value) => value ?? null);
1355
+ if (
1356
+ arrayIsEmpty(
1269
1357
  await executeCommand(
1270
- SELECT +
1271
- escapeColumnNames(rowIdColumnName, ...unchangingColumnNames) +
1272
- FROM +
1358
+ UPDATE +
1273
1359
  escapeId(tableName) +
1360
+ ' SET' +
1361
+ assignments +
1362
+ ' ' +
1274
1363
  WHERE +
1275
1364
  escapeId(rowIdColumnName) +
1276
- 'IN(' +
1277
- getPlaceholders(ids) +
1278
- ')',
1279
- ids,
1280
- ),
1281
- (unchangingRow) => [unchangingRow[rowIdColumnName], unchangingRow],
1282
- ),
1283
- );
1284
- arrayForEach(ids, (id) =>
1285
- arrayPush(
1286
- rows[id],
1287
- ...arrayMap(
1288
- unchangingColumnNames,
1289
- (unchangingColumnName) =>
1290
- unchangingData?.[id]?.[unchangingColumnName] ?? null,
1365
+ '=$' +
1366
+ (row.length + 1) +
1367
+ ' RETURNING' +
1368
+ escapeId(rowIdColumnName),
1369
+ [...rowParams, id],
1291
1370
  ),
1292
- ),
1293
- );
1371
+ )
1372
+ ) {
1373
+ const offset = [1];
1374
+ await executeCommand(
1375
+ INSERT +
1376
+ ' INTO' +
1377
+ escapeId(tableName) +
1378
+ '(' +
1379
+ escapeColumnNames(rowIdColumnName, ...changingColumnNames) +
1380
+ ')VALUES(' +
1381
+ getPlaceholders([id, ...row], offset) +
1382
+ ')',
1383
+ [id, ...rowParams],
1384
+ );
1385
+ }
1294
1386
  }
1295
- await executeCommand(
1296
- INSERT +
1297
- ' ' +
1298
- OR_REPLACE +
1299
- 'INTO' +
1300
- escapeId(tableName) +
1301
- '(' +
1302
- escapeColumnNames(
1303
- rowIdColumnName,
1304
- ...changingColumnNames,
1305
- ...unchangingColumnNames,
1306
- ) +
1307
- ')VALUES' +
1308
- arrayJoin(
1309
- objToArray(
1310
- rows,
1311
- (row) =>
1312
- '($' + offset[0]++ + ',' + getPlaceholders(row, offset) + ')',
1313
- ),
1314
- COMMA,
1315
- ),
1316
- objToArray(rows, (row, id) => [
1317
- id,
1318
- ...arrayMap(row, (value) => value ?? null),
1319
- ]).flat(),
1320
- );
1321
1387
  };
1322
1388
 
1323
1389
  export {createPowerSyncPersister};
@@ -283,13 +283,14 @@ const createCustomPersister = (
283
283
  const content = await getPersisted();
284
284
  if (isArray(content)) {
285
285
  setContentOrChanges(content);
286
- } else if (initialContent) {
286
+ } else if (isUndefined(content) && initialContent) {
287
287
  setDefaultContent(initialContent);
288
- } else {
288
+ } else if (!isUndefined(content)) {
289
289
  errorNew(`Content is not an array: ${content}`);
290
290
  }
291
291
  },
292
- () => {
292
+ (error) => {
293
+ onIgnoredError?.(error);
293
294
  if (initialContent) {
294
295
  setDefaultContent(initialContent);
295
296
  }
@@ -283,13 +283,14 @@ const createCustomPersister = (
283
283
  const content = await getPersisted();
284
284
  if (isArray(content)) {
285
285
  setContentOrChanges(content);
286
- } else if (initialContent) {
286
+ } else if (isUndefined(content) && initialContent) {
287
287
  setDefaultContent(initialContent);
288
- } else {
288
+ } else if (!isUndefined(content)) {
289
289
  errorNew(`Content is not an array: ${content}`);
290
290
  }
291
291
  },
292
- () => {
292
+ (error) => {
293
+ onIgnoredError?.(error);
293
294
  if (initialContent) {
294
295
  setDefaultContent(initialContent);
295
296
  }