tinybase 8.0.0-beta.1 → 8.0.0-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (280) hide show
  1. package/@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 +151 -29
  5. package/@types/middleware/with-schemas/index.d.ts +174 -29
  6. package/@types/store/index.d.ts +132 -79
  7. package/@types/store/with-schemas/index.d.ts +137 -81
  8. package/checkpoints/index.js +2 -8
  9. package/checkpoints/with-schemas/index.js +2 -8
  10. package/index.js +272 -143
  11. package/mergeable-store/index.js +271 -156
  12. package/mergeable-store/with-schemas/index.js +271 -156
  13. package/middleware/index.js +40 -1
  14. package/middleware/with-schemas/index.js +40 -1
  15. package/min/checkpoints/index.js +1 -1
  16. package/min/checkpoints/index.js.gz +0 -0
  17. package/min/checkpoints/with-schemas/index.js +1 -1
  18. package/min/checkpoints/with-schemas/index.js.gz +0 -0
  19. package/min/index.js +1 -1
  20. package/min/index.js.gz +0 -0
  21. package/min/mergeable-store/index.js +1 -1
  22. package/min/mergeable-store/index.js.gz +0 -0
  23. package/min/mergeable-store/with-schemas/index.js +1 -1
  24. package/min/mergeable-store/with-schemas/index.js.gz +0 -0
  25. package/min/middleware/index.js +1 -1
  26. package/min/middleware/index.js.gz +0 -0
  27. package/min/middleware/with-schemas/index.js +1 -1
  28. package/min/middleware/with-schemas/index.js.gz +0 -0
  29. package/min/omni/index.js +1 -1
  30. package/min/omni/index.js.gz +0 -0
  31. package/min/omni/with-schemas/index.js +1 -1
  32. package/min/omni/with-schemas/index.js.gz +0 -0
  33. package/min/persisters/index.js +1 -1
  34. package/min/persisters/index.js.gz +0 -0
  35. package/min/persisters/persister-automerge/index.js +1 -1
  36. package/min/persisters/persister-automerge/index.js.gz +0 -0
  37. package/min/persisters/persister-automerge/with-schemas/index.js +1 -1
  38. package/min/persisters/persister-automerge/with-schemas/index.js.gz +0 -0
  39. package/min/persisters/persister-browser/index.js +1 -1
  40. package/min/persisters/persister-browser/index.js.gz +0 -0
  41. package/min/persisters/persister-browser/with-schemas/index.js +1 -1
  42. package/min/persisters/persister-browser/with-schemas/index.js.gz +0 -0
  43. package/min/persisters/persister-cr-sqlite-wasm/index.js +1 -1
  44. package/min/persisters/persister-cr-sqlite-wasm/index.js.gz +0 -0
  45. package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +1 -1
  46. package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js.gz +0 -0
  47. package/min/persisters/persister-durable-object-sql-storage/index.js +1 -1
  48. package/min/persisters/persister-durable-object-sql-storage/index.js.gz +0 -0
  49. package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js +1 -1
  50. package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js.gz +0 -0
  51. package/min/persisters/persister-durable-object-storage/index.js +1 -1
  52. package/min/persisters/persister-durable-object-storage/index.js.gz +0 -0
  53. package/min/persisters/persister-durable-object-storage/with-schemas/index.js +1 -1
  54. package/min/persisters/persister-durable-object-storage/with-schemas/index.js.gz +0 -0
  55. package/min/persisters/persister-electric-sql/index.js +1 -1
  56. package/min/persisters/persister-electric-sql/index.js.gz +0 -0
  57. package/min/persisters/persister-electric-sql/with-schemas/index.js +1 -1
  58. package/min/persisters/persister-electric-sql/with-schemas/index.js.gz +0 -0
  59. package/min/persisters/persister-expo-sqlite/index.js +1 -1
  60. package/min/persisters/persister-expo-sqlite/index.js.gz +0 -0
  61. package/min/persisters/persister-expo-sqlite/with-schemas/index.js +1 -1
  62. package/min/persisters/persister-expo-sqlite/with-schemas/index.js.gz +0 -0
  63. package/min/persisters/persister-file/index.js +1 -1
  64. package/min/persisters/persister-file/index.js.gz +0 -0
  65. package/min/persisters/persister-file/with-schemas/index.js +1 -1
  66. package/min/persisters/persister-file/with-schemas/index.js.gz +0 -0
  67. package/min/persisters/persister-indexed-db/index.js +1 -1
  68. package/min/persisters/persister-indexed-db/index.js.gz +0 -0
  69. package/min/persisters/persister-indexed-db/with-schemas/index.js +1 -1
  70. package/min/persisters/persister-indexed-db/with-schemas/index.js.gz +0 -0
  71. package/min/persisters/persister-libsql/index.js +1 -1
  72. package/min/persisters/persister-libsql/index.js.gz +0 -0
  73. package/min/persisters/persister-libsql/with-schemas/index.js +1 -1
  74. package/min/persisters/persister-libsql/with-schemas/index.js.gz +0 -0
  75. package/min/persisters/persister-partykit-client/index.js +1 -1
  76. package/min/persisters/persister-partykit-client/index.js.gz +0 -0
  77. package/min/persisters/persister-partykit-client/with-schemas/index.js +1 -1
  78. package/min/persisters/persister-partykit-client/with-schemas/index.js.gz +0 -0
  79. package/min/persisters/persister-pglite/index.js +1 -1
  80. package/min/persisters/persister-pglite/index.js.gz +0 -0
  81. package/min/persisters/persister-pglite/with-schemas/index.js +1 -1
  82. package/min/persisters/persister-pglite/with-schemas/index.js.gz +0 -0
  83. package/min/persisters/persister-postgres/index.js +1 -1
  84. package/min/persisters/persister-postgres/index.js.gz +0 -0
  85. package/min/persisters/persister-postgres/with-schemas/index.js +1 -1
  86. package/min/persisters/persister-postgres/with-schemas/index.js.gz +0 -0
  87. package/min/persisters/persister-powersync/index.js +1 -1
  88. package/min/persisters/persister-powersync/index.js.gz +0 -0
  89. package/min/persisters/persister-powersync/with-schemas/index.js +1 -1
  90. package/min/persisters/persister-powersync/with-schemas/index.js.gz +0 -0
  91. package/min/persisters/persister-react-native-mmkv/index.js +1 -1
  92. package/min/persisters/persister-react-native-mmkv/index.js.gz +0 -0
  93. package/min/persisters/persister-react-native-mmkv/with-schemas/index.js +1 -1
  94. package/min/persisters/persister-react-native-mmkv/with-schemas/index.js.gz +0 -0
  95. package/min/persisters/persister-react-native-sqlite/index.js +1 -1
  96. package/min/persisters/persister-react-native-sqlite/index.js.gz +0 -0
  97. package/min/persisters/persister-react-native-sqlite/with-schemas/index.js +1 -1
  98. package/min/persisters/persister-react-native-sqlite/with-schemas/index.js.gz +0 -0
  99. package/min/persisters/persister-remote/index.js +1 -1
  100. package/min/persisters/persister-remote/index.js.gz +0 -0
  101. package/min/persisters/persister-remote/with-schemas/index.js +1 -1
  102. package/min/persisters/persister-remote/with-schemas/index.js.gz +0 -0
  103. package/min/persisters/persister-sqlite-bun/index.js +1 -1
  104. package/min/persisters/persister-sqlite-bun/index.js.gz +0 -0
  105. package/min/persisters/persister-sqlite-bun/with-schemas/index.js +1 -1
  106. package/min/persisters/persister-sqlite-bun/with-schemas/index.js.gz +0 -0
  107. package/min/persisters/persister-sqlite-wasm/index.js +1 -1
  108. package/min/persisters/persister-sqlite-wasm/index.js.gz +0 -0
  109. package/min/persisters/persister-sqlite-wasm/with-schemas/index.js +1 -1
  110. package/min/persisters/persister-sqlite-wasm/with-schemas/index.js.gz +0 -0
  111. package/min/persisters/persister-sqlite3/index.js +1 -1
  112. package/min/persisters/persister-sqlite3/index.js.gz +0 -0
  113. package/min/persisters/persister-sqlite3/with-schemas/index.js +1 -1
  114. package/min/persisters/persister-sqlite3/with-schemas/index.js.gz +0 -0
  115. package/min/persisters/persister-yjs/index.js +1 -1
  116. package/min/persisters/persister-yjs/index.js.gz +0 -0
  117. package/min/persisters/persister-yjs/with-schemas/index.js +1 -1
  118. package/min/persisters/persister-yjs/with-schemas/index.js.gz +0 -0
  119. package/min/persisters/with-schemas/index.js +1 -1
  120. package/min/persisters/with-schemas/index.js.gz +0 -0
  121. package/min/queries/index.js +1 -1
  122. package/min/queries/index.js.gz +0 -0
  123. package/min/queries/with-schemas/index.js +1 -1
  124. package/min/queries/with-schemas/index.js.gz +0 -0
  125. package/min/schematizers/index.js +1 -1
  126. package/min/schematizers/index.js.gz +0 -0
  127. package/min/schematizers/schematizer-arktype/index.js +1 -1
  128. package/min/schematizers/schematizer-arktype/index.js.gz +0 -0
  129. package/min/schematizers/schematizer-arktype/with-schemas/index.js +1 -1
  130. package/min/schematizers/schematizer-arktype/with-schemas/index.js.gz +0 -0
  131. package/min/schematizers/schematizer-effect/index.js +1 -1
  132. package/min/schematizers/schematizer-effect/index.js.gz +0 -0
  133. package/min/schematizers/schematizer-effect/with-schemas/index.js +1 -1
  134. package/min/schematizers/schematizer-effect/with-schemas/index.js.gz +0 -0
  135. package/min/schematizers/schematizer-typebox/index.js +1 -1
  136. package/min/schematizers/schematizer-typebox/index.js.gz +0 -0
  137. package/min/schematizers/schematizer-typebox/with-schemas/index.js +1 -1
  138. package/min/schematizers/schematizer-typebox/with-schemas/index.js.gz +0 -0
  139. package/min/schematizers/schematizer-valibot/index.js +1 -1
  140. package/min/schematizers/schematizer-valibot/index.js.gz +0 -0
  141. package/min/schematizers/schematizer-valibot/with-schemas/index.js +1 -1
  142. package/min/schematizers/schematizer-valibot/with-schemas/index.js.gz +0 -0
  143. package/min/schematizers/schematizer-yup/index.js +1 -1
  144. package/min/schematizers/schematizer-yup/index.js.gz +0 -0
  145. package/min/schematizers/schematizer-yup/with-schemas/index.js +1 -1
  146. package/min/schematizers/schematizer-yup/with-schemas/index.js.gz +0 -0
  147. package/min/schematizers/schematizer-zod/index.js +1 -1
  148. package/min/schematizers/schematizer-zod/index.js.gz +0 -0
  149. package/min/schematizers/schematizer-zod/with-schemas/index.js +1 -1
  150. package/min/schematizers/schematizer-zod/with-schemas/index.js.gz +0 -0
  151. package/min/schematizers/with-schemas/index.js +1 -1
  152. package/min/schematizers/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/with-schemas/index.js +1 -1
  180. package/min/synchronizers/with-schemas/index.js.gz +0 -0
  181. package/min/ui-react/index.js +1 -1
  182. package/min/ui-react/index.js.gz +0 -0
  183. package/min/ui-react/with-schemas/index.js +1 -1
  184. package/min/ui-react/with-schemas/index.js.gz +0 -0
  185. package/min/ui-react-dom/index.js +1 -1
  186. package/min/ui-react-dom/index.js.gz +0 -0
  187. package/min/ui-react-dom/with-schemas/index.js +1 -1
  188. package/min/ui-react-dom/with-schemas/index.js.gz +0 -0
  189. package/min/ui-react-inspector/index.js +1 -1
  190. package/min/ui-react-inspector/index.js.gz +0 -0
  191. package/min/ui-react-inspector/with-schemas/index.js +1 -1
  192. package/min/ui-react-inspector/with-schemas/index.js.gz +0 -0
  193. package/min/with-schemas/index.js +1 -1
  194. package/min/with-schemas/index.js.gz +0 -0
  195. package/omni/index.js +356 -154
  196. package/omni/with-schemas/index.js +356 -154
  197. package/package.json +7 -7
  198. package/persisters/index.js +5 -5
  199. package/persisters/persister-automerge/index.js +5 -5
  200. package/persisters/persister-automerge/with-schemas/index.js +5 -5
  201. package/persisters/persister-browser/index.js +5 -5
  202. package/persisters/persister-browser/with-schemas/index.js +5 -5
  203. package/persisters/persister-cr-sqlite-wasm/index.js +5 -5
  204. package/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +5 -5
  205. package/persisters/persister-durable-object-sql-storage/index.js +5 -5
  206. package/persisters/persister-durable-object-sql-storage/with-schemas/index.js +5 -5
  207. package/persisters/persister-durable-object-storage/index.js +5 -5
  208. package/persisters/persister-durable-object-storage/with-schemas/index.js +5 -5
  209. package/persisters/persister-electric-sql/index.js +5 -5
  210. package/persisters/persister-electric-sql/with-schemas/index.js +5 -5
  211. package/persisters/persister-expo-sqlite/index.js +5 -5
  212. package/persisters/persister-expo-sqlite/with-schemas/index.js +5 -5
  213. package/persisters/persister-file/index.js +5 -5
  214. package/persisters/persister-file/with-schemas/index.js +5 -5
  215. package/persisters/persister-indexed-db/index.js +5 -5
  216. package/persisters/persister-indexed-db/with-schemas/index.js +5 -5
  217. package/persisters/persister-libsql/index.js +5 -5
  218. package/persisters/persister-libsql/with-schemas/index.js +5 -5
  219. package/persisters/persister-partykit-client/index.js +5 -5
  220. package/persisters/persister-partykit-client/with-schemas/index.js +5 -5
  221. package/persisters/persister-pglite/index.js +5 -5
  222. package/persisters/persister-pglite/with-schemas/index.js +5 -5
  223. package/persisters/persister-postgres/index.js +5 -5
  224. package/persisters/persister-postgres/with-schemas/index.js +5 -5
  225. package/persisters/persister-powersync/index.js +5 -5
  226. package/persisters/persister-powersync/with-schemas/index.js +5 -5
  227. package/persisters/persister-react-native-mmkv/index.js +5 -5
  228. package/persisters/persister-react-native-mmkv/with-schemas/index.js +5 -5
  229. package/persisters/persister-react-native-sqlite/index.js +5 -5
  230. package/persisters/persister-react-native-sqlite/with-schemas/index.js +5 -5
  231. package/persisters/persister-remote/index.js +5 -5
  232. package/persisters/persister-remote/with-schemas/index.js +5 -5
  233. package/persisters/persister-sqlite-bun/index.js +5 -5
  234. package/persisters/persister-sqlite-bun/with-schemas/index.js +5 -5
  235. package/persisters/persister-sqlite-wasm/index.js +5 -5
  236. package/persisters/persister-sqlite-wasm/with-schemas/index.js +5 -5
  237. package/persisters/persister-sqlite3/index.js +5 -5
  238. package/persisters/persister-sqlite3/with-schemas/index.js +5 -5
  239. package/persisters/persister-yjs/index.js +5 -5
  240. package/persisters/persister-yjs/with-schemas/index.js +5 -5
  241. package/persisters/with-schemas/index.js +5 -5
  242. package/queries/index.js +11 -4
  243. package/queries/with-schemas/index.js +11 -4
  244. package/readme.md +3 -3
  245. package/releases.md +19 -3
  246. package/schematizers/index.js +9 -1
  247. package/schematizers/schematizer-arktype/index.js +16 -1
  248. package/schematizers/schematizer-arktype/with-schemas/index.js +16 -1
  249. package/schematizers/schematizer-effect/index.js +15 -2
  250. package/schematizers/schematizer-effect/with-schemas/index.js +15 -2
  251. package/schematizers/schematizer-typebox/index.js +9 -1
  252. package/schematizers/schematizer-typebox/with-schemas/index.js +9 -1
  253. package/schematizers/schematizer-valibot/index.js +17 -2
  254. package/schematizers/schematizer-valibot/with-schemas/index.js +17 -2
  255. package/schematizers/schematizer-yup/index.js +9 -1
  256. package/schematizers/schematizer-yup/with-schemas/index.js +9 -1
  257. package/schematizers/schematizer-zod/index.js +13 -2
  258. package/schematizers/schematizer-zod/with-schemas/index.js +13 -2
  259. package/schematizers/with-schemas/index.js +9 -1
  260. package/store/index.js +195 -104
  261. package/store/with-schemas/index.js +195 -104
  262. package/synchronizers/index.js +5 -5
  263. package/synchronizers/synchronizer-broadcast-channel/index.js +5 -5
  264. package/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +5 -5
  265. package/synchronizers/synchronizer-local/index.js +5 -5
  266. package/synchronizers/synchronizer-local/with-schemas/index.js +5 -5
  267. package/synchronizers/synchronizer-ws-client/index.js +5 -5
  268. package/synchronizers/synchronizer-ws-client/with-schemas/index.js +5 -5
  269. package/synchronizers/synchronizer-ws-server/index.js +5 -5
  270. package/synchronizers/synchronizer-ws-server/with-schemas/index.js +5 -5
  271. package/synchronizers/synchronizer-ws-server-durable-object/index.js +5 -5
  272. package/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +5 -5
  273. package/synchronizers/with-schemas/index.js +5 -5
  274. package/ui-react/index.js +6 -0
  275. package/ui-react/with-schemas/index.js +6 -0
  276. package/ui-react-dom/index.js +91 -6
  277. package/ui-react-dom/with-schemas/index.js +91 -6
  278. package/ui-react-inspector/index.js +248 -84
  279. package/ui-react-inspector/with-schemas/index.js +248 -84
  280. package/with-schemas/index.js +272 -143
package/omni/index.js CHANGED
@@ -15,6 +15,8 @@ const STRING = getTypeOf(EMPTY_STRING);
15
15
  const BOOLEAN = getTypeOf(true);
16
16
  const NUMBER = getTypeOf(0);
17
17
  const FUNCTION$1 = getTypeOf(getTypeOf);
18
+ const OBJECT = 'object';
19
+ const ARRAY = 'array';
18
20
  const TRUE = 'true';
19
21
  const TYPE = 'type';
20
22
  const DEFAULT = 'default';
@@ -68,6 +70,7 @@ const EXTRA = 'extra';
68
70
  const T = 't';
69
71
  const V = 'v';
70
72
  const UNDEFINED = '\uFFFC';
73
+ const JSON_PREFIX = '\uFFFD';
71
74
  const id = (key) => EMPTY_STRING + key;
72
75
  const strStartsWith = (str, prefix) => str.startsWith(prefix);
73
76
  const strEndsWith = (str, suffix) => str.endsWith(suffix);
@@ -619,18 +622,12 @@ const createCheckpoints = getCreateFunction(
619
622
  collForEach(cellsDelta2, (table, tableId) =>
620
623
  collForEach(table, (row, rowId) =>
621
624
  collForEach(row, (oldNew, cellId) =>
622
- store.setOrDelCell(
623
- tableId,
624
- rowId,
625
- cellId,
626
- oldNew[oldOrNew],
627
- true,
628
- ),
625
+ store._[5](tableId, rowId, cellId, oldNew[oldOrNew], true),
629
626
  ),
630
627
  ),
631
628
  );
632
629
  collForEach(valuesDelta2, (oldNew, valueId) =>
633
- store.setOrDelValue(valueId, oldNew[oldOrNew], true),
630
+ store._[6](valueId, oldNew[oldOrNew], true),
634
631
  );
635
632
  });
636
633
  listening = 1;
@@ -1233,6 +1230,12 @@ const getCellOrValueType = (cellOrValue) => {
1233
1230
  if (isNull(cellOrValue)) {
1234
1231
  return NULL;
1235
1232
  }
1233
+ if (isArray(cellOrValue)) {
1234
+ return ARRAY;
1235
+ }
1236
+ if (isObject(cellOrValue)) {
1237
+ return OBJECT;
1238
+ }
1236
1239
  const type = getTypeOf(cellOrValue);
1237
1240
  return isTypeStringOrBoolean(type) ||
1238
1241
  (type == NUMBER && isFiniteNumber(cellOrValue))
@@ -1241,17 +1244,33 @@ const getCellOrValueType = (cellOrValue) => {
1241
1244
  };
1242
1245
  const isCellOrValueOrUndefined = (cellOrValue) =>
1243
1246
  isUndefined(cellOrValue) || !isUndefined(getCellOrValueType(cellOrValue));
1244
- const getTypeCase = (type, stringCase, numberCase, booleanCase) =>
1247
+ const isJsonType = (type) => type == OBJECT || type == ARRAY;
1248
+ const encodeIfJson = (value) =>
1249
+ isObject(value) || isArray(value) ? JSON_PREFIX + jsonString(value) : value;
1250
+ const isEncodedJson = (value) => isString(value) && value[0] == JSON_PREFIX;
1251
+ const decodeIfJson = (raw, _id, encoded) =>
1252
+ !encoded && isEncodedJson(raw) ? jsonParse(slice(raw, 1)) : raw;
1253
+ const getTypeCase = (
1254
+ type,
1255
+ stringCase,
1256
+ numberCase,
1257
+ booleanCase,
1258
+ objectCase,
1259
+ arrayCase,
1260
+ ) =>
1245
1261
  type == STRING
1246
1262
  ? stringCase
1247
1263
  : type == NUMBER
1248
1264
  ? numberCase
1249
1265
  : type == BOOLEAN
1250
1266
  ? booleanCase
1251
- : null;
1267
+ : type == OBJECT
1268
+ ? objectCase
1269
+ : type == ARRAY
1270
+ ? arrayCase
1271
+ : null;
1252
1272
 
1253
1273
  const stampClone = ([value, hlc]) => stampNew(value, hlc);
1254
- const stampCloneWithHash = ([value, hlc, hash]) => [value, hlc, hash];
1255
1274
  const stampNew = (value, hlc) => (hlc ? [value, hlc] : [value]);
1256
1275
  const stampNewWithHash = (value, hlc, hash) => [value, hlc, hash];
1257
1276
  const getStampHash = (stamp) => stamp[2];
@@ -1268,10 +1287,11 @@ const stampUpdate = (stamp, hlc, hash) => {
1268
1287
  };
1269
1288
  const stampNewObj = (hlc = EMPTY_STRING) => stampNew(objNew(), hlc);
1270
1289
  const stampNewMap = (hlc = EMPTY_STRING) => [mapNew(), hlc, 0];
1271
- const stampMapToObjWithHash = (
1272
- [map, hlc, hash],
1273
- mapper = stampCloneWithHash,
1274
- ) => [mapToObj(map, mapper), hlc, hash];
1290
+ const stampMapToObjWithHash = ([map, hlc, hash], mapper) => [
1291
+ mapToObj(map, mapper),
1292
+ hlc,
1293
+ hash,
1294
+ ];
1275
1295
  const stampMapToObjWithoutHash = ([map, hlc], mapper = stampClone) =>
1276
1296
  stampNew(mapToObj(map, mapper), hlc);
1277
1297
  const stampValidate = (stamp, validateThing) =>
@@ -1378,15 +1398,19 @@ const createStore = () => {
1378
1398
  return false;
1379
1399
  }
1380
1400
  const type = schema[TYPE];
1381
- if (!isTypeStringOrBoolean(type) && type != NUMBER) {
1401
+ if (!isTypeStringOrBoolean(type) && type != NUMBER && !isJsonType(type)) {
1382
1402
  return false;
1383
1403
  }
1384
1404
  const defaultValue = schema[DEFAULT];
1385
1405
  if (isNull(defaultValue) && !schema[ALLOW_NULL]) {
1386
1406
  return false;
1387
1407
  }
1388
- if (!isNull(defaultValue) && getCellOrValueType(defaultValue) != type) {
1389
- objDel(schema, DEFAULT);
1408
+ if (!isNull(defaultValue)) {
1409
+ if (getCellOrValueType(defaultValue) != type) {
1410
+ objDel(schema, DEFAULT);
1411
+ } else {
1412
+ schema[DEFAULT] = encodeIfJson(defaultValue);
1413
+ }
1390
1414
  }
1391
1415
  return true;
1392
1416
  };
@@ -1426,20 +1450,22 @@ const createStore = () => {
1426
1450
  ? cellSchema[ALLOW_NULL]
1427
1451
  ? cell
1428
1452
  : cellInvalid(tableId, rowId, cellId, cell, cellSchema[DEFAULT])
1429
- : getCellOrValueType(cell) == cellSchema[TYPE]
1430
- ? cell
1431
- : cellInvalid(
1432
- tableId,
1433
- rowId,
1434
- cellId,
1435
- cell,
1436
- cellSchema[DEFAULT],
1437
- ),
1453
+ : getCellOrValueType(cell) === cellSchema[TYPE]
1454
+ ? encodeIfJson(cell)
1455
+ : isJsonType(cellSchema[TYPE]) && isEncodedJson(cell)
1456
+ ? cell
1457
+ : cellInvalid(
1458
+ tableId,
1459
+ rowId,
1460
+ cellId,
1461
+ cell,
1462
+ cellSchema[DEFAULT],
1463
+ ),
1438
1464
  () => cellInvalid(tableId, rowId, cellId, cell),
1439
1465
  )
1440
1466
  : isUndefined(getCellOrValueType(cell))
1441
1467
  ? cellInvalid(tableId, rowId, cellId, cell)
1442
- : cell;
1468
+ : encodeIfJson(cell);
1443
1469
  const validateValues = (values, skipDefaults) =>
1444
1470
  objValidate(
1445
1471
  skipDefaults ? values : addDefaultsToValues(values),
@@ -1463,14 +1489,16 @@ const createStore = () => {
1463
1489
  ? valueSchema[ALLOW_NULL]
1464
1490
  ? value
1465
1491
  : valueInvalid(valueId, value, valueSchema[DEFAULT])
1466
- : getCellOrValueType(value) == valueSchema[TYPE]
1467
- ? value
1468
- : valueInvalid(valueId, value, valueSchema[DEFAULT]),
1492
+ : getCellOrValueType(value) === valueSchema[TYPE]
1493
+ ? encodeIfJson(value)
1494
+ : isJsonType(valueSchema[TYPE]) && isEncodedJson(value)
1495
+ ? value
1496
+ : valueInvalid(valueId, value, valueSchema[DEFAULT]),
1469
1497
  () => valueInvalid(valueId, value),
1470
1498
  )
1471
1499
  : isUndefined(getCellOrValueType(value))
1472
1500
  ? valueInvalid(valueId, value)
1473
- : value;
1501
+ : encodeIfJson(value);
1474
1502
  const addDefaultsToRow = (row, tableId, rowId) => {
1475
1503
  ifNotUndefined(
1476
1504
  mapGet(tablesSchemaRowCache, tableId),
@@ -1893,13 +1921,21 @@ const createStore = () => {
1893
1921
  const getCellChange = (tableId, rowId, cellId) =>
1894
1922
  ifNotUndefined(
1895
1923
  mapGet(mapGet(mapGet(changedCells, tableId), rowId), cellId),
1896
- ([oldCell, newCell]) => [true, oldCell, newCell],
1924
+ ([oldCell, newCell]) => [
1925
+ true,
1926
+ decodeIfJson(oldCell),
1927
+ decodeIfJson(newCell),
1928
+ ],
1897
1929
  () => [false, ...pairNew(getCell(tableId, rowId, cellId))],
1898
1930
  );
1899
1931
  const getValueChange = (valueId) =>
1900
1932
  ifNotUndefined(
1901
1933
  mapGet(changedValues, valueId),
1902
- ([oldValue, newValue]) => [true, oldValue, newValue],
1934
+ ([oldValue, newValue]) => [
1935
+ true,
1936
+ decodeIfJson(oldValue),
1937
+ decodeIfJson(newValue),
1938
+ ],
1903
1939
  () => [false, ...pairNew(getValue(valueId))],
1904
1940
  );
1905
1941
  const callInvalidCellListeners = (mutator) =>
@@ -1944,6 +1980,10 @@ const createStore = () => {
1944
1980
  return 1;
1945
1981
  }
1946
1982
  };
1983
+ const clonedChangedCells = (changedCells2) =>
1984
+ mapClone(changedCells2, (map) =>
1985
+ mapClone(map, (map2) => mapClone(map2, pairClone)),
1986
+ );
1947
1987
  const callTabularListenersForChanges = (mutator) => {
1948
1988
  const hasHasTablesListeners = !collIsEmpty(hasTablesListeners[mutator]);
1949
1989
  const hasSortedRowIdListeners = !collIsEmpty(
@@ -1975,9 +2015,7 @@ const createStore = () => {
1975
2015
  mapClone(changedRowCount),
1976
2016
  mapClone2(changedRowIds),
1977
2017
  mapClone3(changedCellIds),
1978
- mapClone(changedCells, (map) =>
1979
- mapClone(map, (map2) => mapClone(map2, pairClone)),
1980
- ),
2018
+ clonedChangedCells(changedCells),
1981
2019
  ]
1982
2020
  : [
1983
2021
  changedTableIds,
@@ -2073,8 +2111,8 @@ const createStore = () => {
2073
2111
  callListeners(
2074
2112
  cellListeners[mutator],
2075
2113
  [tableId, rowId, cellId],
2076
- newCell,
2077
- oldCell,
2114
+ decodeIfJson(newCell),
2115
+ decodeIfJson(oldCell),
2078
2116
  getCellChange,
2079
2117
  );
2080
2118
  tablesChanged = tableChanged = rowChanged = 1;
@@ -2130,8 +2168,8 @@ const createStore = () => {
2130
2168
  callListeners(
2131
2169
  valueListeners[mutator],
2132
2170
  [valueId],
2133
- newValue,
2134
- oldValue,
2171
+ decodeIfJson(newValue),
2172
+ decodeIfJson(oldValue),
2135
2173
  getValueChange,
2136
2174
  );
2137
2175
  valuesChanged = 1;
@@ -2168,10 +2206,42 @@ const createStore = () => {
2168
2206
  [getTableIds],
2169
2207
  );
2170
2208
  };
2209
+ const getTransactionChangesImpl = (encoded = false) => [
2210
+ mapToObj(
2211
+ changedCells,
2212
+ (table, tableId) =>
2213
+ mapGet(changedTableIds, tableId) === -1
2214
+ ? void 0
2215
+ : mapToObj(
2216
+ table,
2217
+ (row, rowId) =>
2218
+ mapGet(mapGet(changedRowIds, tableId), rowId) === -1
2219
+ ? void 0
2220
+ : mapToObj(
2221
+ row,
2222
+ ([, newCell]) =>
2223
+ decodeIfJson(newCell, EMPTY_STRING, encoded),
2224
+ (changedCell) => pairIsEqual(changedCell),
2225
+ ),
2226
+ collIsEmpty,
2227
+ objIsEmpty,
2228
+ ),
2229
+ collIsEmpty,
2230
+ objIsEmpty,
2231
+ ),
2232
+ mapToObj(
2233
+ changedValues,
2234
+ ([, newValue]) => decodeIfJson(newValue, EMPTY_STRING, encoded),
2235
+ (changedValue) => pairIsEqual(changedValue),
2236
+ ),
2237
+ 1,
2238
+ ];
2171
2239
  const getContent = () => [getTables(), getValues()];
2172
- const getTables = () => mapToObj3(tablesMap);
2240
+ const getEncodedContent = () => [mapToObj3(tablesMap), mapToObj(valuesMap)];
2241
+ const getTables = () => mapToObj3(tablesMap, decodeIfJson);
2173
2242
  const getTableIds = () => mapKeys(tablesMap);
2174
- const getTable = (tableId) => mapToObj2(mapGet(tablesMap, id(tableId)));
2243
+ const getTable = (tableId) =>
2244
+ mapToObj2(mapGet(tablesMap, id(tableId)), decodeIfJson);
2175
2245
  const getTableCellIds = (tableId) =>
2176
2246
  mapKeys(mapGet(tableCellIds, id(tableId)));
2177
2247
  const getRowCount = (tableId) => collSize(mapGet(tablesMap, id(tableId)));
@@ -2207,14 +2277,16 @@ const createStore = () => {
2207
2277
  ([, rowId]) => rowId,
2208
2278
  );
2209
2279
  const getRow = (tableId, rowId) =>
2210
- mapToObj(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)));
2280
+ mapToObj(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)), decodeIfJson);
2211
2281
  const getCellIds = (tableId, rowId) =>
2212
2282
  mapKeys(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)));
2213
2283
  const getCell = (tableId, rowId, cellId) =>
2214
- mapGet(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)), id(cellId));
2215
- const getValues = () => mapToObj(valuesMap);
2284
+ decodeIfJson(
2285
+ mapGet(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)), id(cellId)),
2286
+ );
2287
+ const getValues = () => mapToObj(valuesMap, decodeIfJson);
2216
2288
  const getValueIds = () => mapKeys(valuesMap);
2217
- const getValue = (valueId) => mapGet(valuesMap, id(valueId));
2289
+ const getValue = (valueId) => decodeIfJson(mapGet(valuesMap, id(valueId)));
2218
2290
  const hasTables = () => !collIsEmpty(tablesMap);
2219
2291
  const hasTable = (tableId) => collHas(tablesMap, id(tableId));
2220
2292
  const hasTableCell = (tableId, cellId) =>
@@ -2501,35 +2573,8 @@ const createStore = () => {
2501
2573
  }
2502
2574
  return store;
2503
2575
  };
2504
- const getTransactionChanges = () => [
2505
- mapToObj(
2506
- changedCells,
2507
- (table, tableId) =>
2508
- mapGet(changedTableIds, tableId) === -1
2509
- ? void 0
2510
- : mapToObj(
2511
- table,
2512
- (row, rowId) =>
2513
- mapGet(mapGet(changedRowIds, tableId), rowId) === -1
2514
- ? void 0
2515
- : mapToObj(
2516
- row,
2517
- ([, newCell]) => newCell,
2518
- (changedCell) => pairIsEqual(changedCell),
2519
- ),
2520
- collIsEmpty,
2521
- objIsEmpty,
2522
- ),
2523
- collIsEmpty,
2524
- objIsEmpty,
2525
- ),
2526
- mapToObj(
2527
- changedValues,
2528
- ([, newValue]) => newValue,
2529
- (changedValue) => pairIsEqual(changedValue),
2530
- ),
2531
- 1,
2532
- ];
2576
+ const getTransactionChanges = () => getTransactionChangesImpl();
2577
+ const getEncodedTransactionChanges = () => getTransactionChangesImpl(true);
2533
2578
  const getTransactionLog = () => [
2534
2579
  !collIsEmpty(changedCells),
2535
2580
  !collIsEmpty(changedValues),
@@ -2542,6 +2587,37 @@ const createStore = () => {
2542
2587
  mapToObj3(changedCellIds),
2543
2588
  mapToObj(changedValueIds),
2544
2589
  ];
2590
+ const doDidSetRows = () => {
2591
+ if (middleware[14]) {
2592
+ const changedCells2 = clonedChangedCells(changedCells);
2593
+ collForEach(changedCells2, (rows, tableId) =>
2594
+ collForEach(rows, (cells, rowId) => {
2595
+ if (
2596
+ !arrayEvery(
2597
+ collValues(cells),
2598
+ ([oldCell, newCell]) => oldCell === newCell,
2599
+ )
2600
+ ) {
2601
+ const newRow = getRow(tableId, rowId);
2602
+ const oldRow = objMerge(newRow);
2603
+ collForEach(cells, ([oldCell], cellId) =>
2604
+ isUndefined(oldCell)
2605
+ ? objDel(oldRow, cellId)
2606
+ : (oldRow[cellId] = oldCell),
2607
+ );
2608
+ const didSetRow = middleware[14](tableId, rowId, oldRow, newRow);
2609
+ if (!objIsEqual(didSetRow, newRow)) {
2610
+ const setOrDelRow = objMap(newRow, () => void 0);
2611
+ objMap(didSetRow, (cell, cellId) => (setOrDelRow[cellId] = cell));
2612
+ objMap(setOrDelRow, (cell, cellId) =>
2613
+ setOrDelCell(tableId, rowId, cellId, cell, true),
2614
+ );
2615
+ }
2616
+ }
2617
+ }),
2618
+ );
2619
+ }
2620
+ };
2545
2621
  const finishTransaction = (doRollback) => {
2546
2622
  if (transactions > 0) {
2547
2623
  transactions--;
@@ -2551,6 +2627,7 @@ const createStore = () => {
2551
2627
  callInvalidCellListeners(1);
2552
2628
  if (!collIsEmpty(changedCells)) {
2553
2629
  callTabularListenersForChanges(1);
2630
+ doDidSetRows();
2554
2631
  }
2555
2632
  callInvalidValueListeners(1);
2556
2633
  if (!collIsEmpty(changedValues)) {
@@ -2611,7 +2688,9 @@ const createStore = () => {
2611
2688
  tableCallback(tableId, (rowCallback) =>
2612
2689
  collForEach(tableMap, (rowMap, rowId) =>
2613
2690
  rowCallback(rowId, (cellCallback) =>
2614
- mapForEach(rowMap, cellCallback),
2691
+ mapForEach(rowMap, (cellId, cell) =>
2692
+ cellCallback(cellId, decodeIfJson(cell)),
2693
+ ),
2615
2694
  ),
2616
2695
  ),
2617
2696
  ),
@@ -2620,11 +2699,21 @@ const createStore = () => {
2620
2699
  mapForEach(mapGet(tableCellIds, id(tableId)), tableCellCallback);
2621
2700
  const forEachRow = (tableId, rowCallback) =>
2622
2701
  collForEach(mapGet(tablesMap, id(tableId)), (rowMap, rowId) =>
2623
- rowCallback(rowId, (cellCallback) => mapForEach(rowMap, cellCallback)),
2702
+ rowCallback(rowId, (cellCallback) =>
2703
+ mapForEach(rowMap, (cellId, cell) =>
2704
+ cellCallback(cellId, decodeIfJson(cell)),
2705
+ ),
2706
+ ),
2624
2707
  );
2625
2708
  const forEachCell = (tableId, rowId, cellCallback) =>
2626
- mapForEach(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)), cellCallback);
2627
- const forEachValue = (valueCallback) => mapForEach(valuesMap, valueCallback);
2709
+ mapForEach(
2710
+ mapGet(mapGet(tablesMap, id(tableId)), id(rowId)),
2711
+ (cellId, cell) => cellCallback(cellId, decodeIfJson(cell)),
2712
+ );
2713
+ const forEachValue = (valueCallback) =>
2714
+ mapForEach(valuesMap, (valueId, value) =>
2715
+ valueCallback(valueId, decodeIfJson(value)),
2716
+ );
2628
2717
  const addSortedRowIdsListener = (
2629
2718
  tableIdOrArgs,
2630
2719
  cellIdOrListener,
@@ -2709,6 +2798,7 @@ const createStore = () => {
2709
2798
  willDelValues,
2710
2799
  willDelValue,
2711
2800
  willApplyChanges,
2801
+ didSetRow,
2712
2802
  ) =>
2713
2803
  (middleware = [
2714
2804
  willSetContent,
@@ -2725,6 +2815,7 @@ const createStore = () => {
2725
2815
  willDelValues,
2726
2816
  willDelValue,
2727
2817
  willApplyChanges,
2818
+ didSetRow,
2728
2819
  ]);
2729
2820
  const setInternalListeners = (
2730
2821
  preStartTransaction,
@@ -2814,14 +2905,17 @@ const createStore = () => {
2814
2905
  delListener,
2815
2906
  getListenerStats,
2816
2907
  isMergeable: () => false,
2817
- // only used internally by other modules
2818
- createStore,
2819
- addListener,
2820
- callListeners,
2821
- setInternalListeners,
2822
- setMiddleware,
2823
- setOrDelCell,
2824
- setOrDelValue,
2908
+ _: [
2909
+ createStore,
2910
+ addListener,
2911
+ callListeners,
2912
+ setInternalListeners,
2913
+ setMiddleware,
2914
+ setOrDelCell,
2915
+ setOrDelValue,
2916
+ getEncodedContent,
2917
+ getEncodedTransactionChanges,
2918
+ ],
2825
2919
  };
2826
2920
  objMap(
2827
2921
  {
@@ -3136,14 +3230,78 @@ const createMergeableStore = (uniqueId, getNow) => {
3136
3230
  ]);
3137
3231
  }
3138
3232
  };
3139
- const getMergeableContent = () => [
3233
+ const getMergeableContentImpl = (encoded = false) => [
3140
3234
  stampMapToObjWithHash(contentStampMap[0], (tableStampMap) =>
3141
3235
  stampMapToObjWithHash(tableStampMap, (rowStampMap) =>
3142
- stampMapToObjWithHash(rowStampMap),
3236
+ stampMapToObjWithHash(rowStampMap, ([cell, hlc, hash]) => [
3237
+ decodeIfJson(cell, EMPTY_STRING, encoded),
3238
+ hlc,
3239
+ hash,
3240
+ ]),
3143
3241
  ),
3144
3242
  ),
3145
- stampMapToObjWithHash(contentStampMap[1]),
3243
+ stampMapToObjWithHash(contentStampMap[1], ([value, hlc, hash]) => [
3244
+ decodeIfJson(value, EMPTY_STRING, encoded),
3245
+ hlc,
3246
+ hash,
3247
+ ]),
3146
3248
  ];
3249
+ const getTransactionMergeableChangesImpl = (withHashes, encoded = false) => {
3250
+ const [
3251
+ [tableStampMaps, tablesHlc, tablesHash],
3252
+ [valueStampMaps, valuesHlc, valuesHash],
3253
+ ] = contentStampMap;
3254
+ const newStamp = withHashes ? stampNewWithHash : stampNew;
3255
+ const tablesObj = {};
3256
+ collForEach(touchedCells, (touchedTable, tableId) =>
3257
+ ifNotUndefined(
3258
+ mapGet(tableStampMaps, tableId),
3259
+ ([rowStampMaps, tableHlc, tableHash]) => {
3260
+ const tableObj = {};
3261
+ collForEach(touchedTable, (touchedRow, rowId) =>
3262
+ ifNotUndefined(
3263
+ mapGet(rowStampMaps, rowId),
3264
+ ([cellStampMaps, rowHlc, rowHash]) => {
3265
+ const rowObj = {};
3266
+ collForEach(touchedRow, (cellId) => {
3267
+ ifNotUndefined(
3268
+ mapGet(cellStampMaps, cellId),
3269
+ ([cell, time, hash]) =>
3270
+ (rowObj[cellId] = newStamp(
3271
+ encoded ? cell : decodeIfJson(cell),
3272
+ time,
3273
+ hash,
3274
+ )),
3275
+ );
3276
+ });
3277
+ tableObj[rowId] = newStamp(rowObj, rowHlc, rowHash);
3278
+ },
3279
+ ),
3280
+ );
3281
+ tablesObj[tableId] = newStamp(tableObj, tableHlc, tableHash);
3282
+ },
3283
+ ),
3284
+ );
3285
+ const valuesObj = {};
3286
+ collForEach(touchedValues, (valueId) =>
3287
+ ifNotUndefined(
3288
+ mapGet(valueStampMaps, valueId),
3289
+ ([value, time, hash]) =>
3290
+ (valuesObj[valueId] = newStamp(
3291
+ encoded ? value : decodeIfJson(value),
3292
+ time,
3293
+ hash,
3294
+ )),
3295
+ ),
3296
+ );
3297
+ return [
3298
+ newStamp(tablesObj, tablesHlc, tablesHash),
3299
+ newStamp(valuesObj, valuesHlc, valuesHash),
3300
+ 1,
3301
+ ];
3302
+ };
3303
+ const getMergeableContent = () => getMergeableContentImpl();
3304
+ const getEncodedMergeableContent = () => getMergeableContentImpl(true);
3147
3305
  const getMergeableContentHashes = () => [
3148
3306
  contentStampMap[0][2],
3149
3307
  contentStampMap[1][2],
@@ -3283,52 +3441,10 @@ const createMergeableStore = (uniqueId, getNow) => {
3283
3441
  });
3284
3442
  return mergeableStore;
3285
3443
  };
3286
- const getTransactionMergeableChanges = (withHashes = false) => {
3287
- const [
3288
- [tableStampMaps, tablesHlc, tablesHash],
3289
- [valueStampMaps, valuesHlc, valuesHash],
3290
- ] = contentStampMap;
3291
- const newStamp = withHashes ? stampNewWithHash : stampNew;
3292
- const tablesObj = {};
3293
- collForEach(touchedCells, (touchedTable, tableId) =>
3294
- ifNotUndefined(
3295
- mapGet(tableStampMaps, tableId),
3296
- ([rowStampMaps, tableHlc, tableHash]) => {
3297
- const tableObj = {};
3298
- collForEach(touchedTable, (touchedRow, rowId) =>
3299
- ifNotUndefined(
3300
- mapGet(rowStampMaps, rowId),
3301
- ([cellStampMaps, rowHlc, rowHash]) => {
3302
- const rowObj = {};
3303
- collForEach(touchedRow, (cellId) => {
3304
- ifNotUndefined(
3305
- mapGet(cellStampMaps, cellId),
3306
- ([cell, time, hash]) =>
3307
- (rowObj[cellId] = newStamp(cell, time, hash)),
3308
- );
3309
- });
3310
- tableObj[rowId] = newStamp(rowObj, rowHlc, rowHash);
3311
- },
3312
- ),
3313
- );
3314
- tablesObj[tableId] = newStamp(tableObj, tableHlc, tableHash);
3315
- },
3316
- ),
3317
- );
3318
- const valuesObj = {};
3319
- collForEach(touchedValues, (valueId) =>
3320
- ifNotUndefined(
3321
- mapGet(valueStampMaps, valueId),
3322
- ([value, time, hash]) =>
3323
- (valuesObj[valueId] = newStamp(value, time, hash)),
3324
- ),
3325
- );
3326
- return [
3327
- newStamp(tablesObj, tablesHlc, tablesHash),
3328
- newStamp(valuesObj, valuesHlc, valuesHash),
3329
- 1,
3330
- ];
3331
- };
3444
+ const getTransactionMergeableChanges = (withHashes = false) =>
3445
+ getTransactionMergeableChangesImpl(withHashes);
3446
+ const getEncodedTransactionMergeableChanges = (withHashes) =>
3447
+ getTransactionMergeableChangesImpl(withHashes, true);
3332
3448
  const applyMergeableChanges = (mergeableChanges) =>
3333
3449
  disableListeningToRawStoreChanges(() =>
3334
3450
  store.applyChanges(mergeContentOrChanges(mergeableChanges)),
@@ -3360,10 +3476,13 @@ const createMergeableStore = (uniqueId, getNow) => {
3360
3476
  getTransactionMergeableChanges,
3361
3477
  applyMergeableChanges,
3362
3478
  merge,
3363
- // only used internally by other modules
3364
- hadMutated,
3479
+ __: [
3480
+ hadMutated,
3481
+ getEncodedMergeableContent,
3482
+ getEncodedTransactionMergeableChanges,
3483
+ ],
3365
3484
  };
3366
- store.setInternalListeners(
3485
+ store._[3](
3367
3486
  preStartTransaction,
3368
3487
  preFinishTransaction,
3369
3488
  postFinishTransaction,
@@ -3602,6 +3721,7 @@ const createMiddleware = getCreateFunction((store) => {
3602
3721
  const willDelValuesCallbacks = [];
3603
3722
  const willDelValueCallbacks = [];
3604
3723
  const willApplyChangesCallbacks = [];
3724
+ const didSetRowCallbacksMap = mapNew();
3605
3725
  const willSetContent = (content) =>
3606
3726
  reduceCallbacks(willSetContentCallbacks, content);
3607
3727
  const willSetTables = (tables) =>
@@ -3628,6 +3748,17 @@ const createMiddleware = getCreateFunction((store) => {
3628
3748
  everyCallback(willDelValueCallbacks, valueId);
3629
3749
  const willApplyChanges = (changes) =>
3630
3750
  reduceCallbacks(willApplyChangesCallbacks, changes);
3751
+ const didSetRow = (tableId, rowId, oldRow, newRow) =>
3752
+ ifNotUndefined(
3753
+ mapGet(didSetRowCallbacksMap, tableId),
3754
+ (callbacks) =>
3755
+ arrayReduce(
3756
+ callbacks,
3757
+ (current, callback) => callback(tableId, rowId, oldRow, current),
3758
+ newRow,
3759
+ ),
3760
+ () => newRow,
3761
+ );
3631
3762
  const getStore = () => store;
3632
3763
  const addWillSetContentCallback = addCallback(willSetContentCallbacks);
3633
3764
  const addWillSetTablesCallback = addCallback(willSetTablesCallbacks);
@@ -3643,6 +3774,13 @@ const createMiddleware = getCreateFunction((store) => {
3643
3774
  const addWillDelValuesCallback = addCallback(willDelValuesCallbacks);
3644
3775
  const addWillDelValueCallback = addCallback(willDelValueCallbacks);
3645
3776
  const addWillApplyChangesCallback = addCallback(willApplyChangesCallbacks);
3777
+ const addDidSetRowCallback = (tableId, callback) =>
3778
+ fluent(() =>
3779
+ arrayPush(
3780
+ mapEnsure(didSetRowCallbacksMap, tableId, () => []),
3781
+ callback,
3782
+ ),
3783
+ );
3646
3784
  const destroy = () => {};
3647
3785
  const middleware = objFreeze({
3648
3786
  getStore,
@@ -3660,9 +3798,10 @@ const createMiddleware = getCreateFunction((store) => {
3660
3798
  addWillDelValuesCallback,
3661
3799
  addWillDelValueCallback,
3662
3800
  addWillApplyChangesCallback,
3801
+ addDidSetRowCallback,
3663
3802
  destroy,
3664
3803
  });
3665
- store.setMiddleware(
3804
+ store._[4](
3666
3805
  willSetContent,
3667
3806
  willSetTables,
3668
3807
  willSetTable,
@@ -3677,6 +3816,7 @@ const createMiddleware = getCreateFunction((store) => {
3677
3816
  willDelValues,
3678
3817
  willDelValue,
3679
3818
  willApplyChanges,
3819
+ didSetRow,
3680
3820
  );
3681
3821
  return middleware;
3682
3822
  });
@@ -3701,8 +3841,8 @@ const getStoreFunctions = (
3701
3841
  persist != 1 /* StoreOnly */ && store.isMergeable()
3702
3842
  ? [
3703
3843
  1,
3704
- store.getMergeableContent,
3705
- () => store.getTransactionMergeableChanges(!isSynchronizer),
3844
+ store.__[1],
3845
+ () => store.__[2](!isSynchronizer),
3706
3846
  ([[changedTables], [changedValues]]) =>
3707
3847
  !objIsEmpty(changedTables) || !objIsEmpty(changedValues),
3708
3848
  store.setDefaultContent,
@@ -3710,8 +3850,8 @@ const getStoreFunctions = (
3710
3850
  : persist != 2 /* MergeableStoreOnly */
3711
3851
  ? [
3712
3852
  0,
3713
- store.getContent,
3714
- store.getTransactionChanges,
3853
+ store._[7],
3854
+ store._[8],
3715
3855
  ([changedTables, changedValues]) =>
3716
3856
  !objIsEmpty(changedTables) || !objIsEmpty(changedValues),
3717
3857
  store.setContent,
@@ -3776,7 +3916,7 @@ const createCustomPersister = (
3776
3916
  : store.setContent)(contentOrChanges);
3777
3917
  };
3778
3918
  const saveAfterMutated = async () => {
3779
- if (isAutoSaving() && store.hadMutated?.()) {
3919
+ if (isAutoSaving() && store.__?.[0]?.()) {
3780
3920
  await save();
3781
3921
  }
3782
3922
  };
@@ -6189,15 +6329,14 @@ const createYjsPersister = (
6189
6329
  };
6190
6330
 
6191
6331
  const createQueries = getCreateFunction((store) => {
6192
- const createStore = store.createStore;
6332
+ const createStore = store._[0];
6193
6333
  const preStore = createStore();
6194
6334
  const resultStore = createStore();
6195
6335
  const preStoreListenerIds = mapNew();
6196
6336
  const paramValuesListeners = mapNew();
6197
6337
  const paramValueListeners = mapNew();
6198
6338
  const {
6199
- addListener,
6200
- callListeners,
6339
+ _: [, addListener, callListeners],
6201
6340
  delListener: delListenerImpl,
6202
6341
  } = resultStore;
6203
6342
  const [
@@ -6516,7 +6655,7 @@ const createQueries = getCreateFunction((store) => {
6516
6655
  selectJoinWhereStore.transaction(() =>
6517
6656
  arrayEvery(wheres, (where2) => where2(getTableCell))
6518
6657
  ? mapForEach(selects, (asCellId, tableCellGetter) =>
6519
- selectJoinWhereStore.setOrDelCell(
6658
+ selectJoinWhereStore._[5](
6520
6659
  queryId,
6521
6660
  rootRowId,
6522
6661
  asCellId,
@@ -7837,6 +7976,10 @@ const IS_EQUALS = [
7837
7976
  (paramValues1, paramValues2) =>
7838
7977
  objIsEqual(paramValues1, paramValues2, arrayOrValueEqual),
7839
7978
  arrayOrValueEqual,
7979
+ (thing1, thing2) =>
7980
+ thing1 === thing2 ||
7981
+ ((isObject(thing1) || isArray(thing1)) &&
7982
+ jsonString(thing1) === jsonString(thing2)),
7840
7983
  ];
7841
7984
  const isEqual = (thing1, thing2) => thing1 === thing2;
7842
7985
  const useCreate = (store, create, createDeps = EMPTY_ARRAY) => {
@@ -9578,12 +9721,20 @@ const EditableThing = ({
9578
9721
  const [stringThing, setStringThing] = useState();
9579
9722
  const [numberThing, setNumberThing] = useState();
9580
9723
  const [booleanThing, setBooleanThing] = useState();
9724
+ const [objectThingJson, setObjectThingJson] = useState(EMPTY_STRING);
9725
+ const [arrayThingJson, setArrayThingJson] = useState(EMPTY_STRING);
9581
9726
  if (currentThing !== thing) {
9582
9727
  setThingType(getCellOrValueType(thing));
9583
9728
  setCurrentThing(thing);
9584
- setStringThing(String(thing));
9585
- setNumberThing(Number(thing) || 0);
9586
- setBooleanThing(Boolean(thing));
9729
+ if (isObject(thing)) {
9730
+ setObjectThingJson(jsonString(thing));
9731
+ } else if (isArray(thing)) {
9732
+ setArrayThingJson(jsonString(thing));
9733
+ } else {
9734
+ setStringThing(String(thing));
9735
+ setNumberThing(Number(thing) || 0);
9736
+ setBooleanThing(Boolean(thing));
9737
+ }
9587
9738
  }
9588
9739
  const handleThingChange = useCallback(
9589
9740
  (thing2, setTypedThing) => {
@@ -9595,12 +9746,21 @@ const EditableThing = ({
9595
9746
  );
9596
9747
  const handleTypeChange = useCallback(() => {
9597
9748
  if (!hasSchema?.()) {
9598
- const nextType = getTypeCase(thingType, NUMBER, BOOLEAN, STRING);
9749
+ const nextType = getTypeCase(
9750
+ thingType,
9751
+ NUMBER,
9752
+ BOOLEAN,
9753
+ OBJECT,
9754
+ ARRAY,
9755
+ STRING,
9756
+ );
9599
9757
  const thing2 = getTypeCase(
9600
9758
  nextType,
9601
9759
  stringThing,
9602
9760
  numberThing,
9603
9761
  booleanThing,
9762
+ objectThingJson ? jsonParse(objectThingJson) : {},
9763
+ arrayThingJson ? jsonParse(arrayThingJson) : [],
9604
9764
  );
9605
9765
  setThingType(nextType);
9606
9766
  setCurrentThing(thing2);
@@ -9612,6 +9772,8 @@ const EditableThing = ({
9612
9772
  stringThing,
9613
9773
  numberThing,
9614
9774
  booleanThing,
9775
+ objectThingJson,
9776
+ arrayThingJson,
9615
9777
  thingType,
9616
9778
  ]);
9617
9779
  const widget = getTypeCase(
@@ -9663,6 +9825,46 @@ const EditableThing = ({
9663
9825
  },
9664
9826
  thingType,
9665
9827
  ),
9828
+ /* @__PURE__ */ jsx(
9829
+ 'textarea',
9830
+ {
9831
+ value: objectThingJson,
9832
+ onChange: useCallback(
9833
+ (event) => {
9834
+ const str = event[CURRENT_TARGET][_VALUE];
9835
+ setObjectThingJson(str);
9836
+ try {
9837
+ const parsed = jsonParse(str);
9838
+ if (isObject(parsed)) {
9839
+ onThingChange(parsed);
9840
+ }
9841
+ } catch {}
9842
+ },
9843
+ [onThingChange],
9844
+ ),
9845
+ },
9846
+ thingType,
9847
+ ),
9848
+ /* @__PURE__ */ jsx(
9849
+ 'textarea',
9850
+ {
9851
+ value: arrayThingJson,
9852
+ onChange: useCallback(
9853
+ (event) => {
9854
+ const str = event[CURRENT_TARGET][_VALUE];
9855
+ setArrayThingJson(str);
9856
+ try {
9857
+ const parsed = jsonParse(str);
9858
+ if (isArray(parsed)) {
9859
+ onThingChange(parsed);
9860
+ }
9861
+ } catch {}
9862
+ },
9863
+ [onThingChange],
9864
+ ),
9865
+ },
9866
+ thingType,
9867
+ ),
9666
9868
  );
9667
9869
  return /* @__PURE__ */ jsxs('div', {
9668
9870
  className,