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
@@ -41,6 +41,8 @@ const STRING = getTypeOf(EMPTY_STRING);
41
41
  const BOOLEAN = getTypeOf(true);
42
42
  const NUMBER = getTypeOf(0);
43
43
  const FUNCTION = getTypeOf(getTypeOf);
44
+ const OBJECT = 'object';
45
+ const ARRAY = 'array';
44
46
  const TYPE = 'type';
45
47
  const DEFAULT = 'default';
46
48
  const ALLOW_NULL = 'allowNull';
@@ -72,6 +74,7 @@ const CURRENT_TARGET = 'currentTarget';
72
74
  const _VALUE = 'value';
73
75
  const EXTRA = 'extra';
74
76
  const UNDEFINED = '\uFFFC';
77
+ const JSON_PREFIX = '\uFFFD';
75
78
  const id = (key) => EMPTY_STRING + key;
76
79
  const strSplit = (str, separator = EMPTY_STRING, limit) =>
77
80
  str.split(separator, limit);
@@ -152,6 +155,7 @@ const isObject = (obj) =>
152
155
  const objIds = object.keys;
153
156
  const objFreeze = object.freeze;
154
157
  const objNew = (entries = []) => object.fromEntries(entries);
158
+ const objMerge = (...objs) => object.assign({}, ...objs);
155
159
  const objGet = (obj, id) => ifNotUndefined(obj, (obj2) => obj2[id]);
156
160
  const objHas = (obj, id) => id in obj;
157
161
  const objDel = (obj, id) => {
@@ -419,8 +423,8 @@ const getStoreFunctions = (
419
423
  persist != 1 /* StoreOnly */ && store.isMergeable()
420
424
  ? [
421
425
  1,
422
- store.getMergeableContent,
423
- () => store.getTransactionMergeableChanges(!isSynchronizer),
426
+ store.__[1],
427
+ () => store.__[2](!isSynchronizer),
424
428
  ([[changedTables], [changedValues]]) =>
425
429
  !objIsEmpty(changedTables) || !objIsEmpty(changedValues),
426
430
  store.setDefaultContent,
@@ -428,8 +432,8 @@ const getStoreFunctions = (
428
432
  : persist != 2 /* MergeableStoreOnly */
429
433
  ? [
430
434
  0,
431
- store.getContent,
432
- store.getTransactionChanges,
435
+ store._[7],
436
+ store._[8],
433
437
  ([changedTables, changedValues]) =>
434
438
  !objIsEmpty(changedTables) || !objIsEmpty(changedValues),
435
439
  store.setContent,
@@ -494,7 +498,7 @@ const createCustomPersister = (
494
498
  : store.setContent)(contentOrChanges);
495
499
  };
496
500
  const saveAfterMutated = async () => {
497
- if (isAutoSaving() && store.hadMutated?.()) {
501
+ if (isAutoSaving() && store.__?.[0]?.()) {
498
502
  await save();
499
503
  }
500
504
  };
@@ -698,20 +702,43 @@ const getCellOrValueType = (cellOrValue) => {
698
702
  if (isNull(cellOrValue)) {
699
703
  return NULL;
700
704
  }
705
+ if (isArray(cellOrValue)) {
706
+ return ARRAY;
707
+ }
708
+ if (isObject(cellOrValue)) {
709
+ return OBJECT;
710
+ }
701
711
  const type = getTypeOf(cellOrValue);
702
712
  return isTypeStringOrBoolean(type) ||
703
713
  (type == NUMBER && isFiniteNumber(cellOrValue))
704
714
  ? type
705
715
  : void 0;
706
716
  };
707
- const getTypeCase = (type, stringCase, numberCase, booleanCase) =>
717
+ const isJsonType = (type) => type == OBJECT || type == ARRAY;
718
+ const encodeIfJson = (value) =>
719
+ isObject(value) || isArray(value) ? JSON_PREFIX + jsonString(value) : value;
720
+ const isEncodedJson = (value) => isString(value) && value[0] == JSON_PREFIX;
721
+ const decodeIfJson = (raw, _id, encoded) =>
722
+ !encoded && isEncodedJson(raw) ? jsonParse(slice(raw, 1)) : raw;
723
+ const getTypeCase = (
724
+ type,
725
+ stringCase,
726
+ numberCase,
727
+ booleanCase,
728
+ objectCase,
729
+ arrayCase,
730
+ ) =>
708
731
  type == STRING
709
732
  ? stringCase
710
733
  : type == NUMBER
711
734
  ? numberCase
712
735
  : type == BOOLEAN
713
736
  ? booleanCase
714
- : null;
737
+ : type == OBJECT
738
+ ? objectCase
739
+ : type == ARRAY
740
+ ? arrayCase
741
+ : null;
715
742
 
716
743
  const defaultSorter = (sortKey1, sortKey2) =>
717
744
  (sortKey1 ?? 0) < (sortKey2 ?? 0) ? -1 : 1;
@@ -812,15 +839,19 @@ const createStore = () => {
812
839
  return false;
813
840
  }
814
841
  const type = schema[TYPE];
815
- if (!isTypeStringOrBoolean(type) && type != NUMBER) {
842
+ if (!isTypeStringOrBoolean(type) && type != NUMBER && !isJsonType(type)) {
816
843
  return false;
817
844
  }
818
845
  const defaultValue = schema[DEFAULT];
819
846
  if (isNull(defaultValue) && !schema[ALLOW_NULL]) {
820
847
  return false;
821
848
  }
822
- if (!isNull(defaultValue) && getCellOrValueType(defaultValue) != type) {
823
- objDel(schema, DEFAULT);
849
+ if (!isNull(defaultValue)) {
850
+ if (getCellOrValueType(defaultValue) != type) {
851
+ objDel(schema, DEFAULT);
852
+ } else {
853
+ schema[DEFAULT] = encodeIfJson(defaultValue);
854
+ }
824
855
  }
825
856
  return true;
826
857
  };
@@ -860,20 +891,22 @@ const createStore = () => {
860
891
  ? cellSchema[ALLOW_NULL]
861
892
  ? cell
862
893
  : cellInvalid(tableId, rowId, cellId, cell, cellSchema[DEFAULT])
863
- : getCellOrValueType(cell) == cellSchema[TYPE]
864
- ? cell
865
- : cellInvalid(
866
- tableId,
867
- rowId,
868
- cellId,
869
- cell,
870
- cellSchema[DEFAULT],
871
- ),
894
+ : getCellOrValueType(cell) === cellSchema[TYPE]
895
+ ? encodeIfJson(cell)
896
+ : isJsonType(cellSchema[TYPE]) && isEncodedJson(cell)
897
+ ? cell
898
+ : cellInvalid(
899
+ tableId,
900
+ rowId,
901
+ cellId,
902
+ cell,
903
+ cellSchema[DEFAULT],
904
+ ),
872
905
  () => cellInvalid(tableId, rowId, cellId, cell),
873
906
  )
874
907
  : isUndefined(getCellOrValueType(cell))
875
908
  ? cellInvalid(tableId, rowId, cellId, cell)
876
- : cell;
909
+ : encodeIfJson(cell);
877
910
  const validateValues = (values, skipDefaults) =>
878
911
  objValidate(
879
912
  skipDefaults ? values : addDefaultsToValues(values),
@@ -897,14 +930,16 @@ const createStore = () => {
897
930
  ? valueSchema[ALLOW_NULL]
898
931
  ? value
899
932
  : valueInvalid(valueId, value, valueSchema[DEFAULT])
900
- : getCellOrValueType(value) == valueSchema[TYPE]
901
- ? value
902
- : valueInvalid(valueId, value, valueSchema[DEFAULT]),
933
+ : getCellOrValueType(value) === valueSchema[TYPE]
934
+ ? encodeIfJson(value)
935
+ : isJsonType(valueSchema[TYPE]) && isEncodedJson(value)
936
+ ? value
937
+ : valueInvalid(valueId, value, valueSchema[DEFAULT]),
903
938
  () => valueInvalid(valueId, value),
904
939
  )
905
940
  : isUndefined(getCellOrValueType(value))
906
941
  ? valueInvalid(valueId, value)
907
- : value;
942
+ : encodeIfJson(value);
908
943
  const addDefaultsToRow = (row, tableId, rowId) => {
909
944
  ifNotUndefined(
910
945
  mapGet(tablesSchemaRowCache, tableId),
@@ -1327,13 +1362,21 @@ const createStore = () => {
1327
1362
  const getCellChange = (tableId, rowId, cellId) =>
1328
1363
  ifNotUndefined(
1329
1364
  mapGet(mapGet(mapGet(changedCells, tableId), rowId), cellId),
1330
- ([oldCell, newCell]) => [true, oldCell, newCell],
1365
+ ([oldCell, newCell]) => [
1366
+ true,
1367
+ decodeIfJson(oldCell),
1368
+ decodeIfJson(newCell),
1369
+ ],
1331
1370
  () => [false, ...pairNew(getCell(tableId, rowId, cellId))],
1332
1371
  );
1333
1372
  const getValueChange = (valueId) =>
1334
1373
  ifNotUndefined(
1335
1374
  mapGet(changedValues, valueId),
1336
- ([oldValue, newValue]) => [true, oldValue, newValue],
1375
+ ([oldValue, newValue]) => [
1376
+ true,
1377
+ decodeIfJson(oldValue),
1378
+ decodeIfJson(newValue),
1379
+ ],
1337
1380
  () => [false, ...pairNew(getValue(valueId))],
1338
1381
  );
1339
1382
  const callInvalidCellListeners = (mutator) =>
@@ -1378,6 +1421,10 @@ const createStore = () => {
1378
1421
  return 1;
1379
1422
  }
1380
1423
  };
1424
+ const clonedChangedCells = (changedCells2) =>
1425
+ mapClone(changedCells2, (map) =>
1426
+ mapClone(map, (map2) => mapClone(map2, pairClone)),
1427
+ );
1381
1428
  const callTabularListenersForChanges = (mutator) => {
1382
1429
  const hasHasTablesListeners = !collIsEmpty(hasTablesListeners[mutator]);
1383
1430
  const hasSortedRowIdListeners = !collIsEmpty(
@@ -1409,9 +1456,7 @@ const createStore = () => {
1409
1456
  mapClone(changedRowCount),
1410
1457
  mapClone2(changedRowIds),
1411
1458
  mapClone3(changedCellIds),
1412
- mapClone(changedCells, (map) =>
1413
- mapClone(map, (map2) => mapClone(map2, pairClone)),
1414
- ),
1459
+ clonedChangedCells(changedCells),
1415
1460
  ]
1416
1461
  : [
1417
1462
  changedTableIds,
@@ -1507,8 +1552,8 @@ const createStore = () => {
1507
1552
  callListeners(
1508
1553
  cellListeners[mutator],
1509
1554
  [tableId, rowId, cellId],
1510
- newCell,
1511
- oldCell,
1555
+ decodeIfJson(newCell),
1556
+ decodeIfJson(oldCell),
1512
1557
  getCellChange,
1513
1558
  );
1514
1559
  tablesChanged = tableChanged = rowChanged = 1;
@@ -1564,8 +1609,8 @@ const createStore = () => {
1564
1609
  callListeners(
1565
1610
  valueListeners[mutator],
1566
1611
  [valueId],
1567
- newValue,
1568
- oldValue,
1612
+ decodeIfJson(newValue),
1613
+ decodeIfJson(oldValue),
1569
1614
  getValueChange,
1570
1615
  );
1571
1616
  valuesChanged = 1;
@@ -1602,10 +1647,42 @@ const createStore = () => {
1602
1647
  [getTableIds],
1603
1648
  );
1604
1649
  };
1650
+ const getTransactionChangesImpl = (encoded = false) => [
1651
+ mapToObj(
1652
+ changedCells,
1653
+ (table, tableId) =>
1654
+ mapGet(changedTableIds, tableId) === -1
1655
+ ? void 0
1656
+ : mapToObj(
1657
+ table,
1658
+ (row, rowId) =>
1659
+ mapGet(mapGet(changedRowIds, tableId), rowId) === -1
1660
+ ? void 0
1661
+ : mapToObj(
1662
+ row,
1663
+ ([, newCell]) =>
1664
+ decodeIfJson(newCell, EMPTY_STRING, encoded),
1665
+ (changedCell) => pairIsEqual(changedCell),
1666
+ ),
1667
+ collIsEmpty,
1668
+ objIsEmpty,
1669
+ ),
1670
+ collIsEmpty,
1671
+ objIsEmpty,
1672
+ ),
1673
+ mapToObj(
1674
+ changedValues,
1675
+ ([, newValue]) => decodeIfJson(newValue, EMPTY_STRING, encoded),
1676
+ (changedValue) => pairIsEqual(changedValue),
1677
+ ),
1678
+ 1,
1679
+ ];
1605
1680
  const getContent = () => [getTables(), getValues()];
1606
- const getTables = () => mapToObj3(tablesMap);
1681
+ const getEncodedContent = () => [mapToObj3(tablesMap), mapToObj(valuesMap)];
1682
+ const getTables = () => mapToObj3(tablesMap, decodeIfJson);
1607
1683
  const getTableIds = () => mapKeys(tablesMap);
1608
- const getTable = (tableId) => mapToObj2(mapGet(tablesMap, id(tableId)));
1684
+ const getTable = (tableId) =>
1685
+ mapToObj2(mapGet(tablesMap, id(tableId)), decodeIfJson);
1609
1686
  const getTableCellIds = (tableId) =>
1610
1687
  mapKeys(mapGet(tableCellIds, id(tableId)));
1611
1688
  const getRowCount = (tableId) => collSize(mapGet(tablesMap, id(tableId)));
@@ -1641,14 +1718,16 @@ const createStore = () => {
1641
1718
  ([, rowId]) => rowId,
1642
1719
  );
1643
1720
  const getRow = (tableId, rowId) =>
1644
- mapToObj(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)));
1721
+ mapToObj(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)), decodeIfJson);
1645
1722
  const getCellIds = (tableId, rowId) =>
1646
1723
  mapKeys(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)));
1647
1724
  const getCell = (tableId, rowId, cellId) =>
1648
- mapGet(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)), id(cellId));
1649
- const getValues = () => mapToObj(valuesMap);
1725
+ decodeIfJson(
1726
+ mapGet(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)), id(cellId)),
1727
+ );
1728
+ const getValues = () => mapToObj(valuesMap, decodeIfJson);
1650
1729
  const getValueIds = () => mapKeys(valuesMap);
1651
- const getValue = (valueId) => mapGet(valuesMap, id(valueId));
1730
+ const getValue = (valueId) => decodeIfJson(mapGet(valuesMap, id(valueId)));
1652
1731
  const hasTables = () => !collIsEmpty(tablesMap);
1653
1732
  const hasTable = (tableId) => collHas(tablesMap, id(tableId));
1654
1733
  const hasTableCell = (tableId, cellId) =>
@@ -1935,35 +2014,8 @@ const createStore = () => {
1935
2014
  }
1936
2015
  return store;
1937
2016
  };
1938
- const getTransactionChanges = () => [
1939
- mapToObj(
1940
- changedCells,
1941
- (table, tableId) =>
1942
- mapGet(changedTableIds, tableId) === -1
1943
- ? void 0
1944
- : mapToObj(
1945
- table,
1946
- (row, rowId) =>
1947
- mapGet(mapGet(changedRowIds, tableId), rowId) === -1
1948
- ? void 0
1949
- : mapToObj(
1950
- row,
1951
- ([, newCell]) => newCell,
1952
- (changedCell) => pairIsEqual(changedCell),
1953
- ),
1954
- collIsEmpty,
1955
- objIsEmpty,
1956
- ),
1957
- collIsEmpty,
1958
- objIsEmpty,
1959
- ),
1960
- mapToObj(
1961
- changedValues,
1962
- ([, newValue]) => newValue,
1963
- (changedValue) => pairIsEqual(changedValue),
1964
- ),
1965
- 1,
1966
- ];
2017
+ const getTransactionChanges = () => getTransactionChangesImpl();
2018
+ const getEncodedTransactionChanges = () => getTransactionChangesImpl(true);
1967
2019
  const getTransactionLog = () => [
1968
2020
  !collIsEmpty(changedCells),
1969
2021
  !collIsEmpty(changedValues),
@@ -1976,6 +2028,37 @@ const createStore = () => {
1976
2028
  mapToObj3(changedCellIds),
1977
2029
  mapToObj(changedValueIds),
1978
2030
  ];
2031
+ const doDidSetRows = () => {
2032
+ if (middleware[14]) {
2033
+ const changedCells2 = clonedChangedCells(changedCells);
2034
+ collForEach(changedCells2, (rows, tableId) =>
2035
+ collForEach(rows, (cells, rowId) => {
2036
+ if (
2037
+ !arrayEvery(
2038
+ collValues(cells),
2039
+ ([oldCell, newCell]) => oldCell === newCell,
2040
+ )
2041
+ ) {
2042
+ const newRow = getRow(tableId, rowId);
2043
+ const oldRow = objMerge(newRow);
2044
+ collForEach(cells, ([oldCell], cellId) =>
2045
+ isUndefined(oldCell)
2046
+ ? objDel(oldRow, cellId)
2047
+ : (oldRow[cellId] = oldCell),
2048
+ );
2049
+ const didSetRow = middleware[14](tableId, rowId, oldRow, newRow);
2050
+ if (!objIsEqual(didSetRow, newRow)) {
2051
+ const setOrDelRow = objMap(newRow, () => void 0);
2052
+ objMap(didSetRow, (cell, cellId) => (setOrDelRow[cellId] = cell));
2053
+ objMap(setOrDelRow, (cell, cellId) =>
2054
+ setOrDelCell(tableId, rowId, cellId, cell, true),
2055
+ );
2056
+ }
2057
+ }
2058
+ }),
2059
+ );
2060
+ }
2061
+ };
1979
2062
  const finishTransaction = (doRollback) => {
1980
2063
  if (transactions > 0) {
1981
2064
  transactions--;
@@ -1985,6 +2068,7 @@ const createStore = () => {
1985
2068
  callInvalidCellListeners(1);
1986
2069
  if (!collIsEmpty(changedCells)) {
1987
2070
  callTabularListenersForChanges(1);
2071
+ doDidSetRows();
1988
2072
  }
1989
2073
  callInvalidValueListeners(1);
1990
2074
  if (!collIsEmpty(changedValues)) {
@@ -2045,7 +2129,9 @@ const createStore = () => {
2045
2129
  tableCallback(tableId, (rowCallback) =>
2046
2130
  collForEach(tableMap, (rowMap, rowId) =>
2047
2131
  rowCallback(rowId, (cellCallback) =>
2048
- mapForEach(rowMap, cellCallback),
2132
+ mapForEach(rowMap, (cellId, cell) =>
2133
+ cellCallback(cellId, decodeIfJson(cell)),
2134
+ ),
2049
2135
  ),
2050
2136
  ),
2051
2137
  ),
@@ -2054,11 +2140,21 @@ const createStore = () => {
2054
2140
  mapForEach(mapGet(tableCellIds, id(tableId)), tableCellCallback);
2055
2141
  const forEachRow = (tableId, rowCallback) =>
2056
2142
  collForEach(mapGet(tablesMap, id(tableId)), (rowMap, rowId) =>
2057
- rowCallback(rowId, (cellCallback) => mapForEach(rowMap, cellCallback)),
2143
+ rowCallback(rowId, (cellCallback) =>
2144
+ mapForEach(rowMap, (cellId, cell) =>
2145
+ cellCallback(cellId, decodeIfJson(cell)),
2146
+ ),
2147
+ ),
2058
2148
  );
2059
2149
  const forEachCell = (tableId, rowId, cellCallback) =>
2060
- mapForEach(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)), cellCallback);
2061
- const forEachValue = (valueCallback) => mapForEach(valuesMap, valueCallback);
2150
+ mapForEach(
2151
+ mapGet(mapGet(tablesMap, id(tableId)), id(rowId)),
2152
+ (cellId, cell) => cellCallback(cellId, decodeIfJson(cell)),
2153
+ );
2154
+ const forEachValue = (valueCallback) =>
2155
+ mapForEach(valuesMap, (valueId, value) =>
2156
+ valueCallback(valueId, decodeIfJson(value)),
2157
+ );
2062
2158
  const addSortedRowIdsListener = (
2063
2159
  tableIdOrArgs,
2064
2160
  cellIdOrListener,
@@ -2143,6 +2239,7 @@ const createStore = () => {
2143
2239
  willDelValues,
2144
2240
  willDelValue,
2145
2241
  willApplyChanges,
2242
+ didSetRow,
2146
2243
  ) =>
2147
2244
  (middleware = [
2148
2245
  willSetContent,
@@ -2159,6 +2256,7 @@ const createStore = () => {
2159
2256
  willDelValues,
2160
2257
  willDelValue,
2161
2258
  willApplyChanges,
2259
+ didSetRow,
2162
2260
  ]);
2163
2261
  const setInternalListeners = (
2164
2262
  preStartTransaction,
@@ -2248,14 +2346,17 @@ const createStore = () => {
2248
2346
  delListener,
2249
2347
  getListenerStats,
2250
2348
  isMergeable: () => false,
2251
- // only used internally by other modules
2252
- createStore,
2253
- addListener,
2254
- callListeners,
2255
- setInternalListeners,
2256
- setMiddleware,
2257
- setOrDelCell,
2258
- setOrDelValue,
2349
+ _: [
2350
+ createStore,
2351
+ addListener,
2352
+ callListeners,
2353
+ setInternalListeners,
2354
+ setMiddleware,
2355
+ setOrDelCell,
2356
+ setOrDelValue,
2357
+ getEncodedContent,
2358
+ getEncodedTransactionChanges,
2359
+ ],
2259
2360
  };
2260
2361
  objMap(
2261
2362
  {
@@ -2439,6 +2540,10 @@ const IS_EQUALS = [
2439
2540
  (paramValues1, paramValues2) =>
2440
2541
  objIsEqual(paramValues1, paramValues2, arrayOrValueEqual),
2441
2542
  arrayOrValueEqual,
2543
+ (thing1, thing2) =>
2544
+ thing1 === thing2 ||
2545
+ ((isObject(thing1) || isArray(thing1)) &&
2546
+ jsonString(thing1) === jsonString(thing2)),
2442
2547
  ];
2443
2548
  const isEqual = (thing1, thing2) => thing1 === thing2;
2444
2549
  const addAndDelListener = (thing, listenable, ...args) => {
@@ -2973,12 +3078,20 @@ const EditableThing = ({
2973
3078
  const [stringThing, setStringThing] = useState();
2974
3079
  const [numberThing, setNumberThing] = useState();
2975
3080
  const [booleanThing, setBooleanThing] = useState();
3081
+ const [objectThingJson, setObjectThingJson] = useState(EMPTY_STRING);
3082
+ const [arrayThingJson, setArrayThingJson] = useState(EMPTY_STRING);
2976
3083
  if (currentThing !== thing) {
2977
3084
  setThingType(getCellOrValueType(thing));
2978
3085
  setCurrentThing(thing);
2979
- setStringThing(String(thing));
2980
- setNumberThing(Number(thing) || 0);
2981
- setBooleanThing(Boolean(thing));
3086
+ if (isObject(thing)) {
3087
+ setObjectThingJson(jsonString(thing));
3088
+ } else if (isArray(thing)) {
3089
+ setArrayThingJson(jsonString(thing));
3090
+ } else {
3091
+ setStringThing(String(thing));
3092
+ setNumberThing(Number(thing) || 0);
3093
+ setBooleanThing(Boolean(thing));
3094
+ }
2982
3095
  }
2983
3096
  const handleThingChange = useCallback(
2984
3097
  (thing2, setTypedThing) => {
@@ -2990,12 +3103,21 @@ const EditableThing = ({
2990
3103
  );
2991
3104
  const handleTypeChange = useCallback(() => {
2992
3105
  if (!hasSchema?.()) {
2993
- const nextType = getTypeCase(thingType, NUMBER, BOOLEAN, STRING);
3106
+ const nextType = getTypeCase(
3107
+ thingType,
3108
+ NUMBER,
3109
+ BOOLEAN,
3110
+ OBJECT,
3111
+ ARRAY,
3112
+ STRING,
3113
+ );
2994
3114
  const thing2 = getTypeCase(
2995
3115
  nextType,
2996
3116
  stringThing,
2997
3117
  numberThing,
2998
3118
  booleanThing,
3119
+ objectThingJson ? jsonParse(objectThingJson) : {},
3120
+ arrayThingJson ? jsonParse(arrayThingJson) : [],
2999
3121
  );
3000
3122
  setThingType(nextType);
3001
3123
  setCurrentThing(thing2);
@@ -3007,6 +3129,8 @@ const EditableThing = ({
3007
3129
  stringThing,
3008
3130
  numberThing,
3009
3131
  booleanThing,
3132
+ objectThingJson,
3133
+ arrayThingJson,
3010
3134
  thingType,
3011
3135
  ]);
3012
3136
  const widget = getTypeCase(
@@ -3058,6 +3182,46 @@ const EditableThing = ({
3058
3182
  },
3059
3183
  thingType,
3060
3184
  ),
3185
+ /* @__PURE__ */ jsx(
3186
+ 'textarea',
3187
+ {
3188
+ value: objectThingJson,
3189
+ onChange: useCallback(
3190
+ (event) => {
3191
+ const str = event[CURRENT_TARGET][_VALUE];
3192
+ setObjectThingJson(str);
3193
+ try {
3194
+ const parsed = jsonParse(str);
3195
+ if (isObject(parsed)) {
3196
+ onThingChange(parsed);
3197
+ }
3198
+ } catch {}
3199
+ },
3200
+ [onThingChange],
3201
+ ),
3202
+ },
3203
+ thingType,
3204
+ ),
3205
+ /* @__PURE__ */ jsx(
3206
+ 'textarea',
3207
+ {
3208
+ value: arrayThingJson,
3209
+ onChange: useCallback(
3210
+ (event) => {
3211
+ const str = event[CURRENT_TARGET][_VALUE];
3212
+ setArrayThingJson(str);
3213
+ try {
3214
+ const parsed = jsonParse(str);
3215
+ if (isArray(parsed)) {
3216
+ onThingChange(parsed);
3217
+ }
3218
+ } catch {}
3219
+ },
3220
+ [onThingChange],
3221
+ ),
3222
+ },
3223
+ thingType,
3224
+ ),
3061
3225
  );
3062
3226
  return /* @__PURE__ */ jsxs('div', {
3063
3227
  className,