@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
@@ -4,39 +4,79 @@
4
4
  * @module
5
5
  */
6
6
  /**
7
- * Checks if a value is a plain object (e.g., created with `{}` or `Object`).
7
+ * Classifies Object representations supported by Evolu's structural data APIs.
8
+ *
9
+ * Plain Objects are classified from their prototype without reading their
10
+ * properties, including `Symbol.toStringTag`.
8
11
  *
9
- * Accepts objects with `Object.prototype` and objects with a `null` prototype
10
- * created via `Object.create(null)`. Rejects class instances and other built-in
11
- * objects because their prototype chain includes an application-specific or
12
- * built-in prototype before `Object.prototype`.
12
+ * ### Example
13
+ *
14
+ * ```ts
15
+ * import { assertEqual, getObjectKind } from "@evolu/common";
16
+ *
17
+ * assertEqual(getObjectKind({}), "Object");
18
+ * assertEqual(getObjectKind(new Map()), "Map");
19
+ * assertEqual(getObjectKind(/value/u), "Unsupported");
20
+ * ```
21
+ */
22
+ export const getObjectKind = (value) => {
23
+ if (Array.isArray(value))
24
+ return "Array";
25
+ if (isPlainObject(value))
26
+ return "Object";
27
+ switch (Object.prototype.toString.call(value)) {
28
+ case "[object Date]":
29
+ return "Date";
30
+ case "[object Map]":
31
+ return "Map";
32
+ case "[object Set]":
33
+ return "Set";
34
+ case "[object Uint8Array]":
35
+ return "Uint8Array";
36
+ default:
37
+ return "Unsupported";
38
+ }
39
+ };
40
+ /**
41
+ * Checks if a value is a plain object (e.g., created with `{}` or `Object`).
13
42
  *
14
- * The prototype-chain check uses structure instead of `prototype ===
15
- * Object.prototype` so it also works for plain objects coming from another
16
- * JavaScript realm.
43
+ * Accepts objects with a `null` prototype. Otherwise, it uses a realm-neutral
44
+ * structural heuristic: the immediate prototype must be a root object with own
45
+ * `hasOwnProperty` and `isPrototypeOf` properties. This recognizes ordinary
46
+ * Objects from another JavaScript realm without relying on prototype identity.
17
47
  *
18
- * TODO: deprecated Use `Object.is` from Type. Define a dedicated Type when
19
- * another object domain is required.
48
+ * A custom root prototype with the same shape can therefore be classified as
49
+ * plain. This function assumes trusted JavaScript and is not a prototype
50
+ * authentication or security boundary. Other custom prototypes, class
51
+ * instances, and built-in objects are rejected.
20
52
  *
21
53
  * ### Example
22
54
  *
23
55
  * ```ts
24
- * import { isPlainObject } from "@evolu/common";
25
- *
26
- * expect(isPlainObject({})).toBe(true);
27
- * expect(isPlainObject(Object.create(null))).toBe(true);
28
- * expect(isPlainObject(new Date())).toBe(false);
29
- * expect(isPlainObject(new (class Example {})())).toBe(false);
30
- * expect(isPlainObject([])).toBe(false);
31
- * expect(isPlainObject(null)).toBe(false);
56
+ * import { assertFalse, assertTrue, isPlainObject } from "@evolu/common";
57
+ *
58
+ * class Example {
59
+ * readonly value = "example";
60
+ * }
61
+ *
62
+ * assertTrue(isPlainObject({}));
63
+ * assertTrue(isPlainObject(Object.create(null)));
64
+ * assertFalse(isPlainObject(new Date()));
65
+ * assertFalse(isPlainObject(new Example()));
66
+ * assertFalse(isPlainObject([]));
67
+ * assertFalse(isPlainObject(null));
32
68
  * ```
33
69
  */
34
70
  export const isPlainObject = (value) => {
35
- if (Object.prototype.toString.call(value) !== "[object Object]") {
71
+ if (value === null || typeof value !== "object") {
36
72
  return false;
37
73
  }
38
74
  const prototype = Object.getPrototypeOf(value);
39
- return prototype === null || Object.getPrototypeOf(prototype) === null;
75
+ if (prototype === null)
76
+ return true;
77
+ return (Object.getPrototypeOf(prototype) === null &&
78
+ Object.hasOwn(prototype, "hasOwnProperty") &&
79
+ Object.hasOwn(prototype, "isPrototypeOf"));
40
80
  };
41
81
  /**
42
82
  * Checks if a value is a function.
@@ -44,11 +84,11 @@ export const isPlainObject = (value) => {
44
84
  * ### Example
45
85
  *
46
86
  * ```ts
47
- * import { isFunction } from "@evolu/common";
87
+ * import { assertFalse, assertTrue, isFunction } from "@evolu/common";
48
88
  *
49
- * expect(isFunction(() => {})).toBe(true);
50
- * expect(isFunction(function () {})).toBe(true);
51
- * expect(isFunction({})).toBe(false);
89
+ * assertTrue(isFunction(() => {}));
90
+ * assertTrue(isFunction(function () {}));
91
+ * assertFalse(isFunction({}));
52
92
  * ```
53
93
  */
54
94
  export const isFunction = (value) => typeof value === "function";
@@ -58,11 +98,11 @@ export const isFunction = (value) => typeof value === "function";
58
98
  * ### Example
59
99
  *
60
100
  * ```ts
61
- * import { isIterable } from "@evolu/common";
101
+ * import { assertFalse, assertTrue, isIterable } from "@evolu/common";
62
102
  *
63
- * expect(isIterable([1, 2, 3])).toBe(true);
64
- * expect(isIterable("abc")).toBe(true);
65
- * expect(isIterable({})).toBe(false);
103
+ * assertTrue(isIterable([1, 2, 3]));
104
+ * assertTrue(isIterable("abc"));
105
+ * assertFalse(isIterable({}));
66
106
  * ```
67
107
  */
68
108
  export const isIterable = (value) => value != null &&
@@ -74,6 +114,8 @@ export const isIterable = (value) => value != null &&
74
114
  *
75
115
  * ```ts
76
116
  * import {
117
+ * assertEqual,
118
+ * assertType,
77
119
  * objectToEntries,
78
120
  * type Brand,
79
121
  * type ReadonlyRecord,
@@ -85,8 +127,8 @@ export const isIterable = (value) => value != null &&
85
127
  * const users: ReadonlyRecord<UserId, string> = { [userId]: "Alice" };
86
128
  * const entries = objectToEntries(users);
87
129
  *
88
- * expectTypeOf(entries).toEqualTypeOf<ReadonlyArray<[UserId, string]>>();
89
- * expect(entries).toEqual([[userId, "Alice"]]);
130
+ * assertType<ReadonlyArray<[UserId, string]>, typeof entries>();
131
+ * assertEqual(entries, [[userId, "Alice"]]);
90
132
  * ```
91
133
  */
92
134
  export const objectToEntries = (record) => Object.entries(record);
@@ -100,6 +142,8 @@ export const objectToEntries = (record) => Object.entries(record);
100
142
  *
101
143
  * ```ts
102
144
  * import {
145
+ * assertEqual,
146
+ * assertType,
103
147
  * objectFromEntries,
104
148
  * type Brand,
105
149
  * type ReadonlyRecord,
@@ -111,8 +155,8 @@ export const objectToEntries = (record) => Object.entries(record);
111
155
  * ];
112
156
  * const users = objectFromEntries(entries);
113
157
  *
114
- * expectTypeOf(users).toEqualTypeOf<ReadonlyRecord<UserId, string>>();
115
- * expect(users).toEqual({ u1: "Alice" });
158
+ * assertType<ReadonlyRecord<UserId, string>, typeof users>();
159
+ * assertEqual(users, { u1: "Alice" });
116
160
  * ```
117
161
  */
118
162
  export const objectFromEntries = (entries) => Object.fromEntries(entries);
@@ -125,17 +169,20 @@ export const objectFromEntries = (entries) => Object.fromEntries(entries);
125
169
  * ### Example
126
170
  *
127
171
  * ```ts
128
- * import { objectFrom, type ReadonlyRecord } from "@evolu/common";
172
+ * import {
173
+ * assertEqual,
174
+ * assertType,
175
+ * objectFrom,
176
+ * type ReadonlyRecord,
177
+ * } from "@evolu/common";
129
178
  *
130
179
  * const translations = objectFrom(
131
180
  * ["en", "fr"] as const,
132
181
  * (locale): string => `Hello in ${locale}`,
133
182
  * );
134
183
  *
135
- * expectTypeOf(translations).toEqualTypeOf<
136
- * ReadonlyRecord<"en" | "fr", string>
137
- * >();
138
- * expect(translations).toEqual({
184
+ * assertType<ReadonlyRecord<"en" | "fr", string>, typeof translations>();
185
+ * assertEqual(translations, {
139
186
  * en: "Hello in en",
140
187
  * fr: "Hello in fr",
141
188
  * });
@@ -193,7 +240,7 @@ export const emptyRecord =
193
240
  * ### Example
194
241
  *
195
242
  * ```ts
196
- * import { getOwnProp } from "@evolu/common";
243
+ * import { assertEqual, assertType, getOwnProp } from "@evolu/common";
197
244
  *
198
245
  * interface User {
199
246
  * readonly name: string;
@@ -204,9 +251,9 @@ export const emptyRecord =
204
251
  * };
205
252
  * const user = getOwnProp(users, "bob");
206
253
  *
207
- * expectTypeOf(user).toEqualTypeOf<User | undefined>();
208
- * expect(user).toBeUndefined();
209
- * expect(getOwnProp(users, "toString")).toBeUndefined();
254
+ * assertType<User | undefined, typeof user>();
255
+ * assertEqual(user, undefined);
256
+ * assertEqual(getOwnProp(users, "toString"), undefined);
210
257
  * ```
211
258
  */
212
259
  export const getOwnProp = (record, key) => (Object.hasOwn(record, key) ? record[key] : undefined);
@@ -9,7 +9,16 @@
9
9
  * ### Example
10
10
  *
11
11
  * ```ts
12
- * import { isNone, isSome, none, type Option, some } from "@evolu/common";
12
+ * import {
13
+ * assert,
14
+ * assertSame,
15
+ * assertTrue,
16
+ * isNone,
17
+ * isSome,
18
+ * none,
19
+ * type Option,
20
+ * some,
21
+ * } from "@evolu/common";
13
22
  *
14
23
  * const cache = new Map<string, Option<unknown>>();
15
24
  *
@@ -19,10 +28,10 @@
19
28
  * cache.set("b", some(undefined));
20
29
  *
21
30
  * const a = get("a");
22
- * assert(isSome(a));
23
- * expect(a.value).toBeNull();
24
- * expect(isSome(get("b"))).toBe(true);
25
- * expect(isNone(get("c"))).toBe(true);
31
+ * assert(isSome(a), "Expected Some.");
32
+ * assertSame(a.value, null);
33
+ * assertTrue(isSome(get("b")));
34
+ * assertTrue(isNone(get("c")));
26
35
  * ```
27
36
  *
28
37
  * @module
@@ -1 +1 @@
1
- {"version":3,"file":"Option.d.ts","sourceRoot":"","sources":["../../src/Option.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AAEH,sBAAsB;AACtB,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAEvC,sBAAsB;AACtB,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AAEvC,0CAA0C;AAC1C,MAAM,WAAW,IAAI,CAAC,GAAG,CAAC,CAAC,CAAE,SAAQ,KAAK,CAAC,MAAM,CAAC;IAChD,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;CACnB;AAED,yCAAyC;AACzC,MAAM,WAAW,IAAK,SAAQ,KAAK,CAAC,MAAM,CAAC;CAAG;AAE9C;;;;GAIG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,CAAC,IAC3C,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAEtC,8BAA8B;AAC9B,eAAO,MAAM,IAAI,GAAI,CAAC,SAAS,CAAC,KAAG,MAAM,CAAC,CAAC,CAGzC,CAAC;AAEH,oCAAoC;AACpC,eAAO,MAAM,IAAI,EAAE,IAAuB,CAAC;AAE3C,mCAAmC;AACnC,eAAO,MAAM,MAAM,GAAI,CAAC,UAAU,MAAM,CAAC,CAAC,CAAC,KAAG,MAAM,IAAI,IAAI,CAAC,CAAC,CACtC,CAAC;AAEzB,mCAAmC;AACnC,eAAO,MAAM,MAAM,GAAI,CAAC,UAAU,MAAM,CAAC,CAAC,CAAC,KAAG,MAAM,IAAI,IAChC,CAAC;AAEzB;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAI,CAAC,SACrB,CAAC,GAAG,IAAI,GAAG,SAAS,KAC1B,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAyC,CAAC"}
1
+ {"version":3,"file":"Option.d.ts","sourceRoot":"","sources":["../../src/Option.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqCG;AAEH,sBAAsB;AACtB,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AAEvC,sBAAsB;AACtB,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,GAAG,IAAI,CAAC;AAEvC,0CAA0C;AAC1C,MAAM,WAAW,IAAI,CAAC,GAAG,CAAC,CAAC,CAAE,SAAQ,KAAK,CAAC,MAAM,CAAC;IAChD,QAAQ,CAAC,KAAK,EAAE,CAAC,CAAC;CACnB;AAED,yCAAyC;AACzC,MAAM,WAAW,IAAK,SAAQ,KAAK,CAAC,MAAM,CAAC;CAAG;AAE9C;;;;GAIG;AACH,MAAM,MAAM,WAAW,CAAC,CAAC,SAAS,MAAM,CAAC,GAAG,CAAC,IAC3C,CAAC,SAAS,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAEtC,8BAA8B;AAC9B,eAAO,MAAM,IAAI,GAAI,CAAC,SAAS,CAAC,KAAG,MAAM,CAAC,CAAC,CAGzC,CAAC;AAEH,oCAAoC;AACpC,eAAO,MAAM,IAAI,EAAE,IAAuB,CAAC;AAE3C,mCAAmC;AACnC,eAAO,MAAM,MAAM,GAAI,CAAC,UAAU,MAAM,CAAC,CAAC,CAAC,KAAG,MAAM,IAAI,IAAI,CAAC,CAAC,CACtC,CAAC;AAEzB,mCAAmC;AACnC,eAAO,MAAM,MAAM,GAAI,CAAC,UAAU,MAAM,CAAC,CAAC,CAAC,KAAG,MAAM,IAAI,IAChC,CAAC;AAEzB;;;;GAIG;AACH,eAAO,MAAM,YAAY,GAAI,CAAC,SACrB,CAAC,GAAG,IAAI,GAAG,SAAS,KAC1B,MAAM,CAAC,WAAW,CAAC,CAAC,CAAC,CAAyC,CAAC"}
@@ -9,7 +9,16 @@
9
9
  * ### Example
10
10
  *
11
11
  * ```ts
12
- * import { isNone, isSome, none, type Option, some } from "@evolu/common";
12
+ * import {
13
+ * assert,
14
+ * assertSame,
15
+ * assertTrue,
16
+ * isNone,
17
+ * isSome,
18
+ * none,
19
+ * type Option,
20
+ * some,
21
+ * } from "@evolu/common";
13
22
  *
14
23
  * const cache = new Map<string, Option<unknown>>();
15
24
  *
@@ -19,10 +28,10 @@
19
28
  * cache.set("b", some(undefined));
20
29
  *
21
30
  * const a = get("a");
22
- * assert(isSome(a));
23
- * expect(a.value).toBeNull();
24
- * expect(isSome(get("b"))).toBe(true);
25
- * expect(isNone(get("c"))).toBe(true);
31
+ * assert(isSome(a), "Expected Some.");
32
+ * assertSame(a.value, null);
33
+ * assertTrue(isSome(get("b")));
34
+ * assertTrue(isNone(get("c")));
26
35
  * ```
27
36
  *
28
37
  * @module
@@ -28,12 +28,12 @@ export type Ordering = -1 | 0 | 1;
28
28
  * ### Example
29
29
  *
30
30
  * ```ts
31
- * import { createOrder } from "@evolu/common";
31
+ * import { assertEqual, createOrder } from "@evolu/common";
32
32
  *
33
33
  * const orderNumber = createOrder<number>((x, y) => x < y);
34
- * expect(orderNumber(1, 2)).toBe(-1);
35
- * expect(orderNumber(2, 1)).toBe(1);
36
- * expect(orderNumber(1, 1)).toBe(0);
34
+ * assertEqual(orderNumber(1, 2), -1);
35
+ * assertEqual(orderNumber(2, 1), 1);
36
+ * assertEqual(orderNumber(1, 1), 0);
37
37
  * ```
38
38
  */
39
39
  export declare const createOrder: <A>(isLessThan: (x: A, y: A) => boolean) => Order<A>;
@@ -43,10 +43,10 @@ export declare const createOrder: <A>(isLessThan: (x: A, y: A) => boolean) => Or
43
43
  * ### Example
44
44
  *
45
45
  * ```ts
46
- * import { orderNumber, reverseOrder } from "@evolu/common";
46
+ * import { assertEqual, orderNumber, reverseOrder } from "@evolu/common";
47
47
  *
48
48
  * const descendingOrderNumber = reverseOrder(orderNumber);
49
- * expect([3, 1, 2].toSorted(descendingOrderNumber)).toEqual([3, 2, 1]);
49
+ * assertEqual([3, 1, 2].toSorted(descendingOrderNumber), [3, 2, 1]);
50
50
  * ```
51
51
  */
52
52
  export declare const reverseOrder: <A>(order: Order<A>) => Order<A>;
@@ -56,9 +56,9 @@ export declare const reverseOrder: <A>(order: Order<A>) => Order<A>;
56
56
  * ### Example
57
57
  *
58
58
  * ```ts
59
- * import { orderString } from "@evolu/common";
59
+ * import { assertEqual, orderString } from "@evolu/common";
60
60
  *
61
- * expect(["c", "b", "a"].toSorted(orderString)).toEqual(["a", "b", "c"]);
61
+ * assertEqual(["c", "b", "a"].toSorted(orderString), ["a", "b", "c"]);
62
62
  * ```
63
63
  */
64
64
  export declare const orderString: Order<string>;
@@ -68,9 +68,9 @@ export declare const orderString: Order<string>;
68
68
  * ### Example
69
69
  *
70
70
  * ```ts
71
- * import { orderNumber } from "@evolu/common";
71
+ * import { assertEqual, orderNumber } from "@evolu/common";
72
72
  *
73
- * expect([2, 1, 3].toSorted(orderNumber)).toEqual([1, 2, 3]);
73
+ * assertEqual([2, 1, 3].toSorted(orderNumber), [1, 2, 3]);
74
74
  * ```
75
75
  */
76
76
  export declare const orderNumber: Order<number>;
@@ -80,9 +80,9 @@ export declare const orderNumber: Order<number>;
80
80
  * ### Example
81
81
  *
82
82
  * ```ts
83
- * import { orderBigInt } from "@evolu/common";
83
+ * import { assertEqual, orderBigInt } from "@evolu/common";
84
84
  *
85
- * expect([2n, 1n, 3n].toSorted(orderBigInt)).toEqual([1n, 2n, 3n]);
85
+ * assertEqual([2n, 1n, 3n].toSorted(orderBigInt), [1n, 2n, 3n]);
86
86
  * ```
87
87
  */
88
88
  export declare const orderBigInt: Order<bigint>;
package/dist/src/Order.js CHANGED
@@ -9,12 +9,12 @@
9
9
  * ### Example
10
10
  *
11
11
  * ```ts
12
- * import { createOrder } from "@evolu/common";
12
+ * import { assertEqual, createOrder } from "@evolu/common";
13
13
  *
14
14
  * const orderNumber = createOrder<number>((x, y) => x < y);
15
- * expect(orderNumber(1, 2)).toBe(-1);
16
- * expect(orderNumber(2, 1)).toBe(1);
17
- * expect(orderNumber(1, 1)).toBe(0);
15
+ * assertEqual(orderNumber(1, 2), -1);
16
+ * assertEqual(orderNumber(2, 1), 1);
17
+ * assertEqual(orderNumber(1, 1), 0);
18
18
  * ```
19
19
  */
20
20
  export const createOrder = (isLessThan) => (x, y) => x === y ? 0 : isLessThan(x, y) ? -1 : 1;
@@ -24,10 +24,10 @@ export const createOrder = (isLessThan) => (x, y) => x === y ? 0 : isLessThan(x,
24
24
  * ### Example
25
25
  *
26
26
  * ```ts
27
- * import { orderNumber, reverseOrder } from "@evolu/common";
27
+ * import { assertEqual, orderNumber, reverseOrder } from "@evolu/common";
28
28
  *
29
29
  * const descendingOrderNumber = reverseOrder(orderNumber);
30
- * expect([3, 1, 2].toSorted(descendingOrderNumber)).toEqual([3, 2, 1]);
30
+ * assertEqual([3, 1, 2].toSorted(descendingOrderNumber), [3, 2, 1]);
31
31
  * ```
32
32
  */
33
33
  export const reverseOrder = (order) => (a, b) => order(b, a);
@@ -37,9 +37,9 @@ export const reverseOrder = (order) => (a, b) => order(b, a);
37
37
  * ### Example
38
38
  *
39
39
  * ```ts
40
- * import { orderString } from "@evolu/common";
40
+ * import { assertEqual, orderString } from "@evolu/common";
41
41
  *
42
- * expect(["c", "b", "a"].toSorted(orderString)).toEqual(["a", "b", "c"]);
42
+ * assertEqual(["c", "b", "a"].toSorted(orderString), ["a", "b", "c"]);
43
43
  * ```
44
44
  */
45
45
  export const orderString = /*#__PURE__*/ createOrder((a, b) => a < b);
@@ -49,9 +49,9 @@ export const orderString = /*#__PURE__*/ createOrder((a, b) => a < b);
49
49
  * ### Example
50
50
  *
51
51
  * ```ts
52
- * import { orderNumber } from "@evolu/common";
52
+ * import { assertEqual, orderNumber } from "@evolu/common";
53
53
  *
54
- * expect([2, 1, 3].toSorted(orderNumber)).toEqual([1, 2, 3]);
54
+ * assertEqual([2, 1, 3].toSorted(orderNumber), [1, 2, 3]);
55
55
  * ```
56
56
  */
57
57
  export const orderNumber = /*#__PURE__*/ createOrder((a, b) => a < b);
@@ -61,9 +61,9 @@ export const orderNumber = /*#__PURE__*/ createOrder((a, b) => a < b);
61
61
  * ### Example
62
62
  *
63
63
  * ```ts
64
- * import { orderBigInt } from "@evolu/common";
64
+ * import { assertEqual, orderBigInt } from "@evolu/common";
65
65
  *
66
- * expect([2n, 1n, 3n].toSorted(orderBigInt)).toEqual([1n, 2n, 3n]);
66
+ * assertEqual([2n, 1n, 3n].toSorted(orderBigInt), [1n, 2n, 3n]);
67
67
  * ```
68
68
  */
69
69
  export const orderBigInt = /*#__PURE__*/ createOrder((a, b) => a < b);
@@ -68,8 +68,8 @@ export interface TestGlobalErrors extends Disposable {
68
68
  * Platforms deliver global errors asynchronously and provide no hook for
69
69
  * "nothing was reported", so settle emits a sentinel of the same kind and
70
70
  * resolves when it arrives. Platform delivery is ordered, so all earlier
71
- * errors are recorded by then. Use it to assert absence: `expect(await
72
- * unhandledRejections.settle()).toEqual([])`.
71
+ * errors are recorded by then. Assert absence with `assertEqual(await
72
+ * unhandledRejections.settle(), [])`.
73
73
  */
74
74
  readonly settle: () => Promise<ReadonlyArray<unknown>>;
75
75
  }
@@ -20,6 +20,9 @@ export type RandomNumber = number & Brand<"RandomNumber">;
20
20
  *
21
21
  * ```ts
22
22
  * import {
23
+ * assertEqual,
24
+ * assertTrue,
25
+ * assertType,
23
26
  * createRandom,
24
27
  * testCreateRandom,
25
28
  * type RandomNumber,
@@ -28,14 +31,14 @@ export type RandomNumber = number & Brand<"RandomNumber">;
28
31
  * // For apps, use the Math.random-backed implementation.
29
32
  * const random = createRandom();
30
33
  * const value = random.next();
31
- * expectTypeOf(value).toEqualTypeOf<RandomNumber>();
32
- * expect(value).toBeGreaterThanOrEqual(0);
33
- * expect(value).toBeLessThan(1);
34
+ * assertType<RandomNumber, typeof value>();
35
+ * assertTrue(value >= 0);
36
+ * assertTrue(value < 1);
34
37
  *
35
38
  * // For tests, use a seed.
36
39
  * const firstTestRandom = testCreateRandom("test");
37
40
  * const secondTestRandom = testCreateRandom("test");
38
- * expect(firstTestRandom.next()).toBe(secondTestRandom.next());
41
+ * assertEqual(firstTestRandom.next(), secondTestRandom.next());
39
42
  * ```
40
43
  */
41
44
  export interface Random {
@@ -1 +1 @@
1
- {"version":3,"file":"Random.d.ts","sourceRoot":"","sources":["../../src/Random.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC;AAE1D;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,WAAW,MAAM;IACrB,0EAA0E;IAC1E,QAAQ,CAAC,IAAI,EAAE,MAAM,YAAY,CAAC;CACnC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,oDAAoD;AACpD,eAAO,MAAM,YAAY,QAAO,MAE9B,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,qBAAqB,MAKjD,CAAC;AAEF;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;CAC/B;AAED,uEAAuE;AACvE,eAAO,MAAM,eAAe,QAAO,SAA4B,CAAC;AAEhE;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,qBAAqB,SAChC,CAAC"}
1
+ {"version":3,"file":"Random.d.ts","sourceRoot":"","sources":["../../src/Random.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,MAAM,IAAI,SAAS,EAAE,MAAM,QAAQ,CAAC;AAC7C,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC;;;;GAIG;AACH,MAAM,MAAM,YAAY,GAAG,MAAM,GAAG,KAAK,CAAC,cAAc,CAAC,CAAC;AAE1D;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,MAAM,WAAW,MAAM;IACrB,0EAA0E;IAC1E,QAAQ,CAAC,IAAI,EAAE,MAAM,YAAY,CAAC;CACnC;AAED,MAAM,WAAW,SAAS;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB;AAED,oDAAoD;AACpD,eAAO,MAAM,YAAY,QAAO,MAE9B,CAAC;AAEH;;;;GAIG;AACH,eAAO,MAAM,gBAAgB,qBAAqB,MAKjD,CAAC;AAEF;;;;;GAKG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,CAAC,SAAS,EAAE,SAAS,CAAC;CAC/B;AAED,uEAAuE;AACvE,eAAO,MAAM,eAAe,QAAO,SAA4B,CAAC;AAEhE;;;;;GAKG;AACH,eAAO,MAAM,mBAAmB,qBAAqB,SAChC,CAAC"}
@@ -27,8 +27,11 @@ import type { Eq } from "./Eq.ts";
27
27
  *
28
28
  * ```ts
29
29
  * import {
30
+ * assertErr,
31
+ * assertEqual,
30
32
  * createRedacted,
31
33
  * revealRedacted,
34
+ * trySync,
32
35
  * type Brand,
33
36
  * type Redacted,
34
37
  * } from "@evolu/common";
@@ -42,11 +45,13 @@ import type { Eq } from "./Eq.ts";
42
45
  * using redactedKey: RedactedApiKey = createRedacted(apiKey);
43
46
  * const fetchUser = (key: RedactedApiKey): ApiKey => revealRedacted(key);
44
47
  *
45
- * expect(redactedKey.toString()).toBe("<redacted>");
46
- * expect(JSON.stringify({ apiKey: redactedKey })).toBe(
48
+ * // oxlint-disable-next-line typescript/no-base-to-string -- Redacted intentionally implements a safe custom toString.
49
+ * assertEqual(redactedKey.toString(), "<redacted>");
50
+ * assertEqual(
51
+ * JSON.stringify({ apiKey: redactedKey }),
47
52
  * '{"apiKey":"<redacted>"}',
48
53
  * );
49
- * expect(fetchUser(redactedKey)).toBe(apiKey);
54
+ * assertEqual(fetchUser(redactedKey), apiKey);
50
55
  *
51
56
  * using password = createRedacted("password" as DbPassword);
52
57
  * // @ts-expect-error Redacted secrets retain their distinct branded types.
@@ -57,7 +62,7 @@ import type { Eq } from "./Eq.ts";
57
62
  * return key;
58
63
  * })();
59
64
  * // Leaving the `using` scope removes the value from memory.
60
- * expect(() => revealRedacted(disposedKey)).toThrow();
65
+ * assertErr(trySync(() => revealRedacted(disposedKey)));
61
66
  * ```
62
67
  */
63
68
  export interface Redacted<A> extends Brand<"Redacted">, Disposable {
@@ -84,6 +89,8 @@ export declare const isRedacted: (value: unknown) => value is Redacted<unknown>;
84
89
  *
85
90
  * ```ts
86
91
  * import {
92
+ * assertFalse,
93
+ * assertTrue,
87
94
  * createEqRedacted,
88
95
  * createRedacted,
89
96
  * eqString,
@@ -98,8 +105,8 @@ export declare const isRedacted: (value: unknown) => value is Redacted<unknown>;
98
105
  * using b = createRedacted("x" as ApiKey);
99
106
  * using c = createRedacted("y" as ApiKey);
100
107
  *
101
- * expect(eqRedactedApiKey(a, b)).toBe(true);
102
- * expect(eqRedactedApiKey(a, c)).toBe(false);
108
+ * assertTrue(eqRedactedApiKey(a, b));
109
+ * assertFalse(eqRedactedApiKey(a, c));
103
110
  * ```
104
111
  */
105
112
  export declare const createEqRedacted: <A>(eq: Eq<A>) => Eq<Redacted<A>>;
@@ -1 +1 @@
1
- {"version":3,"file":"Redacted.d.ts","sourceRoot":"","sources":["../../src/Redacted.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAElC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAsDG;AACH,MAAM,WAAW,QAAQ,CAAC,CAAC,CAAE,SAAQ,KAAK,CAAC,UAAU,CAAC,EAAE,UAAU;IAChE,uEAAuE;IACvE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;CAClB;AAED,gEAAgE;AAChE,eAAO,MAAM,cAAc,GAAI,CAAC,SAAS,CAAC,KAAG,QAAQ,CAAC,CAAC,CAItD,CAAC;AAaF;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,GAAI,CAAC,YAAY,QAAQ,CAAC,CAAC,CAAC,KAAG,CAGzD,CAAC;AAEF,uDAAuD;AACvD,eAAO,MAAM,UAAU,UAAW,OAAO,KAAG,KAAK,IAAI,QAAQ,CAAC,OAAO,CAG7B,CAAC;AAEzC;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,eAAO,MAAM,gBAAgB,GAC1B,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,KAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAEY,CAAC"}
1
+ {"version":3,"file":"Redacted.d.ts","sourceRoot":"","sources":["../../src/Redacted.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACxC,OAAO,KAAK,EAAE,EAAE,EAAE,MAAM,SAAS,CAAC;AAElC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2DG;AACH,MAAM,WAAW,QAAQ,CAAC,CAAC,CAAE,SAAQ,KAAK,CAAC,UAAU,CAAC,EAAE,UAAU;IAChE,uEAAuE;IACvE,QAAQ,CAAC,IAAI,EAAE,CAAC,CAAC;CAClB;AAED,gEAAgE;AAChE,eAAO,MAAM,cAAc,GAAI,CAAC,SAAS,CAAC,KAAG,QAAQ,CAAC,CAAC,CAItD,CAAC;AAaF;;;;;;GAMG;AACH,eAAO,MAAM,cAAc,GAAI,CAAC,YAAY,QAAQ,CAAC,CAAC,CAAC,KAAG,CAGzD,CAAC;AAEF,uDAAuD;AACvD,eAAO,MAAM,UAAU,UAAW,OAAO,KAAG,KAAK,IAAI,QAAQ,CAAC,OAAO,CAG7B,CAAC;AAEzC;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,eAAO,MAAM,gBAAgB,GAC1B,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,KAAG,EAAE,CAAC,QAAQ,CAAC,CAAC,CAAC,CAEY,CAAC"}
@@ -43,6 +43,8 @@ export const isRedacted = (value) => typeof value === "object" &&
43
43
  *
44
44
  * ```ts
45
45
  * import {
46
+ * assertFalse,
47
+ * assertTrue,
46
48
  * createEqRedacted,
47
49
  * createRedacted,
48
50
  * eqString,
@@ -57,8 +59,8 @@ export const isRedacted = (value) => typeof value === "object" &&
57
59
  * using b = createRedacted("x" as ApiKey);
58
60
  * using c = createRedacted("y" as ApiKey);
59
61
  *
60
- * expect(eqRedactedApiKey(a, b)).toBe(true);
61
- * expect(eqRedactedApiKey(a, c)).toBe(false);
62
+ * assertTrue(eqRedactedApiKey(a, b));
63
+ * assertFalse(eqRedactedApiKey(a, c));
62
64
  * ```
63
65
  */
64
66
  export const createEqRedacted = (eq) => (x, y) => eq(revealRedacted(x), revealRedacted(y));
package/dist/src/Ref.d.ts CHANGED
@@ -18,18 +18,18 @@
18
18
  * ### Example
19
19
  *
20
20
  * ```ts
21
- * import { createRef } from "@evolu/common";
21
+ * import { assertEqual, createRef } from "@evolu/common";
22
22
  *
23
23
  * const count = createRef(0);
24
24
  * count.set(1);
25
25
  * count.update((n) => n + 1);
26
- * expect(count.get()).toBe(2);
26
+ * assertEqual(count.get(), 2);
27
27
  * ```
28
28
  *
29
29
  * ### As a dependency
30
30
  *
31
31
  * ```ts
32
- * import { createRef, type Ref } from "@evolu/common";
32
+ * import { assertEqual, createRef, type Ref } from "@evolu/common";
33
33
  *
34
34
  * interface CounterRefDep {
35
35
  * readonly counterRef: Ref<number>;
@@ -37,7 +37,7 @@
37
37
  *
38
38
  * const deps: CounterRefDep = { counterRef: createRef(0) };
39
39
  * deps.counterRef.update((count) => count + 1);
40
- * expect(deps.counterRef.get()).toBe(1);
40
+ * assertEqual(deps.counterRef.get(), 1);
41
41
  * ```
42
42
  */
43
43
  export interface Ref<T> {
@@ -40,7 +40,7 @@ import { NonNegativeInt, PositiveInt } from "./Type.ts";
40
40
  * Use the default identity semantics.
41
41
  *
42
42
  * ```ts
43
- * import { createRelation } from "@evolu/common";
43
+ * import { assertFalse, assertTrue, createRelation } from "@evolu/common";
44
44
  *
45
45
  * interface Socket {
46
46
  * readonly id: string;
@@ -51,8 +51,8 @@ import { NonNegativeInt, PositiveInt } from "./Type.ts";
51
51
  *
52
52
  * relation.add(socket, "owner-1");
53
53
  *
54
- * expect(relation.has(socket, "owner-1")).toBe(true);
55
- * expect(relation.has({ id: "socket-1" }, "owner-1")).toBe(false);
54
+ * assertTrue(relation.has(socket, "owner-1"));
55
+ * assertFalse(relation.has({ id: "socket-1" }, "owner-1"));
56
56
  * ```
57
57
  *
58
58
  * ### Lookup-derived equality
@@ -60,7 +60,7 @@ import { NonNegativeInt, PositiveInt } from "./Type.ts";
60
60
  * Use lookup-derived equality.
61
61
  *
62
62
  * ```ts
63
- * import { createRelation } from "@evolu/common";
63
+ * import { assertTrue, createRelation } from "@evolu/common";
64
64
  *
65
65
  * interface Person {
66
66
  * readonly id: string;
@@ -74,9 +74,7 @@ import { NonNegativeInt, PositiveInt } from "./Type.ts";
74
74
  *
75
75
  * relation.add({ id: "1", name: "Ada" }, { id: "admins" });
76
76
  *
77
- * expect(relation.has({ id: "1", name: "Grace" }, { id: "admins" })).toBe(
78
- * true,
79
- * );
77
+ * assertTrue(relation.has({ id: "1", name: "Grace" }, { id: "admins" }));
80
78
  * ```
81
79
  *
82
80
  * @see {@link createRelation}
@@ -1 +1 @@
1
- {"version":3,"file":"Relation.d.ts","sourceRoot":"","sources":["../../src/Relation.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Relation.d.ts","sourceRoot":"","sources":["../../src/Relation.ts"],"names":[],"mappings":"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"}