tinybase 5.0.0-beta.2 → 5.0.0-beta.3

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 (270) hide show
  1. package/lib/cjs/mergeable-store.cjs +1 -1
  2. package/lib/cjs/mergeable-store.cjs.gz +0 -0
  3. package/lib/cjs/persisters/persister-automerge.cjs +1 -1
  4. package/lib/cjs/persisters/persister-automerge.cjs.gz +0 -0
  5. package/lib/cjs/persisters/persister-browser.cjs +1 -1
  6. package/lib/cjs/persisters/persister-browser.cjs.gz +0 -0
  7. package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs +1 -1
  8. package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  9. package/lib/cjs/persisters/persister-electric-sql.cjs +1 -1
  10. package/lib/cjs/persisters/persister-electric-sql.cjs.gz +0 -0
  11. package/lib/cjs/persisters/persister-expo-sqlite-next.cjs +1 -1
  12. package/lib/cjs/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
  13. package/lib/cjs/persisters/persister-expo-sqlite.cjs +1 -1
  14. package/lib/cjs/persisters/persister-expo-sqlite.cjs.gz +0 -0
  15. package/lib/cjs/persisters/persister-file.cjs +1 -1
  16. package/lib/cjs/persisters/persister-file.cjs.gz +0 -0
  17. package/lib/cjs/persisters/persister-indexed-db.cjs +1 -1
  18. package/lib/cjs/persisters/persister-indexed-db.cjs.gz +0 -0
  19. package/lib/cjs/persisters/persister-partykit-client.cjs +1 -1
  20. package/lib/cjs/persisters/persister-partykit-client.cjs.gz +0 -0
  21. package/lib/cjs/persisters/persister-partykit-server.cjs +1 -1
  22. package/lib/cjs/persisters/persister-partykit-server.cjs.gz +0 -0
  23. package/lib/cjs/persisters/persister-remote.cjs +1 -1
  24. package/lib/cjs/persisters/persister-remote.cjs.gz +0 -0
  25. package/lib/cjs/persisters/persister-sqlite-wasm.cjs +1 -1
  26. package/lib/cjs/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  27. package/lib/cjs/persisters/persister-sqlite3.cjs +1 -1
  28. package/lib/cjs/persisters/persister-sqlite3.cjs.gz +0 -0
  29. package/lib/cjs/persisters/persister-yjs.cjs +1 -1
  30. package/lib/cjs/persisters/persister-yjs.cjs.gz +0 -0
  31. package/lib/cjs/persisters.cjs +1 -1
  32. package/lib/cjs/persisters.cjs.gz +0 -0
  33. package/lib/cjs/store.cjs +1 -1
  34. package/lib/cjs/store.cjs.gz +0 -0
  35. package/lib/cjs/tinybase.cjs +1 -1
  36. package/lib/cjs/tinybase.cjs.gz +0 -0
  37. package/lib/cjs/tools.cjs +1 -1
  38. package/lib/cjs/tools.cjs.gz +0 -0
  39. package/lib/cjs/ui-react-dom-debug.cjs +1 -1
  40. package/lib/cjs/ui-react-dom-debug.cjs.gz +0 -0
  41. package/lib/cjs-es6/mergeable-store.cjs +1 -1
  42. package/lib/cjs-es6/mergeable-store.cjs.gz +0 -0
  43. package/lib/cjs-es6/persisters/persister-automerge.cjs +1 -1
  44. package/lib/cjs-es6/persisters/persister-automerge.cjs.gz +0 -0
  45. package/lib/cjs-es6/persisters/persister-browser.cjs +1 -1
  46. package/lib/cjs-es6/persisters/persister-browser.cjs.gz +0 -0
  47. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs +1 -1
  48. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  49. package/lib/cjs-es6/persisters/persister-electric-sql.cjs +1 -1
  50. package/lib/cjs-es6/persisters/persister-electric-sql.cjs.gz +0 -0
  51. package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs +1 -1
  52. package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
  53. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs +1 -1
  54. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs.gz +0 -0
  55. package/lib/cjs-es6/persisters/persister-file.cjs +1 -1
  56. package/lib/cjs-es6/persisters/persister-file.cjs.gz +0 -0
  57. package/lib/cjs-es6/persisters/persister-indexed-db.cjs +1 -1
  58. package/lib/cjs-es6/persisters/persister-indexed-db.cjs.gz +0 -0
  59. package/lib/cjs-es6/persisters/persister-partykit-client.cjs +1 -1
  60. package/lib/cjs-es6/persisters/persister-partykit-client.cjs.gz +0 -0
  61. package/lib/cjs-es6/persisters/persister-partykit-server.cjs +1 -1
  62. package/lib/cjs-es6/persisters/persister-partykit-server.cjs.gz +0 -0
  63. package/lib/cjs-es6/persisters/persister-remote.cjs +1 -1
  64. package/lib/cjs-es6/persisters/persister-remote.cjs.gz +0 -0
  65. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs +1 -1
  66. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  67. package/lib/cjs-es6/persisters/persister-sqlite3.cjs +1 -1
  68. package/lib/cjs-es6/persisters/persister-sqlite3.cjs.gz +0 -0
  69. package/lib/cjs-es6/persisters/persister-yjs.cjs +1 -1
  70. package/lib/cjs-es6/persisters/persister-yjs.cjs.gz +0 -0
  71. package/lib/cjs-es6/persisters.cjs +1 -1
  72. package/lib/cjs-es6/persisters.cjs.gz +0 -0
  73. package/lib/cjs-es6/store.cjs +1 -1
  74. package/lib/cjs-es6/store.cjs.gz +0 -0
  75. package/lib/cjs-es6/tinybase.cjs +1 -1
  76. package/lib/cjs-es6/tinybase.cjs.gz +0 -0
  77. package/lib/cjs-es6/tools.cjs +1 -1
  78. package/lib/cjs-es6/tools.cjs.gz +0 -0
  79. package/lib/cjs-es6/ui-react-dom-debug.cjs +1 -1
  80. package/lib/cjs-es6/ui-react-dom-debug.cjs.gz +0 -0
  81. package/lib/debug/mergeable-store.js +158 -187
  82. package/lib/debug/persisters/persister-automerge.js +42 -43
  83. package/lib/debug/persisters/persister-browser.js +28 -18
  84. package/lib/debug/persisters/persister-cr-sqlite-wasm.js +77 -54
  85. package/lib/debug/persisters/persister-electric-sql.js +77 -54
  86. package/lib/debug/persisters/persister-expo-sqlite-next.js +77 -54
  87. package/lib/debug/persisters/persister-expo-sqlite.js +77 -54
  88. package/lib/debug/persisters/persister-file.js +27 -18
  89. package/lib/debug/persisters/persister-indexed-db.js +28 -20
  90. package/lib/debug/persisters/persister-partykit-client.js +26 -23
  91. package/lib/debug/persisters/persister-partykit-server.js +8 -18
  92. package/lib/debug/persisters/persister-remote.js +28 -18
  93. package/lib/debug/persisters/persister-sqlite-wasm.js +77 -54
  94. package/lib/debug/persisters/persister-sqlite3.js +77 -54
  95. package/lib/debug/persisters/persister-yjs.js +44 -42
  96. package/lib/debug/persisters.js +27 -18
  97. package/lib/debug/store.js +50 -68
  98. package/lib/debug/tinybase.js +180 -205
  99. package/lib/debug/tools.js +9 -11
  100. package/lib/debug/ui-react-dom.js +73 -86
  101. package/lib/es6/mergeable-store.js +1 -1
  102. package/lib/es6/mergeable-store.js.gz +0 -0
  103. package/lib/es6/persisters/persister-automerge.js +1 -1
  104. package/lib/es6/persisters/persister-automerge.js.gz +0 -0
  105. package/lib/es6/persisters/persister-browser.js +1 -1
  106. package/lib/es6/persisters/persister-browser.js.gz +0 -0
  107. package/lib/es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  108. package/lib/es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  109. package/lib/es6/persisters/persister-electric-sql.js +1 -1
  110. package/lib/es6/persisters/persister-electric-sql.js.gz +0 -0
  111. package/lib/es6/persisters/persister-expo-sqlite-next.js +1 -1
  112. package/lib/es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
  113. package/lib/es6/persisters/persister-expo-sqlite.js +1 -1
  114. package/lib/es6/persisters/persister-expo-sqlite.js.gz +0 -0
  115. package/lib/es6/persisters/persister-file.js +1 -1
  116. package/lib/es6/persisters/persister-file.js.gz +0 -0
  117. package/lib/es6/persisters/persister-indexed-db.js +1 -1
  118. package/lib/es6/persisters/persister-indexed-db.js.gz +0 -0
  119. package/lib/es6/persisters/persister-partykit-client.js +1 -1
  120. package/lib/es6/persisters/persister-partykit-client.js.gz +0 -0
  121. package/lib/es6/persisters/persister-partykit-server.js +1 -1
  122. package/lib/es6/persisters/persister-partykit-server.js.gz +0 -0
  123. package/lib/es6/persisters/persister-remote.js +1 -1
  124. package/lib/es6/persisters/persister-remote.js.gz +0 -0
  125. package/lib/es6/persisters/persister-sqlite-wasm.js +1 -1
  126. package/lib/es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  127. package/lib/es6/persisters/persister-sqlite3.js +1 -1
  128. package/lib/es6/persisters/persister-sqlite3.js.gz +0 -0
  129. package/lib/es6/persisters/persister-yjs.js +1 -1
  130. package/lib/es6/persisters/persister-yjs.js.gz +0 -0
  131. package/lib/es6/persisters.js +1 -1
  132. package/lib/es6/persisters.js.gz +0 -0
  133. package/lib/es6/store.js +1 -1
  134. package/lib/es6/store.js.gz +0 -0
  135. package/lib/es6/tinybase.js +1 -1
  136. package/lib/es6/tinybase.js.gz +0 -0
  137. package/lib/es6/tools.js +1 -1
  138. package/lib/es6/tools.js.gz +0 -0
  139. package/lib/es6/ui-react-dom-debug.js +1 -1
  140. package/lib/es6/ui-react-dom-debug.js.gz +0 -0
  141. package/lib/mergeable-store.js +1 -1
  142. package/lib/mergeable-store.js.gz +0 -0
  143. package/lib/persisters/persister-automerge.js +1 -1
  144. package/lib/persisters/persister-automerge.js.gz +0 -0
  145. package/lib/persisters/persister-browser.js +1 -1
  146. package/lib/persisters/persister-browser.js.gz +0 -0
  147. package/lib/persisters/persister-cr-sqlite-wasm.js +1 -1
  148. package/lib/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  149. package/lib/persisters/persister-electric-sql.js +1 -1
  150. package/lib/persisters/persister-electric-sql.js.gz +0 -0
  151. package/lib/persisters/persister-expo-sqlite-next.js +1 -1
  152. package/lib/persisters/persister-expo-sqlite-next.js.gz +0 -0
  153. package/lib/persisters/persister-expo-sqlite.js +1 -1
  154. package/lib/persisters/persister-expo-sqlite.js.gz +0 -0
  155. package/lib/persisters/persister-file.js +1 -1
  156. package/lib/persisters/persister-file.js.gz +0 -0
  157. package/lib/persisters/persister-indexed-db.js +1 -1
  158. package/lib/persisters/persister-indexed-db.js.gz +0 -0
  159. package/lib/persisters/persister-partykit-client.js +1 -1
  160. package/lib/persisters/persister-partykit-client.js.gz +0 -0
  161. package/lib/persisters/persister-partykit-server.js +1 -1
  162. package/lib/persisters/persister-partykit-server.js.gz +0 -0
  163. package/lib/persisters/persister-remote.js +1 -1
  164. package/lib/persisters/persister-remote.js.gz +0 -0
  165. package/lib/persisters/persister-sqlite-wasm.js +1 -1
  166. package/lib/persisters/persister-sqlite-wasm.js.gz +0 -0
  167. package/lib/persisters/persister-sqlite3.js +1 -1
  168. package/lib/persisters/persister-sqlite3.js.gz +0 -0
  169. package/lib/persisters/persister-yjs.js +1 -1
  170. package/lib/persisters/persister-yjs.js.gz +0 -0
  171. package/lib/persisters.js +1 -1
  172. package/lib/persisters.js.gz +0 -0
  173. package/lib/store.js +1 -1
  174. package/lib/store.js.gz +0 -0
  175. package/lib/tinybase.js +1 -1
  176. package/lib/tinybase.js.gz +0 -0
  177. package/lib/tools.js +1 -1
  178. package/lib/tools.js.gz +0 -0
  179. package/lib/types/mergeable-store.d.ts +37 -13
  180. package/lib/types/persisters/persister-partykit-server.d.ts +7 -8
  181. package/lib/types/persisters.d.ts +47 -27
  182. package/lib/types/store.d.ts +153 -111
  183. package/lib/types/tools.d.ts +2 -2
  184. package/lib/types/with-schemas/mergeable-store.d.ts +40 -13
  185. package/lib/types/with-schemas/persisters/persister-partykit-server.d.ts +10 -11
  186. package/lib/types/with-schemas/persisters.d.ts +78 -42
  187. package/lib/types/with-schemas/store.d.ts +165 -136
  188. package/lib/types/with-schemas/tools.d.ts +2 -2
  189. package/lib/umd/mergeable-store.js +1 -1
  190. package/lib/umd/mergeable-store.js.gz +0 -0
  191. package/lib/umd/persisters/persister-automerge.js +1 -1
  192. package/lib/umd/persisters/persister-automerge.js.gz +0 -0
  193. package/lib/umd/persisters/persister-browser.js +1 -1
  194. package/lib/umd/persisters/persister-browser.js.gz +0 -0
  195. package/lib/umd/persisters/persister-cr-sqlite-wasm.js +1 -1
  196. package/lib/umd/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  197. package/lib/umd/persisters/persister-electric-sql.js +1 -1
  198. package/lib/umd/persisters/persister-electric-sql.js.gz +0 -0
  199. package/lib/umd/persisters/persister-expo-sqlite-next.js +1 -1
  200. package/lib/umd/persisters/persister-expo-sqlite-next.js.gz +0 -0
  201. package/lib/umd/persisters/persister-expo-sqlite.js +1 -1
  202. package/lib/umd/persisters/persister-expo-sqlite.js.gz +0 -0
  203. package/lib/umd/persisters/persister-file.js +1 -1
  204. package/lib/umd/persisters/persister-file.js.gz +0 -0
  205. package/lib/umd/persisters/persister-indexed-db.js +1 -1
  206. package/lib/umd/persisters/persister-indexed-db.js.gz +0 -0
  207. package/lib/umd/persisters/persister-partykit-client.js +1 -1
  208. package/lib/umd/persisters/persister-partykit-client.js.gz +0 -0
  209. package/lib/umd/persisters/persister-partykit-server.js +1 -1
  210. package/lib/umd/persisters/persister-partykit-server.js.gz +0 -0
  211. package/lib/umd/persisters/persister-remote.js +1 -1
  212. package/lib/umd/persisters/persister-remote.js.gz +0 -0
  213. package/lib/umd/persisters/persister-sqlite-wasm.js +1 -1
  214. package/lib/umd/persisters/persister-sqlite-wasm.js.gz +0 -0
  215. package/lib/umd/persisters/persister-sqlite3.js +1 -1
  216. package/lib/umd/persisters/persister-sqlite3.js.gz +0 -0
  217. package/lib/umd/persisters/persister-yjs.js +1 -1
  218. package/lib/umd/persisters/persister-yjs.js.gz +0 -0
  219. package/lib/umd/persisters.js +1 -1
  220. package/lib/umd/persisters.js.gz +0 -0
  221. package/lib/umd/store.js +1 -1
  222. package/lib/umd/store.js.gz +0 -0
  223. package/lib/umd/tinybase.js +1 -1
  224. package/lib/umd/tinybase.js.gz +0 -0
  225. package/lib/umd/tools.js +1 -1
  226. package/lib/umd/tools.js.gz +0 -0
  227. package/lib/umd/ui-react-dom-debug.js +1 -1
  228. package/lib/umd/ui-react-dom-debug.js.gz +0 -0
  229. package/lib/umd-es6/mergeable-store.js +1 -1
  230. package/lib/umd-es6/mergeable-store.js.gz +0 -0
  231. package/lib/umd-es6/persisters/persister-automerge.js +1 -1
  232. package/lib/umd-es6/persisters/persister-automerge.js.gz +0 -0
  233. package/lib/umd-es6/persisters/persister-browser.js +1 -1
  234. package/lib/umd-es6/persisters/persister-browser.js.gz +0 -0
  235. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  236. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  237. package/lib/umd-es6/persisters/persister-electric-sql.js +1 -1
  238. package/lib/umd-es6/persisters/persister-electric-sql.js.gz +0 -0
  239. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js +1 -1
  240. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
  241. package/lib/umd-es6/persisters/persister-expo-sqlite.js +1 -1
  242. package/lib/umd-es6/persisters/persister-expo-sqlite.js.gz +0 -0
  243. package/lib/umd-es6/persisters/persister-file.js +1 -1
  244. package/lib/umd-es6/persisters/persister-file.js.gz +0 -0
  245. package/lib/umd-es6/persisters/persister-indexed-db.js +1 -1
  246. package/lib/umd-es6/persisters/persister-indexed-db.js.gz +0 -0
  247. package/lib/umd-es6/persisters/persister-partykit-client.js +1 -1
  248. package/lib/umd-es6/persisters/persister-partykit-client.js.gz +0 -0
  249. package/lib/umd-es6/persisters/persister-partykit-server.js +1 -1
  250. package/lib/umd-es6/persisters/persister-partykit-server.js.gz +0 -0
  251. package/lib/umd-es6/persisters/persister-remote.js +1 -1
  252. package/lib/umd-es6/persisters/persister-remote.js.gz +0 -0
  253. package/lib/umd-es6/persisters/persister-sqlite-wasm.js +1 -1
  254. package/lib/umd-es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  255. package/lib/umd-es6/persisters/persister-sqlite3.js +1 -1
  256. package/lib/umd-es6/persisters/persister-sqlite3.js.gz +0 -0
  257. package/lib/umd-es6/persisters/persister-yjs.js +1 -1
  258. package/lib/umd-es6/persisters/persister-yjs.js.gz +0 -0
  259. package/lib/umd-es6/persisters.js +1 -1
  260. package/lib/umd-es6/persisters.js.gz +0 -0
  261. package/lib/umd-es6/store.js +1 -1
  262. package/lib/umd-es6/store.js.gz +0 -0
  263. package/lib/umd-es6/tinybase.js +1 -1
  264. package/lib/umd-es6/tinybase.js.gz +0 -0
  265. package/lib/umd-es6/tools.js +1 -1
  266. package/lib/umd-es6/tools.js.gz +0 -0
  267. package/lib/umd-es6/ui-react-dom-debug.js +1 -1
  268. package/lib/umd-es6/ui-react-dom-debug.js.gz +0 -0
  269. package/package.json +26 -22
  270. package/readme.md +2 -2
@@ -56,8 +56,7 @@ const isObject = (obj) =>
56
56
  );
57
57
  const objNew = (entries = []) => object.fromEntries(entries);
58
58
  const objMerge = (...objs) => object.assign({}, ...objs);
59
- const objGet = (obj, id) => ifNotUndefined(obj, (obj2) => obj2[id]);
60
- const objHas = (obj, id) => !isUndefined(objGet(obj, id));
59
+ const objHas = (obj, id) => id in obj;
61
60
  const objDel = (obj, id) => {
62
61
  delete obj[id];
63
62
  return obj;
@@ -100,7 +99,12 @@ const setAdd = (set, value) => set?.add(value);
100
99
  const SELECT_STAR_FROM = SELECT + '*FROM';
101
100
  const FROM_PRAGMA_TABLE = 'FROM pragma_table_';
102
101
  const WHERE = 'WHERE';
103
- const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
102
+ const getCommandFunctions = (
103
+ cmd,
104
+ managedTableNames,
105
+ onIgnoredError,
106
+ useOnConflict,
107
+ ) => {
104
108
  const schemaMap = mapNew();
105
109
  const canSelect = (tableName, rowIdColumnName) =>
106
110
  !isUndefined(mapGet(mapGet(schemaMap, tableName), rowIdColumnName));
@@ -113,7 +117,7 @@ const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
113
117
  await cmd(
114
118
  'SELECT name ' +
115
119
  FROM_PRAGMA_TABLE +
116
- `list WHERE schema='main'AND type='table'AND name IN(` +
120
+ `list WHERE schema='main'AND(type='table'OR type='view')AND name IN(` +
117
121
  getPlaceholders(managedTableNames) +
118
122
  `)ORDER BY name`,
119
123
  managedTableNames,
@@ -168,16 +172,18 @@ const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
168
172
  const saveTable = async (
169
173
  tableName,
170
174
  rowIdColumnName,
171
- table,
175
+ content,
172
176
  deleteEmptyColumns,
173
177
  deleteEmptyTable,
174
178
  partial = false,
175
179
  ) => {
176
- const tableCellIds = setNew();
177
- objToArray(table ?? {}, (row) =>
178
- arrayMap(objIds(row ?? {}), (cellId) => setAdd(tableCellIds, cellId)),
180
+ const tableCellOrValueIds = setNew();
181
+ objToArray(content ?? {}, (contentRow) =>
182
+ arrayMap(objIds(contentRow ?? {}), (cellOrValueId) =>
183
+ setAdd(tableCellOrValueIds, cellOrValueId),
184
+ ),
179
185
  );
180
- const tableColumnNames = collValues(tableCellIds);
186
+ const tableColumnNames = collValues(tableCellOrValueIds);
181
187
  if (
182
188
  !partial &&
183
189
  deleteEmptyTable &&
@@ -235,11 +241,11 @@ const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
235
241
  ]);
236
242
  }
237
243
  if (partial) {
238
- if (isUndefined(table)) {
244
+ if (isUndefined(content)) {
239
245
  await cmd('DELETE FROM' + escapeId(tableName) + 'WHERE 1');
240
246
  } else {
241
247
  await promiseAll(
242
- objToArray(table, async (row, rowId) => {
248
+ objToArray(content, async (row, rowId) => {
243
249
  if (isUndefined(row)) {
244
250
  await cmd(
245
251
  'DELETE FROM' +
@@ -250,10 +256,14 @@ const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
250
256
  [rowId],
251
257
  );
252
258
  } else if (!arrayIsEmpty(tableColumnNames)) {
253
- await upsert(cmd, tableName, rowIdColumnName, objIds(row), [
254
- rowId,
255
- ...objValues(row),
256
- ]);
259
+ await upsert(
260
+ cmd,
261
+ tableName,
262
+ rowIdColumnName,
263
+ objIds(row),
264
+ [rowId, ...objValues(row)],
265
+ useOnConflict,
266
+ );
257
267
  }
258
268
  }),
259
269
  );
@@ -266,7 +276,7 @@ const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
266
276
  );
267
277
  const args = [];
268
278
  const deleteRowIds = [];
269
- objToArray(table ?? {}, (row, rowId) => {
279
+ objToArray(content ?? {}, (row, rowId) => {
270
280
  arrayPush(
271
281
  args,
272
282
  rowId,
@@ -315,9 +325,12 @@ const upsert = async (
315
325
  rowIdColumnName,
316
326
  changingColumnNames,
317
327
  args,
328
+ useOnConflict = true,
318
329
  ) =>
319
330
  await cmd(
320
- 'INSERT INTO' +
331
+ 'INSERT ' +
332
+ (useOnConflict ? EMPTY_STRING : 'OR REPLACE ') +
333
+ 'INTO' +
321
334
  escapeId(tableName) +
322
335
  '(' +
323
336
  escapeId(rowIdColumnName) +
@@ -335,18 +348,20 @@ const upsert = async (
335
348
  ),
336
349
  1,
337
350
  ) +
338
- 'ON CONFLICT(' +
339
- escapeId(rowIdColumnName) +
340
- ')DO UPDATE SET' +
341
- arrayJoin(
342
- arrayMap(
343
- changingColumnNames,
344
- (columnName) =>
345
- escapeId(columnName) + '=excluded.' + escapeId(columnName),
346
- ),
347
- COMMA,
348
- ),
349
- args,
351
+ (useOnConflict
352
+ ? 'ON CONFLICT(' +
353
+ escapeId(rowIdColumnName) +
354
+ ')DO UPDATE SET' +
355
+ arrayJoin(
356
+ arrayMap(
357
+ changingColumnNames,
358
+ (columnName) =>
359
+ escapeId(columnName) + '=excluded.' + escapeId(columnName),
360
+ ),
361
+ COMMA,
362
+ )
363
+ : EMPTY_STRING),
364
+ arrayMap(args, (arg) => arg ?? null),
350
365
  );
351
366
  const getPlaceholders = (array) =>
352
367
  arrayJoin(
@@ -369,6 +384,7 @@ const createCustomPersister = (
369
384
  addPersisterListener,
370
385
  delPersisterListener,
371
386
  onIgnoredError,
387
+ supportsMergeableStore,
372
388
  [getThing, thing] = [],
373
389
  scheduleId = [],
374
390
  ) => {
@@ -381,6 +397,10 @@ const createCustomPersister = (
381
397
  let listeningHandle;
382
398
  mapEnsure(scheduleRunning, scheduleId, () => 0);
383
399
  mapEnsure(scheduleActions, scheduleId, () => []);
400
+ const getContent =
401
+ (supportsMergeableStore ? store.getMergeableContent : null) ??
402
+ store.getContent;
403
+ const getChanges = store.getTransactionChanges;
384
404
  const run = async () => {
385
405
  /* istanbul ignore else */
386
406
  if (!mapGet(scheduleRunning, scheduleId)) {
@@ -416,7 +436,10 @@ const createCustomPersister = (
416
436
  load: async (initialTables, initialValues) =>
417
437
  await loadLock(async () => {
418
438
  try {
419
- store.setContent(await getPersisted());
439
+ const content = await getPersisted();
440
+ (supportsMergeableStore && isString(content[0])
441
+ ? store.applyMergeableChanges
442
+ : store.setContent)(content);
420
443
  } catch {
421
444
  store.setContent([initialTables, initialValues]);
422
445
  }
@@ -426,16 +449,14 @@ const createCustomPersister = (
426
449
  await persister.load(initialTables, initialValues);
427
450
  listening = 1;
428
451
  listeningHandle = addPersisterListener(
429
- async (getContent, getTransactionChanges) => {
430
- if (getTransactionChanges) {
431
- const transactionChanges = getTransactionChanges();
432
- await loadLock(async () =>
433
- store.setTransactionChanges(transactionChanges),
434
- );
452
+ async (getContent2, getChanges2) => {
453
+ if (getChanges2) {
454
+ const changes = getChanges2();
455
+ await loadLock(async () => store.applyChanges(changes));
435
456
  } else {
436
457
  await loadLock(async () => {
437
458
  try {
438
- store.setContent(getContent?.() ?? (await getPersisted()));
459
+ store.setContent(getContent2?.() ?? (await getPersisted()));
439
460
  } catch (error) {
440
461
  onIgnoredError?.(error);
441
462
  }
@@ -453,7 +474,7 @@ const createCustomPersister = (
453
474
  }
454
475
  return persister;
455
476
  },
456
- save: async (getTransactionChanges) => {
477
+ save: async (getChanges2) => {
457
478
  /* istanbul ignore else */
458
479
  if (loadSave != 1) {
459
480
  loadSave = 2;
@@ -462,7 +483,7 @@ const createCustomPersister = (
462
483
  }
463
484
  await persister.schedule(async () => {
464
485
  try {
465
- await setPersisted(store.getContent, getTransactionChanges);
486
+ await setPersisted(getContent, getChanges2);
466
487
  } catch (error) {
467
488
  /* istanbul ignore next */
468
489
  onIgnoredError?.(error);
@@ -474,14 +495,12 @@ const createCustomPersister = (
474
495
  },
475
496
  startAutoSave: async () => {
476
497
  await persister.stopAutoSave().save();
477
- listenerId = store.addDidFinishTransactionListener(
478
- (_store, getTransactionChanges) => {
479
- const [tableChanges, valueChanges] = getTransactionChanges();
480
- if (!objIsEmpty(tableChanges) || !objIsEmpty(valueChanges)) {
481
- persister.save(() => [tableChanges, valueChanges]);
482
- }
483
- },
484
- );
498
+ listenerId = store.addDidFinishTransactionListener(() => {
499
+ const [tableChanges, valueChanges] = getChanges();
500
+ if (!objIsEmpty(tableChanges) || !objIsEmpty(valueChanges)) {
501
+ persister.save(() => [tableChanges, valueChanges]);
502
+ }
503
+ });
485
504
  return persister;
486
505
  },
487
506
  stopAutoSave: () => {
@@ -547,6 +566,7 @@ const createJsonSqlitePersister = (
547
566
  addPersisterListener,
548
567
  delPersisterListener,
549
568
  onIgnoredError,
569
+ false,
550
570
  [getThing, db],
551
571
  db,
552
572
  );
@@ -567,9 +587,10 @@ const createTabularSqlitePersister = (
567
587
  managedTableNames,
568
588
  db,
569
589
  getThing,
590
+ useOnConflict,
570
591
  ) => {
571
592
  const [refreshSchema, loadTable, saveTable, transaction] =
572
- getCommandFunctions(cmd, managedTableNames, onIgnoredError);
593
+ getCommandFunctions(cmd, managedTableNames, onIgnoredError, useOnConflict);
573
594
  const saveTables = async (tables, partial) =>
574
595
  await promiseAll(
575
596
  mapMap(
@@ -578,12 +599,11 @@ const createTabularSqlitePersister = (
578
599
  [tableName, rowIdColumnName, deleteEmptyColumns, deleteEmptyTable],
579
600
  tableId,
580
601
  ) => {
581
- const table = tables[tableId];
582
- if (!partial || table !== void 0) {
602
+ if (!partial || objHas(tables, tableId)) {
583
603
  await saveTable(
584
604
  tableName,
585
605
  rowIdColumnName,
586
- table,
606
+ tables[tableId],
587
607
  deleteEmptyColumns,
588
608
  deleteEmptyTable,
589
609
  partial,
@@ -633,11 +653,11 @@ const createTabularSqlitePersister = (
633
653
  ? [tables, values]
634
654
  : void 0;
635
655
  });
636
- const setPersisted = async (getContent, getTransactionChanges) =>
656
+ const setPersisted = async (getContent, getChanges) =>
637
657
  await transaction(async () => {
638
658
  await refreshSchema();
639
- if (!isUndefined(getTransactionChanges)) {
640
- const [tableChanges, valueChanges] = getTransactionChanges();
659
+ if (!isUndefined(getChanges)) {
660
+ const [tableChanges, valueChanges] = getChanges();
641
661
  await saveTables(tableChanges, true);
642
662
  await saveValues(valueChanges, true);
643
663
  } else {
@@ -653,6 +673,7 @@ const createTabularSqlitePersister = (
653
673
  addPersisterListener,
654
674
  delPersisterListener,
655
675
  onIgnoredError,
676
+ false,
656
677
  [getThing, db],
657
678
  db,
658
679
  );
@@ -765,6 +786,7 @@ const createSqlitePersister = (
765
786
  onIgnoredError,
766
787
  db,
767
788
  getThing = 'getDb',
789
+ useOnConflict,
768
790
  ) => {
769
791
  let dataVersion;
770
792
  let schemaVersion;
@@ -827,6 +849,7 @@ const createSqlitePersister = (
827
849
  collValues(managedTableNamesSet),
828
850
  db,
829
851
  getThing,
852
+ useOnConflict,
830
853
  );
831
854
  };
832
855
 
@@ -57,8 +57,7 @@ const isObject = (obj) =>
57
57
  );
58
58
  const objNew = (entries = []) => object.fromEntries(entries);
59
59
  const objMerge = (...objs) => object.assign({}, ...objs);
60
- const objGet = (obj, id) => ifNotUndefined(obj, (obj2) => obj2[id]);
61
- const objHas = (obj, id) => !isUndefined(objGet(obj, id));
60
+ const objHas = (obj, id) => id in obj;
62
61
  const objDel = (obj, id) => {
63
62
  delete obj[id];
64
63
  return obj;
@@ -101,7 +100,12 @@ const setAdd = (set, value) => set?.add(value);
101
100
  const SELECT_STAR_FROM = SELECT + '*FROM';
102
101
  const FROM_PRAGMA_TABLE = 'FROM pragma_table_';
103
102
  const WHERE = 'WHERE';
104
- const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
103
+ const getCommandFunctions = (
104
+ cmd,
105
+ managedTableNames,
106
+ onIgnoredError,
107
+ useOnConflict,
108
+ ) => {
105
109
  const schemaMap = mapNew();
106
110
  const canSelect = (tableName, rowIdColumnName) =>
107
111
  !isUndefined(mapGet(mapGet(schemaMap, tableName), rowIdColumnName));
@@ -114,7 +118,7 @@ const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
114
118
  await cmd(
115
119
  'SELECT name ' +
116
120
  FROM_PRAGMA_TABLE +
117
- `list WHERE schema='main'AND type='table'AND name IN(` +
121
+ `list WHERE schema='main'AND(type='table'OR type='view')AND name IN(` +
118
122
  getPlaceholders(managedTableNames) +
119
123
  `)ORDER BY name`,
120
124
  managedTableNames,
@@ -169,16 +173,18 @@ const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
169
173
  const saveTable = async (
170
174
  tableName,
171
175
  rowIdColumnName,
172
- table,
176
+ content,
173
177
  deleteEmptyColumns,
174
178
  deleteEmptyTable,
175
179
  partial = false,
176
180
  ) => {
177
- const tableCellIds = setNew();
178
- objToArray(table ?? {}, (row) =>
179
- arrayMap(objIds(row ?? {}), (cellId) => setAdd(tableCellIds, cellId)),
181
+ const tableCellOrValueIds = setNew();
182
+ objToArray(content ?? {}, (contentRow) =>
183
+ arrayMap(objIds(contentRow ?? {}), (cellOrValueId) =>
184
+ setAdd(tableCellOrValueIds, cellOrValueId),
185
+ ),
180
186
  );
181
- const tableColumnNames = collValues(tableCellIds);
187
+ const tableColumnNames = collValues(tableCellOrValueIds);
182
188
  if (
183
189
  !partial &&
184
190
  deleteEmptyTable &&
@@ -236,11 +242,11 @@ const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
236
242
  ]);
237
243
  }
238
244
  if (partial) {
239
- if (isUndefined(table)) {
245
+ if (isUndefined(content)) {
240
246
  await cmd('DELETE FROM' + escapeId(tableName) + 'WHERE 1');
241
247
  } else {
242
248
  await promiseAll(
243
- objToArray(table, async (row, rowId) => {
249
+ objToArray(content, async (row, rowId) => {
244
250
  if (isUndefined(row)) {
245
251
  await cmd(
246
252
  'DELETE FROM' +
@@ -251,10 +257,14 @@ const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
251
257
  [rowId],
252
258
  );
253
259
  } else if (!arrayIsEmpty(tableColumnNames)) {
254
- await upsert(cmd, tableName, rowIdColumnName, objIds(row), [
255
- rowId,
256
- ...objValues(row),
257
- ]);
260
+ await upsert(
261
+ cmd,
262
+ tableName,
263
+ rowIdColumnName,
264
+ objIds(row),
265
+ [rowId, ...objValues(row)],
266
+ useOnConflict,
267
+ );
258
268
  }
259
269
  }),
260
270
  );
@@ -267,7 +277,7 @@ const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
267
277
  );
268
278
  const args = [];
269
279
  const deleteRowIds = [];
270
- objToArray(table ?? {}, (row, rowId) => {
280
+ objToArray(content ?? {}, (row, rowId) => {
271
281
  arrayPush(
272
282
  args,
273
283
  rowId,
@@ -316,9 +326,12 @@ const upsert = async (
316
326
  rowIdColumnName,
317
327
  changingColumnNames,
318
328
  args,
329
+ useOnConflict = true,
319
330
  ) =>
320
331
  await cmd(
321
- 'INSERT INTO' +
332
+ 'INSERT ' +
333
+ (useOnConflict ? EMPTY_STRING : 'OR REPLACE ') +
334
+ 'INTO' +
322
335
  escapeId(tableName) +
323
336
  '(' +
324
337
  escapeId(rowIdColumnName) +
@@ -336,18 +349,20 @@ const upsert = async (
336
349
  ),
337
350
  1,
338
351
  ) +
339
- 'ON CONFLICT(' +
340
- escapeId(rowIdColumnName) +
341
- ')DO UPDATE SET' +
342
- arrayJoin(
343
- arrayMap(
344
- changingColumnNames,
345
- (columnName) =>
346
- escapeId(columnName) + '=excluded.' + escapeId(columnName),
347
- ),
348
- COMMA,
349
- ),
350
- args,
352
+ (useOnConflict
353
+ ? 'ON CONFLICT(' +
354
+ escapeId(rowIdColumnName) +
355
+ ')DO UPDATE SET' +
356
+ arrayJoin(
357
+ arrayMap(
358
+ changingColumnNames,
359
+ (columnName) =>
360
+ escapeId(columnName) + '=excluded.' + escapeId(columnName),
361
+ ),
362
+ COMMA,
363
+ )
364
+ : EMPTY_STRING),
365
+ arrayMap(args, (arg) => arg ?? null),
351
366
  );
352
367
  const getPlaceholders = (array) =>
353
368
  arrayJoin(
@@ -370,6 +385,7 @@ const createCustomPersister = (
370
385
  addPersisterListener,
371
386
  delPersisterListener,
372
387
  onIgnoredError,
388
+ supportsMergeableStore,
373
389
  [getThing, thing] = [],
374
390
  scheduleId = [],
375
391
  ) => {
@@ -382,6 +398,10 @@ const createCustomPersister = (
382
398
  let listeningHandle;
383
399
  mapEnsure(scheduleRunning, scheduleId, () => 0);
384
400
  mapEnsure(scheduleActions, scheduleId, () => []);
401
+ const getContent =
402
+ (supportsMergeableStore ? store.getMergeableContent : null) ??
403
+ store.getContent;
404
+ const getChanges = store.getTransactionChanges;
385
405
  const run = async () => {
386
406
  /* istanbul ignore else */
387
407
  if (!mapGet(scheduleRunning, scheduleId)) {
@@ -417,7 +437,10 @@ const createCustomPersister = (
417
437
  load: async (initialTables, initialValues) =>
418
438
  await loadLock(async () => {
419
439
  try {
420
- store.setContent(await getPersisted());
440
+ const content = await getPersisted();
441
+ (supportsMergeableStore && isString(content[0])
442
+ ? store.applyMergeableChanges
443
+ : store.setContent)(content);
421
444
  } catch {
422
445
  store.setContent([initialTables, initialValues]);
423
446
  }
@@ -427,16 +450,14 @@ const createCustomPersister = (
427
450
  await persister.load(initialTables, initialValues);
428
451
  listening = 1;
429
452
  listeningHandle = addPersisterListener(
430
- async (getContent, getTransactionChanges) => {
431
- if (getTransactionChanges) {
432
- const transactionChanges = getTransactionChanges();
433
- await loadLock(async () =>
434
- store.setTransactionChanges(transactionChanges),
435
- );
453
+ async (getContent2, getChanges2) => {
454
+ if (getChanges2) {
455
+ const changes = getChanges2();
456
+ await loadLock(async () => store.applyChanges(changes));
436
457
  } else {
437
458
  await loadLock(async () => {
438
459
  try {
439
- store.setContent(getContent?.() ?? (await getPersisted()));
460
+ store.setContent(getContent2?.() ?? (await getPersisted()));
440
461
  } catch (error) {
441
462
  onIgnoredError?.(error);
442
463
  }
@@ -454,7 +475,7 @@ const createCustomPersister = (
454
475
  }
455
476
  return persister;
456
477
  },
457
- save: async (getTransactionChanges) => {
478
+ save: async (getChanges2) => {
458
479
  /* istanbul ignore else */
459
480
  if (loadSave != 1) {
460
481
  loadSave = 2;
@@ -463,7 +484,7 @@ const createCustomPersister = (
463
484
  }
464
485
  await persister.schedule(async () => {
465
486
  try {
466
- await setPersisted(store.getContent, getTransactionChanges);
487
+ await setPersisted(getContent, getChanges2);
467
488
  } catch (error) {
468
489
  /* istanbul ignore next */
469
490
  onIgnoredError?.(error);
@@ -475,14 +496,12 @@ const createCustomPersister = (
475
496
  },
476
497
  startAutoSave: async () => {
477
498
  await persister.stopAutoSave().save();
478
- listenerId = store.addDidFinishTransactionListener(
479
- (_store, getTransactionChanges) => {
480
- const [tableChanges, valueChanges] = getTransactionChanges();
481
- if (!objIsEmpty(tableChanges) || !objIsEmpty(valueChanges)) {
482
- persister.save(() => [tableChanges, valueChanges]);
483
- }
484
- },
485
- );
499
+ listenerId = store.addDidFinishTransactionListener(() => {
500
+ const [tableChanges, valueChanges] = getChanges();
501
+ if (!objIsEmpty(tableChanges) || !objIsEmpty(valueChanges)) {
502
+ persister.save(() => [tableChanges, valueChanges]);
503
+ }
504
+ });
486
505
  return persister;
487
506
  },
488
507
  stopAutoSave: () => {
@@ -548,6 +567,7 @@ const createJsonSqlitePersister = (
548
567
  addPersisterListener,
549
568
  delPersisterListener,
550
569
  onIgnoredError,
570
+ false,
551
571
  [getThing, db],
552
572
  db,
553
573
  );
@@ -568,9 +588,10 @@ const createTabularSqlitePersister = (
568
588
  managedTableNames,
569
589
  db,
570
590
  getThing,
591
+ useOnConflict,
571
592
  ) => {
572
593
  const [refreshSchema, loadTable, saveTable, transaction] =
573
- getCommandFunctions(cmd, managedTableNames, onIgnoredError);
594
+ getCommandFunctions(cmd, managedTableNames, onIgnoredError, useOnConflict);
574
595
  const saveTables = async (tables, partial) =>
575
596
  await promiseAll(
576
597
  mapMap(
@@ -579,12 +600,11 @@ const createTabularSqlitePersister = (
579
600
  [tableName, rowIdColumnName, deleteEmptyColumns, deleteEmptyTable],
580
601
  tableId,
581
602
  ) => {
582
- const table = tables[tableId];
583
- if (!partial || table !== void 0) {
603
+ if (!partial || objHas(tables, tableId)) {
584
604
  await saveTable(
585
605
  tableName,
586
606
  rowIdColumnName,
587
- table,
607
+ tables[tableId],
588
608
  deleteEmptyColumns,
589
609
  deleteEmptyTable,
590
610
  partial,
@@ -634,11 +654,11 @@ const createTabularSqlitePersister = (
634
654
  ? [tables, values]
635
655
  : void 0;
636
656
  });
637
- const setPersisted = async (getContent, getTransactionChanges) =>
657
+ const setPersisted = async (getContent, getChanges) =>
638
658
  await transaction(async () => {
639
659
  await refreshSchema();
640
- if (!isUndefined(getTransactionChanges)) {
641
- const [tableChanges, valueChanges] = getTransactionChanges();
660
+ if (!isUndefined(getChanges)) {
661
+ const [tableChanges, valueChanges] = getChanges();
642
662
  await saveTables(tableChanges, true);
643
663
  await saveValues(valueChanges, true);
644
664
  } else {
@@ -654,6 +674,7 @@ const createTabularSqlitePersister = (
654
674
  addPersisterListener,
655
675
  delPersisterListener,
656
676
  onIgnoredError,
677
+ false,
657
678
  [getThing, db],
658
679
  db,
659
680
  );
@@ -766,6 +787,7 @@ const createSqlitePersister = (
766
787
  onIgnoredError,
767
788
  db,
768
789
  getThing = 'getDb',
790
+ useOnConflict,
769
791
  ) => {
770
792
  let dataVersion;
771
793
  let schemaVersion;
@@ -828,6 +850,7 @@ const createSqlitePersister = (
828
850
  collValues(managedTableNamesSet),
829
851
  db,
830
852
  getThing,
853
+ useOnConflict,
831
854
  );
832
855
  };
833
856