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
@@ -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);
@@ -118,6 +121,14 @@ const structuredClone = GLOBAL.structuredClone;
118
121
  const errorNew = (message) => {
119
122
  throw new Error(message);
120
123
  };
124
+ const tryReturn = (tryF, catchReturn) => {
125
+ try {
126
+ return tryF();
127
+ } catch {
128
+ /* istanbul ignore next */
129
+ return catchReturn;
130
+ }
131
+ };
121
132
  const tryCatch = async (action, then1, then2) => {
122
133
  try {
123
134
  return await action();
@@ -619,18 +630,12 @@ const createCheckpoints = getCreateFunction(
619
630
  collForEach(cellsDelta2, (table, tableId) =>
620
631
  collForEach(table, (row, rowId) =>
621
632
  collForEach(row, (oldNew, cellId) =>
622
- store.setOrDelCell(
623
- tableId,
624
- rowId,
625
- cellId,
626
- oldNew[oldOrNew],
627
- true,
628
- ),
633
+ store._[5](tableId, rowId, cellId, oldNew[oldOrNew], true),
629
634
  ),
630
635
  ),
631
636
  );
632
637
  collForEach(valuesDelta2, (oldNew, valueId) =>
633
- store.setOrDelValue(valueId, oldNew[oldOrNew], true),
638
+ store._[6](valueId, oldNew[oldOrNew], true),
634
639
  );
635
640
  });
636
641
  listening = 1;
@@ -1233,6 +1238,12 @@ const getCellOrValueType = (cellOrValue) => {
1233
1238
  if (isNull(cellOrValue)) {
1234
1239
  return NULL;
1235
1240
  }
1241
+ if (isArray(cellOrValue)) {
1242
+ return ARRAY;
1243
+ }
1244
+ if (isObject(cellOrValue)) {
1245
+ return OBJECT;
1246
+ }
1236
1247
  const type = getTypeOf(cellOrValue);
1237
1248
  return isTypeStringOrBoolean(type) ||
1238
1249
  (type == NUMBER && isFiniteNumber(cellOrValue))
@@ -1241,17 +1252,33 @@ const getCellOrValueType = (cellOrValue) => {
1241
1252
  };
1242
1253
  const isCellOrValueOrUndefined = (cellOrValue) =>
1243
1254
  isUndefined(cellOrValue) || !isUndefined(getCellOrValueType(cellOrValue));
1244
- const getTypeCase = (type, stringCase, numberCase, booleanCase) =>
1255
+ const isJsonType = (type) => type == OBJECT || type == ARRAY;
1256
+ const encodeIfJson = (value) =>
1257
+ isObject(value) || isArray(value) ? JSON_PREFIX + jsonString(value) : value;
1258
+ const isEncodedJson = (value) => isString(value) && value[0] == JSON_PREFIX;
1259
+ const decodeIfJson = (raw, _id, encoded) =>
1260
+ !encoded && isEncodedJson(raw) ? jsonParse(slice(raw, 1)) : raw;
1261
+ const getTypeCase = (
1262
+ type,
1263
+ stringCase,
1264
+ numberCase,
1265
+ booleanCase,
1266
+ objectCase,
1267
+ arrayCase,
1268
+ ) =>
1245
1269
  type == STRING
1246
1270
  ? stringCase
1247
1271
  : type == NUMBER
1248
1272
  ? numberCase
1249
1273
  : type == BOOLEAN
1250
1274
  ? booleanCase
1251
- : null;
1275
+ : type == OBJECT
1276
+ ? objectCase
1277
+ : type == ARRAY
1278
+ ? arrayCase
1279
+ : null;
1252
1280
 
1253
1281
  const stampClone = ([value, hlc]) => stampNew(value, hlc);
1254
- const stampCloneWithHash = ([value, hlc, hash]) => [value, hlc, hash];
1255
1282
  const stampNew = (value, hlc) => (hlc ? [value, hlc] : [value]);
1256
1283
  const stampNewWithHash = (value, hlc, hash) => [value, hlc, hash];
1257
1284
  const getStampHash = (stamp) => stamp[2];
@@ -1268,10 +1295,11 @@ const stampUpdate = (stamp, hlc, hash) => {
1268
1295
  };
1269
1296
  const stampNewObj = (hlc = EMPTY_STRING) => stampNew(objNew(), hlc);
1270
1297
  const stampNewMap = (hlc = EMPTY_STRING) => [mapNew(), hlc, 0];
1271
- const stampMapToObjWithHash = (
1272
- [map, hlc, hash],
1273
- mapper = stampCloneWithHash,
1274
- ) => [mapToObj(map, mapper), hlc, hash];
1298
+ const stampMapToObjWithHash = ([map, hlc, hash], mapper) => [
1299
+ mapToObj(map, mapper),
1300
+ hlc,
1301
+ hash,
1302
+ ];
1275
1303
  const stampMapToObjWithoutHash = ([map, hlc], mapper = stampClone) =>
1276
1304
  stampNew(mapToObj(map, mapper), hlc);
1277
1305
  const stampValidate = (stamp, validateThing) =>
@@ -1378,15 +1406,19 @@ const createStore = () => {
1378
1406
  return false;
1379
1407
  }
1380
1408
  const type = schema[TYPE];
1381
- if (!isTypeStringOrBoolean(type) && type != NUMBER) {
1409
+ if (!isTypeStringOrBoolean(type) && type != NUMBER && !isJsonType(type)) {
1382
1410
  return false;
1383
1411
  }
1384
1412
  const defaultValue = schema[DEFAULT];
1385
1413
  if (isNull(defaultValue) && !schema[ALLOW_NULL]) {
1386
1414
  return false;
1387
1415
  }
1388
- if (!isNull(defaultValue) && getCellOrValueType(defaultValue) != type) {
1389
- objDel(schema, DEFAULT);
1416
+ if (!isNull(defaultValue)) {
1417
+ if (getCellOrValueType(defaultValue) != type) {
1418
+ objDel(schema, DEFAULT);
1419
+ } else {
1420
+ schema[DEFAULT] = encodeIfJson(defaultValue);
1421
+ }
1390
1422
  }
1391
1423
  return true;
1392
1424
  };
@@ -1426,20 +1458,22 @@ const createStore = () => {
1426
1458
  ? cellSchema[ALLOW_NULL]
1427
1459
  ? cell
1428
1460
  : 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
- ),
1461
+ : getCellOrValueType(cell) === cellSchema[TYPE]
1462
+ ? encodeIfJson(cell)
1463
+ : isJsonType(cellSchema[TYPE]) && isEncodedJson(cell)
1464
+ ? cell
1465
+ : cellInvalid(
1466
+ tableId,
1467
+ rowId,
1468
+ cellId,
1469
+ cell,
1470
+ cellSchema[DEFAULT],
1471
+ ),
1438
1472
  () => cellInvalid(tableId, rowId, cellId, cell),
1439
1473
  )
1440
1474
  : isUndefined(getCellOrValueType(cell))
1441
1475
  ? cellInvalid(tableId, rowId, cellId, cell)
1442
- : cell;
1476
+ : encodeIfJson(cell);
1443
1477
  const validateValues = (values, skipDefaults) =>
1444
1478
  objValidate(
1445
1479
  skipDefaults ? values : addDefaultsToValues(values),
@@ -1463,14 +1497,16 @@ const createStore = () => {
1463
1497
  ? valueSchema[ALLOW_NULL]
1464
1498
  ? value
1465
1499
  : valueInvalid(valueId, value, valueSchema[DEFAULT])
1466
- : getCellOrValueType(value) == valueSchema[TYPE]
1467
- ? value
1468
- : valueInvalid(valueId, value, valueSchema[DEFAULT]),
1500
+ : getCellOrValueType(value) === valueSchema[TYPE]
1501
+ ? encodeIfJson(value)
1502
+ : isJsonType(valueSchema[TYPE]) && isEncodedJson(value)
1503
+ ? value
1504
+ : valueInvalid(valueId, value, valueSchema[DEFAULT]),
1469
1505
  () => valueInvalid(valueId, value),
1470
1506
  )
1471
1507
  : isUndefined(getCellOrValueType(value))
1472
1508
  ? valueInvalid(valueId, value)
1473
- : value;
1509
+ : encodeIfJson(value);
1474
1510
  const addDefaultsToRow = (row, tableId, rowId) => {
1475
1511
  ifNotUndefined(
1476
1512
  mapGet(tablesSchemaRowCache, tableId),
@@ -1550,10 +1586,24 @@ const createStore = () => {
1550
1586
  );
1551
1587
  const setOrDelTables = (tables) =>
1552
1588
  objIsEmpty(tables) ? delTables() : setTables(tables);
1553
- const setOrDelCell = (tableId, rowId, cellId, cell, skipMiddleware) =>
1589
+ const setOrDelCell = (
1590
+ tableId,
1591
+ rowId,
1592
+ cellId,
1593
+ cell,
1594
+ skipMiddleware,
1595
+ skipRowMiddleware,
1596
+ ) =>
1554
1597
  isUndefined(cell)
1555
1598
  ? delCell(tableId, rowId, cellId, true, skipMiddleware)
1556
- : setCell(tableId, rowId, cellId, cell, skipMiddleware);
1599
+ : setCell(
1600
+ tableId,
1601
+ rowId,
1602
+ cellId,
1603
+ cell,
1604
+ skipMiddleware,
1605
+ skipRowMiddleware,
1606
+ );
1557
1607
  const setOrDelValues = (values) =>
1558
1608
  objIsEmpty(values) ? delValues() : setValues(values);
1559
1609
  const setOrDelValue = (valueId, value, skipMiddleware) =>
@@ -1653,6 +1703,30 @@ const createStore = () => {
1653
1703
  ),
1654
1704
  objIsEqual,
1655
1705
  );
1706
+ const applyRowDirectly = (tableId, tableMap, rowId, row, skipMiddleware) => {
1707
+ mapMatch(
1708
+ mapEnsure(tableMap, rowId, () => {
1709
+ rowIdsChanged(tableId, rowId, 1);
1710
+ return mapNew();
1711
+ }),
1712
+ row,
1713
+ (rowMap, cellId, cell) =>
1714
+ ifNotUndefined(
1715
+ getValidatedCell(tableId, rowId, cellId, cell),
1716
+ (validCell) =>
1717
+ setValidCell(
1718
+ tableId,
1719
+ rowId,
1720
+ rowMap,
1721
+ cellId,
1722
+ validCell,
1723
+ skipMiddleware,
1724
+ ),
1725
+ ),
1726
+ (rowMap, cellId) =>
1727
+ delValidCell(tableId, tableMap, rowId, rowMap, cellId, true),
1728
+ );
1729
+ };
1656
1730
  const setValidCell = (tableId, rowId, rowMap, cellId, cell, skipMiddleware) =>
1657
1731
  ifTransformed(
1658
1732
  cell,
@@ -1893,13 +1967,21 @@ const createStore = () => {
1893
1967
  const getCellChange = (tableId, rowId, cellId) =>
1894
1968
  ifNotUndefined(
1895
1969
  mapGet(mapGet(mapGet(changedCells, tableId), rowId), cellId),
1896
- ([oldCell, newCell]) => [true, oldCell, newCell],
1970
+ ([oldCell, newCell]) => [
1971
+ true,
1972
+ decodeIfJson(oldCell),
1973
+ decodeIfJson(newCell),
1974
+ ],
1897
1975
  () => [false, ...pairNew(getCell(tableId, rowId, cellId))],
1898
1976
  );
1899
1977
  const getValueChange = (valueId) =>
1900
1978
  ifNotUndefined(
1901
1979
  mapGet(changedValues, valueId),
1902
- ([oldValue, newValue]) => [true, oldValue, newValue],
1980
+ ([oldValue, newValue]) => [
1981
+ true,
1982
+ decodeIfJson(oldValue),
1983
+ decodeIfJson(newValue),
1984
+ ],
1903
1985
  () => [false, ...pairNew(getValue(valueId))],
1904
1986
  );
1905
1987
  const callInvalidCellListeners = (mutator) =>
@@ -2075,8 +2157,8 @@ const createStore = () => {
2075
2157
  callListeners(
2076
2158
  cellListeners[mutator],
2077
2159
  [tableId, rowId, cellId],
2078
- newCell,
2079
- oldCell,
2160
+ decodeIfJson(newCell),
2161
+ decodeIfJson(oldCell),
2080
2162
  getCellChange,
2081
2163
  );
2082
2164
  tablesChanged = tableChanged = rowChanged = 1;
@@ -2132,8 +2214,8 @@ const createStore = () => {
2132
2214
  callListeners(
2133
2215
  valueListeners[mutator],
2134
2216
  [valueId],
2135
- newValue,
2136
- oldValue,
2217
+ decodeIfJson(newValue),
2218
+ decodeIfJson(oldValue),
2137
2219
  getValueChange,
2138
2220
  );
2139
2221
  valuesChanged = 1;
@@ -2170,10 +2252,42 @@ const createStore = () => {
2170
2252
  [getTableIds],
2171
2253
  );
2172
2254
  };
2255
+ const getTransactionChangesImpl = (encoded = false) => [
2256
+ mapToObj(
2257
+ changedCells,
2258
+ (table, tableId) =>
2259
+ mapGet(changedTableIds, tableId) === -1
2260
+ ? void 0
2261
+ : mapToObj(
2262
+ table,
2263
+ (row, rowId) =>
2264
+ mapGet(mapGet(changedRowIds, tableId), rowId) === -1
2265
+ ? void 0
2266
+ : mapToObj(
2267
+ row,
2268
+ ([, newCell]) =>
2269
+ decodeIfJson(newCell, EMPTY_STRING, encoded),
2270
+ (changedCell) => pairIsEqual(changedCell),
2271
+ ),
2272
+ collIsEmpty,
2273
+ objIsEmpty,
2274
+ ),
2275
+ collIsEmpty,
2276
+ objIsEmpty,
2277
+ ),
2278
+ mapToObj(
2279
+ changedValues,
2280
+ ([, newValue]) => decodeIfJson(newValue, EMPTY_STRING, encoded),
2281
+ (changedValue) => pairIsEqual(changedValue),
2282
+ ),
2283
+ 1,
2284
+ ];
2173
2285
  const getContent = () => [getTables(), getValues()];
2174
- const getTables = () => mapToObj3(tablesMap);
2286
+ const getEncodedContent = () => [mapToObj3(tablesMap), mapToObj(valuesMap)];
2287
+ const getTables = () => mapToObj3(tablesMap, decodeIfJson);
2175
2288
  const getTableIds = () => mapKeys(tablesMap);
2176
- const getTable = (tableId) => mapToObj2(mapGet(tablesMap, id(tableId)));
2289
+ const getTable = (tableId) =>
2290
+ mapToObj2(mapGet(tablesMap, id(tableId)), decodeIfJson);
2177
2291
  const getTableCellIds = (tableId) =>
2178
2292
  mapKeys(mapGet(tableCellIds, id(tableId)));
2179
2293
  const getRowCount = (tableId) => collSize(mapGet(tablesMap, id(tableId)));
@@ -2209,14 +2323,16 @@ const createStore = () => {
2209
2323
  ([, rowId]) => rowId,
2210
2324
  );
2211
2325
  const getRow = (tableId, rowId) =>
2212
- mapToObj(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)));
2326
+ mapToObj(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)), decodeIfJson);
2213
2327
  const getCellIds = (tableId, rowId) =>
2214
2328
  mapKeys(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)));
2215
2329
  const getCell = (tableId, rowId, cellId) =>
2216
- mapGet(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)), id(cellId));
2217
- const getValues = () => mapToObj(valuesMap);
2330
+ decodeIfJson(
2331
+ mapGet(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)), id(cellId)),
2332
+ );
2333
+ const getValues = () => mapToObj(valuesMap, decodeIfJson);
2218
2334
  const getValueIds = () => mapKeys(valuesMap);
2219
- const getValue = (valueId) => mapGet(valuesMap, id(valueId));
2335
+ const getValue = (valueId) => decodeIfJson(mapGet(valuesMap, id(valueId)));
2220
2336
  const hasTables = () => !collIsEmpty(tablesMap);
2221
2337
  const hasTable = (tableId) => collHas(tablesMap, id(tableId));
2222
2338
  const hasTableCell = (tableId, cellId) =>
@@ -2287,7 +2403,14 @@ const createStore = () => {
2287
2403
  tableId,
2288
2404
  rowId,
2289
2405
  );
2290
- const setCell = (tableId, rowId, cellId, cell, skipMiddleware) =>
2406
+ const setCell = (
2407
+ tableId,
2408
+ rowId,
2409
+ cellId,
2410
+ cell,
2411
+ skipMiddleware,
2412
+ skipRowMiddleware,
2413
+ ) =>
2291
2414
  fluentTransaction(
2292
2415
  (tableId2, rowId2, cellId2) =>
2293
2416
  ifNotUndefined(
@@ -2297,15 +2420,47 @@ const createStore = () => {
2297
2420
  cellId2,
2298
2421
  isFunction(cell) ? cell(getCell(tableId2, rowId2, cellId2)) : cell,
2299
2422
  ),
2300
- (validCell) =>
2301
- setCellIntoNewRow(
2302
- tableId2,
2303
- getOrCreateTable(tableId2),
2304
- rowId2,
2305
- cellId2,
2306
- validCell,
2307
- skipMiddleware,
2308
- ),
2423
+ (validCell) => {
2424
+ const tableMap = getOrCreateTable(tableId2);
2425
+ ifNotUndefined(
2426
+ skipMiddleware || skipRowMiddleware || !middleware[14]?.()
2427
+ ? void 0
2428
+ : middleware[3],
2429
+ (willSetRow) => {
2430
+ const existingRowMap = mapGet(tableMap, rowId2);
2431
+ const prospectiveRow = {
2432
+ ...(existingRowMap ? mapToObj(existingRowMap) : {}),
2433
+ [cellId2]: validCell,
2434
+ };
2435
+ ifNotUndefined(
2436
+ whileMutating(() =>
2437
+ willSetRow(
2438
+ tableId2,
2439
+ rowId2,
2440
+ structuredClone(prospectiveRow),
2441
+ ),
2442
+ ),
2443
+ (row) =>
2444
+ applyRowDirectly(
2445
+ tableId2,
2446
+ tableMap,
2447
+ rowId2,
2448
+ row,
2449
+ skipMiddleware,
2450
+ ),
2451
+ );
2452
+ },
2453
+ () =>
2454
+ setCellIntoNewRow(
2455
+ tableId2,
2456
+ tableMap,
2457
+ rowId2,
2458
+ cellId2,
2459
+ validCell,
2460
+ skipMiddleware,
2461
+ ),
2462
+ );
2463
+ },
2309
2464
  ),
2310
2465
  tableId,
2311
2466
  rowId,
@@ -2354,7 +2509,14 @@ const createStore = () => {
2354
2509
  isUndefined(row)
2355
2510
  ? delRow(tableId, rowId)
2356
2511
  : objMap(row, (cell, cellId) =>
2357
- setOrDelCell(tableId, rowId, cellId, cell),
2512
+ setOrDelCell(
2513
+ tableId,
2514
+ rowId,
2515
+ cellId,
2516
+ cell,
2517
+ void 0,
2518
+ true,
2519
+ ),
2358
2520
  ),
2359
2521
  ),
2360
2522
  );
@@ -2503,35 +2665,8 @@ const createStore = () => {
2503
2665
  }
2504
2666
  return store;
2505
2667
  };
2506
- const getTransactionChanges = () => [
2507
- mapToObj(
2508
- changedCells,
2509
- (table, tableId) =>
2510
- mapGet(changedTableIds, tableId) === -1
2511
- ? void 0
2512
- : mapToObj(
2513
- table,
2514
- (row, rowId) =>
2515
- mapGet(mapGet(changedRowIds, tableId), rowId) === -1
2516
- ? void 0
2517
- : mapToObj(
2518
- row,
2519
- ([, newCell]) => newCell,
2520
- (changedCell) => pairIsEqual(changedCell),
2521
- ),
2522
- collIsEmpty,
2523
- objIsEmpty,
2524
- ),
2525
- collIsEmpty,
2526
- objIsEmpty,
2527
- ),
2528
- mapToObj(
2529
- changedValues,
2530
- ([, newValue]) => newValue,
2531
- (changedValue) => pairIsEqual(changedValue),
2532
- ),
2533
- 1,
2534
- ];
2668
+ const getTransactionChanges = () => getTransactionChangesImpl();
2669
+ const getEncodedTransactionChanges = () => getTransactionChangesImpl(true);
2535
2670
  const getTransactionLog = () => [
2536
2671
  !collIsEmpty(changedCells),
2537
2672
  !collIsEmpty(changedValues),
@@ -2544,37 +2679,6 @@ const createStore = () => {
2544
2679
  mapToObj3(changedCellIds),
2545
2680
  mapToObj(changedValueIds),
2546
2681
  ];
2547
- const doDidSetRows = () => {
2548
- if (middleware[14]) {
2549
- const changedCells2 = clonedChangedCells(changedCells);
2550
- collForEach(changedCells2, (rows, tableId) =>
2551
- collForEach(rows, (cells, rowId) => {
2552
- if (
2553
- !arrayEvery(
2554
- collValues(cells),
2555
- ([oldCell, newCell]) => oldCell === newCell,
2556
- )
2557
- ) {
2558
- const newRow = getRow(tableId, rowId);
2559
- const oldRow = objMerge(newRow);
2560
- collForEach(cells, ([oldCell], cellId) =>
2561
- isUndefined(oldCell)
2562
- ? objDel(oldRow, cellId)
2563
- : (oldRow[cellId] = oldCell),
2564
- );
2565
- const didSetRow = middleware[14](tableId, rowId, oldRow, newRow);
2566
- if (!objIsEqual(didSetRow, newRow)) {
2567
- const setOrDelRow = objMap(newRow, () => void 0);
2568
- objMap(didSetRow, (cell, cellId) => (setOrDelRow[cellId] = cell));
2569
- objMap(setOrDelRow, (cell, cellId) =>
2570
- setOrDelCell(tableId, rowId, cellId, cell, true),
2571
- );
2572
- }
2573
- }
2574
- }),
2575
- );
2576
- }
2577
- };
2578
2682
  const finishTransaction = (doRollback) => {
2579
2683
  if (transactions > 0) {
2580
2684
  transactions--;
@@ -2584,7 +2688,6 @@ const createStore = () => {
2584
2688
  callInvalidCellListeners(1);
2585
2689
  if (!collIsEmpty(changedCells)) {
2586
2690
  callTabularListenersForChanges(1);
2587
- doDidSetRows();
2588
2691
  }
2589
2692
  callInvalidValueListeners(1);
2590
2693
  if (!collIsEmpty(changedValues)) {
@@ -2645,7 +2748,9 @@ const createStore = () => {
2645
2748
  tableCallback(tableId, (rowCallback) =>
2646
2749
  collForEach(tableMap, (rowMap, rowId) =>
2647
2750
  rowCallback(rowId, (cellCallback) =>
2648
- mapForEach(rowMap, cellCallback),
2751
+ mapForEach(rowMap, (cellId, cell) =>
2752
+ cellCallback(cellId, decodeIfJson(cell)),
2753
+ ),
2649
2754
  ),
2650
2755
  ),
2651
2756
  ),
@@ -2654,11 +2759,21 @@ const createStore = () => {
2654
2759
  mapForEach(mapGet(tableCellIds, id(tableId)), tableCellCallback);
2655
2760
  const forEachRow = (tableId, rowCallback) =>
2656
2761
  collForEach(mapGet(tablesMap, id(tableId)), (rowMap, rowId) =>
2657
- rowCallback(rowId, (cellCallback) => mapForEach(rowMap, cellCallback)),
2762
+ rowCallback(rowId, (cellCallback) =>
2763
+ mapForEach(rowMap, (cellId, cell) =>
2764
+ cellCallback(cellId, decodeIfJson(cell)),
2765
+ ),
2766
+ ),
2658
2767
  );
2659
2768
  const forEachCell = (tableId, rowId, cellCallback) =>
2660
- mapForEach(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)), cellCallback);
2661
- const forEachValue = (valueCallback) => mapForEach(valuesMap, valueCallback);
2769
+ mapForEach(
2770
+ mapGet(mapGet(tablesMap, id(tableId)), id(rowId)),
2771
+ (cellId, cell) => cellCallback(cellId, decodeIfJson(cell)),
2772
+ );
2773
+ const forEachValue = (valueCallback) =>
2774
+ mapForEach(valuesMap, (valueId, value) =>
2775
+ valueCallback(valueId, decodeIfJson(value)),
2776
+ );
2662
2777
  const addSortedRowIdsListener = (
2663
2778
  tableIdOrArgs,
2664
2779
  cellIdOrListener,
@@ -2743,7 +2858,7 @@ const createStore = () => {
2743
2858
  willDelValues,
2744
2859
  willDelValue,
2745
2860
  willApplyChanges,
2746
- didSetRow,
2861
+ hasWillSetRowCallbacks,
2747
2862
  ) =>
2748
2863
  (middleware = [
2749
2864
  willSetContent,
@@ -2760,7 +2875,7 @@ const createStore = () => {
2760
2875
  willDelValues,
2761
2876
  willDelValue,
2762
2877
  willApplyChanges,
2763
- didSetRow,
2878
+ hasWillSetRowCallbacks,
2764
2879
  ]);
2765
2880
  const setInternalListeners = (
2766
2881
  preStartTransaction,
@@ -2850,14 +2965,17 @@ const createStore = () => {
2850
2965
  delListener,
2851
2966
  getListenerStats,
2852
2967
  isMergeable: () => false,
2853
- // only used internally by other modules
2854
- createStore,
2855
- addListener,
2856
- callListeners,
2857
- setInternalListeners,
2858
- setMiddleware,
2859
- setOrDelCell,
2860
- setOrDelValue,
2968
+ _: [
2969
+ createStore,
2970
+ addListener,
2971
+ callListeners,
2972
+ setInternalListeners,
2973
+ setMiddleware,
2974
+ setOrDelCell,
2975
+ setOrDelValue,
2976
+ getEncodedContent,
2977
+ getEncodedTransactionChanges,
2978
+ ],
2861
2979
  };
2862
2980
  objMap(
2863
2981
  {
@@ -3172,14 +3290,78 @@ const createMergeableStore = (uniqueId, getNow) => {
3172
3290
  ]);
3173
3291
  }
3174
3292
  };
3175
- const getMergeableContent = () => [
3293
+ const getMergeableContentImpl = (encoded = false) => [
3176
3294
  stampMapToObjWithHash(contentStampMap[0], (tableStampMap) =>
3177
3295
  stampMapToObjWithHash(tableStampMap, (rowStampMap) =>
3178
- stampMapToObjWithHash(rowStampMap),
3296
+ stampMapToObjWithHash(rowStampMap, ([cell, hlc, hash]) => [
3297
+ decodeIfJson(cell, EMPTY_STRING, encoded),
3298
+ hlc,
3299
+ hash,
3300
+ ]),
3179
3301
  ),
3180
3302
  ),
3181
- stampMapToObjWithHash(contentStampMap[1]),
3303
+ stampMapToObjWithHash(contentStampMap[1], ([value, hlc, hash]) => [
3304
+ decodeIfJson(value, EMPTY_STRING, encoded),
3305
+ hlc,
3306
+ hash,
3307
+ ]),
3182
3308
  ];
3309
+ const getTransactionMergeableChangesImpl = (withHashes, encoded = false) => {
3310
+ const [
3311
+ [tableStampMaps, tablesHlc, tablesHash],
3312
+ [valueStampMaps, valuesHlc, valuesHash],
3313
+ ] = contentStampMap;
3314
+ const newStamp = withHashes ? stampNewWithHash : stampNew;
3315
+ const tablesObj = {};
3316
+ collForEach(touchedCells, (touchedTable, tableId) =>
3317
+ ifNotUndefined(
3318
+ mapGet(tableStampMaps, tableId),
3319
+ ([rowStampMaps, tableHlc, tableHash]) => {
3320
+ const tableObj = {};
3321
+ collForEach(touchedTable, (touchedRow, rowId) =>
3322
+ ifNotUndefined(
3323
+ mapGet(rowStampMaps, rowId),
3324
+ ([cellStampMaps, rowHlc, rowHash]) => {
3325
+ const rowObj = {};
3326
+ collForEach(touchedRow, (cellId) => {
3327
+ ifNotUndefined(
3328
+ mapGet(cellStampMaps, cellId),
3329
+ ([cell, time, hash]) =>
3330
+ (rowObj[cellId] = newStamp(
3331
+ encoded ? cell : decodeIfJson(cell),
3332
+ time,
3333
+ hash,
3334
+ )),
3335
+ );
3336
+ });
3337
+ tableObj[rowId] = newStamp(rowObj, rowHlc, rowHash);
3338
+ },
3339
+ ),
3340
+ );
3341
+ tablesObj[tableId] = newStamp(tableObj, tableHlc, tableHash);
3342
+ },
3343
+ ),
3344
+ );
3345
+ const valuesObj = {};
3346
+ collForEach(touchedValues, (valueId) =>
3347
+ ifNotUndefined(
3348
+ mapGet(valueStampMaps, valueId),
3349
+ ([value, time, hash]) =>
3350
+ (valuesObj[valueId] = newStamp(
3351
+ encoded ? value : decodeIfJson(value),
3352
+ time,
3353
+ hash,
3354
+ )),
3355
+ ),
3356
+ );
3357
+ return [
3358
+ newStamp(tablesObj, tablesHlc, tablesHash),
3359
+ newStamp(valuesObj, valuesHlc, valuesHash),
3360
+ 1,
3361
+ ];
3362
+ };
3363
+ const getMergeableContent = () => getMergeableContentImpl();
3364
+ const getEncodedMergeableContent = () => getMergeableContentImpl(true);
3183
3365
  const getMergeableContentHashes = () => [
3184
3366
  contentStampMap[0][2],
3185
3367
  contentStampMap[1][2],
@@ -3319,52 +3501,10 @@ const createMergeableStore = (uniqueId, getNow) => {
3319
3501
  });
3320
3502
  return mergeableStore;
3321
3503
  };
3322
- const getTransactionMergeableChanges = (withHashes = false) => {
3323
- const [
3324
- [tableStampMaps, tablesHlc, tablesHash],
3325
- [valueStampMaps, valuesHlc, valuesHash],
3326
- ] = contentStampMap;
3327
- const newStamp = withHashes ? stampNewWithHash : stampNew;
3328
- const tablesObj = {};
3329
- collForEach(touchedCells, (touchedTable, tableId) =>
3330
- ifNotUndefined(
3331
- mapGet(tableStampMaps, tableId),
3332
- ([rowStampMaps, tableHlc, tableHash]) => {
3333
- const tableObj = {};
3334
- collForEach(touchedTable, (touchedRow, rowId) =>
3335
- ifNotUndefined(
3336
- mapGet(rowStampMaps, rowId),
3337
- ([cellStampMaps, rowHlc, rowHash]) => {
3338
- const rowObj = {};
3339
- collForEach(touchedRow, (cellId) => {
3340
- ifNotUndefined(
3341
- mapGet(cellStampMaps, cellId),
3342
- ([cell, time, hash]) =>
3343
- (rowObj[cellId] = newStamp(cell, time, hash)),
3344
- );
3345
- });
3346
- tableObj[rowId] = newStamp(rowObj, rowHlc, rowHash);
3347
- },
3348
- ),
3349
- );
3350
- tablesObj[tableId] = newStamp(tableObj, tableHlc, tableHash);
3351
- },
3352
- ),
3353
- );
3354
- const valuesObj = {};
3355
- collForEach(touchedValues, (valueId) =>
3356
- ifNotUndefined(
3357
- mapGet(valueStampMaps, valueId),
3358
- ([value, time, hash]) =>
3359
- (valuesObj[valueId] = newStamp(value, time, hash)),
3360
- ),
3361
- );
3362
- return [
3363
- newStamp(tablesObj, tablesHlc, tablesHash),
3364
- newStamp(valuesObj, valuesHlc, valuesHash),
3365
- 1,
3366
- ];
3367
- };
3504
+ const getTransactionMergeableChanges = (withHashes = false) =>
3505
+ getTransactionMergeableChangesImpl(withHashes);
3506
+ const getEncodedTransactionMergeableChanges = (withHashes) =>
3507
+ getTransactionMergeableChangesImpl(withHashes, true);
3368
3508
  const applyMergeableChanges = (mergeableChanges) =>
3369
3509
  disableListeningToRawStoreChanges(() =>
3370
3510
  store.applyChanges(mergeContentOrChanges(mergeableChanges)),
@@ -3396,10 +3536,13 @@ const createMergeableStore = (uniqueId, getNow) => {
3396
3536
  getTransactionMergeableChanges,
3397
3537
  applyMergeableChanges,
3398
3538
  merge,
3399
- // only used internally by other modules
3400
- hadMutated,
3539
+ __: [
3540
+ hadMutated,
3541
+ getEncodedMergeableContent,
3542
+ getEncodedTransactionMergeableChanges,
3543
+ ],
3401
3544
  };
3402
- store.setInternalListeners(
3545
+ store._[3](
3403
3546
  preStartTransaction,
3404
3547
  preFinishTransaction,
3405
3548
  postFinishTransaction,
@@ -3638,7 +3781,6 @@ const createMiddleware = getCreateFunction((store) => {
3638
3781
  const willDelValuesCallbacks = [];
3639
3782
  const willDelValueCallbacks = [];
3640
3783
  const willApplyChangesCallbacks = [];
3641
- const didSetRowCallbacksMap = mapNew();
3642
3784
  const willSetContent = (content) =>
3643
3785
  reduceCallbacks(willSetContentCallbacks, content);
3644
3786
  const willSetTables = (tables) =>
@@ -3665,17 +3807,6 @@ const createMiddleware = getCreateFunction((store) => {
3665
3807
  everyCallback(willDelValueCallbacks, valueId);
3666
3808
  const willApplyChanges = (changes) =>
3667
3809
  reduceCallbacks(willApplyChangesCallbacks, changes);
3668
- const didSetRow = (tableId, rowId, oldRow, newRow) =>
3669
- ifNotUndefined(
3670
- mapGet(didSetRowCallbacksMap, tableId),
3671
- (callbacks) =>
3672
- arrayReduce(
3673
- callbacks,
3674
- (current, callback) => callback(tableId, rowId, oldRow, current),
3675
- newRow,
3676
- ),
3677
- () => newRow,
3678
- );
3679
3810
  const getStore = () => store;
3680
3811
  const addWillSetContentCallback = addCallback(willSetContentCallbacks);
3681
3812
  const addWillSetTablesCallback = addCallback(willSetTablesCallbacks);
@@ -3691,13 +3822,6 @@ const createMiddleware = getCreateFunction((store) => {
3691
3822
  const addWillDelValuesCallback = addCallback(willDelValuesCallbacks);
3692
3823
  const addWillDelValueCallback = addCallback(willDelValueCallbacks);
3693
3824
  const addWillApplyChangesCallback = addCallback(willApplyChangesCallbacks);
3694
- const addDidSetRowCallback = (tableId, callback) =>
3695
- fluent(() =>
3696
- arrayPush(
3697
- mapEnsure(didSetRowCallbacksMap, tableId, () => []),
3698
- callback,
3699
- ),
3700
- );
3701
3825
  const destroy = () => {};
3702
3826
  const middleware = objFreeze({
3703
3827
  getStore,
@@ -3715,10 +3839,9 @@ const createMiddleware = getCreateFunction((store) => {
3715
3839
  addWillDelValuesCallback,
3716
3840
  addWillDelValueCallback,
3717
3841
  addWillApplyChangesCallback,
3718
- addDidSetRowCallback,
3719
3842
  destroy,
3720
3843
  });
3721
- store.setMiddleware(
3844
+ store._[4](
3722
3845
  willSetContent,
3723
3846
  willSetTables,
3724
3847
  willSetTable,
@@ -3733,7 +3856,7 @@ const createMiddleware = getCreateFunction((store) => {
3733
3856
  willDelValues,
3734
3857
  willDelValue,
3735
3858
  willApplyChanges,
3736
- didSetRow,
3859
+ () => willSetRowCallbacks.length > 0,
3737
3860
  );
3738
3861
  return middleware;
3739
3862
  });
@@ -3758,8 +3881,8 @@ const getStoreFunctions = (
3758
3881
  persist != 1 /* StoreOnly */ && store.isMergeable()
3759
3882
  ? [
3760
3883
  1,
3761
- store.getMergeableContent,
3762
- () => store.getTransactionMergeableChanges(!isSynchronizer),
3884
+ store.__[1],
3885
+ () => store.__[2](!isSynchronizer),
3763
3886
  ([[changedTables], [changedValues]]) =>
3764
3887
  !objIsEmpty(changedTables) || !objIsEmpty(changedValues),
3765
3888
  store.setDefaultContent,
@@ -3767,8 +3890,8 @@ const getStoreFunctions = (
3767
3890
  : persist != 2 /* MergeableStoreOnly */
3768
3891
  ? [
3769
3892
  0,
3770
- store.getContent,
3771
- store.getTransactionChanges,
3893
+ store._[7],
3894
+ store._[8],
3772
3895
  ([changedTables, changedValues]) =>
3773
3896
  !objIsEmpty(changedTables) || !objIsEmpty(changedValues),
3774
3897
  store.setContent,
@@ -3833,7 +3956,7 @@ const createCustomPersister = (
3833
3956
  : store.setContent)(contentOrChanges);
3834
3957
  };
3835
3958
  const saveAfterMutated = async () => {
3836
- if (isAutoSaving() && store.hadMutated?.()) {
3959
+ if (isAutoSaving() && store.__?.[0]?.()) {
3837
3960
  await save();
3838
3961
  }
3839
3962
  };
@@ -6246,15 +6369,14 @@ const createYjsPersister = (
6246
6369
  };
6247
6370
 
6248
6371
  const createQueries = getCreateFunction((store) => {
6249
- const createStore = store.createStore;
6372
+ const createStore = store._[0];
6250
6373
  const preStore = createStore();
6251
6374
  const resultStore = createStore();
6252
6375
  const preStoreListenerIds = mapNew();
6253
6376
  const paramValuesListeners = mapNew();
6254
6377
  const paramValueListeners = mapNew();
6255
6378
  const {
6256
- addListener,
6257
- callListeners,
6379
+ _: [, addListener, callListeners],
6258
6380
  delListener: delListenerImpl,
6259
6381
  } = resultStore;
6260
6382
  const [
@@ -6573,7 +6695,7 @@ const createQueries = getCreateFunction((store) => {
6573
6695
  selectJoinWhereStore.transaction(() =>
6574
6696
  arrayEvery(wheres, (where2) => where2(getTableCell))
6575
6697
  ? mapForEach(selects, (asCellId, tableCellGetter) =>
6576
- selectJoinWhereStore.setOrDelCell(
6698
+ selectJoinWhereStore._[5](
6577
6699
  queryId,
6578
6700
  rootRowId,
6579
6701
  asCellId,
@@ -7894,6 +8016,10 @@ const IS_EQUALS = [
7894
8016
  (paramValues1, paramValues2) =>
7895
8017
  objIsEqual(paramValues1, paramValues2, arrayOrValueEqual),
7896
8018
  arrayOrValueEqual,
8019
+ (thing1, thing2) =>
8020
+ thing1 === thing2 ||
8021
+ ((isObject(thing1) || isArray(thing1)) &&
8022
+ jsonString(thing1) === jsonString(thing2)),
7897
8023
  ];
7898
8024
  const isEqual = (thing1, thing2) => thing1 === thing2;
7899
8025
  const useCreate = (store, create, createDeps = EMPTY_ARRAY) => {
@@ -9635,12 +9761,22 @@ const EditableThing = ({
9635
9761
  const [stringThing, setStringThing] = useState();
9636
9762
  const [numberThing, setNumberThing] = useState();
9637
9763
  const [booleanThing, setBooleanThing] = useState();
9764
+ const [objectThing, setObjectThing] = useState('{}');
9765
+ const [arrayThing, setArrayThing] = useState('[]');
9766
+ const [objectClassName, setObjectClassName] = useState('');
9767
+ const [arrayClassName, setArrayClassName] = useState('');
9638
9768
  if (currentThing !== thing) {
9639
9769
  setThingType(getCellOrValueType(thing));
9640
9770
  setCurrentThing(thing);
9641
- setStringThing(String(thing));
9642
- setNumberThing(Number(thing) || 0);
9643
- setBooleanThing(Boolean(thing));
9771
+ if (isObject(thing)) {
9772
+ setObjectThing(jsonString(thing));
9773
+ } else if (isArray(thing)) {
9774
+ setArrayThing(jsonString(thing));
9775
+ } else {
9776
+ setStringThing(String(thing));
9777
+ setNumberThing(Number(thing) || 0);
9778
+ setBooleanThing(Boolean(thing));
9779
+ }
9644
9780
  }
9645
9781
  const handleThingChange = useCallback(
9646
9782
  (thing2, setTypedThing) => {
@@ -9650,14 +9786,39 @@ const EditableThing = ({
9650
9786
  },
9651
9787
  [onThingChange],
9652
9788
  );
9789
+ const handleJsonThingChange = useCallback(
9790
+ (value, setTypedThing, isThing, setTypedClassName) => {
9791
+ setTypedThing(value);
9792
+ try {
9793
+ const object = jsonParse(value);
9794
+ if (isThing(object)) {
9795
+ setCurrentThing(object);
9796
+ onThingChange(object);
9797
+ setTypedClassName('');
9798
+ }
9799
+ } catch {
9800
+ setTypedClassName('invalid');
9801
+ }
9802
+ },
9803
+ [onThingChange],
9804
+ );
9653
9805
  const handleTypeChange = useCallback(() => {
9654
9806
  if (!hasSchema?.()) {
9655
- const nextType = getTypeCase(thingType, NUMBER, BOOLEAN, STRING);
9807
+ const nextType = getTypeCase(
9808
+ thingType,
9809
+ NUMBER,
9810
+ BOOLEAN,
9811
+ OBJECT,
9812
+ ARRAY,
9813
+ STRING,
9814
+ );
9656
9815
  const thing2 = getTypeCase(
9657
9816
  nextType,
9658
9817
  stringThing,
9659
9818
  numberThing,
9660
9819
  booleanThing,
9820
+ tryReturn(() => jsonParse(objectThing), {}),
9821
+ tryReturn(() => jsonParse(arrayThing), []),
9661
9822
  );
9662
9823
  setThingType(nextType);
9663
9824
  setCurrentThing(thing2);
@@ -9669,6 +9830,8 @@ const EditableThing = ({
9669
9830
  stringThing,
9670
9831
  numberThing,
9671
9832
  booleanThing,
9833
+ objectThing,
9834
+ arrayThing,
9672
9835
  thingType,
9673
9836
  ]);
9674
9837
  const widget = getTypeCase(
@@ -9720,6 +9883,42 @@ const EditableThing = ({
9720
9883
  },
9721
9884
  thingType,
9722
9885
  ),
9886
+ /* @__PURE__ */ jsx(
9887
+ 'input',
9888
+ {
9889
+ value: objectThing,
9890
+ className: objectClassName,
9891
+ onChange: useCallback(
9892
+ (event) =>
9893
+ handleJsonThingChange(
9894
+ event[CURRENT_TARGET][_VALUE],
9895
+ setObjectThing,
9896
+ isObject,
9897
+ setObjectClassName,
9898
+ ),
9899
+ [handleJsonThingChange],
9900
+ ),
9901
+ },
9902
+ thingType,
9903
+ ),
9904
+ /* @__PURE__ */ jsx(
9905
+ 'input',
9906
+ {
9907
+ value: arrayThing,
9908
+ className: arrayClassName,
9909
+ onChange: useCallback(
9910
+ (event) =>
9911
+ handleJsonThingChange(
9912
+ event[CURRENT_TARGET][_VALUE],
9913
+ setArrayThing,
9914
+ isArray,
9915
+ setArrayClassName,
9916
+ ),
9917
+ [handleJsonThingChange],
9918
+ ),
9919
+ },
9920
+ thingType,
9921
+ ),
9723
9922
  );
9724
9923
  return /* @__PURE__ */ jsxs('div', {
9725
9924
  className,