tinybase 5.0.0-beta.2 → 5.0.0-beta.4

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 (274) 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 +223 -211
  82. package/lib/debug/persisters/persister-automerge.js +62 -41
  83. package/lib/debug/persisters/persister-browser.js +48 -16
  84. package/lib/debug/persisters/persister-cr-sqlite-wasm.js +97 -52
  85. package/lib/debug/persisters/persister-electric-sql.js +97 -52
  86. package/lib/debug/persisters/persister-expo-sqlite-next.js +97 -52
  87. package/lib/debug/persisters/persister-expo-sqlite.js +97 -52
  88. package/lib/debug/persisters/persister-file.js +47 -16
  89. package/lib/debug/persisters/persister-indexed-db.js +48 -18
  90. package/lib/debug/persisters/persister-partykit-client.js +46 -21
  91. package/lib/debug/persisters/persister-partykit-server.js +8 -18
  92. package/lib/debug/persisters/persister-remote.js +48 -16
  93. package/lib/debug/persisters/persister-sqlite-wasm.js +97 -52
  94. package/lib/debug/persisters/persister-sqlite3.js +97 -52
  95. package/lib/debug/persisters/persister-yjs.js +64 -40
  96. package/lib/debug/persisters.js +47 -16
  97. package/lib/debug/store.js +61 -83
  98. package/lib/debug/tinybase.js +264 -227
  99. package/lib/debug/tools.js +9 -11
  100. package/lib/debug/ui-react-dom.js +104 -99
  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 +43 -13
  180. package/lib/types/persisters/persister-browser.d.ts +2 -2
  181. package/lib/types/persisters/persister-file.d.ts +1 -1
  182. package/lib/types/persisters/persister-partykit-server.d.ts +7 -8
  183. package/lib/types/persisters.d.ts +61 -30
  184. package/lib/types/store.d.ts +153 -111
  185. package/lib/types/tools.d.ts +2 -2
  186. package/lib/types/with-schemas/mergeable-store.d.ts +46 -13
  187. package/lib/types/with-schemas/persisters/persister-browser.d.ts +2 -2
  188. package/lib/types/with-schemas/persisters/persister-file.d.ts +1 -1
  189. package/lib/types/with-schemas/persisters/persister-partykit-server.d.ts +10 -11
  190. package/lib/types/with-schemas/persisters.d.ts +88 -45
  191. package/lib/types/with-schemas/store.d.ts +165 -136
  192. package/lib/types/with-schemas/tools.d.ts +2 -2
  193. package/lib/umd/mergeable-store.js +1 -1
  194. package/lib/umd/mergeable-store.js.gz +0 -0
  195. package/lib/umd/persisters/persister-automerge.js +1 -1
  196. package/lib/umd/persisters/persister-automerge.js.gz +0 -0
  197. package/lib/umd/persisters/persister-browser.js +1 -1
  198. package/lib/umd/persisters/persister-browser.js.gz +0 -0
  199. package/lib/umd/persisters/persister-cr-sqlite-wasm.js +1 -1
  200. package/lib/umd/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  201. package/lib/umd/persisters/persister-electric-sql.js +1 -1
  202. package/lib/umd/persisters/persister-electric-sql.js.gz +0 -0
  203. package/lib/umd/persisters/persister-expo-sqlite-next.js +1 -1
  204. package/lib/umd/persisters/persister-expo-sqlite-next.js.gz +0 -0
  205. package/lib/umd/persisters/persister-expo-sqlite.js +1 -1
  206. package/lib/umd/persisters/persister-expo-sqlite.js.gz +0 -0
  207. package/lib/umd/persisters/persister-file.js +1 -1
  208. package/lib/umd/persisters/persister-file.js.gz +0 -0
  209. package/lib/umd/persisters/persister-indexed-db.js +1 -1
  210. package/lib/umd/persisters/persister-indexed-db.js.gz +0 -0
  211. package/lib/umd/persisters/persister-partykit-client.js +1 -1
  212. package/lib/umd/persisters/persister-partykit-client.js.gz +0 -0
  213. package/lib/umd/persisters/persister-partykit-server.js +1 -1
  214. package/lib/umd/persisters/persister-partykit-server.js.gz +0 -0
  215. package/lib/umd/persisters/persister-remote.js +1 -1
  216. package/lib/umd/persisters/persister-remote.js.gz +0 -0
  217. package/lib/umd/persisters/persister-sqlite-wasm.js +1 -1
  218. package/lib/umd/persisters/persister-sqlite-wasm.js.gz +0 -0
  219. package/lib/umd/persisters/persister-sqlite3.js +1 -1
  220. package/lib/umd/persisters/persister-sqlite3.js.gz +0 -0
  221. package/lib/umd/persisters/persister-yjs.js +1 -1
  222. package/lib/umd/persisters/persister-yjs.js.gz +0 -0
  223. package/lib/umd/persisters.js +1 -1
  224. package/lib/umd/persisters.js.gz +0 -0
  225. package/lib/umd/store.js +1 -1
  226. package/lib/umd/store.js.gz +0 -0
  227. package/lib/umd/tinybase.js +1 -1
  228. package/lib/umd/tinybase.js.gz +0 -0
  229. package/lib/umd/tools.js +1 -1
  230. package/lib/umd/tools.js.gz +0 -0
  231. package/lib/umd/ui-react-dom-debug.js +1 -1
  232. package/lib/umd/ui-react-dom-debug.js.gz +0 -0
  233. package/lib/umd-es6/mergeable-store.js +1 -1
  234. package/lib/umd-es6/mergeable-store.js.gz +0 -0
  235. package/lib/umd-es6/persisters/persister-automerge.js +1 -1
  236. package/lib/umd-es6/persisters/persister-automerge.js.gz +0 -0
  237. package/lib/umd-es6/persisters/persister-browser.js +1 -1
  238. package/lib/umd-es6/persisters/persister-browser.js.gz +0 -0
  239. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  240. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  241. package/lib/umd-es6/persisters/persister-electric-sql.js +1 -1
  242. package/lib/umd-es6/persisters/persister-electric-sql.js.gz +0 -0
  243. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js +1 -1
  244. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
  245. package/lib/umd-es6/persisters/persister-expo-sqlite.js +1 -1
  246. package/lib/umd-es6/persisters/persister-expo-sqlite.js.gz +0 -0
  247. package/lib/umd-es6/persisters/persister-file.js +1 -1
  248. package/lib/umd-es6/persisters/persister-file.js.gz +0 -0
  249. package/lib/umd-es6/persisters/persister-indexed-db.js +1 -1
  250. package/lib/umd-es6/persisters/persister-indexed-db.js.gz +0 -0
  251. package/lib/umd-es6/persisters/persister-partykit-client.js +1 -1
  252. package/lib/umd-es6/persisters/persister-partykit-client.js.gz +0 -0
  253. package/lib/umd-es6/persisters/persister-partykit-server.js +1 -1
  254. package/lib/umd-es6/persisters/persister-partykit-server.js.gz +0 -0
  255. package/lib/umd-es6/persisters/persister-remote.js +1 -1
  256. package/lib/umd-es6/persisters/persister-remote.js.gz +0 -0
  257. package/lib/umd-es6/persisters/persister-sqlite-wasm.js +1 -1
  258. package/lib/umd-es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  259. package/lib/umd-es6/persisters/persister-sqlite3.js +1 -1
  260. package/lib/umd-es6/persisters/persister-sqlite3.js.gz +0 -0
  261. package/lib/umd-es6/persisters/persister-yjs.js +1 -1
  262. package/lib/umd-es6/persisters/persister-yjs.js.gz +0 -0
  263. package/lib/umd-es6/persisters.js +1 -1
  264. package/lib/umd-es6/persisters.js.gz +0 -0
  265. package/lib/umd-es6/store.js +1 -1
  266. package/lib/umd-es6/store.js.gz +0 -0
  267. package/lib/umd-es6/tinybase.js +1 -1
  268. package/lib/umd-es6/tinybase.js.gz +0 -0
  269. package/lib/umd-es6/tools.js +1 -1
  270. package/lib/umd-es6/tools.js.gz +0 -0
  271. package/lib/umd-es6/ui-react-dom-debug.js +1 -1
  272. package/lib/umd-es6/ui-react-dom-debug.js.gz +0 -0
  273. package/package.json +29 -25
  274. package/readme.md +2 -2
@@ -55,8 +55,7 @@ const isObject = (obj) =>
55
55
  );
56
56
  const objNew = (entries = []) => object.fromEntries(entries);
57
57
  const objMerge = (...objs) => object.assign({}, ...objs);
58
- const objGet = (obj, id) => ifNotUndefined(obj, (obj2) => obj2[id]);
59
- const objHas = (obj, id) => !isUndefined(objGet(obj, id));
58
+ const objHas = (obj, id) => id in obj;
60
59
  const objDel = (obj, id) => {
61
60
  delete obj[id];
62
61
  return obj;
@@ -99,7 +98,12 @@ const setAdd = (set, value) => set?.add(value);
99
98
  const SELECT_STAR_FROM = SELECT + '*FROM';
100
99
  const FROM_PRAGMA_TABLE = 'FROM pragma_table_';
101
100
  const WHERE = 'WHERE';
102
- const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
101
+ const getCommandFunctions = (
102
+ cmd,
103
+ managedTableNames,
104
+ onIgnoredError,
105
+ useOnConflict,
106
+ ) => {
103
107
  const schemaMap = mapNew();
104
108
  const canSelect = (tableName, rowIdColumnName) =>
105
109
  !isUndefined(mapGet(mapGet(schemaMap, tableName), rowIdColumnName));
@@ -112,7 +116,7 @@ const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
112
116
  await cmd(
113
117
  'SELECT name ' +
114
118
  FROM_PRAGMA_TABLE +
115
- `list WHERE schema='main'AND type='table'AND name IN(` +
119
+ `list WHERE schema='main'AND(type='table'OR type='view')AND name IN(` +
116
120
  getPlaceholders(managedTableNames) +
117
121
  `)ORDER BY name`,
118
122
  managedTableNames,
@@ -167,16 +171,18 @@ const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
167
171
  const saveTable = async (
168
172
  tableName,
169
173
  rowIdColumnName,
170
- table,
174
+ content,
171
175
  deleteEmptyColumns,
172
176
  deleteEmptyTable,
173
177
  partial = false,
174
178
  ) => {
175
- const tableCellIds = setNew();
176
- objToArray(table ?? {}, (row) =>
177
- arrayMap(objIds(row ?? {}), (cellId) => setAdd(tableCellIds, cellId)),
179
+ const tableCellOrValueIds = setNew();
180
+ objToArray(content ?? {}, (contentRow) =>
181
+ arrayMap(objIds(contentRow ?? {}), (cellOrValueId) =>
182
+ setAdd(tableCellOrValueIds, cellOrValueId),
183
+ ),
178
184
  );
179
- const tableColumnNames = collValues(tableCellIds);
185
+ const tableColumnNames = collValues(tableCellOrValueIds);
180
186
  if (
181
187
  !partial &&
182
188
  deleteEmptyTable &&
@@ -234,11 +240,11 @@ const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
234
240
  ]);
235
241
  }
236
242
  if (partial) {
237
- if (isUndefined(table)) {
243
+ if (isUndefined(content)) {
238
244
  await cmd('DELETE FROM' + escapeId(tableName) + 'WHERE 1');
239
245
  } else {
240
246
  await promiseAll(
241
- objToArray(table, async (row, rowId) => {
247
+ objToArray(content, async (row, rowId) => {
242
248
  if (isUndefined(row)) {
243
249
  await cmd(
244
250
  'DELETE FROM' +
@@ -249,10 +255,14 @@ const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
249
255
  [rowId],
250
256
  );
251
257
  } else if (!arrayIsEmpty(tableColumnNames)) {
252
- await upsert(cmd, tableName, rowIdColumnName, objIds(row), [
253
- rowId,
254
- ...objValues(row),
255
- ]);
258
+ await upsert(
259
+ cmd,
260
+ tableName,
261
+ rowIdColumnName,
262
+ objIds(row),
263
+ [rowId, ...objValues(row)],
264
+ useOnConflict,
265
+ );
256
266
  }
257
267
  }),
258
268
  );
@@ -265,7 +275,7 @@ const getCommandFunctions = (cmd, managedTableNames, onIgnoredError) => {
265
275
  );
266
276
  const args = [];
267
277
  const deleteRowIds = [];
268
- objToArray(table ?? {}, (row, rowId) => {
278
+ objToArray(content ?? {}, (row, rowId) => {
269
279
  arrayPush(
270
280
  args,
271
281
  rowId,
@@ -314,9 +324,12 @@ const upsert = async (
314
324
  rowIdColumnName,
315
325
  changingColumnNames,
316
326
  args,
327
+ useOnConflict = true,
317
328
  ) =>
318
329
  await cmd(
319
- 'INSERT INTO' +
330
+ 'INSERT ' +
331
+ (useOnConflict ? EMPTY_STRING : 'OR REPLACE ') +
332
+ 'INTO' +
320
333
  escapeId(tableName) +
321
334
  '(' +
322
335
  escapeId(rowIdColumnName) +
@@ -334,18 +347,20 @@ const upsert = async (
334
347
  ),
335
348
  1,
336
349
  ) +
337
- 'ON CONFLICT(' +
338
- escapeId(rowIdColumnName) +
339
- ')DO UPDATE SET' +
340
- arrayJoin(
341
- arrayMap(
342
- changingColumnNames,
343
- (columnName) =>
344
- escapeId(columnName) + '=excluded.' + escapeId(columnName),
345
- ),
346
- COMMA,
347
- ),
348
- args,
350
+ (useOnConflict
351
+ ? 'ON CONFLICT(' +
352
+ escapeId(rowIdColumnName) +
353
+ ')DO UPDATE SET' +
354
+ arrayJoin(
355
+ arrayMap(
356
+ changingColumnNames,
357
+ (columnName) =>
358
+ escapeId(columnName) + '=excluded.' + escapeId(columnName),
359
+ ),
360
+ COMMA,
361
+ )
362
+ : EMPTY_STRING),
363
+ arrayMap(args, (arg) => arg ?? null),
349
364
  );
350
365
  const getPlaceholders = (array) =>
351
366
  arrayJoin(
@@ -361,6 +376,23 @@ const jsonParse = JSON.parse;
361
376
 
362
377
  const scheduleRunning = mapNew();
363
378
  const scheduleActions = mapNew();
379
+ const isMergeable = (contentOrChanges) => isString(contentOrChanges?.[0]);
380
+ const getStoreFunctions = (supportsMergeableStore, store) =>
381
+ !supportsMergeableStore || isUndefined(store.getMergeableContent)
382
+ ? [
383
+ 0,
384
+ store.getContent,
385
+ store.getTransactionChanges,
386
+ ([changedTables, changedValues]) =>
387
+ !objIsEmpty(changedTables) || !objIsEmpty(changedValues),
388
+ ]
389
+ : [
390
+ 1,
391
+ store.getMergeableContent,
392
+ store.getTransactionMergeableChanges,
393
+ ([, [[, changedTables], [, changedValues]]]) =>
394
+ !objIsEmpty(changedTables) || !objIsEmpty(changedValues),
395
+ ];
364
396
  const createCustomPersister = (
365
397
  store,
366
398
  getPersisted,
@@ -368,6 +400,7 @@ const createCustomPersister = (
368
400
  addPersisterListener,
369
401
  delPersisterListener,
370
402
  onIgnoredError,
403
+ supportsMergeableStore,
371
404
  [getThing, thing] = [],
372
405
  scheduleId = [],
373
406
  ) => {
@@ -380,6 +413,8 @@ const createCustomPersister = (
380
413
  let listeningHandle;
381
414
  mapEnsure(scheduleRunning, scheduleId, () => 0);
382
415
  mapEnsure(scheduleActions, scheduleId, () => []);
416
+ const [isMergeableStore, getContent, getChanges, hasChanges] =
417
+ getStoreFunctions(supportsMergeableStore, store);
383
418
  const run = async () => {
384
419
  /* istanbul ignore else */
385
420
  if (!mapGet(scheduleRunning, scheduleId)) {
@@ -415,7 +450,10 @@ const createCustomPersister = (
415
450
  load: async (initialTables, initialValues) =>
416
451
  await loadLock(async () => {
417
452
  try {
418
- store.setContent(await getPersisted());
453
+ const content = await getPersisted();
454
+ (isMergeableStore && isMergeable(content)
455
+ ? store.setMergeableContent
456
+ : store.setContent)(content);
419
457
  } catch {
420
458
  store.setContent([initialTables, initialValues]);
421
459
  }
@@ -425,16 +463,21 @@ const createCustomPersister = (
425
463
  await persister.load(initialTables, initialValues);
426
464
  listening = 1;
427
465
  listeningHandle = addPersisterListener(
428
- async (getContent, getTransactionChanges) => {
429
- if (getTransactionChanges) {
430
- const transactionChanges = getTransactionChanges();
466
+ async (getContent2, getChanges2) => {
467
+ if (getChanges2) {
468
+ const changes = getChanges2();
431
469
  await loadLock(async () =>
432
- store.setTransactionChanges(transactionChanges),
470
+ (isMergeableStore && isMergeable(changes)
471
+ ? store.applyMergeableChanges
472
+ : store.applyChanges)(changes),
433
473
  );
434
474
  } else {
435
475
  await loadLock(async () => {
436
476
  try {
437
- store.setContent(getContent?.() ?? (await getPersisted()));
477
+ const content = getContent2?.() ?? (await getPersisted());
478
+ (isMergeableStore && isMergeable(content)
479
+ ? store.setMergeableContent
480
+ : store.setContent)(content);
438
481
  } catch (error) {
439
482
  onIgnoredError?.(error);
440
483
  }
@@ -452,7 +495,7 @@ const createCustomPersister = (
452
495
  }
453
496
  return persister;
454
497
  },
455
- save: async (getTransactionChanges) => {
498
+ save: async (getChanges2) => {
456
499
  /* istanbul ignore else */
457
500
  if (loadSave != 1) {
458
501
  loadSave = 2;
@@ -461,7 +504,7 @@ const createCustomPersister = (
461
504
  }
462
505
  await persister.schedule(async () => {
463
506
  try {
464
- await setPersisted(store.getContent, getTransactionChanges);
507
+ await setPersisted(getContent, getChanges2);
465
508
  } catch (error) {
466
509
  /* istanbul ignore next */
467
510
  onIgnoredError?.(error);
@@ -473,14 +516,12 @@ const createCustomPersister = (
473
516
  },
474
517
  startAutoSave: async () => {
475
518
  await persister.stopAutoSave().save();
476
- listenerId = store.addDidFinishTransactionListener(
477
- (_store, getTransactionChanges) => {
478
- const [tableChanges, valueChanges] = getTransactionChanges();
479
- if (!objIsEmpty(tableChanges) || !objIsEmpty(valueChanges)) {
480
- persister.save(() => [tableChanges, valueChanges]);
481
- }
482
- },
483
- );
519
+ listenerId = store.addDidFinishTransactionListener(() => {
520
+ const changes = getChanges();
521
+ if (hasChanges(changes)) {
522
+ persister.save(() => changes);
523
+ }
524
+ });
484
525
  return persister;
485
526
  },
486
527
  stopAutoSave: () => {
@@ -546,6 +587,7 @@ const createJsonSqlitePersister = (
546
587
  addPersisterListener,
547
588
  delPersisterListener,
548
589
  onIgnoredError,
590
+ false,
549
591
  [getThing, db],
550
592
  db,
551
593
  );
@@ -566,9 +608,10 @@ const createTabularSqlitePersister = (
566
608
  managedTableNames,
567
609
  db,
568
610
  getThing,
611
+ useOnConflict,
569
612
  ) => {
570
613
  const [refreshSchema, loadTable, saveTable, transaction] =
571
- getCommandFunctions(cmd, managedTableNames, onIgnoredError);
614
+ getCommandFunctions(cmd, managedTableNames, onIgnoredError, useOnConflict);
572
615
  const saveTables = async (tables, partial) =>
573
616
  await promiseAll(
574
617
  mapMap(
@@ -577,12 +620,11 @@ const createTabularSqlitePersister = (
577
620
  [tableName, rowIdColumnName, deleteEmptyColumns, deleteEmptyTable],
578
621
  tableId,
579
622
  ) => {
580
- const table = tables[tableId];
581
- if (!partial || table !== void 0) {
623
+ if (!partial || objHas(tables, tableId)) {
582
624
  await saveTable(
583
625
  tableName,
584
626
  rowIdColumnName,
585
- table,
627
+ tables[tableId],
586
628
  deleteEmptyColumns,
587
629
  deleteEmptyTable,
588
630
  partial,
@@ -632,11 +674,11 @@ const createTabularSqlitePersister = (
632
674
  ? [tables, values]
633
675
  : void 0;
634
676
  });
635
- const setPersisted = async (getContent, getTransactionChanges) =>
677
+ const setPersisted = async (getContent, getChanges) =>
636
678
  await transaction(async () => {
637
679
  await refreshSchema();
638
- if (!isUndefined(getTransactionChanges)) {
639
- const [tableChanges, valueChanges] = getTransactionChanges();
680
+ if (!isUndefined(getChanges)) {
681
+ const [tableChanges, valueChanges] = getChanges();
640
682
  await saveTables(tableChanges, true);
641
683
  await saveValues(valueChanges, true);
642
684
  } else {
@@ -652,6 +694,7 @@ const createTabularSqlitePersister = (
652
694
  addPersisterListener,
653
695
  delPersisterListener,
654
696
  onIgnoredError,
697
+ false,
655
698
  [getThing, db],
656
699
  db,
657
700
  );
@@ -764,6 +807,7 @@ const createSqlitePersister = (
764
807
  onIgnoredError,
765
808
  db,
766
809
  getThing = 'getDb',
810
+ useOnConflict,
767
811
  ) => {
768
812
  let dataVersion;
769
813
  let schemaVersion;
@@ -826,6 +870,7 @@ const createSqlitePersister = (
826
870
  collValues(managedTableNamesSet),
827
871
  db,
828
872
  getThing,
873
+ useOnConflict,
829
874
  );
830
875
  };
831
876
 
@@ -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(
@@ -362,6 +377,23 @@ const jsonParse = JSON.parse;
362
377
 
363
378
  const scheduleRunning = mapNew();
364
379
  const scheduleActions = mapNew();
380
+ const isMergeable = (contentOrChanges) => isString(contentOrChanges?.[0]);
381
+ const getStoreFunctions = (supportsMergeableStore, store) =>
382
+ !supportsMergeableStore || isUndefined(store.getMergeableContent)
383
+ ? [
384
+ 0,
385
+ store.getContent,
386
+ store.getTransactionChanges,
387
+ ([changedTables, changedValues]) =>
388
+ !objIsEmpty(changedTables) || !objIsEmpty(changedValues),
389
+ ]
390
+ : [
391
+ 1,
392
+ store.getMergeableContent,
393
+ store.getTransactionMergeableChanges,
394
+ ([, [[, changedTables], [, changedValues]]]) =>
395
+ !objIsEmpty(changedTables) || !objIsEmpty(changedValues),
396
+ ];
365
397
  const createCustomPersister = (
366
398
  store,
367
399
  getPersisted,
@@ -369,6 +401,7 @@ const createCustomPersister = (
369
401
  addPersisterListener,
370
402
  delPersisterListener,
371
403
  onIgnoredError,
404
+ supportsMergeableStore,
372
405
  [getThing, thing] = [],
373
406
  scheduleId = [],
374
407
  ) => {
@@ -381,6 +414,8 @@ const createCustomPersister = (
381
414
  let listeningHandle;
382
415
  mapEnsure(scheduleRunning, scheduleId, () => 0);
383
416
  mapEnsure(scheduleActions, scheduleId, () => []);
417
+ const [isMergeableStore, getContent, getChanges, hasChanges] =
418
+ getStoreFunctions(supportsMergeableStore, store);
384
419
  const run = async () => {
385
420
  /* istanbul ignore else */
386
421
  if (!mapGet(scheduleRunning, scheduleId)) {
@@ -416,7 +451,10 @@ const createCustomPersister = (
416
451
  load: async (initialTables, initialValues) =>
417
452
  await loadLock(async () => {
418
453
  try {
419
- store.setContent(await getPersisted());
454
+ const content = await getPersisted();
455
+ (isMergeableStore && isMergeable(content)
456
+ ? store.setMergeableContent
457
+ : store.setContent)(content);
420
458
  } catch {
421
459
  store.setContent([initialTables, initialValues]);
422
460
  }
@@ -426,16 +464,21 @@ const createCustomPersister = (
426
464
  await persister.load(initialTables, initialValues);
427
465
  listening = 1;
428
466
  listeningHandle = addPersisterListener(
429
- async (getContent, getTransactionChanges) => {
430
- if (getTransactionChanges) {
431
- const transactionChanges = getTransactionChanges();
467
+ async (getContent2, getChanges2) => {
468
+ if (getChanges2) {
469
+ const changes = getChanges2();
432
470
  await loadLock(async () =>
433
- store.setTransactionChanges(transactionChanges),
471
+ (isMergeableStore && isMergeable(changes)
472
+ ? store.applyMergeableChanges
473
+ : store.applyChanges)(changes),
434
474
  );
435
475
  } else {
436
476
  await loadLock(async () => {
437
477
  try {
438
- store.setContent(getContent?.() ?? (await getPersisted()));
478
+ const content = getContent2?.() ?? (await getPersisted());
479
+ (isMergeableStore && isMergeable(content)
480
+ ? store.setMergeableContent
481
+ : store.setContent)(content);
439
482
  } catch (error) {
440
483
  onIgnoredError?.(error);
441
484
  }
@@ -453,7 +496,7 @@ const createCustomPersister = (
453
496
  }
454
497
  return persister;
455
498
  },
456
- save: async (getTransactionChanges) => {
499
+ save: async (getChanges2) => {
457
500
  /* istanbul ignore else */
458
501
  if (loadSave != 1) {
459
502
  loadSave = 2;
@@ -462,7 +505,7 @@ const createCustomPersister = (
462
505
  }
463
506
  await persister.schedule(async () => {
464
507
  try {
465
- await setPersisted(store.getContent, getTransactionChanges);
508
+ await setPersisted(getContent, getChanges2);
466
509
  } catch (error) {
467
510
  /* istanbul ignore next */
468
511
  onIgnoredError?.(error);
@@ -474,14 +517,12 @@ const createCustomPersister = (
474
517
  },
475
518
  startAutoSave: async () => {
476
519
  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
- );
520
+ listenerId = store.addDidFinishTransactionListener(() => {
521
+ const changes = getChanges();
522
+ if (hasChanges(changes)) {
523
+ persister.save(() => changes);
524
+ }
525
+ });
485
526
  return persister;
486
527
  },
487
528
  stopAutoSave: () => {
@@ -547,6 +588,7 @@ const createJsonSqlitePersister = (
547
588
  addPersisterListener,
548
589
  delPersisterListener,
549
590
  onIgnoredError,
591
+ false,
550
592
  [getThing, db],
551
593
  db,
552
594
  );
@@ -567,9 +609,10 @@ const createTabularSqlitePersister = (
567
609
  managedTableNames,
568
610
  db,
569
611
  getThing,
612
+ useOnConflict,
570
613
  ) => {
571
614
  const [refreshSchema, loadTable, saveTable, transaction] =
572
- getCommandFunctions(cmd, managedTableNames, onIgnoredError);
615
+ getCommandFunctions(cmd, managedTableNames, onIgnoredError, useOnConflict);
573
616
  const saveTables = async (tables, partial) =>
574
617
  await promiseAll(
575
618
  mapMap(
@@ -578,12 +621,11 @@ const createTabularSqlitePersister = (
578
621
  [tableName, rowIdColumnName, deleteEmptyColumns, deleteEmptyTable],
579
622
  tableId,
580
623
  ) => {
581
- const table = tables[tableId];
582
- if (!partial || table !== void 0) {
624
+ if (!partial || objHas(tables, tableId)) {
583
625
  await saveTable(
584
626
  tableName,
585
627
  rowIdColumnName,
586
- table,
628
+ tables[tableId],
587
629
  deleteEmptyColumns,
588
630
  deleteEmptyTable,
589
631
  partial,
@@ -633,11 +675,11 @@ const createTabularSqlitePersister = (
633
675
  ? [tables, values]
634
676
  : void 0;
635
677
  });
636
- const setPersisted = async (getContent, getTransactionChanges) =>
678
+ const setPersisted = async (getContent, getChanges) =>
637
679
  await transaction(async () => {
638
680
  await refreshSchema();
639
- if (!isUndefined(getTransactionChanges)) {
640
- const [tableChanges, valueChanges] = getTransactionChanges();
681
+ if (!isUndefined(getChanges)) {
682
+ const [tableChanges, valueChanges] = getChanges();
641
683
  await saveTables(tableChanges, true);
642
684
  await saveValues(valueChanges, true);
643
685
  } else {
@@ -653,6 +695,7 @@ const createTabularSqlitePersister = (
653
695
  addPersisterListener,
654
696
  delPersisterListener,
655
697
  onIgnoredError,
698
+ false,
656
699
  [getThing, db],
657
700
  db,
658
701
  );
@@ -765,6 +808,7 @@ const createSqlitePersister = (
765
808
  onIgnoredError,
766
809
  db,
767
810
  getThing = 'getDb',
811
+ useOnConflict,
768
812
  ) => {
769
813
  let dataVersion;
770
814
  let schemaVersion;
@@ -827,6 +871,7 @@ const createSqlitePersister = (
827
871
  collValues(managedTableNamesSet),
828
872
  db,
829
873
  getThing,
874
+ useOnConflict,
830
875
  );
831
876
  };
832
877