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
@@ -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);
@@ -105,6 +108,14 @@ const structuredClone = GLOBAL.structuredClone;
105
108
  const errorNew = (message) => {
106
109
  throw new Error(message);
107
110
  };
111
+ const tryReturn = (tryF, catchReturn) => {
112
+ try {
113
+ return tryF();
114
+ } catch {
115
+ /* istanbul ignore next */
116
+ return catchReturn;
117
+ }
118
+ };
108
119
  const tryCatch = async (action, then1, then2) => {
109
120
  try {
110
121
  return await action();
@@ -152,7 +163,6 @@ const isObject = (obj) =>
152
163
  const objIds = object.keys;
153
164
  const objFreeze = object.freeze;
154
165
  const objNew = (entries = []) => object.fromEntries(entries);
155
- const objMerge = (...objs) => object.assign({}, ...objs);
156
166
  const objGet = (obj, id) => ifNotUndefined(obj, (obj2) => obj2[id]);
157
167
  const objHas = (obj, id) => id in obj;
158
168
  const objDel = (obj, id) => {
@@ -420,8 +430,8 @@ const getStoreFunctions = (
420
430
  persist != 1 /* StoreOnly */ && store.isMergeable()
421
431
  ? [
422
432
  1,
423
- store.getMergeableContent,
424
- () => store.getTransactionMergeableChanges(!isSynchronizer),
433
+ store.__[1],
434
+ () => store.__[2](!isSynchronizer),
425
435
  ([[changedTables], [changedValues]]) =>
426
436
  !objIsEmpty(changedTables) || !objIsEmpty(changedValues),
427
437
  store.setDefaultContent,
@@ -429,8 +439,8 @@ const getStoreFunctions = (
429
439
  : persist != 2 /* MergeableStoreOnly */
430
440
  ? [
431
441
  0,
432
- store.getContent,
433
- store.getTransactionChanges,
442
+ store._[7],
443
+ store._[8],
434
444
  ([changedTables, changedValues]) =>
435
445
  !objIsEmpty(changedTables) || !objIsEmpty(changedValues),
436
446
  store.setContent,
@@ -495,7 +505,7 @@ const createCustomPersister = (
495
505
  : store.setContent)(contentOrChanges);
496
506
  };
497
507
  const saveAfterMutated = async () => {
498
- if (isAutoSaving() && store.hadMutated?.()) {
508
+ if (isAutoSaving() && store.__?.[0]?.()) {
499
509
  await save();
500
510
  }
501
511
  };
@@ -699,20 +709,43 @@ const getCellOrValueType = (cellOrValue) => {
699
709
  if (isNull(cellOrValue)) {
700
710
  return NULL;
701
711
  }
712
+ if (isArray(cellOrValue)) {
713
+ return ARRAY;
714
+ }
715
+ if (isObject(cellOrValue)) {
716
+ return OBJECT;
717
+ }
702
718
  const type = getTypeOf(cellOrValue);
703
719
  return isTypeStringOrBoolean(type) ||
704
720
  (type == NUMBER && isFiniteNumber(cellOrValue))
705
721
  ? type
706
722
  : void 0;
707
723
  };
708
- const getTypeCase = (type, stringCase, numberCase, booleanCase) =>
724
+ const isJsonType = (type) => type == OBJECT || type == ARRAY;
725
+ const encodeIfJson = (value) =>
726
+ isObject(value) || isArray(value) ? JSON_PREFIX + jsonString(value) : value;
727
+ const isEncodedJson = (value) => isString(value) && value[0] == JSON_PREFIX;
728
+ const decodeIfJson = (raw, _id, encoded) =>
729
+ !encoded && isEncodedJson(raw) ? jsonParse(slice(raw, 1)) : raw;
730
+ const getTypeCase = (
731
+ type,
732
+ stringCase,
733
+ numberCase,
734
+ booleanCase,
735
+ objectCase,
736
+ arrayCase,
737
+ ) =>
709
738
  type == STRING
710
739
  ? stringCase
711
740
  : type == NUMBER
712
741
  ? numberCase
713
742
  : type == BOOLEAN
714
743
  ? booleanCase
715
- : null;
744
+ : type == OBJECT
745
+ ? objectCase
746
+ : type == ARRAY
747
+ ? arrayCase
748
+ : null;
716
749
 
717
750
  const defaultSorter = (sortKey1, sortKey2) =>
718
751
  (sortKey1 ?? 0) < (sortKey2 ?? 0) ? -1 : 1;
@@ -813,15 +846,19 @@ const createStore = () => {
813
846
  return false;
814
847
  }
815
848
  const type = schema[TYPE];
816
- if (!isTypeStringOrBoolean(type) && type != NUMBER) {
849
+ if (!isTypeStringOrBoolean(type) && type != NUMBER && !isJsonType(type)) {
817
850
  return false;
818
851
  }
819
852
  const defaultValue = schema[DEFAULT];
820
853
  if (isNull(defaultValue) && !schema[ALLOW_NULL]) {
821
854
  return false;
822
855
  }
823
- if (!isNull(defaultValue) && getCellOrValueType(defaultValue) != type) {
824
- objDel(schema, DEFAULT);
856
+ if (!isNull(defaultValue)) {
857
+ if (getCellOrValueType(defaultValue) != type) {
858
+ objDel(schema, DEFAULT);
859
+ } else {
860
+ schema[DEFAULT] = encodeIfJson(defaultValue);
861
+ }
825
862
  }
826
863
  return true;
827
864
  };
@@ -861,20 +898,22 @@ const createStore = () => {
861
898
  ? cellSchema[ALLOW_NULL]
862
899
  ? cell
863
900
  : cellInvalid(tableId, rowId, cellId, cell, cellSchema[DEFAULT])
864
- : getCellOrValueType(cell) == cellSchema[TYPE]
865
- ? cell
866
- : cellInvalid(
867
- tableId,
868
- rowId,
869
- cellId,
870
- cell,
871
- cellSchema[DEFAULT],
872
- ),
901
+ : getCellOrValueType(cell) === cellSchema[TYPE]
902
+ ? encodeIfJson(cell)
903
+ : isJsonType(cellSchema[TYPE]) && isEncodedJson(cell)
904
+ ? cell
905
+ : cellInvalid(
906
+ tableId,
907
+ rowId,
908
+ cellId,
909
+ cell,
910
+ cellSchema[DEFAULT],
911
+ ),
873
912
  () => cellInvalid(tableId, rowId, cellId, cell),
874
913
  )
875
914
  : isUndefined(getCellOrValueType(cell))
876
915
  ? cellInvalid(tableId, rowId, cellId, cell)
877
- : cell;
916
+ : encodeIfJson(cell);
878
917
  const validateValues = (values, skipDefaults) =>
879
918
  objValidate(
880
919
  skipDefaults ? values : addDefaultsToValues(values),
@@ -898,14 +937,16 @@ const createStore = () => {
898
937
  ? valueSchema[ALLOW_NULL]
899
938
  ? value
900
939
  : valueInvalid(valueId, value, valueSchema[DEFAULT])
901
- : getCellOrValueType(value) == valueSchema[TYPE]
902
- ? value
903
- : valueInvalid(valueId, value, valueSchema[DEFAULT]),
940
+ : getCellOrValueType(value) === valueSchema[TYPE]
941
+ ? encodeIfJson(value)
942
+ : isJsonType(valueSchema[TYPE]) && isEncodedJson(value)
943
+ ? value
944
+ : valueInvalid(valueId, value, valueSchema[DEFAULT]),
904
945
  () => valueInvalid(valueId, value),
905
946
  )
906
947
  : isUndefined(getCellOrValueType(value))
907
948
  ? valueInvalid(valueId, value)
908
- : value;
949
+ : encodeIfJson(value);
909
950
  const addDefaultsToRow = (row, tableId, rowId) => {
910
951
  ifNotUndefined(
911
952
  mapGet(tablesSchemaRowCache, tableId),
@@ -985,10 +1026,24 @@ const createStore = () => {
985
1026
  );
986
1027
  const setOrDelTables = (tables) =>
987
1028
  objIsEmpty(tables) ? delTables() : setTables(tables);
988
- const setOrDelCell = (tableId, rowId, cellId, cell, skipMiddleware) =>
1029
+ const setOrDelCell = (
1030
+ tableId,
1031
+ rowId,
1032
+ cellId,
1033
+ cell,
1034
+ skipMiddleware,
1035
+ skipRowMiddleware,
1036
+ ) =>
989
1037
  isUndefined(cell)
990
1038
  ? delCell(tableId, rowId, cellId, true, skipMiddleware)
991
- : setCell(tableId, rowId, cellId, cell, skipMiddleware);
1039
+ : setCell(
1040
+ tableId,
1041
+ rowId,
1042
+ cellId,
1043
+ cell,
1044
+ skipMiddleware,
1045
+ skipRowMiddleware,
1046
+ );
992
1047
  const setOrDelValues = (values) =>
993
1048
  objIsEmpty(values) ? delValues() : setValues(values);
994
1049
  const setOrDelValue = (valueId, value, skipMiddleware) =>
@@ -1088,6 +1143,30 @@ const createStore = () => {
1088
1143
  ),
1089
1144
  objIsEqual,
1090
1145
  );
1146
+ const applyRowDirectly = (tableId, tableMap, rowId, row, skipMiddleware) => {
1147
+ mapMatch(
1148
+ mapEnsure(tableMap, rowId, () => {
1149
+ rowIdsChanged(tableId, rowId, 1);
1150
+ return mapNew();
1151
+ }),
1152
+ row,
1153
+ (rowMap, cellId, cell) =>
1154
+ ifNotUndefined(
1155
+ getValidatedCell(tableId, rowId, cellId, cell),
1156
+ (validCell) =>
1157
+ setValidCell(
1158
+ tableId,
1159
+ rowId,
1160
+ rowMap,
1161
+ cellId,
1162
+ validCell,
1163
+ skipMiddleware,
1164
+ ),
1165
+ ),
1166
+ (rowMap, cellId) =>
1167
+ delValidCell(tableId, tableMap, rowId, rowMap, cellId, true),
1168
+ );
1169
+ };
1091
1170
  const setValidCell = (tableId, rowId, rowMap, cellId, cell, skipMiddleware) =>
1092
1171
  ifTransformed(
1093
1172
  cell,
@@ -1328,13 +1407,21 @@ const createStore = () => {
1328
1407
  const getCellChange = (tableId, rowId, cellId) =>
1329
1408
  ifNotUndefined(
1330
1409
  mapGet(mapGet(mapGet(changedCells, tableId), rowId), cellId),
1331
- ([oldCell, newCell]) => [true, oldCell, newCell],
1410
+ ([oldCell, newCell]) => [
1411
+ true,
1412
+ decodeIfJson(oldCell),
1413
+ decodeIfJson(newCell),
1414
+ ],
1332
1415
  () => [false, ...pairNew(getCell(tableId, rowId, cellId))],
1333
1416
  );
1334
1417
  const getValueChange = (valueId) =>
1335
1418
  ifNotUndefined(
1336
1419
  mapGet(changedValues, valueId),
1337
- ([oldValue, newValue]) => [true, oldValue, newValue],
1420
+ ([oldValue, newValue]) => [
1421
+ true,
1422
+ decodeIfJson(oldValue),
1423
+ decodeIfJson(newValue),
1424
+ ],
1338
1425
  () => [false, ...pairNew(getValue(valueId))],
1339
1426
  );
1340
1427
  const callInvalidCellListeners = (mutator) =>
@@ -1510,8 +1597,8 @@ const createStore = () => {
1510
1597
  callListeners(
1511
1598
  cellListeners[mutator],
1512
1599
  [tableId, rowId, cellId],
1513
- newCell,
1514
- oldCell,
1600
+ decodeIfJson(newCell),
1601
+ decodeIfJson(oldCell),
1515
1602
  getCellChange,
1516
1603
  );
1517
1604
  tablesChanged = tableChanged = rowChanged = 1;
@@ -1567,8 +1654,8 @@ const createStore = () => {
1567
1654
  callListeners(
1568
1655
  valueListeners[mutator],
1569
1656
  [valueId],
1570
- newValue,
1571
- oldValue,
1657
+ decodeIfJson(newValue),
1658
+ decodeIfJson(oldValue),
1572
1659
  getValueChange,
1573
1660
  );
1574
1661
  valuesChanged = 1;
@@ -1605,10 +1692,42 @@ const createStore = () => {
1605
1692
  [getTableIds],
1606
1693
  );
1607
1694
  };
1695
+ const getTransactionChangesImpl = (encoded = false) => [
1696
+ mapToObj(
1697
+ changedCells,
1698
+ (table, tableId) =>
1699
+ mapGet(changedTableIds, tableId) === -1
1700
+ ? void 0
1701
+ : mapToObj(
1702
+ table,
1703
+ (row, rowId) =>
1704
+ mapGet(mapGet(changedRowIds, tableId), rowId) === -1
1705
+ ? void 0
1706
+ : mapToObj(
1707
+ row,
1708
+ ([, newCell]) =>
1709
+ decodeIfJson(newCell, EMPTY_STRING, encoded),
1710
+ (changedCell) => pairIsEqual(changedCell),
1711
+ ),
1712
+ collIsEmpty,
1713
+ objIsEmpty,
1714
+ ),
1715
+ collIsEmpty,
1716
+ objIsEmpty,
1717
+ ),
1718
+ mapToObj(
1719
+ changedValues,
1720
+ ([, newValue]) => decodeIfJson(newValue, EMPTY_STRING, encoded),
1721
+ (changedValue) => pairIsEqual(changedValue),
1722
+ ),
1723
+ 1,
1724
+ ];
1608
1725
  const getContent = () => [getTables(), getValues()];
1609
- const getTables = () => mapToObj3(tablesMap);
1726
+ const getEncodedContent = () => [mapToObj3(tablesMap), mapToObj(valuesMap)];
1727
+ const getTables = () => mapToObj3(tablesMap, decodeIfJson);
1610
1728
  const getTableIds = () => mapKeys(tablesMap);
1611
- const getTable = (tableId) => mapToObj2(mapGet(tablesMap, id(tableId)));
1729
+ const getTable = (tableId) =>
1730
+ mapToObj2(mapGet(tablesMap, id(tableId)), decodeIfJson);
1612
1731
  const getTableCellIds = (tableId) =>
1613
1732
  mapKeys(mapGet(tableCellIds, id(tableId)));
1614
1733
  const getRowCount = (tableId) => collSize(mapGet(tablesMap, id(tableId)));
@@ -1644,14 +1763,16 @@ const createStore = () => {
1644
1763
  ([, rowId]) => rowId,
1645
1764
  );
1646
1765
  const getRow = (tableId, rowId) =>
1647
- mapToObj(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)));
1766
+ mapToObj(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)), decodeIfJson);
1648
1767
  const getCellIds = (tableId, rowId) =>
1649
1768
  mapKeys(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)));
1650
1769
  const getCell = (tableId, rowId, cellId) =>
1651
- mapGet(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)), id(cellId));
1652
- const getValues = () => mapToObj(valuesMap);
1770
+ decodeIfJson(
1771
+ mapGet(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)), id(cellId)),
1772
+ );
1773
+ const getValues = () => mapToObj(valuesMap, decodeIfJson);
1653
1774
  const getValueIds = () => mapKeys(valuesMap);
1654
- const getValue = (valueId) => mapGet(valuesMap, id(valueId));
1775
+ const getValue = (valueId) => decodeIfJson(mapGet(valuesMap, id(valueId)));
1655
1776
  const hasTables = () => !collIsEmpty(tablesMap);
1656
1777
  const hasTable = (tableId) => collHas(tablesMap, id(tableId));
1657
1778
  const hasTableCell = (tableId, cellId) =>
@@ -1722,7 +1843,14 @@ const createStore = () => {
1722
1843
  tableId,
1723
1844
  rowId,
1724
1845
  );
1725
- const setCell = (tableId, rowId, cellId, cell, skipMiddleware) =>
1846
+ const setCell = (
1847
+ tableId,
1848
+ rowId,
1849
+ cellId,
1850
+ cell,
1851
+ skipMiddleware,
1852
+ skipRowMiddleware,
1853
+ ) =>
1726
1854
  fluentTransaction(
1727
1855
  (tableId2, rowId2, cellId2) =>
1728
1856
  ifNotUndefined(
@@ -1732,15 +1860,47 @@ const createStore = () => {
1732
1860
  cellId2,
1733
1861
  isFunction(cell) ? cell(getCell(tableId2, rowId2, cellId2)) : cell,
1734
1862
  ),
1735
- (validCell) =>
1736
- setCellIntoNewRow(
1737
- tableId2,
1738
- getOrCreateTable(tableId2),
1739
- rowId2,
1740
- cellId2,
1741
- validCell,
1742
- skipMiddleware,
1743
- ),
1863
+ (validCell) => {
1864
+ const tableMap = getOrCreateTable(tableId2);
1865
+ ifNotUndefined(
1866
+ skipMiddleware || skipRowMiddleware || !middleware[14]?.()
1867
+ ? void 0
1868
+ : middleware[3],
1869
+ (willSetRow) => {
1870
+ const existingRowMap = mapGet(tableMap, rowId2);
1871
+ const prospectiveRow = {
1872
+ ...(existingRowMap ? mapToObj(existingRowMap) : {}),
1873
+ [cellId2]: validCell,
1874
+ };
1875
+ ifNotUndefined(
1876
+ whileMutating(() =>
1877
+ willSetRow(
1878
+ tableId2,
1879
+ rowId2,
1880
+ structuredClone(prospectiveRow),
1881
+ ),
1882
+ ),
1883
+ (row) =>
1884
+ applyRowDirectly(
1885
+ tableId2,
1886
+ tableMap,
1887
+ rowId2,
1888
+ row,
1889
+ skipMiddleware,
1890
+ ),
1891
+ );
1892
+ },
1893
+ () =>
1894
+ setCellIntoNewRow(
1895
+ tableId2,
1896
+ tableMap,
1897
+ rowId2,
1898
+ cellId2,
1899
+ validCell,
1900
+ skipMiddleware,
1901
+ ),
1902
+ );
1903
+ },
1744
1904
  ),
1745
1905
  tableId,
1746
1906
  rowId,
@@ -1789,7 +1949,14 @@ const createStore = () => {
1789
1949
  isUndefined(row)
1790
1950
  ? delRow(tableId, rowId)
1791
1951
  : objMap(row, (cell, cellId) =>
1792
- setOrDelCell(tableId, rowId, cellId, cell),
1952
+ setOrDelCell(
1953
+ tableId,
1954
+ rowId,
1955
+ cellId,
1956
+ cell,
1957
+ void 0,
1958
+ true,
1959
+ ),
1793
1960
  ),
1794
1961
  ),
1795
1962
  );
@@ -1938,35 +2105,8 @@ const createStore = () => {
1938
2105
  }
1939
2106
  return store;
1940
2107
  };
1941
- const getTransactionChanges = () => [
1942
- mapToObj(
1943
- changedCells,
1944
- (table, tableId) =>
1945
- mapGet(changedTableIds, tableId) === -1
1946
- ? void 0
1947
- : mapToObj(
1948
- table,
1949
- (row, rowId) =>
1950
- mapGet(mapGet(changedRowIds, tableId), rowId) === -1
1951
- ? void 0
1952
- : mapToObj(
1953
- row,
1954
- ([, newCell]) => newCell,
1955
- (changedCell) => pairIsEqual(changedCell),
1956
- ),
1957
- collIsEmpty,
1958
- objIsEmpty,
1959
- ),
1960
- collIsEmpty,
1961
- objIsEmpty,
1962
- ),
1963
- mapToObj(
1964
- changedValues,
1965
- ([, newValue]) => newValue,
1966
- (changedValue) => pairIsEqual(changedValue),
1967
- ),
1968
- 1,
1969
- ];
2108
+ const getTransactionChanges = () => getTransactionChangesImpl();
2109
+ const getEncodedTransactionChanges = () => getTransactionChangesImpl(true);
1970
2110
  const getTransactionLog = () => [
1971
2111
  !collIsEmpty(changedCells),
1972
2112
  !collIsEmpty(changedValues),
@@ -1979,37 +2119,6 @@ const createStore = () => {
1979
2119
  mapToObj3(changedCellIds),
1980
2120
  mapToObj(changedValueIds),
1981
2121
  ];
1982
- const doDidSetRows = () => {
1983
- if (middleware[14]) {
1984
- const changedCells2 = clonedChangedCells(changedCells);
1985
- collForEach(changedCells2, (rows, tableId) =>
1986
- collForEach(rows, (cells, rowId) => {
1987
- if (
1988
- !arrayEvery(
1989
- collValues(cells),
1990
- ([oldCell, newCell]) => oldCell === newCell,
1991
- )
1992
- ) {
1993
- const newRow = getRow(tableId, rowId);
1994
- const oldRow = objMerge(newRow);
1995
- collForEach(cells, ([oldCell], cellId) =>
1996
- isUndefined(oldCell)
1997
- ? objDel(oldRow, cellId)
1998
- : (oldRow[cellId] = oldCell),
1999
- );
2000
- const didSetRow = middleware[14](tableId, rowId, oldRow, newRow);
2001
- if (!objIsEqual(didSetRow, newRow)) {
2002
- const setOrDelRow = objMap(newRow, () => void 0);
2003
- objMap(didSetRow, (cell, cellId) => (setOrDelRow[cellId] = cell));
2004
- objMap(setOrDelRow, (cell, cellId) =>
2005
- setOrDelCell(tableId, rowId, cellId, cell, true),
2006
- );
2007
- }
2008
- }
2009
- }),
2010
- );
2011
- }
2012
- };
2013
2122
  const finishTransaction = (doRollback) => {
2014
2123
  if (transactions > 0) {
2015
2124
  transactions--;
@@ -2019,7 +2128,6 @@ const createStore = () => {
2019
2128
  callInvalidCellListeners(1);
2020
2129
  if (!collIsEmpty(changedCells)) {
2021
2130
  callTabularListenersForChanges(1);
2022
- doDidSetRows();
2023
2131
  }
2024
2132
  callInvalidValueListeners(1);
2025
2133
  if (!collIsEmpty(changedValues)) {
@@ -2080,7 +2188,9 @@ const createStore = () => {
2080
2188
  tableCallback(tableId, (rowCallback) =>
2081
2189
  collForEach(tableMap, (rowMap, rowId) =>
2082
2190
  rowCallback(rowId, (cellCallback) =>
2083
- mapForEach(rowMap, cellCallback),
2191
+ mapForEach(rowMap, (cellId, cell) =>
2192
+ cellCallback(cellId, decodeIfJson(cell)),
2193
+ ),
2084
2194
  ),
2085
2195
  ),
2086
2196
  ),
@@ -2089,11 +2199,21 @@ const createStore = () => {
2089
2199
  mapForEach(mapGet(tableCellIds, id(tableId)), tableCellCallback);
2090
2200
  const forEachRow = (tableId, rowCallback) =>
2091
2201
  collForEach(mapGet(tablesMap, id(tableId)), (rowMap, rowId) =>
2092
- rowCallback(rowId, (cellCallback) => mapForEach(rowMap, cellCallback)),
2202
+ rowCallback(rowId, (cellCallback) =>
2203
+ mapForEach(rowMap, (cellId, cell) =>
2204
+ cellCallback(cellId, decodeIfJson(cell)),
2205
+ ),
2206
+ ),
2093
2207
  );
2094
2208
  const forEachCell = (tableId, rowId, cellCallback) =>
2095
- mapForEach(mapGet(mapGet(tablesMap, id(tableId)), id(rowId)), cellCallback);
2096
- const forEachValue = (valueCallback) => mapForEach(valuesMap, valueCallback);
2209
+ mapForEach(
2210
+ mapGet(mapGet(tablesMap, id(tableId)), id(rowId)),
2211
+ (cellId, cell) => cellCallback(cellId, decodeIfJson(cell)),
2212
+ );
2213
+ const forEachValue = (valueCallback) =>
2214
+ mapForEach(valuesMap, (valueId, value) =>
2215
+ valueCallback(valueId, decodeIfJson(value)),
2216
+ );
2097
2217
  const addSortedRowIdsListener = (
2098
2218
  tableIdOrArgs,
2099
2219
  cellIdOrListener,
@@ -2178,7 +2298,7 @@ const createStore = () => {
2178
2298
  willDelValues,
2179
2299
  willDelValue,
2180
2300
  willApplyChanges,
2181
- didSetRow,
2301
+ hasWillSetRowCallbacks,
2182
2302
  ) =>
2183
2303
  (middleware = [
2184
2304
  willSetContent,
@@ -2195,7 +2315,7 @@ const createStore = () => {
2195
2315
  willDelValues,
2196
2316
  willDelValue,
2197
2317
  willApplyChanges,
2198
- didSetRow,
2318
+ hasWillSetRowCallbacks,
2199
2319
  ]);
2200
2320
  const setInternalListeners = (
2201
2321
  preStartTransaction,
@@ -2285,14 +2405,17 @@ const createStore = () => {
2285
2405
  delListener,
2286
2406
  getListenerStats,
2287
2407
  isMergeable: () => false,
2288
- // only used internally by other modules
2289
- createStore,
2290
- addListener,
2291
- callListeners,
2292
- setInternalListeners,
2293
- setMiddleware,
2294
- setOrDelCell,
2295
- setOrDelValue,
2408
+ _: [
2409
+ createStore,
2410
+ addListener,
2411
+ callListeners,
2412
+ setInternalListeners,
2413
+ setMiddleware,
2414
+ setOrDelCell,
2415
+ setOrDelValue,
2416
+ getEncodedContent,
2417
+ getEncodedTransactionChanges,
2418
+ ],
2296
2419
  };
2297
2420
  objMap(
2298
2421
  {
@@ -2476,6 +2599,10 @@ const IS_EQUALS = [
2476
2599
  (paramValues1, paramValues2) =>
2477
2600
  objIsEqual(paramValues1, paramValues2, arrayOrValueEqual),
2478
2601
  arrayOrValueEqual,
2602
+ (thing1, thing2) =>
2603
+ thing1 === thing2 ||
2604
+ ((isObject(thing1) || isArray(thing1)) &&
2605
+ jsonString(thing1) === jsonString(thing2)),
2479
2606
  ];
2480
2607
  const isEqual = (thing1, thing2) => thing1 === thing2;
2481
2608
  const addAndDelListener = (thing, listenable, ...args) => {
@@ -3010,12 +3137,22 @@ const EditableThing = ({
3010
3137
  const [stringThing, setStringThing] = useState();
3011
3138
  const [numberThing, setNumberThing] = useState();
3012
3139
  const [booleanThing, setBooleanThing] = useState();
3140
+ const [objectThing, setObjectThing] = useState('{}');
3141
+ const [arrayThing, setArrayThing] = useState('[]');
3142
+ const [objectClassName, setObjectClassName] = useState('');
3143
+ const [arrayClassName, setArrayClassName] = useState('');
3013
3144
  if (currentThing !== thing) {
3014
3145
  setThingType(getCellOrValueType(thing));
3015
3146
  setCurrentThing(thing);
3016
- setStringThing(String(thing));
3017
- setNumberThing(Number(thing) || 0);
3018
- setBooleanThing(Boolean(thing));
3147
+ if (isObject(thing)) {
3148
+ setObjectThing(jsonString(thing));
3149
+ } else if (isArray(thing)) {
3150
+ setArrayThing(jsonString(thing));
3151
+ } else {
3152
+ setStringThing(String(thing));
3153
+ setNumberThing(Number(thing) || 0);
3154
+ setBooleanThing(Boolean(thing));
3155
+ }
3019
3156
  }
3020
3157
  const handleThingChange = useCallback(
3021
3158
  (thing2, setTypedThing) => {
@@ -3025,14 +3162,39 @@ const EditableThing = ({
3025
3162
  },
3026
3163
  [onThingChange],
3027
3164
  );
3165
+ const handleJsonThingChange = useCallback(
3166
+ (value, setTypedThing, isThing, setTypedClassName) => {
3167
+ setTypedThing(value);
3168
+ try {
3169
+ const object = jsonParse(value);
3170
+ if (isThing(object)) {
3171
+ setCurrentThing(object);
3172
+ onThingChange(object);
3173
+ setTypedClassName('');
3174
+ }
3175
+ } catch {
3176
+ setTypedClassName('invalid');
3177
+ }
3178
+ },
3179
+ [onThingChange],
3180
+ );
3028
3181
  const handleTypeChange = useCallback(() => {
3029
3182
  if (!hasSchema?.()) {
3030
- const nextType = getTypeCase(thingType, NUMBER, BOOLEAN, STRING);
3183
+ const nextType = getTypeCase(
3184
+ thingType,
3185
+ NUMBER,
3186
+ BOOLEAN,
3187
+ OBJECT,
3188
+ ARRAY,
3189
+ STRING,
3190
+ );
3031
3191
  const thing2 = getTypeCase(
3032
3192
  nextType,
3033
3193
  stringThing,
3034
3194
  numberThing,
3035
3195
  booleanThing,
3196
+ tryReturn(() => jsonParse(objectThing), {}),
3197
+ tryReturn(() => jsonParse(arrayThing), []),
3036
3198
  );
3037
3199
  setThingType(nextType);
3038
3200
  setCurrentThing(thing2);
@@ -3044,6 +3206,8 @@ const EditableThing = ({
3044
3206
  stringThing,
3045
3207
  numberThing,
3046
3208
  booleanThing,
3209
+ objectThing,
3210
+ arrayThing,
3047
3211
  thingType,
3048
3212
  ]);
3049
3213
  const widget = getTypeCase(
@@ -3095,6 +3259,42 @@ const EditableThing = ({
3095
3259
  },
3096
3260
  thingType,
3097
3261
  ),
3262
+ /* @__PURE__ */ jsx(
3263
+ 'input',
3264
+ {
3265
+ value: objectThing,
3266
+ className: objectClassName,
3267
+ onChange: useCallback(
3268
+ (event) =>
3269
+ handleJsonThingChange(
3270
+ event[CURRENT_TARGET][_VALUE],
3271
+ setObjectThing,
3272
+ isObject,
3273
+ setObjectClassName,
3274
+ ),
3275
+ [handleJsonThingChange],
3276
+ ),
3277
+ },
3278
+ thingType,
3279
+ ),
3280
+ /* @__PURE__ */ jsx(
3281
+ 'input',
3282
+ {
3283
+ value: arrayThing,
3284
+ className: arrayClassName,
3285
+ onChange: useCallback(
3286
+ (event) =>
3287
+ handleJsonThingChange(
3288
+ event[CURRENT_TARGET][_VALUE],
3289
+ setArrayThing,
3290
+ isArray,
3291
+ setArrayClassName,
3292
+ ),
3293
+ [handleJsonThingChange],
3294
+ ),
3295
+ },
3296
+ thingType,
3297
+ ),
3098
3298
  );
3099
3299
  return /* @__PURE__ */ jsxs('div', {
3100
3300
  className,