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
@@ -79,13 +79,15 @@ const setNew = (entryOrEntries) =>
79
79
  );
80
80
  const setAdd = (set, value) => set?.add(value);
81
81
 
82
- const getCreateFunction = (getFunction) => {
83
- const getFunctionsByStore = /* @__PURE__ */ new WeakMap();
82
+ const getCreateFunction = (getFunction, initFunction) => {
83
+ const thingsByStore = /* @__PURE__ */ new WeakMap();
84
84
  return (store) => {
85
- if (!getFunctionsByStore.has(store)) {
86
- getFunctionsByStore.set(store, getFunction(store));
85
+ if (!thingsByStore.has(store)) {
86
+ thingsByStore.set(store, getFunction(store));
87
87
  }
88
- return getFunctionsByStore.get(store);
88
+ const thing = thingsByStore.get(store);
89
+ initFunction?.(thing);
90
+ return thing;
89
91
  };
90
92
  };
91
93
 
@@ -173,240 +175,255 @@ const getListenerFunctions = (getThing) => {
173
175
  return [addListener, callListeners, delListener, callListener];
174
176
  };
175
177
 
176
- const createCheckpoints = getCreateFunction((store) => {
177
- let backwardIdsSize = 100;
178
- let currentId;
179
- let cellsDelta = mapNew();
180
- let valuesDelta = mapNew();
181
- let listening = 1;
182
- let nextCheckpointId;
183
- let checkpointsChanged;
184
- const checkpointIdsListeners = mapNew();
185
- const checkpointListeners = mapNew();
186
- const [addListener, callListeners, delListenerImpl] = getListenerFunctions(
187
- () => checkpoints,
188
- );
189
- const deltas = mapNew();
190
- const labels = mapNew();
191
- const backwardIds = [];
192
- const forwardIds = [];
193
- const updateStore = (oldOrNew, checkpointId) => {
194
- listening = 0;
195
- store.transaction(() => {
196
- const [cellsDelta2, valuesDelta2] = mapGet(deltas, checkpointId);
197
- collForEach(cellsDelta2, (table, tableId) =>
198
- collForEach(table, (row, rowId) =>
199
- collForEach(row, (oldNew, cellId) =>
200
- setOrDelCell(store, tableId, rowId, cellId, oldNew[oldOrNew]),
178
+ const createCheckpoints = getCreateFunction(
179
+ (store) => {
180
+ let backwardIdsSize = 100;
181
+ let currentId;
182
+ let cellsDelta = mapNew();
183
+ let valuesDelta = mapNew();
184
+ let listening = 1;
185
+ let nextCheckpointId;
186
+ let checkpointsChanged;
187
+ const checkpointIdsListeners = mapNew();
188
+ const checkpointListeners = mapNew();
189
+ const [addListener, callListeners, delListenerImpl] = getListenerFunctions(
190
+ () => checkpoints,
191
+ );
192
+ const deltas = mapNew();
193
+ const labels = mapNew();
194
+ const backwardIds = [];
195
+ const forwardIds = [];
196
+ const updateStore = (oldOrNew, checkpointId) => {
197
+ listening = 0;
198
+ store.transaction(() => {
199
+ const [cellsDelta2, valuesDelta2] = mapGet(deltas, checkpointId);
200
+ collForEach(cellsDelta2, (table, tableId) =>
201
+ collForEach(table, (row, rowId) =>
202
+ collForEach(row, (oldNew, cellId) =>
203
+ setOrDelCell(store, tableId, rowId, cellId, oldNew[oldOrNew]),
204
+ ),
201
205
  ),
202
- ),
203
- );
204
- collForEach(valuesDelta2, (oldNew, valueId) =>
205
- setOrDelValue(store, valueId, oldNew[oldOrNew]),
206
+ );
207
+ collForEach(valuesDelta2, (oldNew, valueId) =>
208
+ setOrDelValue(store, valueId, oldNew[oldOrNew]),
209
+ );
210
+ });
211
+ listening = 1;
212
+ };
213
+ const clearCheckpointId = (checkpointId) => {
214
+ mapSet(deltas, checkpointId);
215
+ mapSet(labels, checkpointId);
216
+ callListeners(checkpointListeners, [checkpointId]);
217
+ };
218
+ const clearCheckpointIds = (checkpointIds, to) =>
219
+ arrayForEach(
220
+ arrayClear(checkpointIds, to ?? size(checkpointIds)),
221
+ clearCheckpointId,
206
222
  );
207
- });
208
- listening = 1;
209
- };
210
- const clearCheckpointId = (checkpointId) => {
211
- mapSet(deltas, checkpointId);
212
- mapSet(labels, checkpointId);
213
- callListeners(checkpointListeners, [checkpointId]);
214
- };
215
- const clearCheckpointIds = (checkpointIds, to) =>
216
- arrayForEach(
217
- arrayClear(checkpointIds, to ?? size(checkpointIds)),
218
- clearCheckpointId,
219
- );
220
- const trimBackwardsIds = () =>
221
- clearCheckpointIds(backwardIds, size(backwardIds) - backwardIdsSize);
222
- const storeChanged = () =>
223
- ifNotUndefined(currentId, () => {
224
- arrayPush(backwardIds, currentId);
225
- trimBackwardsIds();
226
- clearCheckpointIds(forwardIds);
227
- currentId = void 0;
223
+ const trimBackwardsIds = () =>
224
+ clearCheckpointIds(backwardIds, size(backwardIds) - backwardIdsSize);
225
+ const storeChanged = () =>
226
+ ifNotUndefined(currentId, () => {
227
+ arrayPush(backwardIds, currentId);
228
+ trimBackwardsIds();
229
+ clearCheckpointIds(forwardIds);
230
+ currentId = void 0;
231
+ checkpointsChanged = 1;
232
+ });
233
+ const storeUnchanged = () => {
234
+ currentId = arrayPop(backwardIds);
228
235
  checkpointsChanged = 1;
229
- });
230
- const storeUnchanged = () => {
231
- currentId = arrayPop(backwardIds);
232
- checkpointsChanged = 1;
233
- };
234
- const cellListenerId = store.addCellListener(
235
- null,
236
- null,
237
- null,
238
- (_store, tableId, rowId, cellId, newCell, oldCell) => {
239
- if (listening) {
240
- storeChanged();
241
- const table = mapEnsure(cellsDelta, tableId, mapNew);
242
- const row = mapEnsure(table, rowId, mapNew);
243
- const oldNew = mapEnsure(row, cellId, () => [oldCell, void 0]);
244
- oldNew[1] = newCell;
245
- if (
246
- oldNew[0] === newCell &&
247
- collIsEmpty(mapSet(row, cellId)) &&
248
- collIsEmpty(mapSet(table, rowId)) &&
249
- collIsEmpty(mapSet(cellsDelta, tableId))
250
- ) {
251
- storeUnchanged();
252
- }
253
- callListenersIfChanged();
236
+ };
237
+ let cellListenerId;
238
+ let valueListenerId;
239
+ const addCheckpointImpl = (label = EMPTY_STRING) => {
240
+ if (isUndefined(currentId)) {
241
+ currentId = EMPTY_STRING + nextCheckpointId++;
242
+ mapSet(deltas, currentId, [cellsDelta, valuesDelta]);
243
+ setCheckpoint(currentId, label);
244
+ cellsDelta = mapNew();
245
+ valuesDelta = mapNew();
246
+ checkpointsChanged = 1;
254
247
  }
255
- },
256
- );
257
- const valueListenerId = store.addValueListener(
258
- null,
259
- (_store, valueId, newValue, oldValue) => {
260
- if (listening) {
261
- storeChanged();
262
- const oldNew = mapEnsure(valuesDelta, valueId, () => [
263
- oldValue,
264
- void 0,
265
- ]);
266
- oldNew[1] = newValue;
267
- if (
268
- oldNew[0] === newValue &&
269
- collIsEmpty(mapSet(valuesDelta, valueId))
270
- ) {
271
- storeUnchanged();
272
- }
273
- callListenersIfChanged();
248
+ return currentId;
249
+ };
250
+ const goBackwardImpl = () => {
251
+ if (!arrayIsEmpty(backwardIds)) {
252
+ arrayUnshift(forwardIds, addCheckpointImpl());
253
+ updateStore(0, currentId);
254
+ currentId = arrayPop(backwardIds);
255
+ checkpointsChanged = 1;
274
256
  }
275
- },
276
- );
277
- const addCheckpointImpl = (label = EMPTY_STRING) => {
278
- if (isUndefined(currentId)) {
279
- currentId = EMPTY_STRING + nextCheckpointId++;
280
- mapSet(deltas, currentId, [cellsDelta, valuesDelta]);
281
- setCheckpoint(currentId, label);
282
- cellsDelta = mapNew();
283
- valuesDelta = mapNew();
284
- checkpointsChanged = 1;
285
- }
286
- return currentId;
287
- };
288
- const goBackwardImpl = () => {
289
- if (!arrayIsEmpty(backwardIds)) {
290
- arrayUnshift(forwardIds, addCheckpointImpl());
291
- updateStore(0, currentId);
292
- currentId = arrayPop(backwardIds);
293
- checkpointsChanged = 1;
294
- }
295
- };
296
- const goForwardImpl = () => {
297
- if (!arrayIsEmpty(forwardIds)) {
298
- arrayPush(backwardIds, currentId);
299
- currentId = arrayShift(forwardIds);
300
- updateStore(1, currentId);
301
- checkpointsChanged = 1;
302
- }
303
- };
304
- const callListenersIfChanged = () => {
305
- if (checkpointsChanged) {
306
- callListeners(checkpointIdsListeners);
307
- checkpointsChanged = 0;
308
- }
309
- };
310
- const setSize = (size2) => {
311
- backwardIdsSize = size2;
312
- trimBackwardsIds();
313
- return checkpoints;
314
- };
315
- const addCheckpoint = (label) => {
316
- const id = addCheckpointImpl(label);
317
- callListenersIfChanged();
318
- return id;
319
- };
320
- const setCheckpoint = (checkpointId, label) => {
321
- if (hasCheckpoint(checkpointId) && mapGet(labels, checkpointId) !== label) {
322
- mapSet(labels, checkpointId, label);
323
- callListeners(checkpointListeners, [checkpointId]);
324
- }
325
- return checkpoints;
326
- };
327
- const getStore = () => store;
328
- const getCheckpointIds = () => [[...backwardIds], currentId, [...forwardIds]];
329
- const forEachCheckpoint = (checkpointCallback) =>
330
- mapForEach(labels, checkpointCallback);
331
- const hasCheckpoint = (checkpointId) => collHas(deltas, checkpointId);
332
- const getCheckpoint = (checkpointId) => mapGet(labels, checkpointId);
333
- const goBackward = () => {
334
- goBackwardImpl();
335
- callListenersIfChanged();
336
- return checkpoints;
337
- };
338
- const goForward = () => {
339
- goForwardImpl();
340
- callListenersIfChanged();
341
- return checkpoints;
342
- };
343
- const goTo = (checkpointId) => {
344
- const action = arrayHas(backwardIds, checkpointId)
345
- ? goBackwardImpl
346
- : arrayHas(forwardIds, checkpointId)
347
- ? goForwardImpl
348
- : null;
349
- while (!isUndefined(action) && checkpointId != currentId) {
350
- action();
351
- }
352
- callListenersIfChanged();
353
- return checkpoints;
354
- };
355
- const addCheckpointIdsListener = (listener) =>
356
- addListener(listener, checkpointIdsListeners);
357
- const addCheckpointListener = (checkpointId, listener) =>
358
- addListener(listener, checkpointListeners, [checkpointId]);
359
- const delListener = (listenerId) => {
360
- delListenerImpl(listenerId);
361
- return checkpoints;
362
- };
363
- const clear = () => {
364
- clearCheckpointIds(backwardIds);
365
- clearCheckpointIds(forwardIds);
366
- if (!isUndefined(currentId)) {
367
- clearCheckpointId(currentId);
368
- }
369
- currentId = void 0;
370
- nextCheckpointId = 0;
371
- addCheckpoint();
372
- return checkpoints;
373
- };
374
- const clearForward = () => {
375
- if (!arrayIsEmpty(forwardIds)) {
257
+ };
258
+ const goForwardImpl = () => {
259
+ if (!arrayIsEmpty(forwardIds)) {
260
+ arrayPush(backwardIds, currentId);
261
+ currentId = arrayShift(forwardIds);
262
+ updateStore(1, currentId);
263
+ checkpointsChanged = 1;
264
+ }
265
+ };
266
+ const callListenersIfChanged = () => {
267
+ if (checkpointsChanged) {
268
+ callListeners(checkpointIdsListeners);
269
+ checkpointsChanged = 0;
270
+ }
271
+ };
272
+ const setSize = (size2) => {
273
+ backwardIdsSize = size2;
274
+ trimBackwardsIds();
275
+ return checkpoints;
276
+ };
277
+ const addCheckpoint = (label) => {
278
+ const id = addCheckpointImpl(label);
279
+ callListenersIfChanged();
280
+ return id;
281
+ };
282
+ const setCheckpoint = (checkpointId, label) => {
283
+ if (
284
+ hasCheckpoint(checkpointId) &&
285
+ mapGet(labels, checkpointId) !== label
286
+ ) {
287
+ mapSet(labels, checkpointId, label);
288
+ callListeners(checkpointListeners, [checkpointId]);
289
+ }
290
+ return checkpoints;
291
+ };
292
+ const getStore = () => store;
293
+ const getCheckpointIds = () => [
294
+ [...backwardIds],
295
+ currentId,
296
+ [...forwardIds],
297
+ ];
298
+ const forEachCheckpoint = (checkpointCallback) =>
299
+ mapForEach(labels, checkpointCallback);
300
+ const hasCheckpoint = (checkpointId) => collHas(deltas, checkpointId);
301
+ const getCheckpoint = (checkpointId) => mapGet(labels, checkpointId);
302
+ const goBackward = () => {
303
+ goBackwardImpl();
304
+ callListenersIfChanged();
305
+ return checkpoints;
306
+ };
307
+ const goForward = () => {
308
+ goForwardImpl();
309
+ callListenersIfChanged();
310
+ return checkpoints;
311
+ };
312
+ const goTo = (checkpointId) => {
313
+ const action = arrayHas(backwardIds, checkpointId)
314
+ ? goBackwardImpl
315
+ : arrayHas(forwardIds, checkpointId)
316
+ ? goForwardImpl
317
+ : null;
318
+ while (!isUndefined(action) && checkpointId != currentId) {
319
+ action();
320
+ }
321
+ callListenersIfChanged();
322
+ return checkpoints;
323
+ };
324
+ const addCheckpointIdsListener = (listener) =>
325
+ addListener(listener, checkpointIdsListeners);
326
+ const addCheckpointListener = (checkpointId, listener) =>
327
+ addListener(listener, checkpointListeners, [checkpointId]);
328
+ const delListener = (listenerId) => {
329
+ delListenerImpl(listenerId);
330
+ return checkpoints;
331
+ };
332
+ const clear = () => {
333
+ clearCheckpointIds(backwardIds);
376
334
  clearCheckpointIds(forwardIds);
377
- callListeners(checkpointIdsListeners);
378
- }
379
- return checkpoints;
380
- };
381
- const destroy = () => {
382
- store.delListener(cellListenerId);
383
- store.delListener(valueListenerId);
384
- };
385
- const getListenerStats = () => ({
386
- checkpointIds: collSize2(checkpointIdsListeners),
387
- checkpoint: collSize2(checkpointListeners),
388
- });
389
- const checkpoints = {
390
- setSize,
391
- addCheckpoint,
392
- setCheckpoint,
393
- getStore,
394
- getCheckpointIds,
395
- forEachCheckpoint,
396
- hasCheckpoint,
397
- getCheckpoint,
398
- goBackward,
399
- goForward,
400
- goTo,
401
- addCheckpointIdsListener,
402
- addCheckpointListener,
403
- delListener,
404
- clear,
405
- clearForward,
406
- destroy,
407
- getListenerStats,
408
- };
409
- return objFreeze(checkpoints.clear());
410
- });
335
+ if (!isUndefined(currentId)) {
336
+ clearCheckpointId(currentId);
337
+ }
338
+ currentId = void 0;
339
+ nextCheckpointId = 0;
340
+ addCheckpoint();
341
+ return checkpoints;
342
+ };
343
+ const clearForward = () => {
344
+ if (!arrayIsEmpty(forwardIds)) {
345
+ clearCheckpointIds(forwardIds);
346
+ callListeners(checkpointIdsListeners);
347
+ }
348
+ return checkpoints;
349
+ };
350
+ const destroy = () => {
351
+ store.delListener(cellListenerId);
352
+ store.delListener(valueListenerId);
353
+ };
354
+ const getListenerStats = () => ({
355
+ checkpointIds: collSize2(checkpointIdsListeners),
356
+ checkpoint: collSize2(checkpointListeners),
357
+ });
358
+ const _registerListeners = () => {
359
+ cellListenerId = store.addCellListener(
360
+ null,
361
+ null,
362
+ null,
363
+ (_store, tableId, rowId, cellId, newCell, oldCell) => {
364
+ if (listening) {
365
+ storeChanged();
366
+ const table = mapEnsure(cellsDelta, tableId, mapNew);
367
+ const row = mapEnsure(table, rowId, mapNew);
368
+ const oldNew = mapEnsure(row, cellId, () => [oldCell, void 0]);
369
+ oldNew[1] = newCell;
370
+ if (
371
+ oldNew[0] === newCell &&
372
+ collIsEmpty(mapSet(row, cellId)) &&
373
+ collIsEmpty(mapSet(table, rowId)) &&
374
+ collIsEmpty(mapSet(cellsDelta, tableId))
375
+ ) {
376
+ storeUnchanged();
377
+ }
378
+ callListenersIfChanged();
379
+ }
380
+ },
381
+ );
382
+ valueListenerId = store.addValueListener(
383
+ null,
384
+ (_store, valueId, newValue, oldValue) => {
385
+ if (listening) {
386
+ storeChanged();
387
+ const oldNew = mapEnsure(valuesDelta, valueId, () => [
388
+ oldValue,
389
+ void 0,
390
+ ]);
391
+ oldNew[1] = newValue;
392
+ if (
393
+ oldNew[0] === newValue &&
394
+ collIsEmpty(mapSet(valuesDelta, valueId))
395
+ ) {
396
+ storeUnchanged();
397
+ }
398
+ callListenersIfChanged();
399
+ }
400
+ },
401
+ );
402
+ };
403
+ const checkpoints = {
404
+ setSize,
405
+ addCheckpoint,
406
+ setCheckpoint,
407
+ getStore,
408
+ getCheckpointIds,
409
+ forEachCheckpoint,
410
+ hasCheckpoint,
411
+ getCheckpoint,
412
+ goBackward,
413
+ goForward,
414
+ goTo,
415
+ addCheckpointIdsListener,
416
+ addCheckpointListener,
417
+ delListener,
418
+ clear,
419
+ clearForward,
420
+ destroy,
421
+ getListenerStats,
422
+ _registerListeners,
423
+ };
424
+ return objFreeze(checkpoints.clear());
425
+ },
426
+ (checkpoints) => checkpoints._registerListeners(),
427
+ );
411
428
 
412
429
  export {createCheckpoints};
@@ -246,13 +246,15 @@ const getRowCellFunction = (getRowCell, defaultCellValue) =>
246
246
  isString(getRowCell)
247
247
  ? (getCell) => getCell(getRowCell)
248
248
  : getRowCell ?? (() => defaultCellValue ?? EMPTY_STRING);
249
- const getCreateFunction = (getFunction) => {
250
- const getFunctionsByStore = /* @__PURE__ */ new WeakMap();
249
+ const getCreateFunction = (getFunction, initFunction) => {
250
+ const thingsByStore = /* @__PURE__ */ new WeakMap();
251
251
  return (store) => {
252
- if (!getFunctionsByStore.has(store)) {
253
- getFunctionsByStore.set(store, getFunction(store));
252
+ if (!thingsByStore.has(store)) {
253
+ thingsByStore.set(store, getFunction(store));
254
254
  }
255
- return getFunctionsByStore.get(store);
255
+ const thing = thingsByStore.get(store);
256
+ initFunction?.(thing);
257
+ return thing;
256
258
  };
257
259
  };
258
260
 
@@ -317,13 +317,15 @@ const getRowCellFunction = (getRowCell, defaultCellValue) =>
317
317
  isString(getRowCell)
318
318
  ? (getCell) => getCell(getRowCell)
319
319
  : getRowCell ?? (() => defaultCellValue ?? EMPTY_STRING);
320
- const getCreateFunction = (getFunction) => {
321
- const getFunctionsByStore = /* @__PURE__ */ new WeakMap();
320
+ const getCreateFunction = (getFunction, initFunction) => {
321
+ const thingsByStore = /* @__PURE__ */ new WeakMap();
322
322
  return (store) => {
323
- if (!getFunctionsByStore.has(store)) {
324
- getFunctionsByStore.set(store, getFunction(store));
323
+ if (!thingsByStore.has(store)) {
324
+ thingsByStore.set(store, getFunction(store));
325
325
  }
326
- return getFunctionsByStore.get(store);
326
+ const thing = thingsByStore.get(store);
327
+ initFunction?.(thing);
328
+ return thing;
327
329
  };
328
330
  };
329
331
 
@@ -11,6 +11,7 @@ const arrayShift = (array) => array.shift();
11
11
 
12
12
  const object = Object;
13
13
  const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
14
+ const objEntries = object.entries;
14
15
  const objIds = object.keys;
15
16
  const objFreeze = object.freeze;
16
17
  const isObject = (obj) =>
@@ -20,6 +21,7 @@ const isObject = (obj) =>
20
21
  (objPrototype) =>
21
22
  objPrototype == object.prototype ||
22
23
  isUndefined(getPrototypeOf(objPrototype)),
24
+ /* istanbul ignore next */
23
25
  () => true,
24
26
  );
25
27
  const objGet = (obj, id) => ifNotUndefined(obj, (obj2) => obj2[id]);
@@ -29,7 +31,7 @@ const objDel = (obj, id) => {
29
31
  return obj;
30
32
  };
31
33
  const objMap = (obj, cb) =>
32
- arrayMap(object.entries(obj), ([id, value]) => cb(value, id));
34
+ arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
33
35
  const objSize = (obj) => size(objIds(obj));
34
36
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
35
37
  const objEnsure = (obj, id, getDefaultValue) => {
@@ -18,6 +18,7 @@ const isObject = (obj) =>
18
18
  (objPrototype) =>
19
19
  objPrototype == object.prototype ||
20
20
  isUndefined(getPrototypeOf(objPrototype)),
21
+ /* istanbul ignore next */
21
22
  () => true,
22
23
  );
23
24
  const objSize = (obj) => size(objIds(obj));
@@ -40,6 +40,7 @@ const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
40
40
 
41
41
  const object = Object;
42
42
  const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
43
+ const objEntries = object.entries;
43
44
  const objIds = object.keys;
44
45
  const objFreeze = object.freeze;
45
46
  const isObject = (obj) =>
@@ -49,6 +50,7 @@ const isObject = (obj) =>
49
50
  (objPrototype) =>
50
51
  objPrototype == object.prototype ||
51
52
  isUndefined(getPrototypeOf(objPrototype)),
53
+ /* istanbul ignore next */
52
54
  () => true,
53
55
  );
54
56
  const objNew = (entries = []) => object.fromEntries(entries);
@@ -60,7 +62,7 @@ const objDel = (obj, id) => {
60
62
  return obj;
61
63
  };
62
64
  const objMap = (obj, cb) =>
63
- arrayMap(object.entries(obj), ([id, value]) => cb(value, id));
65
+ arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
64
66
  const objValues = (obj) => object.values(obj);
65
67
  const objSize = (obj) => size(objIds(obj));
66
68
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
@@ -41,6 +41,7 @@ const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
41
41
 
42
42
  const object = Object;
43
43
  const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
44
+ const objEntries = object.entries;
44
45
  const objIds = object.keys;
45
46
  const objFreeze = object.freeze;
46
47
  const isObject = (obj) =>
@@ -50,6 +51,7 @@ const isObject = (obj) =>
50
51
  (objPrototype) =>
51
52
  objPrototype == object.prototype ||
52
53
  isUndefined(getPrototypeOf(objPrototype)),
54
+ /* istanbul ignore next */
53
55
  () => true,
54
56
  );
55
57
  const objNew = (entries = []) => object.fromEntries(entries);
@@ -61,7 +63,7 @@ const objDel = (obj, id) => {
61
63
  return obj;
62
64
  };
63
65
  const objMap = (obj, cb) =>
64
- arrayMap(object.entries(obj), ([id, value]) => cb(value, id));
66
+ arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
65
67
  const objValues = (obj) => object.values(obj);
66
68
  const objSize = (obj) => size(objIds(obj));
67
69
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;
@@ -42,6 +42,7 @@ const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
42
42
 
43
43
  const object = Object;
44
44
  const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
45
+ const objEntries = object.entries;
45
46
  const objIds = object.keys;
46
47
  const objFreeze = object.freeze;
47
48
  const isObject = (obj) =>
@@ -51,6 +52,7 @@ const isObject = (obj) =>
51
52
  (objPrototype) =>
52
53
  objPrototype == object.prototype ||
53
54
  isUndefined(getPrototypeOf(objPrototype)),
55
+ /* istanbul ignore next */
54
56
  () => true,
55
57
  );
56
58
  const objNew = (entries = []) => object.fromEntries(entries);
@@ -62,7 +64,7 @@ const objDel = (obj, id) => {
62
64
  return obj;
63
65
  };
64
66
  const objMap = (obj, cb) =>
65
- arrayMap(object.entries(obj), ([id, value]) => cb(value, id));
67
+ arrayMap(objEntries(obj), ([id, value]) => cb(value, id));
66
68
  const objValues = (obj) => object.values(obj);
67
69
  const objSize = (obj) => size(objIds(obj));
68
70
  const objIsEmpty = (obj) => isObject(obj) && objSize(obj) == 0;