@evolu/common 8.9.0 → 8.11.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 (337) hide show
  1. package/dist/src/Bytes.d.ts +647 -0
  2. package/dist/src/Bytes.d.ts.map +1 -0
  3. package/dist/src/{Binary.js → Bytes.js} +266 -16
  4. package/dist/src/Config.d.ts +142 -0
  5. package/dist/src/Config.d.ts.map +1 -0
  6. package/dist/src/Config.js +181 -0
  7. package/dist/src/Console.d.ts +62 -7
  8. package/dist/src/Console.d.ts.map +1 -1
  9. package/dist/src/Console.js +20 -4
  10. package/dist/src/Crypto.d.ts +76 -4
  11. package/dist/src/Crypto.d.ts.map +1 -1
  12. package/dist/src/Crypto.js +55 -4
  13. package/dist/src/Error.d.ts +45 -0
  14. package/dist/src/Error.d.ts.map +1 -1
  15. package/dist/src/Error.js +69 -0
  16. package/dist/src/Fs.d.ts +376 -0
  17. package/dist/src/Fs.d.ts.map +1 -0
  18. package/dist/src/Fs.js +113 -0
  19. package/dist/src/Identicon.d.ts +2 -2
  20. package/dist/src/Identicon.js +2 -2
  21. package/dist/src/LeakDetector.d.ts +22 -3
  22. package/dist/src/LeakDetector.d.ts.map +1 -1
  23. package/dist/src/LeakDetector.js +12 -2
  24. package/dist/src/LockManager.d.ts +8 -0
  25. package/dist/src/LockManager.d.ts.map +1 -1
  26. package/dist/src/LockManager.js +6 -0
  27. package/dist/src/Number.d.ts +50 -7
  28. package/dist/src/Number.d.ts.map +1 -1
  29. package/dist/src/Number.js +47 -8
  30. package/dist/src/Object.d.ts +32 -0
  31. package/dist/src/Object.d.ts.map +1 -1
  32. package/dist/src/Object.js +46 -0
  33. package/dist/src/Platform.d.ts +47 -7
  34. package/dist/src/Platform.d.ts.map +1 -1
  35. package/dist/src/Platform.js +24 -5
  36. package/dist/src/Random.d.ts +25 -2
  37. package/dist/src/Random.d.ts.map +1 -1
  38. package/dist/src/Random.js +14 -2
  39. package/dist/src/Resource.d.ts +156 -1
  40. package/dist/src/Resource.d.ts.map +1 -1
  41. package/dist/src/Resource.js +201 -72
  42. package/dist/src/Schedule.d.ts +11 -10
  43. package/dist/src/Schedule.d.ts.map +1 -1
  44. package/dist/src/Schedule.js +1 -1
  45. package/dist/src/Sqlite.d.ts +132 -16
  46. package/dist/src/Sqlite.d.ts.map +1 -1
  47. package/dist/src/Sqlite.js +64 -10
  48. package/dist/src/Task.d.ts +15 -4
  49. package/dist/src/Task.d.ts.map +1 -1
  50. package/dist/src/Task.js +41 -15
  51. package/dist/src/Test.d.ts +9 -0
  52. package/dist/src/Test.d.ts.map +1 -1
  53. package/dist/src/Test.js +4 -0
  54. package/dist/src/Time.d.ts +179 -20
  55. package/dist/src/Time.d.ts.map +1 -1
  56. package/dist/src/Time.js +95 -6
  57. package/dist/src/Type.d.ts +3056 -1539
  58. package/dist/src/Type.d.ts.map +1 -1
  59. package/dist/src/Type.js +2548 -584
  60. package/dist/src/WebSocket.d.ts +164 -13
  61. package/dist/src/WebSocket.d.ts.map +1 -1
  62. package/dist/src/WebSocket.js +133 -24
  63. package/dist/src/Worker.d.ts +90 -8
  64. package/dist/src/Worker.d.ts.map +1 -1
  65. package/dist/src/Worker.js +28 -2
  66. package/dist/src/index.d.ts +9 -8
  67. package/dist/src/index.d.ts.map +1 -1
  68. package/dist/src/index.js +5 -4
  69. package/dist/src/intl/_en.d.ts +24 -1
  70. package/dist/src/intl/_en.d.ts.map +1 -1
  71. package/dist/src/intl/_en.js +20 -0
  72. package/dist/src/intl/ar.d.ts +24 -1
  73. package/dist/src/intl/ar.d.ts.map +1 -1
  74. package/dist/src/intl/ar.js +20 -0
  75. package/dist/src/intl/bn.d.ts +24 -1
  76. package/dist/src/intl/bn.d.ts.map +1 -1
  77. package/dist/src/intl/bn.js +20 -0
  78. package/dist/src/intl/ca.d.ts +24 -1
  79. package/dist/src/intl/ca.d.ts.map +1 -1
  80. package/dist/src/intl/ca.js +20 -0
  81. package/dist/src/intl/cs.d.ts +24 -1
  82. package/dist/src/intl/cs.d.ts.map +1 -1
  83. package/dist/src/intl/cs.js +20 -0
  84. package/dist/src/intl/da.d.ts +24 -1
  85. package/dist/src/intl/da.d.ts.map +1 -1
  86. package/dist/src/intl/da.js +20 -0
  87. package/dist/src/intl/de.d.ts +24 -1
  88. package/dist/src/intl/de.d.ts.map +1 -1
  89. package/dist/src/intl/de.js +20 -0
  90. package/dist/src/intl/el.d.ts +24 -1
  91. package/dist/src/intl/el.d.ts.map +1 -1
  92. package/dist/src/intl/el.js +20 -0
  93. package/dist/src/intl/es.d.ts +24 -1
  94. package/dist/src/intl/es.d.ts.map +1 -1
  95. package/dist/src/intl/es.js +20 -0
  96. package/dist/src/intl/fa.d.ts +24 -1
  97. package/dist/src/intl/fa.d.ts.map +1 -1
  98. package/dist/src/intl/fa.js +20 -0
  99. package/dist/src/intl/fi.d.ts +24 -1
  100. package/dist/src/intl/fi.d.ts.map +1 -1
  101. package/dist/src/intl/fi.js +20 -0
  102. package/dist/src/intl/fil.d.ts +24 -1
  103. package/dist/src/intl/fil.d.ts.map +1 -1
  104. package/dist/src/intl/fil.js +20 -0
  105. package/dist/src/intl/fr.d.ts +24 -1
  106. package/dist/src/intl/fr.d.ts.map +1 -1
  107. package/dist/src/intl/fr.js +20 -0
  108. package/dist/src/intl/he.d.ts +24 -1
  109. package/dist/src/intl/he.d.ts.map +1 -1
  110. package/dist/src/intl/he.js +20 -0
  111. package/dist/src/intl/hi.d.ts +24 -1
  112. package/dist/src/intl/hi.d.ts.map +1 -1
  113. package/dist/src/intl/hi.js +20 -0
  114. package/dist/src/intl/hr.d.ts +24 -1
  115. package/dist/src/intl/hr.d.ts.map +1 -1
  116. package/dist/src/intl/hr.js +20 -0
  117. package/dist/src/intl/hu.d.ts +22 -1
  118. package/dist/src/intl/hu.d.ts.map +1 -1
  119. package/dist/src/intl/hu.js +18 -0
  120. package/dist/src/intl/id.d.ts +24 -1
  121. package/dist/src/intl/id.d.ts.map +1 -1
  122. package/dist/src/intl/id.js +20 -0
  123. package/dist/src/intl/it.d.ts +24 -1
  124. package/dist/src/intl/it.d.ts.map +1 -1
  125. package/dist/src/intl/it.js +20 -0
  126. package/dist/src/intl/ja.d.ts +24 -1
  127. package/dist/src/intl/ja.d.ts.map +1 -1
  128. package/dist/src/intl/ja.js +20 -0
  129. package/dist/src/intl/ko.d.ts +24 -1
  130. package/dist/src/intl/ko.d.ts.map +1 -1
  131. package/dist/src/intl/ko.js +20 -0
  132. package/dist/src/intl/ml.d.ts +24 -1
  133. package/dist/src/intl/ml.d.ts.map +1 -1
  134. package/dist/src/intl/ml.js +20 -0
  135. package/dist/src/intl/mr.d.ts +24 -1
  136. package/dist/src/intl/mr.d.ts.map +1 -1
  137. package/dist/src/intl/mr.js +20 -0
  138. package/dist/src/intl/ms.d.ts +24 -1
  139. package/dist/src/intl/ms.d.ts.map +1 -1
  140. package/dist/src/intl/ms.js +20 -0
  141. package/dist/src/intl/nb.d.ts +22 -1
  142. package/dist/src/intl/nb.d.ts.map +1 -1
  143. package/dist/src/intl/nb.js +18 -0
  144. package/dist/src/intl/nl.d.ts +24 -1
  145. package/dist/src/intl/nl.d.ts.map +1 -1
  146. package/dist/src/intl/nl.js +20 -0
  147. package/dist/src/intl/pa.d.ts +24 -1
  148. package/dist/src/intl/pa.d.ts.map +1 -1
  149. package/dist/src/intl/pa.js +20 -0
  150. package/dist/src/intl/pl.d.ts +23 -0
  151. package/dist/src/intl/pl.d.ts.map +1 -1
  152. package/dist/src/intl/pl.js +20 -0
  153. package/dist/src/intl/pt-BR.d.ts +24 -1
  154. package/dist/src/intl/pt-BR.d.ts.map +1 -1
  155. package/dist/src/intl/pt-BR.js +20 -0
  156. package/dist/src/intl/pt.d.ts +24 -1
  157. package/dist/src/intl/pt.d.ts.map +1 -1
  158. package/dist/src/intl/pt.js +20 -0
  159. package/dist/src/intl/ro.d.ts +24 -1
  160. package/dist/src/intl/ro.d.ts.map +1 -1
  161. package/dist/src/intl/ro.js +20 -0
  162. package/dist/src/intl/sk.d.ts +24 -1
  163. package/dist/src/intl/sk.d.ts.map +1 -1
  164. package/dist/src/intl/sk.js +20 -0
  165. package/dist/src/intl/sl.d.ts +24 -1
  166. package/dist/src/intl/sl.d.ts.map +1 -1
  167. package/dist/src/intl/sl.js +20 -0
  168. package/dist/src/intl/sv.d.ts +24 -1
  169. package/dist/src/intl/sv.d.ts.map +1 -1
  170. package/dist/src/intl/sv.js +20 -0
  171. package/dist/src/intl/sw.d.ts +21 -0
  172. package/dist/src/intl/sw.d.ts.map +1 -1
  173. package/dist/src/intl/sw.js +18 -0
  174. package/dist/src/intl/ta.d.ts +24 -1
  175. package/dist/src/intl/ta.d.ts.map +1 -1
  176. package/dist/src/intl/ta.js +20 -0
  177. package/dist/src/intl/te.d.ts +24 -1
  178. package/dist/src/intl/te.d.ts.map +1 -1
  179. package/dist/src/intl/te.js +20 -0
  180. package/dist/src/intl/th.d.ts +24 -1
  181. package/dist/src/intl/th.d.ts.map +1 -1
  182. package/dist/src/intl/th.js +20 -0
  183. package/dist/src/intl/tr.d.ts +24 -1
  184. package/dist/src/intl/tr.d.ts.map +1 -1
  185. package/dist/src/intl/tr.js +20 -0
  186. package/dist/src/intl/uk.d.ts +80 -57
  187. package/dist/src/intl/uk.d.ts.map +1 -1
  188. package/dist/src/intl/uk.js +174 -149
  189. package/dist/src/intl/ur.d.ts +24 -1
  190. package/dist/src/intl/ur.d.ts.map +1 -1
  191. package/dist/src/intl/ur.js +20 -0
  192. package/dist/src/intl/vi.d.ts +24 -1
  193. package/dist/src/intl/vi.d.ts.map +1 -1
  194. package/dist/src/intl/vi.js +20 -0
  195. package/dist/src/intl/zh-CN.d.ts +24 -1
  196. package/dist/src/intl/zh-CN.d.ts.map +1 -1
  197. package/dist/src/intl/zh-CN.js +20 -0
  198. package/dist/src/intl/zh-TW.d.ts +24 -1
  199. package/dist/src/intl/zh-TW.d.ts.map +1 -1
  200. package/dist/src/intl/zh-TW.js +20 -0
  201. package/dist/src/local-first/Db.d.ts +52 -3
  202. package/dist/src/local-first/Db.d.ts.map +1 -1
  203. package/dist/src/local-first/Db.js +412 -137
  204. package/dist/src/local-first/Evolu.d.ts +336 -211
  205. package/dist/src/local-first/Evolu.d.ts.map +1 -1
  206. package/dist/src/local-first/Evolu.js +102 -15
  207. package/dist/src/local-first/Owner.d.ts +13 -30
  208. package/dist/src/local-first/Owner.d.ts.map +1 -1
  209. package/dist/src/local-first/Owner.js +13 -30
  210. package/dist/src/local-first/Protocol.d.ts +95 -17
  211. package/dist/src/local-first/Protocol.d.ts.map +1 -1
  212. package/dist/src/local-first/Protocol.js +119 -39
  213. package/dist/src/local-first/Query.d.ts +8 -15
  214. package/dist/src/local-first/Query.d.ts.map +1 -1
  215. package/dist/src/local-first/Schema.d.ts +345 -21
  216. package/dist/src/local-first/Schema.d.ts.map +1 -1
  217. package/dist/src/local-first/Schema.js +214 -17
  218. package/dist/src/local-first/Shared.d.ts +537 -22
  219. package/dist/src/local-first/Shared.d.ts.map +1 -1
  220. package/dist/src/local-first/Shared.js +1437 -234
  221. package/dist/src/local-first/Storage.d.ts +192 -14
  222. package/dist/src/local-first/Storage.d.ts.map +1 -1
  223. package/dist/src/local-first/Storage.js +82 -21
  224. package/dist/src/local-first/Timestamp.d.ts +392 -41
  225. package/dist/src/local-first/Timestamp.d.ts.map +1 -1
  226. package/dist/src/local-first/Timestamp.js +404 -82
  227. package/dist/src/local-first/index.d.ts +0 -1
  228. package/dist/src/local-first/index.d.ts.map +1 -1
  229. package/dist/src/local-first/index.js +0 -1
  230. package/package.json +1 -1
  231. package/src/Assert.test.ts +2 -5
  232. package/src/{Binary.test.ts → Bytes.test.ts} +286 -1
  233. package/src/{Binary.ts → Bytes.ts} +652 -21
  234. package/src/Config.test.ts +668 -0
  235. package/src/Config.ts +410 -0
  236. package/src/Console.ts +62 -7
  237. package/src/Crypto.ts +76 -4
  238. package/src/Eq.test.ts +2 -3
  239. package/src/Error.test.ts +76 -3
  240. package/src/Error.ts +71 -0
  241. package/src/Fs.test.ts +105 -0
  242. package/src/Fs.ts +488 -0
  243. package/src/Identicon.ts +2 -2
  244. package/src/LeakDetector.ts +22 -3
  245. package/src/LockManager.ts +8 -0
  246. package/src/Number.test.ts +82 -18
  247. package/src/Number.ts +76 -8
  248. package/src/Object.test.ts +139 -10
  249. package/src/Object.ts +49 -0
  250. package/src/Platform.ts +50 -8
  251. package/src/Random.ts +25 -2
  252. package/src/Resource.test.ts +837 -0
  253. package/src/Resource.ts +235 -15
  254. package/src/Schedule.test.ts +50 -12
  255. package/src/Schedule.ts +24 -14
  256. package/src/Sqlite.ts +138 -18
  257. package/src/Task.test.ts +189 -8
  258. package/src/Task.ts +56 -17
  259. package/src/Test.ts +9 -0
  260. package/src/Time.test.ts +82 -11
  261. package/src/Time.ts +246 -24
  262. package/src/Type.test.ts +3994 -1119
  263. package/src/Type.ts +7258 -3842
  264. package/src/Types.test.ts +4 -14
  265. package/src/WebSocket.ts +313 -40
  266. package/src/Worker.ts +90 -8
  267. package/src/index.ts +18 -7
  268. package/src/intl/_en.ts +70 -0
  269. package/src/intl/ar.ts +71 -0
  270. package/src/intl/bn.ts +70 -0
  271. package/src/intl/ca.ts +70 -0
  272. package/src/intl/cs.ts +70 -0
  273. package/src/intl/da.ts +70 -0
  274. package/src/intl/de.ts +70 -0
  275. package/src/intl/el.ts +70 -0
  276. package/src/intl/es.ts +70 -0
  277. package/src/intl/fa.ts +70 -0
  278. package/src/intl/fi.ts +70 -0
  279. package/src/intl/fil.ts +70 -0
  280. package/src/intl/fr.ts +70 -0
  281. package/src/intl/he.ts +70 -0
  282. package/src/intl/hi.ts +70 -0
  283. package/src/intl/hr.ts +70 -0
  284. package/src/intl/hu.ts +69 -0
  285. package/src/intl/id.ts +70 -0
  286. package/src/intl/intl.test.ts +819 -1
  287. package/src/intl/it.ts +70 -0
  288. package/src/intl/ja.ts +70 -0
  289. package/src/intl/ko.ts +68 -0
  290. package/src/intl/ml.ts +70 -0
  291. package/src/intl/mr.ts +70 -0
  292. package/src/intl/ms.ts +71 -0
  293. package/src/intl/nb.ts +69 -0
  294. package/src/intl/nl.ts +70 -0
  295. package/src/intl/pa.ts +70 -0
  296. package/src/intl/pl.ts +63 -0
  297. package/src/intl/pt-BR.ts +70 -0
  298. package/src/intl/pt.ts +71 -0
  299. package/src/intl/ro.ts +70 -0
  300. package/src/intl/sk.ts +71 -0
  301. package/src/intl/sl.ts +70 -0
  302. package/src/intl/sv.ts +70 -0
  303. package/src/intl/sw.ts +62 -0
  304. package/src/intl/ta.ts +70 -0
  305. package/src/intl/te.ts +70 -0
  306. package/src/intl/th.ts +68 -0
  307. package/src/intl/tr.ts +70 -0
  308. package/src/intl/uk.ts +228 -155
  309. package/src/intl/ur.ts +70 -0
  310. package/src/intl/vi.ts +70 -0
  311. package/src/intl/zh-CN.ts +68 -0
  312. package/src/intl/zh-TW.ts +68 -0
  313. package/src/local-first/Db.ts +644 -339
  314. package/src/local-first/Evolu.test.ts +686 -21
  315. package/src/local-first/Evolu.ts +450 -228
  316. package/src/local-first/Owner.ts +13 -30
  317. package/src/local-first/Protocol.test.ts +618 -11
  318. package/src/local-first/Protocol.ts +197 -73
  319. package/src/local-first/Query.ts +8 -15
  320. package/src/local-first/Schema.test.ts +143 -0
  321. package/src/local-first/Schema.ts +374 -24
  322. package/src/local-first/Shared.test.ts +7731 -559
  323. package/src/local-first/Shared.ts +2036 -267
  324. package/src/local-first/Storage.ts +219 -33
  325. package/src/local-first/Timestamp.test.ts +344 -70
  326. package/src/local-first/Timestamp.ts +435 -119
  327. package/src/local-first/index.ts +0 -1
  328. package/dist/src/Binary.d.ts +0 -254
  329. package/dist/src/Binary.d.ts.map +0 -1
  330. package/dist/src/local-first/Error.d.ts +0 -12
  331. package/dist/src/local-first/Error.d.ts.map +0 -1
  332. package/dist/src/local-first/Error.js +0 -6
  333. package/dist/src/local-first/LocalAuth.d.ts +0 -150
  334. package/dist/src/local-first/LocalAuth.d.ts.map +0 -1
  335. package/dist/src/local-first/LocalAuth.js +0 -179
  336. package/src/local-first/Error.ts +0 -17
  337. package/src/local-first/LocalAuth.ts +0 -457
package/dist/src/Time.js CHANGED
@@ -1,11 +1,21 @@
1
1
  /**
2
2
  * Time representations, durations, and scheduling utilities.
3
3
  *
4
+ * Durations follow a pattern that other quantities in Evolu repeat, such as
5
+ * sizes in Bytes.ts:
6
+ *
7
+ * - {@link Millis} is the canonical unit, a validated number of milliseconds.
8
+ * - {@link DurationLiteral} is the human-readable form, such as `"1.5s"`,
9
+ * validated at compile time and runtime.
10
+ * - {@link Duration} is what APIs accept: `DurationLiteral | Millis`.
11
+ * - {@link durationToMillis} normalizes a `Duration` to `Millis`.
12
+ *
4
13
  * @module
5
14
  */
15
+ import { safelyStringifyUnknownValue } from "./String.js";
6
16
  import { assert } from "./Assert.js";
7
17
  import { exhaustiveCheck } from "./Function.js";
8
- import { brand, Digit, Digit1To23, Digit1To51, Digit1To59, Digit1To6, Digit1To9, Digit1To99, lessThan, NonNegativeInt, positive, templateLiteral, union, } from "./Type.js";
18
+ import { brand, createTypeWithError, Digit, Digit1To23, Digit1To51, Digit1To59, Digit1To6, Digit1To9, Digit1To99, lessThan, NonNegativeInt, positive, templateLiteral, union, } from "./Type.js";
9
19
  /**
10
20
  * Creates a {@link Time} using `Date.now()`, `performance`, and
11
21
  * `globalThis.setTimeout`.
@@ -17,6 +27,8 @@ import { brand, Digit, Digit1To23, Digit1To51, Digit1To59, Digit1To6, Digit1To9,
17
27
  *
18
28
  * Throws if the system clock returns an out-of-range value. This is intentional
19
29
  * — there's no reasonable fallback for a misconfigured clock.
30
+ *
31
+ * @group Core
20
32
  */
21
33
  export const createTime = () => {
22
34
  const timeoutOwner = Symbol("Time");
@@ -96,6 +108,8 @@ const clearTimeoutId = (owner, id) => {
96
108
  * wall-clock or performance `now()` call. `"microtask"` increments after the
97
109
  * current turn, while `"sync"` increments immediately after each read. Omit it
98
110
  * to keep time fixed until `advance()` is called.
111
+ *
112
+ * @group Testing
99
113
  */
100
114
  export const testCreateTime = (options) => {
101
115
  const startAt = options?.startAt ?? minMillis;
@@ -190,18 +204,34 @@ const maxMillisWithInfinity = 281474976710655;
190
204
  *
191
205
  * If a system clock exceeds this range, operations will throw. This is
192
206
  * intentional — there's no reasonable fallback for a misconfigured clock.
207
+ *
208
+ * @group Millis
193
209
  */
194
210
  export const Millis = /*#__PURE__*/ brand("Millis",
195
211
  /*#__PURE__*/ lessThan(maxMillisWithInfinity)(NonNegativeInt));
196
- /** Positive {@link Millis} value. */
212
+ /**
213
+ * Positive {@link Millis} value.
214
+ *
215
+ * @group Millis
216
+ */
197
217
  export const PositiveMillis = /*#__PURE__*/ positive(Millis);
198
- /** Minimum {@link Millis} value. */
218
+ /**
219
+ * Minimum {@link Millis} value.
220
+ *
221
+ * @group Millis
222
+ */
199
223
  export const minMillis = 0;
200
- /** Maximum {@link Millis} value. */
224
+ /**
225
+ * Maximum {@link Millis} value.
226
+ *
227
+ * @group Millis
228
+ */
201
229
  export const maxMillis = (maxMillisWithInfinity - 1);
202
230
  /**
203
231
  * Converts a number to {@link Millis}, rounding to the nearest millisecond and
204
232
  * saturating overflow at {@link maxMillis}.
233
+ *
234
+ * @group Millis
205
235
  */
206
236
  export const saturateMillis = (value) => Millis.orNull(Math.max(0, Math.round(value))) ?? maxMillis;
207
237
  /**
@@ -209,18 +239,28 @@ export const saturateMillis = (value) => Millis.orNull(Math.max(0, Math.round(va
209
239
  *
210
240
  * This is a safe cast because {@link Millis} guarantees a valid timestamp range
211
241
  * that always produces a valid ISO string.
242
+ *
243
+ * @group Millis
212
244
  */
213
245
  export const millisToDateIso = (value) => new Date(value).toISOString();
214
246
  /**
215
247
  * Returns the elapsed fractional milliseconds between two performance times.
216
248
  *
217
249
  * Throws if `end` precedes `start`.
250
+ *
251
+ * @group Performance
218
252
  */
219
253
  export const performanceDurationBetween = (start, end) => {
220
254
  assert(end >= start, "Performance end time must not precede start time");
221
255
  return (end - start);
222
256
  };
223
- /** Milliseconds duration: `"1ms"` to `"999ms"`. See {@link DurationLiteral}. */
257
+ // Keep these annotations concrete. Generic unit wrappers add thousands of
258
+ // compiler instantiations to pnpm bench:type.
259
+ /**
260
+ * Milliseconds duration: `"1ms"` to `"999ms"`. See {@link DurationLiteral}.
261
+ *
262
+ * @group Durations
263
+ */
224
264
  export const DurationLiteralMilliseconds = /*#__PURE__*/ union(
225
265
  /*#__PURE__*/ templateLiteral(Digit1To9, "ms"),
226
266
  /*#__PURE__*/ templateLiteral(Digit1To9, Digit, "ms"),
@@ -228,6 +268,8 @@ export const DurationLiteralMilliseconds = /*#__PURE__*/ union(
228
268
  /**
229
269
  * Seconds duration: `"1s"` to `"59s"` or `"1.1s"` to `"59.9s"`. See
230
270
  * {@link DurationLiteral}.
271
+ *
272
+ * @group Durations
231
273
  */
232
274
  export const DurationLiteralSeconds = /*#__PURE__*/ union(
233
275
  /*#__PURE__*/ templateLiteral(Digit1To59, "s"),
@@ -235,6 +277,8 @@ export const DurationLiteralSeconds = /*#__PURE__*/ union(
235
277
  /**
236
278
  * Minutes duration: `"1m"` to `"59m"` or `"1.1m"` to `"59.9m"`. See
237
279
  * {@link DurationLiteral}.
280
+ *
281
+ * @group Durations
238
282
  */
239
283
  export const DurationLiteralMinutes = /*#__PURE__*/ union(
240
284
  /*#__PURE__*/ templateLiteral(Digit1To59, "m"),
@@ -242,6 +286,8 @@ export const DurationLiteralMinutes = /*#__PURE__*/ union(
242
286
  /**
243
287
  * Hours duration: `"1h"` to `"23h"` or `"1.1h"` to `"23.9h"`. See
244
288
  * {@link DurationLiteral}.
289
+ *
290
+ * @group Durations
245
291
  */
246
292
  export const DurationLiteralHours = /*#__PURE__*/ union(
247
293
  /*#__PURE__*/ templateLiteral(Digit1To23, "h"),
@@ -249,6 +295,8 @@ export const DurationLiteralHours = /*#__PURE__*/ union(
249
295
  /**
250
296
  * Days duration: `"1d"` to `"6d"` or `"1.1d"` to `"6.9d"`. See
251
297
  * {@link DurationLiteral}.
298
+ *
299
+ * @group Durations
252
300
  */
253
301
  export const DurationLiteralDays = /*#__PURE__*/ union(
254
302
  /*#__PURE__*/ templateLiteral(Digit1To6, "d"),
@@ -256,6 +304,8 @@ export const DurationLiteralDays = /*#__PURE__*/ union(
256
304
  /**
257
305
  * Weeks duration: `"1w"` to `"51w"` or `"1.1w"` to `"51.9w"`. See
258
306
  * {@link DurationLiteral}.
307
+ *
308
+ * @group Durations
259
309
  */
260
310
  export const DurationLiteralWeeks = /*#__PURE__*/ union(
261
311
  /*#__PURE__*/ templateLiteral(Digit1To51, "w"),
@@ -263,10 +313,13 @@ export const DurationLiteralWeeks = /*#__PURE__*/ union(
263
313
  /**
264
314
  * Years duration: `"1y"` to `"99y"` or `"1.1y"` to `"99.9y"`. See
265
315
  * {@link DurationLiteral}.
316
+ *
317
+ * @group Durations
266
318
  */
267
319
  export const DurationLiteralYears = /*#__PURE__*/ union(
268
320
  /*#__PURE__*/ templateLiteral(Digit1To99, "y"),
269
321
  /*#__PURE__*/ templateLiteral(Digit1To99, ".", Digit1To9, "y"));
322
+ const durationLiteralSyntax = /*#__PURE__*/ union(DurationLiteralMilliseconds, DurationLiteralSeconds, DurationLiteralMinutes, DurationLiteralHours, DurationLiteralDays, DurationLiteralWeeks, DurationLiteralYears);
270
323
  /**
271
324
  * Duration literal Type with compile-time and runtime validation.
272
325
  *
@@ -294,8 +347,35 @@ export const DurationLiteralYears = /*#__PURE__*/ union(
294
347
  *
295
348
  * See {@link Duration} for a type that also accepts {@link Millis}. Use
296
349
  * {@link durationToMillis} to convert to milliseconds.
350
+ *
351
+ * Invalid values produce a {@link DurationLiteralError}.
352
+ *
353
+ * ### Example
354
+ *
355
+ * ```ts
356
+ * import {
357
+ * assertFalse,
358
+ * assertOk,
359
+ * assertType,
360
+ * DurationLiteral,
361
+ * } from "@evolu/common";
362
+ *
363
+ * // The TypeScript type accepts valid spellings and rejects the rest.
364
+ * const literal: DurationLiteral = "1.5s";
365
+ * assertType<Extract<DurationLiteral, "1000ms" | "60s" | "0s">, never>();
366
+ *
367
+ * // The runtime Type validates the same grammar.
368
+ * assertOk(DurationLiteral.fromUnknown(literal), "1.5s");
369
+ * assertFalse(DurationLiteral.is("1000ms"));
370
+ * ```
371
+ *
372
+ * @group Durations
297
373
  */
298
- export const DurationLiteral = /*#__PURE__*/ union(DurationLiteralMilliseconds, DurationLiteralSeconds, DurationLiteralMinutes, DurationLiteralHours, DurationLiteralDays, DurationLiteralWeeks, DurationLiteralYears);
374
+ export const DurationLiteral = /*#__PURE__*/ createTypeWithError("DurationLiteral", durationLiteralSyntax, (cause, value) => ({
375
+ type: "DurationLiteral",
376
+ value,
377
+ cause,
378
+ }), (error) => `The value ${safelyStringifyUnknownValue(error.value)} is not a duration literal. Use a value such as "500ms" or "1.5s".`);
299
379
  export function durationToMillis(duration) {
300
380
  if (typeof duration === "number")
301
381
  return duration;
@@ -319,12 +399,16 @@ const durationUnits = {
319
399
  * Frame budget at 60fps (16ms).
320
400
  *
321
401
  * Work exceeding this blocks a frame, causing visible jank in animations.
402
+ *
403
+ * @group Millis
322
404
  */
323
405
  export const ms60fps = 16;
324
406
  /**
325
407
  * Frame budget at 120fps (8ms).
326
408
  *
327
409
  * For high refresh rate displays. Work exceeding this blocks a frame.
410
+ *
411
+ * @group Millis
328
412
  */
329
413
  export const ms120fps = 8;
330
414
  /**
@@ -333,6 +417,7 @@ export const ms120fps = 8;
333
417
  * Tasks exceeding this are "long tasks" per web standards. Use with
334
418
  * {@link yieldNow} to yield periodically and keep UI responsive.
335
419
  *
420
+ * @group Millis
336
421
  * @see https://web.dev/articles/optimize-long-tasks
337
422
  */
338
423
  export const msLongTask = 50;
@@ -364,6 +449,8 @@ export const msLongTask = 50;
364
449
  * "1d1h1m1.000s",
365
450
  * );
366
451
  * ```
452
+ *
453
+ * @group Millis
367
454
  */
368
455
  export const formatMillisAsDuration = (millis) => {
369
456
  const seconds = ((millis % durationUnits.m) / durationUnits.s).toFixed(3);
@@ -403,6 +490,8 @@ export const formatMillisAsDuration = (millis) => {
403
490
  * "14:32:15.234",
404
491
  * );
405
492
  * ```
493
+ *
494
+ * @group Millis
406
495
  */
407
496
  export const formatMillisAsClockTime = (millis) => {
408
497
  const date = new Date(millis);