tinybase 4.0.0-beta.3 → 4.0.0-beta.5

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 (282) hide show
  1. package/lib/cjs/persisters/persister-automerge.cjs +1 -0
  2. package/lib/cjs/persisters/persister-automerge.cjs.gz +0 -0
  3. package/lib/cjs/persisters/persister-browser.cjs +1 -0
  4. package/lib/cjs/persisters/persister-browser.cjs.gz +0 -0
  5. package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs +1 -0
  6. package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  7. package/lib/cjs/persisters/persister-file.cjs +1 -0
  8. package/lib/cjs/persisters/persister-file.cjs.gz +0 -0
  9. package/lib/cjs/persisters/persister-remote.cjs +1 -0
  10. package/lib/cjs/persisters/persister-remote.cjs.gz +0 -0
  11. package/lib/cjs/persisters/persister-sqlite-wasm.cjs +1 -0
  12. package/lib/cjs/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  13. package/lib/cjs/persisters/persister-sqlite3.cjs +1 -0
  14. package/lib/cjs/persisters/persister-sqlite3.cjs.gz +0 -0
  15. package/lib/cjs/persisters/persister-yjs.cjs +1 -0
  16. package/lib/cjs/persisters/persister-yjs.cjs.gz +0 -0
  17. package/lib/cjs/persisters.cjs +1 -1
  18. package/lib/cjs/persisters.cjs.gz +0 -0
  19. package/lib/cjs/queries.cjs +1 -1
  20. package/lib/cjs/queries.cjs.gz +0 -0
  21. package/lib/cjs/store.cjs +1 -1
  22. package/lib/cjs/store.cjs.gz +0 -0
  23. package/lib/cjs/tinybase.cjs +1 -1
  24. package/lib/cjs/tinybase.cjs.gz +0 -0
  25. package/lib/cjs/tools.cjs +1 -1
  26. package/lib/cjs/tools.cjs.gz +0 -0
  27. package/lib/cjs/ui-react.cjs +1 -1
  28. package/lib/cjs/ui-react.cjs.gz +0 -0
  29. package/lib/cjs-es6/persisters/persister-automerge.cjs +1 -0
  30. package/lib/cjs-es6/persisters/persister-automerge.cjs.gz +0 -0
  31. package/lib/cjs-es6/persisters/persister-browser.cjs +1 -0
  32. package/lib/cjs-es6/persisters/persister-browser.cjs.gz +0 -0
  33. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs +1 -0
  34. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  35. package/lib/cjs-es6/persisters/persister-file.cjs +1 -0
  36. package/lib/cjs-es6/persisters/persister-file.cjs.gz +0 -0
  37. package/lib/cjs-es6/persisters/persister-remote.cjs +1 -0
  38. package/lib/cjs-es6/persisters/persister-remote.cjs.gz +0 -0
  39. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs +1 -0
  40. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  41. package/lib/cjs-es6/persisters/persister-sqlite3.cjs +1 -0
  42. package/lib/cjs-es6/persisters/persister-sqlite3.cjs.gz +0 -0
  43. package/lib/cjs-es6/persisters/persister-yjs.cjs +1 -0
  44. package/lib/cjs-es6/persisters/persister-yjs.cjs.gz +0 -0
  45. package/lib/cjs-es6/persisters.cjs +1 -1
  46. package/lib/cjs-es6/persisters.cjs.gz +0 -0
  47. package/lib/cjs-es6/queries.cjs +1 -1
  48. package/lib/cjs-es6/queries.cjs.gz +0 -0
  49. package/lib/cjs-es6/store.cjs +1 -1
  50. package/lib/cjs-es6/store.cjs.gz +0 -0
  51. package/lib/cjs-es6/tinybase.cjs +1 -1
  52. package/lib/cjs-es6/tinybase.cjs.gz +0 -0
  53. package/lib/cjs-es6/tools.cjs +1 -1
  54. package/lib/cjs-es6/tools.cjs.gz +0 -0
  55. package/lib/cjs-es6/ui-react.cjs +1 -1
  56. package/lib/cjs-es6/ui-react.cjs.gz +0 -0
  57. package/lib/debug/{persister-automerge.js → persisters/persister-automerge.js} +57 -30
  58. package/lib/debug/{persister-browser.js → persisters/persister-browser.js} +48 -19
  59. package/lib/debug/persisters/persister-cr-sqlite-wasm.js +665 -0
  60. package/lib/debug/{persister-file.js → persisters/persister-file.js} +50 -24
  61. package/lib/debug/{persister-remote.js → persisters/persister-remote.js} +47 -18
  62. package/lib/debug/persisters/persister-sqlite-wasm.js +673 -0
  63. package/lib/debug/persisters/persister-sqlite3.js +676 -0
  64. package/lib/debug/{persister-yjs.js → persisters/persister-yjs.js} +48 -19
  65. package/lib/debug/persisters.js +46 -17
  66. package/lib/debug/queries.js +1 -1
  67. package/lib/debug/store.js +104 -40
  68. package/lib/debug/tinybase.js +148 -57
  69. package/lib/debug/tools.js +129 -27
  70. package/lib/debug/ui-react.js +24 -0
  71. package/lib/es6/persisters/persister-automerge.js +1 -0
  72. package/lib/es6/persisters/persister-automerge.js.gz +0 -0
  73. package/lib/es6/persisters/persister-browser.js +1 -0
  74. package/lib/es6/persisters/persister-browser.js.gz +0 -0
  75. package/lib/es6/persisters/persister-cr-sqlite-wasm.js +1 -0
  76. package/lib/es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  77. package/lib/es6/persisters/persister-file.js +1 -0
  78. package/lib/es6/persisters/persister-file.js.gz +0 -0
  79. package/lib/es6/persisters/persister-remote.js +1 -0
  80. package/lib/es6/persisters/persister-remote.js.gz +0 -0
  81. package/lib/es6/persisters/persister-sqlite-wasm.js +1 -0
  82. package/lib/es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  83. package/lib/es6/persisters/persister-sqlite3.js +1 -0
  84. package/lib/es6/persisters/persister-sqlite3.js.gz +0 -0
  85. package/lib/es6/persisters/persister-yjs.js +1 -0
  86. package/lib/es6/persisters/persister-yjs.js.gz +0 -0
  87. package/lib/es6/persisters.js +1 -1
  88. package/lib/es6/persisters.js.gz +0 -0
  89. package/lib/es6/queries.js +1 -1
  90. package/lib/es6/queries.js.gz +0 -0
  91. package/lib/es6/store.js +1 -1
  92. package/lib/es6/store.js.gz +0 -0
  93. package/lib/es6/tinybase.js +1 -1
  94. package/lib/es6/tinybase.js.gz +0 -0
  95. package/lib/es6/tools.js +1 -1
  96. package/lib/es6/tools.js.gz +0 -0
  97. package/lib/es6/ui-react.js +1 -1
  98. package/lib/es6/ui-react.js.gz +0 -0
  99. package/lib/persisters/persister-automerge.js +1 -0
  100. package/lib/persisters/persister-automerge.js.gz +0 -0
  101. package/lib/persisters/persister-browser.js +1 -0
  102. package/lib/persisters/persister-browser.js.gz +0 -0
  103. package/lib/persisters/persister-cr-sqlite-wasm.js +1 -0
  104. package/lib/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  105. package/lib/persisters/persister-file.js +1 -0
  106. package/lib/persisters/persister-file.js.gz +0 -0
  107. package/lib/persisters/persister-remote.js +1 -0
  108. package/lib/persisters/persister-remote.js.gz +0 -0
  109. package/lib/persisters/persister-sqlite-wasm.js +1 -0
  110. package/lib/persisters/persister-sqlite-wasm.js.gz +0 -0
  111. package/lib/persisters/persister-sqlite3.js +1 -0
  112. package/lib/persisters/persister-sqlite3.js.gz +0 -0
  113. package/lib/persisters/persister-yjs.js +1 -0
  114. package/lib/persisters/persister-yjs.js.gz +0 -0
  115. package/lib/persisters.js +1 -1
  116. package/lib/persisters.js.gz +0 -0
  117. package/lib/queries.js +1 -1
  118. package/lib/queries.js.gz +0 -0
  119. package/lib/store.js +1 -1
  120. package/lib/store.js.gz +0 -0
  121. package/lib/tinybase.js +1 -1
  122. package/lib/tinybase.js.gz +0 -0
  123. package/lib/tools.js +1 -1
  124. package/lib/tools.js.gz +0 -0
  125. package/lib/types/checkpoints.d.ts +0 -27
  126. package/lib/types/common.d.ts +0 -9
  127. package/lib/types/indexes.d.ts +0 -26
  128. package/lib/types/metrics.d.ts +0 -23
  129. package/lib/types/{persister-automerge.d.ts → persisters/persister-automerge.d.ts} +4 -6
  130. package/lib/types/{persister-browser.d.ts → persisters/persister-browser.d.ts} +2 -5
  131. package/lib/types/persisters/persister-cr-sqlite-wasm.d.ts +95 -0
  132. package/lib/types/{persister-file.d.ts → persisters/persister-file.d.ts} +3 -5
  133. package/lib/types/{persister-remote.d.ts → persisters/persister-remote.d.ts} +2 -4
  134. package/lib/types/persisters/persister-sqlite-wasm.d.ts +102 -0
  135. package/lib/types/persisters/persister-sqlite3.d.ts +109 -0
  136. package/lib/types/{persister-yjs.d.ts → persisters/persister-yjs.d.ts} +4 -6
  137. package/lib/types/persisters.d.ts +517 -27
  138. package/lib/types/queries.d.ts +52 -127
  139. package/lib/types/relationships.d.ts +0 -26
  140. package/lib/types/store.d.ts +397 -193
  141. package/lib/types/tinybase.d.ts +0 -1
  142. package/lib/types/tools.d.ts +15 -28
  143. package/lib/types/ui-react.d.ts +196 -181
  144. package/lib/types/with-schemas/checkpoints.d.ts +5 -32
  145. package/lib/types/with-schemas/common.d.ts +0 -9
  146. package/lib/types/with-schemas/indexes.d.ts +9 -35
  147. package/lib/types/with-schemas/metrics.d.ts +9 -32
  148. package/lib/types/with-schemas/{persister-automerge.d.ts → persisters/persister-automerge.d.ts} +4 -6
  149. package/lib/types/with-schemas/{persister-browser.d.ts → persisters/persister-browser.d.ts} +2 -5
  150. package/lib/types/with-schemas/persisters/persister-cr-sqlite-wasm.d.ts +105 -0
  151. package/lib/types/with-schemas/{persister-file.d.ts → persisters/persister-file.d.ts} +3 -5
  152. package/lib/types/with-schemas/{persister-remote.d.ts → persisters/persister-remote.d.ts} +2 -4
  153. package/lib/types/with-schemas/persisters/persister-sqlite-wasm.d.ts +113 -0
  154. package/lib/types/with-schemas/persisters/persister-sqlite3.d.ts +119 -0
  155. package/lib/types/with-schemas/{persister-yjs.d.ts → persisters/persister-yjs.d.ts} +4 -6
  156. package/lib/types/with-schemas/persisters.d.ts +534 -29
  157. package/lib/types/with-schemas/queries.d.ts +61 -224
  158. package/lib/types/with-schemas/relationships.d.ts +9 -35
  159. package/lib/types/with-schemas/store.d.ts +544 -236
  160. package/lib/types/with-schemas/tinybase.d.ts +0 -1
  161. package/lib/types/with-schemas/tools.d.ts +19 -32
  162. package/lib/types/with-schemas/ui-react.d.ts +221 -186
  163. package/lib/ui-react.js +1 -1
  164. package/lib/ui-react.js.gz +0 -0
  165. package/lib/umd/persisters/persister-automerge.js +1 -0
  166. package/lib/umd/persisters/persister-automerge.js.gz +0 -0
  167. package/lib/umd/persisters/persister-browser.js +1 -0
  168. package/lib/umd/persisters/persister-browser.js.gz +0 -0
  169. package/lib/umd/persisters/persister-cr-sqlite-wasm.js +1 -0
  170. package/lib/umd/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  171. package/lib/umd/persisters/persister-file.js +1 -0
  172. package/lib/umd/persisters/persister-file.js.gz +0 -0
  173. package/lib/umd/persisters/persister-remote.js +1 -0
  174. package/lib/umd/persisters/persister-remote.js.gz +0 -0
  175. package/lib/umd/persisters/persister-sqlite-wasm.js +1 -0
  176. package/lib/umd/persisters/persister-sqlite-wasm.js.gz +0 -0
  177. package/lib/umd/persisters/persister-sqlite3.js +1 -0
  178. package/lib/umd/persisters/persister-sqlite3.js.gz +0 -0
  179. package/lib/umd/persisters/persister-yjs.js +1 -0
  180. package/lib/umd/persisters/persister-yjs.js.gz +0 -0
  181. package/lib/umd/persisters.js +1 -1
  182. package/lib/umd/persisters.js.gz +0 -0
  183. package/lib/umd/queries.js +1 -1
  184. package/lib/umd/queries.js.gz +0 -0
  185. package/lib/umd/store.js +1 -1
  186. package/lib/umd/store.js.gz +0 -0
  187. package/lib/umd/tinybase.js +1 -1
  188. package/lib/umd/tinybase.js.gz +0 -0
  189. package/lib/umd/tools.js +1 -1
  190. package/lib/umd/tools.js.gz +0 -0
  191. package/lib/umd/ui-react.js +1 -1
  192. package/lib/umd/ui-react.js.gz +0 -0
  193. package/lib/umd-es6/persisters/persister-automerge.js +1 -0
  194. package/lib/umd-es6/persisters/persister-automerge.js.gz +0 -0
  195. package/lib/umd-es6/persisters/persister-browser.js +1 -0
  196. package/lib/umd-es6/persisters/persister-browser.js.gz +0 -0
  197. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js +1 -0
  198. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  199. package/lib/umd-es6/persisters/persister-file.js +1 -0
  200. package/lib/umd-es6/persisters/persister-file.js.gz +0 -0
  201. package/lib/umd-es6/persisters/persister-remote.js +1 -0
  202. package/lib/umd-es6/persisters/persister-remote.js.gz +0 -0
  203. package/lib/umd-es6/persisters/persister-sqlite-wasm.js +1 -0
  204. package/lib/umd-es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  205. package/lib/umd-es6/persisters/persister-sqlite3.js +1 -0
  206. package/lib/umd-es6/persisters/persister-sqlite3.js.gz +0 -0
  207. package/lib/umd-es6/persisters/persister-yjs.js +1 -0
  208. package/lib/umd-es6/persisters/persister-yjs.js.gz +0 -0
  209. package/lib/umd-es6/persisters.js +1 -1
  210. package/lib/umd-es6/persisters.js.gz +0 -0
  211. package/lib/umd-es6/queries.js +1 -1
  212. package/lib/umd-es6/queries.js.gz +0 -0
  213. package/lib/umd-es6/store.js +1 -1
  214. package/lib/umd-es6/store.js.gz +0 -0
  215. package/lib/umd-es6/tinybase.js +1 -1
  216. package/lib/umd-es6/tinybase.js.gz +0 -0
  217. package/lib/umd-es6/tools.js +1 -1
  218. package/lib/umd-es6/tools.js.gz +0 -0
  219. package/lib/umd-es6/ui-react.js +1 -1
  220. package/lib/umd-es6/ui-react.js.gz +0 -0
  221. package/package.json +39 -22
  222. package/readme.md +3 -3
  223. package/lib/cjs/persister-automerge.cjs +0 -1
  224. package/lib/cjs/persister-automerge.cjs.gz +0 -0
  225. package/lib/cjs/persister-browser.cjs +0 -1
  226. package/lib/cjs/persister-browser.cjs.gz +0 -0
  227. package/lib/cjs/persister-file.cjs +0 -1
  228. package/lib/cjs/persister-file.cjs.gz +0 -0
  229. package/lib/cjs/persister-remote.cjs +0 -1
  230. package/lib/cjs/persister-remote.cjs.gz +0 -0
  231. package/lib/cjs/persister-yjs.cjs +0 -1
  232. package/lib/cjs/persister-yjs.cjs.gz +0 -0
  233. package/lib/cjs-es6/persister-automerge.cjs +0 -1
  234. package/lib/cjs-es6/persister-automerge.cjs.gz +0 -0
  235. package/lib/cjs-es6/persister-browser.cjs +0 -1
  236. package/lib/cjs-es6/persister-browser.cjs.gz +0 -0
  237. package/lib/cjs-es6/persister-file.cjs +0 -1
  238. package/lib/cjs-es6/persister-file.cjs.gz +0 -0
  239. package/lib/cjs-es6/persister-remote.cjs +0 -1
  240. package/lib/cjs-es6/persister-remote.cjs.gz +0 -0
  241. package/lib/cjs-es6/persister-yjs.cjs +0 -1
  242. package/lib/cjs-es6/persister-yjs.cjs.gz +0 -0
  243. package/lib/es6/persister-automerge.js +0 -1
  244. package/lib/es6/persister-automerge.js.gz +0 -0
  245. package/lib/es6/persister-browser.js +0 -1
  246. package/lib/es6/persister-browser.js.gz +0 -0
  247. package/lib/es6/persister-file.js +0 -1
  248. package/lib/es6/persister-file.js.gz +0 -0
  249. package/lib/es6/persister-remote.js +0 -1
  250. package/lib/es6/persister-remote.js.gz +0 -0
  251. package/lib/es6/persister-yjs.js +0 -1
  252. package/lib/es6/persister-yjs.js.gz +0 -0
  253. package/lib/persister-automerge.js +0 -1
  254. package/lib/persister-automerge.js.gz +0 -0
  255. package/lib/persister-browser.js +0 -1
  256. package/lib/persister-browser.js.gz +0 -0
  257. package/lib/persister-file.js +0 -1
  258. package/lib/persister-file.js.gz +0 -0
  259. package/lib/persister-remote.js +0 -1
  260. package/lib/persister-remote.js.gz +0 -0
  261. package/lib/persister-yjs.js +0 -1
  262. package/lib/persister-yjs.js.gz +0 -0
  263. package/lib/umd/persister-automerge.js +0 -1
  264. package/lib/umd/persister-automerge.js.gz +0 -0
  265. package/lib/umd/persister-browser.js +0 -1
  266. package/lib/umd/persister-browser.js.gz +0 -0
  267. package/lib/umd/persister-file.js +0 -1
  268. package/lib/umd/persister-file.js.gz +0 -0
  269. package/lib/umd/persister-remote.js +0 -1
  270. package/lib/umd/persister-remote.js.gz +0 -0
  271. package/lib/umd/persister-yjs.js +0 -1
  272. package/lib/umd/persister-yjs.js.gz +0 -0
  273. package/lib/umd-es6/persister-automerge.js +0 -1
  274. package/lib/umd-es6/persister-automerge.js.gz +0 -0
  275. package/lib/umd-es6/persister-browser.js +0 -1
  276. package/lib/umd-es6/persister-browser.js.gz +0 -0
  277. package/lib/umd-es6/persister-file.js +0 -1
  278. package/lib/umd-es6/persister-file.js.gz +0 -0
  279. package/lib/umd-es6/persister-remote.js +0 -1
  280. package/lib/umd-es6/persister-remote.js.gz +0 -0
  281. package/lib/umd-es6/persister-yjs.js +0 -1
  282. package/lib/umd-es6/persister-yjs.js.gz +0 -0
@@ -0,0 +1,665 @@
1
+ const getTypeOf = (thing) => typeof thing;
2
+ const TINYBASE = 'tinybase';
3
+ const EMPTY_STRING = '';
4
+ const COMMA = ',';
5
+ const STRING = getTypeOf(EMPTY_STRING);
6
+ const strRepeat = (str, count) => str.repeat(count);
7
+
8
+ const arrayJoin = (array, sep = EMPTY_STRING) => array.join(sep);
9
+ const arrayMap = (array, cb) => array.map(cb);
10
+ const arrayLength = (array) => array.length;
11
+ const arrayIsEmpty = (array) => arrayLength(array) == 0;
12
+ const arrayReduce = (array, cb, initial) => array.reduce(cb, initial);
13
+ const arrayFilter = (array, cb) => array.filter(cb);
14
+ const arraySlice = (array, start, end) => array.slice(start, end);
15
+ const arrayPush = (array, ...values) => array.push(...values);
16
+ const arrayShift = (array) => array.shift();
17
+
18
+ const promise = Promise;
19
+ const jsonString = (obj) =>
20
+ JSON.stringify(obj, (_key, value) =>
21
+ isInstanceOf(value, Map)
22
+ ? arrayReduce(
23
+ [...value],
24
+ (obj2, [key, value2]) => {
25
+ obj2[key] = value2;
26
+ return obj2;
27
+ },
28
+ {},
29
+ )
30
+ : value,
31
+ );
32
+ const jsonParse = JSON.parse;
33
+ const isInstanceOf = (thing, cls) => thing instanceof cls;
34
+ const isUndefined = (thing) => thing == void 0;
35
+ const ifNotUndefined = (value, then, otherwise) =>
36
+ isUndefined(value) ? otherwise?.() : then(value);
37
+ const isString = (thing) => getTypeOf(thing) == STRING;
38
+ const isArray = (thing) => Array.isArray(thing);
39
+ const promiseAll = async (promises) => promise.all(promises);
40
+
41
+ const object = Object;
42
+ const objIds = object.keys;
43
+ const objFreeze = object.freeze;
44
+ const isObject = (obj) =>
45
+ isInstanceOf(obj, object) && obj.constructor == object;
46
+ const objNew = (entries = []) => object.fromEntries(entries);
47
+ const objMerge = (...objs) => object.assign({}, ...objs);
48
+ const objGet = (obj, id) => ifNotUndefined(obj, (obj2) => obj2[id]);
49
+ const objHas = (obj, id) => !isUndefined(objGet(obj, id));
50
+ const objDel = (obj, id) => {
51
+ delete obj[id];
52
+ return obj;
53
+ };
54
+ const objMap = (obj, cb) =>
55
+ arrayMap(object.entries(obj), ([id, value]) => cb(value, id));
56
+ const objValues = (obj) => object.values(obj);
57
+ const objSize = (obj) => arrayLength(objIds(obj));
58
+ const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
59
+
60
+ const collHas = (coll, keyOrValue) => coll?.has(keyOrValue) ?? false;
61
+ const collValues = (coll) => [...(coll?.values() ?? [])];
62
+ const collForEach = (coll, cb) => coll?.forEach(cb);
63
+ const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
64
+
65
+ const mapNew = (entries) => new Map(entries);
66
+ const mapKeys = (map) => [...(map?.keys() ?? [])];
67
+ const mapGet = (map, key) => map?.get(key);
68
+ const mapForEach = (map, cb) =>
69
+ collForEach(map, (value, key) => cb(key, value));
70
+ const mapMap = (coll, cb) =>
71
+ arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
72
+ const mapSet = (map, key, value) =>
73
+ isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
74
+ const mapEnsure = (map, key, getDefaultValue) => {
75
+ if (!collHas(map, key)) {
76
+ mapSet(map, key, getDefaultValue());
77
+ }
78
+ return mapGet(map, key);
79
+ };
80
+ const mapMatch = (map, obj, set, del = mapSet) => {
81
+ objMap(obj, (value, id) => set(map, id, value));
82
+ mapForEach(map, (id) => (objHas(obj, id) ? 0 : del(map, id)));
83
+ return map;
84
+ };
85
+
86
+ const SINGLE_ROW_ID = '_';
87
+ const DEFAULT_ROW_ID_COLUMN_NAME = '_id';
88
+ const escapeId = (str) => `"${str.replace(/"/g, '""')}"`;
89
+
90
+ const setNew = (entryOrEntries) =>
91
+ new Set(
92
+ isArray(entryOrEntries) || isUndefined(entryOrEntries)
93
+ ? entryOrEntries
94
+ : [entryOrEntries],
95
+ );
96
+ const setAdd = (set, value) => set?.add(value);
97
+
98
+ const SELECT_STAR_FROM = 'SELECT*FROM';
99
+ const FROM_PRAGMA_TABLE = 'FROM pragma_table_';
100
+ const WHERE = 'WHERE';
101
+ const WHERE_MAIN_TABLE =
102
+ WHERE + ` schema='main'AND type='table'AND name!='sqlite_schema'`;
103
+ const getCommandFunctions = (cmd) => {
104
+ const schemaMap = mapNew();
105
+ const canSelect = (tableName, rowIdColumnName) =>
106
+ !isUndefined(mapGet(mapGet(schemaMap, tableName), rowIdColumnName));
107
+ const refreshSchema = async () =>
108
+ mapMatch(
109
+ schemaMap,
110
+ objNew(
111
+ await promiseAll(
112
+ arrayMap(
113
+ await cmd(
114
+ 'SELECT name ' + FROM_PRAGMA_TABLE + 'list ' + WHERE_MAIN_TABLE,
115
+ ),
116
+ async ({name: tableName}) => [
117
+ tableName,
118
+ objNew(
119
+ arrayMap(
120
+ await cmd(
121
+ 'SELECT name,type ' + FROM_PRAGMA_TABLE + 'info(?)',
122
+ [tableName],
123
+ ),
124
+ ({name: columnName, type}) => [columnName, type],
125
+ ),
126
+ ),
127
+ ],
128
+ ),
129
+ ),
130
+ ),
131
+ (_, tableName, tableSchema) =>
132
+ mapSet(
133
+ schemaMap,
134
+ tableName,
135
+ mapMatch(
136
+ mapEnsure(schemaMap, tableName, mapNew),
137
+ tableSchema,
138
+ (tableSchemaMap, columnName, value) => {
139
+ if (value != mapGet(tableSchemaMap, columnName)) {
140
+ mapSet(tableSchemaMap, columnName, value);
141
+ }
142
+ },
143
+ (tableSchema2, columnName) => mapSet(tableSchema2, columnName),
144
+ ),
145
+ ),
146
+ (_, name) => mapSet(schemaMap, name),
147
+ );
148
+ const loadSingleRow = async (tableName, rowIdColumnName) => {
149
+ const rows = canSelect(tableName, rowIdColumnName)
150
+ ? await cmd(
151
+ SELECT_STAR_FROM +
152
+ escapeId(tableName) +
153
+ WHERE +
154
+ escapeId(rowIdColumnName) +
155
+ '=?',
156
+ [SINGLE_ROW_ID],
157
+ )
158
+ : [];
159
+ return arrayIsEmpty(rows) ? null : objDel(rows[0], rowIdColumnName);
160
+ };
161
+ const saveSingleRow = async (tableName, rowIdColumnName, rowId, row) =>
162
+ await saveTable(tableName, rowIdColumnName, true, true, {[rowId]: row});
163
+ const loadTable = async (tableName, rowIdColumnName) =>
164
+ canSelect(tableName, rowIdColumnName)
165
+ ? objNew(
166
+ arrayFilter(
167
+ arrayMap(
168
+ await cmd(SELECT_STAR_FROM + escapeId(tableName)),
169
+ (row) => [row[rowIdColumnName], objDel(row, rowIdColumnName)],
170
+ ),
171
+ ([rowId, row]) => !isUndefined(rowId) && !objIsEmpty(row),
172
+ ),
173
+ )
174
+ : null;
175
+ const saveTable = async (
176
+ tableName,
177
+ rowIdColumnName,
178
+ deleteEmptyColumns,
179
+ deleteEmptyTable,
180
+ table,
181
+ ) => {
182
+ const cellIds = setNew();
183
+ objMap(table ?? {}, (row) =>
184
+ arrayMap(objIds(row), (cellId) => setAdd(cellIds, cellId)),
185
+ );
186
+ const columnNames = collValues(cellIds);
187
+ if (
188
+ arrayIsEmpty(columnNames) &&
189
+ collHas(schemaMap, tableName) &&
190
+ deleteEmptyTable
191
+ ) {
192
+ await cmd('DROP TABLE' + escapeId(tableName));
193
+ mapSet(schemaMap, tableName);
194
+ return;
195
+ }
196
+ if (!arrayIsEmpty(columnNames) && !collHas(schemaMap, tableName)) {
197
+ await cmd(
198
+ `CREATE TABLE${escapeId(tableName)}(${escapeId(
199
+ rowIdColumnName,
200
+ )} PRIMARY KEY ON CONFLICT REPLACE${arrayJoin(
201
+ arrayMap(columnNames, (cellId) => COMMA + escapeId(cellId)),
202
+ )});`,
203
+ );
204
+ mapSet(
205
+ schemaMap,
206
+ tableName,
207
+ mapNew([
208
+ [rowIdColumnName, EMPTY_STRING],
209
+ ...arrayMap(columnNames, (columnName) => [columnName, EMPTY_STRING]),
210
+ ]),
211
+ );
212
+ } else {
213
+ const tableSchemaMap = mapGet(schemaMap, tableName);
214
+ const columnNamesAccountedFor = setNew(mapKeys(tableSchemaMap));
215
+ await promiseAll([
216
+ ...arrayMap(columnNames, async (columnName) => {
217
+ if (!collDel(columnNamesAccountedFor, columnName)) {
218
+ await cmd(
219
+ `ALTER TABLE${escapeId(tableName)}ADD${escapeId(columnName)}`,
220
+ );
221
+ mapSet(tableSchemaMap, columnName, EMPTY_STRING);
222
+ }
223
+ }),
224
+ ...(deleteEmptyColumns
225
+ ? arrayMap(
226
+ collValues(columnNamesAccountedFor),
227
+ async (columnName) => {
228
+ if (columnName != rowIdColumnName) {
229
+ await cmd(
230
+ `ALTER TABLE${escapeId(tableName)}DROP${escapeId(
231
+ columnName,
232
+ )}`,
233
+ );
234
+ mapSet(tableSchemaMap, columnName);
235
+ }
236
+ },
237
+ )
238
+ : []),
239
+ ]);
240
+ }
241
+ if (!arrayIsEmpty(columnNames)) {
242
+ const insertSlots = [];
243
+ const insertBinds = [];
244
+ const deleteRowIds = [];
245
+ objMap(table, (row, rowId) => {
246
+ arrayPush(
247
+ insertSlots,
248
+ `(?${strRepeat(',?', arrayLength(columnNames))})`,
249
+ );
250
+ arrayPush(
251
+ insertBinds,
252
+ rowId,
253
+ ...arrayMap(columnNames, (cellId) => row[cellId]),
254
+ );
255
+ arrayPush(deleteRowIds, rowId);
256
+ });
257
+ await cmd(
258
+ 'INSERT INTO' +
259
+ escapeId(tableName) +
260
+ '(' +
261
+ escapeId(rowIdColumnName) +
262
+ arrayJoin(
263
+ arrayMap(columnNames, (columnName) => COMMA + escapeId(columnName)),
264
+ ) +
265
+ ')VALUES' +
266
+ arrayJoin(insertSlots, COMMA),
267
+ insertBinds,
268
+ );
269
+ await cmd(
270
+ 'DELETE FROM' +
271
+ escapeId(tableName) +
272
+ WHERE +
273
+ escapeId(rowIdColumnName) +
274
+ 'NOT IN(' +
275
+ arrayJoin(
276
+ arrayMap(deleteRowIds, () => '?'),
277
+ COMMA,
278
+ ) +
279
+ ')',
280
+ deleteRowIds,
281
+ );
282
+ } else {
283
+ await cmd('DELETE FROM' + escapeId(tableName));
284
+ }
285
+ };
286
+ return [refreshSchema, loadSingleRow, saveSingleRow, loadTable, saveTable];
287
+ };
288
+
289
+ const createCustomPersister = (
290
+ store,
291
+ getPersisted,
292
+ setPersisted,
293
+ addPersisterListener,
294
+ delPersisterListener,
295
+ ) => {
296
+ let listenerId;
297
+ let loadSave = 0;
298
+ let loads = 0;
299
+ let saves = 0;
300
+ let running = 0;
301
+ let listening = 0;
302
+ let action;
303
+ let listeningHandle;
304
+ const scheduledActions = [];
305
+ const run = async () => {
306
+ /* istanbul ignore else */
307
+ if (!running) {
308
+ running = 1;
309
+ while (!isUndefined((action = arrayShift(scheduledActions)))) {
310
+ try {
311
+ await action();
312
+ } catch {}
313
+ }
314
+ running = 0;
315
+ }
316
+ };
317
+ const loadLock = async (actions) => {
318
+ /* istanbul ignore else */
319
+ if (loadSave != 2) {
320
+ loadSave = 1;
321
+ {
322
+ loads++;
323
+ }
324
+ await actions();
325
+ loadSave = 0;
326
+ }
327
+ };
328
+ const persister = {
329
+ load: async (initialTables = {}, initialValues = {}) => {
330
+ await loadLock(async () => {
331
+ try {
332
+ store.setContent(await getPersisted());
333
+ } catch {
334
+ store.setContent([initialTables, initialValues]);
335
+ }
336
+ });
337
+ return persister;
338
+ },
339
+ startAutoLoad: async (initialTables = {}, initialValues = {}) => {
340
+ persister.stopAutoLoad();
341
+ await persister.load(initialTables, initialValues);
342
+ listening = 1;
343
+ listeningHandle = addPersisterListener(
344
+ async (getContent, getTransactionChanges) => {
345
+ await loadLock(async () => {
346
+ if (getTransactionChanges) {
347
+ store.setTransactionChanges(getTransactionChanges());
348
+ } else {
349
+ try {
350
+ store.setContent(getContent?.() ?? (await getPersisted()));
351
+ } catch {}
352
+ }
353
+ });
354
+ },
355
+ );
356
+ return persister;
357
+ },
358
+ stopAutoLoad: () => {
359
+ if (listening) {
360
+ delPersisterListener(listeningHandle);
361
+ listeningHandle = void 0;
362
+ listening = 0;
363
+ }
364
+ return persister;
365
+ },
366
+ save: async (getTransactionChanges) => {
367
+ await persister.schedule(async () => {
368
+ /* istanbul ignore else */
369
+ if (loadSave != 1) {
370
+ loadSave = 2;
371
+ {
372
+ saves++;
373
+ }
374
+ try {
375
+ await setPersisted(store.getContent, getTransactionChanges);
376
+ } catch {}
377
+ loadSave = 0;
378
+ }
379
+ });
380
+ return persister;
381
+ },
382
+ startAutoSave: async () => {
383
+ await persister.stopAutoSave().save();
384
+ listenerId = store.addDidFinishTransactionListener(
385
+ (_store, getTransactionChanges) => {
386
+ const transactionChanges = getTransactionChanges();
387
+ persister.save(() => transactionChanges);
388
+ },
389
+ );
390
+ return persister;
391
+ },
392
+ stopAutoSave: () => {
393
+ ifNotUndefined(listenerId, store.delListener);
394
+ return persister;
395
+ },
396
+ schedule: async (...actions) => {
397
+ arrayPush(scheduledActions, ...actions);
398
+ await run();
399
+ return persister;
400
+ },
401
+ getStore: () => store,
402
+ destroy: () => persister.stopAutoLoad().stopAutoSave(),
403
+ getStats: () => ({loads, saves}),
404
+ };
405
+ return objFreeze(persister);
406
+ };
407
+
408
+ const STORE_COLUMN = 'store';
409
+ const createJsonSqlitePersister = (
410
+ store,
411
+ cmd,
412
+ addPersisterListener,
413
+ delPersisterListener,
414
+ {storeTableName = TINYBASE},
415
+ ) => {
416
+ const [refreshSchema, loadSingleRow, saveSingleRow] =
417
+ getCommandFunctions(cmd);
418
+ const getPersisted = async () => {
419
+ await refreshSchema();
420
+ return jsonParse(
421
+ ((await loadSingleRow(storeTableName, DEFAULT_ROW_ID_COLUMN_NAME)) ?? {})[
422
+ STORE_COLUMN
423
+ ],
424
+ );
425
+ };
426
+ const setPersisted = async (getContent) =>
427
+ persister.schedule(refreshSchema, async () => {
428
+ await saveSingleRow(
429
+ storeTableName,
430
+ DEFAULT_ROW_ID_COLUMN_NAME,
431
+ SINGLE_ROW_ID,
432
+ {[STORE_COLUMN]: jsonString(getContent())},
433
+ );
434
+ });
435
+ const persister = createCustomPersister(
436
+ store,
437
+ getPersisted,
438
+ setPersisted,
439
+ addPersisterListener,
440
+ delPersisterListener,
441
+ );
442
+ return persister;
443
+ };
444
+
445
+ const ROW_ID_COLUMN_NAME = 'rowIdColumnName';
446
+ const TABLE_ID = 'tableId';
447
+ const TABLE_NAME = 'tableName';
448
+ const DELETE_EMPTY_COLUMNS = 'deleteEmptyColumns';
449
+ const DELETE_EMPTY_TABLE = 'deleteEmptyTable';
450
+ const DEFAULTED_VALUES_CONFIG = {
451
+ load: 0,
452
+ save: 0,
453
+ [TABLE_NAME]: TINYBASE + '_values',
454
+ };
455
+ const getDefaultedTableConfigMap = (
456
+ configsObj,
457
+ defaultObj,
458
+ tableField,
459
+ filter,
460
+ ) => {
461
+ const configMap = mapNew();
462
+ objMap(configsObj, (configObj, id) => {
463
+ const defaultedConfig = arraySlice(
464
+ objValues(
465
+ objMerge(
466
+ defaultObj,
467
+ isString(configObj) ? {[tableField]: configObj} : configObj,
468
+ ),
469
+ ),
470
+ 0,
471
+ objSize(defaultObj),
472
+ );
473
+ if (!isUndefined(defaultedConfig[0]) && !filter(id, defaultedConfig[0])) {
474
+ mapSet(configMap, id, defaultedConfig);
475
+ }
476
+ });
477
+ return configMap;
478
+ };
479
+ const getDefaultedConfig = ({
480
+ tables: {load = {}, save = {}} = {},
481
+ values = {},
482
+ }) => {
483
+ const valuesConfig = arraySlice(
484
+ objValues(objMerge(DEFAULTED_VALUES_CONFIG, values)),
485
+ 0,
486
+ objSize(DEFAULTED_VALUES_CONFIG),
487
+ );
488
+ const valuesTable = valuesConfig[2];
489
+ return [
490
+ getDefaultedTableConfigMap(
491
+ load,
492
+ {
493
+ [TABLE_ID]: null,
494
+ [ROW_ID_COLUMN_NAME]: DEFAULT_ROW_ID_COLUMN_NAME,
495
+ },
496
+ TABLE_ID,
497
+ (tableName) => tableName == valuesTable,
498
+ ),
499
+ getDefaultedTableConfigMap(
500
+ save,
501
+ {
502
+ [TABLE_NAME]: null,
503
+ [ROW_ID_COLUMN_NAME]: DEFAULT_ROW_ID_COLUMN_NAME,
504
+ [DELETE_EMPTY_COLUMNS]: 0,
505
+ [DELETE_EMPTY_TABLE]: 0,
506
+ },
507
+ TABLE_NAME,
508
+ (_, tableName) => tableName == valuesTable,
509
+ ),
510
+ valuesConfig,
511
+ ];
512
+ };
513
+
514
+ const createTabularSqlitePersister = (
515
+ store,
516
+ cmd,
517
+ addPersisterListener,
518
+ delPersisterListener,
519
+ config,
520
+ ) => {
521
+ const [
522
+ tablesLoadConfig,
523
+ tablesSaveConfig,
524
+ [valuesLoad, valuesSave, valuesTableName],
525
+ ] = getDefaultedConfig(config);
526
+ const [refreshSchema, loadSingleRow, saveSingleRow, loadTable, saveTable] =
527
+ getCommandFunctions(cmd);
528
+ const getSaveTablesActions = (tables) =>
529
+ mapMap(
530
+ tablesSaveConfig,
531
+ (
532
+ [tableName, rowIdColumnName, deleteEmptyColumns, deleteEmptyTable],
533
+ tableId,
534
+ ) =>
535
+ async () =>
536
+ await saveTable(
537
+ tableName,
538
+ rowIdColumnName,
539
+ deleteEmptyColumns,
540
+ deleteEmptyTable,
541
+ tables[tableId],
542
+ ),
543
+ );
544
+ const getSaveValuesAction = (values) =>
545
+ valuesSave
546
+ ? async () =>
547
+ await saveSingleRow(
548
+ valuesTableName,
549
+ DEFAULT_ROW_ID_COLUMN_NAME,
550
+ SINGLE_ROW_ID,
551
+ values,
552
+ )
553
+ : null;
554
+ const loadTables = async () =>
555
+ objNew(
556
+ arrayFilter(
557
+ await promiseAll(
558
+ mapMap(
559
+ tablesLoadConfig,
560
+ async ([tableId, rowIdColumnName], tableName) => [
561
+ tableId,
562
+ await loadTable(tableName, rowIdColumnName),
563
+ ],
564
+ ),
565
+ ),
566
+ (pair) => pair[1],
567
+ ),
568
+ );
569
+ const loadValues = async () =>
570
+ valuesLoad
571
+ ? await loadSingleRow(valuesTableName, DEFAULT_ROW_ID_COLUMN_NAME)
572
+ : {};
573
+ const getPersisted = async () => {
574
+ await refreshSchema();
575
+ const tables = await loadTables();
576
+ const values = await loadValues();
577
+ return !objIsEmpty(tables) || !isUndefined(values)
578
+ ? [tables, values]
579
+ : void 0;
580
+ };
581
+ const setPersisted = async (getContent) => {
582
+ const [tables, values] = getContent();
583
+ persister.schedule(
584
+ refreshSchema,
585
+ ...getSaveTablesActions(tables),
586
+ getSaveValuesAction(values),
587
+ );
588
+ };
589
+ const persister = createCustomPersister(
590
+ store,
591
+ getPersisted,
592
+ setPersisted,
593
+ addPersisterListener,
594
+ delPersisterListener,
595
+ );
596
+ return persister;
597
+ };
598
+
599
+ const JSON$1 = 'json';
600
+ const AUTO_LOAD_INTERVAL_SECONDS = 'autoLoadIntervalSeconds';
601
+ const DEFAULT_CONFIG = {
602
+ mode: JSON$1,
603
+ [AUTO_LOAD_INTERVAL_SECONDS]: 1,
604
+ };
605
+ const PRAGMA = 'pragma ';
606
+ const DATA_VERSION = 'data_version';
607
+ const SCHEMA_VERSION = 'schema_version';
608
+ const createSqlitePersister = (
609
+ store,
610
+ configOrStoreTableName,
611
+ cmd,
612
+ addPersisterLocalListener,
613
+ delPersisterLocalListener,
614
+ ) => {
615
+ const config = objMerge(
616
+ DEFAULT_CONFIG,
617
+ isString(configOrStoreTableName)
618
+ ? {storeTableName: configOrStoreTableName}
619
+ : configOrStoreTableName ?? {},
620
+ );
621
+ let dataVersion;
622
+ let schemaVersion;
623
+ const addPersisterListener = (listener) => [
624
+ setInterval(async () => {
625
+ try {
626
+ const newDataVersion = (await cmd(PRAGMA + DATA_VERSION))[0][
627
+ DATA_VERSION
628
+ ];
629
+ const newSchemaVersion = (await cmd(PRAGMA + SCHEMA_VERSION))[0][
630
+ SCHEMA_VERSION
631
+ ];
632
+ if (
633
+ newDataVersion != (dataVersion ??= newDataVersion) ||
634
+ newSchemaVersion != (schemaVersion ??= newSchemaVersion)
635
+ ) {
636
+ listener();
637
+ dataVersion = newDataVersion;
638
+ schemaVersion = newSchemaVersion;
639
+ }
640
+ } catch {}
641
+ }, config[AUTO_LOAD_INTERVAL_SECONDS] * 1e3),
642
+ addPersisterLocalListener(listener),
643
+ ];
644
+ const delPersisterListener = ([interval, listeningHandle]) => {
645
+ clearInterval(interval);
646
+ dataVersion = schemaVersion = null;
647
+ delPersisterLocalListener(listeningHandle);
648
+ };
649
+ return (
650
+ config.mode == JSON$1
651
+ ? createJsonSqlitePersister
652
+ : createTabularSqlitePersister
653
+ )(store, cmd, addPersisterListener, delPersisterListener, config);
654
+ };
655
+
656
+ const createCrSqliteWasmPersister = (store, db, configOrStoreTableName) =>
657
+ createSqlitePersister(
658
+ store,
659
+ configOrStoreTableName,
660
+ async (sql, args = []) => await db.execO(sql, args),
661
+ (listener) => db.onUpdate(() => listener()),
662
+ (removeListener) => removeListener(),
663
+ );
664
+
665
+ export {createCrSqliteWasmPersister};