tinybase 7.0.0-beta.2 → 7.0.0

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 (292) hide show
  1. package/@types/common/index.d.ts +1 -1
  2. package/@types/mergeable-store/index.d.ts +1 -1
  3. package/@types/mergeable-store/with-schemas/index.d.ts +1 -1
  4. package/@types/persisters/persister-cr-sqlite-wasm/index.d.ts +4 -0
  5. package/@types/persisters/persister-cr-sqlite-wasm/with-schemas/index.d.ts +4 -0
  6. package/@types/persisters/persister-durable-object-sql-storage/index.d.ts +4 -0
  7. package/@types/persisters/persister-durable-object-sql-storage/with-schemas/index.d.ts +4 -0
  8. package/@types/persisters/persister-electric-sql/index.d.ts +4 -0
  9. package/@types/persisters/persister-electric-sql/with-schemas/index.d.ts +4 -0
  10. package/@types/persisters/persister-expo-sqlite/index.d.ts +4 -0
  11. package/@types/persisters/persister-expo-sqlite/with-schemas/index.d.ts +4 -0
  12. package/@types/persisters/persister-libsql/index.d.ts +4 -0
  13. package/@types/persisters/persister-libsql/with-schemas/index.d.ts +4 -0
  14. package/@types/persisters/persister-pglite/index.d.ts +5 -1
  15. package/@types/persisters/persister-pglite/with-schemas/index.d.ts +5 -1
  16. package/@types/persisters/persister-postgres/index.d.ts +4 -0
  17. package/@types/persisters/persister-postgres/with-schemas/index.d.ts +4 -0
  18. package/@types/persisters/persister-powersync/index.d.ts +4 -0
  19. package/@types/persisters/persister-powersync/with-schemas/index.d.ts +4 -0
  20. package/@types/persisters/persister-react-native-sqlite/index.d.ts +4 -0
  21. package/@types/persisters/persister-react-native-sqlite/with-schemas/index.d.ts +4 -0
  22. package/@types/persisters/persister-sqlite-bun/index.d.ts +4 -0
  23. package/@types/persisters/persister-sqlite-bun/with-schemas/index.d.ts +4 -0
  24. package/@types/persisters/persister-sqlite-wasm/index.d.ts +4 -0
  25. package/@types/persisters/persister-sqlite-wasm/with-schemas/index.d.ts +4 -0
  26. package/@types/persisters/persister-sqlite3/index.d.ts +4 -0
  27. package/@types/persisters/persister-sqlite3/with-schemas/index.d.ts +4 -0
  28. package/@types/queries/index.d.ts +1 -1
  29. package/@types/store/index.d.ts +21 -19
  30. package/@types/store/with-schemas/index.d.ts +15 -13
  31. package/agents.md +62 -0
  32. package/checkpoints/index.js +8 -6
  33. package/checkpoints/with-schemas/index.js +8 -6
  34. package/common/index.js +4 -3
  35. package/common/with-schemas/index.js +4 -3
  36. package/index.js +60 -30
  37. package/indexes/index.js +7 -5
  38. package/indexes/with-schemas/index.js +7 -5
  39. package/mergeable-store/index.js +51 -21
  40. package/mergeable-store/with-schemas/index.js +51 -21
  41. package/metrics/index.js +7 -5
  42. package/metrics/with-schemas/index.js +7 -5
  43. package/min/checkpoints/index.js +1 -1
  44. package/min/checkpoints/index.js.gz +0 -0
  45. package/min/checkpoints/with-schemas/index.js +1 -1
  46. package/min/checkpoints/with-schemas/index.js.gz +0 -0
  47. package/min/common/index.js +1 -1
  48. package/min/common/index.js.gz +0 -0
  49. package/min/common/with-schemas/index.js +1 -1
  50. package/min/common/with-schemas/index.js.gz +0 -0
  51. package/min/index.js +1 -1
  52. package/min/index.js.gz +0 -0
  53. package/min/indexes/index.js +1 -1
  54. package/min/indexes/index.js.gz +0 -0
  55. package/min/indexes/with-schemas/index.js +1 -1
  56. package/min/indexes/with-schemas/index.js.gz +0 -0
  57. package/min/mergeable-store/index.js +1 -1
  58. package/min/mergeable-store/index.js.gz +0 -0
  59. package/min/mergeable-store/with-schemas/index.js +1 -1
  60. package/min/mergeable-store/with-schemas/index.js.gz +0 -0
  61. package/min/metrics/index.js +1 -1
  62. package/min/metrics/index.js.gz +0 -0
  63. package/min/metrics/with-schemas/index.js +1 -1
  64. package/min/metrics/with-schemas/index.js.gz +0 -0
  65. package/min/omni/index.js +1 -1
  66. package/min/omni/index.js.gz +0 -0
  67. package/min/omni/with-schemas/index.js +1 -1
  68. package/min/omni/with-schemas/index.js.gz +0 -0
  69. package/min/persisters/index.js +1 -1
  70. package/min/persisters/index.js.gz +0 -0
  71. package/min/persisters/persister-automerge/index.js +1 -1
  72. package/min/persisters/persister-automerge/index.js.gz +0 -0
  73. package/min/persisters/persister-automerge/with-schemas/index.js +1 -1
  74. package/min/persisters/persister-automerge/with-schemas/index.js.gz +0 -0
  75. package/min/persisters/persister-browser/index.js +1 -1
  76. package/min/persisters/persister-browser/index.js.gz +0 -0
  77. package/min/persisters/persister-browser/with-schemas/index.js +1 -1
  78. package/min/persisters/persister-browser/with-schemas/index.js.gz +0 -0
  79. package/min/persisters/persister-cr-sqlite-wasm/index.js +1 -1
  80. package/min/persisters/persister-cr-sqlite-wasm/index.js.gz +0 -0
  81. package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +1 -1
  82. package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js.gz +0 -0
  83. package/min/persisters/persister-durable-object-sql-storage/index.js +1 -1
  84. package/min/persisters/persister-durable-object-sql-storage/index.js.gz +0 -0
  85. package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js +1 -1
  86. package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js.gz +0 -0
  87. package/min/persisters/persister-durable-object-storage/index.js +1 -1
  88. package/min/persisters/persister-durable-object-storage/index.js.gz +0 -0
  89. package/min/persisters/persister-durable-object-storage/with-schemas/index.js +1 -1
  90. package/min/persisters/persister-durable-object-storage/with-schemas/index.js.gz +0 -0
  91. package/min/persisters/persister-electric-sql/index.js +1 -1
  92. package/min/persisters/persister-electric-sql/index.js.gz +0 -0
  93. package/min/persisters/persister-electric-sql/with-schemas/index.js +1 -1
  94. package/min/persisters/persister-electric-sql/with-schemas/index.js.gz +0 -0
  95. package/min/persisters/persister-expo-sqlite/index.js +1 -1
  96. package/min/persisters/persister-expo-sqlite/index.js.gz +0 -0
  97. package/min/persisters/persister-expo-sqlite/with-schemas/index.js +1 -1
  98. package/min/persisters/persister-expo-sqlite/with-schemas/index.js.gz +0 -0
  99. package/min/persisters/persister-file/index.js +1 -1
  100. package/min/persisters/persister-file/index.js.gz +0 -0
  101. package/min/persisters/persister-file/with-schemas/index.js +1 -1
  102. package/min/persisters/persister-file/with-schemas/index.js.gz +0 -0
  103. package/min/persisters/persister-indexed-db/index.js +1 -1
  104. package/min/persisters/persister-indexed-db/index.js.gz +0 -0
  105. package/min/persisters/persister-indexed-db/with-schemas/index.js +1 -1
  106. package/min/persisters/persister-indexed-db/with-schemas/index.js.gz +0 -0
  107. package/min/persisters/persister-libsql/index.js +1 -1
  108. package/min/persisters/persister-libsql/index.js.gz +0 -0
  109. package/min/persisters/persister-libsql/with-schemas/index.js +1 -1
  110. package/min/persisters/persister-libsql/with-schemas/index.js.gz +0 -0
  111. package/min/persisters/persister-partykit-client/index.js +1 -1
  112. package/min/persisters/persister-partykit-client/index.js.gz +0 -0
  113. package/min/persisters/persister-partykit-client/with-schemas/index.js +1 -1
  114. package/min/persisters/persister-partykit-client/with-schemas/index.js.gz +0 -0
  115. package/min/persisters/persister-partykit-server/index.js +1 -1
  116. package/min/persisters/persister-partykit-server/index.js.gz +0 -0
  117. package/min/persisters/persister-partykit-server/with-schemas/index.js +1 -1
  118. package/min/persisters/persister-partykit-server/with-schemas/index.js.gz +0 -0
  119. package/min/persisters/persister-pglite/index.js +1 -1
  120. package/min/persisters/persister-pglite/index.js.gz +0 -0
  121. package/min/persisters/persister-pglite/with-schemas/index.js +1 -1
  122. package/min/persisters/persister-pglite/with-schemas/index.js.gz +0 -0
  123. package/min/persisters/persister-postgres/index.js +1 -1
  124. package/min/persisters/persister-postgres/index.js.gz +0 -0
  125. package/min/persisters/persister-postgres/with-schemas/index.js +1 -1
  126. package/min/persisters/persister-postgres/with-schemas/index.js.gz +0 -0
  127. package/min/persisters/persister-powersync/index.js +1 -1
  128. package/min/persisters/persister-powersync/index.js.gz +0 -0
  129. package/min/persisters/persister-powersync/with-schemas/index.js +1 -1
  130. package/min/persisters/persister-powersync/with-schemas/index.js.gz +0 -0
  131. package/min/persisters/persister-react-native-mmkv/index.js +1 -1
  132. package/min/persisters/persister-react-native-mmkv/index.js.gz +0 -0
  133. package/min/persisters/persister-react-native-mmkv/with-schemas/index.js +1 -1
  134. package/min/persisters/persister-react-native-mmkv/with-schemas/index.js.gz +0 -0
  135. package/min/persisters/persister-react-native-sqlite/index.js +1 -1
  136. package/min/persisters/persister-react-native-sqlite/index.js.gz +0 -0
  137. package/min/persisters/persister-react-native-sqlite/with-schemas/index.js +1 -1
  138. package/min/persisters/persister-react-native-sqlite/with-schemas/index.js.gz +0 -0
  139. package/min/persisters/persister-remote/index.js +1 -1
  140. package/min/persisters/persister-remote/index.js.gz +0 -0
  141. package/min/persisters/persister-remote/with-schemas/index.js +1 -1
  142. package/min/persisters/persister-remote/with-schemas/index.js.gz +0 -0
  143. package/min/persisters/persister-sqlite-bun/index.js +1 -1
  144. package/min/persisters/persister-sqlite-bun/index.js.gz +0 -0
  145. package/min/persisters/persister-sqlite-bun/with-schemas/index.js +1 -1
  146. package/min/persisters/persister-sqlite-bun/with-schemas/index.js.gz +0 -0
  147. package/min/persisters/persister-sqlite-wasm/index.js +1 -1
  148. package/min/persisters/persister-sqlite-wasm/index.js.gz +0 -0
  149. package/min/persisters/persister-sqlite-wasm/with-schemas/index.js +1 -1
  150. package/min/persisters/persister-sqlite-wasm/with-schemas/index.js.gz +0 -0
  151. package/min/persisters/persister-sqlite3/index.js +1 -1
  152. package/min/persisters/persister-sqlite3/index.js.gz +0 -0
  153. package/min/persisters/persister-sqlite3/with-schemas/index.js +1 -1
  154. package/min/persisters/persister-sqlite3/with-schemas/index.js.gz +0 -0
  155. package/min/persisters/persister-yjs/index.js +1 -1
  156. package/min/persisters/persister-yjs/index.js.gz +0 -0
  157. package/min/persisters/persister-yjs/with-schemas/index.js +1 -1
  158. package/min/persisters/persister-yjs/with-schemas/index.js.gz +0 -0
  159. package/min/persisters/with-schemas/index.js +1 -1
  160. package/min/persisters/with-schemas/index.js.gz +0 -0
  161. package/min/queries/index.js +1 -1
  162. package/min/queries/index.js.gz +0 -0
  163. package/min/queries/with-schemas/index.js +1 -1
  164. package/min/queries/with-schemas/index.js.gz +0 -0
  165. package/min/relationships/index.js +1 -1
  166. package/min/relationships/index.js.gz +0 -0
  167. package/min/relationships/with-schemas/index.js +1 -1
  168. package/min/relationships/with-schemas/index.js.gz +0 -0
  169. package/min/store/index.js +1 -1
  170. package/min/store/index.js.gz +0 -0
  171. package/min/store/with-schemas/index.js +1 -1
  172. package/min/store/with-schemas/index.js.gz +0 -0
  173. package/min/synchronizers/index.js +1 -1
  174. package/min/synchronizers/index.js.gz +0 -0
  175. package/min/synchronizers/synchronizer-broadcast-channel/index.js +1 -1
  176. package/min/synchronizers/synchronizer-broadcast-channel/index.js.gz +0 -0
  177. package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +1 -1
  178. package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js.gz +0 -0
  179. package/min/synchronizers/synchronizer-local/index.js +1 -1
  180. package/min/synchronizers/synchronizer-local/index.js.gz +0 -0
  181. package/min/synchronizers/synchronizer-local/with-schemas/index.js +1 -1
  182. package/min/synchronizers/synchronizer-local/with-schemas/index.js.gz +0 -0
  183. package/min/synchronizers/synchronizer-ws-client/index.js +1 -1
  184. package/min/synchronizers/synchronizer-ws-client/index.js.gz +0 -0
  185. package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js +1 -1
  186. package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js.gz +0 -0
  187. package/min/synchronizers/synchronizer-ws-server/index.js +1 -1
  188. package/min/synchronizers/synchronizer-ws-server/index.js.gz +0 -0
  189. package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js +1 -1
  190. package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js.gz +0 -0
  191. package/min/synchronizers/synchronizer-ws-server-durable-object/index.js +1 -1
  192. package/min/synchronizers/synchronizer-ws-server-durable-object/index.js.gz +0 -0
  193. package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +1 -1
  194. package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js.gz +0 -0
  195. package/min/synchronizers/synchronizer-ws-server-simple/index.js +1 -1
  196. package/min/synchronizers/synchronizer-ws-server-simple/index.js.gz +0 -0
  197. package/min/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js +1 -1
  198. package/min/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js.gz +0 -0
  199. package/min/synchronizers/with-schemas/index.js +1 -1
  200. package/min/synchronizers/with-schemas/index.js.gz +0 -0
  201. package/min/ui-react/index.js +1 -1
  202. package/min/ui-react/index.js.gz +0 -0
  203. package/min/ui-react/with-schemas/index.js +1 -1
  204. package/min/ui-react/with-schemas/index.js.gz +0 -0
  205. package/min/ui-react-dom/index.js +1 -1
  206. package/min/ui-react-dom/index.js.gz +0 -0
  207. package/min/ui-react-dom/with-schemas/index.js +1 -1
  208. package/min/ui-react-dom/with-schemas/index.js.gz +0 -0
  209. package/min/ui-react-inspector/index.js +1 -1
  210. package/min/ui-react-inspector/index.js.gz +0 -0
  211. package/min/ui-react-inspector/with-schemas/index.js +1 -1
  212. package/min/ui-react-inspector/with-schemas/index.js.gz +0 -0
  213. package/min/with-schemas/index.js +1 -1
  214. package/min/with-schemas/index.js.gz +0 -0
  215. package/omni/index.js +78 -46
  216. package/omni/with-schemas/index.js +78 -46
  217. package/package.json +3 -3
  218. package/persisters/index.js +14 -10
  219. package/persisters/persister-automerge/index.js +12 -8
  220. package/persisters/persister-automerge/with-schemas/index.js +12 -8
  221. package/persisters/persister-browser/index.js +12 -8
  222. package/persisters/persister-browser/with-schemas/index.js +12 -8
  223. package/persisters/persister-cr-sqlite-wasm/index.js +14 -10
  224. package/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +14 -10
  225. package/persisters/persister-durable-object-sql-storage/index.js +14 -10
  226. package/persisters/persister-durable-object-sql-storage/with-schemas/index.js +14 -10
  227. package/persisters/persister-durable-object-storage/index.js +12 -8
  228. package/persisters/persister-durable-object-storage/with-schemas/index.js +12 -8
  229. package/persisters/persister-electric-sql/index.js +14 -10
  230. package/persisters/persister-electric-sql/with-schemas/index.js +14 -10
  231. package/persisters/persister-expo-sqlite/index.js +14 -10
  232. package/persisters/persister-expo-sqlite/with-schemas/index.js +14 -10
  233. package/persisters/persister-file/index.js +12 -8
  234. package/persisters/persister-file/with-schemas/index.js +12 -8
  235. package/persisters/persister-indexed-db/index.js +12 -8
  236. package/persisters/persister-indexed-db/with-schemas/index.js +12 -8
  237. package/persisters/persister-libsql/index.js +14 -10
  238. package/persisters/persister-libsql/with-schemas/index.js +14 -10
  239. package/persisters/persister-partykit-client/index.js +12 -8
  240. package/persisters/persister-partykit-client/with-schemas/index.js +12 -8
  241. package/persisters/persister-partykit-server/index.js +4 -3
  242. package/persisters/persister-partykit-server/with-schemas/index.js +4 -3
  243. package/persisters/persister-pglite/index.js +13 -9
  244. package/persisters/persister-pglite/with-schemas/index.js +13 -9
  245. package/persisters/persister-postgres/index.js +13 -9
  246. package/persisters/persister-postgres/with-schemas/index.js +13 -9
  247. package/persisters/persister-powersync/index.js +14 -10
  248. package/persisters/persister-powersync/with-schemas/index.js +14 -10
  249. package/persisters/persister-react-native-mmkv/index.js +12 -8
  250. package/persisters/persister-react-native-mmkv/with-schemas/index.js +12 -8
  251. package/persisters/persister-react-native-sqlite/index.js +14 -10
  252. package/persisters/persister-react-native-sqlite/with-schemas/index.js +14 -10
  253. package/persisters/persister-remote/index.js +14 -10
  254. package/persisters/persister-remote/with-schemas/index.js +14 -10
  255. package/persisters/persister-sqlite-bun/index.js +14 -10
  256. package/persisters/persister-sqlite-bun/with-schemas/index.js +14 -10
  257. package/persisters/persister-sqlite-wasm/index.js +14 -10
  258. package/persisters/persister-sqlite-wasm/with-schemas/index.js +14 -10
  259. package/persisters/persister-sqlite3/index.js +14 -10
  260. package/persisters/persister-sqlite3/with-schemas/index.js +14 -10
  261. package/persisters/persister-yjs/index.js +18 -12
  262. package/persisters/persister-yjs/with-schemas/index.js +18 -12
  263. package/persisters/with-schemas/index.js +14 -10
  264. package/queries/index.js +17 -12
  265. package/queries/with-schemas/index.js +17 -12
  266. package/readme.md +2 -2
  267. package/relationships/index.js +7 -5
  268. package/relationships/with-schemas/index.js +7 -5
  269. package/releases.md +100 -12
  270. package/store/index.js +48 -18
  271. package/store/with-schemas/index.js +48 -18
  272. package/synchronizers/index.js +13 -9
  273. package/synchronizers/synchronizer-broadcast-channel/index.js +14 -10
  274. package/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +14 -10
  275. package/synchronizers/synchronizer-local/index.js +14 -10
  276. package/synchronizers/synchronizer-local/with-schemas/index.js +14 -10
  277. package/synchronizers/synchronizer-ws-client/index.js +13 -9
  278. package/synchronizers/synchronizer-ws-client/with-schemas/index.js +13 -9
  279. package/synchronizers/synchronizer-ws-server/index.js +13 -9
  280. package/synchronizers/synchronizer-ws-server/with-schemas/index.js +13 -9
  281. package/synchronizers/synchronizer-ws-server-durable-object/index.js +13 -9
  282. package/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +13 -9
  283. package/synchronizers/synchronizer-ws-server-simple/index.js +5 -4
  284. package/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js +5 -4
  285. package/synchronizers/with-schemas/index.js +13 -9
  286. package/ui-react/index.js +9 -6
  287. package/ui-react/with-schemas/index.js +9 -6
  288. package/ui-react-dom/index.js +14 -7
  289. package/ui-react-dom/with-schemas/index.js +14 -7
  290. package/ui-react-inspector/index.js +53 -23
  291. package/ui-react-inspector/with-schemas/index.js +53 -23
  292. package/with-schemas/index.js +60 -30
@@ -1,8 +1,10 @@
1
1
  const EMPTY_STRING = '';
2
2
 
3
- const isUndefined = (thing) => thing == void 0;
4
- const ifNotUndefined = (value, then, otherwise) =>
5
- isUndefined(value) ? otherwise?.() : then(value);
3
+ const getIfNotFunction = (predicate) => (value, then, otherwise) =>
4
+ predicate(value) ? otherwise?.() : then(value);
5
+ const isUndefined = (thing) => thing === void 0;
6
+ const isNull = (thing) => thing === null;
7
+ const ifNotUndefined = getIfNotFunction(isUndefined);
6
8
  const isArray = (thing) => Array.isArray(thing);
7
9
  const size = (arrayOrString) => arrayOrString.length;
8
10
  const test = (regex, subject) => regex.test(subject);
@@ -42,7 +44,7 @@ const mapGet = (map, key) => map?.get(key);
42
44
  const mapForEach = (map, cb) =>
43
45
  collForEach(map, (value, key) => cb(key, value));
44
46
  const mapSet = (map, key, value) =>
45
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
47
+ value === void 0 ? (collDel(map, key), map) : map?.set(key, value);
46
48
  const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
47
49
  if (!collHas(map, key)) {
48
50
  mapSet(map, key, getDefaultValue());
@@ -165,7 +167,7 @@ const getListenerFunctions = (getThing) => {
165
167
  const index = size(ids);
166
168
  if (index == size(path)) {
167
169
  listener(thing, ...ids, ...extraArgsGetter(ids));
168
- } else if (isUndefined(path[index])) {
170
+ } else if (isNull(path[index])) {
169
171
  arrayForEach(pathGetters[index]?.(...ids) ?? [], (id2) =>
170
172
  callWithIds(...ids, id2),
171
173
  );
@@ -318,7 +320,7 @@ const createCheckpoints = getCreateFunction(
318
320
  ? goBackwardImpl
319
321
  : arrayHas(forwardIds, checkpointId)
320
322
  ? goForwardImpl
321
- : null;
323
+ : void 0;
322
324
  while (!isUndefined(action) && checkpointId != currentId) {
323
325
  action();
324
326
  }
@@ -1,8 +1,10 @@
1
1
  const EMPTY_STRING = '';
2
2
 
3
- const isUndefined = (thing) => thing == void 0;
4
- const ifNotUndefined = (value, then, otherwise) =>
5
- isUndefined(value) ? otherwise?.() : then(value);
3
+ const getIfNotFunction = (predicate) => (value, then, otherwise) =>
4
+ predicate(value) ? otherwise?.() : then(value);
5
+ const isUndefined = (thing) => thing === void 0;
6
+ const isNull = (thing) => thing === null;
7
+ const ifNotUndefined = getIfNotFunction(isUndefined);
6
8
  const isArray = (thing) => Array.isArray(thing);
7
9
  const size = (arrayOrString) => arrayOrString.length;
8
10
  const test = (regex, subject) => regex.test(subject);
@@ -42,7 +44,7 @@ const mapGet = (map, key) => map?.get(key);
42
44
  const mapForEach = (map, cb) =>
43
45
  collForEach(map, (value, key) => cb(key, value));
44
46
  const mapSet = (map, key, value) =>
45
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
47
+ value === void 0 ? (collDel(map, key), map) : map?.set(key, value);
46
48
  const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
47
49
  if (!collHas(map, key)) {
48
50
  mapSet(map, key, getDefaultValue());
@@ -165,7 +167,7 @@ const getListenerFunctions = (getThing) => {
165
167
  const index = size(ids);
166
168
  if (index == size(path)) {
167
169
  listener(thing, ...ids, ...extraArgsGetter(ids));
168
- } else if (isUndefined(path[index])) {
170
+ } else if (isNull(path[index])) {
169
171
  arrayForEach(pathGetters[index]?.(...ids) ?? [], (id2) =>
170
172
  callWithIds(...ids, id2),
171
173
  );
@@ -318,7 +320,7 @@ const createCheckpoints = getCreateFunction(
318
320
  ? goBackwardImpl
319
321
  : arrayHas(forwardIds, checkpointId)
320
322
  ? goForwardImpl
321
- : null;
323
+ : void 0;
322
324
  while (!isUndefined(action) && checkpointId != currentId) {
323
325
  action();
324
326
  }
package/common/index.js CHANGED
@@ -2,14 +2,15 @@ const EMPTY_STRING = '';
2
2
  const strSplit = (str, separator = EMPTY_STRING, limit) =>
3
3
  str.split(separator, limit);
4
4
 
5
+ const getIfNotFunction = (predicate) => (value, then, otherwise) =>
6
+ predicate(value) ? otherwise?.() : then(value);
5
7
  const GLOBAL = globalThis;
6
8
  const math = Math;
7
9
  const mathMax = math.max;
8
10
  const mathFloor = math.floor;
9
11
  const isInstanceOf = (thing, cls) => thing instanceof cls;
10
- const isUndefined = (thing) => thing == void 0;
11
- const ifNotUndefined = (value, then, otherwise) =>
12
- isUndefined(value) ? otherwise?.() : then(value);
12
+ const isUndefined = (thing) => thing === void 0;
13
+ const ifNotUndefined = getIfNotFunction(isUndefined);
13
14
 
14
15
  const arrayForEach = (array, cb) => array.forEach(cb);
15
16
  const arrayMap = (array, cb) => array.map(cb);
@@ -2,14 +2,15 @@ const EMPTY_STRING = '';
2
2
  const strSplit = (str, separator = EMPTY_STRING, limit) =>
3
3
  str.split(separator, limit);
4
4
 
5
+ const getIfNotFunction = (predicate) => (value, then, otherwise) =>
6
+ predicate(value) ? otherwise?.() : then(value);
5
7
  const GLOBAL = globalThis;
6
8
  const math = Math;
7
9
  const mathMax = math.max;
8
10
  const mathFloor = math.floor;
9
11
  const isInstanceOf = (thing, cls) => thing instanceof cls;
10
- const isUndefined = (thing) => thing == void 0;
11
- const ifNotUndefined = (value, then, otherwise) =>
12
- isUndefined(value) ? otherwise?.() : then(value);
12
+ const isUndefined = (thing) => thing === void 0;
13
+ const ifNotUndefined = getIfNotFunction(isUndefined);
13
14
 
14
15
  const arrayForEach = (array, cb) => array.forEach(cb);
15
16
  const arrayMap = (array, cb) => array.map(cb);
package/index.js CHANGED
@@ -6,6 +6,7 @@ const NUMBER = getTypeOf(0);
6
6
  const FUNCTION = getTypeOf(getTypeOf);
7
7
  const TYPE = 'type';
8
8
  const DEFAULT = 'default';
9
+ const ALLOW_NULL = 'allowNull';
9
10
  const SUM = 'sum';
10
11
  const AVG = 'avg';
11
12
  const MIN = 'min';
@@ -37,6 +38,8 @@ const strEndsWith = (str, suffix) => str.endsWith(suffix);
37
38
  const strSplit = (str, separator = EMPTY_STRING, limit) =>
38
39
  str.split(separator, limit);
39
40
 
41
+ const getIfNotFunction = (predicate) => (value, then, otherwise) =>
42
+ predicate(value) ? otherwise?.() : then(value);
40
43
  const GLOBAL = globalThis;
41
44
  const math = Math;
42
45
  const mathMax = math.max;
@@ -44,9 +47,11 @@ const mathMin = math.min;
44
47
  const mathFloor = math.floor;
45
48
  const isFiniteNumber = isFinite;
46
49
  const isInstanceOf = (thing, cls) => thing instanceof cls;
47
- const isUndefined = (thing) => thing == void 0;
48
- const ifNotUndefined = (value, then, otherwise) =>
49
- isUndefined(value) ? otherwise?.() : then(value);
50
+ const isNullish = (thing) => thing == null;
51
+ const isUndefined = (thing) => thing === void 0;
52
+ const isNull = (thing) => thing === null;
53
+ const ifNotNullish = getIfNotFunction(isNullish);
54
+ const ifNotUndefined = getIfNotFunction(isUndefined);
50
55
  const isTypeStringOrBoolean = (type) => type == STRING || type == BOOLEAN;
51
56
  const isString = (thing) => getTypeOf(thing) == STRING;
52
57
  const isFunction = (thing) => getTypeOf(thing) == FUNCTION;
@@ -88,13 +93,16 @@ const arrayUnshift = (array, ...values) => array.unshift(...values);
88
93
  const arrayShift = (array) => array.shift();
89
94
 
90
95
  const getCellOrValueType = (cellOrValue) => {
96
+ if (isNull(cellOrValue)) {
97
+ return 'null';
98
+ }
91
99
  const type = getTypeOf(cellOrValue);
92
100
  return isTypeStringOrBoolean(type) ||
93
101
  (type == NUMBER && isFiniteNumber(cellOrValue))
94
102
  ? type
95
103
  : void 0;
96
104
  };
97
- const isCellOrValueOrNullOrUndefined = (cellOrValue) =>
105
+ const isCellOrValueOrUndefined = (cellOrValue) =>
98
106
  isUndefined(cellOrValue) || !isUndefined(getCellOrValueType(cellOrValue));
99
107
  const setOrDelCell = (store, tableId, rowId, cellId, cell) =>
100
108
  isUndefined(cell)
@@ -121,12 +129,12 @@ const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
121
129
  const objFrozen = object.isFrozen;
122
130
  const objEntries = object.entries;
123
131
  const isObject = (obj) =>
124
- !isUndefined(obj) &&
125
- ifNotUndefined(
132
+ !isNullish(obj) &&
133
+ ifNotNullish(
126
134
  getPrototypeOf(obj),
127
135
  (objPrototype) =>
128
136
  objPrototype == object.prototype ||
129
- isUndefined(getPrototypeOf(objPrototype)),
137
+ isNullish(getPrototypeOf(objPrototype)),
130
138
 
131
139
  /* istanbul ignore next */
132
140
  () => true,
@@ -155,7 +163,7 @@ const objEnsure = (obj, id, getDefaultValue) => {
155
163
  };
156
164
  const objValidate = (obj, validateChild, onInvalidObj, emptyIsValid = 0) => {
157
165
  if (
158
- isUndefined(obj) ||
166
+ isNullish(obj) ||
159
167
  !isObject(obj) ||
160
168
  (!emptyIsValid && objIsEmpty(obj)) ||
161
169
  objFrozen(obj)
@@ -179,7 +187,7 @@ const mapForEach = (map, cb) =>
179
187
  const mapMap = (coll, cb) =>
180
188
  arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
181
189
  const mapSet = (map, key, value) =>
182
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
190
+ value === void 0 ? (collDel(map, key), map) : map?.set(key, value);
183
191
  const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
184
192
  if (!collHas(map, key)) {
185
193
  mapSet(map, key, getDefaultValue());
@@ -500,7 +508,7 @@ const getListenerFunctions = (getThing) => {
500
508
  const index = size(ids);
501
509
  if (index == size(path)) {
502
510
  listener(thing, ...ids, ...extraArgsGetter(ids));
503
- } else if (isUndefined(path[index])) {
511
+ } else if (isNull(path[index])) {
504
512
  arrayForEach(pathGetters[index]?.(...ids) ?? [], (id2) =>
505
513
  callWithIds(...ids, id2),
506
514
  );
@@ -653,7 +661,7 @@ const createCheckpoints = getCreateFunction(
653
661
  ? goBackwardImpl
654
662
  : arrayHas(forwardIds, checkpointId)
655
663
  ? goForwardImpl
656
- : null;
664
+ : void 0;
657
665
  while (!isUndefined(action) && checkpointId != currentId) {
658
666
  action();
659
667
  }
@@ -1233,14 +1241,22 @@ const createStore = () => {
1233
1241
  const validateValuesSchema = (valuesSchema) =>
1234
1242
  objValidate(valuesSchema, validateCellOrValueSchema);
1235
1243
  const validateCellOrValueSchema = (schema) => {
1236
- if (!objValidate(schema, (_child, id2) => arrayHas([TYPE, DEFAULT], id2))) {
1244
+ if (
1245
+ !objValidate(schema, (_child, id2) =>
1246
+ arrayHas([TYPE, DEFAULT, ALLOW_NULL], id2),
1247
+ )
1248
+ ) {
1237
1249
  return false;
1238
1250
  }
1239
1251
  const type = schema[TYPE];
1240
1252
  if (!isTypeStringOrBoolean(type) && type != NUMBER) {
1241
1253
  return false;
1242
1254
  }
1243
- if (getCellOrValueType(schema[DEFAULT]) != type) {
1255
+ const defaultValue = schema[DEFAULT];
1256
+ if (isNull(defaultValue) && !schema[ALLOW_NULL]) {
1257
+ return false;
1258
+ }
1259
+ if (!isNull(defaultValue) && getCellOrValueType(defaultValue) != type) {
1244
1260
  objDel(schema, DEFAULT);
1245
1261
  }
1246
1262
  return true;
@@ -1277,9 +1293,19 @@ const createStore = () => {
1277
1293
  ? ifNotUndefined(
1278
1294
  mapGet(mapGet(tablesSchemaMap, tableId), cellId),
1279
1295
  (cellSchema) =>
1280
- getCellOrValueType(cell) != cellSchema[TYPE]
1281
- ? cellInvalid(tableId, rowId, cellId, cell, cellSchema[DEFAULT])
1282
- : cell,
1296
+ isNull(cell)
1297
+ ? cellSchema[ALLOW_NULL]
1298
+ ? cell
1299
+ : cellInvalid(tableId, rowId, cellId, cell, cellSchema[DEFAULT])
1300
+ : getCellOrValueType(cell) == cellSchema[TYPE]
1301
+ ? cell
1302
+ : cellInvalid(
1303
+ tableId,
1304
+ rowId,
1305
+ cellId,
1306
+ cell,
1307
+ cellSchema[DEFAULT],
1308
+ ),
1283
1309
  () => cellInvalid(tableId, rowId, cellId, cell),
1284
1310
  )
1285
1311
  : isUndefined(getCellOrValueType(cell))
@@ -1304,9 +1330,13 @@ const createStore = () => {
1304
1330
  ? ifNotUndefined(
1305
1331
  mapGet(valuesSchemaMap, valueId),
1306
1332
  (valueSchema) =>
1307
- getCellOrValueType(value) != valueSchema[TYPE]
1308
- ? valueInvalid(valueId, value, valueSchema[DEFAULT])
1309
- : value,
1333
+ isNull(value)
1334
+ ? valueSchema[ALLOW_NULL]
1335
+ ? value
1336
+ : valueInvalid(valueId, value, valueSchema[DEFAULT])
1337
+ : getCellOrValueType(value) == valueSchema[TYPE]
1338
+ ? value
1339
+ : valueInvalid(valueId, value, valueSchema[DEFAULT]),
1310
1340
  () => valueInvalid(valueId, value),
1311
1341
  )
1312
1342
  : isUndefined(getCellOrValueType(value))
@@ -1549,7 +1579,7 @@ const createStore = () => {
1549
1579
  mapSet(
1550
1580
  cellIds,
1551
1581
  cellId,
1552
- count != -addedOrRemoved ? count + addedOrRemoved : null,
1582
+ count != -addedOrRemoved ? count + addedOrRemoved : void 0,
1553
1583
  );
1554
1584
  idsChanged(
1555
1585
  mapEnsure(mapEnsure(changedCellIds, tableId, mapNew), rowId, mapNew),
@@ -2558,7 +2588,7 @@ const validateMergeableContent = (mergeableContent) =>
2558
2588
  objValidate(
2559
2589
  cellStamps,
2560
2590
  (cellStamp) =>
2561
- stampValidate(cellStamp, isCellOrValueOrNullOrUndefined),
2591
+ stampValidate(cellStamp, isCellOrValueOrUndefined),
2562
2592
  void 0,
2563
2593
  1,
2564
2594
  ),
@@ -2574,7 +2604,7 @@ const validateMergeableContent = (mergeableContent) =>
2574
2604
  stampValidate(mergeableContent[1], (values) =>
2575
2605
  objValidate(
2576
2606
  values,
2577
- (value) => stampValidate(value, isCellOrValueOrNullOrUndefined),
2607
+ (value) => stampValidate(value, isCellOrValueOrUndefined),
2578
2608
  void 0,
2579
2609
  1,
2580
2610
  ),
@@ -3252,7 +3282,7 @@ const createQueries = getCreateFunction((store) => {
3252
3282
  setDefinition(queryId, tableId);
3253
3283
  resetPreStores(queryId);
3254
3284
  const selectEntries = [];
3255
- const joinEntries = [[null, [tableId, null, null, [], mapNew()]]];
3285
+ const joinEntries = [[void 0, [tableId, void 0, void 0, [], mapNew()]]];
3256
3286
  const wheres = [];
3257
3287
  const groupEntries = [];
3258
3288
  const havings = [];
@@ -3268,7 +3298,7 @@ const createQueries = getCreateFunction((store) => {
3268
3298
  };
3269
3299
  const join = (joinedTableId, arg1, arg2) => {
3270
3300
  const fromIntermediateJoinedTableId =
3271
- isUndefined(arg2) || isFunction(arg1) ? null : arg1;
3301
+ isUndefined(arg2) || isFunction(arg1) ? void 0 : arg1;
3272
3302
  const onArg = isUndefined(fromIntermediateJoinedTableId) ? arg1 : arg2;
3273
3303
  const joinEntry = [
3274
3304
  joinedTableId,
@@ -3388,7 +3418,7 @@ const createQueries = getCreateFunction((store) => {
3388
3418
  groupRow[groupedCellId] = isUndefined(
3389
3419
  getCellOrValueType(aggregateValue),
3390
3420
  )
3391
- ? null
3421
+ ? void 0
3392
3422
  : aggregateValue;
3393
3423
  },
3394
3424
  );
@@ -3517,20 +3547,20 @@ const createQueries = getCreateFunction((store) => {
3517
3547
  const listenToTable = (rootRowId, tableId2, rowId, joinedTableIds2) => {
3518
3548
  const getCell = (cellId) => store.getCell(tableId2, rowId, cellId);
3519
3549
  arrayForEach(joinedTableIds2, (remoteAsTableId) => {
3520
- const [realJoinedTableId, , on, nextJoinedTableIds, remoteIdPair] =
3550
+ const [realJoinedTableId, , on, nextJoinedTableIds, remoteIdPairs] =
3521
3551
  mapGet(joins, remoteAsTableId);
3522
3552
  const remoteRowId = on?.(getCell, rootRowId);
3523
3553
  const [previousRemoteRowId, previousRemoteListenerId] =
3524
- mapGet(remoteIdPair, rootRowId) ?? [];
3554
+ mapGet(remoteIdPairs, rootRowId) ?? [];
3525
3555
  if (remoteRowId != previousRemoteRowId) {
3526
3556
  if (!isUndefined(previousRemoteListenerId)) {
3527
3557
  delStoreListeners(queryId, previousRemoteListenerId);
3528
3558
  }
3529
3559
  mapSet(
3530
- remoteIdPair,
3560
+ remoteIdPairs,
3531
3561
  rootRowId,
3532
3562
  isUndefined(remoteRowId)
3533
- ? null
3563
+ ? void 0
3534
3564
  : [
3535
3565
  remoteRowId,
3536
3566
  ...addStoreListeners(
@@ -3551,7 +3581,7 @@ const createQueries = getCreateFunction((store) => {
3551
3581
  });
3552
3582
  writeSelectRow(rootRowId);
3553
3583
  };
3554
- const {3: joinedTableIds} = mapGet(joins, null);
3584
+ const {3: joinedTableIds} = mapGet(joins, void 0);
3555
3585
  selectJoinWhereStore.transaction(() =>
3556
3586
  addStoreListeners(
3557
3587
  queryId,
package/indexes/index.js CHANGED
@@ -3,9 +3,11 @@ const EMPTY_STRING = '';
3
3
  const STRING = getTypeOf(EMPTY_STRING);
4
4
  const id = (key) => EMPTY_STRING + key;
5
5
 
6
- const isUndefined = (thing) => thing == void 0;
7
- const ifNotUndefined = (value, then, otherwise) =>
8
- isUndefined(value) ? otherwise?.() : then(value);
6
+ const getIfNotFunction = (predicate) => (value, then, otherwise) =>
7
+ predicate(value) ? otherwise?.() : then(value);
8
+ const isUndefined = (thing) => thing === void 0;
9
+ const isNull = (thing) => thing === null;
10
+ const ifNotUndefined = getIfNotFunction(isUndefined);
9
11
  const isString = (thing) => getTypeOf(thing) == STRING;
10
12
  const isArray = (thing) => Array.isArray(thing);
11
13
  const size = (arrayOrString) => arrayOrString.length;
@@ -49,7 +51,7 @@ const mapGet = (map, key) => map?.get(key);
49
51
  const mapForEach = (map, cb) =>
50
52
  collForEach(map, (value, key) => cb(key, value));
51
53
  const mapSet = (map, key, value) =>
52
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
54
+ value === void 0 ? (collDel(map, key), map) : map?.set(key, value);
53
55
  const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
54
56
  if (!collHas(map, key)) {
55
57
  mapSet(map, key, getDefaultValue());
@@ -334,7 +336,7 @@ const getListenerFunctions = (getThing) => {
334
336
  const index = size(ids);
335
337
  if (index == size(path)) {
336
338
  listener(thing, ...ids, ...extraArgsGetter(ids));
337
- } else if (isUndefined(path[index])) {
339
+ } else if (isNull(path[index])) {
338
340
  arrayForEach(pathGetters[index]?.(...ids) ?? [], (id2) =>
339
341
  callWithIds(...ids, id2),
340
342
  );
@@ -3,9 +3,11 @@ const EMPTY_STRING = '';
3
3
  const STRING = getTypeOf(EMPTY_STRING);
4
4
  const id = (key) => EMPTY_STRING + key;
5
5
 
6
- const isUndefined = (thing) => thing == void 0;
7
- const ifNotUndefined = (value, then, otherwise) =>
8
- isUndefined(value) ? otherwise?.() : then(value);
6
+ const getIfNotFunction = (predicate) => (value, then, otherwise) =>
7
+ predicate(value) ? otherwise?.() : then(value);
8
+ const isUndefined = (thing) => thing === void 0;
9
+ const isNull = (thing) => thing === null;
10
+ const ifNotUndefined = getIfNotFunction(isUndefined);
9
11
  const isString = (thing) => getTypeOf(thing) == STRING;
10
12
  const isArray = (thing) => Array.isArray(thing);
11
13
  const size = (arrayOrString) => arrayOrString.length;
@@ -49,7 +51,7 @@ const mapGet = (map, key) => map?.get(key);
49
51
  const mapForEach = (map, cb) =>
50
52
  collForEach(map, (value, key) => cb(key, value));
51
53
  const mapSet = (map, key, value) =>
52
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
54
+ value === void 0 ? (collDel(map, key), map) : map?.set(key, value);
53
55
  const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
54
56
  if (!collHas(map, key)) {
55
57
  mapSet(map, key, getDefaultValue());
@@ -334,7 +336,7 @@ const getListenerFunctions = (getThing) => {
334
336
  const index = size(ids);
335
337
  if (index == size(path)) {
336
338
  listener(thing, ...ids, ...extraArgsGetter(ids));
337
- } else if (isUndefined(path[index])) {
339
+ } else if (isNull(path[index])) {
338
340
  arrayForEach(pathGetters[index]?.(...ids) ?? [], (id2) =>
339
341
  callWithIds(...ids, id2),
340
342
  );
@@ -6,6 +6,7 @@ const NUMBER = getTypeOf(0);
6
6
  const FUNCTION = getTypeOf(getTypeOf);
7
7
  const TYPE = 'type';
8
8
  const DEFAULT = 'default';
9
+ const ALLOW_NULL = 'allowNull';
9
10
  const LISTENER = 'Listener';
10
11
  const SET = 'set';
11
12
  const ADD = 'add';
@@ -30,15 +31,19 @@ const strEndsWith = (str, suffix) => str.endsWith(suffix);
30
31
  const strSplit = (str, separator = EMPTY_STRING, limit) =>
31
32
  str.split(separator, limit);
32
33
 
34
+ const getIfNotFunction = (predicate) => (value, then, otherwise) =>
35
+ predicate(value) ? otherwise?.() : then(value);
33
36
  const GLOBAL = globalThis;
34
37
  const math = Math;
35
38
  const mathMax = math.max;
36
39
  const mathFloor = math.floor;
37
40
  const isFiniteNumber = isFinite;
38
41
  const isInstanceOf = (thing, cls) => thing instanceof cls;
39
- const isUndefined = (thing) => thing == void 0;
40
- const ifNotUndefined = (value, then, otherwise) =>
41
- isUndefined(value) ? otherwise?.() : then(value);
42
+ const isNullish = (thing) => thing == null;
43
+ const isUndefined = (thing) => thing === void 0;
44
+ const isNull = (thing) => thing === null;
45
+ const ifNotNullish = getIfNotFunction(isNullish);
46
+ const ifNotUndefined = getIfNotFunction(isUndefined);
42
47
  const isTypeStringOrBoolean = (type) => type == STRING || type == BOOLEAN;
43
48
  const isString = (thing) => getTypeOf(thing) == STRING;
44
49
  const isFunction = (thing) => getTypeOf(thing) == FUNCTION;
@@ -57,13 +62,16 @@ const tryCatch = async (action, then1, then2) => {
57
62
  };
58
63
 
59
64
  const getCellOrValueType = (cellOrValue) => {
65
+ if (isNull(cellOrValue)) {
66
+ return 'null';
67
+ }
60
68
  const type = getTypeOf(cellOrValue);
61
69
  return isTypeStringOrBoolean(type) ||
62
70
  (type == NUMBER && isFiniteNumber(cellOrValue))
63
71
  ? type
64
72
  : void 0;
65
73
  };
66
- const isCellOrValueOrNullOrUndefined = (cellOrValue) =>
74
+ const isCellOrValueOrUndefined = (cellOrValue) =>
67
75
  isUndefined(cellOrValue) || !isUndefined(getCellOrValueType(cellOrValue));
68
76
  const setOrDelCell = (store, tableId, rowId, cellId, cell) =>
69
77
  isUndefined(cell)
@@ -102,12 +110,12 @@ const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
102
110
  const objFrozen = object.isFrozen;
103
111
  const objEntries = object.entries;
104
112
  const isObject = (obj) =>
105
- !isUndefined(obj) &&
106
- ifNotUndefined(
113
+ !isNullish(obj) &&
114
+ ifNotNullish(
107
115
  getPrototypeOf(obj),
108
116
  (objPrototype) =>
109
117
  objPrototype == object.prototype ||
110
- isUndefined(getPrototypeOf(objPrototype)),
118
+ isNullish(getPrototypeOf(objPrototype)),
111
119
 
112
120
  /* istanbul ignore next */
113
121
  () => true,
@@ -136,7 +144,7 @@ const objEnsure = (obj, id, getDefaultValue) => {
136
144
  };
137
145
  const objValidate = (obj, validateChild, onInvalidObj, emptyIsValid = 0) => {
138
146
  if (
139
- isUndefined(obj) ||
147
+ isNullish(obj) ||
140
148
  !isObject(obj) ||
141
149
  (!emptyIsValid && objIsEmpty(obj)) ||
142
150
  objFrozen(obj)
@@ -183,7 +191,7 @@ const mapForEach = (map, cb) =>
183
191
  const mapMap = (coll, cb) =>
184
192
  arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
185
193
  const mapSet = (map, key, value) =>
186
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
194
+ value === void 0 ? (collDel(map, key), map) : map?.set(key, value);
187
195
  const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
188
196
  if (!collHas(map, key)) {
189
197
  mapSet(map, key, getDefaultValue());
@@ -468,7 +476,7 @@ const getListenerFunctions = (getThing) => {
468
476
  const index = size(ids);
469
477
  if (index == size(path)) {
470
478
  listener(thing, ...ids, ...extraArgsGetter(ids));
471
- } else if (isUndefined(path[index])) {
479
+ } else if (isNull(path[index])) {
472
480
  arrayForEach(pathGetters[index]?.(...ids) ?? [], (id2) =>
473
481
  callWithIds(...ids, id2),
474
482
  );
@@ -553,14 +561,22 @@ const createStore = () => {
553
561
  const validateValuesSchema = (valuesSchema) =>
554
562
  objValidate(valuesSchema, validateCellOrValueSchema);
555
563
  const validateCellOrValueSchema = (schema) => {
556
- if (!objValidate(schema, (_child, id2) => arrayHas([TYPE, DEFAULT], id2))) {
564
+ if (
565
+ !objValidate(schema, (_child, id2) =>
566
+ arrayHas([TYPE, DEFAULT, ALLOW_NULL], id2),
567
+ )
568
+ ) {
557
569
  return false;
558
570
  }
559
571
  const type = schema[TYPE];
560
572
  if (!isTypeStringOrBoolean(type) && type != NUMBER) {
561
573
  return false;
562
574
  }
563
- if (getCellOrValueType(schema[DEFAULT]) != type) {
575
+ const defaultValue = schema[DEFAULT];
576
+ if (isNull(defaultValue) && !schema[ALLOW_NULL]) {
577
+ return false;
578
+ }
579
+ if (!isNull(defaultValue) && getCellOrValueType(defaultValue) != type) {
564
580
  objDel(schema, DEFAULT);
565
581
  }
566
582
  return true;
@@ -597,9 +613,19 @@ const createStore = () => {
597
613
  ? ifNotUndefined(
598
614
  mapGet(mapGet(tablesSchemaMap, tableId), cellId),
599
615
  (cellSchema) =>
600
- getCellOrValueType(cell) != cellSchema[TYPE]
601
- ? cellInvalid(tableId, rowId, cellId, cell, cellSchema[DEFAULT])
602
- : cell,
616
+ isNull(cell)
617
+ ? cellSchema[ALLOW_NULL]
618
+ ? cell
619
+ : cellInvalid(tableId, rowId, cellId, cell, cellSchema[DEFAULT])
620
+ : getCellOrValueType(cell) == cellSchema[TYPE]
621
+ ? cell
622
+ : cellInvalid(
623
+ tableId,
624
+ rowId,
625
+ cellId,
626
+ cell,
627
+ cellSchema[DEFAULT],
628
+ ),
603
629
  () => cellInvalid(tableId, rowId, cellId, cell),
604
630
  )
605
631
  : isUndefined(getCellOrValueType(cell))
@@ -624,9 +650,13 @@ const createStore = () => {
624
650
  ? ifNotUndefined(
625
651
  mapGet(valuesSchemaMap, valueId),
626
652
  (valueSchema) =>
627
- getCellOrValueType(value) != valueSchema[TYPE]
628
- ? valueInvalid(valueId, value, valueSchema[DEFAULT])
629
- : value,
653
+ isNull(value)
654
+ ? valueSchema[ALLOW_NULL]
655
+ ? value
656
+ : valueInvalid(valueId, value, valueSchema[DEFAULT])
657
+ : getCellOrValueType(value) == valueSchema[TYPE]
658
+ ? value
659
+ : valueInvalid(valueId, value, valueSchema[DEFAULT]),
630
660
  () => valueInvalid(valueId, value),
631
661
  )
632
662
  : isUndefined(getCellOrValueType(value))
@@ -869,7 +899,7 @@ const createStore = () => {
869
899
  mapSet(
870
900
  cellIds,
871
901
  cellId,
872
- count != -addedOrRemoved ? count + addedOrRemoved : null,
902
+ count != -addedOrRemoved ? count + addedOrRemoved : void 0,
873
903
  );
874
904
  idsChanged(
875
905
  mapEnsure(mapEnsure(changedCellIds, tableId, mapNew), rowId, mapNew),
@@ -1878,7 +1908,7 @@ const validateMergeableContent = (mergeableContent) =>
1878
1908
  objValidate(
1879
1909
  cellStamps,
1880
1910
  (cellStamp) =>
1881
- stampValidate(cellStamp, isCellOrValueOrNullOrUndefined),
1911
+ stampValidate(cellStamp, isCellOrValueOrUndefined),
1882
1912
  void 0,
1883
1913
  1,
1884
1914
  ),
@@ -1894,7 +1924,7 @@ const validateMergeableContent = (mergeableContent) =>
1894
1924
  stampValidate(mergeableContent[1], (values) =>
1895
1925
  objValidate(
1896
1926
  values,
1897
- (value) => stampValidate(value, isCellOrValueOrNullOrUndefined),
1927
+ (value) => stampValidate(value, isCellOrValueOrUndefined),
1898
1928
  void 0,
1899
1929
  1,
1900
1930
  ),