@evolu/common 8.5.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 (328) hide show
  1. package/dist/src/Array.d.ts +170 -97
  2. package/dist/src/Array.d.ts.map +1 -1
  3. package/dist/src/Array.js +67 -42
  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 +150 -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/LockManager.d.ts +12 -10
  35. package/dist/src/LockManager.d.ts.map +1 -1
  36. package/dist/src/Lookup.d.ts +4 -2
  37. package/dist/src/Lookup.d.ts.map +1 -1
  38. package/dist/src/Lookup.js +4 -2
  39. package/dist/src/Number.d.ts +28 -24
  40. package/dist/src/Number.d.ts.map +1 -1
  41. package/dist/src/Number.js +16 -17
  42. package/dist/src/Object.d.ts +89 -47
  43. package/dist/src/Object.d.ts.map +1 -1
  44. package/dist/src/Object.js +88 -41
  45. package/dist/src/Option.d.ts +14 -5
  46. package/dist/src/Option.d.ts.map +1 -1
  47. package/dist/src/Option.js +14 -5
  48. package/dist/src/Order.d.ts +12 -12
  49. package/dist/src/Order.js +12 -12
  50. package/dist/src/Platform.d.ts +2 -2
  51. package/dist/src/Random.d.ts +7 -4
  52. package/dist/src/Random.d.ts.map +1 -1
  53. package/dist/src/Redacted.d.ts +13 -6
  54. package/dist/src/Redacted.d.ts.map +1 -1
  55. package/dist/src/Redacted.js +4 -2
  56. package/dist/src/Ref.d.ts +4 -4
  57. package/dist/src/Relation.d.ts +5 -7
  58. package/dist/src/Relation.d.ts.map +1 -1
  59. package/dist/src/Resource.d.ts +27 -12
  60. package/dist/src/Resource.d.ts.map +1 -1
  61. package/dist/src/Result.d.ts +258 -114
  62. package/dist/src/Result.d.ts.map +1 -1
  63. package/dist/src/Result.js +71 -34
  64. package/dist/src/Schedule.d.ts +233 -116
  65. package/dist/src/Schedule.d.ts.map +1 -1
  66. package/dist/src/Schedule.js +204 -110
  67. package/dist/src/Set.d.ts +43 -24
  68. package/dist/src/Set.d.ts.map +1 -1
  69. package/dist/src/Set.js +25 -13
  70. package/dist/src/Sqlite.d.ts +4 -4
  71. package/dist/src/Sqlite.d.ts.map +1 -1
  72. package/dist/src/Sqlite.js +9 -8
  73. package/dist/src/Task.d.ts +441 -212
  74. package/dist/src/Task.d.ts.map +1 -1
  75. package/dist/src/Task.js +238 -115
  76. package/dist/src/Test.d.ts +10 -4
  77. package/dist/src/Test.d.ts.map +1 -1
  78. package/dist/src/Test.js +10 -4
  79. package/dist/src/Time.d.ts +27 -17
  80. package/dist/src/Time.d.ts.map +1 -1
  81. package/dist/src/Time.js +16 -6
  82. package/dist/src/Type.d.ts +1096 -387
  83. package/dist/src/Type.d.ts.map +1 -1
  84. package/dist/src/Type.js +1046 -372
  85. package/dist/src/Types.d.ts +95 -40
  86. package/dist/src/Types.d.ts.map +1 -1
  87. package/dist/src/Types.js +13 -4
  88. package/dist/src/WebSocket.d.ts +14 -6
  89. package/dist/src/WebSocket.d.ts.map +1 -1
  90. package/dist/src/Worker.d.ts +10 -6
  91. package/dist/src/Worker.d.ts.map +1 -1
  92. package/dist/src/intl/_en.d.ts +3 -1
  93. package/dist/src/intl/_en.d.ts.map +1 -1
  94. package/dist/src/intl/_en.js +17 -3
  95. package/dist/src/intl/ar.d.ts +3 -1
  96. package/dist/src/intl/ar.d.ts.map +1 -1
  97. package/dist/src/intl/ar.js +15 -2
  98. package/dist/src/intl/bn.d.ts +3 -1
  99. package/dist/src/intl/bn.d.ts.map +1 -1
  100. package/dist/src/intl/bn.js +16 -3
  101. package/dist/src/intl/ca.d.ts +3 -1
  102. package/dist/src/intl/ca.d.ts.map +1 -1
  103. package/dist/src/intl/ca.js +16 -3
  104. package/dist/src/intl/cs.d.ts +3 -1
  105. package/dist/src/intl/cs.d.ts.map +1 -1
  106. package/dist/src/intl/cs.js +16 -3
  107. package/dist/src/intl/da.d.ts +3 -1
  108. package/dist/src/intl/da.d.ts.map +1 -1
  109. package/dist/src/intl/da.js +16 -3
  110. package/dist/src/intl/de.d.ts +3 -1
  111. package/dist/src/intl/de.d.ts.map +1 -1
  112. package/dist/src/intl/de.js +16 -3
  113. package/dist/src/intl/el.d.ts +3 -1
  114. package/dist/src/intl/el.d.ts.map +1 -1
  115. package/dist/src/intl/el.js +16 -3
  116. package/dist/src/intl/es.d.ts +3 -1
  117. package/dist/src/intl/es.d.ts.map +1 -1
  118. package/dist/src/intl/es.js +16 -3
  119. package/dist/src/intl/fa.d.ts +3 -1
  120. package/dist/src/intl/fa.d.ts.map +1 -1
  121. package/dist/src/intl/fa.js +16 -3
  122. package/dist/src/intl/fi.d.ts +3 -1
  123. package/dist/src/intl/fi.d.ts.map +1 -1
  124. package/dist/src/intl/fi.js +16 -3
  125. package/dist/src/intl/fil.d.ts +3 -1
  126. package/dist/src/intl/fil.d.ts.map +1 -1
  127. package/dist/src/intl/fil.js +16 -3
  128. package/dist/src/intl/fr.d.ts +3 -1
  129. package/dist/src/intl/fr.d.ts.map +1 -1
  130. package/dist/src/intl/fr.js +16 -3
  131. package/dist/src/intl/he.d.ts +3 -1
  132. package/dist/src/intl/he.d.ts.map +1 -1
  133. package/dist/src/intl/he.js +16 -3
  134. package/dist/src/intl/hi.d.ts +3 -1
  135. package/dist/src/intl/hi.d.ts.map +1 -1
  136. package/dist/src/intl/hi.js +16 -3
  137. package/dist/src/intl/hr.d.ts +3 -1
  138. package/dist/src/intl/hr.d.ts.map +1 -1
  139. package/dist/src/intl/hr.js +16 -3
  140. package/dist/src/intl/hu.d.ts +2 -1
  141. package/dist/src/intl/hu.d.ts.map +1 -1
  142. package/dist/src/intl/hu.js +15 -3
  143. package/dist/src/intl/id.d.ts +3 -1
  144. package/dist/src/intl/id.d.ts.map +1 -1
  145. package/dist/src/intl/id.js +16 -3
  146. package/dist/src/intl/it.d.ts +3 -1
  147. package/dist/src/intl/it.d.ts.map +1 -1
  148. package/dist/src/intl/it.js +16 -3
  149. package/dist/src/intl/ja.d.ts +3 -1
  150. package/dist/src/intl/ja.d.ts.map +1 -1
  151. package/dist/src/intl/ja.js +16 -3
  152. package/dist/src/intl/ko.d.ts +3 -1
  153. package/dist/src/intl/ko.d.ts.map +1 -1
  154. package/dist/src/intl/ko.js +16 -3
  155. package/dist/src/intl/ml.d.ts +3 -1
  156. package/dist/src/intl/ml.d.ts.map +1 -1
  157. package/dist/src/intl/ml.js +16 -3
  158. package/dist/src/intl/mr.d.ts +3 -1
  159. package/dist/src/intl/mr.d.ts.map +1 -1
  160. package/dist/src/intl/mr.js +16 -3
  161. package/dist/src/intl/ms.d.ts +3 -1
  162. package/dist/src/intl/ms.d.ts.map +1 -1
  163. package/dist/src/intl/ms.js +15 -2
  164. package/dist/src/intl/nb.d.ts +2 -1
  165. package/dist/src/intl/nb.d.ts.map +1 -1
  166. package/dist/src/intl/nb.js +14 -2
  167. package/dist/src/intl/nl.d.ts +3 -1
  168. package/dist/src/intl/nl.d.ts.map +1 -1
  169. package/dist/src/intl/nl.js +16 -3
  170. package/dist/src/intl/pa.d.ts +3 -1
  171. package/dist/src/intl/pa.d.ts.map +1 -1
  172. package/dist/src/intl/pa.js +16 -3
  173. package/dist/src/intl/pl.d.ts +2 -0
  174. package/dist/src/intl/pl.d.ts.map +1 -1
  175. package/dist/src/intl/pl.js +15 -2
  176. package/dist/src/intl/pt-BR.d.ts +3 -1
  177. package/dist/src/intl/pt-BR.d.ts.map +1 -1
  178. package/dist/src/intl/pt-BR.js +16 -3
  179. package/dist/src/intl/pt.d.ts +3 -1
  180. package/dist/src/intl/pt.d.ts.map +1 -1
  181. package/dist/src/intl/pt.js +15 -2
  182. package/dist/src/intl/ro.d.ts +3 -1
  183. package/dist/src/intl/ro.d.ts.map +1 -1
  184. package/dist/src/intl/ro.js +16 -3
  185. package/dist/src/intl/sk.d.ts +3 -1
  186. package/dist/src/intl/sk.d.ts.map +1 -1
  187. package/dist/src/intl/sk.js +15 -2
  188. package/dist/src/intl/sl.d.ts +3 -1
  189. package/dist/src/intl/sl.d.ts.map +1 -1
  190. package/dist/src/intl/sl.js +16 -3
  191. package/dist/src/intl/sv.d.ts +3 -1
  192. package/dist/src/intl/sv.d.ts.map +1 -1
  193. package/dist/src/intl/sv.js +16 -3
  194. package/dist/src/intl/sw.d.ts +1 -0
  195. package/dist/src/intl/sw.d.ts.map +1 -1
  196. package/dist/src/intl/sw.js +14 -2
  197. package/dist/src/intl/ta.d.ts +3 -1
  198. package/dist/src/intl/ta.d.ts.map +1 -1
  199. package/dist/src/intl/ta.js +16 -3
  200. package/dist/src/intl/te.d.ts +3 -1
  201. package/dist/src/intl/te.d.ts.map +1 -1
  202. package/dist/src/intl/te.js +16 -3
  203. package/dist/src/intl/th.d.ts +3 -1
  204. package/dist/src/intl/th.d.ts.map +1 -1
  205. package/dist/src/intl/th.js +16 -3
  206. package/dist/src/intl/tr.d.ts +3 -1
  207. package/dist/src/intl/tr.d.ts.map +1 -1
  208. package/dist/src/intl/tr.js +16 -3
  209. package/dist/src/intl/uk.d.ts +3 -1
  210. package/dist/src/intl/uk.d.ts.map +1 -1
  211. package/dist/src/intl/uk.js +16 -3
  212. package/dist/src/intl/ur.d.ts +3 -1
  213. package/dist/src/intl/ur.d.ts.map +1 -1
  214. package/dist/src/intl/ur.js +15 -2
  215. package/dist/src/intl/vi.d.ts +3 -1
  216. package/dist/src/intl/vi.d.ts.map +1 -1
  217. package/dist/src/intl/vi.js +16 -3
  218. package/dist/src/intl/zh-CN.d.ts +3 -1
  219. package/dist/src/intl/zh-CN.d.ts.map +1 -1
  220. package/dist/src/intl/zh-CN.js +16 -3
  221. package/dist/src/intl/zh-TW.d.ts +3 -1
  222. package/dist/src/intl/zh-TW.d.ts.map +1 -1
  223. package/dist/src/intl/zh-TW.js +16 -3
  224. package/dist/src/local-first/Evolu.d.ts +47 -24
  225. package/dist/src/local-first/Evolu.d.ts.map +1 -1
  226. package/dist/src/local-first/Owner.d.ts +10 -7
  227. package/dist/src/local-first/Owner.d.ts.map +1 -1
  228. package/dist/src/local-first/Owner.js +10 -7
  229. package/dist/src/local-first/Protocol.d.ts +5 -5
  230. package/dist/src/local-first/Protocol.js +5 -5
  231. package/dist/src/local-first/Query.d.ts +34 -21
  232. package/dist/src/local-first/Query.d.ts.map +1 -1
  233. package/dist/src/local-first/Query.js +25 -13
  234. package/dist/src/local-first/Relay.d.ts +12 -5
  235. package/dist/src/local-first/Relay.d.ts.map +1 -1
  236. package/dist/src/local-first/Schema.d.ts +19 -11
  237. package/dist/src/local-first/Schema.d.ts.map +1 -1
  238. package/dist/src/local-first/Schema.js +11 -6
  239. package/dist/src/local-first/Storage.d.ts +4 -2
  240. package/dist/src/local-first/Storage.d.ts.map +1 -1
  241. package/package.json +3 -4
  242. package/src/Array.ts +170 -97
  243. package/src/Assert.ts +336 -31
  244. package/src/BigInt.ts +3 -3
  245. package/src/Brand.ts +7 -7
  246. package/src/Buffer.ts +12 -4
  247. package/src/Cache.ts +8 -3
  248. package/src/Callbacks.ts +8 -4
  249. package/src/Console.ts +45 -30
  250. package/src/Crypto.ts +13 -8
  251. package/src/Eq.ts +450 -122
  252. package/src/Function.ts +54 -24
  253. package/src/Http.ts +52 -19
  254. package/src/Identicon.ts +9 -4
  255. package/src/LockManager.ts +12 -10
  256. package/src/Lookup.ts +4 -2
  257. package/src/Number.ts +28 -24
  258. package/src/Object.ts +115 -49
  259. package/src/Option.ts +14 -5
  260. package/src/Order.ts +12 -12
  261. package/src/Platform.ts +2 -2
  262. package/src/Random.ts +7 -4
  263. package/src/Redacted.ts +13 -6
  264. package/src/Ref.ts +4 -4
  265. package/src/Relation.ts +5 -7
  266. package/src/Resource.ts +27 -12
  267. package/src/Result.ts +258 -114
  268. package/src/Schedule.ts +233 -116
  269. package/src/Set.ts +43 -24
  270. package/src/Sqlite.ts +9 -8
  271. package/src/Task.ts +441 -212
  272. package/src/Test.ts +10 -4
  273. package/src/Time.ts +27 -17
  274. package/src/Type.ts +2077 -620
  275. package/src/Types.ts +108 -40
  276. package/src/WebSocket.ts +14 -6
  277. package/src/Worker.ts +10 -6
  278. package/src/intl/_en.ts +20 -4
  279. package/src/intl/ar.ts +17 -2
  280. package/src/intl/bn.ts +19 -4
  281. package/src/intl/ca.ts +19 -4
  282. package/src/intl/cs.ts +19 -4
  283. package/src/intl/da.ts +19 -4
  284. package/src/intl/de.ts +19 -4
  285. package/src/intl/el.ts +19 -4
  286. package/src/intl/es.ts +19 -4
  287. package/src/intl/fa.ts +19 -4
  288. package/src/intl/fi.ts +19 -4
  289. package/src/intl/fil.ts +19 -4
  290. package/src/intl/fr.ts +19 -4
  291. package/src/intl/he.ts +19 -4
  292. package/src/intl/hi.ts +19 -4
  293. package/src/intl/hr.ts +19 -4
  294. package/src/intl/hu.ts +18 -4
  295. package/src/intl/id.ts +19 -4
  296. package/src/intl/it.ts +19 -4
  297. package/src/intl/ja.ts +19 -4
  298. package/src/intl/ko.ts +19 -4
  299. package/src/intl/ml.ts +19 -4
  300. package/src/intl/mr.ts +19 -4
  301. package/src/intl/ms.ts +17 -2
  302. package/src/intl/nb.ts +16 -2
  303. package/src/intl/nl.ts +19 -4
  304. package/src/intl/pa.ts +19 -4
  305. package/src/intl/pl.ts +18 -2
  306. package/src/intl/pt-BR.ts +19 -4
  307. package/src/intl/pt.ts +17 -2
  308. package/src/intl/ro.ts +19 -4
  309. package/src/intl/sk.ts +17 -2
  310. package/src/intl/sl.ts +19 -4
  311. package/src/intl/sv.ts +19 -4
  312. package/src/intl/sw.ts +15 -2
  313. package/src/intl/ta.ts +19 -4
  314. package/src/intl/te.ts +19 -4
  315. package/src/intl/th.ts +19 -4
  316. package/src/intl/tr.ts +19 -4
  317. package/src/intl/uk.ts +19 -4
  318. package/src/intl/ur.ts +17 -2
  319. package/src/intl/vi.ts +19 -3
  320. package/src/intl/zh-CN.ts +19 -4
  321. package/src/intl/zh-TW.ts +19 -4
  322. package/src/local-first/Evolu.ts +47 -24
  323. package/src/local-first/Owner.ts +10 -7
  324. package/src/local-first/Protocol.ts +5 -5
  325. package/src/local-first/Query.ts +34 -21
  326. package/src/local-first/Relay.ts +12 -5
  327. package/src/local-first/Schema.ts +19 -11
  328. package/src/local-first/Storage.ts +4 -2
package/dist/src/Task.js CHANGED
@@ -51,8 +51,6 @@ var __disposeResources = (this && this.__disposeResources) || (function (Suppres
51
51
  return e.name = "SuppressedError", e.error = error, e.suppressed = suppressed, e;
52
52
  });
53
53
  /**
54
- * ## Intro
55
- *
56
54
  * JavaScript-native structured concurrency.
57
55
  *
58
56
  * Structured concurrency organizes running tasks into a tree. Every child
@@ -86,6 +84,8 @@ var __disposeResources = (this && this.__disposeResources) || (function (Suppres
86
84
  *
87
85
  * ```ts
88
86
  * import {
87
+ * assertOk,
88
+ * assertType,
89
89
  * createRun,
90
90
  * err,
91
91
  * ok,
@@ -128,8 +128,8 @@ var __disposeResources = (this && this.__disposeResources) || (function (Suppres
128
128
  * });
129
129
  *
130
130
  * const result = await run(getUser(user.id));
131
- * expectTypeOf(result).toEqualTypeOf<Result<User, UserNotFoundError>>();
132
- * expectOk(result, user);
131
+ * assertType<Result<User, UserNotFoundError>, typeof result>();
132
+ * assertOk(result, user);
133
133
  * ```
134
134
  *
135
135
  * In composition roots, prefer the lifecycle API from the matching Evolu
@@ -172,6 +172,8 @@ var __disposeResources = (this && this.__disposeResources) || (function (Suppres
172
172
  *
173
173
  * ```ts
174
174
  * import {
175
+ * assertOk,
176
+ * assertType,
175
177
  * createRun,
176
178
  * err,
177
179
  * ok,
@@ -230,13 +232,14 @@ var __disposeResources = (this && this.__disposeResources) || (function (Suppres
230
232
  *
231
233
  * await using run = createRun();
232
234
  * const result = await run(getUserWithProfile("user-1"));
233
- * expectTypeOf(result).toEqualTypeOf<
235
+ * assertType<
234
236
  * Result<
235
237
  * { readonly user: User; readonly profile: Profile },
236
238
  * UserNotFoundError | ProfileNotFoundError
237
- * >
239
+ * >,
240
+ * typeof result
238
241
  * >();
239
- * expectOk(result, {
242
+ * assertOk(result, {
240
243
  * user: { id: "user-1", profileId: "profile-1" },
241
244
  * profile: { id: "profile-1" },
242
245
  * });
@@ -255,6 +258,7 @@ var __disposeResources = (this && this.__disposeResources) || (function (Suppres
255
258
  *
256
259
  * ```ts
257
260
  * import {
261
+ * assertType,
258
262
  * exponential,
259
263
  * fetch,
260
264
  * jitter,
@@ -275,8 +279,9 @@ var __disposeResources = (this && this.__disposeResources) || (function (Suppres
275
279
  * jitter("100%")(maxDelay("20s")(take(2)(exponential("100ms")))),
276
280
  * );
277
281
  *
278
- * expectTypeOf(fetchWithRetry).returns.toEqualTypeOf<
279
- * Task<string, RetryTaskError<FetchError | TimeoutError>>
282
+ * assertType<
283
+ * Task<string, RetryTaskError<FetchError | TimeoutError>>,
284
+ * ReturnType<typeof fetchWithRetry>
280
285
  * >();
281
286
  * ```
282
287
  *
@@ -285,7 +290,15 @@ var __disposeResources = (this && this.__disposeResources) || (function (Suppres
285
290
  * Run composed Tasks with a `concurrency` option and {@link all}:
286
291
  *
287
292
  * ```ts
288
- * import { all, createRun, ok, sleep, type Task } from "@evolu/common";
293
+ * import {
294
+ * assertEqual,
295
+ * assertOk,
296
+ * all,
297
+ * createRun,
298
+ * ok,
299
+ * sleep,
300
+ * type Task,
301
+ * } from "@evolu/common";
289
302
  *
290
303
  * await using run = createRun();
291
304
  *
@@ -308,8 +321,8 @@ var __disposeResources = (this && this.__disposeResources) || (function (Suppres
308
321
  *
309
322
  * // At most 2 concurrent requests.
310
323
  * const result = await run(all(urls, fetchUrl, { concurrency: 2 }));
311
- * expectOk(result, urls);
312
- * expect(maxActiveRequests).toBe(2);
324
+ * assertOk(result, urls);
325
+ * assertEqual(maxActiveRequests, 2);
313
326
  * ```
314
327
  *
315
328
  * Task helpers compose Tasks; concurrency primitives are stateful objects that
@@ -341,7 +354,7 @@ var __disposeResources = (this && this.__disposeResources) || (function (Suppres
341
354
  * resources, or services shared by all code running inside a Run.
342
355
  *
343
356
  * ```ts
344
- * import { createRun, ok, type Task } from "@evolu/common";
357
+ * import { assertOk, createRun, ok, type Task } from "@evolu/common";
345
358
  *
346
359
  * interface GreetingFormatter {
347
360
  * readonly format: (name: string) => string;
@@ -366,10 +379,10 @@ var __disposeResources = (this && this.__disposeResources) || (function (Suppres
366
379
  * await using run = createRun({ greetingFormatter: formal });
367
380
  *
368
381
  * // Root dependencies are inherited.
369
- * expectOk(await run(greet("Ada")), "Hello, Ada");
382
+ * assertOk(await run(greet("Ada")), "Hello, Ada");
370
383
  *
371
384
  * // Child-specific dependencies replace the root's custom dependencies.
372
- * expectOk(
385
+ * assertOk(
373
386
  * await run(greet("Ada"), { greetingFormatter: casual }),
374
387
  * "Hi, Ada",
375
388
  * );
@@ -420,7 +433,15 @@ var __disposeResources = (this && this.__disposeResources) || (function (Suppres
420
433
  * `undefined` should represent valid absence, not failure.
421
434
  *
422
435
  * ```ts
423
- * import { createRun, ok, type Task, type Typed } from "@evolu/common";
436
+ * import {
437
+ * assertEqual,
438
+ * assertFalse,
439
+ * assertTrue,
440
+ * createRun,
441
+ * ok,
442
+ * type Task,
443
+ * type Typed,
444
+ * } from "@evolu/common";
424
445
  *
425
446
  * interface Socket extends AsyncDisposable {
426
447
  * readonly send: (message: string) => string;
@@ -434,8 +455,9 @@ var __disposeResources = (this && this.__disposeResources) || (function (Suppres
434
455
  * const openSocket: Task<Socket, ConnectionFailedError> = () =>
435
456
  * ok({
436
457
  * send: (message) => message,
437
- * [Symbol.asyncDispose]: async () => {
458
+ * [Symbol.asyncDispose]: () => {
438
459
  * socketDisposed = true;
460
+ * return Promise.resolve();
439
461
  * },
440
462
  * });
441
463
  *
@@ -467,11 +489,11 @@ var __disposeResources = (this && this.__disposeResources) || (function (Suppres
467
489
  *
468
490
  * await using run = createRun();
469
491
  * const result = await run(createConnection);
470
- * assert(result.ok);
471
- * expect(socketDisposed).toBe(false);
472
- * expect(result.value.send("hello")).toBe("hello");
492
+ * assertTrue(result.ok);
493
+ * assertFalse(socketDisposed);
494
+ * assertEqual(result.value.send("hello"), "hello");
473
495
  * await result.value[Symbol.asyncDispose]();
474
- * expect(socketDisposed).toBe(true);
496
+ * assertTrue(socketDisposed);
475
497
  * ```
476
498
  *
477
499
  * Use {@link Run.ok} with `await using` when a Task whose error type is `never`
@@ -628,7 +650,7 @@ var __disposeResources = (this && this.__disposeResources) || (function (Suppres
628
650
  * each iteration reuses the same stack frame:
629
651
  *
630
652
  * ```ts
631
- * import { createRun, ok, type Task } from "@evolu/common";
653
+ * import { assertOk, createRun, ok, type Task } from "@evolu/common";
632
654
  *
633
655
  * interface TreeNode {
634
656
  * readonly value: string;
@@ -652,7 +674,7 @@ var __disposeResources = (this && this.__disposeResources) || (function (Suppres
652
674
  * };
653
675
  *
654
676
  * await using run = createRun();
655
- * expectOk(
677
+ * assertOk(
656
678
  * await run(
657
679
  * visitTree({
658
680
  * value: "root",
@@ -843,7 +865,7 @@ export const createRunDefaultDeps = () => {
843
865
  * ### Example
844
866
  *
845
867
  * ```ts
846
- * import { createRun, ok, type Task } from "@evolu/common";
868
+ * import { assertOk, createRun, ok, type Task } from "@evolu/common";
847
869
  *
848
870
  * interface ConfigDep {
849
871
  * readonly config: { readonly apiUrl: string };
@@ -855,7 +877,7 @@ export const createRunDefaultDeps = () => {
855
877
  * await using run = createRun({
856
878
  * config: { apiUrl: "https://api.example.com" },
857
879
  * });
858
- * expectOk(await run(loadApiUrl), "https://api.example.com");
880
+ * assertOk(await run(loadApiUrl), "https://api.example.com");
859
881
  * ```
860
882
  *
861
883
  * @group Run
@@ -1371,14 +1393,23 @@ const mapInput = (input, fn) => Array.isArray(input)
1371
1393
  * ### Example
1372
1394
  *
1373
1395
  * ```ts
1374
- * import { callback, createRun, ok, type Task } from "@evolu/common";
1396
+ * import {
1397
+ * assertEqual,
1398
+ * assertOk,
1399
+ * callback,
1400
+ * createRun,
1401
+ * ok,
1402
+ * type Task,
1403
+ * } from "@evolu/common";
1375
1404
  *
1376
1405
  * const listeners = new Set<(message: string) => void>();
1377
1406
  * const subscribe = (
1378
1407
  * listener: (message: string) => void,
1379
1408
  * ): (() => void) => {
1380
1409
  * listeners.add(listener);
1381
- * return () => listeners.delete(listener);
1410
+ * return () => {
1411
+ * listeners.delete(listener);
1412
+ * };
1382
1413
  * };
1383
1414
  * const nextMessage: Task<string> = callback(({ resolve }) =>
1384
1415
  * subscribe((message) => resolve(ok(message))),
@@ -1386,11 +1417,11 @@ const mapInput = (input, fn) => Array.isArray(input)
1386
1417
  *
1387
1418
  * await using run = createRun();
1388
1419
  * const fiber = run(nextMessage);
1389
- * expect(listeners.size).toBe(1);
1420
+ * assertEqual(listeners.size, 1);
1390
1421
  * for (const listener of listeners) listener("ready");
1391
- * expectOk(await fiber, "ready");
1422
+ * assertOk(await fiber, "ready");
1392
1423
  * // The callback cleanup unsubscribes after settlement.
1393
- * expect(listeners.size).toBe(0);
1424
+ * assertEqual(listeners.size, 0);
1394
1425
  * ```
1395
1426
  *
1396
1427
  * @group Interop
@@ -1414,10 +1445,10 @@ export const callback = (fn) => (run) => {
1414
1445
  * ### Example
1415
1446
  *
1416
1447
  * ```ts
1417
- * import { createRun, sleep } from "@evolu/common";
1448
+ * import { assertOk, createRun, sleep } from "@evolu/common";
1418
1449
  *
1419
1450
  * await using run = createRun();
1420
- * expectOk(await run(sleep("1ms")), undefined);
1451
+ * assertOk(await run(sleep("1ms")), undefined);
1421
1452
  * ```
1422
1453
  *
1423
1454
  * @group Timing
@@ -1439,6 +1470,8 @@ export const sleep = (duration) => callback(({ run: { deps }, resolve }) => {
1439
1470
  *
1440
1471
  * ```ts
1441
1472
  * import {
1473
+ * assertErr,
1474
+ * assertType,
1442
1475
  * createRun,
1443
1476
  * timeout,
1444
1477
  * timeoutError,
@@ -1450,8 +1483,8 @@ export const sleep = (duration) => callback(({ run: { deps }, resolve }) => {
1450
1483
  * await using run = createRun();
1451
1484
  *
1452
1485
  * const result = await run(timeout(waitForAbort, "1ms"));
1453
- * expectTypeOf(result).toEqualTypeOf<Result<never, TimeoutError>>();
1454
- * expectErr(result, timeoutError);
1486
+ * assertType<Result<never, TimeoutError>, typeof result>();
1487
+ * assertErr(result, timeoutError);
1455
1488
  * ```
1456
1489
  *
1457
1490
  * @group Timing
@@ -1498,6 +1531,8 @@ export const timeoutError = { type: "TimeoutError" };
1498
1531
  *
1499
1532
  * ```ts
1500
1533
  * import {
1534
+ * assertErr,
1535
+ * assertType,
1501
1536
  * createRun,
1502
1537
  * err,
1503
1538
  * recurs,
@@ -1517,10 +1552,11 @@ export const timeoutError = { type: "TimeoutError" };
1517
1552
  *
1518
1553
  * await using run = createRun();
1519
1554
  * const result = await run(fetchWithRetry);
1520
- * expectTypeOf(result).toEqualTypeOf<
1521
- * Result<string, RetryTaskError<ServiceUnavailableError>>
1555
+ * assertType<
1556
+ * Result<string, RetryTaskError<ServiceUnavailableError>>,
1557
+ * typeof result
1522
1558
  * >();
1523
- * expectErr(result, {
1559
+ * assertErr(result, {
1524
1560
  * type: "RetryError",
1525
1561
  * attempts: 3,
1526
1562
  * lastError: { type: "ServiceUnavailable" },
@@ -1531,6 +1567,7 @@ export const timeoutError = { type: "TimeoutError" };
1531
1567
  *
1532
1568
  * ```ts
1533
1569
  * import {
1570
+ * assertErr,
1534
1571
  * createRun,
1535
1572
  * err,
1536
1573
  * recurs,
@@ -1553,7 +1590,8 @@ export const timeoutError = { type: "TimeoutError" };
1553
1590
  * });
1554
1591
  *
1555
1592
  * await using run = createRun();
1556
- * expectErr(await run(fetchWithRetry), {
1593
+ * const result = await run(fetchWithRetry);
1594
+ * assertErr(result, {
1557
1595
  * type: "RetryError",
1558
1596
  * attempts: 1,
1559
1597
  * lastError: { type: "PermanentFailure" },
@@ -1609,7 +1647,15 @@ export const retry = (task, schedule, { shouldRetry = constTrue, onRetry, } = {}
1609
1647
  * ### Repeating successes
1610
1648
  *
1611
1649
  * ```ts
1612
- * import { createRun, ok, recurs, repeat, type Task } from "@evolu/common";
1650
+ * import {
1651
+ * assertEqual,
1652
+ * assertOk,
1653
+ * createRun,
1654
+ * ok,
1655
+ * recurs,
1656
+ * repeat,
1657
+ * type Task,
1658
+ * } from "@evolu/common";
1613
1659
  *
1614
1660
  * let attempts = 0;
1615
1661
  * const checkStatus: Task<string> = () => {
@@ -1620,14 +1666,16 @@ export const retry = (task, schedule, { shouldRetry = constTrue, onRetry, } = {}
1620
1666
  * const poll = repeat(checkStatus, recurs(3));
1621
1667
  *
1622
1668
  * await using run = createRun();
1623
- * expectOk(await run(poll), "pending");
1624
- * expect(attempts).toBe(4);
1669
+ * assertOk(await run(poll), "pending");
1670
+ * assertEqual(attempts, 4);
1625
1671
  * ```
1626
1672
  *
1627
1673
  * ### Stopping with Done
1628
1674
  *
1629
1675
  * ```ts
1630
1676
  * import {
1677
+ * assertErr,
1678
+ * assertEqual,
1631
1679
  * createRun,
1632
1680
  * done,
1633
1681
  * err,
@@ -1650,8 +1698,8 @@ export const retry = (task, schedule, { shouldRetry = constTrue, onRetry, } = {}
1650
1698
  *
1651
1699
  * await using run = createRun();
1652
1700
  * const result = await run(repeat(processQueue, spaced("1ms")));
1653
- * expectErr(result, done());
1654
- * expect(queue).toEqual([]);
1701
+ * assertErr(result, done());
1702
+ * assertEqual(queue, []);
1655
1703
  * ```
1656
1704
  *
1657
1705
  * @group Repetition
@@ -1697,6 +1745,9 @@ export const repeat = (task, schedule, { shouldRepeat = constTrue, onRepeat } =
1697
1745
  *
1698
1746
  * ```ts
1699
1747
  * import {
1748
+ * assertOk,
1749
+ * assertType,
1750
+ * assertTrue,
1700
1751
  * any,
1701
1752
  * createRun,
1702
1753
  * err,
@@ -1720,11 +1771,9 @@ export const repeat = (task, schedule, { shouldRepeat = constTrue, onRepeat } =
1720
1771
  * await using run = createRun();
1721
1772
  * const result = await run(any([unavailable, fallback]));
1722
1773
  *
1723
- * expectTypeOf(result).toEqualTypeOf<
1724
- * Result<string, ServiceUnavailableError>
1725
- * >();
1726
- * expectOk(result, "fallback");
1727
- * expect(fallbackStarted).toBe(true);
1774
+ * assertType<Result<string, ServiceUnavailableError>, typeof result>();
1775
+ * assertOk(result, "fallback");
1776
+ * assertTrue(fallbackStarted);
1728
1777
  * ```
1729
1778
  *
1730
1779
  * @group Racing
@@ -1775,6 +1824,7 @@ export const any = (tasks, options) => async (run) => {
1775
1824
  *
1776
1825
  * ```ts
1777
1826
  * import {
1827
+ * assertOk,
1778
1828
  * createRun,
1779
1829
  * isNonEmptyArray,
1780
1830
  * ok,
@@ -1786,7 +1836,7 @@ export const any = (tasks, options) => async (run) => {
1786
1836
  * await using run = createRun();
1787
1837
  * if (isNonEmptyArray(tasks)) {
1788
1838
  * const result = await run(race(tasks));
1789
- * expectOk(result, "first");
1839
+ * assertOk(result, "first");
1790
1840
  * }
1791
1841
  * ```
1792
1842
  *
@@ -1794,6 +1844,9 @@ export const any = (tasks, options) => async (run) => {
1794
1844
  *
1795
1845
  * ```ts
1796
1846
  * import {
1847
+ * assertFalse,
1848
+ * assertOk,
1849
+ * assertType,
1797
1850
  * createRun,
1798
1851
  * ok,
1799
1852
  * race,
@@ -1815,9 +1868,9 @@ export const any = (tasks, options) => async (run) => {
1815
1868
  * // Input order does not matter: the first settled Result wins, and the
1816
1869
  * // still-running loser is aborted.
1817
1870
  * const result = await run(race([slow, fast]));
1818
- * expectTypeOf(result).toEqualTypeOf<Result<string>>();
1819
- * expectOk(result, "fast");
1820
- * expect(slowCompleted).toBe(false);
1871
+ * assertType<Result<string>, typeof result>();
1872
+ * assertOk(result, "fast");
1873
+ * assertFalse(slowCompleted);
1821
1874
  * ```
1822
1875
  *
1823
1876
  * @group Racing
@@ -1848,6 +1901,8 @@ export const race = (tasks) => async (run) => {
1848
1901
  *
1849
1902
  * ```ts
1850
1903
  * import {
1904
+ * assertFalse,
1905
+ * assertOk,
1851
1906
  * createRun,
1852
1907
  * err,
1853
1908
  * firstN,
@@ -1878,8 +1933,8 @@ export const race = (tasks) => async (run) => {
1878
1933
  *
1879
1934
  * // Errs do not count. After two Ok values settle, the slow Task is aborted.
1880
1935
  * const result = await run(firstN(tasks, 2, { concurrency: 4 }));
1881
- * expectOk(result, ["fast-1", "fast-2"]);
1882
- * expect(slowCompleted).toBe(false);
1936
+ * assertOk(result, ["fast-1", "fast-2"]);
1937
+ * assertFalse(slowCompleted);
1883
1938
  * ```
1884
1939
  *
1885
1940
  * @group Racing
@@ -1910,6 +1965,8 @@ export const firstN = (tasks, count, options) => async (run) => {
1910
1965
  *
1911
1966
  * ```ts
1912
1967
  * import {
1968
+ * assertFalse,
1969
+ * assertOk,
1913
1970
  * createRun,
1914
1971
  * err,
1915
1972
  * firstNSettled,
@@ -1935,11 +1992,11 @@ export const firstN = (tasks, count, options) => async (run) => {
1935
1992
  *
1936
1993
  * // Err and Ok both count, and Results use settlement order.
1937
1994
  * const result = await run(firstNSettled(tasks, 2, { concurrency: 3 }));
1938
- * expectOk(result, [
1995
+ * assertOk(result, [
1939
1996
  * { ok: false, error: { type: "ServiceUnavailable" } },
1940
1997
  * { ok: true, value: "fast" },
1941
1998
  * ]);
1942
- * expect(slowCompleted).toBe(false);
1999
+ * assertFalse(slowCompleted);
1943
2000
  * ```
1944
2001
  *
1945
2002
  * @group Racing
@@ -1984,6 +2041,9 @@ export const firstNSettled = (tasks, count, options) => async (run) => {
1984
2041
  *
1985
2042
  * ```ts
1986
2043
  * import {
2044
+ * assertEqual,
2045
+ * assertFalse,
2046
+ * assertOk,
1987
2047
  * createRun,
1988
2048
  * each,
1989
2049
  * err,
@@ -2019,9 +2079,9 @@ export const firstNSettled = (tasks, count, options) => async (run) => {
2019
2079
  * ),
2020
2080
  * );
2021
2081
  *
2022
- * expectOk(result, undefined);
2023
- * expect(first).toEqual(["fast", 2]);
2024
- * expect(slowCompleted).toBe(false);
2082
+ * assertOk(result, undefined);
2083
+ * assertEqual(first, ["fast", 2]);
2084
+ * assertFalse(slowCompleted);
2025
2085
  * ```
2026
2086
  *
2027
2087
  * `onResult` is a synchronous scheduling decision, not a place to do work. It
@@ -2118,13 +2178,19 @@ export const each = (tasks, onResult, options = {}) => async (run) => {
2118
2178
  * ### Example
2119
2179
  *
2120
2180
  * ```ts
2121
- * import { createRun, ok, prioritized, type Task } from "@evolu/common";
2181
+ * import {
2182
+ * assertOk,
2183
+ * createRun,
2184
+ * ok,
2185
+ * prioritized,
2186
+ * type Task,
2187
+ * } from "@evolu/common";
2122
2188
  *
2123
2189
  * const rebuildSearchIndex: Task<string> = () => ok("indexed");
2124
2190
  * const backgroundIndexing = prioritized("background", rebuildSearchIndex);
2125
2191
  *
2126
2192
  * await using run = createRun();
2127
- * expectOk(await run(backgroundIndexing), "indexed");
2193
+ * assertOk(await run(backgroundIndexing), "indexed");
2128
2194
  * ```
2129
2195
  *
2130
2196
  * @group Scheduling
@@ -2144,7 +2210,13 @@ export const prioritized = (priority, task) => withTaskMeta({ priority })(task);
2144
2210
  * ### Example
2145
2211
  *
2146
2212
  * ```ts
2147
- * import { createRun, ok, yieldNow, type Task } from "@evolu/common";
2213
+ * import {
2214
+ * assertOk,
2215
+ * createRun,
2216
+ * ok,
2217
+ * yieldNow,
2218
+ * type Task,
2219
+ * } from "@evolu/common";
2148
2220
  *
2149
2221
  * const sumTo =
2150
2222
  * (count: number): Task<number> =>
@@ -2160,7 +2232,7 @@ export const prioritized = (priority, task) => withTaskMeta({ priority })(task);
2160
2232
  * };
2161
2233
  *
2162
2234
  * await using run = createRun();
2163
- * expectOk(await run(sumTo(1001)), 500500);
2235
+ * assertOk(await run(sumTo(1001)), 500500);
2164
2236
  * ```
2165
2237
  *
2166
2238
  * @group Scheduling
@@ -2197,6 +2269,10 @@ export const yieldNow = async (run) => {
2197
2269
  *
2198
2270
  * ```ts
2199
2271
  * import {
2272
+ * assertEqual,
2273
+ * assertFalse,
2274
+ * assertType,
2275
+ * assertTrue,
2200
2276
  * AbortError,
2201
2277
  * createRun,
2202
2278
  * ok,
@@ -2213,23 +2289,22 @@ export const yieldNow = async (run) => {
2213
2289
  * const serverStarted = Promise.withResolvers<void>();
2214
2290
  * let serverStopped = false;
2215
2291
  * const startServer: Task<Server, never, ServerDep> = (run) => {
2216
- * expect(run.deps.port).toBe(3000);
2292
+ * assertEqual(run.deps.port, 3000);
2217
2293
  * serverStarted.resolve();
2218
2294
  * return ok({
2219
- * [Symbol.asyncDispose]: async () => {
2295
+ * [Symbol.asyncDispose]: () => {
2220
2296
  * serverStopped = true;
2297
+ * return Promise.resolve();
2221
2298
  * },
2222
2299
  * });
2223
2300
  * };
2224
2301
  *
2225
2302
  * const serve = (): Task<never, never, ServerDep> => async (run) => {
2226
- * await using server = await run.ok(startServer);
2303
+ * await using _ = await run.ok(startServer);
2227
2304
  * return await run(waitForAbort);
2228
2305
  * };
2229
2306
  *
2230
- * expectTypeOf(serve).returns.toEqualTypeOf<
2231
- * Task<never, never, ServerDep>
2232
- * >();
2307
+ * assertType<Task<never, never, ServerDep>, ReturnType<typeof serve>>();
2233
2308
  *
2234
2309
  * await using run = createRun();
2235
2310
  * const fiber = run.abortable(serve(), { port: 3000 });
@@ -2237,9 +2312,9 @@ export const yieldNow = async (run) => {
2237
2312
  * fiber.abort();
2238
2313
  *
2239
2314
  * const result = await fiber;
2240
- * assert(!result.ok);
2241
- * expect(AbortError.is(result.error)).toBe(true);
2242
- * expect(serverStopped).toBe(true);
2315
+ * assertFalse(result.ok);
2316
+ * assertTrue(AbortError.is(result.error));
2317
+ * assertTrue(serverStopped);
2243
2318
  * ```
2244
2319
  *
2245
2320
  * @group Abortability
@@ -2303,6 +2378,9 @@ export const waitForAbort = async (run) => {
2303
2378
  *
2304
2379
  * ```ts
2305
2380
  * import {
2381
+ * assertEqual,
2382
+ * assertFalse,
2383
+ * assertTrue,
2306
2384
  * createRun,
2307
2385
  * daemon,
2308
2386
  * ok,
@@ -2323,18 +2401,24 @@ export const waitForAbort = async (run) => {
2323
2401
  * {
2324
2402
  * await using run = createRun();
2325
2403
  * const result = await run(timeout(daemon(taskNotUsingAbort), "1ms"));
2326
- * assert(!result.ok);
2327
- * expect(result.error.type).toBe("TimeoutError");
2328
- * expect(finished).toBe(false);
2404
+ * assertFalse(result.ok);
2405
+ * assertEqual(result.error.type, "TimeoutError");
2406
+ * assertFalse(finished);
2329
2407
  * finishTask();
2330
2408
  * }
2331
- * expect(finished).toBe(true);
2409
+ * assertTrue(finished);
2332
2410
  * ```
2333
2411
  *
2334
2412
  * Promise-returning functions should be called inside the Task, not before it.
2335
2413
  *
2336
2414
  * ```ts
2337
- * import { createRun, ok, type Result, type Task } from "@evolu/common";
2415
+ * import {
2416
+ * assertOk,
2417
+ * createRun,
2418
+ * ok,
2419
+ * type Result,
2420
+ * type Task,
2421
+ * } from "@evolu/common";
2338
2422
  *
2339
2423
  * type ResultValue = string;
2340
2424
  * const createPromiseReturningResult = (): Promise<Result<ResultValue>> =>
@@ -2343,14 +2427,20 @@ export const waitForAbort = async (run) => {
2343
2427
  * const task: Task<ResultValue> = () => createPromiseReturningResult();
2344
2428
  *
2345
2429
  * await using run = createRun();
2346
- * expectOk(await run(task), "value");
2430
+ * assertOk(await run(task), "value");
2347
2431
  * ```
2348
2432
  *
2349
2433
  * Do not reuse an already-running Promise. It started outside the Task, so the
2350
2434
  * Run cannot own its lifetime or request abort before it begins.
2351
2435
  *
2352
2436
  * ```ts
2353
- * import { ok, type Result, type Task } from "@evolu/common";
2437
+ * import {
2438
+ * assertType,
2439
+ * assertTrue,
2440
+ * ok,
2441
+ * type Result,
2442
+ * type Task,
2443
+ * } from "@evolu/common";
2354
2444
  *
2355
2445
  * type ResultValue = string;
2356
2446
  * let promiseStarted = false;
@@ -2365,8 +2455,8 @@ export const waitForAbort = async (run) => {
2365
2455
  * const promise = createPromiseReturningResult();
2366
2456
  * const task: Task<ResultValue> = () => promise;
2367
2457
  *
2368
- * expect(promiseStarted).toBe(true);
2369
- * expectTypeOf(task).toEqualTypeOf<Task<ResultValue>>();
2458
+ * assertTrue(promiseStarted);
2459
+ * assertType<Task<ResultValue>, typeof task>();
2370
2460
  * ```
2371
2461
  *
2372
2462
  * @group Lifetime
@@ -2413,14 +2503,21 @@ export const daemon = (task) => async (run) => {
2413
2503
  * ### Example
2414
2504
  *
2415
2505
  * ```ts
2416
- * import { createRun, ok, unabortable, type Task } from "@evolu/common";
2506
+ * import {
2507
+ * assertFalse,
2508
+ * assertOk,
2509
+ * createRun,
2510
+ * ok,
2511
+ * unabortable,
2512
+ * type Task,
2513
+ * } from "@evolu/common";
2417
2514
  *
2418
2515
  * const commitStarted = Promise.withResolvers<void>();
2419
2516
  * const finishCommit = Promise.withResolvers<void>();
2420
2517
  * const commit: Task<string> = unabortable(async (run) => {
2421
2518
  * commitStarted.resolve();
2422
2519
  * await finishCommit.promise;
2423
- * expect(run.signal.aborted).toBe(false);
2520
+ * assertFalse(run.signal.aborted);
2424
2521
  * return ok("committed");
2425
2522
  * });
2426
2523
  *
@@ -2430,7 +2527,7 @@ export const daemon = (task) => async (run) => {
2430
2527
  * fiber.abort();
2431
2528
  * finishCommit.resolve();
2432
2529
  *
2433
- * expectOk(await fiber, "committed");
2530
+ * assertOk(await fiber, "committed");
2434
2531
  * ```
2435
2532
  *
2436
2533
  * @group Abortability
@@ -2460,6 +2557,9 @@ export const unabortable = /*#__PURE__*/ withTaskMeta({
2460
2557
  *
2461
2558
  * ```ts
2462
2559
  * import {
2560
+ * assertEqual,
2561
+ * assertFalse,
2562
+ * assertTrue,
2463
2563
  * AbortError,
2464
2564
  * createRun,
2465
2565
  * ok,
@@ -2476,17 +2576,17 @@ export const unabortable = /*#__PURE__*/ withTaskMeta({
2476
2576
  * const operationStarted = Promise.withResolvers<void>();
2477
2577
  * const operate =
2478
2578
  * (resource: Resource): Task<never> =>
2479
- * async (run) => {
2480
- * expect(resource.id).toBe("resource-1");
2579
+ * (run) => {
2580
+ * assertEqual(resource.id, "resource-1");
2481
2581
  * operationStarted.resolve();
2482
- * return await run(waitForAbort);
2582
+ * return run(waitForAbort);
2483
2583
  * };
2484
2584
  * let released = false;
2485
2585
  * const release =
2486
2586
  * (_resource: Resource): Task<void> =>
2487
2587
  * (run) => {
2488
2588
  * // Release inherits the mask even after abort was requested.
2489
- * expect(run.signal.aborted).toBe(false);
2589
+ * assertFalse(run.signal.aborted);
2490
2590
  * released = true;
2491
2591
  * return ok();
2492
2592
  * };
@@ -2510,9 +2610,9 @@ export const unabortable = /*#__PURE__*/ withTaskMeta({
2510
2610
  * await operationStarted.promise;
2511
2611
  * fiber.abort();
2512
2612
  * const result = await fiber;
2513
- * assert(!result.ok);
2514
- * expect(AbortError.is(result.error)).toBe(true);
2515
- * expect(released).toBe(true);
2613
+ * assertFalse(result.ok);
2614
+ * assertTrue(AbortError.is(result.error));
2615
+ * assertTrue(released);
2516
2616
  * ```
2517
2617
  *
2518
2618
  * @group Abortability
@@ -2555,6 +2655,8 @@ export const unabortableMask = (fn) => unabortable((run) => {
2555
2655
  *
2556
2656
  * ```ts
2557
2657
  * import {
2658
+ * assertErr,
2659
+ * assertTrue,
2558
2660
  * acquireUseRelease,
2559
2661
  * createRun,
2560
2662
  * err,
@@ -2594,9 +2696,9 @@ export const unabortableMask = (fn) => unabortable((run) => {
2594
2696
  * );
2595
2697
  *
2596
2698
  * await using run = createRun();
2597
- * expectErr(await run(queryUser), { type: "UserUnavailable" });
2699
+ * assertErr(await run(queryUser), { type: "UserUnavailable" });
2598
2700
  * // Release still runs when use returns a domain error.
2599
- * expect(connectionClosed).toBe(true);
2701
+ * assertTrue(connectionClosed);
2600
2702
  * ```
2601
2703
  *
2602
2704
  * @group Lifetime
@@ -2620,6 +2722,10 @@ export const acquireUseRelease = (acquire, use, release) => unabortableMask((res
2620
2722
  *
2621
2723
  * ```ts
2622
2724
  * import {
2725
+ * assertFalse,
2726
+ * assertOk,
2727
+ * assertType,
2728
+ * assertTrue,
2623
2729
  * createDeferred,
2624
2730
  * createRun,
2625
2731
  * ok,
@@ -2630,22 +2736,28 @@ export const acquireUseRelease = (acquire, use, release) => unabortableMask((res
2630
2736
  * const deferred = createDeferred<string>();
2631
2737
  *
2632
2738
  * const fiber = run(deferred.task);
2633
- * expect(deferred.resolve(ok("ready"))).toBe(true);
2739
+ * assertTrue(deferred.resolve(ok("ready")));
2634
2740
  *
2635
2741
  * const result = await fiber;
2636
- * expectTypeOf(result).toEqualTypeOf<Result<string>>();
2637
- * expectOk(result, "ready");
2742
+ * assertType<Result<string>, typeof result>();
2743
+ * assertOk(result, "ready");
2638
2744
  *
2639
2745
  * // A Deferred is one-shot: later resolutions are ignored, and future
2640
2746
  * // waiters receive the original Result.
2641
- * expect(deferred.resolve(ok("late"))).toBe(false);
2642
- * expectOk(await run(deferred.task), "ready");
2747
+ * assertFalse(deferred.resolve(ok("late")));
2748
+ * assertOk(await run(deferred.task), "ready");
2643
2749
  * ```
2644
2750
  *
2645
2751
  * ### Aborting a waiter
2646
2752
  *
2647
2753
  * ```ts
2648
- * import { AbortError, createDeferred, createRun } from "@evolu/common";
2754
+ * import {
2755
+ * assertFalse,
2756
+ * assertTrue,
2757
+ * AbortError,
2758
+ * createDeferred,
2759
+ * createRun,
2760
+ * } from "@evolu/common";
2649
2761
  *
2650
2762
  * await using run = createRun();
2651
2763
  * const deferred = createDeferred<string>();
@@ -2654,8 +2766,8 @@ export const acquireUseRelease = (acquire, use, release) => unabortableMask((res
2654
2766
  * fiber.abort({ type: "NoLongerNeeded" });
2655
2767
  *
2656
2768
  * const result = await fiber;
2657
- * assert(!result.ok);
2658
- * expect(AbortError.is(result.error)).toBe(true);
2769
+ * assertFalse(result.ok);
2770
+ * assertTrue(AbortError.is(result.error));
2659
2771
  * ```
2660
2772
  *
2661
2773
  * @group Concurrency primitives
@@ -2691,7 +2803,15 @@ export const createDeferred = () => {
2691
2803
  * ### Example
2692
2804
  *
2693
2805
  * ```ts
2694
- * import { createGate, createRun, ok, type Task } from "@evolu/common";
2806
+ * import {
2807
+ * assertEqual,
2808
+ * assertOk,
2809
+ * assertTrue,
2810
+ * createGate,
2811
+ * createRun,
2812
+ * ok,
2813
+ * type Task,
2814
+ * } from "@evolu/common";
2695
2815
  *
2696
2816
  * await using run = createRun();
2697
2817
  * const networkGate = createGate();
@@ -2707,13 +2827,13 @@ export const createDeferred = () => {
2707
2827
  *
2708
2828
  * const first = run(syncOnce("first"));
2709
2829
  * const second = run(syncOnce("second"));
2710
- * expect(uploadedItems).toEqual([]);
2830
+ * assertEqual(uploadedItems, []);
2711
2831
  *
2712
2832
  * networkGate.open();
2713
- * expectOk(await first, undefined);
2714
- * expectOk(await second, undefined);
2715
- * expect(uploadedItems).toEqual(["first", "second"]);
2716
- * expect(networkGate.isOpen()).toBe(true);
2833
+ * assertOk(await first, undefined);
2834
+ * assertOk(await second, undefined);
2835
+ * assertEqual(uploadedItems, ["first", "second"]);
2836
+ * assertTrue(networkGate.isOpen());
2717
2837
  * ```
2718
2838
  *
2719
2839
  * @group Concurrency primitives
@@ -2756,6 +2876,7 @@ export const createGate = ({ isOpen = false, } = {}) => {
2756
2876
  *
2757
2877
  * ```ts
2758
2878
  * import {
2879
+ * assertEqual,
2759
2880
  * createRun,
2760
2881
  * createSemaphore,
2761
2882
  * getOk,
@@ -2787,8 +2908,8 @@ export const createGate = ({ isOpen = false, } = {}) => {
2787
2908
  * ]);
2788
2909
  *
2789
2910
  * const savedUsers = results.map(getOk);
2790
- * expect(savedUsers).toEqual(["saved:1", "saved:2", "saved:3"]);
2791
- * expect(maxActiveSaves).toBe(2);
2911
+ * assertEqual(savedUsers, ["saved:1", "saved:2", "saved:3"]);
2912
+ * assertEqual(maxActiveSaves, 2);
2792
2913
  * ```
2793
2914
  *
2794
2915
  * @group Concurrency primitives
@@ -2910,6 +3031,8 @@ export const createSemaphore = (initialPermits, { policy = "fifo", } = {}) => {
2910
3031
  *
2911
3032
  * ```ts
2912
3033
  * import {
3034
+ * assertEqual,
3035
+ * assertOk,
2913
3036
  * createMutex,
2914
3037
  * createRun,
2915
3038
  * ok,
@@ -2932,9 +3055,9 @@ export const createSemaphore = (initialPermits, { policy = "fifo", } = {}) => {
2932
3055
  * run(deposit(2)),
2933
3056
  * run(deposit(3)),
2934
3057
  * ]);
2935
- * expectOk(first, undefined);
2936
- * expectOk(second, undefined);
2937
- * expect(balance).toBe(5);
3058
+ * assertOk(first, undefined);
3059
+ * assertOk(second, undefined);
3060
+ * assertEqual(balance, 5);
2938
3061
  * ```
2939
3062
  *
2940
3063
  * @group Concurrency primitives
@@ -2991,14 +3114,14 @@ export function createMutexByKey({ lookup = identity, } = {}) {
2991
3114
  * ### Example
2992
3115
  *
2993
3116
  * ```ts
2994
- * import { createMutexRef, createRun, ok } from "@evolu/common";
3117
+ * import { assertOk, createMutexRef, createRun, ok } from "@evolu/common";
2995
3118
  *
2996
3119
  * const counter = createMutexRef(0);
2997
3120
  * const increment = counter.updateAndGet((value) => () => ok(value + 1));
2998
3121
  *
2999
3122
  * await using run = createRun();
3000
- * expectOk(await run(increment), 1);
3001
- * expectOk(await run(counter.get), 1);
3123
+ * assertOk(await run(increment), 1);
3124
+ * assertOk(await run(counter.get), 1);
3002
3125
  * ```
3003
3126
  *
3004
3127
  * @group Concurrency primitives