zeed 1.3.0 → 1.4.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 (575) hide show
  1. package/AGENTS.md +50 -211
  2. package/README.md +16 -0
  3. package/dist/_experiments/bitcask.cjs +243 -1
  4. package/dist/_experiments/bitcask.cjs.map +1 -1
  5. package/dist/_experiments/bitcask.mjs +230 -1
  6. package/dist/_experiments/bitcask.mjs.map +1 -1
  7. package/dist/bin-BAoS4qtm.mjs +593 -0
  8. package/dist/{bin-SPdenYkw.mjs.map → bin-BAoS4qtm.mjs.map} +1 -1
  9. package/dist/bin-Ddaz2lxM.cjs +862 -0
  10. package/dist/{bin-Ce3i6ABn.cjs.map → bin-Ddaz2lxM.cjs.map} +1 -1
  11. package/dist/browser/base64.cjs +14 -1
  12. package/dist/browser/base64.cjs.map +1 -1
  13. package/dist/browser/base64.mjs +12 -1
  14. package/dist/browser/base64.mjs.map +1 -1
  15. package/dist/browser/gravatar.cjs +186 -1
  16. package/dist/browser/gravatar.cjs.map +1 -1
  17. package/dist/browser/gravatar.mjs +184 -1
  18. package/dist/browser/gravatar.mjs.map +1 -1
  19. package/dist/browser/index.cjs +14 -1
  20. package/dist/browser/index.mjs +8 -1
  21. package/dist/browser/localstorage.cjs +46 -1
  22. package/dist/browser/localstorage.cjs.map +1 -1
  23. package/dist/browser/localstorage.mjs +45 -1
  24. package/dist/browser/localstorage.mjs.map +1 -1
  25. package/dist/browser/log/index.cjs +8 -1
  26. package/dist/browser/log/index.mjs +5 -1
  27. package/dist/browser/log/log-browser-factory.cjs +65 -1
  28. package/dist/browser/log/log-browser-factory.cjs.map +1 -1
  29. package/dist/browser/log/log-browser-factory.mjs +64 -1
  30. package/dist/browser/log/log-browser-factory.mjs.map +1 -1
  31. package/dist/browser/log/log-browser.cjs +72 -1
  32. package/dist/browser/log/log-browser.cjs.map +1 -1
  33. package/dist/browser/log/log-browser.mjs +71 -1
  34. package/dist/browser/log/log-browser.mjs.map +1 -1
  35. package/dist/browser/log/log-colors.cjs +11 -1
  36. package/dist/browser/log/log-colors.cjs.map +1 -1
  37. package/dist/browser/log/log-colors.mjs +9 -1
  38. package/dist/browser/log/log-colors.mjs.map +1 -1
  39. package/dist/browser/log/log-context-browser.cjs +25 -1
  40. package/dist/browser/log/log-context-browser.cjs.map +1 -1
  41. package/dist/browser/log/log-context-browser.mjs +23 -1
  42. package/dist/browser/log/log-context-browser.mjs.map +1 -1
  43. package/dist/chunk-DQk6qfdC.mjs +18 -0
  44. package/dist/chunk-uaV2rQ02.cjs +53 -0
  45. package/dist/common/assert.cjs +22 -1
  46. package/dist/common/assert.cjs.map +1 -1
  47. package/dist/common/assert.mjs +19 -1
  48. package/dist/common/assert.mjs.map +1 -1
  49. package/dist/common/bin/index.cjs +106 -1
  50. package/dist/common/bin/index.cjs.map +1 -1
  51. package/dist/common/bin/index.mjs +98 -1
  52. package/dist/common/bin/index.mjs.map +1 -1
  53. package/dist/common/bin/lib0/binary.cjs +146 -1
  54. package/dist/common/bin/lib0/binary.cjs.map +1 -1
  55. package/dist/common/bin/lib0/binary.mjs +80 -1
  56. package/dist/common/bin/lib0/binary.mjs.map +1 -1
  57. package/dist/common/bin/lib0/buffer.cjs +42 -1
  58. package/dist/common/bin/lib0/buffer.cjs.map +1 -1
  59. package/dist/common/bin/lib0/buffer.mjs +38 -1
  60. package/dist/common/bin/lib0/buffer.mjs.map +1 -1
  61. package/dist/common/bin/lib0/create.cjs +24 -1
  62. package/dist/common/bin/lib0/create.cjs.map +1 -1
  63. package/dist/common/bin/lib0/create.mjs +21 -1
  64. package/dist/common/bin/lib0/create.mjs.map +1 -1
  65. package/dist/common/bin/lib0/decoding.cjs +325 -1
  66. package/dist/common/bin/lib0/decoding.cjs.map +1 -1
  67. package/dist/common/bin/lib0/decoding.mjs +298 -1
  68. package/dist/common/bin/lib0/decoding.mjs.map +1 -1
  69. package/dist/common/bin/lib0/encoding.cjs +404 -1
  70. package/dist/common/bin/lib0/encoding.cjs.map +1 -1
  71. package/dist/common/bin/lib0/encoding.mjs +377 -1
  72. package/dist/common/bin/lib0/encoding.mjs.map +1 -1
  73. package/dist/common/bin/lib0/string.cjs +81 -1
  74. package/dist/common/bin/lib0/string.cjs.map +1 -1
  75. package/dist/common/bin/lib0/string.mjs +71 -1
  76. package/dist/common/bin/lib0/string.mjs.map +1 -1
  77. package/dist/common/crypto/aes-sealed.cjs +34 -1
  78. package/dist/common/crypto/aes-sealed.cjs.map +1 -1
  79. package/dist/common/crypto/aes-sealed.mjs +32 -1
  80. package/dist/common/crypto/aes-sealed.mjs.map +1 -1
  81. package/dist/common/crypto/crypto.cjs +91 -1
  82. package/dist/common/crypto/crypto.cjs.map +1 -1
  83. package/dist/common/crypto/crypto.mjs +80 -1
  84. package/dist/common/crypto/crypto.mjs.map +1 -1
  85. package/dist/common/crypto/index.cjs +23 -1
  86. package/dist/common/crypto/index.mjs +5 -1
  87. package/dist/common/crypto/xaes.cjs +128 -1
  88. package/dist/common/crypto/xaes.cjs.map +1 -1
  89. package/dist/common/crypto/xaes.mjs +123 -1
  90. package/dist/common/crypto/xaes.mjs.map +1 -1
  91. package/dist/common/csv.cjs +49 -4
  92. package/dist/common/csv.cjs.map +1 -1
  93. package/dist/common/csv.mjs +46 -4
  94. package/dist/common/csv.mjs.map +1 -1
  95. package/dist/common/data/array.cjs +299 -1
  96. package/dist/common/data/array.cjs.map +1 -1
  97. package/dist/common/data/array.mjs +274 -1
  98. package/dist/common/data/array.mjs.map +1 -1
  99. package/dist/common/data/basex-secure.cjs +30 -1
  100. package/dist/common/data/basex-secure.mjs +3 -1
  101. package/dist/common/data/basex.cjs +163 -1
  102. package/dist/common/data/basex.cjs.map +1 -1
  103. package/dist/common/data/basex.mjs +152 -1
  104. package/dist/common/data/basex.mjs.map +1 -1
  105. package/dist/common/data/bin-types.mjs +1 -1
  106. package/dist/common/data/bin.cjs +21 -1
  107. package/dist/common/data/bin.mjs +3 -1
  108. package/dist/common/data/camelcase.cjs +27 -1
  109. package/dist/common/data/camelcase.cjs.map +1 -1
  110. package/dist/common/data/camelcase.mjs +22 -1
  111. package/dist/common/data/camelcase.mjs.map +1 -1
  112. package/dist/common/data/convert.cjs +104 -1
  113. package/dist/common/data/convert.cjs.map +1 -1
  114. package/dist/common/data/convert.mjs +88 -1
  115. package/dist/common/data/convert.mjs.map +1 -1
  116. package/dist/common/data/datauri.cjs +32 -1
  117. package/dist/common/data/datauri.cjs.map +1 -1
  118. package/dist/common/data/datauri.mjs +27 -1
  119. package/dist/common/data/datauri.mjs.map +1 -1
  120. package/dist/common/data/day-legacy.cjs +148 -1
  121. package/dist/common/data/day-legacy.cjs.map +1 -1
  122. package/dist/common/data/day-legacy.mjs +143 -1
  123. package/dist/common/data/day-legacy.mjs.map +1 -1
  124. package/dist/common/data/day.cjs +335 -1
  125. package/dist/common/data/day.cjs.map +1 -1
  126. package/dist/common/data/day.mjs +305 -1
  127. package/dist/common/data/day.mjs.map +1 -1
  128. package/dist/common/data/decimal.cjs +28 -1
  129. package/dist/common/data/decimal.cjs.map +1 -1
  130. package/dist/common/data/decimal.mjs +23 -1
  131. package/dist/common/data/decimal.mjs.map +1 -1
  132. package/dist/common/data/deep.cjs +57 -1
  133. package/dist/common/data/deep.cjs.map +1 -1
  134. package/dist/common/data/deep.mjs +54 -1
  135. package/dist/common/data/deep.mjs.map +1 -1
  136. package/dist/common/data/diff.cjs +62 -1
  137. package/dist/common/data/diff.cjs.map +1 -1
  138. package/dist/common/data/diff.mjs +60 -1
  139. package/dist/common/data/diff.mjs.map +1 -1
  140. package/dist/common/data/distributed.cjs +24 -1
  141. package/dist/common/data/distributed.cjs.map +1 -1
  142. package/dist/common/data/distributed.mjs +22 -1
  143. package/dist/common/data/distributed.mjs.map +1 -1
  144. package/dist/common/data/format.cjs +63 -1
  145. package/dist/common/data/format.cjs.map +1 -1
  146. package/dist/common/data/format.mjs +59 -1
  147. package/dist/common/data/format.mjs.map +1 -1
  148. package/dist/common/data/html.cjs +13 -1
  149. package/dist/common/data/html.cjs.map +1 -1
  150. package/dist/common/data/html.mjs +10 -1
  151. package/dist/common/data/html.mjs.map +1 -1
  152. package/dist/common/data/index.cjs +296 -1
  153. package/dist/common/data/index.mjs +37 -1
  154. package/dist/common/data/is.cjs +106 -1
  155. package/dist/common/data/is.cjs.map +1 -1
  156. package/dist/common/data/is.mjs +85 -1
  157. package/dist/common/data/is.mjs.map +1 -1
  158. package/dist/common/data/json.cjs +70 -1
  159. package/dist/common/data/json.cjs.map +1 -1
  160. package/dist/common/data/json.mjs +65 -1
  161. package/dist/common/data/json.mjs.map +1 -1
  162. package/dist/common/data/list.cjs +32 -1
  163. package/dist/common/data/list.cjs.map +1 -1
  164. package/dist/common/data/list.mjs +27 -1
  165. package/dist/common/data/list.mjs.map +1 -1
  166. package/dist/common/data/lru.mjs +1 -1
  167. package/dist/common/data/math.cjs +79 -1
  168. package/dist/common/data/math.cjs.map +1 -1
  169. package/dist/common/data/math.mjs +65 -1
  170. package/dist/common/data/math.mjs.map +1 -1
  171. package/dist/common/data/message.cjs +30 -1
  172. package/dist/common/data/message.cjs.map +1 -1
  173. package/dist/common/data/message.mjs +28 -1
  174. package/dist/common/data/message.mjs.map +1 -1
  175. package/dist/common/data/object-changes.cjs +66 -1
  176. package/dist/common/data/object-changes.cjs.map +1 -1
  177. package/dist/common/data/object-changes.mjs +63 -1
  178. package/dist/common/data/object-changes.mjs.map +1 -1
  179. package/dist/common/data/object.cjs +112 -1
  180. package/dist/common/data/object.cjs.map +1 -1
  181. package/dist/common/data/object.mjs +104 -1
  182. package/dist/common/data/object.mjs.map +1 -1
  183. package/dist/common/data/orderby.cjs +42 -1
  184. package/dist/common/data/orderby.cjs.map +1 -1
  185. package/dist/common/data/orderby.mjs +37 -1
  186. package/dist/common/data/orderby.mjs.map +1 -1
  187. package/dist/common/data/path.cjs +26 -1
  188. package/dist/common/data/path.cjs.map +1 -1
  189. package/dist/common/data/path.mjs +25 -1
  190. package/dist/common/data/path.mjs.map +1 -1
  191. package/dist/common/data/regexp.cjs +12 -1
  192. package/dist/common/data/regexp.cjs.map +1 -1
  193. package/dist/common/data/regexp.mjs +10 -1
  194. package/dist/common/data/regexp.mjs.map +1 -1
  195. package/dist/common/data/rounding.cjs +107 -1
  196. package/dist/common/data/rounding.cjs.map +1 -1
  197. package/dist/common/data/rounding.mjs +95 -1
  198. package/dist/common/data/rounding.mjs.map +1 -1
  199. package/dist/common/data/signal.cjs +39 -1
  200. package/dist/common/data/signal.cjs.map +1 -1
  201. package/dist/common/data/signal.mjs +38 -1
  202. package/dist/common/data/signal.mjs.map +1 -1
  203. package/dist/common/data/sortable.cjs +35 -1
  204. package/dist/common/data/sortable.cjs.map +1 -1
  205. package/dist/common/data/sortable.mjs +31 -1
  206. package/dist/common/data/sortable.mjs.map +1 -1
  207. package/dist/common/data/sorted.cjs +54 -1
  208. package/dist/common/data/sorted.cjs.map +1 -1
  209. package/dist/common/data/sorted.mjs +53 -1
  210. package/dist/common/data/sorted.mjs.map +1 -1
  211. package/dist/common/data/string-deburr.cjs +240 -1
  212. package/dist/common/data/string-deburr.cjs.map +1 -1
  213. package/dist/common/data/string-deburr.mjs +238 -1
  214. package/dist/common/data/string-deburr.mjs.map +1 -1
  215. package/dist/common/data/string-hash-fnv.cjs +69 -1
  216. package/dist/common/data/string-hash-fnv.cjs.map +1 -1
  217. package/dist/common/data/string-hash-fnv.mjs +67 -1
  218. package/dist/common/data/string-hash-fnv.mjs.map +1 -1
  219. package/dist/common/data/string-hash-pool.cjs +28 -1
  220. package/dist/common/data/string-hash-pool.cjs.map +1 -1
  221. package/dist/common/data/string-hash-pool.mjs +27 -1
  222. package/dist/common/data/string-hash-pool.mjs.map +1 -1
  223. package/dist/common/data/url.cjs +98 -2
  224. package/dist/common/data/url.cjs.map +1 -1
  225. package/dist/common/data/url.mjs +91 -2
  226. package/dist/common/data/url.mjs.map +1 -1
  227. package/dist/common/data/utils.cjs +118 -1
  228. package/dist/common/data/utils.cjs.map +1 -1
  229. package/dist/common/data/utils.mjs +107 -1
  230. package/dist/common/data/utils.mjs.map +1 -1
  231. package/dist/common/data/wordlist.cjs +531 -1
  232. package/dist/common/data/wordlist.cjs.map +1 -1
  233. package/dist/common/data/wordlist.mjs +529 -1
  234. package/dist/common/data/wordlist.mjs.map +1 -1
  235. package/dist/common/data/xrx.cjs +96 -1
  236. package/dist/common/data/xrx.cjs.map +1 -1
  237. package/dist/common/data/xrx.mjs +92 -1
  238. package/dist/common/data/xrx.mjs.map +1 -1
  239. package/dist/common/dispose-defer.cjs +133 -1
  240. package/dist/common/dispose-defer.cjs.map +1 -1
  241. package/dist/common/dispose-defer.mjs +130 -1
  242. package/dist/common/dispose-defer.mjs.map +1 -1
  243. package/dist/common/dispose-types.mjs +1 -1
  244. package/dist/common/dispose-utils.cjs +113 -1
  245. package/dist/common/dispose-utils.cjs.map +1 -1
  246. package/dist/common/dispose-utils.mjs +106 -1
  247. package/dist/common/dispose-utils.mjs.map +1 -1
  248. package/dist/common/exec/index.cjs +24 -1
  249. package/dist/common/exec/index.d.cts +1 -1
  250. package/dist/common/exec/index.d.mts +1 -1
  251. package/dist/common/exec/index.mjs +8 -1
  252. package/dist/common/exec/mutex.cjs +44 -1
  253. package/dist/common/exec/mutex.cjs.map +1 -1
  254. package/dist/common/exec/mutex.mjs +42 -1
  255. package/dist/common/exec/mutex.mjs.map +1 -1
  256. package/dist/common/exec/pool.cjs +181 -1
  257. package/dist/common/exec/pool.cjs.map +1 -1
  258. package/dist/common/exec/pool.d.cts +1 -1
  259. package/dist/common/exec/pool.d.mts +1 -1
  260. package/dist/common/exec/pool.mjs +180 -1
  261. package/dist/common/exec/pool.mjs.map +1 -1
  262. package/dist/common/exec/progress.cjs +149 -1
  263. package/dist/common/exec/progress.cjs.map +1 -1
  264. package/dist/common/exec/progress.d.cts +1 -1
  265. package/dist/common/exec/progress.d.mts +1 -1
  266. package/dist/common/exec/progress.mjs +148 -1
  267. package/dist/common/exec/progress.mjs.map +1 -1
  268. package/dist/common/exec/promise.cjs +113 -1
  269. package/dist/common/exec/promise.cjs.map +1 -1
  270. package/dist/common/exec/promise.mjs +103 -1
  271. package/dist/common/exec/promise.mjs.map +1 -1
  272. package/dist/common/exec/queue.cjs +125 -1
  273. package/dist/common/exec/queue.cjs.map +1 -1
  274. package/dist/common/exec/queue.d.cts +1 -1
  275. package/dist/common/exec/queue.d.mts +1 -1
  276. package/dist/common/exec/queue.mjs +124 -1
  277. package/dist/common/exec/queue.mjs.map +1 -1
  278. package/dist/common/exec/throttle-debounce.cjs +114 -1
  279. package/dist/common/exec/throttle-debounce.cjs.map +1 -1
  280. package/dist/common/exec/throttle-debounce.mjs +112 -1
  281. package/dist/common/exec/throttle-debounce.mjs.map +1 -1
  282. package/dist/common/global.cjs +22 -1
  283. package/dist/common/global.cjs.map +1 -1
  284. package/dist/common/global.mjs +19 -1
  285. package/dist/common/global.mjs.map +1 -1
  286. package/dist/common/index.cjs +559 -1
  287. package/dist/common/index.d.cts +1 -1
  288. package/dist/common/index.d.mts +1 -1
  289. package/dist/common/index.mjs +89 -1
  290. package/dist/common/localhost.cjs +16 -1
  291. package/dist/common/localhost.cjs.map +1 -1
  292. package/dist/common/localhost.mjs +14 -1
  293. package/dist/common/localhost.mjs.map +1 -1
  294. package/dist/common/log/index.cjs +34 -1
  295. package/dist/common/log/index.mjs +11 -1
  296. package/dist/common/log/log-base.cjs +40 -1
  297. package/dist/common/log/log-base.cjs.map +1 -1
  298. package/dist/common/log/log-base.mjs +31 -1
  299. package/dist/common/log/log-base.mjs.map +1 -1
  300. package/dist/common/log/log-colors.cjs +92 -1
  301. package/dist/common/log/log-colors.cjs.map +1 -1
  302. package/dist/common/log/log-colors.mjs +90 -1
  303. package/dist/common/log/log-colors.mjs.map +1 -1
  304. package/dist/common/log/log-config.cjs +15 -1
  305. package/dist/common/log/log-config.cjs.map +1 -1
  306. package/dist/common/log/log-config.mjs +14 -1
  307. package/dist/common/log/log-config.mjs.map +1 -1
  308. package/dist/common/log/log-console-capture.cjs +33 -1
  309. package/dist/common/log/log-console-capture.cjs.map +1 -1
  310. package/dist/common/log/log-console-capture.mjs +32 -1
  311. package/dist/common/log/log-console-capture.mjs.map +1 -1
  312. package/dist/common/log/log-console-original.cjs +27 -1
  313. package/dist/common/log/log-console-original.cjs.map +1 -1
  314. package/dist/common/log/log-console-original.mjs +26 -1
  315. package/dist/common/log/log-console-original.mjs.map +1 -1
  316. package/dist/common/log/log-console.cjs +39 -1
  317. package/dist/common/log/log-console.cjs.map +1 -1
  318. package/dist/common/log/log-console.mjs +38 -1
  319. package/dist/common/log/log-console.mjs.map +1 -1
  320. package/dist/common/log/log-context.cjs +109 -1
  321. package/dist/common/log/log-context.cjs.map +1 -1
  322. package/dist/common/log/log-context.mjs +108 -1
  323. package/dist/common/log/log-context.mjs.map +1 -1
  324. package/dist/common/log/log-filter.cjs +80 -1
  325. package/dist/common/log/log-filter.cjs.map +1 -1
  326. package/dist/common/log/log-filter.mjs +75 -1
  327. package/dist/common/log/log-filter.mjs.map +1 -1
  328. package/dist/common/log/log-memory.cjs +45 -1
  329. package/dist/common/log/log-memory.cjs.map +1 -1
  330. package/dist/common/log/log-memory.mjs +43 -1
  331. package/dist/common/log/log-memory.mjs.map +1 -1
  332. package/dist/common/log/log-noop.cjs +17 -1
  333. package/dist/common/log/log-noop.cjs.map +1 -1
  334. package/dist/common/log/log-noop.mjs +15 -1
  335. package/dist/common/log/log-noop.mjs.map +1 -1
  336. package/dist/common/log/log.cjs +46 -1
  337. package/dist/common/log/log.cjs.map +1 -1
  338. package/dist/common/log/log.mjs +43 -1
  339. package/dist/common/log/log.mjs.map +1 -1
  340. package/dist/common/msg/channel-debug.cjs +17 -1
  341. package/dist/common/msg/channel-debug.cjs.map +1 -1
  342. package/dist/common/msg/channel-debug.d.cts +1 -1
  343. package/dist/common/msg/channel-debug.d.mts +1 -1
  344. package/dist/common/msg/channel-debug.mjs +16 -1
  345. package/dist/common/msg/channel-debug.mjs.map +1 -1
  346. package/dist/common/msg/channel-local.cjs +28 -1
  347. package/dist/common/msg/channel-local.cjs.map +1 -1
  348. package/dist/common/msg/channel-local.d.cts +1 -1
  349. package/dist/common/msg/channel-local.d.mts +1 -1
  350. package/dist/common/msg/channel-local.mjs +26 -1
  351. package/dist/common/msg/channel-local.mjs.map +1 -1
  352. package/dist/common/msg/channel-resilient.cjs +63 -1
  353. package/dist/common/msg/channel-resilient.cjs.map +1 -1
  354. package/dist/common/msg/channel-resilient.d.cts +1 -1
  355. package/dist/common/msg/channel-resilient.d.mts +1 -1
  356. package/dist/common/msg/channel-resilient.mjs +62 -1
  357. package/dist/common/msg/channel-resilient.mjs.map +1 -1
  358. package/dist/common/msg/channel-wkwebview.cjs +35 -1
  359. package/dist/common/msg/channel-wkwebview.cjs.map +1 -1
  360. package/dist/common/msg/channel-wkwebview.d.cts +2 -1
  361. package/dist/common/msg/channel-wkwebview.d.mts +2 -1
  362. package/dist/common/msg/channel-wkwebview.mjs +34 -1
  363. package/dist/common/msg/channel-wkwebview.mjs.map +1 -1
  364. package/dist/common/msg/channel.cjs +23 -1
  365. package/dist/common/msg/channel.cjs.map +1 -1
  366. package/dist/common/msg/channel.d.cts +1 -1
  367. package/dist/common/msg/channel.d.mts +1 -1
  368. package/dist/common/msg/channel.mjs +22 -1
  369. package/dist/common/msg/channel.mjs.map +1 -1
  370. package/dist/common/msg/emitter.cjs +141 -1
  371. package/dist/common/msg/emitter.cjs.map +1 -1
  372. package/dist/common/msg/emitter.d.cts +1 -1
  373. package/dist/common/msg/emitter.d.mts +1 -1
  374. package/dist/common/msg/emitter.mjs +139 -1
  375. package/dist/common/msg/emitter.mjs.map +1 -1
  376. package/dist/common/msg/encoder.cjs +38 -1
  377. package/dist/common/msg/encoder.cjs.map +1 -1
  378. package/dist/common/msg/encoder.mjs +35 -1
  379. package/dist/common/msg/encoder.mjs.map +1 -1
  380. package/dist/common/msg/index.cjs +28 -1
  381. package/dist/common/msg/index.d.cts +1 -1
  382. package/dist/common/msg/index.d.mts +1 -1
  383. package/dist/common/msg/index.mjs +11 -1
  384. package/dist/common/msg/messages.cjs +135 -1
  385. package/dist/common/msg/messages.cjs.map +1 -1
  386. package/dist/common/msg/messages.d.cts +1 -1
  387. package/dist/common/msg/messages.d.mts +1 -1
  388. package/dist/common/msg/messages.mjs +133 -1
  389. package/dist/common/msg/messages.mjs.map +1 -1
  390. package/dist/common/msg/pipe.mjs +1 -1
  391. package/dist/common/msg/pubsub.cjs +78 -1
  392. package/dist/common/msg/pubsub.cjs.map +1 -1
  393. package/dist/common/msg/pubsub.d.cts +1 -1
  394. package/dist/common/msg/pubsub.d.mts +1 -1
  395. package/dist/common/msg/pubsub.mjs +76 -1
  396. package/dist/common/msg/pubsub.mjs.map +1 -1
  397. package/dist/common/msg/rpc.cjs +142 -1
  398. package/dist/common/msg/rpc.cjs.map +1 -1
  399. package/dist/common/msg/rpc.mjs +139 -1
  400. package/dist/common/msg/rpc.mjs.map +1 -1
  401. package/dist/common/network.cjs +129 -1
  402. package/dist/common/network.cjs.map +1 -1
  403. package/dist/common/network.mjs +122 -1
  404. package/dist/common/network.mjs.map +1 -1
  405. package/dist/common/platform.cjs +92 -1
  406. package/dist/common/platform.cjs.map +1 -1
  407. package/dist/common/platform.mjs +84 -1
  408. package/dist/common/platform.mjs.map +1 -1
  409. package/dist/common/schema/_sandbox/sandbox-inherit.mjs +1 -1
  410. package/dist/common/schema/_sandbox/sandbox.mjs +1 -1
  411. package/dist/common/schema/_sandbox/sandbox.xspec.mjs +1 -1
  412. package/dist/common/schema/export-json-schema.cjs +54 -1
  413. package/dist/common/schema/export-json-schema.cjs.map +1 -1
  414. package/dist/common/schema/export-json-schema.mjs +52 -1
  415. package/dist/common/schema/export-json-schema.mjs.map +1 -1
  416. package/dist/common/schema/export-swift.cjs +30 -2
  417. package/dist/common/schema/export-swift.cjs.map +1 -1
  418. package/dist/common/schema/export-swift.mjs +29 -2
  419. package/dist/common/schema/export-swift.mjs.map +1 -1
  420. package/dist/common/schema/export-typescript.cjs +20 -2
  421. package/dist/common/schema/export-typescript.cjs.map +1 -1
  422. package/dist/common/schema/export-typescript.mjs +19 -2
  423. package/dist/common/schema/export-typescript.mjs.map +1 -1
  424. package/dist/common/schema/index.cjs +55 -1
  425. package/dist/common/schema/index.mjs +12 -1
  426. package/dist/common/schema/parse-args.cjs +62 -2
  427. package/dist/common/schema/parse-args.cjs.map +1 -1
  428. package/dist/common/schema/parse-args.mjs +60 -2
  429. package/dist/common/schema/parse-args.mjs.map +1 -1
  430. package/dist/common/schema/parse-env.cjs +48 -3
  431. package/dist/common/schema/parse-env.cjs.map +1 -1
  432. package/dist/common/schema/parse-env.mjs +46 -3
  433. package/dist/common/schema/parse-env.mjs.map +1 -1
  434. package/dist/common/schema/parse-object.cjs +122 -1
  435. package/dist/common/schema/parse-object.cjs.map +1 -1
  436. package/dist/common/schema/parse-object.mjs +119 -1
  437. package/dist/common/schema/parse-object.mjs.map +1 -1
  438. package/dist/common/schema/schema-standard.mjs +1 -1
  439. package/dist/common/schema/schema.cjs +423 -1
  440. package/dist/common/schema/schema.cjs.map +1 -1
  441. package/dist/common/schema/schema.mjs +404 -1
  442. package/dist/common/schema/schema.mjs.map +1 -1
  443. package/dist/common/schema/serialize.cjs +109 -1
  444. package/dist/common/schema/serialize.cjs.map +1 -1
  445. package/dist/common/schema/serialize.mjs +107 -1
  446. package/dist/common/schema/serialize.mjs.map +1 -1
  447. package/dist/common/schema/type-test.mjs +1 -1
  448. package/dist/common/schema/utils.cjs +25 -1
  449. package/dist/common/schema/utils.cjs.map +1 -1
  450. package/dist/common/schema/utils.mjs +19 -1
  451. package/dist/common/schema/utils.mjs.map +1 -1
  452. package/dist/common/schema/z-collection.cjs +51 -1
  453. package/dist/common/schema/z-collection.mjs +27 -1
  454. package/dist/common/schema/z.cjs +9 -1
  455. package/dist/common/schema/z.mjs +3 -1
  456. package/dist/common/storage/index.cjs +4 -1
  457. package/dist/common/storage/index.mjs +3 -1
  458. package/dist/common/storage/memstorage.cjs +26 -1
  459. package/dist/common/storage/memstorage.cjs.map +1 -1
  460. package/dist/common/storage/memstorage.mjs +25 -1
  461. package/dist/common/storage/memstorage.mjs.map +1 -1
  462. package/dist/common/test.cjs +14 -1
  463. package/dist/common/test.cjs.map +1 -1
  464. package/dist/common/test.mjs +13 -1
  465. package/dist/common/test.mjs.map +1 -1
  466. package/dist/common/time.cjs +220 -1
  467. package/dist/common/time.cjs.map +1 -1
  468. package/dist/common/time.mjs +194 -1
  469. package/dist/common/time.mjs.map +1 -1
  470. package/dist/common/timeout.cjs +27 -1
  471. package/dist/common/timeout.cjs.map +1 -1
  472. package/dist/common/timeout.mjs +25 -1
  473. package/dist/common/timeout.mjs.map +1 -1
  474. package/dist/common/types.mjs +1 -1
  475. package/dist/common/utils.cjs +7 -1
  476. package/dist/common/utils.cjs.map +1 -1
  477. package/dist/common/utils.mjs +5 -1
  478. package/dist/common/utils.mjs.map +1 -1
  479. package/dist/common/uuid.cjs +307 -1
  480. package/dist/common/uuid.cjs.map +1 -1
  481. package/dist/common/uuid.mjs +284 -1
  482. package/dist/common/uuid.mjs.map +1 -1
  483. package/dist/{index-DHXVOH8h.d.cts → index-CFkMqHvX.d.cts} +1 -2
  484. package/dist/{index-DMaPyx9O.d.mts → index-C_3Y_s6f.d.mts} +1 -2
  485. package/dist/index.all.cjs +641 -1
  486. package/dist/index.all.d.cts +1 -1
  487. package/dist/index.all.d.mts +1 -1
  488. package/dist/index.all.mjs +113 -1
  489. package/dist/index.browser.cjs +576 -1
  490. package/dist/index.browser.d.cts +1 -1
  491. package/dist/index.browser.d.mts +1 -1
  492. package/dist/index.browser.mjs +98 -1
  493. package/dist/index.jsr.cjs +57 -1
  494. package/dist/index.jsr.mjs +6 -1
  495. package/dist/index.node.cjs +628 -1
  496. package/dist/index.node.d.cts +1 -1
  497. package/dist/index.node.d.mts +1 -1
  498. package/dist/index.node.mjs +106 -1
  499. package/dist/node/args.cjs +56 -1
  500. package/dist/node/args.cjs.map +1 -1
  501. package/dist/node/args.mjs +53 -1
  502. package/dist/node/args.mjs.map +1 -1
  503. package/dist/node/clipboard.cjs +18 -1
  504. package/dist/node/clipboard.cjs.map +1 -1
  505. package/dist/node/clipboard.mjs +16 -1
  506. package/dist/node/clipboard.mjs.map +1 -1
  507. package/dist/node/crypto.cjs +28 -1
  508. package/dist/node/crypto.cjs.map +1 -1
  509. package/dist/node/crypto.mjs +24 -1
  510. package/dist/node/crypto.mjs.map +1 -1
  511. package/dist/node/env.cjs +100 -4
  512. package/dist/node/env.cjs.map +1 -1
  513. package/dist/node/env.mjs +90 -4
  514. package/dist/node/env.mjs.map +1 -1
  515. package/dist/node/files-async.cjs +66 -1
  516. package/dist/node/files-async.cjs.map +1 -1
  517. package/dist/node/files-async.mjs +60 -1
  518. package/dist/node/files-async.mjs.map +1 -1
  519. package/dist/node/files.cjs +52 -1
  520. package/dist/node/files.cjs.map +1 -1
  521. package/dist/node/files.mjs +46 -1
  522. package/dist/node/files.mjs.map +1 -1
  523. package/dist/node/filestorage.cjs +100 -1
  524. package/dist/node/filestorage.cjs.map +1 -1
  525. package/dist/node/filestorage.mjs +97 -1
  526. package/dist/node/filestorage.mjs.map +1 -1
  527. package/dist/node/fs.cjs +119 -1
  528. package/dist/node/fs.cjs.map +1 -1
  529. package/dist/node/fs.mjs +101 -1
  530. package/dist/node/fs.mjs.map +1 -1
  531. package/dist/node/glob.cjs +75 -1
  532. package/dist/node/glob.cjs.map +1 -1
  533. package/dist/node/glob.mjs +73 -1
  534. package/dist/node/glob.mjs.map +1 -1
  535. package/dist/node/index.cjs +66 -1
  536. package/dist/node/index.mjs +16 -1
  537. package/dist/node/log/index.cjs +20 -1
  538. package/dist/node/log/index.mjs +7 -1
  539. package/dist/node/log/log-context-node.cjs +39 -1
  540. package/dist/node/log/log-context-node.cjs.map +1 -1
  541. package/dist/node/log/log-context-node.mjs +35 -1
  542. package/dist/node/log/log-context-node.mjs.map +1 -1
  543. package/dist/node/log/log-file-rotation.cjs +71 -1
  544. package/dist/node/log/log-file-rotation.cjs.map +1 -1
  545. package/dist/node/log/log-file-rotation.mjs +68 -1
  546. package/dist/node/log/log-file-rotation.mjs.map +1 -1
  547. package/dist/node/log/log-file.cjs +57 -1
  548. package/dist/node/log/log-file.cjs.map +1 -1
  549. package/dist/node/log/log-file.mjs +54 -1
  550. package/dist/node/log/log-file.mjs.map +1 -1
  551. package/dist/node/log/log-node.cjs +162 -1
  552. package/dist/node/log/log-node.cjs.map +1 -1
  553. package/dist/node/log/log-node.mjs +155 -1
  554. package/dist/node/log/log-node.mjs.map +1 -1
  555. package/dist/node/log/log-rotation.cjs +543 -3
  556. package/dist/node/log/log-rotation.cjs.map +1 -1
  557. package/dist/node/log/log-rotation.mjs +538 -3
  558. package/dist/node/log/log-rotation.mjs.map +1 -1
  559. package/dist/node/log/log-util.cjs +69 -3
  560. package/dist/node/log/log-util.cjs.map +1 -1
  561. package/dist/node/log/log-util.mjs +63 -3
  562. package/dist/node/log/log-util.mjs.map +1 -1
  563. package/dist/node/open-browser.cjs +20 -1
  564. package/dist/node/open-browser.cjs.map +1 -1
  565. package/dist/node/open-browser.mjs +18 -1
  566. package/dist/node/open-browser.mjs.map +1 -1
  567. package/package.json +15 -15
  568. package/src/common/schema/README.md +247 -66
  569. package/src/eslint-defaults.js +4 -0
  570. package/src/index.spec.ts +6 -6
  571. package/dist/bin-Ce3i6ABn.cjs +0 -3
  572. package/dist/bin-SPdenYkw.mjs +0 -3
  573. package/dist/chunk-0Lt9GpW0.mjs +0 -1
  574. package/dist/chunk-D-qHiVGv.cjs +0 -1
  575. package/src/common/schema/README-SCHEMA.md +0 -0
@@ -1,2 +1,221 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});const e=require(`./data/math.cjs`);let t;function n(e=Date.UTC(2e3,0,1,0,0,0,0)){t=e}function r(){return t??Date.now()}function i(){return Math.floor(r()/1e3)}function a(e){return new Date(e*1e3)}function o(e){return e>999?`${(e/1e3).toFixed(1)} s`:`${e.toFixed(2)} ms`}function s(...e){for(let t of e){if(t instanceof Date)return t;if(typeof t==`string`){let e=null;if(t.includes(`:`))try{e=new Date(t)}catch{}if(!(e instanceof Date)){let n=/(\d\d\d\d)-(\d\d)-(\d\d)/.exec(t);n&&(e=new Date(+n[1],n[2]-1,+n[3],12,0))}if(e instanceof Date)return e}}}function c(){return typeof performance<`u`?performance.now():Date.now()}function l(){let e=c();return function(){return o(c()-e)}}function u(e){return new Date(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds(),e.getUTCMilliseconds())}function d(e){return new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate(),e.getHours(),e.getMinutes(),e.getSeconds(),e.getMilliseconds()))}function f(e,t=!0){return e<=0?0:t&&e<0xe8d4a51000?e:Math.floor(e/1e3)}function p(e,t=!0){return e<=0?0:t&&e>0xe8d4a51000?e:Math.floor(e*1e3)}const m=1735686e3;function h(){return e.numberToBase32(Math.floor((i()-m)/5),6)}function g(t){return m+e.base32ToNumber(t)*5}exports.TIME_DAY_MS=864e5,exports.TIME_DAY_S=86400,exports.TIME_HOUR_MS=36e5,exports.TIME_HOUR_S=3600,exports.TIME_MINUTE_MS=6e4,exports.TIME_MINUTE_S=60,exports.TIME_MONTH_MS=2592e6,exports.TIME_MONTH_S=2592e3,exports.TIME_WEEK_MS=6048e5,exports.TIME_WEEK_S=604800,exports.TIME_YEAR_MS=31536e6,exports.TIME_YEAR_S=31536e3,exports.dateFromSeconds=a,exports.datetimeToLocal=u,exports.datetimeToUTC=d,exports.duration=l,exports.formatMilliseconds=o,exports.getBuildNumber=h,exports.getPerformanceTimestamp=c,exports.getSecondsFromBuildNumber=g,exports.getTimestamp=r,exports.getTimestampInSeconds=i,exports.parseDate=s,exports.setTimestampTest=n,exports.timestampMillisecondsToSeconds=f,exports.timestampSecondsToMilliseconds=p;
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+ const require_common_data_math = require('./data/math.cjs');
3
+
4
+ //#region src/common/time.ts
5
+ let testModeTime;
6
+ /**
7
+ * Set a fixed timestamp (ms since epoch) used by `getTimestamp` for tests.
8
+ *
9
+ * Pass a millisecond timestamp (for example created with Date.UTC) to force
10
+ * time-based helpers to return deterministic values during tests.
11
+ *
12
+ * @param ts - timestamp in milliseconds (defaults to 2000-01-01T00:00:00.000Z)
13
+ */
14
+ function setTimestampTest(ts = Date.UTC(2e3, 0, 1, 0, 0, 0, 0)) {
15
+ testModeTime = ts;
16
+ }
17
+ /**
18
+ * Return the current timestamp in milliseconds.
19
+ *
20
+ * In test mode (when `setTimestampTest` was called) the forced value is
21
+ * returned instead of the real current time.
22
+ *
23
+ * @returns timestamp in milliseconds
24
+ */
25
+ function getTimestamp() {
26
+ return testModeTime ?? Date.now();
27
+ }
28
+ /**
29
+ * Return the current timestamp in seconds.
30
+ *
31
+ * Uses `getTimestamp()` which can be overridden for tests with
32
+ * `setTimestampTest`.
33
+ *
34
+ * @returns timestamp in whole seconds (integer)
35
+ */
36
+ function getTimestampInSeconds() {
37
+ return Math.floor(getTimestamp() / 1e3);
38
+ }
39
+ /**
40
+ * Convert a UNIX timestamp in seconds to a JavaScript Date.
41
+ *
42
+ * @param ts - seconds since epoch
43
+ * @returns Date instance corresponding to the provided seconds
44
+ */
45
+ function dateFromSeconds(ts) {
46
+ return /* @__PURE__ */ new Date(ts * 1e3);
47
+ }
48
+ /**
49
+ * Format a millisecond duration into a human readable string.
50
+ *
51
+ * - Values >= 1000ms are shown in seconds with one decimal (e.g. "1.2 s").
52
+ * - Smaller values are shown in milliseconds with two decimals (e.g. "123.45 ms").
53
+ *
54
+ * @param ms - duration in milliseconds
55
+ * @returns formatted duration string
56
+ */
57
+ function formatMilliseconds(ms) {
58
+ return ms > 999 ? `${(ms / 1e3).toFixed(1)} s` : `${ms.toFixed(2)} ms`;
59
+ }
60
+ /**
61
+ * Parses the given date candidates and returns the first valid Date object found.
62
+ *
63
+ * @param dateCandidates - The date candidates to parse, which can be either strings or Date objects.
64
+ * @returns The parsed Date object, or undefined if no valid date is found.
65
+ */
66
+ function parseDate(...dateCandidates) {
67
+ for (const dateCandidate of dateCandidates) {
68
+ if (dateCandidate instanceof Date) return dateCandidate;
69
+ if (typeof dateCandidate === "string") {
70
+ let date = null;
71
+ if (dateCandidate.includes(":")) try {
72
+ date = new Date(dateCandidate);
73
+ } catch (err) {}
74
+ if (!(date instanceof Date)) {
75
+ const m = /(\d\d\d\d)-(\d\d)-(\d\d)/.exec(dateCandidate);
76
+ if (m) date = new Date(+m[1], +m[2] - 1, +m[3], 12, 0);
77
+ }
78
+ if (date instanceof Date) return date;
79
+ }
80
+ }
81
+ }
82
+ /**
83
+ * Return a high-resolution timestamp in milliseconds.
84
+ *
85
+ * Uses the `performance.now()` clock when available (monotonic, high
86
+ * resolution), otherwise falls back to `Date.now()`.
87
+ *
88
+ * @returns timestamp in milliseconds (relative for performance.now, epoch for Date.now)
89
+ */
90
+ function getPerformanceTimestamp() {
91
+ return typeof performance !== "undefined" ? performance.now() : Date.now();
92
+ }
93
+ /**
94
+ * Create a simple duration reporter.
95
+ *
96
+ * Returns a function that, when called, reports the elapsed time since
97
+ * `duration()` was called. The returned string is formatted via
98
+ * `formatMilliseconds`.
99
+ *
100
+ * Example: const t = duration(); // do work...; console.log(t());
101
+ *
102
+ * @returns a zero-argument function that returns the elapsed time string
103
+ */
104
+ function duration() {
105
+ const t0 = getPerformanceTimestamp();
106
+ return function() {
107
+ return formatMilliseconds(getPerformanceTimestamp() - t0);
108
+ };
109
+ }
110
+ /**
111
+ * If you parsed a date string that didn't include a time zone, adjust the
112
+ * naive UTC components into a local Date with the same Y/M/D/H/M/S values.
113
+ *
114
+ * This effectively treats the input as if it already represented local time
115
+ * and builds a corresponding Date using the local timezone.
116
+ */
117
+ function datetimeToLocal(fromDate) {
118
+ return new Date(fromDate.getUTCFullYear(), fromDate.getUTCMonth(), fromDate.getUTCDate(), fromDate.getUTCHours(), fromDate.getUTCMinutes(), fromDate.getUTCSeconds(), fromDate.getUTCMilliseconds());
119
+ }
120
+ /**
121
+ * If you parsed a date string that didn't include a time zone, adjust the
122
+ * local date components into a UTC Date with the same Y/M/D/H/M/S values.
123
+ */
124
+ function datetimeToUTC(fromDate) {
125
+ return new Date(Date.UTC(fromDate.getFullYear(), fromDate.getMonth(), fromDate.getDate(), fromDate.getHours(), fromDate.getMinutes(), fromDate.getSeconds(), fromDate.getMilliseconds()));
126
+ }
127
+ /**
128
+ * Convert a timestamp in milliseconds to seconds.
129
+ *
130
+ * When `smart` is true the function will try to detect already-second
131
+ * timestamps and return them unchanged (heuristic threshold). For example,
132
+ * small numbers (< 1e12) are likely seconds and are returned as-is.
133
+ *
134
+ * @param ts - timestamp in milliseconds or seconds
135
+ * @param smart - enable heuristic detection (default: true)
136
+ * @returns timestamp in seconds
137
+ */
138
+ function timestampMillisecondsToSeconds(ts, smart = true) {
139
+ if (ts <= 0) return 0;
140
+ if (smart && ts < 0xe8d4a51000) return ts;
141
+ return Math.floor(ts / 1e3);
142
+ }
143
+ /**
144
+ * Convert a timestamp in seconds to milliseconds.
145
+ *
146
+ * When `smart` is true the function tries to detect already-millisecond
147
+ * values and returns them unchanged (heuristic threshold). Very large
148
+ * numbers (> 1e12) are assumed to already be milliseconds.
149
+ *
150
+ * @param ts - timestamp in seconds or milliseconds
151
+ * @param smart - enable heuristic detection (default: true)
152
+ * @returns timestamp in milliseconds
153
+ */
154
+ function timestampSecondsToMilliseconds(ts, smart = true) {
155
+ if (ts <= 0) return 0;
156
+ if (smart && ts > 0xe8d4a51000) return ts;
157
+ return Math.floor(ts * 1e3);
158
+ }
159
+ /** Number of milliseconds in (approx.) one year (365 days). */
160
+ const TIME_YEAR_MS = 31536e6;
161
+ /** Number of seconds in (approx.) one year (365 days). */
162
+ const TIME_YEAR_S = 31536e3;
163
+ /** Number of milliseconds in (approx.) one month (30 days). */
164
+ const TIME_MONTH_MS = 2592e6;
165
+ /** Number of seconds in (approx.) one month (30 days). */
166
+ const TIME_MONTH_S = 2592e3;
167
+ /** Number of milliseconds in one week (7 days). */
168
+ const TIME_WEEK_MS = 6048e5;
169
+ /** Number of seconds in one week (7 days). */
170
+ const TIME_WEEK_S = 604800;
171
+ /** Number of milliseconds in one day (24 hours). */
172
+ const TIME_DAY_MS = 864e5;
173
+ /** Number of seconds in one day (24 hours). */
174
+ const TIME_DAY_S = 86400;
175
+ /** Number of milliseconds in one hour (60 minutes). */
176
+ const TIME_HOUR_MS = 36e5;
177
+ /** Number of seconds in one hour (60 minutes). */
178
+ const TIME_HOUR_S = 3600;
179
+ /** Number of milliseconds in one minute (60 seconds). */
180
+ const TIME_MINUTE_MS = 6e4;
181
+ /** Number of seconds in one minute (60 seconds). */
182
+ const TIME_MINUTE_S = 60;
183
+ const buildNumberSeconds = 5;
184
+ const buildNumberPadding = 6;
185
+ const buildStartSeconds = 1735686e3;
186
+ /** Build number is minutes since 2025-01-01 in base32 "agnoster" encoded format */
187
+ function getBuildNumber() {
188
+ return require_common_data_math.numberToBase32(Math.floor((getTimestampInSeconds() - buildStartSeconds) / buildNumberSeconds), buildNumberPadding);
189
+ }
190
+ function getSecondsFromBuildNumber(buildNumber) {
191
+ return buildStartSeconds + require_common_data_math.base32ToNumber(buildNumber) * buildNumberSeconds;
192
+ }
193
+
194
+ //#endregion
195
+ exports.TIME_DAY_MS = TIME_DAY_MS;
196
+ exports.TIME_DAY_S = TIME_DAY_S;
197
+ exports.TIME_HOUR_MS = TIME_HOUR_MS;
198
+ exports.TIME_HOUR_S = TIME_HOUR_S;
199
+ exports.TIME_MINUTE_MS = TIME_MINUTE_MS;
200
+ exports.TIME_MINUTE_S = TIME_MINUTE_S;
201
+ exports.TIME_MONTH_MS = TIME_MONTH_MS;
202
+ exports.TIME_MONTH_S = TIME_MONTH_S;
203
+ exports.TIME_WEEK_MS = TIME_WEEK_MS;
204
+ exports.TIME_WEEK_S = TIME_WEEK_S;
205
+ exports.TIME_YEAR_MS = TIME_YEAR_MS;
206
+ exports.TIME_YEAR_S = TIME_YEAR_S;
207
+ exports.dateFromSeconds = dateFromSeconds;
208
+ exports.datetimeToLocal = datetimeToLocal;
209
+ exports.datetimeToUTC = datetimeToUTC;
210
+ exports.duration = duration;
211
+ exports.formatMilliseconds = formatMilliseconds;
212
+ exports.getBuildNumber = getBuildNumber;
213
+ exports.getPerformanceTimestamp = getPerformanceTimestamp;
214
+ exports.getSecondsFromBuildNumber = getSecondsFromBuildNumber;
215
+ exports.getTimestamp = getTimestamp;
216
+ exports.getTimestampInSeconds = getTimestampInSeconds;
217
+ exports.parseDate = parseDate;
218
+ exports.setTimestampTest = setTimestampTest;
219
+ exports.timestampMillisecondsToSeconds = timestampMillisecondsToSeconds;
220
+ exports.timestampSecondsToMilliseconds = timestampSecondsToMilliseconds;
2
221
  //# sourceMappingURL=time.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"time.cjs","names":["numberToBase32","base32ToNumber"],"sources":["../../src/common/time.ts"],"sourcesContent":["import { base32ToNumber, numberToBase32 } from './data/math'\n\nlet testModeTime: number | undefined\n\n/**\n * Set a fixed timestamp (ms since epoch) used by `getTimestamp` for tests.\n *\n * Pass a millisecond timestamp (for example created with Date.UTC) to force\n * time-based helpers to return deterministic values during tests.\n *\n * @param ts - timestamp in milliseconds (defaults to 2000-01-01T00:00:00.000Z)\n */\nexport function setTimestampTest(ts = Date.UTC(2000, 0, 1, 0, 0, 0, 0)) {\n testModeTime = ts\n}\n\n/**\n * Return the current timestamp in milliseconds.\n *\n * In test mode (when `setTimestampTest` was called) the forced value is\n * returned instead of the real current time.\n *\n * @returns timestamp in milliseconds\n */\nexport function getTimestamp(): number {\n return testModeTime ?? Date.now()\n}\n\n/**\n * Return the current timestamp in seconds.\n *\n * Uses `getTimestamp()` which can be overridden for tests with\n * `setTimestampTest`.\n *\n * @returns timestamp in whole seconds (integer)\n */\nexport function getTimestampInSeconds(): number {\n return Math.floor(getTimestamp() / 1000)\n}\n\n/**\n * Convert a UNIX timestamp in seconds to a JavaScript Date.\n *\n * @param ts - seconds since epoch\n * @returns Date instance corresponding to the provided seconds\n */\nexport function dateFromSeconds(ts: number): Date {\n return new Date(ts * 1000)\n}\n\n// typeof performance !== \"undefined\" ? performance.now() : new Date().getTime()\n\n/**\n * Format a millisecond duration into a human readable string.\n *\n * - Values >= 1000ms are shown in seconds with one decimal (e.g. \"1.2 s\").\n * - Smaller values are shown in milliseconds with two decimals (e.g. \"123.45 ms\").\n *\n * @param ms - duration in milliseconds\n * @returns formatted duration string\n */\nexport function formatMilliseconds(ms: number): string {\n return ms > 999 ? `${(ms / 1000).toFixed(1)} s` : `${ms.toFixed(2)} ms`\n}\n\n/**\n * Parses the given date candidates and returns the first valid Date object found.\n *\n * @param dateCandidates - The date candidates to parse, which can be either strings or Date objects.\n * @returns The parsed Date object, or undefined if no valid date is found.\n */\nexport function parseDate(\n ...dateCandidates: (string | Date)[]\n): Date | undefined {\n for (const dateCandidate of dateCandidates) {\n if (dateCandidate instanceof Date)\n return dateCandidate\n\n if (typeof dateCandidate === 'string') {\n let date = null\n if (dateCandidate.includes(':')) {\n try {\n date = new Date(dateCandidate)\n }\n catch (err) {}\n }\n if (!(date instanceof Date)) {\n const m = /(\\d\\d\\d\\d)-(\\d\\d)-(\\d\\d)/.exec(dateCandidate)\n if (m)\n date = new Date(+m[1], +m[2] - 1, +m[3], 12, 0)\n }\n if (date instanceof Date)\n return date\n }\n }\n}\n\n/**\n * Return a high-resolution timestamp in milliseconds.\n *\n * Uses the `performance.now()` clock when available (monotonic, high\n * resolution), otherwise falls back to `Date.now()`.\n *\n * @returns timestamp in milliseconds (relative for performance.now, epoch for Date.now)\n */\nexport function getPerformanceTimestamp(): number {\n return typeof performance !== 'undefined' ? performance.now() : Date.now()\n}\n\n/**\n * Create a simple duration reporter.\n *\n * Returns a function that, when called, reports the elapsed time since\n * `duration()` was called. The returned string is formatted via\n * `formatMilliseconds`.\n *\n * Example: const t = duration(); // do work...; console.log(t());\n *\n * @returns a zero-argument function that returns the elapsed time string\n */\nexport function duration(): () => string {\n const t0 = getPerformanceTimestamp()\n\n return function (): string {\n const duration = getPerformanceTimestamp() - t0\n return formatMilliseconds(duration)\n\n // if (duration > 500)\n // return `${(duration / 1000).toFixed(4)}s`\n\n // // https://elijahmanor.com/format-js-numbers\n // // https://tc39.es/proposal-unified-intl-numberformat/section6/locales-currencies-tz_proposed_out.html#sec-issanctionedsimpleunitidentifier\n // return duration.toLocaleString('en-US', {\n // style: 'unit',\n // unit: 'millisecond',\n // notation: 'compact',\n // compactDisplay: 'long',\n // })\n }\n}\n\n/**\n * If you parsed a date string that didn't include a time zone, adjust the\n * naive UTC components into a local Date with the same Y/M/D/H/M/S values.\n *\n * This effectively treats the input as if it already represented local time\n * and builds a corresponding Date using the local timezone.\n */\nexport function datetimeToLocal(fromDate: Date): Date {\n return new Date(\n fromDate.getUTCFullYear(),\n fromDate.getUTCMonth(),\n fromDate.getUTCDate(),\n fromDate.getUTCHours(),\n fromDate.getUTCMinutes(),\n fromDate.getUTCSeconds(),\n fromDate.getUTCMilliseconds(),\n )\n}\n\n/**\n * If you parsed a date string that didn't include a time zone, adjust the\n * local date components into a UTC Date with the same Y/M/D/H/M/S values.\n */\nexport function datetimeToUTC(fromDate: Date): Date {\n return new Date(Date.UTC(\n fromDate.getFullYear(),\n fromDate.getMonth(),\n fromDate.getDate(),\n fromDate.getHours(),\n fromDate.getMinutes(),\n fromDate.getSeconds(),\n fromDate.getMilliseconds(),\n ))\n}\n\n// const tsMs2000 = 946684800000 // same as Jan 11 1970 in ms\n// const tsMs2500 = 16725225600000 // same as Jul 13 1970 in ms\n// 1000000000000\n\n/**\n * Convert a timestamp in milliseconds to seconds.\n *\n * When `smart` is true the function will try to detect already-second\n * timestamps and return them unchanged (heuristic threshold). For example,\n * small numbers (< 1e12) are likely seconds and are returned as-is.\n *\n * @param ts - timestamp in milliseconds or seconds\n * @param smart - enable heuristic detection (default: true)\n * @returns timestamp in seconds\n */\nexport function timestampMillisecondsToSeconds(ts: number, smart = true): number {\n if (ts <= 0)\n return 0\n if (smart && ts < 1000000000000) { // TODO find a better threshold and add tests\n return ts\n // log.warn('Timestamp might already be in seconds?', ts)\n }\n return Math.floor(ts / 1000)\n}\n\n/**\n * Convert a timestamp in seconds to milliseconds.\n *\n * When `smart` is true the function tries to detect already-millisecond\n * values and returns them unchanged (heuristic threshold). Very large\n * numbers (> 1e12) are assumed to already be milliseconds.\n *\n * @param ts - timestamp in seconds or milliseconds\n * @param smart - enable heuristic detection (default: true)\n * @returns timestamp in milliseconds\n */\nexport function timestampSecondsToMilliseconds(ts: number, smart = true): number {\n if (ts <= 0)\n return 0\n if (smart && ts > 1000000000000) { // TODO find a better threshold and add tests\n return ts\n // log.warn('Timestamp might already be in milliseconds?', ts)\n }\n return Math.floor(ts * 1000)\n}\n\n/** Number of milliseconds in (approx.) one year (365 days). */\nexport const TIME_YEAR_MS = 31536000000 // 365 * 24 * 60 * 60 * 1000\n/** Number of seconds in (approx.) one year (365 days). */\nexport const TIME_YEAR_S = 31536000 // 365 * 24 * 60 * 60\n/** Number of milliseconds in (approx.) one month (30 days). */\nexport const TIME_MONTH_MS = 2592000000 // 30 * 24 * 60 * 60 * 1000\n/** Number of seconds in (approx.) one month (30 days). */\nexport const TIME_MONTH_S = 2592000 // 30 * 24 * 60 * 60\n/** Number of milliseconds in one week (7 days). */\nexport const TIME_WEEK_MS = 604800000 // 7 * 24 * 60 * 60 * 1000\n/** Number of seconds in one week (7 days). */\nexport const TIME_WEEK_S = 604800 // 7 * 24 * 60 * 60\n/** Number of milliseconds in one day (24 hours). */\nexport const TIME_DAY_MS = 86400000 // 24 * 60 * 60 * 1000\n/** Number of seconds in one day (24 hours). */\nexport const TIME_DAY_S = 86400 // 24 * 60 * 60\n/** Number of milliseconds in one hour (60 minutes). */\nexport const TIME_HOUR_MS = 3600000 // 60 * 60 * 1000\n/** Number of seconds in one hour (60 minutes). */\nexport const TIME_HOUR_S = 3600 // 60 * 60\n/** Number of milliseconds in one minute (60 seconds). */\nexport const TIME_MINUTE_MS = 60000 // 60 * 1000\n/** Number of seconds in one minute (60 seconds). */\nexport const TIME_MINUTE_S = 60 // 60\n\n// BUILD NUMBER\n\nconst buildNumberSeconds = 5\nconst buildNumberPadding = 6\nconst buildStartSeconds = 1735686000 // 2025-01-01\n\n/** Build number is minutes since 2025-01-01 in base32 \"agnoster\" encoded format */\nexport function getBuildNumber(): string {\n const buildNumber = Math.floor((getTimestampInSeconds() - buildStartSeconds) / buildNumberSeconds)\n return numberToBase32(buildNumber, buildNumberPadding)\n}\n\nexport function getSecondsFromBuildNumber(buildNumber: string): number {\n return buildStartSeconds + (base32ToNumber(buildNumber) * buildNumberSeconds)\n}\n"],"mappings":"sGAEA,IAAI,EAUJ,SAAgB,EAAiB,EAAK,KAAK,IAAI,IAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CAAE,CACtE,EAAe,EAWjB,SAAgB,GAAuB,CACrC,OAAO,GAAgB,KAAK,KAAK,CAWnC,SAAgB,GAAgC,CAC9C,OAAO,KAAK,MAAM,GAAc,CAAG,IAAK,CAS1C,SAAgB,EAAgB,EAAkB,CAChD,OAAO,IAAI,KAAK,EAAK,IAAK,CAc5B,SAAgB,EAAmB,EAAoB,CACrD,OAAO,EAAK,IAAM,IAAI,EAAK,KAAM,QAAQ,EAAE,CAAC,IAAM,GAAG,EAAG,QAAQ,EAAE,CAAC,KASrE,SAAgB,EACd,GAAG,EACe,CAClB,IAAK,IAAM,KAAiB,EAAgB,CAC1C,GAAI,aAAyB,KAC3B,OAAO,EAET,GAAI,OAAO,GAAkB,SAAU,CACrC,IAAI,EAAO,KACX,GAAI,EAAc,SAAS,IAAI,CAC7B,GAAI,CACF,EAAO,IAAI,KAAK,EAAc,MAEpB,EAEd,GAAI,EAAE,aAAgB,MAAO,CAC3B,IAAM,EAAI,2BAA2B,KAAK,EAAc,CACpD,IACF,EAAO,IAAI,KAAK,CAAC,EAAE,GAAK,EAAE,GAAK,EAAG,CAAC,EAAE,GAAI,GAAI,EAAE,EAEnD,GAAI,aAAgB,KAClB,OAAO,IAaf,SAAgB,GAAkC,CAChD,OAAO,OAAO,YAAgB,IAAc,YAAY,KAAK,CAAG,KAAK,KAAK,CAc5E,SAAgB,GAAyB,CACvC,IAAM,EAAK,GAAyB,CAEpC,OAAO,UAAoB,CAEzB,OAAO,EADU,GAAyB,CAAG,EACV,EAuBvC,SAAgB,EAAgB,EAAsB,CACpD,OAAO,IAAI,KACT,EAAS,gBAAgB,CACzB,EAAS,aAAa,CACtB,EAAS,YAAY,CACrB,EAAS,aAAa,CACtB,EAAS,eAAe,CACxB,EAAS,eAAe,CACxB,EAAS,oBAAoB,CAC9B,CAOH,SAAgB,EAAc,EAAsB,CAClD,OAAO,IAAI,KAAK,KAAK,IACnB,EAAS,aAAa,CACtB,EAAS,UAAU,CACnB,EAAS,SAAS,CAClB,EAAS,UAAU,CACnB,EAAS,YAAY,CACrB,EAAS,YAAY,CACrB,EAAS,iBAAiB,CAC3B,CAAC,CAkBJ,SAAgB,EAA+B,EAAY,EAAQ,GAAc,CAO/E,OANI,GAAM,EACD,EACL,GAAS,EAAK,aACT,EAGF,KAAK,MAAM,EAAK,IAAK,CAc9B,SAAgB,EAA+B,EAAY,EAAQ,GAAc,CAO/E,OANI,GAAM,EACD,EACL,GAAS,EAAK,aACT,EAGF,KAAK,MAAM,EAAK,IAAK,CAI9B,MA4BM,EAAoB,UAG1B,SAAgB,GAAyB,CAEvC,OAAOA,EAAAA,eADa,KAAK,OAAO,GAAuB,CAAG,GAAqB,EAAmB,CAC/D,EAAmB,CAGxD,SAAgB,EAA0B,EAA6B,CACrE,OAAO,EAAqBC,EAAAA,eAAe,EAAY,CAAG"}
1
+ {"version":3,"file":"time.cjs","names":["numberToBase32","base32ToNumber"],"sources":["../../src/common/time.ts"],"sourcesContent":["import { base32ToNumber, numberToBase32 } from './data/math'\n\nlet testModeTime: number | undefined\n\n/**\n * Set a fixed timestamp (ms since epoch) used by `getTimestamp` for tests.\n *\n * Pass a millisecond timestamp (for example created with Date.UTC) to force\n * time-based helpers to return deterministic values during tests.\n *\n * @param ts - timestamp in milliseconds (defaults to 2000-01-01T00:00:00.000Z)\n */\nexport function setTimestampTest(ts = Date.UTC(2000, 0, 1, 0, 0, 0, 0)) {\n testModeTime = ts\n}\n\n/**\n * Return the current timestamp in milliseconds.\n *\n * In test mode (when `setTimestampTest` was called) the forced value is\n * returned instead of the real current time.\n *\n * @returns timestamp in milliseconds\n */\nexport function getTimestamp(): number {\n return testModeTime ?? Date.now()\n}\n\n/**\n * Return the current timestamp in seconds.\n *\n * Uses `getTimestamp()` which can be overridden for tests with\n * `setTimestampTest`.\n *\n * @returns timestamp in whole seconds (integer)\n */\nexport function getTimestampInSeconds(): number {\n return Math.floor(getTimestamp() / 1000)\n}\n\n/**\n * Convert a UNIX timestamp in seconds to a JavaScript Date.\n *\n * @param ts - seconds since epoch\n * @returns Date instance corresponding to the provided seconds\n */\nexport function dateFromSeconds(ts: number): Date {\n return new Date(ts * 1000)\n}\n\n// typeof performance !== \"undefined\" ? performance.now() : new Date().getTime()\n\n/**\n * Format a millisecond duration into a human readable string.\n *\n * - Values >= 1000ms are shown in seconds with one decimal (e.g. \"1.2 s\").\n * - Smaller values are shown in milliseconds with two decimals (e.g. \"123.45 ms\").\n *\n * @param ms - duration in milliseconds\n * @returns formatted duration string\n */\nexport function formatMilliseconds(ms: number): string {\n return ms > 999 ? `${(ms / 1000).toFixed(1)} s` : `${ms.toFixed(2)} ms`\n}\n\n/**\n * Parses the given date candidates and returns the first valid Date object found.\n *\n * @param dateCandidates - The date candidates to parse, which can be either strings or Date objects.\n * @returns The parsed Date object, or undefined if no valid date is found.\n */\nexport function parseDate(\n ...dateCandidates: (string | Date)[]\n): Date | undefined {\n for (const dateCandidate of dateCandidates) {\n if (dateCandidate instanceof Date)\n return dateCandidate\n\n if (typeof dateCandidate === 'string') {\n let date = null\n if (dateCandidate.includes(':')) {\n try {\n date = new Date(dateCandidate)\n }\n catch (err) {}\n }\n if (!(date instanceof Date)) {\n const m = /(\\d\\d\\d\\d)-(\\d\\d)-(\\d\\d)/.exec(dateCandidate)\n if (m)\n date = new Date(+m[1], +m[2] - 1, +m[3], 12, 0)\n }\n if (date instanceof Date)\n return date\n }\n }\n}\n\n/**\n * Return a high-resolution timestamp in milliseconds.\n *\n * Uses the `performance.now()` clock when available (monotonic, high\n * resolution), otherwise falls back to `Date.now()`.\n *\n * @returns timestamp in milliseconds (relative for performance.now, epoch for Date.now)\n */\nexport function getPerformanceTimestamp(): number {\n return typeof performance !== 'undefined' ? performance.now() : Date.now()\n}\n\n/**\n * Create a simple duration reporter.\n *\n * Returns a function that, when called, reports the elapsed time since\n * `duration()` was called. The returned string is formatted via\n * `formatMilliseconds`.\n *\n * Example: const t = duration(); // do work...; console.log(t());\n *\n * @returns a zero-argument function that returns the elapsed time string\n */\nexport function duration(): () => string {\n const t0 = getPerformanceTimestamp()\n\n return function (): string {\n const duration = getPerformanceTimestamp() - t0\n return formatMilliseconds(duration)\n\n // if (duration > 500)\n // return `${(duration / 1000).toFixed(4)}s`\n\n // // https://elijahmanor.com/format-js-numbers\n // // https://tc39.es/proposal-unified-intl-numberformat/section6/locales-currencies-tz_proposed_out.html#sec-issanctionedsimpleunitidentifier\n // return duration.toLocaleString('en-US', {\n // style: 'unit',\n // unit: 'millisecond',\n // notation: 'compact',\n // compactDisplay: 'long',\n // })\n }\n}\n\n/**\n * If you parsed a date string that didn't include a time zone, adjust the\n * naive UTC components into a local Date with the same Y/M/D/H/M/S values.\n *\n * This effectively treats the input as if it already represented local time\n * and builds a corresponding Date using the local timezone.\n */\nexport function datetimeToLocal(fromDate: Date): Date {\n return new Date(\n fromDate.getUTCFullYear(),\n fromDate.getUTCMonth(),\n fromDate.getUTCDate(),\n fromDate.getUTCHours(),\n fromDate.getUTCMinutes(),\n fromDate.getUTCSeconds(),\n fromDate.getUTCMilliseconds(),\n )\n}\n\n/**\n * If you parsed a date string that didn't include a time zone, adjust the\n * local date components into a UTC Date with the same Y/M/D/H/M/S values.\n */\nexport function datetimeToUTC(fromDate: Date): Date {\n return new Date(Date.UTC(\n fromDate.getFullYear(),\n fromDate.getMonth(),\n fromDate.getDate(),\n fromDate.getHours(),\n fromDate.getMinutes(),\n fromDate.getSeconds(),\n fromDate.getMilliseconds(),\n ))\n}\n\n// const tsMs2000 = 946684800000 // same as Jan 11 1970 in ms\n// const tsMs2500 = 16725225600000 // same as Jul 13 1970 in ms\n// 1000000000000\n\n/**\n * Convert a timestamp in milliseconds to seconds.\n *\n * When `smart` is true the function will try to detect already-second\n * timestamps and return them unchanged (heuristic threshold). For example,\n * small numbers (< 1e12) are likely seconds and are returned as-is.\n *\n * @param ts - timestamp in milliseconds or seconds\n * @param smart - enable heuristic detection (default: true)\n * @returns timestamp in seconds\n */\nexport function timestampMillisecondsToSeconds(ts: number, smart = true): number {\n if (ts <= 0)\n return 0\n if (smart && ts < 1000000000000) { // TODO find a better threshold and add tests\n return ts\n // log.warn('Timestamp might already be in seconds?', ts)\n }\n return Math.floor(ts / 1000)\n}\n\n/**\n * Convert a timestamp in seconds to milliseconds.\n *\n * When `smart` is true the function tries to detect already-millisecond\n * values and returns them unchanged (heuristic threshold). Very large\n * numbers (> 1e12) are assumed to already be milliseconds.\n *\n * @param ts - timestamp in seconds or milliseconds\n * @param smart - enable heuristic detection (default: true)\n * @returns timestamp in milliseconds\n */\nexport function timestampSecondsToMilliseconds(ts: number, smart = true): number {\n if (ts <= 0)\n return 0\n if (smart && ts > 1000000000000) { // TODO find a better threshold and add tests\n return ts\n // log.warn('Timestamp might already be in milliseconds?', ts)\n }\n return Math.floor(ts * 1000)\n}\n\n/** Number of milliseconds in (approx.) one year (365 days). */\nexport const TIME_YEAR_MS = 31536000000 // 365 * 24 * 60 * 60 * 1000\n/** Number of seconds in (approx.) one year (365 days). */\nexport const TIME_YEAR_S = 31536000 // 365 * 24 * 60 * 60\n/** Number of milliseconds in (approx.) one month (30 days). */\nexport const TIME_MONTH_MS = 2592000000 // 30 * 24 * 60 * 60 * 1000\n/** Number of seconds in (approx.) one month (30 days). */\nexport const TIME_MONTH_S = 2592000 // 30 * 24 * 60 * 60\n/** Number of milliseconds in one week (7 days). */\nexport const TIME_WEEK_MS = 604800000 // 7 * 24 * 60 * 60 * 1000\n/** Number of seconds in one week (7 days). */\nexport const TIME_WEEK_S = 604800 // 7 * 24 * 60 * 60\n/** Number of milliseconds in one day (24 hours). */\nexport const TIME_DAY_MS = 86400000 // 24 * 60 * 60 * 1000\n/** Number of seconds in one day (24 hours). */\nexport const TIME_DAY_S = 86400 // 24 * 60 * 60\n/** Number of milliseconds in one hour (60 minutes). */\nexport const TIME_HOUR_MS = 3600000 // 60 * 60 * 1000\n/** Number of seconds in one hour (60 minutes). */\nexport const TIME_HOUR_S = 3600 // 60 * 60\n/** Number of milliseconds in one minute (60 seconds). */\nexport const TIME_MINUTE_MS = 60000 // 60 * 1000\n/** Number of seconds in one minute (60 seconds). */\nexport const TIME_MINUTE_S = 60 // 60\n\n// BUILD NUMBER\n\nconst buildNumberSeconds = 5\nconst buildNumberPadding = 6\nconst buildStartSeconds = 1735686000 // 2025-01-01\n\n/** Build number is minutes since 2025-01-01 in base32 \"agnoster\" encoded format */\nexport function getBuildNumber(): string {\n const buildNumber = Math.floor((getTimestampInSeconds() - buildStartSeconds) / buildNumberSeconds)\n return numberToBase32(buildNumber, buildNumberPadding)\n}\n\nexport function getSecondsFromBuildNumber(buildNumber: string): number {\n return buildStartSeconds + (base32ToNumber(buildNumber) * buildNumberSeconds)\n}\n"],"mappings":";;;;AAEA,IAAI;;;;;;;;;AAUJ,SAAgB,iBAAiB,KAAK,KAAK,IAAI,KAAM,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAAE;AACtE,gBAAe;;;;;;;;;;AAWjB,SAAgB,eAAuB;AACrC,QAAO,gBAAgB,KAAK,KAAK;;;;;;;;;;AAWnC,SAAgB,wBAAgC;AAC9C,QAAO,KAAK,MAAM,cAAc,GAAG,IAAK;;;;;;;;AAS1C,SAAgB,gBAAgB,IAAkB;AAChD,wBAAO,IAAI,KAAK,KAAK,IAAK;;;;;;;;;;;AAc5B,SAAgB,mBAAmB,IAAoB;AACrD,QAAO,KAAK,MAAM,IAAI,KAAK,KAAM,QAAQ,EAAE,CAAC,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;;;;;;;;AASrE,SAAgB,UACd,GAAG,gBACe;AAClB,MAAK,MAAM,iBAAiB,gBAAgB;AAC1C,MAAI,yBAAyB,KAC3B,QAAO;AAET,MAAI,OAAO,kBAAkB,UAAU;GACrC,IAAI,OAAO;AACX,OAAI,cAAc,SAAS,IAAI,CAC7B,KAAI;AACF,WAAO,IAAI,KAAK,cAAc;YAEzB,KAAK;AAEd,OAAI,EAAE,gBAAgB,OAAO;IAC3B,MAAM,IAAI,2BAA2B,KAAK,cAAc;AACxD,QAAI,EACF,QAAO,IAAI,KAAK,CAAC,EAAE,IAAI,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,IAAI,EAAE;;AAEnD,OAAI,gBAAgB,KAClB,QAAO;;;;;;;;;;;;AAaf,SAAgB,0BAAkC;AAChD,QAAO,OAAO,gBAAgB,cAAc,YAAY,KAAK,GAAG,KAAK,KAAK;;;;;;;;;;;;;AAc5E,SAAgB,WAAyB;CACvC,MAAM,KAAK,yBAAyB;AAEpC,QAAO,WAAoB;AAEzB,SAAO,mBADU,yBAAyB,GAAG,GACV;;;;;;;;;;AAuBvC,SAAgB,gBAAgB,UAAsB;AACpD,QAAO,IAAI,KACT,SAAS,gBAAgB,EACzB,SAAS,aAAa,EACtB,SAAS,YAAY,EACrB,SAAS,aAAa,EACtB,SAAS,eAAe,EACxB,SAAS,eAAe,EACxB,SAAS,oBAAoB,CAC9B;;;;;;AAOH,SAAgB,cAAc,UAAsB;AAClD,QAAO,IAAI,KAAK,KAAK,IACnB,SAAS,aAAa,EACtB,SAAS,UAAU,EACnB,SAAS,SAAS,EAClB,SAAS,UAAU,EACnB,SAAS,YAAY,EACrB,SAAS,YAAY,EACrB,SAAS,iBAAiB,CAC3B,CAAC;;;;;;;;;;;;;AAkBJ,SAAgB,+BAA+B,IAAY,QAAQ,MAAc;AAC/E,KAAI,MAAM,EACR,QAAO;AACT,KAAI,SAAS,KAAK,aAChB,QAAO;AAGT,QAAO,KAAK,MAAM,KAAK,IAAK;;;;;;;;;;;;;AAc9B,SAAgB,+BAA+B,IAAY,QAAQ,MAAc;AAC/E,KAAI,MAAM,EACR,QAAO;AACT,KAAI,SAAS,KAAK,aAChB,QAAO;AAGT,QAAO,KAAK,MAAM,KAAK,IAAK;;;AAI9B,MAAa,eAAe;;AAE5B,MAAa,cAAc;;AAE3B,MAAa,gBAAgB;;AAE7B,MAAa,eAAe;;AAE5B,MAAa,eAAe;;AAE5B,MAAa,cAAc;;AAE3B,MAAa,cAAc;;AAE3B,MAAa,aAAa;;AAE1B,MAAa,eAAe;;AAE5B,MAAa,cAAc;;AAE3B,MAAa,iBAAiB;;AAE9B,MAAa,gBAAgB;AAI7B,MAAM,qBAAqB;AAC3B,MAAM,qBAAqB;AAC3B,MAAM,oBAAoB;;AAG1B,SAAgB,iBAAyB;AAEvC,QAAOA,wCADa,KAAK,OAAO,uBAAuB,GAAG,qBAAqB,mBAAmB,EAC/D,mBAAmB;;AAGxD,SAAgB,0BAA0B,aAA6B;AACrE,QAAO,oBAAqBC,wCAAe,YAAY,GAAG"}
@@ -1,2 +1,195 @@
1
- import{base32ToNumber as e,numberToBase32 as t}from"./data/math.mjs";let n;function r(e=Date.UTC(2e3,0,1,0,0,0,0)){n=e}function i(){return n??Date.now()}function a(){return Math.floor(i()/1e3)}function o(e){return new Date(e*1e3)}function s(e){return e>999?`${(e/1e3).toFixed(1)} s`:`${e.toFixed(2)} ms`}function c(...e){for(let t of e){if(t instanceof Date)return t;if(typeof t==`string`){let e=null;if(t.includes(`:`))try{e=new Date(t)}catch{}if(!(e instanceof Date)){let n=/(\d\d\d\d)-(\d\d)-(\d\d)/.exec(t);n&&(e=new Date(+n[1],n[2]-1,+n[3],12,0))}if(e instanceof Date)return e}}}function l(){return typeof performance<`u`?performance.now():Date.now()}function u(){let e=l();return function(){return s(l()-e)}}function d(e){return new Date(e.getUTCFullYear(),e.getUTCMonth(),e.getUTCDate(),e.getUTCHours(),e.getUTCMinutes(),e.getUTCSeconds(),e.getUTCMilliseconds())}function f(e){return new Date(Date.UTC(e.getFullYear(),e.getMonth(),e.getDate(),e.getHours(),e.getMinutes(),e.getSeconds(),e.getMilliseconds()))}function p(e,t=!0){return e<=0?0:t&&e<0xe8d4a51000?e:Math.floor(e/1e3)}function m(e,t=!0){return e<=0?0:t&&e>0xe8d4a51000?e:Math.floor(e*1e3)}const h=31536e6,g=31536e3,_=2592e6,v=2592e3,y=6048e5,b=604800,x=864e5,S=86400,C=36e5,w=3600,T=6e4,E=60,D=1735686e3;function O(){return t(Math.floor((a()-D)/5),6)}function k(t){return D+e(t)*5}export{x as TIME_DAY_MS,S as TIME_DAY_S,C as TIME_HOUR_MS,w as TIME_HOUR_S,T as TIME_MINUTE_MS,E as TIME_MINUTE_S,_ as TIME_MONTH_MS,v as TIME_MONTH_S,y as TIME_WEEK_MS,b as TIME_WEEK_S,h as TIME_YEAR_MS,g as TIME_YEAR_S,o as dateFromSeconds,d as datetimeToLocal,f as datetimeToUTC,u as duration,s as formatMilliseconds,O as getBuildNumber,l as getPerformanceTimestamp,k as getSecondsFromBuildNumber,i as getTimestamp,a as getTimestampInSeconds,c as parseDate,r as setTimestampTest,p as timestampMillisecondsToSeconds,m as timestampSecondsToMilliseconds};
1
+ import { base32ToNumber, numberToBase32 } from "./data/math.mjs";
2
+
3
+ //#region src/common/time.ts
4
+ let testModeTime;
5
+ /**
6
+ * Set a fixed timestamp (ms since epoch) used by `getTimestamp` for tests.
7
+ *
8
+ * Pass a millisecond timestamp (for example created with Date.UTC) to force
9
+ * time-based helpers to return deterministic values during tests.
10
+ *
11
+ * @param ts - timestamp in milliseconds (defaults to 2000-01-01T00:00:00.000Z)
12
+ */
13
+ function setTimestampTest(ts = Date.UTC(2e3, 0, 1, 0, 0, 0, 0)) {
14
+ testModeTime = ts;
15
+ }
16
+ /**
17
+ * Return the current timestamp in milliseconds.
18
+ *
19
+ * In test mode (when `setTimestampTest` was called) the forced value is
20
+ * returned instead of the real current time.
21
+ *
22
+ * @returns timestamp in milliseconds
23
+ */
24
+ function getTimestamp() {
25
+ return testModeTime ?? Date.now();
26
+ }
27
+ /**
28
+ * Return the current timestamp in seconds.
29
+ *
30
+ * Uses `getTimestamp()` which can be overridden for tests with
31
+ * `setTimestampTest`.
32
+ *
33
+ * @returns timestamp in whole seconds (integer)
34
+ */
35
+ function getTimestampInSeconds() {
36
+ return Math.floor(getTimestamp() / 1e3);
37
+ }
38
+ /**
39
+ * Convert a UNIX timestamp in seconds to a JavaScript Date.
40
+ *
41
+ * @param ts - seconds since epoch
42
+ * @returns Date instance corresponding to the provided seconds
43
+ */
44
+ function dateFromSeconds(ts) {
45
+ return /* @__PURE__ */ new Date(ts * 1e3);
46
+ }
47
+ /**
48
+ * Format a millisecond duration into a human readable string.
49
+ *
50
+ * - Values >= 1000ms are shown in seconds with one decimal (e.g. "1.2 s").
51
+ * - Smaller values are shown in milliseconds with two decimals (e.g. "123.45 ms").
52
+ *
53
+ * @param ms - duration in milliseconds
54
+ * @returns formatted duration string
55
+ */
56
+ function formatMilliseconds(ms) {
57
+ return ms > 999 ? `${(ms / 1e3).toFixed(1)} s` : `${ms.toFixed(2)} ms`;
58
+ }
59
+ /**
60
+ * Parses the given date candidates and returns the first valid Date object found.
61
+ *
62
+ * @param dateCandidates - The date candidates to parse, which can be either strings or Date objects.
63
+ * @returns The parsed Date object, or undefined if no valid date is found.
64
+ */
65
+ function parseDate(...dateCandidates) {
66
+ for (const dateCandidate of dateCandidates) {
67
+ if (dateCandidate instanceof Date) return dateCandidate;
68
+ if (typeof dateCandidate === "string") {
69
+ let date = null;
70
+ if (dateCandidate.includes(":")) try {
71
+ date = new Date(dateCandidate);
72
+ } catch (err) {}
73
+ if (!(date instanceof Date)) {
74
+ const m = /(\d\d\d\d)-(\d\d)-(\d\d)/.exec(dateCandidate);
75
+ if (m) date = new Date(+m[1], +m[2] - 1, +m[3], 12, 0);
76
+ }
77
+ if (date instanceof Date) return date;
78
+ }
79
+ }
80
+ }
81
+ /**
82
+ * Return a high-resolution timestamp in milliseconds.
83
+ *
84
+ * Uses the `performance.now()` clock when available (monotonic, high
85
+ * resolution), otherwise falls back to `Date.now()`.
86
+ *
87
+ * @returns timestamp in milliseconds (relative for performance.now, epoch for Date.now)
88
+ */
89
+ function getPerformanceTimestamp() {
90
+ return typeof performance !== "undefined" ? performance.now() : Date.now();
91
+ }
92
+ /**
93
+ * Create a simple duration reporter.
94
+ *
95
+ * Returns a function that, when called, reports the elapsed time since
96
+ * `duration()` was called. The returned string is formatted via
97
+ * `formatMilliseconds`.
98
+ *
99
+ * Example: const t = duration(); // do work...; console.log(t());
100
+ *
101
+ * @returns a zero-argument function that returns the elapsed time string
102
+ */
103
+ function duration() {
104
+ const t0 = getPerformanceTimestamp();
105
+ return function() {
106
+ return formatMilliseconds(getPerformanceTimestamp() - t0);
107
+ };
108
+ }
109
+ /**
110
+ * If you parsed a date string that didn't include a time zone, adjust the
111
+ * naive UTC components into a local Date with the same Y/M/D/H/M/S values.
112
+ *
113
+ * This effectively treats the input as if it already represented local time
114
+ * and builds a corresponding Date using the local timezone.
115
+ */
116
+ function datetimeToLocal(fromDate) {
117
+ return new Date(fromDate.getUTCFullYear(), fromDate.getUTCMonth(), fromDate.getUTCDate(), fromDate.getUTCHours(), fromDate.getUTCMinutes(), fromDate.getUTCSeconds(), fromDate.getUTCMilliseconds());
118
+ }
119
+ /**
120
+ * If you parsed a date string that didn't include a time zone, adjust the
121
+ * local date components into a UTC Date with the same Y/M/D/H/M/S values.
122
+ */
123
+ function datetimeToUTC(fromDate) {
124
+ return new Date(Date.UTC(fromDate.getFullYear(), fromDate.getMonth(), fromDate.getDate(), fromDate.getHours(), fromDate.getMinutes(), fromDate.getSeconds(), fromDate.getMilliseconds()));
125
+ }
126
+ /**
127
+ * Convert a timestamp in milliseconds to seconds.
128
+ *
129
+ * When `smart` is true the function will try to detect already-second
130
+ * timestamps and return them unchanged (heuristic threshold). For example,
131
+ * small numbers (< 1e12) are likely seconds and are returned as-is.
132
+ *
133
+ * @param ts - timestamp in milliseconds or seconds
134
+ * @param smart - enable heuristic detection (default: true)
135
+ * @returns timestamp in seconds
136
+ */
137
+ function timestampMillisecondsToSeconds(ts, smart = true) {
138
+ if (ts <= 0) return 0;
139
+ if (smart && ts < 0xe8d4a51000) return ts;
140
+ return Math.floor(ts / 1e3);
141
+ }
142
+ /**
143
+ * Convert a timestamp in seconds to milliseconds.
144
+ *
145
+ * When `smart` is true the function tries to detect already-millisecond
146
+ * values and returns them unchanged (heuristic threshold). Very large
147
+ * numbers (> 1e12) are assumed to already be milliseconds.
148
+ *
149
+ * @param ts - timestamp in seconds or milliseconds
150
+ * @param smart - enable heuristic detection (default: true)
151
+ * @returns timestamp in milliseconds
152
+ */
153
+ function timestampSecondsToMilliseconds(ts, smart = true) {
154
+ if (ts <= 0) return 0;
155
+ if (smart && ts > 0xe8d4a51000) return ts;
156
+ return Math.floor(ts * 1e3);
157
+ }
158
+ /** Number of milliseconds in (approx.) one year (365 days). */
159
+ const TIME_YEAR_MS = 31536e6;
160
+ /** Number of seconds in (approx.) one year (365 days). */
161
+ const TIME_YEAR_S = 31536e3;
162
+ /** Number of milliseconds in (approx.) one month (30 days). */
163
+ const TIME_MONTH_MS = 2592e6;
164
+ /** Number of seconds in (approx.) one month (30 days). */
165
+ const TIME_MONTH_S = 2592e3;
166
+ /** Number of milliseconds in one week (7 days). */
167
+ const TIME_WEEK_MS = 6048e5;
168
+ /** Number of seconds in one week (7 days). */
169
+ const TIME_WEEK_S = 604800;
170
+ /** Number of milliseconds in one day (24 hours). */
171
+ const TIME_DAY_MS = 864e5;
172
+ /** Number of seconds in one day (24 hours). */
173
+ const TIME_DAY_S = 86400;
174
+ /** Number of milliseconds in one hour (60 minutes). */
175
+ const TIME_HOUR_MS = 36e5;
176
+ /** Number of seconds in one hour (60 minutes). */
177
+ const TIME_HOUR_S = 3600;
178
+ /** Number of milliseconds in one minute (60 seconds). */
179
+ const TIME_MINUTE_MS = 6e4;
180
+ /** Number of seconds in one minute (60 seconds). */
181
+ const TIME_MINUTE_S = 60;
182
+ const buildNumberSeconds = 5;
183
+ const buildNumberPadding = 6;
184
+ const buildStartSeconds = 1735686e3;
185
+ /** Build number is minutes since 2025-01-01 in base32 "agnoster" encoded format */
186
+ function getBuildNumber() {
187
+ return numberToBase32(Math.floor((getTimestampInSeconds() - buildStartSeconds) / buildNumberSeconds), buildNumberPadding);
188
+ }
189
+ function getSecondsFromBuildNumber(buildNumber) {
190
+ return buildStartSeconds + base32ToNumber(buildNumber) * buildNumberSeconds;
191
+ }
192
+
193
+ //#endregion
194
+ export { TIME_DAY_MS, TIME_DAY_S, TIME_HOUR_MS, TIME_HOUR_S, TIME_MINUTE_MS, TIME_MINUTE_S, TIME_MONTH_MS, TIME_MONTH_S, TIME_WEEK_MS, TIME_WEEK_S, TIME_YEAR_MS, TIME_YEAR_S, dateFromSeconds, datetimeToLocal, datetimeToUTC, duration, formatMilliseconds, getBuildNumber, getPerformanceTimestamp, getSecondsFromBuildNumber, getTimestamp, getTimestampInSeconds, parseDate, setTimestampTest, timestampMillisecondsToSeconds, timestampSecondsToMilliseconds };
2
195
  //# sourceMappingURL=time.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"time.mjs","names":[],"sources":["../../src/common/time.ts"],"sourcesContent":["import { base32ToNumber, numberToBase32 } from './data/math'\n\nlet testModeTime: number | undefined\n\n/**\n * Set a fixed timestamp (ms since epoch) used by `getTimestamp` for tests.\n *\n * Pass a millisecond timestamp (for example created with Date.UTC) to force\n * time-based helpers to return deterministic values during tests.\n *\n * @param ts - timestamp in milliseconds (defaults to 2000-01-01T00:00:00.000Z)\n */\nexport function setTimestampTest(ts = Date.UTC(2000, 0, 1, 0, 0, 0, 0)) {\n testModeTime = ts\n}\n\n/**\n * Return the current timestamp in milliseconds.\n *\n * In test mode (when `setTimestampTest` was called) the forced value is\n * returned instead of the real current time.\n *\n * @returns timestamp in milliseconds\n */\nexport function getTimestamp(): number {\n return testModeTime ?? Date.now()\n}\n\n/**\n * Return the current timestamp in seconds.\n *\n * Uses `getTimestamp()` which can be overridden for tests with\n * `setTimestampTest`.\n *\n * @returns timestamp in whole seconds (integer)\n */\nexport function getTimestampInSeconds(): number {\n return Math.floor(getTimestamp() / 1000)\n}\n\n/**\n * Convert a UNIX timestamp in seconds to a JavaScript Date.\n *\n * @param ts - seconds since epoch\n * @returns Date instance corresponding to the provided seconds\n */\nexport function dateFromSeconds(ts: number): Date {\n return new Date(ts * 1000)\n}\n\n// typeof performance !== \"undefined\" ? performance.now() : new Date().getTime()\n\n/**\n * Format a millisecond duration into a human readable string.\n *\n * - Values >= 1000ms are shown in seconds with one decimal (e.g. \"1.2 s\").\n * - Smaller values are shown in milliseconds with two decimals (e.g. \"123.45 ms\").\n *\n * @param ms - duration in milliseconds\n * @returns formatted duration string\n */\nexport function formatMilliseconds(ms: number): string {\n return ms > 999 ? `${(ms / 1000).toFixed(1)} s` : `${ms.toFixed(2)} ms`\n}\n\n/**\n * Parses the given date candidates and returns the first valid Date object found.\n *\n * @param dateCandidates - The date candidates to parse, which can be either strings or Date objects.\n * @returns The parsed Date object, or undefined if no valid date is found.\n */\nexport function parseDate(\n ...dateCandidates: (string | Date)[]\n): Date | undefined {\n for (const dateCandidate of dateCandidates) {\n if (dateCandidate instanceof Date)\n return dateCandidate\n\n if (typeof dateCandidate === 'string') {\n let date = null\n if (dateCandidate.includes(':')) {\n try {\n date = new Date(dateCandidate)\n }\n catch (err) {}\n }\n if (!(date instanceof Date)) {\n const m = /(\\d\\d\\d\\d)-(\\d\\d)-(\\d\\d)/.exec(dateCandidate)\n if (m)\n date = new Date(+m[1], +m[2] - 1, +m[3], 12, 0)\n }\n if (date instanceof Date)\n return date\n }\n }\n}\n\n/**\n * Return a high-resolution timestamp in milliseconds.\n *\n * Uses the `performance.now()` clock when available (monotonic, high\n * resolution), otherwise falls back to `Date.now()`.\n *\n * @returns timestamp in milliseconds (relative for performance.now, epoch for Date.now)\n */\nexport function getPerformanceTimestamp(): number {\n return typeof performance !== 'undefined' ? performance.now() : Date.now()\n}\n\n/**\n * Create a simple duration reporter.\n *\n * Returns a function that, when called, reports the elapsed time since\n * `duration()` was called. The returned string is formatted via\n * `formatMilliseconds`.\n *\n * Example: const t = duration(); // do work...; console.log(t());\n *\n * @returns a zero-argument function that returns the elapsed time string\n */\nexport function duration(): () => string {\n const t0 = getPerformanceTimestamp()\n\n return function (): string {\n const duration = getPerformanceTimestamp() - t0\n return formatMilliseconds(duration)\n\n // if (duration > 500)\n // return `${(duration / 1000).toFixed(4)}s`\n\n // // https://elijahmanor.com/format-js-numbers\n // // https://tc39.es/proposal-unified-intl-numberformat/section6/locales-currencies-tz_proposed_out.html#sec-issanctionedsimpleunitidentifier\n // return duration.toLocaleString('en-US', {\n // style: 'unit',\n // unit: 'millisecond',\n // notation: 'compact',\n // compactDisplay: 'long',\n // })\n }\n}\n\n/**\n * If you parsed a date string that didn't include a time zone, adjust the\n * naive UTC components into a local Date with the same Y/M/D/H/M/S values.\n *\n * This effectively treats the input as if it already represented local time\n * and builds a corresponding Date using the local timezone.\n */\nexport function datetimeToLocal(fromDate: Date): Date {\n return new Date(\n fromDate.getUTCFullYear(),\n fromDate.getUTCMonth(),\n fromDate.getUTCDate(),\n fromDate.getUTCHours(),\n fromDate.getUTCMinutes(),\n fromDate.getUTCSeconds(),\n fromDate.getUTCMilliseconds(),\n )\n}\n\n/**\n * If you parsed a date string that didn't include a time zone, adjust the\n * local date components into a UTC Date with the same Y/M/D/H/M/S values.\n */\nexport function datetimeToUTC(fromDate: Date): Date {\n return new Date(Date.UTC(\n fromDate.getFullYear(),\n fromDate.getMonth(),\n fromDate.getDate(),\n fromDate.getHours(),\n fromDate.getMinutes(),\n fromDate.getSeconds(),\n fromDate.getMilliseconds(),\n ))\n}\n\n// const tsMs2000 = 946684800000 // same as Jan 11 1970 in ms\n// const tsMs2500 = 16725225600000 // same as Jul 13 1970 in ms\n// 1000000000000\n\n/**\n * Convert a timestamp in milliseconds to seconds.\n *\n * When `smart` is true the function will try to detect already-second\n * timestamps and return them unchanged (heuristic threshold). For example,\n * small numbers (< 1e12) are likely seconds and are returned as-is.\n *\n * @param ts - timestamp in milliseconds or seconds\n * @param smart - enable heuristic detection (default: true)\n * @returns timestamp in seconds\n */\nexport function timestampMillisecondsToSeconds(ts: number, smart = true): number {\n if (ts <= 0)\n return 0\n if (smart && ts < 1000000000000) { // TODO find a better threshold and add tests\n return ts\n // log.warn('Timestamp might already be in seconds?', ts)\n }\n return Math.floor(ts / 1000)\n}\n\n/**\n * Convert a timestamp in seconds to milliseconds.\n *\n * When `smart` is true the function tries to detect already-millisecond\n * values and returns them unchanged (heuristic threshold). Very large\n * numbers (> 1e12) are assumed to already be milliseconds.\n *\n * @param ts - timestamp in seconds or milliseconds\n * @param smart - enable heuristic detection (default: true)\n * @returns timestamp in milliseconds\n */\nexport function timestampSecondsToMilliseconds(ts: number, smart = true): number {\n if (ts <= 0)\n return 0\n if (smart && ts > 1000000000000) { // TODO find a better threshold and add tests\n return ts\n // log.warn('Timestamp might already be in milliseconds?', ts)\n }\n return Math.floor(ts * 1000)\n}\n\n/** Number of milliseconds in (approx.) one year (365 days). */\nexport const TIME_YEAR_MS = 31536000000 // 365 * 24 * 60 * 60 * 1000\n/** Number of seconds in (approx.) one year (365 days). */\nexport const TIME_YEAR_S = 31536000 // 365 * 24 * 60 * 60\n/** Number of milliseconds in (approx.) one month (30 days). */\nexport const TIME_MONTH_MS = 2592000000 // 30 * 24 * 60 * 60 * 1000\n/** Number of seconds in (approx.) one month (30 days). */\nexport const TIME_MONTH_S = 2592000 // 30 * 24 * 60 * 60\n/** Number of milliseconds in one week (7 days). */\nexport const TIME_WEEK_MS = 604800000 // 7 * 24 * 60 * 60 * 1000\n/** Number of seconds in one week (7 days). */\nexport const TIME_WEEK_S = 604800 // 7 * 24 * 60 * 60\n/** Number of milliseconds in one day (24 hours). */\nexport const TIME_DAY_MS = 86400000 // 24 * 60 * 60 * 1000\n/** Number of seconds in one day (24 hours). */\nexport const TIME_DAY_S = 86400 // 24 * 60 * 60\n/** Number of milliseconds in one hour (60 minutes). */\nexport const TIME_HOUR_MS = 3600000 // 60 * 60 * 1000\n/** Number of seconds in one hour (60 minutes). */\nexport const TIME_HOUR_S = 3600 // 60 * 60\n/** Number of milliseconds in one minute (60 seconds). */\nexport const TIME_MINUTE_MS = 60000 // 60 * 1000\n/** Number of seconds in one minute (60 seconds). */\nexport const TIME_MINUTE_S = 60 // 60\n\n// BUILD NUMBER\n\nconst buildNumberSeconds = 5\nconst buildNumberPadding = 6\nconst buildStartSeconds = 1735686000 // 2025-01-01\n\n/** Build number is minutes since 2025-01-01 in base32 \"agnoster\" encoded format */\nexport function getBuildNumber(): string {\n const buildNumber = Math.floor((getTimestampInSeconds() - buildStartSeconds) / buildNumberSeconds)\n return numberToBase32(buildNumber, buildNumberPadding)\n}\n\nexport function getSecondsFromBuildNumber(buildNumber: string): number {\n return buildStartSeconds + (base32ToNumber(buildNumber) * buildNumberSeconds)\n}\n"],"mappings":"qEAEA,IAAI,EAUJ,SAAgB,EAAiB,EAAK,KAAK,IAAI,IAAM,EAAG,EAAG,EAAG,EAAG,EAAG,EAAE,CAAE,CACtE,EAAe,EAWjB,SAAgB,GAAuB,CACrC,OAAO,GAAgB,KAAK,KAAK,CAWnC,SAAgB,GAAgC,CAC9C,OAAO,KAAK,MAAM,GAAc,CAAG,IAAK,CAS1C,SAAgB,EAAgB,EAAkB,CAChD,OAAO,IAAI,KAAK,EAAK,IAAK,CAc5B,SAAgB,EAAmB,EAAoB,CACrD,OAAO,EAAK,IAAM,IAAI,EAAK,KAAM,QAAQ,EAAE,CAAC,IAAM,GAAG,EAAG,QAAQ,EAAE,CAAC,KASrE,SAAgB,EACd,GAAG,EACe,CAClB,IAAK,IAAM,KAAiB,EAAgB,CAC1C,GAAI,aAAyB,KAC3B,OAAO,EAET,GAAI,OAAO,GAAkB,SAAU,CACrC,IAAI,EAAO,KACX,GAAI,EAAc,SAAS,IAAI,CAC7B,GAAI,CACF,EAAO,IAAI,KAAK,EAAc,MAEpB,EAEd,GAAI,EAAE,aAAgB,MAAO,CAC3B,IAAM,EAAI,2BAA2B,KAAK,EAAc,CACpD,IACF,EAAO,IAAI,KAAK,CAAC,EAAE,GAAK,EAAE,GAAK,EAAG,CAAC,EAAE,GAAI,GAAI,EAAE,EAEnD,GAAI,aAAgB,KAClB,OAAO,IAaf,SAAgB,GAAkC,CAChD,OAAO,OAAO,YAAgB,IAAc,YAAY,KAAK,CAAG,KAAK,KAAK,CAc5E,SAAgB,GAAyB,CACvC,IAAM,EAAK,GAAyB,CAEpC,OAAO,UAAoB,CAEzB,OAAO,EADU,GAAyB,CAAG,EACV,EAuBvC,SAAgB,EAAgB,EAAsB,CACpD,OAAO,IAAI,KACT,EAAS,gBAAgB,CACzB,EAAS,aAAa,CACtB,EAAS,YAAY,CACrB,EAAS,aAAa,CACtB,EAAS,eAAe,CACxB,EAAS,eAAe,CACxB,EAAS,oBAAoB,CAC9B,CAOH,SAAgB,EAAc,EAAsB,CAClD,OAAO,IAAI,KAAK,KAAK,IACnB,EAAS,aAAa,CACtB,EAAS,UAAU,CACnB,EAAS,SAAS,CAClB,EAAS,UAAU,CACnB,EAAS,YAAY,CACrB,EAAS,YAAY,CACrB,EAAS,iBAAiB,CAC3B,CAAC,CAkBJ,SAAgB,EAA+B,EAAY,EAAQ,GAAc,CAO/E,OANI,GAAM,EACD,EACL,GAAS,EAAK,aACT,EAGF,KAAK,MAAM,EAAK,IAAK,CAc9B,SAAgB,EAA+B,EAAY,EAAQ,GAAc,CAO/E,OANI,GAAM,EACD,EACL,GAAS,EAAK,aACT,EAGF,KAAK,MAAM,EAAK,IAAK,CAI9B,MAAa,EAAe,QAEf,EAAc,QAEd,EAAgB,OAEhB,EAAe,OAEf,EAAe,OAEf,EAAc,OAEd,EAAc,MAEd,EAAa,MAEb,EAAe,KAEf,EAAc,KAEd,EAAiB,IAEjB,EAAgB,GAMvB,EAAoB,UAG1B,SAAgB,GAAyB,CAEvC,OAAO,EADa,KAAK,OAAO,GAAuB,CAAG,GAAqB,EAAmB,CAC/D,EAAmB,CAGxD,SAAgB,EAA0B,EAA6B,CACrE,OAAO,EAAqB,EAAe,EAAY,CAAG"}
1
+ {"version":3,"file":"time.mjs","names":[],"sources":["../../src/common/time.ts"],"sourcesContent":["import { base32ToNumber, numberToBase32 } from './data/math'\n\nlet testModeTime: number | undefined\n\n/**\n * Set a fixed timestamp (ms since epoch) used by `getTimestamp` for tests.\n *\n * Pass a millisecond timestamp (for example created with Date.UTC) to force\n * time-based helpers to return deterministic values during tests.\n *\n * @param ts - timestamp in milliseconds (defaults to 2000-01-01T00:00:00.000Z)\n */\nexport function setTimestampTest(ts = Date.UTC(2000, 0, 1, 0, 0, 0, 0)) {\n testModeTime = ts\n}\n\n/**\n * Return the current timestamp in milliseconds.\n *\n * In test mode (when `setTimestampTest` was called) the forced value is\n * returned instead of the real current time.\n *\n * @returns timestamp in milliseconds\n */\nexport function getTimestamp(): number {\n return testModeTime ?? Date.now()\n}\n\n/**\n * Return the current timestamp in seconds.\n *\n * Uses `getTimestamp()` which can be overridden for tests with\n * `setTimestampTest`.\n *\n * @returns timestamp in whole seconds (integer)\n */\nexport function getTimestampInSeconds(): number {\n return Math.floor(getTimestamp() / 1000)\n}\n\n/**\n * Convert a UNIX timestamp in seconds to a JavaScript Date.\n *\n * @param ts - seconds since epoch\n * @returns Date instance corresponding to the provided seconds\n */\nexport function dateFromSeconds(ts: number): Date {\n return new Date(ts * 1000)\n}\n\n// typeof performance !== \"undefined\" ? performance.now() : new Date().getTime()\n\n/**\n * Format a millisecond duration into a human readable string.\n *\n * - Values >= 1000ms are shown in seconds with one decimal (e.g. \"1.2 s\").\n * - Smaller values are shown in milliseconds with two decimals (e.g. \"123.45 ms\").\n *\n * @param ms - duration in milliseconds\n * @returns formatted duration string\n */\nexport function formatMilliseconds(ms: number): string {\n return ms > 999 ? `${(ms / 1000).toFixed(1)} s` : `${ms.toFixed(2)} ms`\n}\n\n/**\n * Parses the given date candidates and returns the first valid Date object found.\n *\n * @param dateCandidates - The date candidates to parse, which can be either strings or Date objects.\n * @returns The parsed Date object, or undefined if no valid date is found.\n */\nexport function parseDate(\n ...dateCandidates: (string | Date)[]\n): Date | undefined {\n for (const dateCandidate of dateCandidates) {\n if (dateCandidate instanceof Date)\n return dateCandidate\n\n if (typeof dateCandidate === 'string') {\n let date = null\n if (dateCandidate.includes(':')) {\n try {\n date = new Date(dateCandidate)\n }\n catch (err) {}\n }\n if (!(date instanceof Date)) {\n const m = /(\\d\\d\\d\\d)-(\\d\\d)-(\\d\\d)/.exec(dateCandidate)\n if (m)\n date = new Date(+m[1], +m[2] - 1, +m[3], 12, 0)\n }\n if (date instanceof Date)\n return date\n }\n }\n}\n\n/**\n * Return a high-resolution timestamp in milliseconds.\n *\n * Uses the `performance.now()` clock when available (monotonic, high\n * resolution), otherwise falls back to `Date.now()`.\n *\n * @returns timestamp in milliseconds (relative for performance.now, epoch for Date.now)\n */\nexport function getPerformanceTimestamp(): number {\n return typeof performance !== 'undefined' ? performance.now() : Date.now()\n}\n\n/**\n * Create a simple duration reporter.\n *\n * Returns a function that, when called, reports the elapsed time since\n * `duration()` was called. The returned string is formatted via\n * `formatMilliseconds`.\n *\n * Example: const t = duration(); // do work...; console.log(t());\n *\n * @returns a zero-argument function that returns the elapsed time string\n */\nexport function duration(): () => string {\n const t0 = getPerformanceTimestamp()\n\n return function (): string {\n const duration = getPerformanceTimestamp() - t0\n return formatMilliseconds(duration)\n\n // if (duration > 500)\n // return `${(duration / 1000).toFixed(4)}s`\n\n // // https://elijahmanor.com/format-js-numbers\n // // https://tc39.es/proposal-unified-intl-numberformat/section6/locales-currencies-tz_proposed_out.html#sec-issanctionedsimpleunitidentifier\n // return duration.toLocaleString('en-US', {\n // style: 'unit',\n // unit: 'millisecond',\n // notation: 'compact',\n // compactDisplay: 'long',\n // })\n }\n}\n\n/**\n * If you parsed a date string that didn't include a time zone, adjust the\n * naive UTC components into a local Date with the same Y/M/D/H/M/S values.\n *\n * This effectively treats the input as if it already represented local time\n * and builds a corresponding Date using the local timezone.\n */\nexport function datetimeToLocal(fromDate: Date): Date {\n return new Date(\n fromDate.getUTCFullYear(),\n fromDate.getUTCMonth(),\n fromDate.getUTCDate(),\n fromDate.getUTCHours(),\n fromDate.getUTCMinutes(),\n fromDate.getUTCSeconds(),\n fromDate.getUTCMilliseconds(),\n )\n}\n\n/**\n * If you parsed a date string that didn't include a time zone, adjust the\n * local date components into a UTC Date with the same Y/M/D/H/M/S values.\n */\nexport function datetimeToUTC(fromDate: Date): Date {\n return new Date(Date.UTC(\n fromDate.getFullYear(),\n fromDate.getMonth(),\n fromDate.getDate(),\n fromDate.getHours(),\n fromDate.getMinutes(),\n fromDate.getSeconds(),\n fromDate.getMilliseconds(),\n ))\n}\n\n// const tsMs2000 = 946684800000 // same as Jan 11 1970 in ms\n// const tsMs2500 = 16725225600000 // same as Jul 13 1970 in ms\n// 1000000000000\n\n/**\n * Convert a timestamp in milliseconds to seconds.\n *\n * When `smart` is true the function will try to detect already-second\n * timestamps and return them unchanged (heuristic threshold). For example,\n * small numbers (< 1e12) are likely seconds and are returned as-is.\n *\n * @param ts - timestamp in milliseconds or seconds\n * @param smart - enable heuristic detection (default: true)\n * @returns timestamp in seconds\n */\nexport function timestampMillisecondsToSeconds(ts: number, smart = true): number {\n if (ts <= 0)\n return 0\n if (smart && ts < 1000000000000) { // TODO find a better threshold and add tests\n return ts\n // log.warn('Timestamp might already be in seconds?', ts)\n }\n return Math.floor(ts / 1000)\n}\n\n/**\n * Convert a timestamp in seconds to milliseconds.\n *\n * When `smart` is true the function tries to detect already-millisecond\n * values and returns them unchanged (heuristic threshold). Very large\n * numbers (> 1e12) are assumed to already be milliseconds.\n *\n * @param ts - timestamp in seconds or milliseconds\n * @param smart - enable heuristic detection (default: true)\n * @returns timestamp in milliseconds\n */\nexport function timestampSecondsToMilliseconds(ts: number, smart = true): number {\n if (ts <= 0)\n return 0\n if (smart && ts > 1000000000000) { // TODO find a better threshold and add tests\n return ts\n // log.warn('Timestamp might already be in milliseconds?', ts)\n }\n return Math.floor(ts * 1000)\n}\n\n/** Number of milliseconds in (approx.) one year (365 days). */\nexport const TIME_YEAR_MS = 31536000000 // 365 * 24 * 60 * 60 * 1000\n/** Number of seconds in (approx.) one year (365 days). */\nexport const TIME_YEAR_S = 31536000 // 365 * 24 * 60 * 60\n/** Number of milliseconds in (approx.) one month (30 days). */\nexport const TIME_MONTH_MS = 2592000000 // 30 * 24 * 60 * 60 * 1000\n/** Number of seconds in (approx.) one month (30 days). */\nexport const TIME_MONTH_S = 2592000 // 30 * 24 * 60 * 60\n/** Number of milliseconds in one week (7 days). */\nexport const TIME_WEEK_MS = 604800000 // 7 * 24 * 60 * 60 * 1000\n/** Number of seconds in one week (7 days). */\nexport const TIME_WEEK_S = 604800 // 7 * 24 * 60 * 60\n/** Number of milliseconds in one day (24 hours). */\nexport const TIME_DAY_MS = 86400000 // 24 * 60 * 60 * 1000\n/** Number of seconds in one day (24 hours). */\nexport const TIME_DAY_S = 86400 // 24 * 60 * 60\n/** Number of milliseconds in one hour (60 minutes). */\nexport const TIME_HOUR_MS = 3600000 // 60 * 60 * 1000\n/** Number of seconds in one hour (60 minutes). */\nexport const TIME_HOUR_S = 3600 // 60 * 60\n/** Number of milliseconds in one minute (60 seconds). */\nexport const TIME_MINUTE_MS = 60000 // 60 * 1000\n/** Number of seconds in one minute (60 seconds). */\nexport const TIME_MINUTE_S = 60 // 60\n\n// BUILD NUMBER\n\nconst buildNumberSeconds = 5\nconst buildNumberPadding = 6\nconst buildStartSeconds = 1735686000 // 2025-01-01\n\n/** Build number is minutes since 2025-01-01 in base32 \"agnoster\" encoded format */\nexport function getBuildNumber(): string {\n const buildNumber = Math.floor((getTimestampInSeconds() - buildStartSeconds) / buildNumberSeconds)\n return numberToBase32(buildNumber, buildNumberPadding)\n}\n\nexport function getSecondsFromBuildNumber(buildNumber: string): number {\n return buildStartSeconds + (base32ToNumber(buildNumber) * buildNumberSeconds)\n}\n"],"mappings":";;;AAEA,IAAI;;;;;;;;;AAUJ,SAAgB,iBAAiB,KAAK,KAAK,IAAI,KAAM,GAAG,GAAG,GAAG,GAAG,GAAG,EAAE,EAAE;AACtE,gBAAe;;;;;;;;;;AAWjB,SAAgB,eAAuB;AACrC,QAAO,gBAAgB,KAAK,KAAK;;;;;;;;;;AAWnC,SAAgB,wBAAgC;AAC9C,QAAO,KAAK,MAAM,cAAc,GAAG,IAAK;;;;;;;;AAS1C,SAAgB,gBAAgB,IAAkB;AAChD,wBAAO,IAAI,KAAK,KAAK,IAAK;;;;;;;;;;;AAc5B,SAAgB,mBAAmB,IAAoB;AACrD,QAAO,KAAK,MAAM,IAAI,KAAK,KAAM,QAAQ,EAAE,CAAC,MAAM,GAAG,GAAG,QAAQ,EAAE,CAAC;;;;;;;;AASrE,SAAgB,UACd,GAAG,gBACe;AAClB,MAAK,MAAM,iBAAiB,gBAAgB;AAC1C,MAAI,yBAAyB,KAC3B,QAAO;AAET,MAAI,OAAO,kBAAkB,UAAU;GACrC,IAAI,OAAO;AACX,OAAI,cAAc,SAAS,IAAI,CAC7B,KAAI;AACF,WAAO,IAAI,KAAK,cAAc;YAEzB,KAAK;AAEd,OAAI,EAAE,gBAAgB,OAAO;IAC3B,MAAM,IAAI,2BAA2B,KAAK,cAAc;AACxD,QAAI,EACF,QAAO,IAAI,KAAK,CAAC,EAAE,IAAI,CAAC,EAAE,KAAK,GAAG,CAAC,EAAE,IAAI,IAAI,EAAE;;AAEnD,OAAI,gBAAgB,KAClB,QAAO;;;;;;;;;;;;AAaf,SAAgB,0BAAkC;AAChD,QAAO,OAAO,gBAAgB,cAAc,YAAY,KAAK,GAAG,KAAK,KAAK;;;;;;;;;;;;;AAc5E,SAAgB,WAAyB;CACvC,MAAM,KAAK,yBAAyB;AAEpC,QAAO,WAAoB;AAEzB,SAAO,mBADU,yBAAyB,GAAG,GACV;;;;;;;;;;AAuBvC,SAAgB,gBAAgB,UAAsB;AACpD,QAAO,IAAI,KACT,SAAS,gBAAgB,EACzB,SAAS,aAAa,EACtB,SAAS,YAAY,EACrB,SAAS,aAAa,EACtB,SAAS,eAAe,EACxB,SAAS,eAAe,EACxB,SAAS,oBAAoB,CAC9B;;;;;;AAOH,SAAgB,cAAc,UAAsB;AAClD,QAAO,IAAI,KAAK,KAAK,IACnB,SAAS,aAAa,EACtB,SAAS,UAAU,EACnB,SAAS,SAAS,EAClB,SAAS,UAAU,EACnB,SAAS,YAAY,EACrB,SAAS,YAAY,EACrB,SAAS,iBAAiB,CAC3B,CAAC;;;;;;;;;;;;;AAkBJ,SAAgB,+BAA+B,IAAY,QAAQ,MAAc;AAC/E,KAAI,MAAM,EACR,QAAO;AACT,KAAI,SAAS,KAAK,aAChB,QAAO;AAGT,QAAO,KAAK,MAAM,KAAK,IAAK;;;;;;;;;;;;;AAc9B,SAAgB,+BAA+B,IAAY,QAAQ,MAAc;AAC/E,KAAI,MAAM,EACR,QAAO;AACT,KAAI,SAAS,KAAK,aAChB,QAAO;AAGT,QAAO,KAAK,MAAM,KAAK,IAAK;;;AAI9B,MAAa,eAAe;;AAE5B,MAAa,cAAc;;AAE3B,MAAa,gBAAgB;;AAE7B,MAAa,eAAe;;AAE5B,MAAa,eAAe;;AAE5B,MAAa,cAAc;;AAE3B,MAAa,cAAc;;AAE3B,MAAa,aAAa;;AAE1B,MAAa,eAAe;;AAE5B,MAAa,cAAc;;AAE3B,MAAa,iBAAiB;;AAE9B,MAAa,gBAAgB;AAI7B,MAAM,qBAAqB;AAC3B,MAAM,qBAAqB;AAC3B,MAAM,oBAAoB;;AAG1B,SAAgB,iBAAyB;AAEvC,QAAO,eADa,KAAK,OAAO,uBAAuB,GAAG,qBAAqB,mBAAmB,EAC/D,mBAAmB;;AAGxD,SAAgB,0BAA0B,aAA6B;AACrE,QAAO,oBAAqB,eAAe,YAAY,GAAG"}
@@ -1,2 +1,28 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});function e(e,t=0,n=!1){let r,i=()=>{clearTimeout(r),r=void 0};return r=setTimeout(()=>{e(),i()},t),n&&r.unref?.(),i}exports.safeTimeout=e;
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+
3
+ //#region src/common/timeout.ts
4
+ /**
5
+ * Slightliy enhanced setTimeout to avoid garbage collection issues.
6
+ * Returns a dispose function.
7
+ *
8
+ * Discussion see
9
+ * https://jakearchibald.com/2024/garbage-collection-and-closures/
10
+ * https://news.ycombinator.com/item?id=41111062
11
+ */
12
+ function safeTimeout(fn, delay = 0, unref = false) {
13
+ let timerId;
14
+ const disposeTimer = () => {
15
+ clearTimeout(timerId);
16
+ timerId = void 0;
17
+ };
18
+ timerId = setTimeout(() => {
19
+ fn();
20
+ disposeTimer();
21
+ }, delay);
22
+ if (unref) timerId.unref?.();
23
+ return disposeTimer;
24
+ }
25
+
26
+ //#endregion
27
+ exports.safeTimeout = safeTimeout;
2
28
  //# sourceMappingURL=timeout.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"timeout.cjs","names":[],"sources":["../../src/common/timeout.ts"],"sourcesContent":["/**\n * Slightliy enhanced setTimeout to avoid garbage collection issues.\n * Returns a dispose function.\n *\n * Discussion see\n * https://jakearchibald.com/2024/garbage-collection-and-closures/\n * https://news.ycombinator.com/item?id=41111062\n */\nexport function safeTimeout(fn: () => void, delay = 0, unref = false): () => void {\n let timerId: any\n\n const disposeTimer = () => {\n clearTimeout(timerId)\n timerId = undefined\n }\n\n timerId = setTimeout(() => {\n fn()\n disposeTimer()\n }, delay)\n\n if (unref)\n timerId.unref?.()\n\n return disposeTimer\n}\n"],"mappings":"mEAQA,SAAgB,EAAY,EAAgB,EAAQ,EAAG,EAAQ,GAAmB,CAChF,IAAI,EAEE,MAAqB,CACzB,aAAa,EAAQ,CACrB,EAAU,IAAA,IAWZ,MARA,GAAU,eAAiB,CACzB,GAAI,CACJ,GAAc,EACb,EAAM,CAEL,GACF,EAAQ,SAAS,CAEZ"}
1
+ {"version":3,"file":"timeout.cjs","names":[],"sources":["../../src/common/timeout.ts"],"sourcesContent":["/**\n * Slightliy enhanced setTimeout to avoid garbage collection issues.\n * Returns a dispose function.\n *\n * Discussion see\n * https://jakearchibald.com/2024/garbage-collection-and-closures/\n * https://news.ycombinator.com/item?id=41111062\n */\nexport function safeTimeout(fn: () => void, delay = 0, unref = false): () => void {\n let timerId: any\n\n const disposeTimer = () => {\n clearTimeout(timerId)\n timerId = undefined\n }\n\n timerId = setTimeout(() => {\n fn()\n disposeTimer()\n }, delay)\n\n if (unref)\n timerId.unref?.()\n\n return disposeTimer\n}\n"],"mappings":";;;;;;;;;;;AAQA,SAAgB,YAAY,IAAgB,QAAQ,GAAG,QAAQ,OAAmB;CAChF,IAAI;CAEJ,MAAM,qBAAqB;AACzB,eAAa,QAAQ;AACrB,YAAU;;AAGZ,WAAU,iBAAiB;AACzB,MAAI;AACJ,gBAAc;IACb,MAAM;AAET,KAAI,MACF,SAAQ,SAAS;AAEnB,QAAO"}
@@ -1,2 +1,26 @@
1
- function e(e,t=0,n=!1){let r,i=()=>{clearTimeout(r),r=void 0};return r=setTimeout(()=>{e(),i()},t),n&&r.unref?.(),i}export{e as safeTimeout};
1
+ //#region src/common/timeout.ts
2
+ /**
3
+ * Slightliy enhanced setTimeout to avoid garbage collection issues.
4
+ * Returns a dispose function.
5
+ *
6
+ * Discussion see
7
+ * https://jakearchibald.com/2024/garbage-collection-and-closures/
8
+ * https://news.ycombinator.com/item?id=41111062
9
+ */
10
+ function safeTimeout(fn, delay = 0, unref = false) {
11
+ let timerId;
12
+ const disposeTimer = () => {
13
+ clearTimeout(timerId);
14
+ timerId = void 0;
15
+ };
16
+ timerId = setTimeout(() => {
17
+ fn();
18
+ disposeTimer();
19
+ }, delay);
20
+ if (unref) timerId.unref?.();
21
+ return disposeTimer;
22
+ }
23
+
24
+ //#endregion
25
+ export { safeTimeout };
2
26
  //# sourceMappingURL=timeout.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"timeout.mjs","names":[],"sources":["../../src/common/timeout.ts"],"sourcesContent":["/**\n * Slightliy enhanced setTimeout to avoid garbage collection issues.\n * Returns a dispose function.\n *\n * Discussion see\n * https://jakearchibald.com/2024/garbage-collection-and-closures/\n * https://news.ycombinator.com/item?id=41111062\n */\nexport function safeTimeout(fn: () => void, delay = 0, unref = false): () => void {\n let timerId: any\n\n const disposeTimer = () => {\n clearTimeout(timerId)\n timerId = undefined\n }\n\n timerId = setTimeout(() => {\n fn()\n disposeTimer()\n }, delay)\n\n if (unref)\n timerId.unref?.()\n\n return disposeTimer\n}\n"],"mappings":"AAQA,SAAgB,EAAY,EAAgB,EAAQ,EAAG,EAAQ,GAAmB,CAChF,IAAI,EAEE,MAAqB,CACzB,aAAa,EAAQ,CACrB,EAAU,IAAA,IAWZ,MARA,GAAU,eAAiB,CACzB,GAAI,CACJ,GAAc,EACb,EAAM,CAEL,GACF,EAAQ,SAAS,CAEZ"}
1
+ {"version":3,"file":"timeout.mjs","names":[],"sources":["../../src/common/timeout.ts"],"sourcesContent":["/**\n * Slightliy enhanced setTimeout to avoid garbage collection issues.\n * Returns a dispose function.\n *\n * Discussion see\n * https://jakearchibald.com/2024/garbage-collection-and-closures/\n * https://news.ycombinator.com/item?id=41111062\n */\nexport function safeTimeout(fn: () => void, delay = 0, unref = false): () => void {\n let timerId: any\n\n const disposeTimer = () => {\n clearTimeout(timerId)\n timerId = undefined\n }\n\n timerId = setTimeout(() => {\n fn()\n disposeTimer()\n }, delay)\n\n if (unref)\n timerId.unref?.()\n\n return disposeTimer\n}\n"],"mappings":";;;;;;;;;AAQA,SAAgB,YAAY,IAAgB,QAAQ,GAAG,QAAQ,OAAmB;CAChF,IAAI;CAEJ,MAAM,qBAAqB;AACzB,eAAa,QAAQ;AACrB,YAAU;;AAGZ,WAAU,iBAAiB;AACzB,MAAI;AACJ,gBAAc;IACb,MAAM;AAET,KAAI,MACF,SAAQ,SAAS;AAEnB,QAAO"}
@@ -1 +1 @@
1
- export{};
1
+ export { };
@@ -1,2 +1,8 @@
1
- Object.defineProperty(exports,Symbol.toStringTag,{value:`Module`});function e(){}exports.noop=e;
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
2
+
3
+ //#region src/common/utils.ts
4
+ function noop() {}
5
+
6
+ //#endregion
7
+ exports.noop = noop;
2
8
  //# sourceMappingURL=utils.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.cjs","names":[],"sources":["../../src/common/utils.ts"],"sourcesContent":["export function noop() { }\n"],"mappings":"mEAAA,SAAgB,GAAO"}
1
+ {"version":3,"file":"utils.cjs","names":[],"sources":["../../src/common/utils.ts"],"sourcesContent":["export function noop() { }\n"],"mappings":";;;AAAA,SAAgB,OAAO"}
@@ -1,2 +1,6 @@
1
- function e(){}export{e as noop};
1
+ //#region src/common/utils.ts
2
+ function noop() {}
3
+
4
+ //#endregion
5
+ export { noop };
2
6
  //# sourceMappingURL=utils.mjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"utils.mjs","names":[],"sources":["../../src/common/utils.ts"],"sourcesContent":["export function noop() { }\n"],"mappings":"AAAA,SAAgB,GAAO"}
1
+ {"version":3,"file":"utils.mjs","names":[],"sources":["../../src/common/utils.ts"],"sourcesContent":["export function noop() { }\n"],"mappings":";AAAA,SAAgB,OAAO"}