tinybase 4.6.2 → 5.0.0-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. package/bin/cli.js +1 -1
  2. package/lib/checkpoints.js +1 -1
  3. package/lib/checkpoints.js.gz +0 -0
  4. package/lib/cjs/checkpoints.cjs +1 -1
  5. package/lib/cjs/checkpoints.cjs.gz +0 -0
  6. package/lib/cjs/indexes.cjs +1 -1
  7. package/lib/cjs/indexes.cjs.gz +0 -0
  8. package/lib/cjs/metrics.cjs +1 -1
  9. package/lib/cjs/metrics.cjs.gz +0 -0
  10. package/lib/cjs/persisters/persister-automerge.cjs +1 -1
  11. package/lib/cjs/persisters/persister-automerge.cjs.gz +0 -0
  12. package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs +1 -1
  13. package/lib/cjs/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  14. package/lib/cjs/persisters/persister-electric-sql.cjs +1 -1
  15. package/lib/cjs/persisters/persister-electric-sql.cjs.gz +0 -0
  16. package/lib/cjs/persisters/persister-expo-sqlite-next.cjs +1 -1
  17. package/lib/cjs/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
  18. package/lib/cjs/persisters/persister-expo-sqlite.cjs +1 -1
  19. package/lib/cjs/persisters/persister-expo-sqlite.cjs.gz +0 -0
  20. package/lib/cjs/persisters/persister-indexed-db.cjs +1 -1
  21. package/lib/cjs/persisters/persister-indexed-db.cjs.gz +0 -0
  22. package/lib/cjs/persisters/persister-partykit-server.cjs +1 -1
  23. package/lib/cjs/persisters/persister-partykit-server.cjs.gz +0 -0
  24. package/lib/cjs/persisters/persister-sqlite-wasm.cjs +1 -1
  25. package/lib/cjs/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  26. package/lib/cjs/persisters/persister-sqlite3.cjs +1 -1
  27. package/lib/cjs/persisters/persister-sqlite3.cjs.gz +0 -0
  28. package/lib/cjs/persisters/persister-yjs.cjs +1 -1
  29. package/lib/cjs/persisters/persister-yjs.cjs.gz +0 -0
  30. package/lib/cjs/queries.cjs +1 -1
  31. package/lib/cjs/queries.cjs.gz +0 -0
  32. package/lib/cjs/relationships.cjs +1 -1
  33. package/lib/cjs/relationships.cjs.gz +0 -0
  34. package/lib/cjs/store.cjs +1 -1
  35. package/lib/cjs/store.cjs.gz +0 -0
  36. package/lib/cjs/tinybase.cjs +1 -1
  37. package/lib/cjs/tinybase.cjs.gz +0 -0
  38. package/lib/cjs/tools.cjs +1 -1
  39. package/lib/cjs/tools.cjs.gz +0 -0
  40. package/lib/cjs/ui-react-dom-debug.cjs +1 -1
  41. package/lib/cjs/ui-react-dom-debug.cjs.gz +0 -0
  42. package/lib/cjs/ui-react-dom.cjs +1 -1
  43. package/lib/cjs/ui-react-dom.cjs.gz +0 -0
  44. package/lib/cjs/ui-react.cjs +1 -1
  45. package/lib/cjs/ui-react.cjs.gz +0 -0
  46. package/lib/cjs-es6/checkpoints.cjs +1 -1
  47. package/lib/cjs-es6/checkpoints.cjs.gz +0 -0
  48. package/lib/cjs-es6/indexes.cjs +1 -1
  49. package/lib/cjs-es6/indexes.cjs.gz +0 -0
  50. package/lib/cjs-es6/metrics.cjs +1 -1
  51. package/lib/cjs-es6/metrics.cjs.gz +0 -0
  52. package/lib/cjs-es6/persisters/persister-automerge.cjs +1 -1
  53. package/lib/cjs-es6/persisters/persister-automerge.cjs.gz +0 -0
  54. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs +1 -1
  55. package/lib/cjs-es6/persisters/persister-cr-sqlite-wasm.cjs.gz +0 -0
  56. package/lib/cjs-es6/persisters/persister-electric-sql.cjs +1 -1
  57. package/lib/cjs-es6/persisters/persister-electric-sql.cjs.gz +0 -0
  58. package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs +1 -1
  59. package/lib/cjs-es6/persisters/persister-expo-sqlite-next.cjs.gz +0 -0
  60. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs +1 -1
  61. package/lib/cjs-es6/persisters/persister-expo-sqlite.cjs.gz +0 -0
  62. package/lib/cjs-es6/persisters/persister-indexed-db.cjs +1 -1
  63. package/lib/cjs-es6/persisters/persister-indexed-db.cjs.gz +0 -0
  64. package/lib/cjs-es6/persisters/persister-partykit-server.cjs +1 -1
  65. package/lib/cjs-es6/persisters/persister-partykit-server.cjs.gz +0 -0
  66. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs +1 -1
  67. package/lib/cjs-es6/persisters/persister-sqlite-wasm.cjs.gz +0 -0
  68. package/lib/cjs-es6/persisters/persister-sqlite3.cjs +1 -1
  69. package/lib/cjs-es6/persisters/persister-sqlite3.cjs.gz +0 -0
  70. package/lib/cjs-es6/persisters/persister-yjs.cjs +1 -1
  71. package/lib/cjs-es6/persisters/persister-yjs.cjs.gz +0 -0
  72. package/lib/cjs-es6/queries.cjs +1 -1
  73. package/lib/cjs-es6/queries.cjs.gz +0 -0
  74. package/lib/cjs-es6/relationships.cjs +1 -1
  75. package/lib/cjs-es6/relationships.cjs.gz +0 -0
  76. package/lib/cjs-es6/store.cjs +1 -1
  77. package/lib/cjs-es6/store.cjs.gz +0 -0
  78. package/lib/cjs-es6/tinybase.cjs +1 -1
  79. package/lib/cjs-es6/tinybase.cjs.gz +0 -0
  80. package/lib/cjs-es6/tools.cjs +1 -1
  81. package/lib/cjs-es6/tools.cjs.gz +0 -0
  82. package/lib/cjs-es6/ui-react-dom-debug.cjs +1 -1
  83. package/lib/cjs-es6/ui-react-dom-debug.cjs.gz +0 -0
  84. package/lib/cjs-es6/ui-react-dom.cjs +1 -1
  85. package/lib/cjs-es6/ui-react-dom.cjs.gz +0 -0
  86. package/lib/cjs-es6/ui-react.cjs +1 -1
  87. package/lib/cjs-es6/ui-react.cjs.gz +0 -0
  88. package/lib/debug/checkpoints.js +251 -234
  89. package/lib/debug/indexes.js +7 -5
  90. package/lib/debug/metrics.js +7 -5
  91. package/lib/debug/persisters/persister-automerge.js +3 -1
  92. package/lib/debug/persisters/persister-browser.js +1 -0
  93. package/lib/debug/persisters/persister-cr-sqlite-wasm.js +3 -1
  94. package/lib/debug/persisters/persister-electric-sql.js +3 -1
  95. package/lib/debug/persisters/persister-expo-sqlite-next.js +3 -1
  96. package/lib/debug/persisters/persister-expo-sqlite.js +3 -1
  97. package/lib/debug/persisters/persister-file.js +1 -0
  98. package/lib/debug/persisters/persister-indexed-db.js +3 -1
  99. package/lib/debug/persisters/persister-partykit-client.js +1 -0
  100. package/lib/debug/persisters/persister-partykit-server.js +2 -1
  101. package/lib/debug/persisters/persister-remote.js +1 -0
  102. package/lib/debug/persisters/persister-sqlite-wasm.js +3 -1
  103. package/lib/debug/persisters/persister-sqlite3.js +3 -1
  104. package/lib/debug/persisters/persister-yjs.js +3 -1
  105. package/lib/debug/persisters.js +1 -0
  106. package/lib/debug/queries.js +9 -6
  107. package/lib/debug/relationships.js +7 -5
  108. package/lib/debug/store.js +3 -1
  109. package/lib/debug/tinybase.js +254 -235
  110. package/lib/debug/tools.js +10 -6
  111. package/lib/debug/ui-react-dom.js +3 -1
  112. package/lib/debug/ui-react.js +166 -200
  113. package/lib/es6/checkpoints.js +1 -1
  114. package/lib/es6/checkpoints.js.gz +0 -0
  115. package/lib/es6/indexes.js +1 -1
  116. package/lib/es6/indexes.js.gz +0 -0
  117. package/lib/es6/metrics.js +1 -1
  118. package/lib/es6/metrics.js.gz +0 -0
  119. package/lib/es6/persisters/persister-automerge.js +1 -1
  120. package/lib/es6/persisters/persister-automerge.js.gz +0 -0
  121. package/lib/es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  122. package/lib/es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  123. package/lib/es6/persisters/persister-electric-sql.js +1 -1
  124. package/lib/es6/persisters/persister-electric-sql.js.gz +0 -0
  125. package/lib/es6/persisters/persister-expo-sqlite-next.js +1 -1
  126. package/lib/es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
  127. package/lib/es6/persisters/persister-expo-sqlite.js +1 -1
  128. package/lib/es6/persisters/persister-expo-sqlite.js.gz +0 -0
  129. package/lib/es6/persisters/persister-indexed-db.js +1 -1
  130. package/lib/es6/persisters/persister-indexed-db.js.gz +0 -0
  131. package/lib/es6/persisters/persister-partykit-server.js +1 -1
  132. package/lib/es6/persisters/persister-partykit-server.js.gz +0 -0
  133. package/lib/es6/persisters/persister-sqlite-wasm.js +1 -1
  134. package/lib/es6/persisters/persister-sqlite-wasm.js.gz +0 -0
  135. package/lib/es6/persisters/persister-sqlite3.js +1 -1
  136. package/lib/es6/persisters/persister-sqlite3.js.gz +0 -0
  137. package/lib/es6/persisters/persister-yjs.js +1 -1
  138. package/lib/es6/persisters/persister-yjs.js.gz +0 -0
  139. package/lib/es6/queries.js +1 -1
  140. package/lib/es6/queries.js.gz +0 -0
  141. package/lib/es6/relationships.js +1 -1
  142. package/lib/es6/relationships.js.gz +0 -0
  143. package/lib/es6/store.js +1 -1
  144. package/lib/es6/store.js.gz +0 -0
  145. package/lib/es6/tinybase.js +1 -1
  146. package/lib/es6/tinybase.js.gz +0 -0
  147. package/lib/es6/tools.js +1 -1
  148. package/lib/es6/tools.js.gz +0 -0
  149. package/lib/es6/ui-react-dom-debug.js +1 -1
  150. package/lib/es6/ui-react-dom-debug.js.gz +0 -0
  151. package/lib/es6/ui-react-dom.js +1 -1
  152. package/lib/es6/ui-react-dom.js.gz +0 -0
  153. package/lib/es6/ui-react.js +1 -1
  154. package/lib/es6/ui-react.js.gz +0 -0
  155. package/lib/indexes.js +1 -1
  156. package/lib/indexes.js.gz +0 -0
  157. package/lib/metrics.js +1 -1
  158. package/lib/metrics.js.gz +0 -0
  159. package/lib/persisters/persister-automerge.js +1 -1
  160. package/lib/persisters/persister-automerge.js.gz +0 -0
  161. package/lib/persisters/persister-cr-sqlite-wasm.js +1 -1
  162. package/lib/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  163. package/lib/persisters/persister-electric-sql.js +1 -1
  164. package/lib/persisters/persister-electric-sql.js.gz +0 -0
  165. package/lib/persisters/persister-expo-sqlite-next.js +1 -1
  166. package/lib/persisters/persister-expo-sqlite-next.js.gz +0 -0
  167. package/lib/persisters/persister-expo-sqlite.js +1 -1
  168. package/lib/persisters/persister-expo-sqlite.js.gz +0 -0
  169. package/lib/persisters/persister-indexed-db.js +1 -1
  170. package/lib/persisters/persister-indexed-db.js.gz +0 -0
  171. package/lib/persisters/persister-partykit-server.js +1 -1
  172. package/lib/persisters/persister-partykit-server.js.gz +0 -0
  173. package/lib/persisters/persister-sqlite-wasm.js +1 -1
  174. package/lib/persisters/persister-sqlite-wasm.js.gz +0 -0
  175. package/lib/persisters/persister-sqlite3.js +1 -1
  176. package/lib/persisters/persister-sqlite3.js.gz +0 -0
  177. package/lib/persisters/persister-yjs.js +1 -1
  178. package/lib/persisters/persister-yjs.js.gz +0 -0
  179. package/lib/queries.js +1 -1
  180. package/lib/queries.js.gz +0 -0
  181. package/lib/relationships.js +1 -1
  182. package/lib/relationships.js.gz +0 -0
  183. package/lib/store.js +1 -1
  184. package/lib/store.js.gz +0 -0
  185. package/lib/tinybase.js +1 -1
  186. package/lib/tinybase.js.gz +0 -0
  187. package/lib/tools.js +1 -1
  188. package/lib/tools.js.gz +0 -0
  189. package/lib/types/ui-react.d.ts +77 -88
  190. package/lib/types/with-schemas/ui-react.d.ts +84 -95
  191. package/lib/ui-react-dom.js +1 -1
  192. package/lib/ui-react-dom.js.gz +0 -0
  193. package/lib/ui-react.js +1 -1
  194. package/lib/ui-react.js.gz +0 -0
  195. package/lib/umd/checkpoints.js +1 -1
  196. package/lib/umd/checkpoints.js.gz +0 -0
  197. package/lib/umd/indexes.js +1 -1
  198. package/lib/umd/indexes.js.gz +0 -0
  199. package/lib/umd/metrics.js +1 -1
  200. package/lib/umd/metrics.js.gz +0 -0
  201. package/lib/umd/persisters/persister-automerge.js +1 -1
  202. package/lib/umd/persisters/persister-automerge.js.gz +0 -0
  203. package/lib/umd/persisters/persister-cr-sqlite-wasm.js +1 -1
  204. package/lib/umd/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  205. package/lib/umd/persisters/persister-electric-sql.js +1 -1
  206. package/lib/umd/persisters/persister-electric-sql.js.gz +0 -0
  207. package/lib/umd/persisters/persister-expo-sqlite-next.js +1 -1
  208. package/lib/umd/persisters/persister-expo-sqlite-next.js.gz +0 -0
  209. package/lib/umd/persisters/persister-expo-sqlite.js +1 -1
  210. package/lib/umd/persisters/persister-expo-sqlite.js.gz +0 -0
  211. package/lib/umd/persisters/persister-indexed-db.js +1 -1
  212. package/lib/umd/persisters/persister-indexed-db.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-sqlite-wasm.js +1 -1
  216. package/lib/umd/persisters/persister-sqlite-wasm.js.gz +0 -0
  217. package/lib/umd/persisters/persister-sqlite3.js +1 -1
  218. package/lib/umd/persisters/persister-sqlite3.js.gz +0 -0
  219. package/lib/umd/persisters/persister-yjs.js +1 -1
  220. package/lib/umd/persisters/persister-yjs.js.gz +0 -0
  221. package/lib/umd/queries.js +1 -1
  222. package/lib/umd/queries.js.gz +0 -0
  223. package/lib/umd/relationships.js +1 -1
  224. package/lib/umd/relationships.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/ui-react-dom.js +1 -1
  234. package/lib/umd/ui-react-dom.js.gz +0 -0
  235. package/lib/umd/ui-react.js +1 -1
  236. package/lib/umd/ui-react.js.gz +0 -0
  237. package/lib/umd-es6/checkpoints.js +1 -1
  238. package/lib/umd-es6/checkpoints.js.gz +0 -0
  239. package/lib/umd-es6/indexes.js +1 -1
  240. package/lib/umd-es6/indexes.js.gz +0 -0
  241. package/lib/umd-es6/metrics.js +1 -1
  242. package/lib/umd-es6/metrics.js.gz +0 -0
  243. package/lib/umd-es6/persisters/persister-automerge.js +1 -1
  244. package/lib/umd-es6/persisters/persister-automerge.js.gz +0 -0
  245. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js +1 -1
  246. package/lib/umd-es6/persisters/persister-cr-sqlite-wasm.js.gz +0 -0
  247. package/lib/umd-es6/persisters/persister-electric-sql.js +1 -1
  248. package/lib/umd-es6/persisters/persister-electric-sql.js.gz +0 -0
  249. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js +1 -1
  250. package/lib/umd-es6/persisters/persister-expo-sqlite-next.js.gz +0 -0
  251. package/lib/umd-es6/persisters/persister-expo-sqlite.js +1 -1
  252. package/lib/umd-es6/persisters/persister-expo-sqlite.js.gz +0 -0
  253. package/lib/umd-es6/persisters/persister-indexed-db.js +1 -1
  254. package/lib/umd-es6/persisters/persister-indexed-db.js.gz +0 -0
  255. package/lib/umd-es6/persisters/persister-partykit-server.js +1 -1
  256. package/lib/umd-es6/persisters/persister-partykit-server.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/queries.js +1 -1
  264. package/lib/umd-es6/queries.js.gz +0 -0
  265. package/lib/umd-es6/relationships.js +1 -1
  266. package/lib/umd-es6/relationships.js.gz +0 -0
  267. package/lib/umd-es6/store.js +1 -1
  268. package/lib/umd-es6/store.js.gz +0 -0
  269. package/lib/umd-es6/tinybase.js +1 -1
  270. package/lib/umd-es6/tinybase.js.gz +0 -0
  271. package/lib/umd-es6/tools.js +1 -1
  272. package/lib/umd-es6/tools.js.gz +0 -0
  273. package/lib/umd-es6/ui-react-dom-debug.js +1 -1
  274. package/lib/umd-es6/ui-react-dom-debug.js.gz +0 -0
  275. package/lib/umd-es6/ui-react-dom.js +1 -1
  276. package/lib/umd-es6/ui-react-dom.js.gz +0 -0
  277. package/lib/umd-es6/ui-react.js +1 -1
  278. package/lib/umd-es6/ui-react.js.gz +0 -0
  279. package/package.json +4 -4
  280. package/readme.md +13 -13
@@ -70,6 +70,7 @@ const arrayShift = (array) => array.shift();
70
70
 
71
71
  const object = Object;
72
72
  const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
73
+ const objEntries = object.entries;
73
74
  const objIds = object.keys;
74
75
  const objFrozen = object.isFrozen;
75
76
  const objFreeze = object.freeze;
@@ -80,6 +81,7 @@ const isObject = (obj) =>
80
81
  (objPrototype) =>
81
82
  objPrototype == object.prototype ||
82
83
  isUndefined(getPrototypeOf(objPrototype)),
84
+ /* istanbul ignore next */
83
85
  () => true,
84
86
  );
85
87
  const objGet = (obj, id) => ifNotUndefined(obj, (obj2) => obj2[id]);
@@ -89,7 +91,7 @@ const objDel = (obj, id) => {
89
91
  return obj;
90
92
  };
91
93
  const objMap = (obj, cb) =>
92
- arrayMap(object.entries(obj), ([id, value]) => cb(value, id));
94
+ arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
93
95
  const objSize = (obj) => size(objIds(obj));
94
96
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
95
97
 
@@ -356,13 +358,15 @@ const getRowCellFunction = (getRowCell, defaultCellValue) =>
356
358
  isString(getRowCell)
357
359
  ? (getCell) => getCell(getRowCell)
358
360
  : getRowCell ?? (() => defaultCellValue ?? EMPTY_STRING);
359
- const getCreateFunction = (getFunction) => {
360
- const getFunctionsByStore = /* @__PURE__ */ new WeakMap();
361
+ const getCreateFunction = (getFunction, initFunction) => {
362
+ const thingsByStore = /* @__PURE__ */ new WeakMap();
361
363
  return (store) => {
362
- if (!getFunctionsByStore.has(store)) {
363
- getFunctionsByStore.set(store, getFunction(store));
364
+ if (!thingsByStore.has(store)) {
365
+ thingsByStore.set(store, getFunction(store));
364
366
  }
365
- return getFunctionsByStore.get(store);
367
+ const thing = thingsByStore.get(store);
368
+ initFunction?.(thing);
369
+ return thing;
366
370
  };
367
371
  };
368
372
 
@@ -450,241 +454,256 @@ const getListenerFunctions = (getThing) => {
450
454
  return [addListener, callListeners, delListener, callListener];
451
455
  };
452
456
 
453
- const createCheckpoints = getCreateFunction((store) => {
454
- let backwardIdsSize = 100;
455
- let currentId;
456
- let cellsDelta = mapNew();
457
- let valuesDelta = mapNew();
458
- let listening = 1;
459
- let nextCheckpointId;
460
- let checkpointsChanged;
461
- const checkpointIdsListeners = mapNew();
462
- const checkpointListeners = mapNew();
463
- const [addListener, callListeners, delListenerImpl] = getListenerFunctions(
464
- () => checkpoints,
465
- );
466
- const deltas = mapNew();
467
- const labels = mapNew();
468
- const backwardIds = [];
469
- const forwardIds = [];
470
- const updateStore = (oldOrNew, checkpointId) => {
471
- listening = 0;
472
- store.transaction(() => {
473
- const [cellsDelta2, valuesDelta2] = mapGet(deltas, checkpointId);
474
- collForEach(cellsDelta2, (table, tableId) =>
475
- collForEach(table, (row, rowId) =>
476
- collForEach(row, (oldNew, cellId) =>
477
- setOrDelCell(store, tableId, rowId, cellId, oldNew[oldOrNew]),
457
+ const createCheckpoints = getCreateFunction(
458
+ (store) => {
459
+ let backwardIdsSize = 100;
460
+ let currentId;
461
+ let cellsDelta = mapNew();
462
+ let valuesDelta = mapNew();
463
+ let listening = 1;
464
+ let nextCheckpointId;
465
+ let checkpointsChanged;
466
+ const checkpointIdsListeners = mapNew();
467
+ const checkpointListeners = mapNew();
468
+ const [addListener, callListeners, delListenerImpl] = getListenerFunctions(
469
+ () => checkpoints,
470
+ );
471
+ const deltas = mapNew();
472
+ const labels = mapNew();
473
+ const backwardIds = [];
474
+ const forwardIds = [];
475
+ const updateStore = (oldOrNew, checkpointId) => {
476
+ listening = 0;
477
+ store.transaction(() => {
478
+ const [cellsDelta2, valuesDelta2] = mapGet(deltas, checkpointId);
479
+ collForEach(cellsDelta2, (table, tableId) =>
480
+ collForEach(table, (row, rowId) =>
481
+ collForEach(row, (oldNew, cellId) =>
482
+ setOrDelCell(store, tableId, rowId, cellId, oldNew[oldOrNew]),
483
+ ),
478
484
  ),
479
- ),
480
- );
481
- collForEach(valuesDelta2, (oldNew, valueId) =>
482
- setOrDelValue(store, valueId, oldNew[oldOrNew]),
485
+ );
486
+ collForEach(valuesDelta2, (oldNew, valueId) =>
487
+ setOrDelValue(store, valueId, oldNew[oldOrNew]),
488
+ );
489
+ });
490
+ listening = 1;
491
+ };
492
+ const clearCheckpointId = (checkpointId) => {
493
+ mapSet(deltas, checkpointId);
494
+ mapSet(labels, checkpointId);
495
+ callListeners(checkpointListeners, [checkpointId]);
496
+ };
497
+ const clearCheckpointIds = (checkpointIds, to) =>
498
+ arrayForEach(
499
+ arrayClear(checkpointIds, to ?? size(checkpointIds)),
500
+ clearCheckpointId,
483
501
  );
484
- });
485
- listening = 1;
486
- };
487
- const clearCheckpointId = (checkpointId) => {
488
- mapSet(deltas, checkpointId);
489
- mapSet(labels, checkpointId);
490
- callListeners(checkpointListeners, [checkpointId]);
491
- };
492
- const clearCheckpointIds = (checkpointIds, to) =>
493
- arrayForEach(
494
- arrayClear(checkpointIds, to ?? size(checkpointIds)),
495
- clearCheckpointId,
496
- );
497
- const trimBackwardsIds = () =>
498
- clearCheckpointIds(backwardIds, size(backwardIds) - backwardIdsSize);
499
- const storeChanged = () =>
500
- ifNotUndefined(currentId, () => {
501
- arrayPush(backwardIds, currentId);
502
- trimBackwardsIds();
503
- clearCheckpointIds(forwardIds);
504
- currentId = void 0;
502
+ const trimBackwardsIds = () =>
503
+ clearCheckpointIds(backwardIds, size(backwardIds) - backwardIdsSize);
504
+ const storeChanged = () =>
505
+ ifNotUndefined(currentId, () => {
506
+ arrayPush(backwardIds, currentId);
507
+ trimBackwardsIds();
508
+ clearCheckpointIds(forwardIds);
509
+ currentId = void 0;
510
+ checkpointsChanged = 1;
511
+ });
512
+ const storeUnchanged = () => {
513
+ currentId = arrayPop(backwardIds);
505
514
  checkpointsChanged = 1;
506
- });
507
- const storeUnchanged = () => {
508
- currentId = arrayPop(backwardIds);
509
- checkpointsChanged = 1;
510
- };
511
- const cellListenerId = store.addCellListener(
512
- null,
513
- null,
514
- null,
515
- (_store, tableId, rowId, cellId, newCell, oldCell) => {
516
- if (listening) {
517
- storeChanged();
518
- const table = mapEnsure(cellsDelta, tableId, mapNew);
519
- const row = mapEnsure(table, rowId, mapNew);
520
- const oldNew = mapEnsure(row, cellId, () => [oldCell, void 0]);
521
- oldNew[1] = newCell;
522
- if (
523
- oldNew[0] === newCell &&
524
- collIsEmpty(mapSet(row, cellId)) &&
525
- collIsEmpty(mapSet(table, rowId)) &&
526
- collIsEmpty(mapSet(cellsDelta, tableId))
527
- ) {
528
- storeUnchanged();
529
- }
530
- callListenersIfChanged();
515
+ };
516
+ let cellListenerId;
517
+ let valueListenerId;
518
+ const addCheckpointImpl = (label = EMPTY_STRING) => {
519
+ if (isUndefined(currentId)) {
520
+ currentId = EMPTY_STRING + nextCheckpointId++;
521
+ mapSet(deltas, currentId, [cellsDelta, valuesDelta]);
522
+ setCheckpoint(currentId, label);
523
+ cellsDelta = mapNew();
524
+ valuesDelta = mapNew();
525
+ checkpointsChanged = 1;
531
526
  }
532
- },
533
- );
534
- const valueListenerId = store.addValueListener(
535
- null,
536
- (_store, valueId, newValue, oldValue) => {
537
- if (listening) {
538
- storeChanged();
539
- const oldNew = mapEnsure(valuesDelta, valueId, () => [
540
- oldValue,
541
- void 0,
542
- ]);
543
- oldNew[1] = newValue;
544
- if (
545
- oldNew[0] === newValue &&
546
- collIsEmpty(mapSet(valuesDelta, valueId))
547
- ) {
548
- storeUnchanged();
549
- }
550
- callListenersIfChanged();
527
+ return currentId;
528
+ };
529
+ const goBackwardImpl = () => {
530
+ if (!arrayIsEmpty(backwardIds)) {
531
+ arrayUnshift(forwardIds, addCheckpointImpl());
532
+ updateStore(0, currentId);
533
+ currentId = arrayPop(backwardIds);
534
+ checkpointsChanged = 1;
551
535
  }
552
- },
553
- );
554
- const addCheckpointImpl = (label = EMPTY_STRING) => {
555
- if (isUndefined(currentId)) {
556
- currentId = EMPTY_STRING + nextCheckpointId++;
557
- mapSet(deltas, currentId, [cellsDelta, valuesDelta]);
558
- setCheckpoint(currentId, label);
559
- cellsDelta = mapNew();
560
- valuesDelta = mapNew();
561
- checkpointsChanged = 1;
562
- }
563
- return currentId;
564
- };
565
- const goBackwardImpl = () => {
566
- if (!arrayIsEmpty(backwardIds)) {
567
- arrayUnshift(forwardIds, addCheckpointImpl());
568
- updateStore(0, currentId);
569
- currentId = arrayPop(backwardIds);
570
- checkpointsChanged = 1;
571
- }
572
- };
573
- const goForwardImpl = () => {
574
- if (!arrayIsEmpty(forwardIds)) {
575
- arrayPush(backwardIds, currentId);
576
- currentId = arrayShift(forwardIds);
577
- updateStore(1, currentId);
578
- checkpointsChanged = 1;
579
- }
580
- };
581
- const callListenersIfChanged = () => {
582
- if (checkpointsChanged) {
583
- callListeners(checkpointIdsListeners);
584
- checkpointsChanged = 0;
585
- }
586
- };
587
- const setSize = (size2) => {
588
- backwardIdsSize = size2;
589
- trimBackwardsIds();
590
- return checkpoints;
591
- };
592
- const addCheckpoint = (label) => {
593
- const id = addCheckpointImpl(label);
594
- callListenersIfChanged();
595
- return id;
596
- };
597
- const setCheckpoint = (checkpointId, label) => {
598
- if (hasCheckpoint(checkpointId) && mapGet(labels, checkpointId) !== label) {
599
- mapSet(labels, checkpointId, label);
600
- callListeners(checkpointListeners, [checkpointId]);
601
- }
602
- return checkpoints;
603
- };
604
- const getStore = () => store;
605
- const getCheckpointIds = () => [[...backwardIds], currentId, [...forwardIds]];
606
- const forEachCheckpoint = (checkpointCallback) =>
607
- mapForEach(labels, checkpointCallback);
608
- const hasCheckpoint = (checkpointId) => collHas(deltas, checkpointId);
609
- const getCheckpoint = (checkpointId) => mapGet(labels, checkpointId);
610
- const goBackward = () => {
611
- goBackwardImpl();
612
- callListenersIfChanged();
613
- return checkpoints;
614
- };
615
- const goForward = () => {
616
- goForwardImpl();
617
- callListenersIfChanged();
618
- return checkpoints;
619
- };
620
- const goTo = (checkpointId) => {
621
- const action = arrayHas(backwardIds, checkpointId)
622
- ? goBackwardImpl
623
- : arrayHas(forwardIds, checkpointId)
624
- ? goForwardImpl
625
- : null;
626
- while (!isUndefined(action) && checkpointId != currentId) {
627
- action();
628
- }
629
- callListenersIfChanged();
630
- return checkpoints;
631
- };
632
- const addCheckpointIdsListener = (listener) =>
633
- addListener(listener, checkpointIdsListeners);
634
- const addCheckpointListener = (checkpointId, listener) =>
635
- addListener(listener, checkpointListeners, [checkpointId]);
636
- const delListener = (listenerId) => {
637
- delListenerImpl(listenerId);
638
- return checkpoints;
639
- };
640
- const clear = () => {
641
- clearCheckpointIds(backwardIds);
642
- clearCheckpointIds(forwardIds);
643
- if (!isUndefined(currentId)) {
644
- clearCheckpointId(currentId);
645
- }
646
- currentId = void 0;
647
- nextCheckpointId = 0;
648
- addCheckpoint();
649
- return checkpoints;
650
- };
651
- const clearForward = () => {
652
- if (!arrayIsEmpty(forwardIds)) {
536
+ };
537
+ const goForwardImpl = () => {
538
+ if (!arrayIsEmpty(forwardIds)) {
539
+ arrayPush(backwardIds, currentId);
540
+ currentId = arrayShift(forwardIds);
541
+ updateStore(1, currentId);
542
+ checkpointsChanged = 1;
543
+ }
544
+ };
545
+ const callListenersIfChanged = () => {
546
+ if (checkpointsChanged) {
547
+ callListeners(checkpointIdsListeners);
548
+ checkpointsChanged = 0;
549
+ }
550
+ };
551
+ const setSize = (size2) => {
552
+ backwardIdsSize = size2;
553
+ trimBackwardsIds();
554
+ return checkpoints;
555
+ };
556
+ const addCheckpoint = (label) => {
557
+ const id = addCheckpointImpl(label);
558
+ callListenersIfChanged();
559
+ return id;
560
+ };
561
+ const setCheckpoint = (checkpointId, label) => {
562
+ if (
563
+ hasCheckpoint(checkpointId) &&
564
+ mapGet(labels, checkpointId) !== label
565
+ ) {
566
+ mapSet(labels, checkpointId, label);
567
+ callListeners(checkpointListeners, [checkpointId]);
568
+ }
569
+ return checkpoints;
570
+ };
571
+ const getStore = () => store;
572
+ const getCheckpointIds = () => [
573
+ [...backwardIds],
574
+ currentId,
575
+ [...forwardIds],
576
+ ];
577
+ const forEachCheckpoint = (checkpointCallback) =>
578
+ mapForEach(labels, checkpointCallback);
579
+ const hasCheckpoint = (checkpointId) => collHas(deltas, checkpointId);
580
+ const getCheckpoint = (checkpointId) => mapGet(labels, checkpointId);
581
+ const goBackward = () => {
582
+ goBackwardImpl();
583
+ callListenersIfChanged();
584
+ return checkpoints;
585
+ };
586
+ const goForward = () => {
587
+ goForwardImpl();
588
+ callListenersIfChanged();
589
+ return checkpoints;
590
+ };
591
+ const goTo = (checkpointId) => {
592
+ const action = arrayHas(backwardIds, checkpointId)
593
+ ? goBackwardImpl
594
+ : arrayHas(forwardIds, checkpointId)
595
+ ? goForwardImpl
596
+ : null;
597
+ while (!isUndefined(action) && checkpointId != currentId) {
598
+ action();
599
+ }
600
+ callListenersIfChanged();
601
+ return checkpoints;
602
+ };
603
+ const addCheckpointIdsListener = (listener) =>
604
+ addListener(listener, checkpointIdsListeners);
605
+ const addCheckpointListener = (checkpointId, listener) =>
606
+ addListener(listener, checkpointListeners, [checkpointId]);
607
+ const delListener = (listenerId) => {
608
+ delListenerImpl(listenerId);
609
+ return checkpoints;
610
+ };
611
+ const clear = () => {
612
+ clearCheckpointIds(backwardIds);
653
613
  clearCheckpointIds(forwardIds);
654
- callListeners(checkpointIdsListeners);
655
- }
656
- return checkpoints;
657
- };
658
- const destroy = () => {
659
- store.delListener(cellListenerId);
660
- store.delListener(valueListenerId);
661
- };
662
- const getListenerStats = () => ({
663
- checkpointIds: collSize2(checkpointIdsListeners),
664
- checkpoint: collSize2(checkpointListeners),
665
- });
666
- const checkpoints = {
667
- setSize,
668
- addCheckpoint,
669
- setCheckpoint,
670
- getStore,
671
- getCheckpointIds,
672
- forEachCheckpoint,
673
- hasCheckpoint,
674
- getCheckpoint,
675
- goBackward,
676
- goForward,
677
- goTo,
678
- addCheckpointIdsListener,
679
- addCheckpointListener,
680
- delListener,
681
- clear,
682
- clearForward,
683
- destroy,
684
- getListenerStats,
685
- };
686
- return objFreeze(checkpoints.clear());
687
- });
614
+ if (!isUndefined(currentId)) {
615
+ clearCheckpointId(currentId);
616
+ }
617
+ currentId = void 0;
618
+ nextCheckpointId = 0;
619
+ addCheckpoint();
620
+ return checkpoints;
621
+ };
622
+ const clearForward = () => {
623
+ if (!arrayIsEmpty(forwardIds)) {
624
+ clearCheckpointIds(forwardIds);
625
+ callListeners(checkpointIdsListeners);
626
+ }
627
+ return checkpoints;
628
+ };
629
+ const destroy = () => {
630
+ store.delListener(cellListenerId);
631
+ store.delListener(valueListenerId);
632
+ };
633
+ const getListenerStats = () => ({
634
+ checkpointIds: collSize2(checkpointIdsListeners),
635
+ checkpoint: collSize2(checkpointListeners),
636
+ });
637
+ const _registerListeners = () => {
638
+ cellListenerId = store.addCellListener(
639
+ null,
640
+ null,
641
+ null,
642
+ (_store, tableId, rowId, cellId, newCell, oldCell) => {
643
+ if (listening) {
644
+ storeChanged();
645
+ const table = mapEnsure(cellsDelta, tableId, mapNew);
646
+ const row = mapEnsure(table, rowId, mapNew);
647
+ const oldNew = mapEnsure(row, cellId, () => [oldCell, void 0]);
648
+ oldNew[1] = newCell;
649
+ if (
650
+ oldNew[0] === newCell &&
651
+ collIsEmpty(mapSet(row, cellId)) &&
652
+ collIsEmpty(mapSet(table, rowId)) &&
653
+ collIsEmpty(mapSet(cellsDelta, tableId))
654
+ ) {
655
+ storeUnchanged();
656
+ }
657
+ callListenersIfChanged();
658
+ }
659
+ },
660
+ );
661
+ valueListenerId = store.addValueListener(
662
+ null,
663
+ (_store, valueId, newValue, oldValue) => {
664
+ if (listening) {
665
+ storeChanged();
666
+ const oldNew = mapEnsure(valuesDelta, valueId, () => [
667
+ oldValue,
668
+ void 0,
669
+ ]);
670
+ oldNew[1] = newValue;
671
+ if (
672
+ oldNew[0] === newValue &&
673
+ collIsEmpty(mapSet(valuesDelta, valueId))
674
+ ) {
675
+ storeUnchanged();
676
+ }
677
+ callListenersIfChanged();
678
+ }
679
+ },
680
+ );
681
+ };
682
+ const checkpoints = {
683
+ setSize,
684
+ addCheckpoint,
685
+ setCheckpoint,
686
+ getStore,
687
+ getCheckpointIds,
688
+ forEachCheckpoint,
689
+ hasCheckpoint,
690
+ getCheckpoint,
691
+ goBackward,
692
+ goForward,
693
+ goTo,
694
+ addCheckpointIdsListener,
695
+ addCheckpointListener,
696
+ delListener,
697
+ clear,
698
+ clearForward,
699
+ destroy,
700
+ getListenerStats,
701
+ _registerListeners,
702
+ };
703
+ return objFreeze(checkpoints.clear());
704
+ },
705
+ (checkpoints) => checkpoints._registerListeners(),
706
+ );
688
707
 
689
708
  const defaultSorter = (sortKey1, sortKey2) =>
690
709
  (sortKey1 ?? 0) < (sortKey2 ?? 0) ? -1 : 1;
@@ -56,6 +56,7 @@ const arrayShift = (array) => array.shift();
56
56
 
57
57
  const object = Object;
58
58
  const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
59
+ const objEntries = object.entries;
59
60
  const objIds = object.keys;
60
61
  const objFreeze = object.freeze;
61
62
  const isObject = (obj) =>
@@ -65,10 +66,11 @@ const isObject = (obj) =>
65
66
  (objPrototype) =>
66
67
  objPrototype == object.prototype ||
67
68
  isUndefined(getPrototypeOf(objPrototype)),
69
+ /* istanbul ignore next */
68
70
  () => true,
69
71
  );
70
72
  const objMap = (obj, cb) =>
71
- arrayMap(object.entries(obj), ([id, value]) => cb(value, id));
73
+ arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
72
74
  const objSize = (obj) => size(objIds(obj));
73
75
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
74
76
 
@@ -391,13 +393,15 @@ const getCodeFunctions = () => {
391
393
  ];
392
394
  };
393
395
 
394
- const getCreateFunction = (getFunction) => {
395
- const getFunctionsByStore = /* @__PURE__ */ new WeakMap();
396
+ const getCreateFunction = (getFunction, initFunction) => {
397
+ const thingsByStore = /* @__PURE__ */ new WeakMap();
396
398
  return (store) => {
397
- if (!getFunctionsByStore.has(store)) {
398
- getFunctionsByStore.set(store, getFunction(store));
399
+ if (!thingsByStore.has(store)) {
400
+ thingsByStore.set(store, getFunction(store));
399
401
  }
400
- return getFunctionsByStore.get(store);
402
+ const thing = thingsByStore.get(store);
403
+ initFunction?.(thing);
404
+ return thing;
401
405
  };
402
406
  };
403
407
 
@@ -123,6 +123,7 @@ const arrayShift = (array) => array.shift();
123
123
 
124
124
  const object = Object;
125
125
  const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
126
+ const objEntries = object.entries;
126
127
  const objIds = object.keys;
127
128
  const objFrozen = object.isFrozen;
128
129
  const objFreeze = object.freeze;
@@ -133,6 +134,7 @@ const isObject = (obj) =>
133
134
  (objPrototype) =>
134
135
  objPrototype == object.prototype ||
135
136
  isUndefined(getPrototypeOf(objPrototype)),
137
+ /* istanbul ignore next */
136
138
  () => true,
137
139
  );
138
140
  const objNew = (entries = []) => object.fromEntries(entries);
@@ -143,7 +145,7 @@ const objDel = (obj, id) => {
143
145
  return obj;
144
146
  };
145
147
  const objMap = (obj, cb) =>
146
- arrayMap(object.entries(obj), ([id, value]) => cb(value, id));
148
+ arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
147
149
  const objSize = (obj) => size(objIds(obj));
148
150
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
149
151