@evolu/common 8.5.0 → 8.6.1

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 +7 -7
  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 +7 -7
  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/src/Result.ts CHANGED
@@ -1,6 +1,4 @@
1
1
  /**
2
- * ## Intro
3
- *
4
2
  * Type-safe error handling with {@link Result}.
5
3
  *
6
4
  * The problem with exceptions in JavaScript is that a caught value is always of
@@ -17,6 +15,9 @@
17
15
  *
18
16
  * ```ts
19
17
  * import {
18
+ * assertEqual,
19
+ * assertErr,
20
+ * assertType,
20
21
  * err,
21
22
  * exhaustiveCheck,
22
23
  * type Result,
@@ -27,7 +28,7 @@
27
28
  * try {
28
29
  * throw new Error("Not found");
29
30
  * } catch (error) {
30
- * expectTypeOf(error).toEqualTypeOf<unknown>();
31
+ * assertType<unknown, typeof error>();
31
32
  * }
32
33
  *
33
34
  * // With Result, errors are part of the return type.
@@ -46,22 +47,24 @@
46
47
  * if (!result.ok) {
47
48
  * switch (result.error.type) {
48
49
  * case "NotFound":
49
- * expect(result.error).toEqual({ type: "NotFound" });
50
+ * assertEqual(result.error, { type: "NotFound" });
50
51
  * break;
51
52
  * case "InvalidInput":
52
- * expect(result.error).toEqual({ type: "InvalidInput" });
53
+ * assertEqual(result.error, { type: "InvalidInput" });
53
54
  * break;
54
55
  * default:
55
56
  * exhaustiveCheck(result.error);
56
57
  * }
57
58
  * }
58
- * expectErr(result, { type: "NotFound" });
59
+ * assertErr(result, { type: "NotFound" });
59
60
  * ```
60
61
  *
61
62
  * A `Result` is either {@link Ok} (success with a value) or {@link Err} (failure
62
63
  * with an error). Create them with {@link ok} and {@link err}.
63
64
  *
64
65
  * ```ts
66
+ * import { assertEqual } from "@evolu/common";
67
+ *
65
68
  * type Result<T, E = never> = Ok<T> | Err<E>;
66
69
  *
67
70
  * interface Ok<T> {
@@ -73,6 +76,9 @@
73
76
  * readonly ok: false;
74
77
  * readonly error: E;
75
78
  * }
79
+ *
80
+ * const result: Result<number> = { ok: true, value: 1 };
81
+ * assertEqual(result, { ok: true, value: 1 });
76
82
  * ```
77
83
  *
78
84
  * Use {@link trySync} and {@link tryAsync} to intentionally convert thrown values
@@ -85,7 +91,13 @@
85
91
  * Since `Result` is a plain object, imperative code works naturally.
86
92
  *
87
93
  * ```ts
88
- * import { ok, type Result, type Typed } from "@evolu/common";
94
+ * import {
95
+ * assertOk,
96
+ * assertType,
97
+ * ok,
98
+ * type Result,
99
+ * type Typed,
100
+ * } from "@evolu/common";
89
101
  *
90
102
  * interface User {
91
103
  * readonly id: string;
@@ -117,10 +129,11 @@
117
129
  * };
118
130
  *
119
131
  * const profile = getCurrentProfile();
120
- * expectTypeOf(profile).toEqualTypeOf<
121
- * Result<Profile, UserNotFoundError | ProfileNotFoundError>
132
+ * assertType<
133
+ * Result<Profile, UserNotFoundError | ProfileNotFoundError>,
134
+ * typeof profile
122
135
  * >();
123
- * expectOk(profile, { userId: "user-1" });
136
+ * assertOk(profile, { userId: "user-1" });
124
137
  * ```
125
138
  *
126
139
  * Note `user` and `profile` are named after their success values, not after the
@@ -223,15 +236,15 @@ export type AnyResult = Result<any, any>;
223
236
  * ### Example
224
237
  *
225
238
  * ```ts
226
- * import { ok, type Result } from "@evolu/common";
239
+ * import { assertOk, assertType, ok, type Result } from "@evolu/common";
227
240
  *
228
241
  * const result = ok();
229
242
  * const count = ok(42);
230
243
  *
231
- * expectTypeOf(result).toEqualTypeOf<Result<void>>();
232
- * expectTypeOf(count).toEqualTypeOf<Result<number>>();
233
- * expectOk(result, undefined);
234
- * expectOk(count, 42);
244
+ * assertType<Result<void>, typeof result>();
245
+ * assertType<Result<number>, typeof count>();
246
+ * assertOk(result, undefined);
247
+ * assertOk(count, 42);
235
248
  * ```
236
249
  *
237
250
  * @group Core
@@ -250,7 +263,14 @@ export interface Ok<out T> {
250
263
  * ### Example
251
264
  *
252
265
  * ```ts
253
- * import { err, ok, type Result, type Typed } from "@evolu/common";
266
+ * import {
267
+ * assertErr,
268
+ * assertOk,
269
+ * err,
270
+ * ok,
271
+ * type Result,
272
+ * type Typed,
273
+ * } from "@evolu/common";
254
274
  *
255
275
  * interface User {
256
276
  * readonly id: string;
@@ -267,8 +287,8 @@ export interface Ok<out T> {
267
287
  * readonly id: string;
268
288
  * }
269
289
  *
270
- * expectOk(findUser("user-1"), { id: "user-1" });
271
- * expectErr(findUser("missing"), {
290
+ * assertOk(findUser("user-1"), { id: "user-1" });
291
+ * assertErr(findUser("missing"), {
272
292
  * type: "NotFound",
273
293
  * id: "missing",
274
294
  * });
@@ -331,6 +351,8 @@ export const err = <E>(error: E): Result<never, E> => ({ ok: false, error });
331
351
  *
332
352
  * ```ts
333
353
  * import {
354
+ * assertEqual,
355
+ * assertType,
334
356
  * isOk,
335
357
  * ok,
336
358
  * type Ok,
@@ -344,8 +366,8 @@ export const err = <E>(error: E): Result<never, E> => ({ ok: false, error });
344
366
  *
345
367
  * const count = getCount();
346
368
  * if (isOk(count)) {
347
- * expectTypeOf(count).toEqualTypeOf<Ok<number>>();
348
- * expect(count.value).toBe(2);
369
+ * assertType<Ok<number>, typeof count>();
370
+ * assertEqual(count.value, 2);
349
371
  * }
350
372
  * ```
351
373
  *
@@ -360,6 +382,8 @@ export const isOk = <T, E>(result: Result<T, E>): result is Ok<T> => result.ok;
360
382
  *
361
383
  * ```ts
362
384
  * import {
385
+ * assertErr,
386
+ * assertType,
363
387
  * err,
364
388
  * isErr,
365
389
  * type Err,
@@ -374,8 +398,8 @@ export const isOk = <T, E>(result: Result<T, E>): result is Ok<T> => result.ok;
374
398
  *
375
399
  * const count = getCount();
376
400
  * if (isErr(count)) {
377
- * expectTypeOf(count).toEqualTypeOf<Err<CountUnavailableError>>();
378
- * expect(count.error).toEqual({ type: "CountUnavailable" });
401
+ * assertType<Err<CountUnavailableError>, typeof count>();
402
+ * assertErr(count, { type: "CountUnavailable" });
379
403
  * }
380
404
  * ```
381
405
  *
@@ -405,9 +429,14 @@ export const isErr = <T, E>(result: Result<T, E>): result is Err<E> =>
405
429
  *
406
430
  * ```ts
407
431
  * import {
432
+ * assert,
433
+ * assertErr,
434
+ * assertEqual,
435
+ * assertType,
408
436
  * err,
409
437
  * getOrThrow,
410
438
  * ok,
439
+ * trySync,
411
440
  * type Result,
412
441
  * type Typed,
413
442
  * } from "@evolu/common";
@@ -423,17 +452,21 @@ export const isErr = <T, E>(result: Result<T, E>): result is Err<E> =>
423
452
  *
424
453
  * // At app startup, crash if the config is invalid.
425
454
  * const config = getOrThrow(loadConfig());
426
- * expectTypeOf(config).toEqualTypeOf<Config>();
427
- * expect(config).toEqual({ port: 3000 });
428
- *
429
- * try {
430
- * getOrThrow(err({ type: "InvalidConfig" }));
431
- * assert.fail("Expected getOrThrow to throw");
432
- * } catch (error) {
433
- * assert(error instanceof Error);
434
- * expect(error.message).toBe("getOrThrow");
435
- * expect(error.cause).toEqual({ type: "InvalidConfig" });
436
- * }
455
+ * assertType<Config, typeof config>();
456
+ * assertEqual(config.port, 3000);
457
+ *
458
+ * const thrown = trySync(() => getOrThrow(err({ type: "InvalidConfig" })));
459
+ * assertErr(thrown);
460
+ * assert(thrown.error instanceof Error, "Expected an Error.");
461
+ * assertEqual(thrown.error.message, "getOrThrow");
462
+ * const cause = thrown.error.cause;
463
+ * assert(
464
+ * typeof cause === "object" &&
465
+ * cause !== null &&
466
+ * "type" in cause &&
467
+ * cause.type === "InvalidConfig",
468
+ * "Expected InvalidConfig cause.",
469
+ * );
437
470
  * ```
438
471
  *
439
472
  * Throws: `Error` with the original error attached as `cause`.
@@ -460,6 +493,8 @@ export const getOrThrow = <T, E>(result: Result<T, E>): T => {
460
493
  *
461
494
  * ```ts
462
495
  * import {
496
+ * assertEqual,
497
+ * assertType,
463
498
  * err,
464
499
  * getOrNull,
465
500
  * ok,
@@ -480,9 +515,9 @@ export const getOrThrow = <T, E>(result: Result<T, E>): T => {
480
515
  * const user = getOrNull(findUser("user-1"));
481
516
  * const missingUser = getOrNull(findUser("missing"));
482
517
  *
483
- * expectTypeOf(user).toEqualTypeOf<User | null>();
484
- * expect(user).toEqual({ id: "user-1" });
485
- * expect(missingUser).toBeNull();
518
+ * assertType<User | null, typeof user>();
519
+ * assertEqual(user, { id: "user-1" });
520
+ * assertEqual(missingUser, null);
486
521
  * ```
487
522
  *
488
523
  * @group Unwrapping
@@ -500,12 +535,18 @@ export const getOrNull = <T, E>(result: Result<T, E>): T | null =>
500
535
  * ### Example
501
536
  *
502
537
  * ```ts
503
- * import { getOk, ok, type Result } from "@evolu/common";
538
+ * import {
539
+ * assertEqual,
540
+ * assertType,
541
+ * getOk,
542
+ * ok,
543
+ * type Result,
544
+ * } from "@evolu/common";
504
545
  *
505
546
  * const getCount = (): Result<number> => ok(2);
506
547
  * const count = getOk(getCount());
507
- * expectTypeOf(count).toEqualTypeOf<number>();
508
- * expect(count).toBe(2);
548
+ * assertType<number, typeof count>();
549
+ * assertEqual(count, 2);
509
550
  * ```
510
551
  *
511
552
  * @group Unwrapping
@@ -529,7 +570,16 @@ export const getOk = <T>(result: Result<T>): T => {
529
570
  * ### Example
530
571
  *
531
572
  * ```ts
532
- * import { trySync, type Result, type Typed } from "@evolu/common";
573
+ * import {
574
+ * assert,
575
+ * assertErr,
576
+ * assertEqual,
577
+ * assertOk,
578
+ * assertType,
579
+ * trySync,
580
+ * type Result,
581
+ * type Typed,
582
+ * } from "@evolu/common";
533
583
  *
534
584
  * class LegacySeatUnavailableError extends Error {}
535
585
  *
@@ -554,10 +604,13 @@ export const getOk = <T>(result: Result<T>): T => {
554
604
  * }
555
605
  *
556
606
  * const result = reserveSeat("B2");
557
- * expectTypeOf(result).toEqualTypeOf<Result<void, SeatUnavailableError>>();
558
- * expectOk(result, undefined);
559
- * expectErr(reserveSeat("A1"), { type: "SeatUnavailable", seat: "A1" });
560
- * expect(() => reserveSeat("B1")).toThrow("Database error");
607
+ * assertType<Result<void, SeatUnavailableError>, typeof result>();
608
+ * assertOk(result, undefined);
609
+ * assertErr(reserveSeat("A1"), { type: "SeatUnavailable", seat: "A1" });
610
+ * const databaseError = trySync(() => reserveSeat("B1"));
611
+ * assertErr(databaseError);
612
+ * assert(databaseError.error instanceof Error, "Expected an Error.");
613
+ * assertEqual(databaseError.error.message, "Database error");
561
614
  * ```
562
615
  *
563
616
  * @group Exception interop
@@ -594,13 +647,25 @@ export function trySync<T, E>(
594
647
  * ### Example
595
648
  *
596
649
  * ```ts
597
- * import { tryAsync, type Result, type Typed } from "@evolu/common";
650
+ * import {
651
+ * assert,
652
+ * assertErr,
653
+ * assertEqual,
654
+ * assertOk,
655
+ * assertType,
656
+ * tryAsync,
657
+ * type Result,
658
+ * type Typed,
659
+ * } from "@evolu/common";
598
660
  *
599
661
  * class LegacySeatUnavailableError extends Error {}
600
662
  *
601
- * const legacyReserveSeat = async (seat: string): Promise<void> => {
602
- * if (seat === "A1") throw new LegacySeatUnavailableError();
603
- * if (seat === "B1") throw new Error("Database error");
663
+ * const legacyReserveSeat = (seat: string): Promise<void> => {
664
+ * if (seat === "A1") {
665
+ * return Promise.reject(new LegacySeatUnavailableError());
666
+ * }
667
+ * if (seat === "B1") return Promise.reject(new Error("Database error"));
668
+ * return Promise.resolve();
604
669
  * };
605
670
  *
606
671
  * const reserveSeat = (
@@ -621,13 +686,16 @@ export function trySync<T, E>(
621
686
  * }
622
687
  *
623
688
  * const result = await reserveSeat("B2");
624
- * expectTypeOf(result).toEqualTypeOf<Result<void, SeatUnavailableError>>();
625
- * expectOk(result, undefined);
626
- * expectErr(await reserveSeat("A1"), {
689
+ * assertType<Result<void, SeatUnavailableError>, typeof result>();
690
+ * assertOk(result, undefined);
691
+ * assertErr(await reserveSeat("A1"), {
627
692
  * type: "SeatUnavailable",
628
693
  * seat: "A1",
629
694
  * });
630
- * await expect(reserveSeat("B1")).rejects.toThrow("Database error");
695
+ * const databaseError = await tryAsync(() => reserveSeat("B1"));
696
+ * assertErr(databaseError);
697
+ * assert(databaseError.error instanceof Error, "Expected an Error.");
698
+ * assertEqual(databaseError.error.message, "Database error");
631
699
  * ```
632
700
  *
633
701
  * @group Exception interop
@@ -668,6 +736,9 @@ export async function tryAsync<T, E>(
668
736
  *
669
737
  * ```ts
670
738
  * import {
739
+ * assertErr,
740
+ * assertOk,
741
+ * assertType,
671
742
  * done,
672
743
  * err,
673
744
  * ok,
@@ -686,12 +757,10 @@ export async function tryAsync<T, E>(
686
757
  * interface ReadFailedError extends Typed<"ReadFailed"> {}
687
758
  *
688
759
  * const value = next(0);
689
- * expectTypeOf(value).toEqualTypeOf<
690
- * NextResult<string, ReadFailedError, number>
691
- * >();
692
- * expectOk(value, "first");
693
- * expectErr(next(1), { type: "ReadFailed" });
694
- * expectErr(next(2), { type: "Done", done: 2 });
760
+ * assertType<NextResult<string, ReadFailedError, number>, typeof value>();
761
+ * assertOk(value, "first");
762
+ * assertErr(next(1), { type: "ReadFailed" });
763
+ * assertErr(next(2), { type: "Done", done: 2 });
695
764
  * ```
696
765
  *
697
766
  * @group Pull
@@ -710,14 +779,14 @@ export type NextResult<A, E = never, D = void> = Result<A, E | Done<D>>;
710
779
  * ### Example
711
780
  *
712
781
  * ```ts
713
- * import { done, type Done } from "@evolu/common";
782
+ * import { assertEqual, assertType, done, type Done } from "@evolu/common";
714
783
  *
715
784
  * const withoutValue = done();
716
785
  * const withValue = done(42);
717
- * expectTypeOf(withoutValue).toEqualTypeOf<Done<void>>();
718
- * expectTypeOf(withValue).toEqualTypeOf<Done<number>>();
719
- * expect(withoutValue).toEqual({ type: "Done", done: undefined });
720
- * expect(withValue).toEqual({ type: "Done", done: 42 });
786
+ * assertType<Done<void>, typeof withoutValue>();
787
+ * assertType<Done<number>, typeof withValue>();
788
+ * assertEqual(withoutValue, { type: "Done", done: undefined });
789
+ * assertEqual(withValue, { type: "Done", done: 42 });
721
790
  * ```
722
791
  *
723
792
  * @group Pull
@@ -753,13 +822,18 @@ export function done<D>(value?: D): Done<D> {
753
822
  * ### Example
754
823
  *
755
824
  * ```ts
756
- * import { type Done, type ExcludeDone, type Typed } from "@evolu/common";
825
+ * import {
826
+ * assertType,
827
+ * type Done,
828
+ * type ExcludeDone,
829
+ * type Typed,
830
+ * } from "@evolu/common";
757
831
  *
758
832
  * type Errors = ReadFailedError | Done<number>;
759
833
  *
760
834
  * interface ReadFailedError extends Typed<"ReadFailed"> {}
761
835
  *
762
- * expectTypeOf<ExcludeDone<Errors>>().toEqualTypeOf<ReadFailedError>();
836
+ * assertType<ReadFailedError, ExcludeDone<Errors>>();
763
837
  * ```
764
838
  *
765
839
  * @group Pull
@@ -775,13 +849,18 @@ export type ExcludeDone<E> = Exclude<E, Done<any>>;
775
849
  * ### Example
776
850
  *
777
851
  * ```ts
778
- * import { type Done, type OnlyDone, type Typed } from "@evolu/common";
852
+ * import {
853
+ * assertType,
854
+ * type Done,
855
+ * type OnlyDone,
856
+ * type Typed,
857
+ * } from "@evolu/common";
779
858
  *
780
859
  * type Errors = ReadFailedError | Done<number>;
781
860
  *
782
861
  * interface ReadFailedError extends Typed<"ReadFailed"> {}
783
862
  *
784
- * expectTypeOf<OnlyDone<Errors>>().toEqualTypeOf<Done<number>>();
863
+ * assertType<Done<number>, OnlyDone<Errors>>();
785
864
  * ```
786
865
  *
787
866
  * @group Pull
@@ -795,6 +874,7 @@ export type OnlyDone<E> = Extract<E, Done<any>>;
795
874
  *
796
875
  * ```ts
797
876
  * import {
877
+ * assertType,
798
878
  * type InferDone,
799
879
  * type NextResult,
800
880
  * type Typed,
@@ -804,7 +884,7 @@ export type OnlyDone<E> = Extract<E, Done<any>>;
804
884
  *
805
885
  * interface ReadFailedError extends Typed<"ReadFailed"> {}
806
886
  *
807
- * expectTypeOf<InferDone<ReadResult>>().toEqualTypeOf<number>();
887
+ * assertType<number, InferDone<ReadResult>>();
808
888
  * ```
809
889
  *
810
890
  * @group Pull
@@ -829,6 +909,8 @@ export type InferDone<R extends Result<any, any>> =
829
909
  *
830
910
  * ```ts
831
911
  * import {
912
+ * assertOk,
913
+ * assertType,
832
914
  * flatMapResult,
833
915
  * ok,
834
916
  * type Result,
@@ -853,10 +935,11 @@ export type InferDone<R extends Result<any, any>> =
853
935
  *
854
936
  * const user: Result<User, UserNotFoundError> = ok({ id: "user-1" });
855
937
  * const profile = flatMapResult(user, ({ id }) => getProfile(id));
856
- * expectTypeOf(profile).toEqualTypeOf<
857
- * Result<Profile, UserNotFoundError | ProfileNotFoundError>
938
+ * assertType<
939
+ * Result<Profile, UserNotFoundError | ProfileNotFoundError>,
940
+ * typeof profile
858
941
  * >();
859
- * expectOk(profile, { userId: "user-1" });
942
+ * assertOk(profile, { userId: "user-1" });
860
943
  * ```
861
944
  *
862
945
  * @group Composition
@@ -878,7 +961,14 @@ export const flatMapResult = <T, E, U, F>(
878
961
  * ### Example
879
962
  *
880
963
  * ```ts
881
- * import { allResult, ok, type Result, type Typed } from "@evolu/common";
964
+ * import {
965
+ * allResult,
966
+ * assertOk,
967
+ * assertType,
968
+ * ok,
969
+ * type Result,
970
+ * type Typed,
971
+ * } from "@evolu/common";
882
972
  *
883
973
  * const getCount = (): Result<number, CountUnavailableError> => ok(2);
884
974
  *
@@ -890,13 +980,14 @@ export const flatMapResult = <T, E, U, F>(
890
980
  * interface LabelUnavailableError extends Typed<"LabelUnavailable"> {}
891
981
  *
892
982
  * const values = allResult([getCount(), getLabel()]);
893
- * expectTypeOf(values).toEqualTypeOf<
983
+ * assertType<
894
984
  * Result<
895
985
  * readonly [number, string],
896
986
  * CountUnavailableError | LabelUnavailableError
897
- * >
987
+ * >,
988
+ * typeof values
898
989
  * >();
899
- * expectOk(values, [2, "books"]);
990
+ * assertOk(values, [2, "books"]);
900
991
  * ```
901
992
  *
902
993
  * @group Composition
@@ -911,14 +1002,21 @@ export function allResult<
911
1002
  * ### Example
912
1003
  *
913
1004
  * ```ts
914
- * import { allResult, ok, type Result } from "@evolu/common";
1005
+ * import {
1006
+ * allResult,
1007
+ * assertOk,
1008
+ * assertType,
1009
+ * ok,
1010
+ * type Result,
1011
+ * } from "@evolu/common";
915
1012
  *
916
1013
  * const resultsByName = { a: ok(1), b: ok(2) } as const;
917
1014
  * const valuesByName = allResult(resultsByName);
918
- * expectTypeOf(valuesByName).toEqualTypeOf<
919
- * Result<{ readonly a: number; readonly b: number }>
1015
+ * assertType<
1016
+ * Result<{ readonly a: number; readonly b: number }>,
1017
+ * typeof valuesByName
920
1018
  * >();
921
- * expectOk(valuesByName, { a: 1, b: 2 });
1019
+ * assertOk(valuesByName, { a: 1, b: 2 });
922
1020
  * ```
923
1021
  */
924
1022
  export function allResult<T extends Readonly<Record<string, AnyResult>>>(
@@ -934,12 +1032,18 @@ export function allResult<T extends Readonly<Record<string, AnyResult>>>(
934
1032
  * ### Example
935
1033
  *
936
1034
  * ```ts
937
- * import { allResult, ok, type Result } from "@evolu/common";
1035
+ * import {
1036
+ * allResult,
1037
+ * assertOk,
1038
+ * assertType,
1039
+ * ok,
1040
+ * type Result,
1041
+ * } from "@evolu/common";
938
1042
  *
939
1043
  * const results: ReadonlyArray<Result<number>> = [ok(1), ok(2)];
940
1044
  * const numbers = allResult(results);
941
- * expectTypeOf(numbers).toEqualTypeOf<Result<ReadonlyArray<number>>>();
942
- * expectOk(numbers, [1, 2]);
1045
+ * assertType<Result<ReadonlyArray<number>>, typeof numbers>();
1046
+ * assertOk(numbers, [1, 2]);
943
1047
  * ```
944
1048
  */
945
1049
  export function allResult<T, E>(
@@ -954,6 +1058,8 @@ export function allResult<T, E>(
954
1058
  * ```ts
955
1059
  * import {
956
1060
  * allResult,
1061
+ * assertOk,
1062
+ * assertType,
957
1063
  * ok,
958
1064
  * type NonEmptyReadonlyArray,
959
1065
  * type Result,
@@ -961,10 +1067,8 @@ export function allResult<T, E>(
961
1067
  *
962
1068
  * const results: NonEmptyReadonlyArray<Result<number>> = [ok(1), ok(2)];
963
1069
  * const numbers = allResult(results);
964
- * expectTypeOf(numbers).toEqualTypeOf<
965
- * Result<NonEmptyReadonlyArray<number>>
966
- * >();
967
- * expectOk(numbers, [1, 2]);
1070
+ * assertType<Result<NonEmptyReadonlyArray<number>>, typeof numbers>();
1071
+ * assertOk(numbers, [1, 2]);
968
1072
  * ```
969
1073
  */
970
1074
  export function allResult<T, E>(
@@ -977,11 +1081,17 @@ export function allResult<T, E>(
977
1081
  * ### Example
978
1082
  *
979
1083
  * ```ts
980
- * import { allResult, ok, type Result } from "@evolu/common";
1084
+ * import {
1085
+ * allResult,
1086
+ * assertOk,
1087
+ * assertType,
1088
+ * ok,
1089
+ * type Result,
1090
+ * } from "@evolu/common";
981
1091
  *
982
1092
  * const result = allResult({ a: ok(1), b: ok(2) }, { collect: false });
983
- * expectTypeOf(result).toEqualTypeOf<Result<void>>();
984
- * expectOk(result, undefined);
1093
+ * assertType<Result<void>, typeof result>();
1094
+ * assertOk(result, undefined);
985
1095
  * ```
986
1096
  */
987
1097
  export function allResult<T extends Readonly<Record<string, AnyResult>>>(
@@ -998,12 +1108,18 @@ export function allResult<T extends Readonly<Record<string, AnyResult>>>(
998
1108
  * ### Example
999
1109
  *
1000
1110
  * ```ts
1001
- * import { allResult, ok, type Result } from "@evolu/common";
1111
+ * import {
1112
+ * allResult,
1113
+ * assertOk,
1114
+ * assertType,
1115
+ * ok,
1116
+ * type Result,
1117
+ * } from "@evolu/common";
1002
1118
  *
1003
1119
  * const results: ReadonlyArray<Result<number>> = [ok(1), ok(2)];
1004
1120
  * const result = allResult(results, { collect: false });
1005
- * expectTypeOf(result).toEqualTypeOf<Result<void>>();
1006
- * expectOk(result, undefined);
1121
+ * assertType<Result<void>, typeof result>();
1122
+ * assertOk(result, undefined);
1007
1123
  * ```
1008
1124
  */
1009
1125
  export function allResult<R extends AnyResult>(
@@ -1019,6 +1135,8 @@ export function allResult<R extends AnyResult>(
1019
1135
  * ```ts
1020
1136
  * import {
1021
1137
  * allResult,
1138
+ * assertOk,
1139
+ * assertType,
1022
1140
  * ok,
1023
1141
  * type NonEmptyReadonlyArray,
1024
1142
  * type Result,
@@ -1026,14 +1144,12 @@ export function allResult<R extends AnyResult>(
1026
1144
  *
1027
1145
  * const numbers: NonEmptyReadonlyArray<number> = [1, 2];
1028
1146
  * const doubled = allResult(numbers, (number) => ok(number * 2));
1029
- * expectTypeOf(doubled).toEqualTypeOf<
1030
- * Result<NonEmptyReadonlyArray<number>>
1031
- * >();
1032
- * expectOk(doubled, [2, 4]);
1147
+ * assertType<Result<NonEmptyReadonlyArray<number>>, typeof doubled>();
1148
+ * assertOk(doubled, [2, 4]);
1033
1149
  *
1034
1150
  * const tuple = allResult([1, 2] as const, (number) => ok(number * 2));
1035
- * expectTypeOf(tuple).toEqualTypeOf<Result<readonly [number, number]>>();
1036
- * expectOk(tuple, [2, 4]);
1151
+ * assertType<Result<readonly [number, number]>, typeof tuple>();
1152
+ * assertOk(tuple, [2, 4]);
1037
1153
  * ```
1038
1154
  */
1039
1155
  export function allResult<
@@ -1050,12 +1166,18 @@ export function allResult<
1050
1166
  * ### Example
1051
1167
  *
1052
1168
  * ```ts
1053
- * import { allResult, ok, type Result } from "@evolu/common";
1169
+ * import {
1170
+ * allResult,
1171
+ * assertOk,
1172
+ * assertType,
1173
+ * ok,
1174
+ * type Result,
1175
+ * } from "@evolu/common";
1054
1176
  *
1055
1177
  * const numbers: Iterable<number> = new Set([1, 2]);
1056
1178
  * const doubled = allResult(numbers, (number) => ok(number * 2));
1057
- * expectTypeOf(doubled).toEqualTypeOf<Result<ReadonlyArray<number>>>();
1058
- * expectOk(doubled, [2, 4]);
1179
+ * assertType<Result<ReadonlyArray<number>>, typeof doubled>();
1180
+ * assertOk(doubled, [2, 4]);
1059
1181
  * ```
1060
1182
  */
1061
1183
  export function allResult<A, R extends AnyResult>(
@@ -1069,7 +1191,13 @@ export function allResult<A, R extends AnyResult>(
1069
1191
  * ### Example
1070
1192
  *
1071
1193
  * ```ts
1072
- * import { allResult, ok, type Result } from "@evolu/common";
1194
+ * import {
1195
+ * allResult,
1196
+ * assertOk,
1197
+ * assertType,
1198
+ * ok,
1199
+ * type Result,
1200
+ * } from "@evolu/common";
1073
1201
  *
1074
1202
  * interface User {
1075
1203
  * readonly id: string;
@@ -1079,10 +1207,11 @@ export function allResult<A, R extends AnyResult>(
1079
1207
  *
1080
1208
  * const userIdsByRole = { owner: "user-1", reviewer: "user-2" } as const;
1081
1209
  * const usersByRole = allResult(userIdsByRole, toUser);
1082
- * expectTypeOf(usersByRole).toEqualTypeOf<
1083
- * Result<Readonly<Record<"owner" | "reviewer", User>>>
1210
+ * assertType<
1211
+ * Result<Readonly<Record<"owner" | "reviewer", User>>>,
1212
+ * typeof usersByRole
1084
1213
  * >();
1085
- * expectOk(usersByRole, {
1214
+ * assertOk(usersByRole, {
1086
1215
  * owner: { id: "user-1" },
1087
1216
  * reviewer: { id: "user-2" },
1088
1217
  * });
@@ -1102,7 +1231,14 @@ export function allResult<A, R extends AnyResult, K extends string>(
1102
1231
  * ### Example
1103
1232
  *
1104
1233
  * ```ts
1105
- * import { allResult, ok, type Result } from "@evolu/common";
1234
+ * import {
1235
+ * allResult,
1236
+ * assertEqual,
1237
+ * assertOk,
1238
+ * assertType,
1239
+ * ok,
1240
+ * type Result,
1241
+ * } from "@evolu/common";
1106
1242
  *
1107
1243
  * const visited: Array<number> = [];
1108
1244
  * const result = allResult(
@@ -1115,9 +1251,9 @@ export function allResult<A, R extends AnyResult, K extends string>(
1115
1251
  * collect: false,
1116
1252
  * },
1117
1253
  * );
1118
- * expectTypeOf(result).toEqualTypeOf<Result<void>>();
1119
- * expectOk(result, undefined);
1120
- * expect(visited).toEqual([1, 2]);
1254
+ * assertType<Result<void>, typeof result>();
1255
+ * assertOk(result, undefined);
1256
+ * assertEqual(visited, [1, 2]);
1121
1257
  * ```
1122
1258
  */
1123
1259
  export function allResult<A, R extends AnyResult>(
@@ -1132,13 +1268,19 @@ export function allResult<A, R extends AnyResult>(
1132
1268
  * ### Example
1133
1269
  *
1134
1270
  * ```ts
1135
- * import { allResult, ok, type Result } from "@evolu/common";
1271
+ * import {
1272
+ * allResult,
1273
+ * assertOk,
1274
+ * assertType,
1275
+ * ok,
1276
+ * type Result,
1277
+ * } from "@evolu/common";
1136
1278
  *
1137
1279
  * const result = allResult({ a: 1, b: 2 }, (number) => ok(number * 2), {
1138
1280
  * collect: false,
1139
1281
  * });
1140
- * expectTypeOf(result).toEqualTypeOf<Result<void>>();
1141
- * expectOk(result, undefined);
1282
+ * assertType<Result<void>, typeof result>();
1283
+ * assertOk(result, undefined);
1142
1284
  * ```
1143
1285
  */
1144
1286
  export function allResult<A, R extends AnyResult, K extends string>(
@@ -1226,6 +1368,8 @@ export function allResult(
1226
1368
  * ```ts
1227
1369
  * import {
1228
1370
  * anyResult,
1371
+ * assertOk,
1372
+ * assertType,
1229
1373
  * err,
1230
1374
  * ok,
1231
1375
  * type Result,
@@ -1238,8 +1382,8 @@ export function allResult(
1238
1382
  * interface CacheMissError extends Typed<"CacheMiss"> {}
1239
1383
  *
1240
1384
  * const number = anyResult([getCachedPrice(), ok(42)]);
1241
- * expectTypeOf(number).toEqualTypeOf<Result<number, CacheMissError>>();
1242
- * expectOk(number, 42);
1385
+ * assertType<Result<number, CacheMissError>, typeof number>();
1386
+ * assertOk(number, 42);
1243
1387
  * ```
1244
1388
  *
1245
1389
  * @group Composition