tinybase 8.0.0-beta.0 → 8.0.0-beta.2

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 (264) hide show
  1. package/@types/index.d.ts +1 -0
  2. package/@types/mergeable-store/with-schemas/index.d.ts +1 -1
  3. package/@types/middleware/index.d.ts +1181 -0
  4. package/@types/middleware/with-schemas/index.d.ts +1495 -0
  5. package/@types/omni/index.d.ts +1 -0
  6. package/@types/omni/with-schemas/index.d.ts +1 -0
  7. package/@types/store/index.d.ts +0 -1
  8. package/@types/with-schemas/index.d.ts +1 -0
  9. package/agents.md +33 -11
  10. package/checkpoints/index.js +20 -20
  11. package/checkpoints/with-schemas/index.js +20 -20
  12. package/common/index.js +3 -2
  13. package/common/with-schemas/index.js +3 -2
  14. package/index.js +632 -215
  15. package/indexes/index.js +13 -12
  16. package/indexes/with-schemas/index.js +13 -12
  17. package/mergeable-store/index.js +498 -197
  18. package/mergeable-store/with-schemas/index.js +498 -197
  19. package/metrics/index.js +13 -12
  20. package/metrics/with-schemas/index.js +13 -12
  21. package/middleware/index.js +169 -0
  22. package/middleware/with-schemas/index.js +169 -0
  23. package/min/checkpoints/index.js +1 -1
  24. package/min/checkpoints/index.js.gz +0 -0
  25. package/min/checkpoints/with-schemas/index.js +1 -1
  26. package/min/checkpoints/with-schemas/index.js.gz +0 -0
  27. package/min/common/index.js +1 -1
  28. package/min/common/index.js.gz +0 -0
  29. package/min/common/with-schemas/index.js +1 -1
  30. package/min/common/with-schemas/index.js.gz +0 -0
  31. package/min/index.js +1 -1
  32. package/min/index.js.gz +0 -0
  33. package/min/indexes/index.js +1 -1
  34. package/min/indexes/index.js.gz +0 -0
  35. package/min/indexes/with-schemas/index.js +1 -1
  36. package/min/indexes/with-schemas/index.js.gz +0 -0
  37. package/min/mergeable-store/index.js +1 -1
  38. package/min/mergeable-store/index.js.gz +0 -0
  39. package/min/mergeable-store/with-schemas/index.js +1 -1
  40. package/min/mergeable-store/with-schemas/index.js.gz +0 -0
  41. package/min/metrics/index.js +1 -1
  42. package/min/metrics/index.js.gz +0 -0
  43. package/min/metrics/with-schemas/index.js +1 -1
  44. package/min/metrics/with-schemas/index.js.gz +0 -0
  45. package/min/middleware/index.js +1 -0
  46. package/min/middleware/index.js.gz +0 -0
  47. package/min/middleware/with-schemas/index.js +1 -0
  48. package/min/middleware/with-schemas/index.js.gz +0 -0
  49. package/min/omni/index.js +1 -1
  50. package/min/omni/index.js.gz +0 -0
  51. package/min/omni/with-schemas/index.js +1 -1
  52. package/min/omni/with-schemas/index.js.gz +0 -0
  53. package/min/persisters/index.js +1 -1
  54. package/min/persisters/index.js.gz +0 -0
  55. package/min/persisters/persister-automerge/index.js +1 -1
  56. package/min/persisters/persister-automerge/index.js.gz +0 -0
  57. package/min/persisters/persister-automerge/with-schemas/index.js +1 -1
  58. package/min/persisters/persister-automerge/with-schemas/index.js.gz +0 -0
  59. package/min/persisters/persister-browser/index.js +1 -1
  60. package/min/persisters/persister-browser/index.js.gz +0 -0
  61. package/min/persisters/persister-browser/with-schemas/index.js +1 -1
  62. package/min/persisters/persister-browser/with-schemas/index.js.gz +0 -0
  63. package/min/persisters/persister-cr-sqlite-wasm/index.js +1 -1
  64. package/min/persisters/persister-cr-sqlite-wasm/index.js.gz +0 -0
  65. package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +1 -1
  66. package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js.gz +0 -0
  67. package/min/persisters/persister-durable-object-sql-storage/index.js +1 -1
  68. package/min/persisters/persister-durable-object-sql-storage/index.js.gz +0 -0
  69. package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js +1 -1
  70. package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js.gz +0 -0
  71. package/min/persisters/persister-durable-object-storage/index.js +1 -1
  72. package/min/persisters/persister-durable-object-storage/index.js.gz +0 -0
  73. package/min/persisters/persister-durable-object-storage/with-schemas/index.js +1 -1
  74. package/min/persisters/persister-durable-object-storage/with-schemas/index.js.gz +0 -0
  75. package/min/persisters/persister-electric-sql/index.js +1 -1
  76. package/min/persisters/persister-electric-sql/index.js.gz +0 -0
  77. package/min/persisters/persister-electric-sql/with-schemas/index.js +1 -1
  78. package/min/persisters/persister-electric-sql/with-schemas/index.js.gz +0 -0
  79. package/min/persisters/persister-expo-sqlite/index.js +1 -1
  80. package/min/persisters/persister-expo-sqlite/index.js.gz +0 -0
  81. package/min/persisters/persister-expo-sqlite/with-schemas/index.js +1 -1
  82. package/min/persisters/persister-expo-sqlite/with-schemas/index.js.gz +0 -0
  83. package/min/persisters/persister-file/index.js +1 -1
  84. package/min/persisters/persister-file/index.js.gz +0 -0
  85. package/min/persisters/persister-file/with-schemas/index.js +1 -1
  86. package/min/persisters/persister-file/with-schemas/index.js.gz +0 -0
  87. package/min/persisters/persister-indexed-db/index.js +1 -1
  88. package/min/persisters/persister-indexed-db/index.js.gz +0 -0
  89. package/min/persisters/persister-indexed-db/with-schemas/index.js +1 -1
  90. package/min/persisters/persister-indexed-db/with-schemas/index.js.gz +0 -0
  91. package/min/persisters/persister-libsql/index.js +1 -1
  92. package/min/persisters/persister-libsql/index.js.gz +0 -0
  93. package/min/persisters/persister-libsql/with-schemas/index.js +1 -1
  94. package/min/persisters/persister-libsql/with-schemas/index.js.gz +0 -0
  95. package/min/persisters/persister-partykit-client/index.js +1 -1
  96. package/min/persisters/persister-partykit-client/index.js.gz +0 -0
  97. package/min/persisters/persister-partykit-client/with-schemas/index.js +1 -1
  98. package/min/persisters/persister-partykit-client/with-schemas/index.js.gz +0 -0
  99. package/min/persisters/persister-partykit-server/index.js +1 -1
  100. package/min/persisters/persister-partykit-server/index.js.gz +0 -0
  101. package/min/persisters/persister-partykit-server/with-schemas/index.js +1 -1
  102. package/min/persisters/persister-partykit-server/with-schemas/index.js.gz +0 -0
  103. package/min/persisters/persister-pglite/index.js +1 -1
  104. package/min/persisters/persister-pglite/index.js.gz +0 -0
  105. package/min/persisters/persister-pglite/with-schemas/index.js +1 -1
  106. package/min/persisters/persister-pglite/with-schemas/index.js.gz +0 -0
  107. package/min/persisters/persister-postgres/index.js +1 -1
  108. package/min/persisters/persister-postgres/index.js.gz +0 -0
  109. package/min/persisters/persister-postgres/with-schemas/index.js +1 -1
  110. package/min/persisters/persister-postgres/with-schemas/index.js.gz +0 -0
  111. package/min/persisters/persister-powersync/index.js +1 -1
  112. package/min/persisters/persister-powersync/index.js.gz +0 -0
  113. package/min/persisters/persister-powersync/with-schemas/index.js +1 -1
  114. package/min/persisters/persister-powersync/with-schemas/index.js.gz +0 -0
  115. package/min/persisters/persister-react-native-mmkv/index.js +1 -1
  116. package/min/persisters/persister-react-native-mmkv/index.js.gz +0 -0
  117. package/min/persisters/persister-react-native-mmkv/with-schemas/index.js +1 -1
  118. package/min/persisters/persister-react-native-mmkv/with-schemas/index.js.gz +0 -0
  119. package/min/persisters/persister-react-native-sqlite/index.js +1 -1
  120. package/min/persisters/persister-react-native-sqlite/index.js.gz +0 -0
  121. package/min/persisters/persister-react-native-sqlite/with-schemas/index.js +1 -1
  122. package/min/persisters/persister-react-native-sqlite/with-schemas/index.js.gz +0 -0
  123. package/min/persisters/persister-remote/index.js +1 -1
  124. package/min/persisters/persister-remote/index.js.gz +0 -0
  125. package/min/persisters/persister-remote/with-schemas/index.js +1 -1
  126. package/min/persisters/persister-remote/with-schemas/index.js.gz +0 -0
  127. package/min/persisters/persister-sqlite-bun/index.js +1 -1
  128. package/min/persisters/persister-sqlite-bun/index.js.gz +0 -0
  129. package/min/persisters/persister-sqlite-bun/with-schemas/index.js +1 -1
  130. package/min/persisters/persister-sqlite-bun/with-schemas/index.js.gz +0 -0
  131. package/min/persisters/persister-sqlite-wasm/index.js +1 -1
  132. package/min/persisters/persister-sqlite-wasm/index.js.gz +0 -0
  133. package/min/persisters/persister-sqlite-wasm/with-schemas/index.js +1 -1
  134. package/min/persisters/persister-sqlite-wasm/with-schemas/index.js.gz +0 -0
  135. package/min/persisters/persister-sqlite3/index.js +1 -1
  136. package/min/persisters/persister-sqlite3/index.js.gz +0 -0
  137. package/min/persisters/persister-sqlite3/with-schemas/index.js +1 -1
  138. package/min/persisters/persister-sqlite3/with-schemas/index.js.gz +0 -0
  139. package/min/persisters/persister-yjs/index.js +1 -1
  140. package/min/persisters/persister-yjs/index.js.gz +0 -0
  141. package/min/persisters/persister-yjs/with-schemas/index.js +1 -1
  142. package/min/persisters/persister-yjs/with-schemas/index.js.gz +0 -0
  143. package/min/persisters/with-schemas/index.js +1 -1
  144. package/min/persisters/with-schemas/index.js.gz +0 -0
  145. package/min/queries/index.js +1 -1
  146. package/min/queries/index.js.gz +0 -0
  147. package/min/queries/with-schemas/index.js +1 -1
  148. package/min/queries/with-schemas/index.js.gz +0 -0
  149. package/min/relationships/index.js +1 -1
  150. package/min/relationships/index.js.gz +0 -0
  151. package/min/relationships/with-schemas/index.js +1 -1
  152. package/min/relationships/with-schemas/index.js.gz +0 -0
  153. package/min/store/index.js +1 -1
  154. package/min/store/index.js.gz +0 -0
  155. package/min/store/with-schemas/index.js +1 -1
  156. package/min/store/with-schemas/index.js.gz +0 -0
  157. package/min/synchronizers/index.js +1 -1
  158. package/min/synchronizers/index.js.gz +0 -0
  159. package/min/synchronizers/synchronizer-broadcast-channel/index.js +1 -1
  160. package/min/synchronizers/synchronizer-broadcast-channel/index.js.gz +0 -0
  161. package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +1 -1
  162. package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js.gz +0 -0
  163. package/min/synchronizers/synchronizer-local/index.js +1 -1
  164. package/min/synchronizers/synchronizer-local/index.js.gz +0 -0
  165. package/min/synchronizers/synchronizer-local/with-schemas/index.js +1 -1
  166. package/min/synchronizers/synchronizer-local/with-schemas/index.js.gz +0 -0
  167. package/min/synchronizers/synchronizer-ws-client/index.js +1 -1
  168. package/min/synchronizers/synchronizer-ws-client/index.js.gz +0 -0
  169. package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js +1 -1
  170. package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js.gz +0 -0
  171. package/min/synchronizers/synchronizer-ws-server/index.js +1 -1
  172. package/min/synchronizers/synchronizer-ws-server/index.js.gz +0 -0
  173. package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js +1 -1
  174. package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js.gz +0 -0
  175. package/min/synchronizers/synchronizer-ws-server-durable-object/index.js +1 -1
  176. package/min/synchronizers/synchronizer-ws-server-durable-object/index.js.gz +0 -0
  177. package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +1 -1
  178. package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js.gz +0 -0
  179. package/min/synchronizers/synchronizer-ws-server-simple/index.js +1 -1
  180. package/min/synchronizers/synchronizer-ws-server-simple/index.js.gz +0 -0
  181. package/min/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js +1 -1
  182. package/min/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js.gz +0 -0
  183. package/min/synchronizers/with-schemas/index.js +1 -1
  184. package/min/synchronizers/with-schemas/index.js.gz +0 -0
  185. package/min/ui-react-inspector/index.js +1 -1
  186. package/min/ui-react-inspector/index.js.gz +0 -0
  187. package/min/ui-react-inspector/with-schemas/index.js +1 -1
  188. package/min/ui-react-inspector/with-schemas/index.js.gz +0 -0
  189. package/min/with-schemas/index.js +1 -1
  190. package/min/with-schemas/index.js.gz +0 -0
  191. package/omni/index.js +667 -232
  192. package/omni/with-schemas/index.js +667 -232
  193. package/package.json +55 -19
  194. package/persisters/index.js +29 -12
  195. package/persisters/persister-automerge/index.js +17 -9
  196. package/persisters/persister-automerge/with-schemas/index.js +17 -9
  197. package/persisters/persister-browser/index.js +34 -10
  198. package/persisters/persister-browser/with-schemas/index.js +34 -10
  199. package/persisters/persister-cr-sqlite-wasm/index.js +29 -12
  200. package/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +29 -12
  201. package/persisters/persister-durable-object-sql-storage/index.js +29 -12
  202. package/persisters/persister-durable-object-sql-storage/with-schemas/index.js +29 -12
  203. package/persisters/persister-durable-object-storage/index.js +24 -17
  204. package/persisters/persister-durable-object-storage/with-schemas/index.js +24 -17
  205. package/persisters/persister-electric-sql/index.js +29 -12
  206. package/persisters/persister-electric-sql/with-schemas/index.js +29 -12
  207. package/persisters/persister-expo-sqlite/index.js +29 -12
  208. package/persisters/persister-expo-sqlite/with-schemas/index.js +29 -12
  209. package/persisters/persister-file/index.js +34 -10
  210. package/persisters/persister-file/with-schemas/index.js +34 -10
  211. package/persisters/persister-indexed-db/index.js +17 -9
  212. package/persisters/persister-indexed-db/with-schemas/index.js +17 -9
  213. package/persisters/persister-libsql/index.js +29 -12
  214. package/persisters/persister-libsql/with-schemas/index.js +29 -12
  215. package/persisters/persister-partykit-client/index.js +44 -11
  216. package/persisters/persister-partykit-client/with-schemas/index.js +44 -11
  217. package/persisters/persister-partykit-server/index.js +39 -4
  218. package/persisters/persister-partykit-server/with-schemas/index.js +39 -4
  219. package/persisters/persister-pglite/index.js +29 -12
  220. package/persisters/persister-pglite/with-schemas/index.js +29 -12
  221. package/persisters/persister-postgres/index.js +29 -12
  222. package/persisters/persister-postgres/with-schemas/index.js +29 -12
  223. package/persisters/persister-powersync/index.js +29 -12
  224. package/persisters/persister-powersync/with-schemas/index.js +29 -12
  225. package/persisters/persister-react-native-mmkv/index.js +17 -9
  226. package/persisters/persister-react-native-mmkv/with-schemas/index.js +17 -9
  227. package/persisters/persister-react-native-sqlite/index.js +29 -12
  228. package/persisters/persister-react-native-sqlite/with-schemas/index.js +29 -12
  229. package/persisters/persister-remote/index.js +17 -9
  230. package/persisters/persister-remote/with-schemas/index.js +17 -9
  231. package/persisters/persister-sqlite-bun/index.js +29 -12
  232. package/persisters/persister-sqlite-bun/with-schemas/index.js +29 -12
  233. package/persisters/persister-sqlite-wasm/index.js +29 -12
  234. package/persisters/persister-sqlite-wasm/with-schemas/index.js +29 -12
  235. package/persisters/persister-sqlite3/index.js +29 -12
  236. package/persisters/persister-sqlite3/with-schemas/index.js +29 -12
  237. package/persisters/persister-yjs/index.js +19 -11
  238. package/persisters/persister-yjs/with-schemas/index.js +19 -11
  239. package/persisters/with-schemas/index.js +29 -12
  240. package/queries/index.js +16 -20
  241. package/queries/with-schemas/index.js +16 -20
  242. package/readme.md +21 -13
  243. package/relationships/index.js +13 -12
  244. package/relationships/with-schemas/index.js +13 -12
  245. package/releases.md +59 -43
  246. package/store/index.js +479 -192
  247. package/store/with-schemas/index.js +479 -192
  248. package/synchronizers/index.js +17 -9
  249. package/synchronizers/synchronizer-broadcast-channel/index.js +17 -9
  250. package/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +17 -9
  251. package/synchronizers/synchronizer-local/index.js +19 -11
  252. package/synchronizers/synchronizer-local/with-schemas/index.js +19 -11
  253. package/synchronizers/synchronizer-ws-client/index.js +31 -10
  254. package/synchronizers/synchronizer-ws-client/with-schemas/index.js +31 -10
  255. package/synchronizers/synchronizer-ws-server/index.js +34 -13
  256. package/synchronizers/synchronizer-ws-server/with-schemas/index.js +34 -13
  257. package/synchronizers/synchronizer-ws-server-durable-object/index.js +31 -10
  258. package/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +31 -10
  259. package/synchronizers/synchronizer-ws-server-simple/index.js +11 -10
  260. package/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js +11 -10
  261. package/synchronizers/with-schemas/index.js +17 -9
  262. package/ui-react-inspector/index.js +475 -193
  263. package/ui-react-inspector/with-schemas/index.js +475 -193
  264. package/with-schemas/index.js +632 -215
@@ -64,6 +64,7 @@ const size = (arrayOrString) => arrayOrString.length;
64
64
  const test = (regex, subject) => regex.test(subject);
65
65
  const getUndefined = () => void 0;
66
66
  const noop = () => {};
67
+ const structuredClone = GLOBAL.structuredClone;
67
68
  const tryCatch = async (action, then1, then2) => {
68
69
  try {
69
70
  return await action();
@@ -99,25 +100,6 @@ const arrayPop = (array) => array.pop();
99
100
  const arrayUnshift = (array, ...values) => array.unshift(...values);
100
101
  const arrayShift = (array) => array.shift();
101
102
 
102
- const getCellOrValueType = (cellOrValue) => {
103
- if (isNull(cellOrValue)) {
104
- return NULL;
105
- }
106
- const type = getTypeOf(cellOrValue);
107
- return isTypeStringOrBoolean(type) ||
108
- (type == NUMBER && isFiniteNumber(cellOrValue))
109
- ? type
110
- : void 0;
111
- };
112
- const isCellOrValueOrUndefined = (cellOrValue) =>
113
- isUndefined(cellOrValue) || !isUndefined(getCellOrValueType(cellOrValue));
114
- const setOrDelCell = (store, tableId, rowId, cellId, cell) =>
115
- isUndefined(cell)
116
- ? store.delCell(tableId, rowId, cellId, true)
117
- : store.setCell(tableId, rowId, cellId, cell);
118
- const setOrDelValue = (store, valueId, value) =>
119
- isUndefined(value) ? store.delValue(valueId) : store.setValue(valueId, value);
120
-
121
103
  const collSizeN = (collSizer) => (coll) =>
122
104
  arrayReduce(collValues(coll), (total, coll2) => total + collSizer(coll2), 0);
123
105
  const collSize = (coll) => coll?.size ?? 0;
@@ -149,6 +131,7 @@ const isObject = (obj) =>
149
131
  const objIds = object.keys;
150
132
  const objFreeze = object.freeze;
151
133
  const objNew = (entries = []) => object.fromEntries(entries);
134
+ const objMerge = (...objs) => object.assign({}, ...objs);
152
135
  const objGet = (obj, id) => ifNotUndefined(obj, (obj2) => obj2[id]);
153
136
  const objHas = (obj, id) => id in obj;
154
137
  const objDel = (obj, id) => {
@@ -208,31 +191,32 @@ const objValidate = (obj, validateChild, onInvalidObj, emptyIsValid = 0) => {
208
191
  return emptyIsValid ? true : !objIsEmpty(obj);
209
192
  };
210
193
 
211
- const mapNew = (entries) => new Map(entries);
212
- const mapKeys = (map) => [...(map?.keys() ?? [])];
213
- const mapGet = (map, key) => map?.get(key);
214
- const mapForEach = (map, cb) =>
215
- collForEach(map, (value, key) => cb(key, value));
194
+ const map = Map;
195
+ const mapNew = (entries) => new map(entries);
196
+ const mapKeys = (map2) => [...(map2?.keys() ?? [])];
197
+ const mapGet = (map2, key) => map2?.get(key);
198
+ const mapForEach = (map2, cb) =>
199
+ collForEach(map2, (value, key) => cb(key, value));
216
200
  const mapMap = (coll, cb) =>
217
201
  arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
218
- const mapSet = (map, key, value) =>
219
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
220
- const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
221
- if (!collHas(map, key)) {
222
- mapSet(map, key, getDefaultValue());
202
+ const mapSet = (map2, key, value) =>
203
+ isUndefined(value) ? (collDel(map2, key), map2) : map2?.set(key, value);
204
+ const mapEnsure = (map2, key, getDefaultValue, hadExistingValue) => {
205
+ if (!collHas(map2, key)) {
206
+ mapSet(map2, key, getDefaultValue());
223
207
  } else {
224
- hadExistingValue?.(mapGet(map, key));
208
+ hadExistingValue?.(mapGet(map2, key));
225
209
  }
226
- return mapGet(map, key);
210
+ return mapGet(map2, key);
227
211
  };
228
- const mapMatch = (map, obj, set, del = mapSet) => {
229
- objMap(obj, (value, id) => set(map, id, value));
230
- mapForEach(map, (id) => (objHas(obj, id) ? 0 : del(map, id)));
231
- return map;
212
+ const mapMatch = (map2, obj, set, del = mapSet) => {
213
+ objMap(obj, (value, id) => set(map2, id, value));
214
+ mapForEach(map2, (id) => (objHas(obj, id) ? 0 : del(map2, id)));
215
+ return map2;
232
216
  };
233
- const mapToObj = (map, valueMapper, excludeMapValue, excludeObjValue) => {
217
+ const mapToObj = (map2, valueMapper, excludeMapValue, excludeObjValue) => {
234
218
  const obj = {};
235
- collForEach(map, (mapValue, id) => {
219
+ collForEach(map2, (mapValue, id) => {
236
220
  if (!excludeMapValue?.(mapValue, id)) {
237
221
  const objValue = valueMapper ? valueMapper(mapValue, id) : mapValue;
238
222
  if (!excludeObjValue?.(objValue)) {
@@ -242,27 +226,27 @@ const mapToObj = (map, valueMapper, excludeMapValue, excludeObjValue) => {
242
226
  });
243
227
  return obj;
244
228
  };
245
- const mapToObj2 = (map, valueMapper, excludeMapValue) =>
229
+ const mapToObj2 = (map2, valueMapper, excludeMapValue) =>
246
230
  mapToObj(
247
- map,
231
+ map2,
248
232
  (childMap) => mapToObj(childMap, valueMapper, excludeMapValue),
249
233
  collIsEmpty,
250
234
  objIsEmpty,
251
235
  );
252
- const mapToObj3 = (map, valueMapper, excludeMapValue) =>
236
+ const mapToObj3 = (map2, valueMapper, excludeMapValue) =>
253
237
  mapToObj(
254
- map,
238
+ map2,
255
239
  (childMap) => mapToObj2(childMap, valueMapper, excludeMapValue),
256
240
  collIsEmpty,
257
241
  objIsEmpty,
258
242
  );
259
- const mapClone = (map, mapValue) => {
260
- const map2 = mapNew();
261
- collForEach(map, (value, key) => map2.set(key, mapValue?.(value) ?? value));
262
- return map2;
243
+ const mapClone = (map2, mapValue) => {
244
+ const map22 = mapNew();
245
+ collForEach(map2, (value, key) => map22.set(key, mapValue?.(value) ?? value));
246
+ return map22;
263
247
  };
264
- const mapClone2 = (map) => mapClone(map, mapClone);
265
- const mapClone3 = (map) => mapClone(map, mapClone2);
248
+ const mapClone2 = (map2) => mapClone(map2, mapClone);
249
+ const mapClone3 = (map2) => mapClone(map2, mapClone2);
266
250
  const visitTree = (node, path, ensureLeaf, pruneLeaf, p = 0) =>
267
251
  ifNotUndefined(
268
252
  (ensureLeaf ? mapEnsure : mapGet)(
@@ -576,12 +560,18 @@ const createCheckpoints = getCreateFunction(
576
560
  collForEach(cellsDelta2, (table, tableId) =>
577
561
  collForEach(table, (row, rowId) =>
578
562
  collForEach(row, (oldNew, cellId) =>
579
- setOrDelCell(store, tableId, rowId, cellId, oldNew[oldOrNew]),
563
+ store.setOrDelCell(
564
+ tableId,
565
+ rowId,
566
+ cellId,
567
+ oldNew[oldOrNew],
568
+ true,
569
+ ),
580
570
  ),
581
571
  ),
582
572
  );
583
573
  collForEach(valuesDelta2, (oldNew, valueId) =>
584
- setOrDelValue(store, valueId, oldNew[oldOrNew]),
574
+ store.setOrDelValue(valueId, oldNew[oldOrNew], true),
585
575
  );
586
576
  });
587
577
  listening = 1;
@@ -1167,6 +1157,19 @@ const createIndexes = getCreateFunction((store) => {
1167
1157
  return objFreeze(indexes);
1168
1158
  });
1169
1159
 
1160
+ const getCellOrValueType = (cellOrValue) => {
1161
+ if (isNull(cellOrValue)) {
1162
+ return NULL;
1163
+ }
1164
+ const type = getTypeOf(cellOrValue);
1165
+ return isTypeStringOrBoolean(type) ||
1166
+ (type == NUMBER && isFiniteNumber(cellOrValue))
1167
+ ? type
1168
+ : void 0;
1169
+ };
1170
+ const isCellOrValueOrUndefined = (cellOrValue) =>
1171
+ isUndefined(cellOrValue) || !isUndefined(getCellOrValueType(cellOrValue));
1172
+
1170
1173
  const stampClone = ([value, hlc]) => stampNew(value, hlc);
1171
1174
  const stampCloneWithHash = ([value, hlc, hash]) => [value, hlc, hash];
1172
1175
  const stampNew = (value, hlc) => (hlc ? [value, hlc] : [value]);
@@ -1211,13 +1214,17 @@ const idsChanged = (changedIds, id2, addedOrRemoved) =>
1211
1214
  id2,
1212
1215
  mapGet(changedIds, id2) == -addedOrRemoved ? void 0 : addedOrRemoved,
1213
1216
  );
1217
+ const contentOrChangesIsEqual = ([tables1, values1], [tables2, values2]) =>
1218
+ objIsEqual(tables1, tables2) && objIsEqual(values1, values2);
1214
1219
  const createStore = () => {
1215
1220
  let hasTablesSchema;
1216
1221
  let hasValuesSchema;
1217
1222
  let hadTables = false;
1218
1223
  let hadValues = false;
1219
1224
  let transactions = 0;
1225
+ let middleware = [];
1220
1226
  let internalListeners = [];
1227
+ let mutating = 0;
1221
1228
  const changedTableIds = mapNew();
1222
1229
  const changedTableCellIds = mapNew();
1223
1230
  const changedRowCount = mapNew();
@@ -1263,6 +1270,19 @@ const createStore = () => {
1263
1270
  const finishTransactionListeners = pairNewMap();
1264
1271
  const [addListener, callListeners, delListenerImpl, callListenerImpl] =
1265
1272
  getListenerFunctions(() => store);
1273
+ const whileMutating = (action) => {
1274
+ const wasMutating = mutating;
1275
+ mutating = 1;
1276
+ const result = action();
1277
+ mutating = wasMutating;
1278
+ return result;
1279
+ };
1280
+ const ifTransformed = (snapshot, getResult, then, isEqual = Object.is) =>
1281
+ ifNotUndefined(getResult(), (result) =>
1282
+ snapshot === result || isEqual(snapshot, result)
1283
+ ? then(result)
1284
+ : whileMutating(() => then(result)),
1285
+ );
1266
1286
  const validateTablesSchema = (tableSchema) =>
1267
1287
  objValidate(tableSchema, (tableSchema2) =>
1268
1288
  objValidate(tableSchema2, validateCellOrValueSchema),
@@ -1450,82 +1470,194 @@ const createStore = () => {
1450
1470
  );
1451
1471
  const setOrDelTables = (tables) =>
1452
1472
  objIsEmpty(tables) ? delTables() : setTables(tables);
1453
- const setValidContent = ([tables, values]) => {
1454
- (objIsEmpty(tables) ? delTables : setTables)(tables);
1455
- (objIsEmpty(values) ? delValues : setValues)(values);
1456
- };
1457
- const setValidTables = (tables) =>
1458
- mapMatch(
1459
- tablesMap,
1473
+ const setOrDelCell = (tableId, rowId, cellId, cell, skipMiddleware) =>
1474
+ isUndefined(cell)
1475
+ ? delCell(tableId, rowId, cellId, true, skipMiddleware)
1476
+ : setCell(tableId, rowId, cellId, cell, skipMiddleware);
1477
+ const setOrDelValues = (values) =>
1478
+ objIsEmpty(values) ? delValues() : setValues(values);
1479
+ const setOrDelValue = (valueId, value, skipMiddleware) =>
1480
+ isUndefined(value)
1481
+ ? delValue(valueId, skipMiddleware)
1482
+ : setValue(valueId, value, skipMiddleware);
1483
+ const setValidContent = (content) =>
1484
+ ifTransformed(
1485
+ content,
1486
+ () =>
1487
+ ifNotUndefined(
1488
+ middleware[0],
1489
+ (willSetContent) =>
1490
+ whileMutating(() => willSetContent(structuredClone(content))),
1491
+ () => content,
1492
+ ),
1493
+ ([tables, values]) => {
1494
+ (objIsEmpty(tables) ? delTables : setTables)(tables);
1495
+ (objIsEmpty(values) ? delValues : setValues)(values);
1496
+ },
1497
+ contentOrChangesIsEqual,
1498
+ );
1499
+ const setValidTables = (tables, forceDel) =>
1500
+ ifTransformed(
1460
1501
  tables,
1461
- (_tables, tableId, table) => setValidTable(tableId, table),
1462
- (_tables, tableId) => delValidTable(tableId),
1502
+ () =>
1503
+ forceDel
1504
+ ? tables
1505
+ : ifNotUndefined(
1506
+ middleware[1],
1507
+ (willSetTables) =>
1508
+ whileMutating(() => willSetTables(structuredClone(tables))),
1509
+ () => tables,
1510
+ ),
1511
+ (validTables) =>
1512
+ mapMatch(
1513
+ tablesMap,
1514
+ validTables,
1515
+ (_tables, tableId, table) => setValidTable(tableId, table),
1516
+ (_tables, tableId) => delValidTable(tableId),
1517
+ ),
1518
+ objIsEqual,
1463
1519
  );
1464
- const setValidTable = (tableId, table) =>
1465
- mapMatch(
1466
- mapEnsure(tablesMap, tableId, () => {
1467
- tableIdsChanged(tableId, 1);
1468
- mapSet(tablePoolFunctions, tableId, getPoolFunctions());
1469
- mapSet(tableCellIds, tableId, mapNew());
1470
- return mapNew();
1471
- }),
1520
+ const setValidTable = (tableId, table, forceDel) =>
1521
+ ifTransformed(
1472
1522
  table,
1473
- (tableMap, rowId, row) => setValidRow(tableId, tableMap, rowId, row),
1474
- (tableMap, rowId) => delValidRow(tableId, tableMap, rowId),
1523
+ () =>
1524
+ forceDel
1525
+ ? table
1526
+ : ifNotUndefined(
1527
+ middleware[2],
1528
+ (willSetTable) =>
1529
+ whileMutating(() =>
1530
+ willSetTable(tableId, structuredClone(table)),
1531
+ ),
1532
+ () => table,
1533
+ ),
1534
+ (validTable) =>
1535
+ mapMatch(
1536
+ mapEnsure(tablesMap, tableId, () => {
1537
+ tableIdsChanged(tableId, 1);
1538
+ mapSet(tablePoolFunctions, tableId, getPoolFunctions());
1539
+ mapSet(tableCellIds, tableId, mapNew());
1540
+ return mapNew();
1541
+ }),
1542
+ validTable,
1543
+ (tableMap, rowId, row) => setValidRow(tableId, tableMap, rowId, row),
1544
+ (tableMap, rowId) => delValidRow(tableId, tableMap, rowId),
1545
+ ),
1546
+ objIsEqual,
1475
1547
  );
1476
1548
  const setValidRow = (tableId, tableMap, rowId, row, forceDel) =>
1477
- mapMatch(
1478
- mapEnsure(tableMap, rowId, () => {
1479
- rowIdsChanged(tableId, rowId, 1);
1480
- return mapNew();
1481
- }),
1549
+ ifTransformed(
1482
1550
  row,
1483
- (rowMap, cellId, cell) =>
1484
- setValidCell(tableId, rowId, rowMap, cellId, cell),
1485
- (rowMap, cellId) =>
1486
- delValidCell(tableId, tableMap, rowId, rowMap, cellId, forceDel),
1487
- );
1488
- const setValidCell = (tableId, rowId, rowMap, cellId, cell) => {
1489
- if (!collHas(rowMap, cellId)) {
1490
- cellIdsChanged(tableId, rowId, cellId, 1);
1491
- }
1492
- const oldCell = mapGet(rowMap, cellId);
1493
- if (cell !== oldCell) {
1494
- cellChanged(tableId, rowId, cellId, oldCell, cell);
1495
- mapSet(rowMap, cellId, cell);
1496
- }
1497
- };
1498
- const setCellIntoDefaultRow = (tableId, tableMap, rowId, cellId, validCell) =>
1551
+ () =>
1552
+ forceDel
1553
+ ? row
1554
+ : ifNotUndefined(
1555
+ middleware[3],
1556
+ (willSetRow) =>
1557
+ whileMutating(() =>
1558
+ willSetRow(tableId, rowId, structuredClone(row)),
1559
+ ),
1560
+ () => row,
1561
+ ),
1562
+ (validRow) =>
1563
+ mapMatch(
1564
+ mapEnsure(tableMap, rowId, () => {
1565
+ rowIdsChanged(tableId, rowId, 1);
1566
+ return mapNew();
1567
+ }),
1568
+ validRow,
1569
+ (rowMap, cellId, cell) =>
1570
+ setValidCell(tableId, rowId, rowMap, cellId, cell),
1571
+ (rowMap, cellId) =>
1572
+ delValidCell(tableId, tableMap, rowId, rowMap, cellId, forceDel),
1573
+ ),
1574
+ objIsEqual,
1575
+ );
1576
+ const setValidCell = (tableId, rowId, rowMap, cellId, cell, skipMiddleware) =>
1577
+ ifTransformed(
1578
+ cell,
1579
+ () =>
1580
+ ifNotUndefined(
1581
+ skipMiddleware ? void 0 : middleware[4],
1582
+ (willSetCell) =>
1583
+ whileMutating(() => willSetCell(tableId, rowId, cellId, cell)),
1584
+ () => cell,
1585
+ ),
1586
+ (cell2) => {
1587
+ if (!collHas(rowMap, cellId)) {
1588
+ cellIdsChanged(tableId, rowId, cellId, 1);
1589
+ }
1590
+ const oldCell = mapGet(rowMap, cellId);
1591
+ if (cell2 !== oldCell) {
1592
+ cellChanged(tableId, rowId, cellId, oldCell, cell2);
1593
+ mapSet(rowMap, cellId, cell2);
1594
+ }
1595
+ },
1596
+ );
1597
+ const setCellIntoNewRow = (
1598
+ tableId,
1599
+ tableMap,
1600
+ rowId,
1601
+ cellId,
1602
+ validCell,
1603
+ skipMiddleware,
1604
+ ) =>
1499
1605
  ifNotUndefined(
1500
1606
  mapGet(tableMap, rowId),
1501
- (rowMap) => setValidCell(tableId, rowId, rowMap, cellId, validCell),
1502
- () =>
1503
- setValidRow(
1504
- tableId,
1505
- tableMap,
1506
- rowId,
1607
+ (rowMap) =>
1608
+ setValidCell(tableId, rowId, rowMap, cellId, validCell, skipMiddleware),
1609
+ () => {
1610
+ const rowMap = mapNew();
1611
+ mapSet(tableMap, rowId, rowMap);
1612
+ rowIdsChanged(tableId, rowId, 1);
1613
+ objMap(
1507
1614
  addDefaultsToRow({[cellId]: validCell}, tableId, rowId),
1508
- ),
1615
+ (cell, cellId2) =>
1616
+ setValidCell(tableId, rowId, rowMap, cellId2, cell, skipMiddleware),
1617
+ );
1618
+ },
1509
1619
  );
1510
- const setOrDelValues = (values) =>
1511
- objIsEmpty(values) ? delValues() : setValues(values);
1512
- const setValidValues = (values) =>
1513
- mapMatch(
1514
- valuesMap,
1620
+ const setValidValues = (values, forceDel) =>
1621
+ ifTransformed(
1515
1622
  values,
1516
- (_valuesMap, valueId, value) => setValidValue(valueId, value),
1517
- (_valuesMap, valueId) => delValidValue(valueId),
1623
+ () =>
1624
+ forceDel
1625
+ ? values
1626
+ : ifNotUndefined(
1627
+ middleware[5],
1628
+ (willSetValues) =>
1629
+ whileMutating(() => willSetValues(structuredClone(values))),
1630
+ () => values,
1631
+ ),
1632
+ (validValues) =>
1633
+ mapMatch(
1634
+ valuesMap,
1635
+ validValues,
1636
+ (_valuesMap, valueId, value) => setValidValue(valueId, value),
1637
+ (_valuesMap, valueId) => delValidValue(valueId),
1638
+ ),
1639
+ objIsEqual,
1640
+ );
1641
+ const setValidValue = (valueId, value, skipMiddleware) =>
1642
+ ifTransformed(
1643
+ value,
1644
+ () =>
1645
+ ifNotUndefined(
1646
+ skipMiddleware ? void 0 : middleware[6],
1647
+ (willSetValue) => whileMutating(() => willSetValue(valueId, value)),
1648
+ () => value,
1649
+ ),
1650
+ (value2) => {
1651
+ if (!collHas(valuesMap, valueId)) {
1652
+ valueIdsChanged(valueId, 1);
1653
+ }
1654
+ const oldValue = mapGet(valuesMap, valueId);
1655
+ if (value2 !== oldValue) {
1656
+ valueChanged(valueId, oldValue, value2);
1657
+ mapSet(valuesMap, valueId, value2);
1658
+ }
1659
+ },
1518
1660
  );
1519
- const setValidValue = (valueId, value) => {
1520
- if (!collHas(valuesMap, valueId)) {
1521
- valueIdsChanged(valueId, 1);
1522
- }
1523
- const oldValue = mapGet(valuesMap, valueId);
1524
- if (value !== oldValue) {
1525
- valueChanged(valueId, oldValue, value);
1526
- mapSet(valuesMap, valueId, value);
1527
- }
1528
- };
1529
1661
  const getNewRowId = (tableId, reuse) => {
1530
1662
  const [getId] = mapGet(tablePoolFunctions, tableId);
1531
1663
  let rowId;
@@ -1535,14 +1667,34 @@ const createStore = () => {
1535
1667
  return rowId;
1536
1668
  };
1537
1669
  const getOrCreateTable = (tableId) =>
1538
- mapGet(tablesMap, tableId) ?? setValidTable(tableId, {});
1539
- const delValidTable = (tableId) => setValidTable(tableId, {});
1670
+ mapEnsure(tablesMap, tableId, () => {
1671
+ tableIdsChanged(tableId, 1);
1672
+ mapSet(tablePoolFunctions, tableId, getPoolFunctions());
1673
+ mapSet(tableCellIds, tableId, mapNew());
1674
+ return mapNew();
1675
+ });
1676
+ const delValidTable = (tableId) => {
1677
+ if (whileMutating(() => middleware[8]?.(tableId)) ?? true) {
1678
+ return setValidTable(tableId, {}, true);
1679
+ }
1680
+ return mapGet(tablesMap, tableId);
1681
+ };
1540
1682
  const delValidRow = (tableId, tableMap, rowId) => {
1541
- const [, releaseId] = mapGet(tablePoolFunctions, tableId);
1542
- releaseId(rowId);
1543
- setValidRow(tableId, tableMap, rowId, {}, true);
1683
+ if (whileMutating(() => middleware[9]?.(tableId, rowId)) ?? true) {
1684
+ const [, releaseId] = mapGet(tablePoolFunctions, tableId);
1685
+ releaseId(rowId);
1686
+ setValidRow(tableId, tableMap, rowId, {}, true);
1687
+ }
1544
1688
  };
1545
- const delValidCell = (tableId, table, rowId, row, cellId, forceDel) => {
1689
+ const delValidCell = (
1690
+ tableId,
1691
+ table,
1692
+ rowId,
1693
+ row,
1694
+ cellId,
1695
+ forceDel,
1696
+ skipMiddleware,
1697
+ ) => {
1546
1698
  const defaultCell = mapGet(
1547
1699
  mapGet(tablesSchemaRowCache, tableId)?.[0],
1548
1700
  cellId,
@@ -1550,34 +1702,44 @@ const createStore = () => {
1550
1702
  if (!isUndefined(defaultCell) && !forceDel) {
1551
1703
  return setValidCell(tableId, rowId, row, cellId, defaultCell);
1552
1704
  }
1553
- const delCell2 = (cellId2) => {
1554
- cellChanged(tableId, rowId, cellId2, mapGet(row, cellId2));
1555
- cellIdsChanged(tableId, rowId, cellId2, -1);
1556
- mapSet(row, cellId2);
1557
- };
1558
- if (isUndefined(defaultCell)) {
1559
- delCell2(cellId);
1560
- } else {
1561
- mapForEach(row, delCell2);
1562
- }
1563
- if (collIsEmpty(row)) {
1564
- rowIdsChanged(tableId, rowId, -1);
1565
- if (collIsEmpty(mapSet(table, rowId))) {
1566
- tableIdsChanged(tableId, -1);
1567
- mapSet(tablesMap, tableId);
1568
- mapSet(tablePoolFunctions, tableId);
1569
- mapSet(tableCellIds, tableId);
1705
+ if (
1706
+ skipMiddleware ||
1707
+ (whileMutating(() => middleware[10]?.(tableId, rowId, cellId)) ?? true)
1708
+ ) {
1709
+ const delCell2 = (cellId2) => {
1710
+ cellChanged(tableId, rowId, cellId2, mapGet(row, cellId2));
1711
+ cellIdsChanged(tableId, rowId, cellId2, -1);
1712
+ mapSet(row, cellId2);
1713
+ };
1714
+ if (isUndefined(defaultCell)) {
1715
+ delCell2(cellId);
1716
+ } else {
1717
+ mapForEach(row, delCell2);
1718
+ }
1719
+ if (collIsEmpty(row)) {
1720
+ rowIdsChanged(tableId, rowId, -1);
1721
+ if (collIsEmpty(mapSet(table, rowId))) {
1722
+ tableIdsChanged(tableId, -1);
1723
+ mapSet(tablesMap, tableId);
1724
+ mapSet(tablePoolFunctions, tableId);
1725
+ mapSet(tableCellIds, tableId);
1726
+ }
1570
1727
  }
1571
1728
  }
1572
1729
  };
1573
- const delValidValue = (valueId) => {
1730
+ const delValidValue = (valueId, skipMiddleware) => {
1574
1731
  const defaultValue = mapGet(valuesDefaulted, valueId);
1575
1732
  if (!isUndefined(defaultValue)) {
1576
1733
  return setValidValue(valueId, defaultValue);
1577
1734
  }
1578
- valueChanged(valueId, mapGet(valuesMap, valueId));
1579
- valueIdsChanged(valueId, -1);
1580
- mapSet(valuesMap, valueId);
1735
+ if (
1736
+ skipMiddleware ||
1737
+ (whileMutating(() => middleware[12]?.(valueId)) ?? true)
1738
+ ) {
1739
+ valueChanged(valueId, mapGet(valuesMap, valueId));
1740
+ valueIdsChanged(valueId, -1);
1741
+ mapSet(valuesMap, valueId);
1742
+ }
1581
1743
  };
1582
1744
  const tableIdsChanged = (tableId, addedOrRemoved) =>
1583
1745
  idsChanged(changedTableIds, tableId, addedOrRemoved);
@@ -1622,13 +1784,13 @@ const createStore = () => {
1622
1784
  cellId,
1623
1785
  () => [oldCell, 0],
1624
1786
  )[1] = newCell;
1625
- internalListeners[3]?.(tableId, rowId, cellId, newCell);
1787
+ internalListeners[3]?.(tableId, rowId, cellId, newCell, mutating);
1626
1788
  };
1627
1789
  const valueIdsChanged = (valueId, addedOrRemoved) =>
1628
1790
  idsChanged(changedValueIds, valueId, addedOrRemoved);
1629
1791
  const valueChanged = (valueId, oldValue, newValue) => {
1630
1792
  mapEnsure(changedValues, valueId, () => [oldValue, 0])[1] = newValue;
1631
- internalListeners[4]?.(valueId, newValue);
1793
+ internalListeners[4]?.(valueId, newValue, mutating);
1632
1794
  };
1633
1795
  const cellInvalid = (tableId, rowId, cellId, invalidCell, defaultedCell) => {
1634
1796
  arrayPush(
@@ -1702,15 +1864,16 @@ const createStore = () => {
1702
1864
  return 1;
1703
1865
  }
1704
1866
  };
1867
+ const clonedChangedCells = (changedCells2) =>
1868
+ mapClone(changedCells2, (map) =>
1869
+ mapClone(map, (map2) => mapClone(map2, pairClone)),
1870
+ );
1705
1871
  const callTabularListenersForChanges = (mutator) => {
1706
- const hasTablesNow = hasTables();
1707
- if (hasTablesNow != hadTables) {
1708
- callListeners(hasTablesListeners[mutator], void 0, hasTablesNow);
1709
- }
1710
- const emptySortedRowIdListeners = collIsEmpty(
1872
+ const hasHasTablesListeners = !collIsEmpty(hasTablesListeners[mutator]);
1873
+ const hasSortedRowIdListeners = !collIsEmpty(
1711
1874
  sortedRowIdsListeners[mutator],
1712
1875
  );
1713
- const emptyIdAndHasListeners =
1876
+ const hasIdOrHasListeners = !(
1714
1877
  collIsEmpty(cellIdsListeners[mutator]) &&
1715
1878
  collIsEmpty(hasCellListeners[mutator]) &&
1716
1879
  collIsEmpty(rowIdsListeners[mutator]) &&
@@ -1718,15 +1881,17 @@ const createStore = () => {
1718
1881
  collIsEmpty(tableCellIdsListeners[mutator]) &&
1719
1882
  collIsEmpty(hasTableCellListeners[mutator]) &&
1720
1883
  collIsEmpty(rowCountListeners[mutator]) &&
1721
- emptySortedRowIdListeners &&
1884
+ !hasSortedRowIdListeners &&
1722
1885
  collIsEmpty(tableIdsListeners[mutator]) &&
1723
- collIsEmpty(hasTableListeners[mutator]);
1724
- const emptyOtherListeners =
1886
+ collIsEmpty(hasTableListeners[mutator])
1887
+ );
1888
+ const hasOtherListeners = !(
1725
1889
  collIsEmpty(cellListeners[mutator]) &&
1726
1890
  collIsEmpty(rowListeners[mutator]) &&
1727
1891
  collIsEmpty(tableListeners[mutator]) &&
1728
- collIsEmpty(tablesListeners[mutator]);
1729
- if (!emptyIdAndHasListeners || !emptyOtherListeners) {
1892
+ collIsEmpty(tablesListeners[mutator])
1893
+ );
1894
+ if (hasHasTablesListeners || hasIdOrHasListeners || hasOtherListeners) {
1730
1895
  const changes = mutator
1731
1896
  ? [
1732
1897
  mapClone(changedTableIds),
@@ -1734,7 +1899,7 @@ const createStore = () => {
1734
1899
  mapClone(changedRowCount),
1735
1900
  mapClone2(changedRowIds),
1736
1901
  mapClone3(changedCellIds),
1737
- mapClone3(changedCells),
1902
+ clonedChangedCells(changedCells),
1738
1903
  ]
1739
1904
  : [
1740
1905
  changedTableIds,
@@ -1744,7 +1909,13 @@ const createStore = () => {
1744
1909
  changedCellIds,
1745
1910
  changedCells,
1746
1911
  ];
1747
- if (!emptyIdAndHasListeners) {
1912
+ if (hasHasTablesListeners) {
1913
+ const hasTablesNow = hasTables();
1914
+ if (hasTablesNow != hadTables) {
1915
+ callListeners(hasTablesListeners[mutator], void 0, hasTablesNow);
1916
+ }
1917
+ }
1918
+ if (hasIdOrHasListeners) {
1748
1919
  callIdsAndHasListenersIfChanged(
1749
1920
  changes[0],
1750
1921
  tableIdsListeners[mutator],
@@ -1776,13 +1947,13 @@ const createStore = () => {
1776
1947
  hasRowListeners[mutator],
1777
1948
  [tableId],
1778
1949
  ) &&
1779
- !emptySortedRowIdListeners
1950
+ hasSortedRowIdListeners
1780
1951
  ) {
1781
1952
  callListeners(sortedRowIdsListeners[mutator], [tableId, null]);
1782
1953
  setAdd(calledSortableTableIds, tableId);
1783
1954
  }
1784
1955
  });
1785
- if (!emptySortedRowIdListeners) {
1956
+ if (hasSortedRowIdListeners) {
1786
1957
  collForEach(changes[5], (rows, tableId) => {
1787
1958
  if (!collHas(calledSortableTableIds, tableId)) {
1788
1959
  const sortableCellIds = setNew();
@@ -1813,7 +1984,7 @@ const createStore = () => {
1813
1984
  ),
1814
1985
  );
1815
1986
  }
1816
- if (!emptyOtherListeners) {
1987
+ if (hasOtherListeners) {
1817
1988
  let tablesChanged;
1818
1989
  collForEach(changes[5], (rows, tableId) => {
1819
1990
  let tableChanged;
@@ -1850,28 +2021,31 @@ const createStore = () => {
1850
2021
  }
1851
2022
  };
1852
2023
  const callValuesListenersForChanges = (mutator) => {
1853
- const hasValuesNow = hasValues();
1854
- if (hasValuesNow != hadValues) {
1855
- callListeners(hasValuesListeners[mutator], void 0, hasValuesNow);
1856
- }
1857
- const emptyIdAndHasListeners =
1858
- collIsEmpty(valueIdsListeners[mutator]) &&
1859
- collIsEmpty(hasValueListeners[mutator]);
1860
- const emptyOtherListeners =
1861
- collIsEmpty(valueListeners[mutator]) &&
1862
- collIsEmpty(valuesListeners[mutator]);
1863
- if (!emptyIdAndHasListeners || !emptyOtherListeners) {
2024
+ const hasHasValuesListeners = !collIsEmpty(hasValuesListeners[mutator]);
2025
+ const hasIdOrHasListeners =
2026
+ !collIsEmpty(valueIdsListeners[mutator]) ||
2027
+ !collIsEmpty(hasValueListeners[mutator]);
2028
+ const hasOtherListeners =
2029
+ !collIsEmpty(valueListeners[mutator]) ||
2030
+ !collIsEmpty(valuesListeners[mutator]);
2031
+ if (hasHasValuesListeners || hasIdOrHasListeners || hasOtherListeners) {
1864
2032
  const changes = mutator
1865
- ? [mapClone(changedValueIds), mapClone(changedValues)]
2033
+ ? [mapClone(changedValueIds), mapClone(changedValues, pairClone)]
1866
2034
  : [changedValueIds, changedValues];
1867
- if (!emptyIdAndHasListeners) {
2035
+ if (hasHasValuesListeners) {
2036
+ const hasValuesNow = hasValues();
2037
+ if (hasValuesNow != hadValues) {
2038
+ callListeners(hasValuesListeners[mutator], void 0, hasValuesNow);
2039
+ }
2040
+ }
2041
+ if (hasIdOrHasListeners) {
1868
2042
  callIdsAndHasListenersIfChanged(
1869
2043
  changes[0],
1870
2044
  valueIdsListeners[mutator],
1871
2045
  hasValueListeners[mutator],
1872
2046
  );
1873
2047
  }
1874
- if (!emptyOtherListeners) {
2048
+ if (hasOtherListeners) {
1875
2049
  let valuesChanged;
1876
2050
  collForEach(changes[1], ([oldValue, newValue], valueId) => {
1877
2051
  if (newValue !== oldValue) {
@@ -2026,14 +2200,14 @@ const createStore = () => {
2026
2200
  if (validateRow(tableId2, rowId2, partialRow, 1)) {
2027
2201
  const table = getOrCreateTable(tableId2);
2028
2202
  objMap(partialRow, (cell, cellId) =>
2029
- setCellIntoDefaultRow(tableId2, table, rowId2, cellId, cell),
2203
+ setCellIntoNewRow(tableId2, table, rowId2, cellId, cell),
2030
2204
  );
2031
2205
  }
2032
2206
  },
2033
2207
  tableId,
2034
2208
  rowId,
2035
2209
  );
2036
- const setCell = (tableId, rowId, cellId, cell) =>
2210
+ const setCell = (tableId, rowId, cellId, cell, skipMiddleware) =>
2037
2211
  fluentTransaction(
2038
2212
  (tableId2, rowId2, cellId2) =>
2039
2213
  ifNotUndefined(
@@ -2044,12 +2218,13 @@ const createStore = () => {
2044
2218
  isFunction(cell) ? cell(getCell(tableId2, rowId2, cellId2)) : cell,
2045
2219
  ),
2046
2220
  (validCell) =>
2047
- setCellIntoDefaultRow(
2221
+ setCellIntoNewRow(
2048
2222
  tableId2,
2049
2223
  getOrCreateTable(tableId2),
2050
2224
  rowId2,
2051
2225
  cellId2,
2052
2226
  validCell,
2227
+ skipMiddleware,
2053
2228
  ),
2054
2229
  ),
2055
2230
  tableId,
@@ -2068,7 +2243,7 @@ const createStore = () => {
2068
2243
  )
2069
2244
  : 0,
2070
2245
  );
2071
- const setValue = (valueId, value) =>
2246
+ const setValue = (valueId, value, skipMiddleware) =>
2072
2247
  fluentTransaction(
2073
2248
  (valueId2) =>
2074
2249
  ifNotUndefined(
@@ -2076,27 +2251,40 @@ const createStore = () => {
2076
2251
  valueId2,
2077
2252
  isFunction(value) ? value(getValue(valueId2)) : value,
2078
2253
  ),
2079
- (validValue) => setValidValue(valueId2, validValue),
2254
+ (validValue) => setValidValue(valueId2, validValue, skipMiddleware),
2080
2255
  ),
2081
2256
  valueId,
2082
2257
  );
2083
2258
  const applyChanges = (changes) =>
2084
- fluentTransaction(() => {
2085
- objMap(changes[0], (table, tableId) =>
2086
- isUndefined(table)
2087
- ? delTable(tableId)
2088
- : objMap(table, (row, rowId) =>
2089
- isUndefined(row)
2090
- ? delRow(tableId, rowId)
2091
- : objMap(row, (cell, cellId) =>
2092
- setOrDelCell(store, tableId, rowId, cellId, cell),
2093
- ),
2094
- ),
2095
- );
2096
- objMap(changes[1], (value, valueId) =>
2097
- setOrDelValue(store, valueId, value),
2098
- );
2099
- });
2259
+ fluentTransaction(() =>
2260
+ ifTransformed(
2261
+ changes,
2262
+ () =>
2263
+ ifNotUndefined(
2264
+ middleware[13],
2265
+ (willApplyChanges) =>
2266
+ whileMutating(() => willApplyChanges(structuredClone(changes))),
2267
+ () => changes,
2268
+ ),
2269
+ (changes2) => {
2270
+ objMap(changes2[0], (table, tableId) =>
2271
+ isUndefined(table)
2272
+ ? delTable(tableId)
2273
+ : objMap(table, (row, rowId) =>
2274
+ isUndefined(row)
2275
+ ? delRow(tableId, rowId)
2276
+ : objMap(row, (cell, cellId) =>
2277
+ setOrDelCell(tableId, rowId, cellId, cell),
2278
+ ),
2279
+ ),
2280
+ );
2281
+ objMap(changes2[1], (value, valueId) =>
2282
+ setOrDelValue(valueId, value),
2283
+ );
2284
+ },
2285
+ contentOrChangesIsEqual,
2286
+ ),
2287
+ );
2100
2288
  const setTablesJson = (tablesJson) => {
2101
2289
  tryCatch(() => setOrDelTables(jsonParse(tablesJson)));
2102
2290
  return store;
@@ -2143,7 +2331,12 @@ const createStore = () => {
2143
2331
  setTablesSchema(tablesSchema);
2144
2332
  setValuesSchema(valuesSchema);
2145
2333
  });
2146
- const delTables = () => fluentTransaction(() => setValidTables({}));
2334
+ const delTables = () =>
2335
+ fluentTransaction(() =>
2336
+ (whileMutating(() => middleware[7]?.()) ?? true)
2337
+ ? setValidTables({}, true)
2338
+ : 0,
2339
+ );
2147
2340
  const delTable = (tableId) =>
2148
2341
  fluentTransaction(
2149
2342
  (tableId2) =>
@@ -2161,7 +2354,7 @@ const createStore = () => {
2161
2354
  tableId,
2162
2355
  rowId,
2163
2356
  );
2164
- const delCell = (tableId, rowId, cellId, forceDel) =>
2357
+ const delCell = (tableId, rowId, cellId, forceDel, skipMiddleware) =>
2165
2358
  fluentTransaction(
2166
2359
  (tableId2, rowId2, cellId2) =>
2167
2360
  ifNotUndefined(mapGet(tablesMap, tableId2), (tableMap) =>
@@ -2174,6 +2367,7 @@ const createStore = () => {
2174
2367
  rowMap,
2175
2368
  cellId2,
2176
2369
  forceDel,
2370
+ skipMiddleware,
2177
2371
  )
2178
2372
  : 0,
2179
2373
  ),
@@ -2182,11 +2376,18 @@ const createStore = () => {
2182
2376
  rowId,
2183
2377
  cellId,
2184
2378
  );
2185
- const delValues = () => fluentTransaction(() => setValidValues({}));
2186
- const delValue = (valueId) =>
2379
+ const delValues = () =>
2380
+ fluentTransaction(() =>
2381
+ (whileMutating(() => middleware[11]?.()) ?? true)
2382
+ ? setValidValues({}, true)
2383
+ : 0,
2384
+ );
2385
+ const delValue = (valueId, skipMiddleware) =>
2187
2386
  fluentTransaction(
2188
2387
  (valueId2) =>
2189
- collHas(valuesMap, valueId2) ? delValidValue(valueId2) : 0,
2388
+ collHas(valuesMap, valueId2)
2389
+ ? delValidValue(valueId2, skipMiddleware)
2390
+ : 0,
2190
2391
  valueId,
2191
2392
  );
2192
2393
  const delTablesSchema = () =>
@@ -2263,30 +2464,64 @@ const createStore = () => {
2263
2464
  mapToObj3(changedCellIds),
2264
2465
  mapToObj(changedValueIds),
2265
2466
  ];
2467
+ const doDidSetRows = () => {
2468
+ if (middleware[14]) {
2469
+ const changedCells2 = clonedChangedCells(changedCells);
2470
+ collForEach(changedCells2, (rows, tableId) =>
2471
+ collForEach(rows, (cells, rowId) => {
2472
+ if (
2473
+ !arrayEvery(
2474
+ collValues(cells),
2475
+ ([oldCell, newCell]) => oldCell === newCell,
2476
+ )
2477
+ ) {
2478
+ const newRow = getRow(tableId, rowId);
2479
+ const oldRow = objMerge(newRow);
2480
+ collForEach(cells, ([oldCell], cellId) =>
2481
+ isUndefined(oldCell)
2482
+ ? objDel(oldRow, cellId)
2483
+ : (oldRow[cellId] = oldCell),
2484
+ );
2485
+ const didSetRow = middleware[14](tableId, rowId, oldRow, newRow);
2486
+ if (!objIsEqual(didSetRow, newRow)) {
2487
+ const setOrDelRow = objMap(newRow, () => void 0);
2488
+ objMap(didSetRow, (cell, cellId) => (setOrDelRow[cellId] = cell));
2489
+ objMap(setOrDelRow, (cell, cellId) =>
2490
+ setOrDelCell(tableId, rowId, cellId, cell, true),
2491
+ );
2492
+ }
2493
+ }
2494
+ }),
2495
+ );
2496
+ }
2497
+ };
2266
2498
  const finishTransaction = (doRollback) => {
2267
2499
  if (transactions > 0) {
2268
2500
  transactions--;
2269
2501
  if (transactions == 0) {
2270
2502
  transactions = 1;
2271
- callInvalidCellListeners(1);
2272
- if (!collIsEmpty(changedCells)) {
2273
- callTabularListenersForChanges(1);
2274
- }
2275
- callInvalidValueListeners(1);
2276
- if (!collIsEmpty(changedValues)) {
2277
- callValuesListenersForChanges(1);
2278
- }
2503
+ whileMutating(() => {
2504
+ callInvalidCellListeners(1);
2505
+ if (!collIsEmpty(changedCells)) {
2506
+ callTabularListenersForChanges(1);
2507
+ doDidSetRows();
2508
+ }
2509
+ callInvalidValueListeners(1);
2510
+ if (!collIsEmpty(changedValues)) {
2511
+ callValuesListenersForChanges(1);
2512
+ }
2513
+ });
2279
2514
  if (doRollback?.(store)) {
2280
2515
  collForEach(changedCells, (table, tableId) =>
2281
2516
  collForEach(table, (row, rowId) =>
2282
2517
  collForEach(row, ([oldCell], cellId) =>
2283
- setOrDelCell(store, tableId, rowId, cellId, oldCell),
2518
+ setOrDelCell(tableId, rowId, cellId, oldCell, true),
2284
2519
  ),
2285
2520
  ),
2286
2521
  );
2287
2522
  collClear(changedCells);
2288
2523
  collForEach(changedValues, ([oldValue], valueId) =>
2289
- setOrDelValue(store, valueId, oldValue),
2524
+ setOrDelValue(valueId, oldValue, true),
2290
2525
  );
2291
2526
  collClear(changedValues);
2292
2527
  }
@@ -2413,6 +2648,40 @@ const createStore = () => {
2413
2648
  collSize2(startTransactionListeners) +
2414
2649
  pairCollSize2(finishTransactionListeners),
2415
2650
  });
2651
+ const setMiddleware = (
2652
+ willSetContent,
2653
+ willSetTables,
2654
+ willSetTable,
2655
+ willSetRow,
2656
+ willSetCell,
2657
+ willSetValues,
2658
+ willSetValue,
2659
+ willDelTables,
2660
+ willDelTable,
2661
+ willDelRow,
2662
+ willDelCell,
2663
+ willDelValues,
2664
+ willDelValue,
2665
+ willApplyChanges,
2666
+ didSetRow,
2667
+ ) =>
2668
+ (middleware = [
2669
+ willSetContent,
2670
+ willSetTables,
2671
+ willSetTable,
2672
+ willSetRow,
2673
+ willSetCell,
2674
+ willSetValues,
2675
+ willSetValue,
2676
+ willDelTables,
2677
+ willDelTable,
2678
+ willDelRow,
2679
+ willDelCell,
2680
+ willDelValues,
2681
+ willDelValue,
2682
+ willApplyChanges,
2683
+ didSetRow,
2684
+ ]);
2416
2685
  const setInternalListeners = (
2417
2686
  preStartTransaction,
2418
2687
  preFinishTransaction,
@@ -2506,6 +2775,9 @@ const createStore = () => {
2506
2775
  addListener,
2507
2776
  callListeners,
2508
2777
  setInternalListeners,
2778
+ setMiddleware,
2779
+ setOrDelCell,
2780
+ setOrDelValue,
2509
2781
  };
2510
2782
  objMap(
2511
2783
  {
@@ -2642,6 +2914,7 @@ const createMergeableStore = (uniqueId, getNow) => {
2642
2914
  let listeningToRawStoreChanges = 1;
2643
2915
  let contentStampMap = newContentStampMap();
2644
2916
  let defaultingContent = 0;
2917
+ let mutated = 0;
2645
2918
  const touchedCells = mapNew();
2646
2919
  const touchedValues = setNew();
2647
2920
  const [getNextHlc, seenHlc] = getHlcFunctions(uniqueId, getNow);
@@ -2768,12 +3041,15 @@ const createMergeableStore = (uniqueId, getNow) => {
2768
3041
  collClear(touchedCells);
2769
3042
  collClear(touchedValues);
2770
3043
  };
2771
- const cellChanged = (tableId, rowId, cellId, newCell) => {
3044
+ const cellChanged = (tableId, rowId, cellId, newCell, mutating) => {
2772
3045
  setAdd(
2773
3046
  mapEnsure(mapEnsure(touchedCells, tableId, mapNew), rowId, setNew),
2774
3047
  cellId,
2775
3048
  );
2776
- if (listeningToRawStoreChanges) {
3049
+ if (listeningToRawStoreChanges || mutating) {
3050
+ if (mutating) {
3051
+ mutated = 1;
3052
+ }
2777
3053
  mergeContentOrChanges([
2778
3054
  [
2779
3055
  {
@@ -2796,9 +3072,12 @@ const createMergeableStore = (uniqueId, getNow) => {
2796
3072
  ]);
2797
3073
  }
2798
3074
  };
2799
- const valueChanged = (valueId, newValue) => {
3075
+ const valueChanged = (valueId, newValue, mutating) => {
2800
3076
  setAdd(touchedValues, valueId);
2801
- if (listeningToRawStoreChanges) {
3077
+ if (listeningToRawStoreChanges || mutating) {
3078
+ if (mutating) {
3079
+ mutated = 1;
3080
+ }
2802
3081
  mergeContentOrChanges([
2803
3082
  [{}],
2804
3083
  [
@@ -3016,6 +3295,11 @@ const createMergeableStore = (uniqueId, getNow) => {
3016
3295
  mergeableStore2.applyMergeableChanges(mergeableChanges);
3017
3296
  return applyMergeableChanges(mergeableChanges2);
3018
3297
  };
3298
+ const hadMutated = () => {
3299
+ const result = mutated;
3300
+ mutated = 0;
3301
+ return result;
3302
+ };
3019
3303
  const mergeableStore = {
3020
3304
  getMergeableContent,
3021
3305
  getMergeableContentHashes,
@@ -3032,6 +3316,8 @@ const createMergeableStore = (uniqueId, getNow) => {
3032
3316
  getTransactionMergeableChanges,
3033
3317
  applyMergeableChanges,
3034
3318
  merge,
3319
+ // only used internally by other modules
3320
+ hadMutated,
3035
3321
  };
3036
3322
  store.setInternalListeners(
3037
3323
  preStartTransaction,
@@ -3048,7 +3334,8 @@ const createMergeableStore = (uniqueId, getNow) => {
3048
3334
  strStartsWith(name, DEL) ||
3049
3335
  strStartsWith(name, 'apply') ||
3050
3336
  strEndsWith(name, TRANSACTION) ||
3051
- name == 'call' + LISTENER
3337
+ name == 'call' + LISTENER ||
3338
+ name == 'use'
3052
3339
  ? (...args) => {
3053
3340
  method(...args);
3054
3341
  return mergeableStore;
@@ -3241,6 +3528,136 @@ const createMetrics = getCreateFunction((store) => {
3241
3528
  return objFreeze(metrics);
3242
3529
  });
3243
3530
 
3531
+ const reduceCallbacks = (callbacks, thing, ...ids) =>
3532
+ arrayReduce(
3533
+ callbacks,
3534
+ (current, callback) =>
3535
+ isUndefined(current) ? current : callback(...ids, current),
3536
+ thing,
3537
+ );
3538
+ const everyCallback = (callbacks, ...ids) =>
3539
+ arrayEvery(callbacks, (callback) => callback(...ids));
3540
+ const createMiddleware = getCreateFunction((store) => {
3541
+ const fluent = (actions) => {
3542
+ actions();
3543
+ return middleware;
3544
+ };
3545
+ const addCallback = (callbacks) => (callback) =>
3546
+ fluent(() => arrayPush(callbacks, callback));
3547
+ const willSetContentCallbacks = [];
3548
+ const willSetTablesCallbacks = [];
3549
+ const willSetTableCallbacks = [];
3550
+ const willSetRowCallbacks = [];
3551
+ const willSetCellCallbacks = [];
3552
+ const willSetValuesCallbacks = [];
3553
+ const willSetValueCallbacks = [];
3554
+ const willDelTablesCallbacks = [];
3555
+ const willDelTableCallbacks = [];
3556
+ const willDelRowCallbacks = [];
3557
+ const willDelCellCallbacks = [];
3558
+ const willDelValuesCallbacks = [];
3559
+ const willDelValueCallbacks = [];
3560
+ const willApplyChangesCallbacks = [];
3561
+ const didSetRowCallbacksMap = mapNew();
3562
+ const willSetContent = (content) =>
3563
+ reduceCallbacks(willSetContentCallbacks, content);
3564
+ const willSetTables = (tables) =>
3565
+ reduceCallbacks(willSetTablesCallbacks, tables);
3566
+ const willSetTable = (tableId, table) =>
3567
+ reduceCallbacks(willSetTableCallbacks, table, tableId);
3568
+ const willSetRow = (tableId, rowId, row) =>
3569
+ reduceCallbacks(willSetRowCallbacks, row, tableId, rowId);
3570
+ const willSetCell = (tableId, rowId, cellId, cell) =>
3571
+ reduceCallbacks(willSetCellCallbacks, cell, tableId, rowId, cellId);
3572
+ const willSetValues = (values) =>
3573
+ reduceCallbacks(willSetValuesCallbacks, values);
3574
+ const willSetValue = (valueId, value) =>
3575
+ reduceCallbacks(willSetValueCallbacks, value, valueId);
3576
+ const willDelTables = () => everyCallback(willDelTablesCallbacks);
3577
+ const willDelTable = (tableId) =>
3578
+ everyCallback(willDelTableCallbacks, tableId);
3579
+ const willDelRow = (tableId, rowId) =>
3580
+ everyCallback(willDelRowCallbacks, tableId, rowId);
3581
+ const willDelCell = (tableId, rowId, cellId) =>
3582
+ everyCallback(willDelCellCallbacks, tableId, rowId, cellId);
3583
+ const willDelValues = () => everyCallback(willDelValuesCallbacks);
3584
+ const willDelValue = (valueId) =>
3585
+ everyCallback(willDelValueCallbacks, valueId);
3586
+ const willApplyChanges = (changes) =>
3587
+ reduceCallbacks(willApplyChangesCallbacks, changes);
3588
+ const didSetRow = (tableId, rowId, oldRow, newRow) =>
3589
+ ifNotUndefined(
3590
+ mapGet(didSetRowCallbacksMap, tableId),
3591
+ (callbacks) =>
3592
+ arrayReduce(
3593
+ callbacks,
3594
+ (current, callback) => callback(tableId, rowId, oldRow, current),
3595
+ newRow,
3596
+ ),
3597
+ () => newRow,
3598
+ );
3599
+ const getStore = () => store;
3600
+ const addWillSetContentCallback = addCallback(willSetContentCallbacks);
3601
+ const addWillSetTablesCallback = addCallback(willSetTablesCallbacks);
3602
+ const addWillSetTableCallback = addCallback(willSetTableCallbacks);
3603
+ const addWillSetRowCallback = addCallback(willSetRowCallbacks);
3604
+ const addWillSetCellCallback = addCallback(willSetCellCallbacks);
3605
+ const addWillSetValuesCallback = addCallback(willSetValuesCallbacks);
3606
+ const addWillSetValueCallback = addCallback(willSetValueCallbacks);
3607
+ const addWillDelTablesCallback = addCallback(willDelTablesCallbacks);
3608
+ const addWillDelTableCallback = addCallback(willDelTableCallbacks);
3609
+ const addWillDelRowCallback = addCallback(willDelRowCallbacks);
3610
+ const addWillDelCellCallback = addCallback(willDelCellCallbacks);
3611
+ const addWillDelValuesCallback = addCallback(willDelValuesCallbacks);
3612
+ const addWillDelValueCallback = addCallback(willDelValueCallbacks);
3613
+ const addWillApplyChangesCallback = addCallback(willApplyChangesCallbacks);
3614
+ const addDidSetRowCallback = (tableId, callback) =>
3615
+ fluent(() =>
3616
+ arrayPush(
3617
+ mapEnsure(didSetRowCallbacksMap, tableId, () => []),
3618
+ callback,
3619
+ ),
3620
+ );
3621
+ const destroy = () => {};
3622
+ const middleware = objFreeze({
3623
+ getStore,
3624
+ addWillSetContentCallback,
3625
+ addWillSetTablesCallback,
3626
+ addWillSetTableCallback,
3627
+ addWillSetRowCallback,
3628
+ addWillSetCellCallback,
3629
+ addWillSetValuesCallback,
3630
+ addWillSetValueCallback,
3631
+ addWillDelTablesCallback,
3632
+ addWillDelTableCallback,
3633
+ addWillDelRowCallback,
3634
+ addWillDelCellCallback,
3635
+ addWillDelValuesCallback,
3636
+ addWillDelValueCallback,
3637
+ addWillApplyChangesCallback,
3638
+ addDidSetRowCallback,
3639
+ destroy,
3640
+ });
3641
+ store.setMiddleware(
3642
+ willSetContent,
3643
+ willSetTables,
3644
+ willSetTable,
3645
+ willSetRow,
3646
+ willSetCell,
3647
+ willSetValues,
3648
+ willSetValue,
3649
+ willDelTables,
3650
+ willDelTable,
3651
+ willDelRow,
3652
+ willDelCell,
3653
+ willDelValues,
3654
+ willDelValue,
3655
+ willApplyChanges,
3656
+ didSetRow,
3657
+ );
3658
+ return middleware;
3659
+ });
3660
+
3244
3661
  const createQueries = getCreateFunction((store) => {
3245
3662
  const createStore = store.createStore;
3246
3663
  const preStore = createStore();
@@ -3569,8 +3986,7 @@ const createQueries = getCreateFunction((store) => {
3569
3986
  selectJoinWhereStore.transaction(() =>
3570
3987
  arrayEvery(wheres, (where2) => where2(getTableCell))
3571
3988
  ? mapForEach(selects, (asCellId, tableCellGetter) =>
3572
- setOrDelCell(
3573
- selectJoinWhereStore,
3989
+ selectJoinWhereStore.setOrDelCell(
3574
3990
  queryId,
3575
3991
  rootRowId,
3576
3992
  asCellId,
@@ -3975,6 +4391,7 @@ export {
3975
4391
  createIndexes,
3976
4392
  createMergeableStore,
3977
4393
  createMetrics,
4394
+ createMiddleware,
3978
4395
  createQueries,
3979
4396
  createRelationships,
3980
4397
  createStore,