@evolu/common 8.4.0 → 8.6.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 (353) hide show
  1. package/dist/src/Array.d.ts +191 -94
  2. package/dist/src/Array.d.ts.map +1 -1
  3. package/dist/src/Array.js +91 -40
  4. package/dist/src/Assert.d.ts +233 -30
  5. package/dist/src/Assert.d.ts.map +1 -1
  6. package/dist/src/Assert.js +151 -30
  7. package/dist/src/BigInt.d.ts +3 -3
  8. package/dist/src/BigInt.js +3 -3
  9. package/dist/src/Brand.d.ts +7 -7
  10. package/dist/src/Buffer.d.ts +12 -4
  11. package/dist/src/Buffer.d.ts.map +1 -1
  12. package/dist/src/Cache.d.ts +8 -3
  13. package/dist/src/Cache.d.ts.map +1 -1
  14. package/dist/src/Cache.js +8 -3
  15. package/dist/src/Callbacks.d.ts +8 -4
  16. package/dist/src/Callbacks.d.ts.map +1 -1
  17. package/dist/src/Console.d.ts +45 -30
  18. package/dist/src/Console.d.ts.map +1 -1
  19. package/dist/src/Console.js +32 -21
  20. package/dist/src/Crypto.d.ts +13 -8
  21. package/dist/src/Crypto.d.ts.map +1 -1
  22. package/dist/src/Crypto.js +6 -3
  23. package/dist/src/Eq.d.ts +107 -58
  24. package/dist/src/Eq.d.ts.map +1 -1
  25. package/dist/src/Eq.js +308 -112
  26. package/dist/src/Function.d.ts +54 -24
  27. package/dist/src/Function.d.ts.map +1 -1
  28. package/dist/src/Function.js +34 -17
  29. package/dist/src/Http.d.ts +52 -19
  30. package/dist/src/Http.d.ts.map +1 -1
  31. package/dist/src/Identicon.d.ts +9 -4
  32. package/dist/src/Identicon.d.ts.map +1 -1
  33. package/dist/src/Identicon.js +9 -4
  34. package/dist/src/LeakDetector.d.ts.map +1 -1
  35. package/dist/src/LeakDetector.js +4 -1
  36. package/dist/src/LockManager.d.ts +12 -10
  37. package/dist/src/LockManager.d.ts.map +1 -1
  38. package/dist/src/Lookup.d.ts +4 -2
  39. package/dist/src/Lookup.d.ts.map +1 -1
  40. package/dist/src/Lookup.js +5 -2
  41. package/dist/src/Number.d.ts +28 -24
  42. package/dist/src/Number.d.ts.map +1 -1
  43. package/dist/src/Number.js +16 -17
  44. package/dist/src/Object.d.ts +89 -47
  45. package/dist/src/Object.d.ts.map +1 -1
  46. package/dist/src/Object.js +88 -41
  47. package/dist/src/Option.d.ts +14 -5
  48. package/dist/src/Option.d.ts.map +1 -1
  49. package/dist/src/Option.js +14 -5
  50. package/dist/src/Order.d.ts +12 -12
  51. package/dist/src/Order.js +12 -12
  52. package/dist/src/Platform.d.ts +2 -2
  53. package/dist/src/Platform.js +1 -0
  54. package/dist/src/Random.d.ts +7 -4
  55. package/dist/src/Random.d.ts.map +1 -1
  56. package/dist/src/Redacted.d.ts +13 -6
  57. package/dist/src/Redacted.d.ts.map +1 -1
  58. package/dist/src/Redacted.js +4 -2
  59. package/dist/src/Ref.d.ts +4 -4
  60. package/dist/src/Relation.d.ts +5 -7
  61. package/dist/src/Relation.d.ts.map +1 -1
  62. package/dist/src/Relation.js +3 -3
  63. package/dist/src/Resource.d.ts +27 -12
  64. package/dist/src/Resource.d.ts.map +1 -1
  65. package/dist/src/Resource.js +9 -3
  66. package/dist/src/Result.d.ts +258 -114
  67. package/dist/src/Result.d.ts.map +1 -1
  68. package/dist/src/Result.js +74 -39
  69. package/dist/src/Schedule.d.ts +233 -116
  70. package/dist/src/Schedule.d.ts.map +1 -1
  71. package/dist/src/Schedule.js +204 -110
  72. package/dist/src/Set.d.ts +43 -24
  73. package/dist/src/Set.d.ts.map +1 -1
  74. package/dist/src/Set.js +25 -13
  75. package/dist/src/Sqlite.d.ts +4 -4
  76. package/dist/src/Sqlite.d.ts.map +1 -1
  77. package/dist/src/Sqlite.js +18 -15
  78. package/dist/src/Store.d.ts.map +1 -1
  79. package/dist/src/Store.js +3 -1
  80. package/dist/src/String.d.ts.map +1 -1
  81. package/dist/src/String.js +1 -1
  82. package/dist/src/Task.d.ts +555 -264
  83. package/dist/src/Task.d.ts.map +1 -1
  84. package/dist/src/Task.js +278 -168
  85. package/dist/src/Test.d.ts +10 -4
  86. package/dist/src/Test.d.ts.map +1 -1
  87. package/dist/src/Test.js +11 -4
  88. package/dist/src/Time.d.ts +27 -17
  89. package/dist/src/Time.d.ts.map +1 -1
  90. package/dist/src/Time.js +25 -8
  91. package/dist/src/Type.d.ts +1218 -372
  92. package/dist/src/Type.d.ts.map +1 -1
  93. package/dist/src/Type.js +1056 -379
  94. package/dist/src/Types.d.ts +95 -40
  95. package/dist/src/Types.d.ts.map +1 -1
  96. package/dist/src/Types.js +13 -4
  97. package/dist/src/WebSocket.d.ts +14 -6
  98. package/dist/src/WebSocket.d.ts.map +1 -1
  99. package/dist/src/WebSocket.js +8 -0
  100. package/dist/src/Worker.d.ts +10 -6
  101. package/dist/src/Worker.d.ts.map +1 -1
  102. package/dist/src/Worker.js +1 -1
  103. package/dist/src/intl/_en.d.ts +3 -1
  104. package/dist/src/intl/_en.d.ts.map +1 -1
  105. package/dist/src/intl/_en.js +17 -3
  106. package/dist/src/intl/ar.d.ts +3 -1
  107. package/dist/src/intl/ar.d.ts.map +1 -1
  108. package/dist/src/intl/ar.js +15 -2
  109. package/dist/src/intl/bn.d.ts +3 -1
  110. package/dist/src/intl/bn.d.ts.map +1 -1
  111. package/dist/src/intl/bn.js +16 -3
  112. package/dist/src/intl/ca.d.ts +3 -1
  113. package/dist/src/intl/ca.d.ts.map +1 -1
  114. package/dist/src/intl/ca.js +16 -3
  115. package/dist/src/intl/cs.d.ts +3 -1
  116. package/dist/src/intl/cs.d.ts.map +1 -1
  117. package/dist/src/intl/cs.js +16 -3
  118. package/dist/src/intl/da.d.ts +3 -1
  119. package/dist/src/intl/da.d.ts.map +1 -1
  120. package/dist/src/intl/da.js +16 -3
  121. package/dist/src/intl/de.d.ts +3 -1
  122. package/dist/src/intl/de.d.ts.map +1 -1
  123. package/dist/src/intl/de.js +16 -3
  124. package/dist/src/intl/el.d.ts +3 -1
  125. package/dist/src/intl/el.d.ts.map +1 -1
  126. package/dist/src/intl/el.js +16 -3
  127. package/dist/src/intl/es.d.ts +3 -1
  128. package/dist/src/intl/es.d.ts.map +1 -1
  129. package/dist/src/intl/es.js +16 -3
  130. package/dist/src/intl/fa.d.ts +3 -1
  131. package/dist/src/intl/fa.d.ts.map +1 -1
  132. package/dist/src/intl/fa.js +16 -3
  133. package/dist/src/intl/fi.d.ts +3 -1
  134. package/dist/src/intl/fi.d.ts.map +1 -1
  135. package/dist/src/intl/fi.js +16 -3
  136. package/dist/src/intl/fil.d.ts +3 -1
  137. package/dist/src/intl/fil.d.ts.map +1 -1
  138. package/dist/src/intl/fil.js +16 -3
  139. package/dist/src/intl/fr.d.ts +3 -1
  140. package/dist/src/intl/fr.d.ts.map +1 -1
  141. package/dist/src/intl/fr.js +16 -3
  142. package/dist/src/intl/he.d.ts +3 -1
  143. package/dist/src/intl/he.d.ts.map +1 -1
  144. package/dist/src/intl/he.js +16 -3
  145. package/dist/src/intl/hi.d.ts +3 -1
  146. package/dist/src/intl/hi.d.ts.map +1 -1
  147. package/dist/src/intl/hi.js +16 -3
  148. package/dist/src/intl/hr.d.ts +3 -1
  149. package/dist/src/intl/hr.d.ts.map +1 -1
  150. package/dist/src/intl/hr.js +16 -3
  151. package/dist/src/intl/hu.d.ts +2 -1
  152. package/dist/src/intl/hu.d.ts.map +1 -1
  153. package/dist/src/intl/hu.js +15 -3
  154. package/dist/src/intl/id.d.ts +3 -1
  155. package/dist/src/intl/id.d.ts.map +1 -1
  156. package/dist/src/intl/id.js +16 -3
  157. package/dist/src/intl/it.d.ts +3 -1
  158. package/dist/src/intl/it.d.ts.map +1 -1
  159. package/dist/src/intl/it.js +16 -3
  160. package/dist/src/intl/ja.d.ts +3 -1
  161. package/dist/src/intl/ja.d.ts.map +1 -1
  162. package/dist/src/intl/ja.js +16 -3
  163. package/dist/src/intl/ko.d.ts +3 -1
  164. package/dist/src/intl/ko.d.ts.map +1 -1
  165. package/dist/src/intl/ko.js +16 -3
  166. package/dist/src/intl/ml.d.ts +3 -1
  167. package/dist/src/intl/ml.d.ts.map +1 -1
  168. package/dist/src/intl/ml.js +16 -3
  169. package/dist/src/intl/mr.d.ts +3 -1
  170. package/dist/src/intl/mr.d.ts.map +1 -1
  171. package/dist/src/intl/mr.js +16 -3
  172. package/dist/src/intl/ms.d.ts +3 -1
  173. package/dist/src/intl/ms.d.ts.map +1 -1
  174. package/dist/src/intl/ms.js +15 -2
  175. package/dist/src/intl/nb.d.ts +2 -1
  176. package/dist/src/intl/nb.d.ts.map +1 -1
  177. package/dist/src/intl/nb.js +14 -2
  178. package/dist/src/intl/nl.d.ts +3 -1
  179. package/dist/src/intl/nl.d.ts.map +1 -1
  180. package/dist/src/intl/nl.js +16 -3
  181. package/dist/src/intl/pa.d.ts +3 -1
  182. package/dist/src/intl/pa.d.ts.map +1 -1
  183. package/dist/src/intl/pa.js +16 -3
  184. package/dist/src/intl/pl.d.ts +2 -0
  185. package/dist/src/intl/pl.d.ts.map +1 -1
  186. package/dist/src/intl/pl.js +15 -2
  187. package/dist/src/intl/pt-BR.d.ts +3 -1
  188. package/dist/src/intl/pt-BR.d.ts.map +1 -1
  189. package/dist/src/intl/pt-BR.js +16 -3
  190. package/dist/src/intl/pt.d.ts +3 -1
  191. package/dist/src/intl/pt.d.ts.map +1 -1
  192. package/dist/src/intl/pt.js +15 -2
  193. package/dist/src/intl/ro.d.ts +3 -1
  194. package/dist/src/intl/ro.d.ts.map +1 -1
  195. package/dist/src/intl/ro.js +16 -3
  196. package/dist/src/intl/sk.d.ts +3 -1
  197. package/dist/src/intl/sk.d.ts.map +1 -1
  198. package/dist/src/intl/sk.js +15 -2
  199. package/dist/src/intl/sl.d.ts +3 -1
  200. package/dist/src/intl/sl.d.ts.map +1 -1
  201. package/dist/src/intl/sl.js +16 -3
  202. package/dist/src/intl/sv.d.ts +3 -1
  203. package/dist/src/intl/sv.d.ts.map +1 -1
  204. package/dist/src/intl/sv.js +16 -3
  205. package/dist/src/intl/sw.d.ts +1 -0
  206. package/dist/src/intl/sw.d.ts.map +1 -1
  207. package/dist/src/intl/sw.js +14 -2
  208. package/dist/src/intl/ta.d.ts +3 -1
  209. package/dist/src/intl/ta.d.ts.map +1 -1
  210. package/dist/src/intl/ta.js +16 -3
  211. package/dist/src/intl/te.d.ts +3 -1
  212. package/dist/src/intl/te.d.ts.map +1 -1
  213. package/dist/src/intl/te.js +16 -3
  214. package/dist/src/intl/th.d.ts +3 -1
  215. package/dist/src/intl/th.d.ts.map +1 -1
  216. package/dist/src/intl/th.js +16 -3
  217. package/dist/src/intl/tr.d.ts +3 -1
  218. package/dist/src/intl/tr.d.ts.map +1 -1
  219. package/dist/src/intl/tr.js +16 -3
  220. package/dist/src/intl/uk.d.ts +3 -1
  221. package/dist/src/intl/uk.d.ts.map +1 -1
  222. package/dist/src/intl/uk.js +16 -3
  223. package/dist/src/intl/ur.d.ts +3 -1
  224. package/dist/src/intl/ur.d.ts.map +1 -1
  225. package/dist/src/intl/ur.js +15 -2
  226. package/dist/src/intl/vi.d.ts +3 -1
  227. package/dist/src/intl/vi.d.ts.map +1 -1
  228. package/dist/src/intl/vi.js +16 -3
  229. package/dist/src/intl/zh-CN.d.ts +3 -1
  230. package/dist/src/intl/zh-CN.d.ts.map +1 -1
  231. package/dist/src/intl/zh-CN.js +16 -3
  232. package/dist/src/intl/zh-TW.d.ts +3 -1
  233. package/dist/src/intl/zh-TW.d.ts.map +1 -1
  234. package/dist/src/intl/zh-TW.js +16 -3
  235. package/dist/src/local-first/Db.js +3 -2
  236. package/dist/src/local-first/Evolu.d.ts +47 -24
  237. package/dist/src/local-first/Evolu.d.ts.map +1 -1
  238. package/dist/src/local-first/Evolu.js +1 -0
  239. package/dist/src/local-first/Owner.d.ts +18 -14
  240. package/dist/src/local-first/Owner.d.ts.map +1 -1
  241. package/dist/src/local-first/Owner.js +14 -11
  242. package/dist/src/local-first/Protocol.d.ts +5 -5
  243. package/dist/src/local-first/Protocol.d.ts.map +1 -1
  244. package/dist/src/local-first/Protocol.js +35 -29
  245. package/dist/src/local-first/Query.d.ts +34 -21
  246. package/dist/src/local-first/Query.d.ts.map +1 -1
  247. package/dist/src/local-first/Query.js +27 -14
  248. package/dist/src/local-first/Relay.d.ts +12 -5
  249. package/dist/src/local-first/Relay.d.ts.map +1 -1
  250. package/dist/src/local-first/Relay.js +1 -1
  251. package/dist/src/local-first/Schema.d.ts +19 -11
  252. package/dist/src/local-first/Schema.d.ts.map +1 -1
  253. package/dist/src/local-first/Schema.js +11 -6
  254. package/dist/src/local-first/Shared.d.ts.map +1 -1
  255. package/dist/src/local-first/Shared.js +4 -2
  256. package/dist/src/local-first/Storage.d.ts +4 -2
  257. package/dist/src/local-first/Storage.d.ts.map +1 -1
  258. package/dist/src/local-first/Timestamp.d.ts.map +1 -1
  259. package/dist/src/local-first/Timestamp.js +1 -1
  260. package/package.json +3 -4
  261. package/src/Array.ts +195 -95
  262. package/src/Assert.ts +337 -31
  263. package/src/BigInt.ts +3 -3
  264. package/src/Brand.ts +7 -7
  265. package/src/Buffer.ts +12 -4
  266. package/src/Cache.ts +8 -3
  267. package/src/Callbacks.ts +8 -4
  268. package/src/Console.ts +45 -30
  269. package/src/Crypto.ts +13 -8
  270. package/src/Eq.ts +450 -122
  271. package/src/Function.ts +54 -24
  272. package/src/Http.ts +52 -19
  273. package/src/Identicon.ts +9 -4
  274. package/src/LeakDetector.ts +4 -3
  275. package/src/LockManager.ts +12 -10
  276. package/src/Lookup.ts +5 -2
  277. package/src/Number.ts +28 -24
  278. package/src/Object.ts +115 -49
  279. package/src/Option.ts +14 -5
  280. package/src/Order.ts +12 -12
  281. package/src/Platform.ts +3 -2
  282. package/src/Random.ts +7 -4
  283. package/src/Redacted.ts +13 -6
  284. package/src/Ref.ts +4 -4
  285. package/src/Relation.ts +8 -10
  286. package/src/Resource.ts +36 -15
  287. package/src/Result.ts +263 -119
  288. package/src/Schedule.ts +233 -116
  289. package/src/Set.ts +43 -24
  290. package/src/Sqlite.ts +18 -15
  291. package/src/Store.ts +3 -1
  292. package/src/String.ts +1 -1
  293. package/src/Task.ts +566 -286
  294. package/src/Test.ts +11 -4
  295. package/src/Time.ts +36 -19
  296. package/src/Type.ts +2191 -590
  297. package/src/Types.ts +108 -40
  298. package/src/WebSocket.ts +22 -6
  299. package/src/Worker.ts +11 -7
  300. package/src/intl/_en.ts +20 -4
  301. package/src/intl/ar.ts +17 -2
  302. package/src/intl/bn.ts +19 -4
  303. package/src/intl/ca.ts +19 -4
  304. package/src/intl/cs.ts +19 -4
  305. package/src/intl/da.ts +19 -4
  306. package/src/intl/de.ts +19 -4
  307. package/src/intl/el.ts +19 -4
  308. package/src/intl/es.ts +19 -4
  309. package/src/intl/fa.ts +19 -4
  310. package/src/intl/fi.ts +19 -4
  311. package/src/intl/fil.ts +19 -4
  312. package/src/intl/fr.ts +19 -4
  313. package/src/intl/he.ts +19 -4
  314. package/src/intl/hi.ts +19 -4
  315. package/src/intl/hr.ts +19 -4
  316. package/src/intl/hu.ts +18 -4
  317. package/src/intl/id.ts +19 -4
  318. package/src/intl/it.ts +19 -4
  319. package/src/intl/ja.ts +19 -4
  320. package/src/intl/ko.ts +19 -4
  321. package/src/intl/ml.ts +19 -4
  322. package/src/intl/mr.ts +19 -4
  323. package/src/intl/ms.ts +17 -2
  324. package/src/intl/nb.ts +16 -2
  325. package/src/intl/nl.ts +19 -4
  326. package/src/intl/pa.ts +19 -4
  327. package/src/intl/pl.ts +18 -2
  328. package/src/intl/pt-BR.ts +19 -4
  329. package/src/intl/pt.ts +17 -2
  330. package/src/intl/ro.ts +19 -4
  331. package/src/intl/sk.ts +17 -2
  332. package/src/intl/sl.ts +19 -4
  333. package/src/intl/sv.ts +19 -4
  334. package/src/intl/sw.ts +15 -2
  335. package/src/intl/ta.ts +19 -4
  336. package/src/intl/te.ts +19 -4
  337. package/src/intl/th.ts +19 -4
  338. package/src/intl/tr.ts +19 -4
  339. package/src/intl/uk.ts +19 -4
  340. package/src/intl/ur.ts +17 -2
  341. package/src/intl/vi.ts +19 -3
  342. package/src/intl/zh-CN.ts +19 -4
  343. package/src/intl/zh-TW.ts +19 -4
  344. package/src/local-first/Db.ts +2 -1
  345. package/src/local-first/Evolu.ts +48 -24
  346. package/src/local-first/Owner.ts +18 -14
  347. package/src/local-first/Protocol.ts +45 -35
  348. package/src/local-first/Query.ts +40 -24
  349. package/src/local-first/Relay.ts +13 -6
  350. package/src/local-first/Schema.ts +19 -11
  351. package/src/local-first/Shared.ts +4 -2
  352. package/src/local-first/Storage.ts +4 -2
  353. package/src/local-first/Timestamp.ts +1 -1
package/src/Set.ts CHANGED
@@ -13,6 +13,7 @@
13
13
  * ```ts
14
14
  * import {
15
15
  * addToSet,
16
+ * assertEqual,
16
17
  * deleteFromSet,
17
18
  * filterSet,
18
19
  * firstInSet,
@@ -31,7 +32,7 @@
31
32
  * const difference = intersection.difference(new Set([4]));
32
33
  *
33
34
  * if (!isNonEmptySet(difference)) throw new Error("Expected values");
34
- * expect(firstInSet(difference)).toBe(6);
35
+ * assertEqual(firstInSet(difference), 6);
35
36
  * ```
36
37
  *
37
38
  * @module
@@ -58,14 +59,19 @@ export const emptySet: ReadonlySet<never> = /*#__PURE__*/ new Set();
58
59
  * ### Preserving non-empty inputs
59
60
  *
60
61
  * ```ts
61
- * import { createSet, type NonEmptyReadonlySet } from "@evolu/common";
62
+ * import {
63
+ * assertEqual,
64
+ * assertType,
65
+ * createSet,
66
+ * type NonEmptyReadonlySet,
67
+ * } from "@evolu/common";
62
68
  *
63
69
  * const values = createSet([1, 2, 3]);
64
70
  * const empty = createSet([] as ReadonlyArray<number>);
65
71
  *
66
- * expectTypeOf(values).toEqualTypeOf<NonEmptyReadonlySet<number>>();
67
- * expectTypeOf(empty).toEqualTypeOf<ReadonlySet<number>>();
68
- * expect(values).toEqual(new Set([1, 2, 3]));
72
+ * assertType<NonEmptyReadonlySet<number>, typeof values>();
73
+ * assertType<ReadonlySet<number>, typeof empty>();
74
+ * assertEqual(values, new Set([1, 2, 3]));
69
75
  * ```
70
76
  *
71
77
  * @group Constructors
@@ -108,13 +114,18 @@ export type NonEmptyReadonlySet<T> = ReadonlySet<T> & Brand<"NonEmpty">;
108
114
  * ### Narrowing before access
109
115
  *
110
116
  * ```ts
111
- * import { isNonEmptySet, type NonEmptyReadonlySet } from "@evolu/common";
117
+ * import {
118
+ * assertEqual,
119
+ * assertType,
120
+ * isNonEmptySet,
121
+ * type NonEmptyReadonlySet,
122
+ * } from "@evolu/common";
112
123
  *
113
124
  * const set: ReadonlySet<number> = new Set([1, 2, 3]);
114
125
  * if (!isNonEmptySet(set)) throw new Error("Expected a non-empty set");
115
126
  *
116
- * expectTypeOf(set).toEqualTypeOf<NonEmptyReadonlySet<number>>();
117
- * expect(set.size).toBe(3);
127
+ * assertType<NonEmptyReadonlySet<number>, typeof set>();
128
+ * assertEqual(set.size, 3);
118
129
  * ```
119
130
  *
120
131
  * @group Type guards
@@ -132,15 +143,21 @@ export const isNonEmptySet = <T>(
132
143
  * ### Adding without mutation
133
144
  *
134
145
  * ```ts
135
- * import { addToSet, type NonEmptyReadonlySet } from "@evolu/common";
146
+ * import {
147
+ * addToSet,
148
+ * assertEqual,
149
+ * assertTrue,
150
+ * assertType,
151
+ * type NonEmptyReadonlySet,
152
+ * } from "@evolu/common";
136
153
  *
137
154
  * const original: ReadonlySet<number> = new Set([1, 2]);
138
155
  * const added = addToSet(original, 3);
139
156
  * const unchanged = addToSet(original, 2);
140
157
  *
141
- * expectTypeOf(added).toEqualTypeOf<NonEmptyReadonlySet<number>>();
142
- * expect(added).toEqual(new Set([1, 2, 3]));
143
- * expect(unchanged).not.toBe(original);
158
+ * assertType<NonEmptyReadonlySet<number>, typeof added>();
159
+ * assertEqual(added, new Set([1, 2, 3]));
160
+ * assertTrue(unchanged !== original);
144
161
  * ```
145
162
  *
146
163
  * @group Transformations
@@ -163,11 +180,11 @@ export const addToSet = <T>(
163
180
  * ### Deleting without mutation
164
181
  *
165
182
  * ```ts
166
- * import { deleteFromSet } from "@evolu/common";
183
+ * import { assertEqual, assertTrue, deleteFromSet } from "@evolu/common";
167
184
  *
168
185
  * const original = new Set([1, 2, 3]);
169
- * expect(deleteFromSet(original, 2)).toEqual(new Set([1, 3]));
170
- * expect(deleteFromSet(original, 5)).not.toBe(original);
186
+ * assertEqual(deleteFromSet(original, 2), new Set([1, 3]));
187
+ * assertTrue(deleteFromSet(original, 5) !== original);
171
188
  * ```
172
189
  *
173
190
  * @group Transformations
@@ -193,6 +210,8 @@ export const deleteFromSet = <T>(
193
210
  *
194
211
  * ```ts
195
212
  * import {
213
+ * assertEqual,
214
+ * assertType,
196
215
  * createSet,
197
216
  * mapSet,
198
217
  * type NonEmptyReadonlySet,
@@ -202,9 +221,9 @@ export const deleteFromSet = <T>(
202
221
  * const doubled = mapSet(original, (x) => x * 2);
203
222
  * const parity = mapSet(original, (x) => x % 2);
204
223
  *
205
- * expectTypeOf(doubled).toEqualTypeOf<NonEmptyReadonlySet<number>>();
206
- * expect(doubled).toEqual(new Set([2, 4, 6]));
207
- * expect(parity).toEqual(new Set([1, 0]));
224
+ * assertType<NonEmptyReadonlySet<number>, typeof doubled>();
225
+ * assertEqual(doubled, new Set([2, 4, 6]));
226
+ * assertEqual(parity, new Set([1, 0]));
208
227
  * ```
209
228
  *
210
229
  * @group Transformations
@@ -239,18 +258,18 @@ export function mapSet<T, U>(
239
258
  * ### Filtering and refining
240
259
  *
241
260
  * ```ts
242
- * import { filterSet } from "@evolu/common";
261
+ * import { assertEqual, assertType, filterSet } from "@evolu/common";
243
262
  *
244
263
  * const evens = filterSet(new Set([1, 2, 3, 4, 5]), (x) => x % 2 === 0);
245
- * expect(evens).toEqual(new Set([2, 4]));
264
+ * assertEqual(evens, new Set([2, 4]));
246
265
  *
247
266
  * const mixed: ReadonlySet<string | number> = new Set([1, "a", 2, "b"]);
248
267
  * const strings = filterSet(
249
268
  * mixed,
250
269
  * (value): value is string => typeof value === "string",
251
270
  * );
252
- * expectTypeOf(strings).toEqualTypeOf<ReadonlySet<string>>();
253
- * expect(strings).toEqual(new Set(["a", "b"]));
271
+ * assertType<ReadonlySet<string>, typeof strings>();
272
+ * assertEqual(strings, new Set(["a", "b"]));
254
273
  * ```
255
274
  *
256
275
  * @group Transformations
@@ -284,10 +303,10 @@ export function filterSet<T>(
284
303
  * ### Reading the first value
285
304
  *
286
305
  * ```ts
287
- * import { createSet, firstInSet } from "@evolu/common";
306
+ * import { assertEqual, createSet, firstInSet } from "@evolu/common";
288
307
  *
289
308
  * const set = createSet(["a", "b", "c"]);
290
- * expect(firstInSet(set)).toBe("a");
309
+ * assertEqual(firstInSet(set), "a");
291
310
  * ```
292
311
  *
293
312
  * @group Accessors
package/src/Sqlite.ts CHANGED
@@ -256,12 +256,13 @@ export const createSqlite =
256
256
  console.debug({ query });
257
257
 
258
258
  const label =
259
- query.options?.logQueryExecutionTime &&
260
- `SqliteQueryExecutionTime ${query.sql}`;
259
+ query.options?.logQueryExecutionTime === true
260
+ ? `SqliteQueryExecutionTime ${query.sql}`
261
+ : null;
261
262
 
262
- if (label) console.time(label);
263
+ if (label !== null) console.time(label);
263
264
  const result = driver.exec(query);
264
- if (label) console.timeEnd(label);
265
+ if (label !== null) console.timeEnd(label);
265
266
 
266
267
  if (query.options?.logExplainQueryPlan) {
267
268
  const result = driver.exec({
@@ -343,11 +344,12 @@ const drawSqliteQueryPlan = (rows: Array<SqliteQueryPlanRow>): string =>
343
344
  let indent = 0;
344
345
 
345
346
  do {
347
+ // oxlint-disable-next-line eslint/no-loop-func -- find invokes the callback synchronously before parentId changes.
346
348
  const parent = rows.find((r) => r.id === parentId);
347
349
  if (!parent) break;
348
350
  parentId = parent.parent;
349
351
  indent++;
350
- // eslint-disable-next-line @typescript-eslint/no-unnecessary-condition, no-constant-condition
352
+ // oxlint-disable-next-line eslint/no-constant-condition -- A missing parent terminates the traversal above.
351
353
  } while (true);
352
354
 
353
355
  return `${" ".repeat(indent)}${row.detail}`;
@@ -395,7 +397,7 @@ export const createPreparedStatementsCache = <P>(
395
397
  if (alwaysPrepare !== true && !query.options?.prepare)
396
398
  return null as never;
397
399
  let statement = statementsBySql.get(query.sql);
398
- if (!statement) {
400
+ if (statement === undefined) {
399
401
  statement = factory(query.sql);
400
402
  statementsBySql.set(query.sql, statement);
401
403
  }
@@ -432,7 +434,7 @@ export type SqlTemplateParam = SqliteValue | SqlIdentifier | RawSql;
432
434
  * ### Example
433
435
  *
434
436
  * ```ts
435
- * import { sql } from "@evolu/common";
437
+ * import { assertEqual, assertTrue, sql } from "@evolu/common";
436
438
  *
437
439
  * const id = 42;
438
440
  * const name = "Alice";
@@ -450,12 +452,13 @@ export type SqlTemplateParam = SqliteValue | SqlIdentifier | RawSql;
450
452
  * const orderBy = "created_at desc";
451
453
  * const ordered = sql`select * from users order by ${sql.raw(orderBy)};`;
452
454
  *
453
- * expect(select).toEqual({
455
+ * assertEqual(select, {
454
456
  * sql: "select * from users where id = ? and name = ?;",
455
457
  * parameters: [42, "Alice"],
456
458
  * });
457
- * expect(createTable.sql).toContain('create table "users"');
458
- * expect(ordered.sql).toBe(
459
+ * assertTrue(createTable.sql.includes('create table "users"'));
460
+ * assertEqual(
461
+ * ordered.sql,
459
462
  * "select * from users order by created_at desc;",
460
463
  * );
461
464
  * ```
@@ -492,7 +495,7 @@ export const sql = (
492
495
  sql.identifier = (identifier: string): SqlIdentifier => ({
493
496
  type: "SqlIdentifier",
494
497
  // From Kysely
495
- sql: `"${identifier.replace(/"/g, '""')}"` as SafeSql,
498
+ sql: `"${identifier.replaceAll('"', '""')}"` as SafeSql,
496
499
  });
497
500
 
498
501
  /**
@@ -674,9 +677,9 @@ export const sqliteFalse = 0;
674
677
  * ### Example
675
678
  *
676
679
  * ```ts
677
- * import { booleanToSqliteBoolean } from "@evolu/common";
680
+ * import { assertEqual, booleanToSqliteBoolean } from "@evolu/common";
678
681
  *
679
- * expect(booleanToSqliteBoolean(true)).toBe(1);
682
+ * assertEqual(booleanToSqliteBoolean(true), 1);
680
683
  * ```
681
684
  */
682
685
  export const booleanToSqliteBoolean = (value: boolean): SqliteBoolean =>
@@ -688,9 +691,9 @@ export const booleanToSqliteBoolean = (value: boolean): SqliteBoolean =>
688
691
  * ### Example
689
692
  *
690
693
  * ```ts
691
- * import { sqliteBooleanToBoolean } from "@evolu/common";
694
+ * import { assertTrue, sqliteBooleanToBoolean } from "@evolu/common";
692
695
  *
693
- * expect(sqliteBooleanToBoolean(1)).toBe(true);
696
+ * assertTrue(sqliteBooleanToBoolean(1));
694
697
  * ```
695
698
  */
696
699
  export const sqliteBooleanToBoolean = (value: SqliteBoolean): boolean =>
package/src/Store.ts CHANGED
@@ -70,7 +70,9 @@ export const createStore = <T>(initialState: T, eq?: Eq<T>): Store<T> => {
70
70
  get: ref.get,
71
71
  subscribe: (listener) => {
72
72
  listeners.add(listener);
73
- return () => listeners.delete(listener);
73
+ return () => {
74
+ listeners.delete(listener);
75
+ };
74
76
  },
75
77
 
76
78
  set: (state) => {
package/src/String.ts CHANGED
@@ -9,7 +9,7 @@
9
9
  * pattern.
10
10
  */
11
11
  export const escapeRegExp = (value: string): string =>
12
- value.replace(/[.*+?^${}()|[\]\\]/g, "\\$&");
12
+ value.replaceAll(/[.*+?^${}()|[\]\\]/gu, "\\$&");
13
13
 
14
14
  /** Converts an unknown value to a compact, human-readable diagnostic string. */
15
15
  export const safelyStringifyUnknownValue = (value: unknown): string => {