tinybase 8.0.0-beta.2 → 8.0.0-beta.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (282) hide show
  1. package/@types/_internal/store/with-schemas/index.d.ts +2 -2
  2. package/@types/common/index.d.ts +22 -0
  3. package/@types/common/with-schemas/index.d.ts +22 -0
  4. package/@types/middleware/index.d.ts +44 -119
  5. package/@types/middleware/with-schemas/index.d.ts +44 -142
  6. package/@types/store/index.d.ts +132 -79
  7. package/@types/store/with-schemas/index.d.ts +137 -81
  8. package/@types/ui-react-dom/index.d.ts +6 -4
  9. package/@types/ui-react-dom/with-schemas/index.d.ts +6 -4
  10. package/checkpoints/index.js +2 -8
  11. package/checkpoints/with-schemas/index.js +2 -8
  12. package/index.js +311 -209
  13. package/mergeable-store/index.js +330 -201
  14. package/mergeable-store/with-schemas/index.js +330 -201
  15. package/middleware/index.js +2 -40
  16. package/middleware/with-schemas/index.js +2 -40
  17. package/min/checkpoints/index.js +1 -1
  18. package/min/checkpoints/index.js.gz +0 -0
  19. package/min/checkpoints/with-schemas/index.js +1 -1
  20. package/min/checkpoints/with-schemas/index.js.gz +0 -0
  21. package/min/index.js +1 -1
  22. package/min/index.js.gz +0 -0
  23. package/min/mergeable-store/index.js +1 -1
  24. package/min/mergeable-store/index.js.gz +0 -0
  25. package/min/mergeable-store/with-schemas/index.js +1 -1
  26. package/min/mergeable-store/with-schemas/index.js.gz +0 -0
  27. package/min/middleware/index.js +1 -1
  28. package/min/middleware/index.js.gz +0 -0
  29. package/min/middleware/with-schemas/index.js +1 -1
  30. package/min/middleware/with-schemas/index.js.gz +0 -0
  31. package/min/omni/index.js +1 -1
  32. package/min/omni/index.js.gz +0 -0
  33. package/min/omni/with-schemas/index.js +1 -1
  34. package/min/omni/with-schemas/index.js.gz +0 -0
  35. package/min/persisters/index.js +1 -1
  36. package/min/persisters/index.js.gz +0 -0
  37. package/min/persisters/persister-automerge/index.js +1 -1
  38. package/min/persisters/persister-automerge/index.js.gz +0 -0
  39. package/min/persisters/persister-automerge/with-schemas/index.js +1 -1
  40. package/min/persisters/persister-automerge/with-schemas/index.js.gz +0 -0
  41. package/min/persisters/persister-browser/index.js +1 -1
  42. package/min/persisters/persister-browser/index.js.gz +0 -0
  43. package/min/persisters/persister-browser/with-schemas/index.js +1 -1
  44. package/min/persisters/persister-browser/with-schemas/index.js.gz +0 -0
  45. package/min/persisters/persister-cr-sqlite-wasm/index.js +1 -1
  46. package/min/persisters/persister-cr-sqlite-wasm/index.js.gz +0 -0
  47. package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +1 -1
  48. package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js.gz +0 -0
  49. package/min/persisters/persister-durable-object-sql-storage/index.js +1 -1
  50. package/min/persisters/persister-durable-object-sql-storage/index.js.gz +0 -0
  51. package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js +1 -1
  52. package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js.gz +0 -0
  53. package/min/persisters/persister-durable-object-storage/index.js +1 -1
  54. package/min/persisters/persister-durable-object-storage/index.js.gz +0 -0
  55. package/min/persisters/persister-durable-object-storage/with-schemas/index.js +1 -1
  56. package/min/persisters/persister-durable-object-storage/with-schemas/index.js.gz +0 -0
  57. package/min/persisters/persister-electric-sql/index.js +1 -1
  58. package/min/persisters/persister-electric-sql/index.js.gz +0 -0
  59. package/min/persisters/persister-electric-sql/with-schemas/index.js +1 -1
  60. package/min/persisters/persister-electric-sql/with-schemas/index.js.gz +0 -0
  61. package/min/persisters/persister-expo-sqlite/index.js +1 -1
  62. package/min/persisters/persister-expo-sqlite/index.js.gz +0 -0
  63. package/min/persisters/persister-expo-sqlite/with-schemas/index.js +1 -1
  64. package/min/persisters/persister-expo-sqlite/with-schemas/index.js.gz +0 -0
  65. package/min/persisters/persister-file/index.js +1 -1
  66. package/min/persisters/persister-file/index.js.gz +0 -0
  67. package/min/persisters/persister-file/with-schemas/index.js +1 -1
  68. package/min/persisters/persister-file/with-schemas/index.js.gz +0 -0
  69. package/min/persisters/persister-indexed-db/index.js +1 -1
  70. package/min/persisters/persister-indexed-db/index.js.gz +0 -0
  71. package/min/persisters/persister-indexed-db/with-schemas/index.js +1 -1
  72. package/min/persisters/persister-indexed-db/with-schemas/index.js.gz +0 -0
  73. package/min/persisters/persister-libsql/index.js +1 -1
  74. package/min/persisters/persister-libsql/index.js.gz +0 -0
  75. package/min/persisters/persister-libsql/with-schemas/index.js +1 -1
  76. package/min/persisters/persister-libsql/with-schemas/index.js.gz +0 -0
  77. package/min/persisters/persister-partykit-client/index.js +1 -1
  78. package/min/persisters/persister-partykit-client/index.js.gz +0 -0
  79. package/min/persisters/persister-partykit-client/with-schemas/index.js +1 -1
  80. package/min/persisters/persister-partykit-client/with-schemas/index.js.gz +0 -0
  81. package/min/persisters/persister-pglite/index.js +1 -1
  82. package/min/persisters/persister-pglite/index.js.gz +0 -0
  83. package/min/persisters/persister-pglite/with-schemas/index.js +1 -1
  84. package/min/persisters/persister-pglite/with-schemas/index.js.gz +0 -0
  85. package/min/persisters/persister-postgres/index.js +1 -1
  86. package/min/persisters/persister-postgres/index.js.gz +0 -0
  87. package/min/persisters/persister-postgres/with-schemas/index.js +1 -1
  88. package/min/persisters/persister-postgres/with-schemas/index.js.gz +0 -0
  89. package/min/persisters/persister-powersync/index.js +1 -1
  90. package/min/persisters/persister-powersync/index.js.gz +0 -0
  91. package/min/persisters/persister-powersync/with-schemas/index.js +1 -1
  92. package/min/persisters/persister-powersync/with-schemas/index.js.gz +0 -0
  93. package/min/persisters/persister-react-native-mmkv/index.js +1 -1
  94. package/min/persisters/persister-react-native-mmkv/index.js.gz +0 -0
  95. package/min/persisters/persister-react-native-mmkv/with-schemas/index.js +1 -1
  96. package/min/persisters/persister-react-native-mmkv/with-schemas/index.js.gz +0 -0
  97. package/min/persisters/persister-react-native-sqlite/index.js +1 -1
  98. package/min/persisters/persister-react-native-sqlite/index.js.gz +0 -0
  99. package/min/persisters/persister-react-native-sqlite/with-schemas/index.js +1 -1
  100. package/min/persisters/persister-react-native-sqlite/with-schemas/index.js.gz +0 -0
  101. package/min/persisters/persister-remote/index.js +1 -1
  102. package/min/persisters/persister-remote/index.js.gz +0 -0
  103. package/min/persisters/persister-remote/with-schemas/index.js +1 -1
  104. package/min/persisters/persister-remote/with-schemas/index.js.gz +0 -0
  105. package/min/persisters/persister-sqlite-bun/index.js +1 -1
  106. package/min/persisters/persister-sqlite-bun/index.js.gz +0 -0
  107. package/min/persisters/persister-sqlite-bun/with-schemas/index.js +1 -1
  108. package/min/persisters/persister-sqlite-bun/with-schemas/index.js.gz +0 -0
  109. package/min/persisters/persister-sqlite-wasm/index.js +1 -1
  110. package/min/persisters/persister-sqlite-wasm/index.js.gz +0 -0
  111. package/min/persisters/persister-sqlite-wasm/with-schemas/index.js +1 -1
  112. package/min/persisters/persister-sqlite-wasm/with-schemas/index.js.gz +0 -0
  113. package/min/persisters/persister-sqlite3/index.js +1 -1
  114. package/min/persisters/persister-sqlite3/index.js.gz +0 -0
  115. package/min/persisters/persister-sqlite3/with-schemas/index.js +1 -1
  116. package/min/persisters/persister-sqlite3/with-schemas/index.js.gz +0 -0
  117. package/min/persisters/persister-yjs/index.js +1 -1
  118. package/min/persisters/persister-yjs/index.js.gz +0 -0
  119. package/min/persisters/persister-yjs/with-schemas/index.js +1 -1
  120. package/min/persisters/persister-yjs/with-schemas/index.js.gz +0 -0
  121. package/min/persisters/with-schemas/index.js +1 -1
  122. package/min/persisters/with-schemas/index.js.gz +0 -0
  123. package/min/queries/index.js +1 -1
  124. package/min/queries/index.js.gz +0 -0
  125. package/min/queries/with-schemas/index.js +1 -1
  126. package/min/queries/with-schemas/index.js.gz +0 -0
  127. package/min/schematizers/index.js +1 -1
  128. package/min/schematizers/index.js.gz +0 -0
  129. package/min/schematizers/schematizer-arktype/index.js +1 -1
  130. package/min/schematizers/schematizer-arktype/index.js.gz +0 -0
  131. package/min/schematizers/schematizer-arktype/with-schemas/index.js +1 -1
  132. package/min/schematizers/schematizer-arktype/with-schemas/index.js.gz +0 -0
  133. package/min/schematizers/schematizer-effect/index.js +1 -1
  134. package/min/schematizers/schematizer-effect/index.js.gz +0 -0
  135. package/min/schematizers/schematizer-effect/with-schemas/index.js +1 -1
  136. package/min/schematizers/schematizer-effect/with-schemas/index.js.gz +0 -0
  137. package/min/schematizers/schematizer-typebox/index.js +1 -1
  138. package/min/schematizers/schematizer-typebox/index.js.gz +0 -0
  139. package/min/schematizers/schematizer-typebox/with-schemas/index.js +1 -1
  140. package/min/schematizers/schematizer-typebox/with-schemas/index.js.gz +0 -0
  141. package/min/schematizers/schematizer-valibot/index.js +1 -1
  142. package/min/schematizers/schematizer-valibot/index.js.gz +0 -0
  143. package/min/schematizers/schematizer-valibot/with-schemas/index.js +1 -1
  144. package/min/schematizers/schematizer-valibot/with-schemas/index.js.gz +0 -0
  145. package/min/schematizers/schematizer-yup/index.js +1 -1
  146. package/min/schematizers/schematizer-yup/index.js.gz +0 -0
  147. package/min/schematizers/schematizer-yup/with-schemas/index.js +1 -1
  148. package/min/schematizers/schematizer-yup/with-schemas/index.js.gz +0 -0
  149. package/min/schematizers/schematizer-zod/index.js +1 -1
  150. package/min/schematizers/schematizer-zod/index.js.gz +0 -0
  151. package/min/schematizers/schematizer-zod/with-schemas/index.js +1 -1
  152. package/min/schematizers/schematizer-zod/with-schemas/index.js.gz +0 -0
  153. package/min/schematizers/with-schemas/index.js +1 -1
  154. package/min/schematizers/with-schemas/index.js.gz +0 -0
  155. package/min/store/index.js +1 -1
  156. package/min/store/index.js.gz +0 -0
  157. package/min/store/with-schemas/index.js +1 -1
  158. package/min/store/with-schemas/index.js.gz +0 -0
  159. package/min/synchronizers/index.js +1 -1
  160. package/min/synchronizers/index.js.gz +0 -0
  161. package/min/synchronizers/synchronizer-broadcast-channel/index.js +1 -1
  162. package/min/synchronizers/synchronizer-broadcast-channel/index.js.gz +0 -0
  163. package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +1 -1
  164. package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js.gz +0 -0
  165. package/min/synchronizers/synchronizer-local/index.js +1 -1
  166. package/min/synchronizers/synchronizer-local/index.js.gz +0 -0
  167. package/min/synchronizers/synchronizer-local/with-schemas/index.js +1 -1
  168. package/min/synchronizers/synchronizer-local/with-schemas/index.js.gz +0 -0
  169. package/min/synchronizers/synchronizer-ws-client/index.js +1 -1
  170. package/min/synchronizers/synchronizer-ws-client/index.js.gz +0 -0
  171. package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js +1 -1
  172. package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js.gz +0 -0
  173. package/min/synchronizers/synchronizer-ws-server/index.js +1 -1
  174. package/min/synchronizers/synchronizer-ws-server/index.js.gz +0 -0
  175. package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js +1 -1
  176. package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js.gz +0 -0
  177. package/min/synchronizers/synchronizer-ws-server-durable-object/index.js +1 -1
  178. package/min/synchronizers/synchronizer-ws-server-durable-object/index.js.gz +0 -0
  179. package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +1 -1
  180. package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js.gz +0 -0
  181. package/min/synchronizers/with-schemas/index.js +1 -1
  182. package/min/synchronizers/with-schemas/index.js.gz +0 -0
  183. package/min/ui-react/index.js +1 -1
  184. package/min/ui-react/index.js.gz +0 -0
  185. package/min/ui-react/with-schemas/index.js +1 -1
  186. package/min/ui-react/with-schemas/index.js.gz +0 -0
  187. package/min/ui-react-dom/index.js +1 -1
  188. package/min/ui-react-dom/index.js.gz +0 -0
  189. package/min/ui-react-dom/with-schemas/index.js +1 -1
  190. package/min/ui-react-dom/with-schemas/index.js.gz +0 -0
  191. package/min/ui-react-inspector/index.js +1 -1
  192. package/min/ui-react-inspector/index.js.gz +0 -0
  193. package/min/ui-react-inspector/with-schemas/index.js +1 -1
  194. package/min/ui-react-inspector/with-schemas/index.js.gz +0 -0
  195. package/min/with-schemas/index.js +1 -1
  196. package/min/with-schemas/index.js.gz +0 -0
  197. package/omni/index.js +418 -219
  198. package/omni/with-schemas/index.js +418 -219
  199. package/package.json +10 -10
  200. package/persisters/index.js +5 -5
  201. package/persisters/persister-automerge/index.js +5 -5
  202. package/persisters/persister-automerge/with-schemas/index.js +5 -5
  203. package/persisters/persister-browser/index.js +5 -5
  204. package/persisters/persister-browser/with-schemas/index.js +5 -5
  205. package/persisters/persister-cr-sqlite-wasm/index.js +5 -5
  206. package/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +5 -5
  207. package/persisters/persister-durable-object-sql-storage/index.js +5 -5
  208. package/persisters/persister-durable-object-sql-storage/with-schemas/index.js +5 -5
  209. package/persisters/persister-durable-object-storage/index.js +5 -5
  210. package/persisters/persister-durable-object-storage/with-schemas/index.js +5 -5
  211. package/persisters/persister-electric-sql/index.js +5 -5
  212. package/persisters/persister-electric-sql/with-schemas/index.js +5 -5
  213. package/persisters/persister-expo-sqlite/index.js +5 -5
  214. package/persisters/persister-expo-sqlite/with-schemas/index.js +5 -5
  215. package/persisters/persister-file/index.js +5 -5
  216. package/persisters/persister-file/with-schemas/index.js +5 -5
  217. package/persisters/persister-indexed-db/index.js +5 -5
  218. package/persisters/persister-indexed-db/with-schemas/index.js +5 -5
  219. package/persisters/persister-libsql/index.js +5 -5
  220. package/persisters/persister-libsql/with-schemas/index.js +5 -5
  221. package/persisters/persister-partykit-client/index.js +5 -5
  222. package/persisters/persister-partykit-client/with-schemas/index.js +5 -5
  223. package/persisters/persister-pglite/index.js +5 -5
  224. package/persisters/persister-pglite/with-schemas/index.js +5 -5
  225. package/persisters/persister-postgres/index.js +5 -5
  226. package/persisters/persister-postgres/with-schemas/index.js +5 -5
  227. package/persisters/persister-powersync/index.js +5 -5
  228. package/persisters/persister-powersync/with-schemas/index.js +5 -5
  229. package/persisters/persister-react-native-mmkv/index.js +5 -5
  230. package/persisters/persister-react-native-mmkv/with-schemas/index.js +5 -5
  231. package/persisters/persister-react-native-sqlite/index.js +5 -5
  232. package/persisters/persister-react-native-sqlite/with-schemas/index.js +5 -5
  233. package/persisters/persister-remote/index.js +5 -5
  234. package/persisters/persister-remote/with-schemas/index.js +5 -5
  235. package/persisters/persister-sqlite-bun/index.js +5 -5
  236. package/persisters/persister-sqlite-bun/with-schemas/index.js +5 -5
  237. package/persisters/persister-sqlite-wasm/index.js +5 -5
  238. package/persisters/persister-sqlite-wasm/with-schemas/index.js +5 -5
  239. package/persisters/persister-sqlite3/index.js +5 -5
  240. package/persisters/persister-sqlite3/with-schemas/index.js +5 -5
  241. package/persisters/persister-yjs/index.js +5 -5
  242. package/persisters/persister-yjs/with-schemas/index.js +5 -5
  243. package/persisters/with-schemas/index.js +5 -5
  244. package/queries/index.js +11 -4
  245. package/queries/with-schemas/index.js +11 -4
  246. package/readme.md +3 -3
  247. package/releases.md +38 -3
  248. package/schematizers/index.js +9 -1
  249. package/schematizers/schematizer-arktype/index.js +16 -1
  250. package/schematizers/schematizer-arktype/with-schemas/index.js +16 -1
  251. package/schematizers/schematizer-effect/index.js +15 -2
  252. package/schematizers/schematizer-effect/with-schemas/index.js +15 -2
  253. package/schematizers/schematizer-typebox/index.js +9 -1
  254. package/schematizers/schematizer-typebox/with-schemas/index.js +9 -1
  255. package/schematizers/schematizer-valibot/index.js +17 -2
  256. package/schematizers/schematizer-valibot/with-schemas/index.js +17 -2
  257. package/schematizers/schematizer-yup/index.js +9 -1
  258. package/schematizers/schematizer-yup/with-schemas/index.js +9 -1
  259. package/schematizers/schematizer-zod/index.js +13 -2
  260. package/schematizers/schematizer-zod/with-schemas/index.js +13 -2
  261. package/schematizers/with-schemas/index.js +9 -1
  262. package/store/index.js +254 -149
  263. package/store/with-schemas/index.js +254 -149
  264. package/synchronizers/index.js +5 -5
  265. package/synchronizers/synchronizer-broadcast-channel/index.js +5 -5
  266. package/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +5 -5
  267. package/synchronizers/synchronizer-local/index.js +5 -5
  268. package/synchronizers/synchronizer-local/with-schemas/index.js +5 -5
  269. package/synchronizers/synchronizer-ws-client/index.js +5 -5
  270. package/synchronizers/synchronizer-ws-client/with-schemas/index.js +5 -5
  271. package/synchronizers/synchronizer-ws-server/index.js +5 -5
  272. package/synchronizers/synchronizer-ws-server/with-schemas/index.js +5 -5
  273. package/synchronizers/synchronizer-ws-server-durable-object/index.js +5 -5
  274. package/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +5 -5
  275. package/synchronizers/with-schemas/index.js +5 -5
  276. package/ui-react/index.js +6 -0
  277. package/ui-react/with-schemas/index.js +6 -0
  278. package/ui-react-dom/index.js +113 -6
  279. package/ui-react-dom/with-schemas/index.js +113 -6
  280. package/ui-react-inspector/index.js +329 -129
  281. package/ui-react-inspector/with-schemas/index.js +329 -129
  282. package/with-schemas/index.js +311 -209
@@ -4,6 +4,8 @@ const STRING = getTypeOf(EMPTY_STRING);
4
4
  const BOOLEAN = getTypeOf(true);
5
5
  const NUMBER = getTypeOf(0);
6
6
  const FUNCTION = getTypeOf(getTypeOf);
7
+ const OBJECT = 'object';
8
+ const ARRAY = 'array';
7
9
  const TYPE = 'type';
8
10
  const DEFAULT = 'default';
9
11
  const ALLOW_NULL = 'allowNull';
@@ -33,6 +35,7 @@ const VALUE = 'Value';
33
35
  const VALUES = VALUE + 's';
34
36
  const VALUE_IDS = VALUE + IDS;
35
37
  const TRANSACTION = 'Transaction';
38
+ const JSON_PREFIX = '\uFFFD';
36
39
  const id = (key) => EMPTY_STRING + key;
37
40
  const strStartsWith = (str, prefix) => str.startsWith(prefix);
38
41
  const strEndsWith = (str, suffix) => str.endsWith(suffix);
@@ -131,7 +134,6 @@ const isObject = (obj) =>
131
134
  const objIds = object.keys;
132
135
  const objFreeze = object.freeze;
133
136
  const objNew = (entries = []) => object.fromEntries(entries);
134
- const objMerge = (...objs) => object.assign({}, ...objs);
135
137
  const objGet = (obj, id) => ifNotUndefined(obj, (obj2) => obj2[id]);
136
138
  const objHas = (obj, id) => id in obj;
137
139
  const objDel = (obj, id) => {
@@ -560,18 +562,12 @@ const createCheckpoints = getCreateFunction(
560
562
  collForEach(cellsDelta2, (table, tableId) =>
561
563
  collForEach(table, (row, rowId) =>
562
564
  collForEach(row, (oldNew, cellId) =>
563
- store.setOrDelCell(
564
- tableId,
565
- rowId,
566
- cellId,
567
- oldNew[oldOrNew],
568
- true,
569
- ),
565
+ store._[5](tableId, rowId, cellId, oldNew[oldOrNew], true),
570
566
  ),
571
567
  ),
572
568
  );
573
569
  collForEach(valuesDelta2, (oldNew, valueId) =>
574
- store.setOrDelValue(valueId, oldNew[oldOrNew], true),
570
+ store._[6](valueId, oldNew[oldOrNew], true),
575
571
  );
576
572
  });
577
573
  listening = 1;
@@ -1161,6 +1157,12 @@ const getCellOrValueType = (cellOrValue) => {
1161
1157
  if (isNull(cellOrValue)) {
1162
1158
  return NULL;
1163
1159
  }
1160
+ if (isArray(cellOrValue)) {
1161
+ return ARRAY;
1162
+ }
1163
+ if (isObject(cellOrValue)) {
1164
+ return OBJECT;
1165
+ }
1164
1166
  const type = getTypeOf(cellOrValue);
1165
1167
  return isTypeStringOrBoolean(type) ||
1166
1168
  (type == NUMBER && isFiniteNumber(cellOrValue))
@@ -1169,9 +1171,14 @@ const getCellOrValueType = (cellOrValue) => {
1169
1171
  };
1170
1172
  const isCellOrValueOrUndefined = (cellOrValue) =>
1171
1173
  isUndefined(cellOrValue) || !isUndefined(getCellOrValueType(cellOrValue));
1174
+ const isJsonType = (type) => type == OBJECT || type == ARRAY;
1175
+ const encodeIfJson = (value) =>
1176
+ isObject(value) || isArray(value) ? JSON_PREFIX + jsonString(value) : value;
1177
+ const isEncodedJson = (value) => isString(value) && value[0] == JSON_PREFIX;
1178
+ const decodeIfJson = (raw, _id, encoded) =>
1179
+ !encoded && isEncodedJson(raw) ? jsonParse(slice(raw, 1)) : raw;
1172
1180
 
1173
1181
  const stampClone = ([value, hlc]) => stampNew(value, hlc);
1174
- const stampCloneWithHash = ([value, hlc, hash]) => [value, hlc, hash];
1175
1182
  const stampNew = (value, hlc) => (hlc ? [value, hlc] : [value]);
1176
1183
  const stampNewWithHash = (value, hlc, hash) => [value, hlc, hash];
1177
1184
  const getStampHash = (stamp) => stamp[2];
@@ -1188,10 +1195,11 @@ const stampUpdate = (stamp, hlc, hash) => {
1188
1195
  };
1189
1196
  const stampNewObj = (hlc = EMPTY_STRING) => stampNew(objNew(), hlc);
1190
1197
  const stampNewMap = (hlc = EMPTY_STRING) => [mapNew(), hlc, 0];
1191
- const stampMapToObjWithHash = (
1192
- [map, hlc, hash],
1193
- mapper = stampCloneWithHash,
1194
- ) => [mapToObj(map, mapper), hlc, hash];
1198
+ const stampMapToObjWithHash = ([map, hlc, hash], mapper) => [
1199
+ mapToObj(map, mapper),
1200
+ hlc,
1201
+ hash,
1202
+ ];
1195
1203
  const stampMapToObjWithoutHash = ([map, hlc], mapper = stampClone) =>
1196
1204
  stampNew(mapToObj(map, mapper), hlc);
1197
1205
  const stampValidate = (stamp, validateThing) =>
@@ -1298,15 +1306,19 @@ const createStore = () => {
1298
1306
  return false;
1299
1307
  }
1300
1308
  const type = schema[TYPE];
1301
- if (!isTypeStringOrBoolean(type) && type != NUMBER) {
1309
+ if (!isTypeStringOrBoolean(type) && type != NUMBER && !isJsonType(type)) {
1302
1310
  return false;
1303
1311
  }
1304
1312
  const defaultValue = schema[DEFAULT];
1305
1313
  if (isNull(defaultValue) && !schema[ALLOW_NULL]) {
1306
1314
  return false;
1307
1315
  }
1308
- if (!isNull(defaultValue) && getCellOrValueType(defaultValue) != type) {
1309
- objDel(schema, DEFAULT);
1316
+ if (!isNull(defaultValue)) {
1317
+ if (getCellOrValueType(defaultValue) != type) {
1318
+ objDel(schema, DEFAULT);
1319
+ } else {
1320
+ schema[DEFAULT] = encodeIfJson(defaultValue);
1321
+ }
1310
1322
  }
1311
1323
  return true;
1312
1324
  };
@@ -1346,20 +1358,22 @@ const createStore = () => {
1346
1358
  ? cellSchema[ALLOW_NULL]
1347
1359
  ? cell
1348
1360
  : cellInvalid(tableId, rowId, cellId, cell, cellSchema[DEFAULT])
1349
- : getCellOrValueType(cell) == cellSchema[TYPE]
1350
- ? cell
1351
- : cellInvalid(
1352
- tableId,
1353
- rowId,
1354
- cellId,
1355
- cell,
1356
- cellSchema[DEFAULT],
1357
- ),
1361
+ : getCellOrValueType(cell) === cellSchema[TYPE]
1362
+ ? encodeIfJson(cell)
1363
+ : isJsonType(cellSchema[TYPE]) && isEncodedJson(cell)
1364
+ ? cell
1365
+ : cellInvalid(
1366
+ tableId,
1367
+ rowId,
1368
+ cellId,
1369
+ cell,
1370
+ cellSchema[DEFAULT],
1371
+ ),
1358
1372
  () => cellInvalid(tableId, rowId, cellId, cell),
1359
1373
  )
1360
1374
  : isUndefined(getCellOrValueType(cell))
1361
1375
  ? cellInvalid(tableId, rowId, cellId, cell)
1362
- : cell;
1376
+ : encodeIfJson(cell);
1363
1377
  const validateValues = (values, skipDefaults) =>
1364
1378
  objValidate(
1365
1379
  skipDefaults ? values : addDefaultsToValues(values),
@@ -1383,14 +1397,16 @@ const createStore = () => {
1383
1397
  ? valueSchema[ALLOW_NULL]
1384
1398
  ? value
1385
1399
  : valueInvalid(valueId, value, valueSchema[DEFAULT])
1386
- : getCellOrValueType(value) == valueSchema[TYPE]
1387
- ? value
1388
- : valueInvalid(valueId, value, valueSchema[DEFAULT]),
1400
+ : getCellOrValueType(value) === valueSchema[TYPE]
1401
+ ? encodeIfJson(value)
1402
+ : isJsonType(valueSchema[TYPE]) && isEncodedJson(value)
1403
+ ? value
1404
+ : valueInvalid(valueId, value, valueSchema[DEFAULT]),
1389
1405
  () => valueInvalid(valueId, value),
1390
1406
  )
1391
1407
  : isUndefined(getCellOrValueType(value))
1392
1408
  ? valueInvalid(valueId, value)
1393
- : value;
1409
+ : encodeIfJson(value);
1394
1410
  const addDefaultsToRow = (row, tableId, rowId) => {
1395
1411
  ifNotUndefined(
1396
1412
  mapGet(tablesSchemaRowCache, tableId),
@@ -1470,10 +1486,24 @@ const createStore = () => {
1470
1486
  );
1471
1487
  const setOrDelTables = (tables) =>
1472
1488
  objIsEmpty(tables) ? delTables() : setTables(tables);
1473
- const setOrDelCell = (tableId, rowId, cellId, cell, skipMiddleware) =>
1489
+ const setOrDelCell = (
1490
+ tableId,
1491
+ rowId,
1492
+ cellId,
1493
+ cell,
1494
+ skipMiddleware,
1495
+ skipRowMiddleware,
1496
+ ) =>
1474
1497
  isUndefined(cell)
1475
1498
  ? delCell(tableId, rowId, cellId, true, skipMiddleware)
1476
- : setCell(tableId, rowId, cellId, cell, skipMiddleware);
1499
+ : setCell(
1500
+ tableId,
1501
+ rowId,
1502
+ cellId,
1503
+ cell,
1504
+ skipMiddleware,
1505
+ skipRowMiddleware,
1506
+ );
1477
1507
  const setOrDelValues = (values) =>
1478
1508
  objIsEmpty(values) ? delValues() : setValues(values);
1479
1509
  const setOrDelValue = (valueId, value, skipMiddleware) =>
@@ -1573,6 +1603,30 @@ const createStore = () => {
1573
1603
  ),
1574
1604
  objIsEqual,
1575
1605
  );
1606
+ const applyRowDirectly = (tableId, tableMap, rowId, row, skipMiddleware) => {
1607
+ mapMatch(
1608
+ mapEnsure(tableMap, rowId, () => {
1609
+ rowIdsChanged(tableId, rowId, 1);
1610
+ return mapNew();
1611
+ }),
1612
+ row,
1613
+ (rowMap, cellId, cell) =>
1614
+ ifNotUndefined(
1615
+ getValidatedCell(tableId, rowId, cellId, cell),
1616
+ (validCell) =>
1617
+ setValidCell(
1618
+ tableId,
1619
+ rowId,
1620
+ rowMap,
1621
+ cellId,
1622
+ validCell,
1623
+ skipMiddleware,
1624
+ ),
1625
+ ),
1626
+ (rowMap, cellId) =>
1627
+ delValidCell(tableId, tableMap, rowId, rowMap, cellId, true),
1628
+ );
1629
+ };
1576
1630
  const setValidCell = (tableId, rowId, rowMap, cellId, cell, skipMiddleware) =>
1577
1631
  ifTransformed(
1578
1632
  cell,
@@ -1813,13 +1867,21 @@ const createStore = () => {
1813
1867
  const getCellChange = (tableId, rowId, cellId) =>
1814
1868
  ifNotUndefined(
1815
1869
  mapGet(mapGet(mapGet(changedCells, tableId), rowId), cellId),
1816
- ([oldCell, newCell]) => [true, oldCell, newCell],
1870
+ ([oldCell, newCell]) => [
1871
+ true,
1872
+ decodeIfJson(oldCell),
1873
+ decodeIfJson(newCell),
1874
+ ],
1817
1875
  () => [false, ...pairNew(getCell(tableId, rowId, cellId))],
1818
1876
  );
1819
1877
  const getValueChange = (valueId) =>
1820
1878
  ifNotUndefined(
1821
1879
  mapGet(changedValues, valueId),
1822
- ([oldValue, newValue]) => [true, oldValue, newValue],
1880
+ ([oldValue, newValue]) => [
1881
+ true,
1882
+ decodeIfJson(oldValue),
1883
+ decodeIfJson(newValue),
1884
+ ],
1823
1885
  () => [false, ...pairNew(getValue(valueId))],
1824
1886
  );
1825
1887
  const callInvalidCellListeners = (mutator) =>
@@ -1995,8 +2057,8 @@ const createStore = () => {
1995
2057
  callListeners(
1996
2058
  cellListeners[mutator],
1997
2059
  [tableId, rowId, cellId],
1998
- newCell,
1999
- oldCell,
2060
+ decodeIfJson(newCell),
2061
+ decodeIfJson(oldCell),
2000
2062
  getCellChange,
2001
2063
  );
2002
2064
  tablesChanged = tableChanged = rowChanged = 1;
@@ -2052,8 +2114,8 @@ const createStore = () => {
2052
2114
  callListeners(
2053
2115
  valueListeners[mutator],
2054
2116
  [valueId],
2055
- newValue,
2056
- oldValue,
2117
+ decodeIfJson(newValue),
2118
+ decodeIfJson(oldValue),
2057
2119
  getValueChange,
2058
2120
  );
2059
2121
  valuesChanged = 1;
@@ -2090,10 +2152,42 @@ const createStore = () => {
2090
2152
  [getTableIds],
2091
2153
  );
2092
2154
  };
2155
+ const getTransactionChangesImpl = (encoded = false) => [
2156
+ mapToObj(
2157
+ changedCells,
2158
+ (table, tableId) =>
2159
+ mapGet(changedTableIds, tableId) === -1
2160
+ ? void 0
2161
+ : mapToObj(
2162
+ table,
2163
+ (row, rowId) =>
2164
+ mapGet(mapGet(changedRowIds, tableId), rowId) === -1
2165
+ ? void 0
2166
+ : mapToObj(
2167
+ row,
2168
+ ([, newCell]) =>
2169
+ decodeIfJson(newCell, EMPTY_STRING, encoded),
2170
+ (changedCell) => pairIsEqual(changedCell),
2171
+ ),
2172
+ collIsEmpty,
2173
+ objIsEmpty,
2174
+ ),
2175
+ collIsEmpty,
2176
+ objIsEmpty,
2177
+ ),
2178
+ mapToObj(
2179
+ changedValues,
2180
+ ([, newValue]) => decodeIfJson(newValue, EMPTY_STRING, encoded),
2181
+ (changedValue) => pairIsEqual(changedValue),
2182
+ ),
2183
+ 1,
2184
+ ];
2093
2185
  const getContent = () => [getTables(), getValues()];
2094
- const getTables = () => mapToObj3(tablesMap);
2186
+ const getEncodedContent = () => [mapToObj3(tablesMap), mapToObj(valuesMap)];
2187
+ const getTables = () => mapToObj3(tablesMap, decodeIfJson);
2095
2188
  const getTableIds = () => mapKeys(tablesMap);
2096
- const getTable = (tableId) => mapToObj2(mapGet(tablesMap, id(tableId)));
2189
+ const getTable = (tableId) =>
2190
+ mapToObj2(mapGet(tablesMap, id(tableId)), decodeIfJson);
2097
2191
  const getTableCellIds = (tableId) =>
2098
2192
  mapKeys(mapGet(tableCellIds, id(tableId)));
2099
2193
  const getRowCount = (tableId) => collSize(mapGet(tablesMap, id(tableId)));
@@ -2129,14 +2223,16 @@ const createStore = () => {
2129
2223
  ([, rowId]) => rowId,
2130
2224
  );
2131
2225
  const getRow = (tableId, rowId) =>
2132
- mapToObj(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)));
2226
+ mapToObj(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)), decodeIfJson);
2133
2227
  const getCellIds = (tableId, rowId) =>
2134
2228
  mapKeys(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)));
2135
2229
  const getCell = (tableId, rowId, cellId) =>
2136
- mapGet(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)), id(cellId));
2137
- const getValues = () => mapToObj(valuesMap);
2230
+ decodeIfJson(
2231
+ mapGet(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)), id(cellId)),
2232
+ );
2233
+ const getValues = () => mapToObj(valuesMap, decodeIfJson);
2138
2234
  const getValueIds = () => mapKeys(valuesMap);
2139
- const getValue = (valueId) => mapGet(valuesMap, id(valueId));
2235
+ const getValue = (valueId) => decodeIfJson(mapGet(valuesMap, id(valueId)));
2140
2236
  const hasTables = () => !collIsEmpty(tablesMap);
2141
2237
  const hasTable = (tableId) => collHas(tablesMap, id(tableId));
2142
2238
  const hasTableCell = (tableId, cellId) =>
@@ -2207,7 +2303,14 @@ const createStore = () => {
2207
2303
  tableId,
2208
2304
  rowId,
2209
2305
  );
2210
- const setCell = (tableId, rowId, cellId, cell, skipMiddleware) =>
2306
+ const setCell = (
2307
+ tableId,
2308
+ rowId,
2309
+ cellId,
2310
+ cell,
2311
+ skipMiddleware,
2312
+ skipRowMiddleware,
2313
+ ) =>
2211
2314
  fluentTransaction(
2212
2315
  (tableId2, rowId2, cellId2) =>
2213
2316
  ifNotUndefined(
@@ -2217,15 +2320,47 @@ const createStore = () => {
2217
2320
  cellId2,
2218
2321
  isFunction(cell) ? cell(getCell(tableId2, rowId2, cellId2)) : cell,
2219
2322
  ),
2220
- (validCell) =>
2221
- setCellIntoNewRow(
2222
- tableId2,
2223
- getOrCreateTable(tableId2),
2224
- rowId2,
2225
- cellId2,
2226
- validCell,
2227
- skipMiddleware,
2228
- ),
2323
+ (validCell) => {
2324
+ const tableMap = getOrCreateTable(tableId2);
2325
+ ifNotUndefined(
2326
+ skipMiddleware || skipRowMiddleware || !middleware[14]?.()
2327
+ ? void 0
2328
+ : middleware[3],
2329
+ (willSetRow) => {
2330
+ const existingRowMap = mapGet(tableMap, rowId2);
2331
+ const prospectiveRow = {
2332
+ ...(existingRowMap ? mapToObj(existingRowMap) : {}),
2333
+ [cellId2]: validCell,
2334
+ };
2335
+ ifNotUndefined(
2336
+ whileMutating(() =>
2337
+ willSetRow(
2338
+ tableId2,
2339
+ rowId2,
2340
+ structuredClone(prospectiveRow),
2341
+ ),
2342
+ ),
2343
+ (row) =>
2344
+ applyRowDirectly(
2345
+ tableId2,
2346
+ tableMap,
2347
+ rowId2,
2348
+ row,
2349
+ skipMiddleware,
2350
+ ),
2351
+ );
2352
+ },
2353
+ () =>
2354
+ setCellIntoNewRow(
2355
+ tableId2,
2356
+ tableMap,
2357
+ rowId2,
2358
+ cellId2,
2359
+ validCell,
2360
+ skipMiddleware,
2361
+ ),
2362
+ );
2363
+ },
2229
2364
  ),
2230
2365
  tableId,
2231
2366
  rowId,
@@ -2274,7 +2409,14 @@ const createStore = () => {
2274
2409
  isUndefined(row)
2275
2410
  ? delRow(tableId, rowId)
2276
2411
  : objMap(row, (cell, cellId) =>
2277
- setOrDelCell(tableId, rowId, cellId, cell),
2412
+ setOrDelCell(
2413
+ tableId,
2414
+ rowId,
2415
+ cellId,
2416
+ cell,
2417
+ void 0,
2418
+ true,
2419
+ ),
2278
2420
  ),
2279
2421
  ),
2280
2422
  );
@@ -2423,35 +2565,8 @@ const createStore = () => {
2423
2565
  }
2424
2566
  return store;
2425
2567
  };
2426
- const getTransactionChanges = () => [
2427
- mapToObj(
2428
- changedCells,
2429
- (table, tableId) =>
2430
- mapGet(changedTableIds, tableId) === -1
2431
- ? void 0
2432
- : mapToObj(
2433
- table,
2434
- (row, rowId) =>
2435
- mapGet(mapGet(changedRowIds, tableId), rowId) === -1
2436
- ? void 0
2437
- : mapToObj(
2438
- row,
2439
- ([, newCell]) => newCell,
2440
- (changedCell) => pairIsEqual(changedCell),
2441
- ),
2442
- collIsEmpty,
2443
- objIsEmpty,
2444
- ),
2445
- collIsEmpty,
2446
- objIsEmpty,
2447
- ),
2448
- mapToObj(
2449
- changedValues,
2450
- ([, newValue]) => newValue,
2451
- (changedValue) => pairIsEqual(changedValue),
2452
- ),
2453
- 1,
2454
- ];
2568
+ const getTransactionChanges = () => getTransactionChangesImpl();
2569
+ const getEncodedTransactionChanges = () => getTransactionChangesImpl(true);
2455
2570
  const getTransactionLog = () => [
2456
2571
  !collIsEmpty(changedCells),
2457
2572
  !collIsEmpty(changedValues),
@@ -2464,37 +2579,6 @@ const createStore = () => {
2464
2579
  mapToObj3(changedCellIds),
2465
2580
  mapToObj(changedValueIds),
2466
2581
  ];
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
- };
2498
2582
  const finishTransaction = (doRollback) => {
2499
2583
  if (transactions > 0) {
2500
2584
  transactions--;
@@ -2504,7 +2588,6 @@ const createStore = () => {
2504
2588
  callInvalidCellListeners(1);
2505
2589
  if (!collIsEmpty(changedCells)) {
2506
2590
  callTabularListenersForChanges(1);
2507
- doDidSetRows();
2508
2591
  }
2509
2592
  callInvalidValueListeners(1);
2510
2593
  if (!collIsEmpty(changedValues)) {
@@ -2565,7 +2648,9 @@ const createStore = () => {
2565
2648
  tableCallback(tableId, (rowCallback) =>
2566
2649
  collForEach(tableMap, (rowMap, rowId) =>
2567
2650
  rowCallback(rowId, (cellCallback) =>
2568
- mapForEach(rowMap, cellCallback),
2651
+ mapForEach(rowMap, (cellId, cell) =>
2652
+ cellCallback(cellId, decodeIfJson(cell)),
2653
+ ),
2569
2654
  ),
2570
2655
  ),
2571
2656
  ),
@@ -2574,11 +2659,21 @@ const createStore = () => {
2574
2659
  mapForEach(mapGet(tableCellIds, id(tableId)), tableCellCallback);
2575
2660
  const forEachRow = (tableId, rowCallback) =>
2576
2661
  collForEach(mapGet(tablesMap, id(tableId)), (rowMap, rowId) =>
2577
- rowCallback(rowId, (cellCallback) => mapForEach(rowMap, cellCallback)),
2662
+ rowCallback(rowId, (cellCallback) =>
2663
+ mapForEach(rowMap, (cellId, cell) =>
2664
+ cellCallback(cellId, decodeIfJson(cell)),
2665
+ ),
2666
+ ),
2578
2667
  );
2579
2668
  const forEachCell = (tableId, rowId, cellCallback) =>
2580
- mapForEach(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)), cellCallback);
2581
- const forEachValue = (valueCallback) => mapForEach(valuesMap, valueCallback);
2669
+ mapForEach(
2670
+ mapGet(mapGet(tablesMap, id(tableId)), id(rowId)),
2671
+ (cellId, cell) => cellCallback(cellId, decodeIfJson(cell)),
2672
+ );
2673
+ const forEachValue = (valueCallback) =>
2674
+ mapForEach(valuesMap, (valueId, value) =>
2675
+ valueCallback(valueId, decodeIfJson(value)),
2676
+ );
2582
2677
  const addSortedRowIdsListener = (
2583
2678
  tableIdOrArgs,
2584
2679
  cellIdOrListener,
@@ -2663,7 +2758,7 @@ const createStore = () => {
2663
2758
  willDelValues,
2664
2759
  willDelValue,
2665
2760
  willApplyChanges,
2666
- didSetRow,
2761
+ hasWillSetRowCallbacks,
2667
2762
  ) =>
2668
2763
  (middleware = [
2669
2764
  willSetContent,
@@ -2680,7 +2775,7 @@ const createStore = () => {
2680
2775
  willDelValues,
2681
2776
  willDelValue,
2682
2777
  willApplyChanges,
2683
- didSetRow,
2778
+ hasWillSetRowCallbacks,
2684
2779
  ]);
2685
2780
  const setInternalListeners = (
2686
2781
  preStartTransaction,
@@ -2770,14 +2865,17 @@ const createStore = () => {
2770
2865
  delListener,
2771
2866
  getListenerStats,
2772
2867
  isMergeable: () => false,
2773
- // only used internally by other modules
2774
- createStore,
2775
- addListener,
2776
- callListeners,
2777
- setInternalListeners,
2778
- setMiddleware,
2779
- setOrDelCell,
2780
- setOrDelValue,
2868
+ _: [
2869
+ createStore,
2870
+ addListener,
2871
+ callListeners,
2872
+ setInternalListeners,
2873
+ setMiddleware,
2874
+ setOrDelCell,
2875
+ setOrDelValue,
2876
+ getEncodedContent,
2877
+ getEncodedTransactionChanges,
2878
+ ],
2781
2879
  };
2782
2880
  objMap(
2783
2881
  {
@@ -3092,14 +3190,78 @@ const createMergeableStore = (uniqueId, getNow) => {
3092
3190
  ]);
3093
3191
  }
3094
3192
  };
3095
- const getMergeableContent = () => [
3193
+ const getMergeableContentImpl = (encoded = false) => [
3096
3194
  stampMapToObjWithHash(contentStampMap[0], (tableStampMap) =>
3097
3195
  stampMapToObjWithHash(tableStampMap, (rowStampMap) =>
3098
- stampMapToObjWithHash(rowStampMap),
3196
+ stampMapToObjWithHash(rowStampMap, ([cell, hlc, hash]) => [
3197
+ decodeIfJson(cell, EMPTY_STRING, encoded),
3198
+ hlc,
3199
+ hash,
3200
+ ]),
3099
3201
  ),
3100
3202
  ),
3101
- stampMapToObjWithHash(contentStampMap[1]),
3203
+ stampMapToObjWithHash(contentStampMap[1], ([value, hlc, hash]) => [
3204
+ decodeIfJson(value, EMPTY_STRING, encoded),
3205
+ hlc,
3206
+ hash,
3207
+ ]),
3102
3208
  ];
3209
+ const getTransactionMergeableChangesImpl = (withHashes, encoded = false) => {
3210
+ const [
3211
+ [tableStampMaps, tablesHlc, tablesHash],
3212
+ [valueStampMaps, valuesHlc, valuesHash],
3213
+ ] = contentStampMap;
3214
+ const newStamp = withHashes ? stampNewWithHash : stampNew;
3215
+ const tablesObj = {};
3216
+ collForEach(touchedCells, (touchedTable, tableId) =>
3217
+ ifNotUndefined(
3218
+ mapGet(tableStampMaps, tableId),
3219
+ ([rowStampMaps, tableHlc, tableHash]) => {
3220
+ const tableObj = {};
3221
+ collForEach(touchedTable, (touchedRow, rowId) =>
3222
+ ifNotUndefined(
3223
+ mapGet(rowStampMaps, rowId),
3224
+ ([cellStampMaps, rowHlc, rowHash]) => {
3225
+ const rowObj = {};
3226
+ collForEach(touchedRow, (cellId) => {
3227
+ ifNotUndefined(
3228
+ mapGet(cellStampMaps, cellId),
3229
+ ([cell, time, hash]) =>
3230
+ (rowObj[cellId] = newStamp(
3231
+ encoded ? cell : decodeIfJson(cell),
3232
+ time,
3233
+ hash,
3234
+ )),
3235
+ );
3236
+ });
3237
+ tableObj[rowId] = newStamp(rowObj, rowHlc, rowHash);
3238
+ },
3239
+ ),
3240
+ );
3241
+ tablesObj[tableId] = newStamp(tableObj, tableHlc, tableHash);
3242
+ },
3243
+ ),
3244
+ );
3245
+ const valuesObj = {};
3246
+ collForEach(touchedValues, (valueId) =>
3247
+ ifNotUndefined(
3248
+ mapGet(valueStampMaps, valueId),
3249
+ ([value, time, hash]) =>
3250
+ (valuesObj[valueId] = newStamp(
3251
+ encoded ? value : decodeIfJson(value),
3252
+ time,
3253
+ hash,
3254
+ )),
3255
+ ),
3256
+ );
3257
+ return [
3258
+ newStamp(tablesObj, tablesHlc, tablesHash),
3259
+ newStamp(valuesObj, valuesHlc, valuesHash),
3260
+ 1,
3261
+ ];
3262
+ };
3263
+ const getMergeableContent = () => getMergeableContentImpl();
3264
+ const getEncodedMergeableContent = () => getMergeableContentImpl(true);
3103
3265
  const getMergeableContentHashes = () => [
3104
3266
  contentStampMap[0][2],
3105
3267
  contentStampMap[1][2],
@@ -3239,52 +3401,10 @@ const createMergeableStore = (uniqueId, getNow) => {
3239
3401
  });
3240
3402
  return mergeableStore;
3241
3403
  };
3242
- const getTransactionMergeableChanges = (withHashes = false) => {
3243
- const [
3244
- [tableStampMaps, tablesHlc, tablesHash],
3245
- [valueStampMaps, valuesHlc, valuesHash],
3246
- ] = contentStampMap;
3247
- const newStamp = withHashes ? stampNewWithHash : stampNew;
3248
- const tablesObj = {};
3249
- collForEach(touchedCells, (touchedTable, tableId) =>
3250
- ifNotUndefined(
3251
- mapGet(tableStampMaps, tableId),
3252
- ([rowStampMaps, tableHlc, tableHash]) => {
3253
- const tableObj = {};
3254
- collForEach(touchedTable, (touchedRow, rowId) =>
3255
- ifNotUndefined(
3256
- mapGet(rowStampMaps, rowId),
3257
- ([cellStampMaps, rowHlc, rowHash]) => {
3258
- const rowObj = {};
3259
- collForEach(touchedRow, (cellId) => {
3260
- ifNotUndefined(
3261
- mapGet(cellStampMaps, cellId),
3262
- ([cell, time, hash]) =>
3263
- (rowObj[cellId] = newStamp(cell, time, hash)),
3264
- );
3265
- });
3266
- tableObj[rowId] = newStamp(rowObj, rowHlc, rowHash);
3267
- },
3268
- ),
3269
- );
3270
- tablesObj[tableId] = newStamp(tableObj, tableHlc, tableHash);
3271
- },
3272
- ),
3273
- );
3274
- const valuesObj = {};
3275
- collForEach(touchedValues, (valueId) =>
3276
- ifNotUndefined(
3277
- mapGet(valueStampMaps, valueId),
3278
- ([value, time, hash]) =>
3279
- (valuesObj[valueId] = newStamp(value, time, hash)),
3280
- ),
3281
- );
3282
- return [
3283
- newStamp(tablesObj, tablesHlc, tablesHash),
3284
- newStamp(valuesObj, valuesHlc, valuesHash),
3285
- 1,
3286
- ];
3287
- };
3404
+ const getTransactionMergeableChanges = (withHashes = false) =>
3405
+ getTransactionMergeableChangesImpl(withHashes);
3406
+ const getEncodedTransactionMergeableChanges = (withHashes) =>
3407
+ getTransactionMergeableChangesImpl(withHashes, true);
3288
3408
  const applyMergeableChanges = (mergeableChanges) =>
3289
3409
  disableListeningToRawStoreChanges(() =>
3290
3410
  store.applyChanges(mergeContentOrChanges(mergeableChanges)),
@@ -3316,10 +3436,13 @@ const createMergeableStore = (uniqueId, getNow) => {
3316
3436
  getTransactionMergeableChanges,
3317
3437
  applyMergeableChanges,
3318
3438
  merge,
3319
- // only used internally by other modules
3320
- hadMutated,
3439
+ __: [
3440
+ hadMutated,
3441
+ getEncodedMergeableContent,
3442
+ getEncodedTransactionMergeableChanges,
3443
+ ],
3321
3444
  };
3322
- store.setInternalListeners(
3445
+ store._[3](
3323
3446
  preStartTransaction,
3324
3447
  preFinishTransaction,
3325
3448
  postFinishTransaction,
@@ -3558,7 +3681,6 @@ const createMiddleware = getCreateFunction((store) => {
3558
3681
  const willDelValuesCallbacks = [];
3559
3682
  const willDelValueCallbacks = [];
3560
3683
  const willApplyChangesCallbacks = [];
3561
- const didSetRowCallbacksMap = mapNew();
3562
3684
  const willSetContent = (content) =>
3563
3685
  reduceCallbacks(willSetContentCallbacks, content);
3564
3686
  const willSetTables = (tables) =>
@@ -3585,17 +3707,6 @@ const createMiddleware = getCreateFunction((store) => {
3585
3707
  everyCallback(willDelValueCallbacks, valueId);
3586
3708
  const willApplyChanges = (changes) =>
3587
3709
  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
3710
  const getStore = () => store;
3600
3711
  const addWillSetContentCallback = addCallback(willSetContentCallbacks);
3601
3712
  const addWillSetTablesCallback = addCallback(willSetTablesCallbacks);
@@ -3611,13 +3722,6 @@ const createMiddleware = getCreateFunction((store) => {
3611
3722
  const addWillDelValuesCallback = addCallback(willDelValuesCallbacks);
3612
3723
  const addWillDelValueCallback = addCallback(willDelValueCallbacks);
3613
3724
  const addWillApplyChangesCallback = addCallback(willApplyChangesCallbacks);
3614
- const addDidSetRowCallback = (tableId, callback) =>
3615
- fluent(() =>
3616
- arrayPush(
3617
- mapEnsure(didSetRowCallbacksMap, tableId, () => []),
3618
- callback,
3619
- ),
3620
- );
3621
3725
  const destroy = () => {};
3622
3726
  const middleware = objFreeze({
3623
3727
  getStore,
@@ -3635,10 +3739,9 @@ const createMiddleware = getCreateFunction((store) => {
3635
3739
  addWillDelValuesCallback,
3636
3740
  addWillDelValueCallback,
3637
3741
  addWillApplyChangesCallback,
3638
- addDidSetRowCallback,
3639
3742
  destroy,
3640
3743
  });
3641
- store.setMiddleware(
3744
+ store._[4](
3642
3745
  willSetContent,
3643
3746
  willSetTables,
3644
3747
  willSetTable,
@@ -3653,21 +3756,20 @@ const createMiddleware = getCreateFunction((store) => {
3653
3756
  willDelValues,
3654
3757
  willDelValue,
3655
3758
  willApplyChanges,
3656
- didSetRow,
3759
+ () => willSetRowCallbacks.length > 0,
3657
3760
  );
3658
3761
  return middleware;
3659
3762
  });
3660
3763
 
3661
3764
  const createQueries = getCreateFunction((store) => {
3662
- const createStore = store.createStore;
3765
+ const createStore = store._[0];
3663
3766
  const preStore = createStore();
3664
3767
  const resultStore = createStore();
3665
3768
  const preStoreListenerIds = mapNew();
3666
3769
  const paramValuesListeners = mapNew();
3667
3770
  const paramValueListeners = mapNew();
3668
3771
  const {
3669
- addListener,
3670
- callListeners,
3772
+ _: [, addListener, callListeners],
3671
3773
  delListener: delListenerImpl,
3672
3774
  } = resultStore;
3673
3775
  const [
@@ -3986,7 +4088,7 @@ const createQueries = getCreateFunction((store) => {
3986
4088
  selectJoinWhereStore.transaction(() =>
3987
4089
  arrayEvery(wheres, (where2) => where2(getTableCell))
3988
4090
  ? mapForEach(selects, (asCellId, tableCellGetter) =>
3989
- selectJoinWhereStore.setOrDelCell(
4091
+ selectJoinWhereStore._[5](
3990
4092
  queryId,
3991
4093
  rootRowId,
3992
4094
  asCellId,