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
@@ -18,6 +18,7 @@ const FUNCTION$1 = getTypeOf(getTypeOf);
18
18
  const TRUE = 'true';
19
19
  const TYPE = 'type';
20
20
  const DEFAULT = 'default';
21
+ const ALLOW_NULL = 'allowNull';
21
22
  const UTF8 = 'utf8';
22
23
  const SUM = 'sum';
23
24
  const AVG = 'avg';
@@ -76,6 +77,8 @@ const strReplace = (str, searchValue, replaceValue) =>
76
77
  str.replace(searchValue, replaceValue);
77
78
 
78
79
  const promise = Promise;
80
+ const getIfNotFunction = (predicate) => (value, then, otherwise) =>
81
+ predicate(value) ? otherwise?.() : then(value);
79
82
  const GLOBAL = globalThis;
80
83
  const WINDOW = GLOBAL.window;
81
84
  const THOUSAND = 1e3;
@@ -91,9 +94,11 @@ const mathMin = math.min;
91
94
  const mathFloor = math.floor;
92
95
  const isFiniteNumber = isFinite;
93
96
  const isInstanceOf = (thing, cls) => thing instanceof cls;
94
- const isUndefined = (thing) => thing == void 0;
95
- const ifNotUndefined = (value, then, otherwise) =>
96
- isUndefined(value) ? otherwise?.() : then(value);
97
+ const isNullish = (thing) => thing == null;
98
+ const isUndefined = (thing) => thing === void 0;
99
+ const isNull = (thing) => thing === null;
100
+ const ifNotNullish = getIfNotFunction(isNullish);
101
+ const ifNotUndefined = getIfNotFunction(isUndefined);
97
102
  const isTypeStringOrBoolean = (type) => type == STRING || type == BOOLEAN;
98
103
  const isString = (thing) => getTypeOf(thing) == STRING;
99
104
  const isFunction = (thing) => getTypeOf(thing) == FUNCTION$1;
@@ -145,13 +150,16 @@ const arrayShift = (array) => array.shift();
145
150
  const arrayWith = (array, index, value) => array.with(index, value);
146
151
 
147
152
  const getCellOrValueType = (cellOrValue) => {
153
+ if (isNull(cellOrValue)) {
154
+ return 'null';
155
+ }
148
156
  const type = getTypeOf(cellOrValue);
149
157
  return isTypeStringOrBoolean(type) ||
150
158
  (type == NUMBER && isFiniteNumber(cellOrValue))
151
159
  ? type
152
160
  : void 0;
153
161
  };
154
- const isCellOrValueOrNullOrUndefined = (cellOrValue) =>
162
+ const isCellOrValueOrUndefined = (cellOrValue) =>
155
163
  isUndefined(cellOrValue) || !isUndefined(getCellOrValueType(cellOrValue));
156
164
  const setOrDelCell = (store, tableId, rowId, cellId, cell) =>
157
165
  isUndefined(cell)
@@ -186,12 +194,12 @@ const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
186
194
  const objFrozen = object.isFrozen;
187
195
  const objEntries = object.entries;
188
196
  const isObject = (obj) =>
189
- !isUndefined(obj) &&
190
- ifNotUndefined(
197
+ !isNullish(obj) &&
198
+ ifNotNullish(
191
199
  getPrototypeOf(obj),
192
200
  (objPrototype) =>
193
201
  objPrototype == object.prototype ||
194
- isUndefined(getPrototypeOf(objPrototype)),
202
+ isNullish(getPrototypeOf(objPrototype)),
195
203
 
196
204
  /* istanbul ignore next */
197
205
  () => true,
@@ -236,7 +244,7 @@ const objEnsure = (obj, id, getDefaultValue) => {
236
244
  };
237
245
  const objValidate = (obj, validateChild, onInvalidObj, emptyIsValid = 0) => {
238
246
  if (
239
- isUndefined(obj) ||
247
+ isNullish(obj) ||
240
248
  !isObject(obj) ||
241
249
  (!emptyIsValid && objIsEmpty(obj)) ||
242
250
  objFrozen(obj)
@@ -260,7 +268,7 @@ const mapForEach = (map, cb) =>
260
268
  const mapMap = (coll, cb) =>
261
269
  arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
262
270
  const mapSet = (map, key, value) =>
263
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
271
+ value === void 0 ? (collDel(map, key), map) : map?.set(key, value);
264
272
  const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
265
273
  if (!collHas(map, key)) {
266
274
  mapSet(map, key, getDefaultValue());
@@ -581,7 +589,7 @@ const getListenerFunctions = (getThing) => {
581
589
  const index = size(ids);
582
590
  if (index == size(path)) {
583
591
  listener(thing, ...ids, ...extraArgsGetter(ids));
584
- } else if (isUndefined(path[index])) {
592
+ } else if (isNull(path[index])) {
585
593
  arrayForEach(pathGetters[index]?.(...ids) ?? [], (id2) =>
586
594
  callWithIds(...ids, id2),
587
595
  );
@@ -734,7 +742,7 @@ const createCheckpoints = getCreateFunction(
734
742
  ? goBackwardImpl
735
743
  : arrayHas(forwardIds, checkpointId)
736
744
  ? goForwardImpl
737
- : null;
745
+ : void 0;
738
746
  while (!isUndefined(action) && checkpointId != currentId) {
739
747
  action();
740
748
  }
@@ -1318,14 +1326,22 @@ const createStore = () => {
1318
1326
  const validateValuesSchema = (valuesSchema) =>
1319
1327
  objValidate(valuesSchema, validateCellOrValueSchema);
1320
1328
  const validateCellOrValueSchema = (schema) => {
1321
- if (!objValidate(schema, (_child, id2) => arrayHas([TYPE, DEFAULT], id2))) {
1329
+ if (
1330
+ !objValidate(schema, (_child, id2) =>
1331
+ arrayHas([TYPE, DEFAULT, ALLOW_NULL], id2),
1332
+ )
1333
+ ) {
1322
1334
  return false;
1323
1335
  }
1324
1336
  const type = schema[TYPE];
1325
1337
  if (!isTypeStringOrBoolean(type) && type != NUMBER) {
1326
1338
  return false;
1327
1339
  }
1328
- if (getCellOrValueType(schema[DEFAULT]) != type) {
1340
+ const defaultValue = schema[DEFAULT];
1341
+ if (isNull(defaultValue) && !schema[ALLOW_NULL]) {
1342
+ return false;
1343
+ }
1344
+ if (!isNull(defaultValue) && getCellOrValueType(defaultValue) != type) {
1329
1345
  objDel(schema, DEFAULT);
1330
1346
  }
1331
1347
  return true;
@@ -1362,9 +1378,19 @@ const createStore = () => {
1362
1378
  ? ifNotUndefined(
1363
1379
  mapGet(mapGet(tablesSchemaMap, tableId), cellId),
1364
1380
  (cellSchema) =>
1365
- getCellOrValueType(cell) != cellSchema[TYPE]
1366
- ? cellInvalid(tableId, rowId, cellId, cell, cellSchema[DEFAULT])
1367
- : cell,
1381
+ isNull(cell)
1382
+ ? cellSchema[ALLOW_NULL]
1383
+ ? cell
1384
+ : cellInvalid(tableId, rowId, cellId, cell, cellSchema[DEFAULT])
1385
+ : getCellOrValueType(cell) == cellSchema[TYPE]
1386
+ ? cell
1387
+ : cellInvalid(
1388
+ tableId,
1389
+ rowId,
1390
+ cellId,
1391
+ cell,
1392
+ cellSchema[DEFAULT],
1393
+ ),
1368
1394
  () => cellInvalid(tableId, rowId, cellId, cell),
1369
1395
  )
1370
1396
  : isUndefined(getCellOrValueType(cell))
@@ -1389,9 +1415,13 @@ const createStore = () => {
1389
1415
  ? ifNotUndefined(
1390
1416
  mapGet(valuesSchemaMap, valueId),
1391
1417
  (valueSchema) =>
1392
- getCellOrValueType(value) != valueSchema[TYPE]
1393
- ? valueInvalid(valueId, value, valueSchema[DEFAULT])
1394
- : value,
1418
+ isNull(value)
1419
+ ? valueSchema[ALLOW_NULL]
1420
+ ? value
1421
+ : valueInvalid(valueId, value, valueSchema[DEFAULT])
1422
+ : getCellOrValueType(value) == valueSchema[TYPE]
1423
+ ? value
1424
+ : valueInvalid(valueId, value, valueSchema[DEFAULT]),
1395
1425
  () => valueInvalid(valueId, value),
1396
1426
  )
1397
1427
  : isUndefined(getCellOrValueType(value))
@@ -1634,7 +1664,7 @@ const createStore = () => {
1634
1664
  mapSet(
1635
1665
  cellIds,
1636
1666
  cellId,
1637
- count != -addedOrRemoved ? count + addedOrRemoved : null,
1667
+ count != -addedOrRemoved ? count + addedOrRemoved : void 0,
1638
1668
  );
1639
1669
  idsChanged(
1640
1670
  mapEnsure(mapEnsure(changedCellIds, tableId, mapNew), rowId, mapNew),
@@ -2643,7 +2673,7 @@ const validateMergeableContent = (mergeableContent) =>
2643
2673
  objValidate(
2644
2674
  cellStamps,
2645
2675
  (cellStamp) =>
2646
- stampValidate(cellStamp, isCellOrValueOrNullOrUndefined),
2676
+ stampValidate(cellStamp, isCellOrValueOrUndefined),
2647
2677
  void 0,
2648
2678
  1,
2649
2679
  ),
@@ -2659,7 +2689,7 @@ const validateMergeableContent = (mergeableContent) =>
2659
2689
  stampValidate(mergeableContent[1], (values) =>
2660
2690
  objValidate(
2661
2691
  values,
2662
- (value) => stampValidate(value, isCellOrValueOrNullOrUndefined),
2692
+ (value) => stampValidate(value, isCellOrValueOrUndefined),
2663
2693
  void 0,
2664
2694
  1,
2665
2695
  ),
@@ -3608,7 +3638,7 @@ const getDefaultedTabularConfigMap = (
3608
3638
  0,
3609
3639
  objSize(defaultObj),
3610
3640
  );
3611
- if (!isUndefined(defaultedConfig[0]) && !exclude(id, defaultedConfig[0])) {
3641
+ if (!isNull(defaultedConfig[0]) && !exclude(id, defaultedConfig[0])) {
3612
3642
  then(id, defaultedConfig[0]);
3613
3643
  mapSet(configMap, id, defaultedConfig);
3614
3644
  }
@@ -4335,7 +4365,7 @@ const createCustomSqlitePersister = (
4335
4365
  ` ${DATA_VERSION} d,${SCHEMA_VERSION} s,TOTAL_CHANGES() c FROM ${PRAGMA}${DATA_VERSION} JOIN ${PRAGMA}${SCHEMA_VERSION}`,
4336
4366
  );
4337
4367
  if (d != dataVersion || s != schemaVersion || c != totalChanges) {
4338
- if (dataVersion != null) {
4368
+ if (!isNullish(dataVersion)) {
4339
4369
  listener();
4340
4370
  }
4341
4371
  dataVersion = d;
@@ -5483,8 +5513,8 @@ const createRemotePersister = (
5483
5513
  const response = await fetch(loadUrl, {method: 'HEAD'});
5484
5514
  const currentEtag = getETag(response);
5485
5515
  if (
5486
- !isUndefined(lastEtag) &&
5487
- !isUndefined(currentEtag) &&
5516
+ !isNull(lastEtag) &&
5517
+ !isNull(currentEtag) &&
5488
5518
  currentEtag != lastEtag
5489
5519
  ) {
5490
5520
  lastEtag = currentEtag;
@@ -5611,7 +5641,8 @@ const getChangesFromYDoc = (yContent, events) => {
5611
5641
  mapForEach(
5612
5642
  keys,
5613
5643
  (cellId, {action}) =>
5614
- (row[cellId] = action == DELETE ? null : yRow.get(cellId)),
5644
+ (row[cellId] =
5645
+ action == DELETE ? void 0 : yRow.get(cellId)),
5615
5646
  );
5616
5647
  },
5617
5648
  () =>
@@ -5619,7 +5650,7 @@ const getChangesFromYDoc = (yContent, events) => {
5619
5650
  keys,
5620
5651
  (rowId, {action}) =>
5621
5652
  (table[rowId] =
5622
- action == DELETE ? null : yTable.get(rowId)?.toJSON()),
5653
+ action == DELETE ? void 0 : yTable.get(rowId)?.toJSON()),
5623
5654
  ),
5624
5655
  );
5625
5656
  },
@@ -5628,13 +5659,14 @@ const getChangesFromYDoc = (yContent, events) => {
5628
5659
  keys,
5629
5660
  (tableId, {action}) =>
5630
5661
  (tables[tableId] =
5631
- action == DELETE ? null : yTables.get(tableId)?.toJSON()),
5662
+ action == DELETE ? void 0 : yTables.get(tableId)?.toJSON()),
5632
5663
  ),
5633
5664
  )
5634
5665
  : mapForEach(
5635
5666
  keys,
5636
5667
  (valueId, {action}) =>
5637
- (values[valueId] = action == DELETE ? null : yValues.get(valueId)),
5668
+ (values[valueId] =
5669
+ action == DELETE ? void 0 : yValues.get(valueId)),
5638
5670
  ),
5639
5671
  );
5640
5672
  return [tables, values, 1];
@@ -5832,7 +5864,7 @@ const createQueries = getCreateFunction((store) => {
5832
5864
  setDefinition(queryId, tableId);
5833
5865
  resetPreStores(queryId);
5834
5866
  const selectEntries = [];
5835
- const joinEntries = [[null, [tableId, null, null, [], mapNew()]]];
5867
+ const joinEntries = [[void 0, [tableId, void 0, void 0, [], mapNew()]]];
5836
5868
  const wheres = [];
5837
5869
  const groupEntries = [];
5838
5870
  const havings = [];
@@ -5848,7 +5880,7 @@ const createQueries = getCreateFunction((store) => {
5848
5880
  };
5849
5881
  const join = (joinedTableId, arg1, arg2) => {
5850
5882
  const fromIntermediateJoinedTableId =
5851
- isUndefined(arg2) || isFunction(arg1) ? null : arg1;
5883
+ isUndefined(arg2) || isFunction(arg1) ? void 0 : arg1;
5852
5884
  const onArg = isUndefined(fromIntermediateJoinedTableId) ? arg1 : arg2;
5853
5885
  const joinEntry = [
5854
5886
  joinedTableId,
@@ -5968,7 +6000,7 @@ const createQueries = getCreateFunction((store) => {
5968
6000
  groupRow[groupedCellId] = isUndefined(
5969
6001
  getCellOrValueType(aggregateValue),
5970
6002
  )
5971
- ? null
6003
+ ? void 0
5972
6004
  : aggregateValue;
5973
6005
  },
5974
6006
  );
@@ -6097,20 +6129,20 @@ const createQueries = getCreateFunction((store) => {
6097
6129
  const listenToTable = (rootRowId, tableId2, rowId, joinedTableIds2) => {
6098
6130
  const getCell = (cellId) => store.getCell(tableId2, rowId, cellId);
6099
6131
  arrayForEach(joinedTableIds2, (remoteAsTableId) => {
6100
- const [realJoinedTableId, , on, nextJoinedTableIds, remoteIdPair] =
6132
+ const [realJoinedTableId, , on, nextJoinedTableIds, remoteIdPairs] =
6101
6133
  mapGet(joins, remoteAsTableId);
6102
6134
  const remoteRowId = on?.(getCell, rootRowId);
6103
6135
  const [previousRemoteRowId, previousRemoteListenerId] =
6104
- mapGet(remoteIdPair, rootRowId) ?? [];
6136
+ mapGet(remoteIdPairs, rootRowId) ?? [];
6105
6137
  if (remoteRowId != previousRemoteRowId) {
6106
6138
  if (!isUndefined(previousRemoteListenerId)) {
6107
6139
  delStoreListeners(queryId, previousRemoteListenerId);
6108
6140
  }
6109
6141
  mapSet(
6110
- remoteIdPair,
6142
+ remoteIdPairs,
6111
6143
  rootRowId,
6112
6144
  isUndefined(remoteRowId)
6113
- ? null
6145
+ ? void 0
6114
6146
  : [
6115
6147
  remoteRowId,
6116
6148
  ...addStoreListeners(
@@ -6131,7 +6163,7 @@ const createQueries = getCreateFunction((store) => {
6131
6163
  });
6132
6164
  writeSelectRow(rootRowId);
6133
6165
  };
6134
- const {3: joinedTableIds} = mapGet(joins, null);
6166
+ const {3: joinedTableIds} = mapGet(joins, void 0);
6135
6167
  selectJoinWhereStore.transaction(() =>
6136
6168
  addStoreListeners(
6137
6169
  queryId,
@@ -6595,7 +6627,7 @@ const createCustomSynchronizer = (
6595
6627
  ifNotUndefined(
6596
6628
  mapGet(pendingRequests, transactionOrRequestId),
6597
6629
  ([toClientId, handleResponse]) =>
6598
- isUndefined(toClientId) || toClientId == fromClientId
6630
+ isNull(toClientId) || toClientId == fromClientId
6599
6631
  ? handleResponse(body, fromClientId)
6600
6632
  : /* istanbul ignore next */
6601
6633
  0,
@@ -6655,7 +6687,7 @@ const createBroadcastChannelSynchronizer = (
6655
6687
  channel.onmessage = ({
6656
6688
  data: [fromClientId, toClientId, requestId, message, body],
6657
6689
  }) =>
6658
- isUndefined(toClientId) || toClientId == clientId
6690
+ isNull(toClientId) || toClientId == clientId
6659
6691
  ? receive(fromClientId, requestId, message, body)
6660
6692
  : 0;
6661
6693
  };
@@ -6680,7 +6712,7 @@ const createLocalSynchronizer = (store, onSend, onReceive, onIgnoredError) => {
6680
6712
  const clientId = getUniqueId$1();
6681
6713
  const send = (toClientId, requestId, message, body) =>
6682
6714
  startTimeout(() =>
6683
- isUndefined(toClientId)
6715
+ isNull(toClientId)
6684
6716
  ? mapForEach(clients, (otherClientId, receive) =>
6685
6717
  otherClientId != clientId
6686
6718
  ? receive(clientId, requestId, message, body)
@@ -9525,7 +9557,7 @@ const RelationshipInHtmlRow = ({
9525
9557
  ? localRowId
9526
9558
  : tableId === remoteTableId
9527
9559
  ? remoteRowId
9528
- : null;
9560
+ : void 0;
9529
9561
  return isUndefined(rowId)
9530
9562
  ? null
9531
9563
  : /* @__PURE__ */ jsx(
@@ -10268,11 +10300,11 @@ const getNewIdFromSuggestedId = (suggestedId, has) => {
10268
10300
  };
10269
10301
  const ConfirmableActions = ({actions, ...props}) => {
10270
10302
  const [confirming, setConfirming] = useState();
10271
- const handleDone = useCallback(() => setConfirming(null), []);
10303
+ const handleDone = useCallback(() => setConfirming(void 0), []);
10272
10304
  useEffect(() => {
10273
- if (confirming != null) {
10305
+ if (!isUndefined(confirming)) {
10274
10306
  const handleKeyDown = (e) => {
10275
- if (confirming != null && e.key === 'Escape') {
10307
+ if (!isUndefined(confirming) && e.key === 'Escape') {
10276
10308
  e.preventDefault();
10277
10309
  handleDone();
10278
10310
  }
@@ -10281,7 +10313,7 @@ const ConfirmableActions = ({actions, ...props}) => {
10281
10313
  return () => document.removeEventListener('keydown', handleKeyDown);
10282
10314
  }
10283
10315
  }, [confirming, handleDone]);
10284
- if (confirming != null) {
10316
+ if (!isUndefined(confirming)) {
10285
10317
  const [, , Component] = actions[confirming];
10286
10318
  return /* @__PURE__ */ jsxs(Fragment, {
10287
10319
  children: [
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tinybase",
3
- "version": "7.0.0-beta.2",
3
+ "version": "7.0.0",
4
4
  "author": "jamesgpearce",
5
5
  "repository": "github:tinyplex/tinybase",
6
6
  "license": "MIT",
@@ -21,8 +21,8 @@
21
21
  },
22
22
  "sideEffects": false,
23
23
  "peerDependencies": {
24
- "@automerge/automerge-repo": "^1.2.1",
25
- "@cloudflare/workers-types": "^4.20251128.0",
24
+ "@automerge/automerge-repo": "^2.5.1",
25
+ "@cloudflare/workers-types": "^4.20251202.0",
26
26
  "@electric-sql/pglite": "^0.3.14",
27
27
  "@libsql/client": "^0.15.15",
28
28
  "@powersync/common": "^1.43.1",
@@ -13,15 +13,19 @@ const strReplace = (str, searchValue, replaceValue) =>
13
13
  str.replace(searchValue, replaceValue);
14
14
 
15
15
  const promise = Promise;
16
+ const getIfNotFunction = (predicate) => (value, then, otherwise) =>
17
+ predicate(value) ? otherwise?.() : then(value);
16
18
  const GLOBAL = globalThis;
17
19
  const THOUSAND = 1e3;
18
20
  const startInterval = (callback, sec, immediate) => {
19
21
  return setInterval(callback, sec * THOUSAND);
20
22
  };
21
23
  const stopInterval = clearInterval;
22
- const isUndefined = (thing) => thing == void 0;
23
- const ifNotUndefined = (value, then, otherwise) =>
24
- isUndefined(value) ? otherwise?.() : then(value);
24
+ const isNullish = (thing) => thing == null;
25
+ const isUndefined = (thing) => thing === void 0;
26
+ const isNull = (thing) => thing === null;
27
+ const ifNotNullish = getIfNotFunction(isNullish);
28
+ const ifNotUndefined = getIfNotFunction(isUndefined);
25
29
  const isString = (thing) => getTypeOf(thing) == STRING;
26
30
  const isArray = (thing) => Array.isArray(thing);
27
31
  const slice = (arrayOrString, start, end) => arrayOrString.slice(start, end);
@@ -61,12 +65,12 @@ const object = Object;
61
65
  const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
62
66
  const objEntries = object.entries;
63
67
  const isObject = (obj) =>
64
- !isUndefined(obj) &&
65
- ifNotUndefined(
68
+ !isNullish(obj) &&
69
+ ifNotNullish(
66
70
  getPrototypeOf(obj),
67
71
  (objPrototype) =>
68
72
  objPrototype == object.prototype ||
69
- isUndefined(getPrototypeOf(objPrototype)),
73
+ isNullish(getPrototypeOf(objPrototype)),
70
74
 
71
75
  /* istanbul ignore next */
72
76
  () => true,
@@ -95,7 +99,7 @@ const mapForEach = (map, cb) =>
95
99
  const mapMap = (coll, cb) =>
96
100
  arrayMap([...(coll?.entries() ?? [])], ([key, value]) => cb(value, key));
97
101
  const mapSet = (map, key, value) =>
98
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
102
+ value === void 0 ? (collDel(map, key), map) : map?.set(key, value);
99
103
  const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
100
104
  if (!collHas(map, key)) {
101
105
  mapSet(map, key, getDefaultValue());
@@ -206,7 +210,7 @@ const getListenerFunctions = (getThing) => {
206
210
  const index = size(ids);
207
211
  if (index == size(path)) {
208
212
  listener(thing, ...ids, ...extraArgsGetter(ids));
209
- } else if (isUndefined(path[index])) {
213
+ } else if (isNull(path[index])) {
210
214
  arrayForEach(pathGetters[index]?.(...ids) ?? [], (id2) =>
211
215
  callWithIds(...ids, id2),
212
216
  );
@@ -579,7 +583,7 @@ const getDefaultedTabularConfigMap = (
579
583
  0,
580
584
  objSize(defaultObj),
581
585
  );
582
- if (!isUndefined(defaultedConfig[0]) && !exclude(id, defaultedConfig[0])) {
586
+ if (!isNull(defaultedConfig[0]) && !exclude(id, defaultedConfig[0])) {
583
587
  then(id, defaultedConfig[0]);
584
588
  mapSet(configMap, id, defaultedConfig);
585
589
  }
@@ -1306,7 +1310,7 @@ const createCustomSqlitePersister = (
1306
1310
  ` ${DATA_VERSION} d,${SCHEMA_VERSION} s,TOTAL_CHANGES() c FROM ${PRAGMA}${DATA_VERSION} JOIN ${PRAGMA}${SCHEMA_VERSION}`,
1307
1311
  );
1308
1312
  if (d != dataVersion || s != schemaVersion || c != totalChanges) {
1309
- if (dataVersion != null) {
1313
+ if (!isNullish(dataVersion)) {
1310
1314
  listener();
1311
1315
  }
1312
1316
  dataVersion = d;
@@ -1,9 +1,13 @@
1
1
  const TINYBASE = 'tinybase';
2
2
  const EMPTY_STRING = '';
3
3
 
4
- const isUndefined = (thing) => thing == void 0;
5
- const ifNotUndefined = (value, then, otherwise) =>
6
- isUndefined(value) ? otherwise?.() : then(value);
4
+ const getIfNotFunction = (predicate) => (value, then, otherwise) =>
5
+ predicate(value) ? otherwise?.() : then(value);
6
+ const isNullish = (thing) => thing == null;
7
+ const isUndefined = (thing) => thing === void 0;
8
+ const isNull = (thing) => thing === null;
9
+ const ifNotNullish = getIfNotFunction(isNullish);
10
+ const ifNotUndefined = getIfNotFunction(isUndefined);
7
11
  const isArray = (thing) => Array.isArray(thing);
8
12
  const size = (arrayOrString) => arrayOrString.length;
9
13
  const test = (regex, subject) => regex.test(subject);
@@ -29,12 +33,12 @@ const object = Object;
29
33
  const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
30
34
  const objEntries = object.entries;
31
35
  const isObject = (obj) =>
32
- !isUndefined(obj) &&
33
- ifNotUndefined(
36
+ !isNullish(obj) &&
37
+ ifNotNullish(
34
38
  getPrototypeOf(obj),
35
39
  (objPrototype) =>
36
40
  objPrototype == object.prototype ||
37
- isUndefined(getPrototypeOf(objPrototype)),
41
+ isNullish(getPrototypeOf(objPrototype)),
38
42
 
39
43
  /* istanbul ignore next */
40
44
  () => true,
@@ -70,7 +74,7 @@ const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
70
74
  const mapNew = (entries) => new Map(entries);
71
75
  const mapGet = (map, key) => map?.get(key);
72
76
  const mapSet = (map, key, value) =>
73
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
77
+ value === void 0 ? (collDel(map, key), map) : map?.set(key, value);
74
78
  const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
75
79
  if (!collHas(map, key)) {
76
80
  mapSet(map, key, getDefaultValue());
@@ -181,7 +185,7 @@ const getListenerFunctions = (getThing) => {
181
185
  const index = size(ids);
182
186
  if (index == size(path)) {
183
187
  listener(thing, ...ids, ...extraArgsGetter(ids));
184
- } else if (isUndefined(path[index])) {
188
+ } else if (isNull(path[index])) {
185
189
  arrayForEach(pathGetters[index]?.(...ids) ?? [], (id2) =>
186
190
  callWithIds(...ids, id2),
187
191
  );
@@ -1,9 +1,13 @@
1
1
  const TINYBASE = 'tinybase';
2
2
  const EMPTY_STRING = '';
3
3
 
4
- const isUndefined = (thing) => thing == void 0;
5
- const ifNotUndefined = (value, then, otherwise) =>
6
- isUndefined(value) ? otherwise?.() : then(value);
4
+ const getIfNotFunction = (predicate) => (value, then, otherwise) =>
5
+ predicate(value) ? otherwise?.() : then(value);
6
+ const isNullish = (thing) => thing == null;
7
+ const isUndefined = (thing) => thing === void 0;
8
+ const isNull = (thing) => thing === null;
9
+ const ifNotNullish = getIfNotFunction(isNullish);
10
+ const ifNotUndefined = getIfNotFunction(isUndefined);
7
11
  const isArray = (thing) => Array.isArray(thing);
8
12
  const size = (arrayOrString) => arrayOrString.length;
9
13
  const test = (regex, subject) => regex.test(subject);
@@ -29,12 +33,12 @@ const object = Object;
29
33
  const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
30
34
  const objEntries = object.entries;
31
35
  const isObject = (obj) =>
32
- !isUndefined(obj) &&
33
- ifNotUndefined(
36
+ !isNullish(obj) &&
37
+ ifNotNullish(
34
38
  getPrototypeOf(obj),
35
39
  (objPrototype) =>
36
40
  objPrototype == object.prototype ||
37
- isUndefined(getPrototypeOf(objPrototype)),
41
+ isNullish(getPrototypeOf(objPrototype)),
38
42
 
39
43
  /* istanbul ignore next */
40
44
  () => true,
@@ -70,7 +74,7 @@ const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
70
74
  const mapNew = (entries) => new Map(entries);
71
75
  const mapGet = (map, key) => map?.get(key);
72
76
  const mapSet = (map, key, value) =>
73
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
77
+ value === void 0 ? (collDel(map, key), map) : map?.set(key, value);
74
78
  const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
75
79
  if (!collHas(map, key)) {
76
80
  mapSet(map, key, getDefaultValue());
@@ -181,7 +185,7 @@ const getListenerFunctions = (getThing) => {
181
185
  const index = size(ids);
182
186
  if (index == size(path)) {
183
187
  listener(thing, ...ids, ...extraArgsGetter(ids));
184
- } else if (isUndefined(path[index])) {
188
+ } else if (isNull(path[index])) {
185
189
  arrayForEach(pathGetters[index]?.(...ids) ?? [], (id2) =>
186
190
  callWithIds(...ids, id2),
187
191
  );
@@ -1,11 +1,15 @@
1
1
  const EMPTY_STRING = '';
2
2
  const UNDEFINED = '\uFFFC';
3
3
 
4
+ const getIfNotFunction = (predicate) => (value, then, otherwise) =>
5
+ predicate(value) ? otherwise?.() : then(value);
4
6
  const GLOBAL = globalThis;
5
7
  const WINDOW = GLOBAL.window;
6
- const isUndefined = (thing) => thing == void 0;
7
- const ifNotUndefined = (value, then, otherwise) =>
8
- isUndefined(value) ? otherwise?.() : then(value);
8
+ const isNullish = (thing) => thing == null;
9
+ const isUndefined = (thing) => thing === void 0;
10
+ const isNull = (thing) => thing === null;
11
+ const ifNotNullish = getIfNotFunction(isNullish);
12
+ const ifNotUndefined = getIfNotFunction(isUndefined);
9
13
  const isArray = (thing) => Array.isArray(thing);
10
14
  const size = (arrayOrString) => arrayOrString.length;
11
15
  const test = (regex, subject) => regex.test(subject);
@@ -29,12 +33,12 @@ const arrayShift = (array) => array.shift();
29
33
  const object = Object;
30
34
  const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
31
35
  const isObject = (obj) =>
32
- !isUndefined(obj) &&
33
- ifNotUndefined(
36
+ !isNullish(obj) &&
37
+ ifNotNullish(
34
38
  getPrototypeOf(obj),
35
39
  (objPrototype) =>
36
40
  objPrototype == object.prototype ||
37
- isUndefined(getPrototypeOf(objPrototype)),
41
+ isNullish(getPrototypeOf(objPrototype)),
38
42
 
39
43
  /* istanbul ignore next */
40
44
  () => true,
@@ -60,7 +64,7 @@ const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
60
64
  const mapNew = (entries) => new Map(entries);
61
65
  const mapGet = (map, key) => map?.get(key);
62
66
  const mapSet = (map, key, value) =>
63
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
67
+ value === void 0 ? (collDel(map, key), map) : map?.set(key, value);
64
68
  const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
65
69
  if (!collHas(map, key)) {
66
70
  mapSet(map, key, getDefaultValue());
@@ -171,7 +175,7 @@ const getListenerFunctions = (getThing) => {
171
175
  const index = size(ids);
172
176
  if (index == size(path)) {
173
177
  listener(thing, ...ids, ...extraArgsGetter(ids));
174
- } else if (isUndefined(path[index])) {
178
+ } else if (isNull(path[index])) {
175
179
  arrayForEach(pathGetters[index]?.(...ids) ?? [], (id2) =>
176
180
  callWithIds(...ids, id2),
177
181
  );
@@ -1,11 +1,15 @@
1
1
  const EMPTY_STRING = '';
2
2
  const UNDEFINED = '\uFFFC';
3
3
 
4
+ const getIfNotFunction = (predicate) => (value, then, otherwise) =>
5
+ predicate(value) ? otherwise?.() : then(value);
4
6
  const GLOBAL = globalThis;
5
7
  const WINDOW = GLOBAL.window;
6
- const isUndefined = (thing) => thing == void 0;
7
- const ifNotUndefined = (value, then, otherwise) =>
8
- isUndefined(value) ? otherwise?.() : then(value);
8
+ const isNullish = (thing) => thing == null;
9
+ const isUndefined = (thing) => thing === void 0;
10
+ const isNull = (thing) => thing === null;
11
+ const ifNotNullish = getIfNotFunction(isNullish);
12
+ const ifNotUndefined = getIfNotFunction(isUndefined);
9
13
  const isArray = (thing) => Array.isArray(thing);
10
14
  const size = (arrayOrString) => arrayOrString.length;
11
15
  const test = (regex, subject) => regex.test(subject);
@@ -29,12 +33,12 @@ const arrayShift = (array) => array.shift();
29
33
  const object = Object;
30
34
  const getPrototypeOf = (obj) => object.getPrototypeOf(obj);
31
35
  const isObject = (obj) =>
32
- !isUndefined(obj) &&
33
- ifNotUndefined(
36
+ !isNullish(obj) &&
37
+ ifNotNullish(
34
38
  getPrototypeOf(obj),
35
39
  (objPrototype) =>
36
40
  objPrototype == object.prototype ||
37
- isUndefined(getPrototypeOf(objPrototype)),
41
+ isNullish(getPrototypeOf(objPrototype)),
38
42
 
39
43
  /* istanbul ignore next */
40
44
  () => true,
@@ -60,7 +64,7 @@ const collDel = (coll, keyOrValue) => coll?.delete(keyOrValue);
60
64
  const mapNew = (entries) => new Map(entries);
61
65
  const mapGet = (map, key) => map?.get(key);
62
66
  const mapSet = (map, key, value) =>
63
- isUndefined(value) ? (collDel(map, key), map) : map?.set(key, value);
67
+ value === void 0 ? (collDel(map, key), map) : map?.set(key, value);
64
68
  const mapEnsure = (map, key, getDefaultValue, hadExistingValue) => {
65
69
  if (!collHas(map, key)) {
66
70
  mapSet(map, key, getDefaultValue());
@@ -171,7 +175,7 @@ const getListenerFunctions = (getThing) => {
171
175
  const index = size(ids);
172
176
  if (index == size(path)) {
173
177
  listener(thing, ...ids, ...extraArgsGetter(ids));
174
- } else if (isUndefined(path[index])) {
178
+ } else if (isNull(path[index])) {
175
179
  arrayForEach(pathGetters[index]?.(...ids) ?? [], (id2) =>
176
180
  callWithIds(...ids, id2),
177
181
  );