@kdtlabs/utils 0.0.4 → 0.0.6

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 (454) hide show
  1. package/SKILL.md +12 -9
  2. package/dist/arrays/comparators.d.ts +8 -0
  3. package/dist/arrays/comparators.d.ts.map +1 -0
  4. package/{arrays → dist/arrays}/index.d.ts +1 -0
  5. package/dist/arrays/index.d.ts.map +1 -0
  6. package/{common → dist/common}/assertions.d.ts +1 -1
  7. package/{common → dist/common}/assertions.d.ts.map +1 -1
  8. package/{common → dist/common}/types.d.ts +1 -1
  9. package/{common → dist/common}/types.d.ts.map +1 -1
  10. package/{functions → dist/functions}/executions.d.ts +1 -1
  11. package/{functions → dist/functions}/executions.d.ts.map +1 -1
  12. package/dist/index.js +14 -0
  13. package/dist/index.js.map +101 -0
  14. package/{objects → dist/objects}/transformations.d.ts +1 -1
  15. package/{objects → dist/objects}/transformations.d.ts.map +1 -1
  16. package/{objects → dist/objects}/types.d.ts +1 -1
  17. package/{objects → dist/objects}/types.d.ts.map +1 -1
  18. package/{promises → dist/promises}/deferred.d.ts +1 -1
  19. package/{promises → dist/promises}/deferred.d.ts.map +1 -1
  20. package/{promises → dist/promises}/timers.d.ts +1 -1
  21. package/{promises → dist/promises}/timers.d.ts.map +1 -1
  22. package/{serializer → dist/serializer}/context.d.ts +1 -1
  23. package/{serializer → dist/serializer}/context.d.ts.map +1 -1
  24. package/{serializer → dist/serializer}/serialize.d.ts +1 -1
  25. package/{serializer → dist/serializer}/serialize.d.ts.map +1 -1
  26. package/{serializer → dist/serializer}/serializers/array.d.ts +1 -1
  27. package/{serializer → dist/serializer}/serializers/array.d.ts.map +1 -1
  28. package/{serializer → dist/serializer}/serializers/binary.d.ts +1 -1
  29. package/dist/serializer/serializers/binary.d.ts.map +1 -0
  30. package/{serializer → dist/serializer}/serializers/blob.d.ts +1 -1
  31. package/dist/serializer/serializers/blob.d.ts.map +1 -0
  32. package/{serializer → dist/serializer}/serializers/collection.d.ts +1 -1
  33. package/{serializer → dist/serializer}/serializers/collection.d.ts.map +1 -1
  34. package/{serializer → dist/serializer}/serializers/compound.d.ts +1 -1
  35. package/{serializer → dist/serializer}/serializers/compound.d.ts.map +1 -1
  36. package/{serializer → dist/serializer}/serializers/error.d.ts +1 -1
  37. package/{serializer → dist/serializer}/serializers/error.d.ts.map +1 -1
  38. package/{serializer → dist/serializer}/serializers/function.d.ts +1 -1
  39. package/{serializer → dist/serializer}/serializers/function.d.ts.map +1 -1
  40. package/{serializer → dist/serializer}/serializers/leaf-object.d.ts +1 -1
  41. package/{serializer → dist/serializer}/serializers/leaf-object.d.ts.map +1 -1
  42. package/{serializer → dist/serializer}/serializers/number.d.ts +1 -1
  43. package/dist/serializer/serializers/number.d.ts.map +1 -0
  44. package/{serializer → dist/serializer}/serializers/object.d.ts +1 -1
  45. package/{serializer → dist/serializer}/serializers/object.d.ts.map +1 -1
  46. package/{serializer → dist/serializer}/serializers/opaque.d.ts +1 -1
  47. package/dist/serializer/serializers/opaque.d.ts.map +1 -0
  48. package/{serializer → dist/serializer}/serializers/primitive.d.ts +1 -1
  49. package/{serializer → dist/serializer}/serializers/primitive.d.ts.map +1 -1
  50. package/{serializer → dist/serializer}/types.d.ts +1 -1
  51. package/{serializer → dist/serializer}/types.d.ts.map +1 -1
  52. package/{serializer → dist/serializer}/utils.d.ts +1 -1
  53. package/{serializer → dist/serializer}/utils.d.ts.map +1 -1
  54. package/{strings → dist/strings}/index.d.ts +1 -0
  55. package/{strings → dist/strings}/index.d.ts.map +1 -1
  56. package/{strings → dist/strings}/manipulations.d.ts +2 -0
  57. package/{strings → dist/strings}/manipulations.d.ts.map +1 -1
  58. package/dist/strings/strip-ansi.d.ts +2 -0
  59. package/dist/strings/strip-ansi.d.ts.map +1 -0
  60. package/{system → dist/system}/fetch.d.ts +2 -2
  61. package/{system → dist/system}/fetch.d.ts.map +1 -1
  62. package/dist/system/types.d.ts +3 -0
  63. package/{system → dist/system}/types.d.ts.map +1 -1
  64. package/{times → dist/times}/conversions.d.ts +1 -1
  65. package/{times → dist/times}/conversions.d.ts.map +1 -1
  66. package/package.json +11 -73
  67. package/src/arrays/accessors.ts +25 -0
  68. package/src/arrays/comparators.ts +53 -0
  69. package/src/arrays/conversions.ts +16 -0
  70. package/src/arrays/factories.ts +13 -0
  71. package/src/arrays/guards.ts +7 -0
  72. package/src/arrays/index.ts +9 -0
  73. package/src/arrays/operations.ts +103 -0
  74. package/src/arrays/set-operations.ts +11 -0
  75. package/src/arrays/types.ts +21 -0
  76. package/src/buffers/conversions.ts +26 -0
  77. package/src/buffers/guards.ts +13 -0
  78. package/src/buffers/index.ts +5 -0
  79. package/src/buffers/operations.ts +44 -0
  80. package/src/buffers/types.ts +1 -0
  81. package/src/collections/fifo-map.ts +33 -0
  82. package/src/collections/fifo-set.ts +29 -0
  83. package/src/collections/guards.ts +11 -0
  84. package/src/collections/index.ts +10 -0
  85. package/src/collections/linked-base.ts +117 -0
  86. package/src/collections/linked-map.ts +82 -0
  87. package/src/collections/linked-set.ts +69 -0
  88. package/src/collections/lru-map.ts +36 -0
  89. package/src/collections/lru-set.ts +25 -0
  90. package/src/collections/types.ts +12 -0
  91. package/src/common/assertions.ts +11 -0
  92. package/src/common/guards.ts +58 -0
  93. package/src/common/index.ts +5 -0
  94. package/src/common/transformations.ts +20 -0
  95. package/src/common/types.ts +3 -0
  96. package/src/core/constants.ts +1 -0
  97. package/src/core/conversions.ts +9 -0
  98. package/src/core/guards.ts +57 -0
  99. package/src/core/index.ts +5 -0
  100. package/src/core/types.ts +15 -0
  101. package/src/errors/base-error.ts +48 -0
  102. package/src/errors/factories.ts +74 -0
  103. package/src/errors/guards.ts +12 -0
  104. package/src/errors/index.ts +7 -0
  105. package/src/errors/operations.ts +15 -0
  106. package/src/errors/stringify.ts +131 -0
  107. package/src/errors/types.ts +11 -0
  108. package/src/events/emitter.ts +117 -0
  109. package/src/events/index.ts +2 -0
  110. package/src/events/types.ts +11 -0
  111. package/src/functions/compositions.ts +17 -0
  112. package/src/functions/debounce.ts +34 -0
  113. package/src/functions/executions.ts +12 -0
  114. package/src/functions/guards.ts +5 -0
  115. package/src/functions/index.ts +11 -0
  116. package/src/functions/memoize.ts +33 -0
  117. package/src/functions/once.ts +33 -0
  118. package/src/functions/pipe.ts +39 -0
  119. package/src/functions/throttle.ts +59 -0
  120. package/src/functions/timer-state.ts +33 -0
  121. package/src/functions/types.ts +8 -0
  122. package/src/index.ts +16 -0
  123. package/src/json-rpc/constants.ts +15 -0
  124. package/src/json-rpc/factories.ts +22 -0
  125. package/src/json-rpc/guards.ts +58 -0
  126. package/src/json-rpc/index.ts +5 -0
  127. package/src/json-rpc/types.ts +48 -0
  128. package/src/numbers/bigint-math.ts +163 -0
  129. package/src/numbers/constants.ts +14 -0
  130. package/src/numbers/conversions.ts +83 -0
  131. package/src/numbers/factories.ts +6 -0
  132. package/src/numbers/formats.ts +52 -0
  133. package/src/numbers/guards.ts +22 -0
  134. package/src/numbers/index.ts +10 -0
  135. package/src/numbers/maths.ts +28 -0
  136. package/src/numbers/ranges.ts +17 -0
  137. package/src/numbers/types.ts +7 -0
  138. package/src/objects/deep-merge.ts +76 -0
  139. package/src/objects/guards.ts +21 -0
  140. package/src/objects/index.ts +5 -0
  141. package/src/objects/transformations.ts +34 -0
  142. package/src/objects/types.ts +33 -0
  143. package/src/promises/abortable.ts +37 -0
  144. package/src/promises/compositions.ts +18 -0
  145. package/src/promises/deferred.ts +131 -0
  146. package/src/promises/guards.ts +8 -0
  147. package/src/promises/index.ts +10 -0
  148. package/src/promises/pipe.ts +39 -0
  149. package/src/promises/poll.ts +92 -0
  150. package/src/promises/retry.ts +138 -0
  151. package/src/promises/timers.ts +16 -0
  152. package/src/promises/types.ts +1 -0
  153. package/src/serializer/constants.ts +5 -0
  154. package/src/serializer/context.ts +24 -0
  155. package/src/serializer/index.ts +8 -0
  156. package/src/serializer/serialize.ts +51 -0
  157. package/src/serializer/serializers/array.ts +17 -0
  158. package/src/serializer/serializers/binary.ts +24 -0
  159. package/src/serializer/serializers/blob.ts +18 -0
  160. package/src/serializer/serializers/collection.ts +25 -0
  161. package/src/serializer/serializers/compound.ts +79 -0
  162. package/src/serializer/serializers/error.ts +75 -0
  163. package/src/serializer/serializers/function.ts +13 -0
  164. package/src/serializer/serializers/index.ts +12 -0
  165. package/src/serializer/serializers/leaf-object.ts +18 -0
  166. package/src/serializer/serializers/number.ts +14 -0
  167. package/src/serializer/serializers/object.ts +62 -0
  168. package/src/serializer/serializers/opaque.ts +36 -0
  169. package/src/serializer/serializers/primitive.ts +32 -0
  170. package/src/serializer/symbol-registry.ts +28 -0
  171. package/src/serializer/types.ts +42 -0
  172. package/src/serializer/utils.ts +15 -0
  173. package/src/strings/constants.ts +1 -0
  174. package/src/strings/factories.ts +9 -0
  175. package/src/strings/guards.ts +51 -0
  176. package/src/strings/index.ts +7 -0
  177. package/src/strings/manipulations.ts +145 -0
  178. package/src/strings/strip-ansi.ts +14 -0
  179. package/src/strings/types.ts +3 -0
  180. package/src/system/env.ts +32 -0
  181. package/src/system/fetch.ts +23 -0
  182. package/src/system/graceful-exit.ts +46 -0
  183. package/src/system/index.ts +6 -0
  184. package/src/system/path.ts +12 -0
  185. package/src/system/types.ts +3 -0
  186. package/src/times/constants.ts +6 -0
  187. package/src/times/conversions.ts +85 -0
  188. package/src/times/factories.ts +3 -0
  189. package/src/times/guards.ts +3 -0
  190. package/src/times/index.ts +5 -0
  191. package/src/times/operations.ts +9 -0
  192. package/CHANGELOG.md +0 -57
  193. package/arrays/index.d.ts.map +0 -1
  194. package/arrays/index.js +0 -4
  195. package/arrays/index.js.map +0 -9
  196. package/buffers/index.js +0 -4
  197. package/buffers/index.js.map +0 -9
  198. package/chunk-25ja9350.js +0 -4
  199. package/chunk-25ja9350.js.map +0 -13
  200. package/chunk-3w6nt7kb.js +0 -4
  201. package/chunk-3w6nt7kb.js.map +0 -12
  202. package/chunk-5txwcr6j.js +0 -4
  203. package/chunk-5txwcr6j.js.map +0 -17
  204. package/chunk-6dxad51h.js +0 -4
  205. package/chunk-6dxad51h.js.map +0 -12
  206. package/chunk-6kdnnxe0.js +0 -4
  207. package/chunk-6kdnnxe0.js.map +0 -17
  208. package/chunk-7cndek91.js +0 -4
  209. package/chunk-7cndek91.js.map +0 -15
  210. package/chunk-bee0nxse.js +0 -6
  211. package/chunk-bee0nxse.js.map +0 -14
  212. package/chunk-bjmntg2y.js +0 -4
  213. package/chunk-bjmntg2y.js.map +0 -18
  214. package/chunk-d0d0d285.js +0 -4
  215. package/chunk-d0d0d285.js.map +0 -26
  216. package/chunk-jny2gdyy.js +0 -4
  217. package/chunk-jny2gdyy.js.map +0 -12
  218. package/chunk-kbzgn0z4.js +0 -4
  219. package/chunk-kbzgn0z4.js.map +0 -10
  220. package/chunk-qmbgp0vr.js +0 -4
  221. package/chunk-qmbgp0vr.js.map +0 -12
  222. package/chunk-qn6n0ff5.js +0 -4
  223. package/chunk-qn6n0ff5.js.map +0 -17
  224. package/chunk-r3maskdb.js +0 -5
  225. package/chunk-r3maskdb.js.map +0 -13
  226. package/chunk-st3dxvqt.js +0 -4
  227. package/chunk-st3dxvqt.js.map +0 -14
  228. package/chunk-xp18wdk6.js +0 -4
  229. package/chunk-xp18wdk6.js.map +0 -12
  230. package/collections/index.js +0 -4
  231. package/collections/index.js.map +0 -9
  232. package/common/index.js +0 -4
  233. package/common/index.js.map +0 -9
  234. package/core/index.js +0 -4
  235. package/core/index.js.map +0 -9
  236. package/errors/index.js +0 -4
  237. package/errors/index.js.map +0 -9
  238. package/events/index.js +0 -4
  239. package/events/index.js.map +0 -9
  240. package/functions/index.js +0 -4
  241. package/functions/index.js.map +0 -9
  242. package/index.js +0 -4
  243. package/index.js.map +0 -9
  244. package/json-rpc/index.js +0 -4
  245. package/json-rpc/index.js.map +0 -9
  246. package/meta.json +0 -2998
  247. package/meta.md +0 -1816
  248. package/numbers/index.js +0 -4
  249. package/numbers/index.js.map +0 -9
  250. package/objects/index.js +0 -4
  251. package/objects/index.js.map +0 -9
  252. package/promises/index.js +0 -4
  253. package/promises/index.js.map +0 -9
  254. package/serializer/index.js +0 -4
  255. package/serializer/index.js.map +0 -9
  256. package/serializer/serializers/binary.d.ts.map +0 -1
  257. package/serializer/serializers/blob.d.ts.map +0 -1
  258. package/serializer/serializers/number.d.ts.map +0 -1
  259. package/serializer/serializers/opaque.d.ts.map +0 -1
  260. package/strings/index.js +0 -4
  261. package/strings/index.js.map +0 -9
  262. package/system/index.js +0 -4
  263. package/system/index.js.map +0 -9
  264. package/system/types.d.ts +0 -3
  265. package/times/index.js +0 -4
  266. package/times/index.js.map +0 -9
  267. /package/{arrays → dist/arrays}/accessors.d.ts +0 -0
  268. /package/{arrays → dist/arrays}/accessors.d.ts.map +0 -0
  269. /package/{arrays → dist/arrays}/conversions.d.ts +0 -0
  270. /package/{arrays → dist/arrays}/conversions.d.ts.map +0 -0
  271. /package/{arrays → dist/arrays}/factories.d.ts +0 -0
  272. /package/{arrays → dist/arrays}/factories.d.ts.map +0 -0
  273. /package/{arrays → dist/arrays}/guards.d.ts +0 -0
  274. /package/{arrays → dist/arrays}/guards.d.ts.map +0 -0
  275. /package/{arrays → dist/arrays}/operations.d.ts +0 -0
  276. /package/{arrays → dist/arrays}/operations.d.ts.map +0 -0
  277. /package/{arrays → dist/arrays}/set-operations.d.ts +0 -0
  278. /package/{arrays → dist/arrays}/set-operations.d.ts.map +0 -0
  279. /package/{arrays → dist/arrays}/types.d.ts +0 -0
  280. /package/{arrays → dist/arrays}/types.d.ts.map +0 -0
  281. /package/{buffers → dist/buffers}/conversions.d.ts +0 -0
  282. /package/{buffers → dist/buffers}/conversions.d.ts.map +0 -0
  283. /package/{buffers → dist/buffers}/guards.d.ts +0 -0
  284. /package/{buffers → dist/buffers}/guards.d.ts.map +0 -0
  285. /package/{buffers → dist/buffers}/index.d.ts +0 -0
  286. /package/{buffers → dist/buffers}/index.d.ts.map +0 -0
  287. /package/{buffers → dist/buffers}/operations.d.ts +0 -0
  288. /package/{buffers → dist/buffers}/operations.d.ts.map +0 -0
  289. /package/{buffers → dist/buffers}/types.d.ts +0 -0
  290. /package/{buffers → dist/buffers}/types.d.ts.map +0 -0
  291. /package/{collections → dist/collections}/fifo-map.d.ts +0 -0
  292. /package/{collections → dist/collections}/fifo-map.d.ts.map +0 -0
  293. /package/{collections → dist/collections}/fifo-set.d.ts +0 -0
  294. /package/{collections → dist/collections}/fifo-set.d.ts.map +0 -0
  295. /package/{collections → dist/collections}/guards.d.ts +0 -0
  296. /package/{collections → dist/collections}/guards.d.ts.map +0 -0
  297. /package/{collections → dist/collections}/index.d.ts +0 -0
  298. /package/{collections → dist/collections}/index.d.ts.map +0 -0
  299. /package/{collections → dist/collections}/linked-base.d.ts +0 -0
  300. /package/{collections → dist/collections}/linked-base.d.ts.map +0 -0
  301. /package/{collections → dist/collections}/linked-map.d.ts +0 -0
  302. /package/{collections → dist/collections}/linked-map.d.ts.map +0 -0
  303. /package/{collections → dist/collections}/linked-set.d.ts +0 -0
  304. /package/{collections → dist/collections}/linked-set.d.ts.map +0 -0
  305. /package/{collections → dist/collections}/lru-map.d.ts +0 -0
  306. /package/{collections → dist/collections}/lru-map.d.ts.map +0 -0
  307. /package/{collections → dist/collections}/lru-set.d.ts +0 -0
  308. /package/{collections → dist/collections}/lru-set.d.ts.map +0 -0
  309. /package/{collections → dist/collections}/types.d.ts +0 -0
  310. /package/{collections → dist/collections}/types.d.ts.map +0 -0
  311. /package/{common → dist/common}/guards.d.ts +0 -0
  312. /package/{common → dist/common}/guards.d.ts.map +0 -0
  313. /package/{common → dist/common}/index.d.ts +0 -0
  314. /package/{common → dist/common}/index.d.ts.map +0 -0
  315. /package/{common → dist/common}/transformations.d.ts +0 -0
  316. /package/{common → dist/common}/transformations.d.ts.map +0 -0
  317. /package/{core → dist/core}/constants.d.ts +0 -0
  318. /package/{core → dist/core}/constants.d.ts.map +0 -0
  319. /package/{core → dist/core}/conversions.d.ts +0 -0
  320. /package/{core → dist/core}/conversions.d.ts.map +0 -0
  321. /package/{core → dist/core}/guards.d.ts +0 -0
  322. /package/{core → dist/core}/guards.d.ts.map +0 -0
  323. /package/{core → dist/core}/index.d.ts +0 -0
  324. /package/{core → dist/core}/index.d.ts.map +0 -0
  325. /package/{core → dist/core}/types.d.ts +0 -0
  326. /package/{core → dist/core}/types.d.ts.map +0 -0
  327. /package/{errors → dist/errors}/base-error.d.ts +0 -0
  328. /package/{errors → dist/errors}/base-error.d.ts.map +0 -0
  329. /package/{errors → dist/errors}/factories.d.ts +0 -0
  330. /package/{errors → dist/errors}/factories.d.ts.map +0 -0
  331. /package/{errors → dist/errors}/guards.d.ts +0 -0
  332. /package/{errors → dist/errors}/guards.d.ts.map +0 -0
  333. /package/{errors → dist/errors}/index.d.ts +0 -0
  334. /package/{errors → dist/errors}/index.d.ts.map +0 -0
  335. /package/{errors → dist/errors}/operations.d.ts +0 -0
  336. /package/{errors → dist/errors}/operations.d.ts.map +0 -0
  337. /package/{errors → dist/errors}/stringify.d.ts +0 -0
  338. /package/{errors → dist/errors}/stringify.d.ts.map +0 -0
  339. /package/{errors → dist/errors}/types.d.ts +0 -0
  340. /package/{errors → dist/errors}/types.d.ts.map +0 -0
  341. /package/{events → dist/events}/emitter.d.ts +0 -0
  342. /package/{events → dist/events}/emitter.d.ts.map +0 -0
  343. /package/{events → dist/events}/index.d.ts +0 -0
  344. /package/{events → dist/events}/index.d.ts.map +0 -0
  345. /package/{events → dist/events}/types.d.ts +0 -0
  346. /package/{events → dist/events}/types.d.ts.map +0 -0
  347. /package/{functions → dist/functions}/compositions.d.ts +0 -0
  348. /package/{functions → dist/functions}/compositions.d.ts.map +0 -0
  349. /package/{functions → dist/functions}/debounce.d.ts +0 -0
  350. /package/{functions → dist/functions}/debounce.d.ts.map +0 -0
  351. /package/{functions → dist/functions}/guards.d.ts +0 -0
  352. /package/{functions → dist/functions}/guards.d.ts.map +0 -0
  353. /package/{functions → dist/functions}/index.d.ts +0 -0
  354. /package/{functions → dist/functions}/index.d.ts.map +0 -0
  355. /package/{functions → dist/functions}/memoize.d.ts +0 -0
  356. /package/{functions → dist/functions}/memoize.d.ts.map +0 -0
  357. /package/{functions → dist/functions}/once.d.ts +0 -0
  358. /package/{functions → dist/functions}/once.d.ts.map +0 -0
  359. /package/{functions → dist/functions}/pipe.d.ts +0 -0
  360. /package/{functions → dist/functions}/pipe.d.ts.map +0 -0
  361. /package/{functions → dist/functions}/throttle.d.ts +0 -0
  362. /package/{functions → dist/functions}/throttle.d.ts.map +0 -0
  363. /package/{functions → dist/functions}/timer-state.d.ts +0 -0
  364. /package/{functions → dist/functions}/timer-state.d.ts.map +0 -0
  365. /package/{functions → dist/functions}/types.d.ts +0 -0
  366. /package/{functions → dist/functions}/types.d.ts.map +0 -0
  367. /package/{index.d.ts → dist/index.d.ts} +0 -0
  368. /package/{index.d.ts.map → dist/index.d.ts.map} +0 -0
  369. /package/{json-rpc → dist/json-rpc}/constants.d.ts +0 -0
  370. /package/{json-rpc → dist/json-rpc}/constants.d.ts.map +0 -0
  371. /package/{json-rpc → dist/json-rpc}/factories.d.ts +0 -0
  372. /package/{json-rpc → dist/json-rpc}/factories.d.ts.map +0 -0
  373. /package/{json-rpc → dist/json-rpc}/guards.d.ts +0 -0
  374. /package/{json-rpc → dist/json-rpc}/guards.d.ts.map +0 -0
  375. /package/{json-rpc → dist/json-rpc}/index.d.ts +0 -0
  376. /package/{json-rpc → dist/json-rpc}/index.d.ts.map +0 -0
  377. /package/{json-rpc → dist/json-rpc}/types.d.ts +0 -0
  378. /package/{json-rpc → dist/json-rpc}/types.d.ts.map +0 -0
  379. /package/{numbers → dist/numbers}/bigint-math.d.ts +0 -0
  380. /package/{numbers → dist/numbers}/bigint-math.d.ts.map +0 -0
  381. /package/{numbers → dist/numbers}/constants.d.ts +0 -0
  382. /package/{numbers → dist/numbers}/constants.d.ts.map +0 -0
  383. /package/{numbers → dist/numbers}/conversions.d.ts +0 -0
  384. /package/{numbers → dist/numbers}/conversions.d.ts.map +0 -0
  385. /package/{numbers → dist/numbers}/factories.d.ts +0 -0
  386. /package/{numbers → dist/numbers}/factories.d.ts.map +0 -0
  387. /package/{numbers → dist/numbers}/formats.d.ts +0 -0
  388. /package/{numbers → dist/numbers}/formats.d.ts.map +0 -0
  389. /package/{numbers → dist/numbers}/guards.d.ts +0 -0
  390. /package/{numbers → dist/numbers}/guards.d.ts.map +0 -0
  391. /package/{numbers → dist/numbers}/index.d.ts +0 -0
  392. /package/{numbers → dist/numbers}/index.d.ts.map +0 -0
  393. /package/{numbers → dist/numbers}/maths.d.ts +0 -0
  394. /package/{numbers → dist/numbers}/maths.d.ts.map +0 -0
  395. /package/{numbers → dist/numbers}/ranges.d.ts +0 -0
  396. /package/{numbers → dist/numbers}/ranges.d.ts.map +0 -0
  397. /package/{numbers → dist/numbers}/types.d.ts +0 -0
  398. /package/{numbers → dist/numbers}/types.d.ts.map +0 -0
  399. /package/{objects → dist/objects}/deep-merge.d.ts +0 -0
  400. /package/{objects → dist/objects}/deep-merge.d.ts.map +0 -0
  401. /package/{objects → dist/objects}/guards.d.ts +0 -0
  402. /package/{objects → dist/objects}/guards.d.ts.map +0 -0
  403. /package/{objects → dist/objects}/index.d.ts +0 -0
  404. /package/{objects → dist/objects}/index.d.ts.map +0 -0
  405. /package/{promises → dist/promises}/abortable.d.ts +0 -0
  406. /package/{promises → dist/promises}/abortable.d.ts.map +0 -0
  407. /package/{promises → dist/promises}/compositions.d.ts +0 -0
  408. /package/{promises → dist/promises}/compositions.d.ts.map +0 -0
  409. /package/{promises → dist/promises}/guards.d.ts +0 -0
  410. /package/{promises → dist/promises}/guards.d.ts.map +0 -0
  411. /package/{promises → dist/promises}/index.d.ts +0 -0
  412. /package/{promises → dist/promises}/index.d.ts.map +0 -0
  413. /package/{promises → dist/promises}/pipe.d.ts +0 -0
  414. /package/{promises → dist/promises}/pipe.d.ts.map +0 -0
  415. /package/{promises → dist/promises}/poll.d.ts +0 -0
  416. /package/{promises → dist/promises}/poll.d.ts.map +0 -0
  417. /package/{promises → dist/promises}/retry.d.ts +0 -0
  418. /package/{promises → dist/promises}/retry.d.ts.map +0 -0
  419. /package/{promises → dist/promises}/types.d.ts +0 -0
  420. /package/{promises → dist/promises}/types.d.ts.map +0 -0
  421. /package/{serializer → dist/serializer}/constants.d.ts +0 -0
  422. /package/{serializer → dist/serializer}/constants.d.ts.map +0 -0
  423. /package/{serializer → dist/serializer}/index.d.ts +0 -0
  424. /package/{serializer → dist/serializer}/index.d.ts.map +0 -0
  425. /package/{serializer → dist/serializer}/serializers/index.d.ts +0 -0
  426. /package/{serializer → dist/serializer}/serializers/index.d.ts.map +0 -0
  427. /package/{serializer → dist/serializer}/symbol-registry.d.ts +0 -0
  428. /package/{serializer → dist/serializer}/symbol-registry.d.ts.map +0 -0
  429. /package/{strings → dist/strings}/constants.d.ts +0 -0
  430. /package/{strings → dist/strings}/constants.d.ts.map +0 -0
  431. /package/{strings → dist/strings}/factories.d.ts +0 -0
  432. /package/{strings → dist/strings}/factories.d.ts.map +0 -0
  433. /package/{strings → dist/strings}/guards.d.ts +0 -0
  434. /package/{strings → dist/strings}/guards.d.ts.map +0 -0
  435. /package/{strings → dist/strings}/types.d.ts +0 -0
  436. /package/{strings → dist/strings}/types.d.ts.map +0 -0
  437. /package/{system → dist/system}/env.d.ts +0 -0
  438. /package/{system → dist/system}/env.d.ts.map +0 -0
  439. /package/{system → dist/system}/graceful-exit.d.ts +0 -0
  440. /package/{system → dist/system}/graceful-exit.d.ts.map +0 -0
  441. /package/{system → dist/system}/index.d.ts +0 -0
  442. /package/{system → dist/system}/index.d.ts.map +0 -0
  443. /package/{system → dist/system}/path.d.ts +0 -0
  444. /package/{system → dist/system}/path.d.ts.map +0 -0
  445. /package/{times → dist/times}/constants.d.ts +0 -0
  446. /package/{times → dist/times}/constants.d.ts.map +0 -0
  447. /package/{times → dist/times}/factories.d.ts +0 -0
  448. /package/{times → dist/times}/factories.d.ts.map +0 -0
  449. /package/{times → dist/times}/guards.d.ts +0 -0
  450. /package/{times → dist/times}/guards.d.ts.map +0 -0
  451. /package/{times → dist/times}/index.d.ts +0 -0
  452. /package/{times → dist/times}/index.d.ts.map +0 -0
  453. /package/{times → dist/times}/operations.d.ts +0 -0
  454. /package/{times → dist/times}/operations.d.ts.map +0 -0
@@ -0,0 +1,58 @@
1
+ import { isArray, isEmptyArray } from '../arrays'
2
+ import { isCollectionLike, isEmptyCollection } from '../collections'
3
+ import { isNullish, isPrimitive, isString } from '../core'
4
+ import { isEmptyObject, isPlainObject } from '../objects'
5
+
6
+ export function isEmpty(value: unknown) {
7
+ if (isNullish(value)) {
8
+ return true
9
+ }
10
+
11
+ if (isArray(value)) {
12
+ return isEmptyArray(value)
13
+ }
14
+
15
+ if (isPrimitive(value)) {
16
+ if (isString(value)) {
17
+ return value.length === 0
18
+ }
19
+
20
+ return false
21
+ }
22
+
23
+ if (isPlainObject(value)) {
24
+ return isEmptyObject(value)
25
+ }
26
+
27
+ if (isCollectionLike(value)) {
28
+ return isEmptyCollection(value)
29
+ }
30
+
31
+ return false
32
+ }
33
+
34
+ export function isDeepEqual(a: unknown, b: unknown): boolean {
35
+ if (a === b) {
36
+ return true
37
+ }
38
+
39
+ if (isArray(a) && isArray(b)) {
40
+ if (a.length !== b.length) {
41
+ return false
42
+ }
43
+
44
+ return a.every((item, i) => isDeepEqual(item, b[i]))
45
+ }
46
+
47
+ if (isPlainObject(a) && isPlainObject(b)) {
48
+ const keysA = Object.keys(a)
49
+
50
+ if (keysA.length !== Object.keys(b).length) {
51
+ return false
52
+ }
53
+
54
+ return keysA.every((key) => isDeepEqual(a[key], b[key]))
55
+ }
56
+
57
+ return Object.is(a, b)
58
+ }
@@ -0,0 +1,5 @@
1
+ export * from './assertions'
2
+ export * from './guards'
3
+ export * from './transformations'
4
+
5
+ export type * from './types'
@@ -0,0 +1,20 @@
1
+ import type { NullToUndefined } from './types'
2
+ import { isArray } from '../arrays'
3
+ import { isNullish } from '../core'
4
+ import { isPlainObject, map } from '../objects'
5
+
6
+ export function nullToUndefined<T>(value: T): NullToUndefined<T> {
7
+ if (isNullish(value)) {
8
+ return undefined as NullToUndefined<T>
9
+ }
10
+
11
+ if (isArray(value)) {
12
+ return value.map(nullToUndefined) as NullToUndefined<T>
13
+ }
14
+
15
+ if (isPlainObject(value)) {
16
+ return map(value, (k, v) => [k, nullToUndefined(v)]) as NullToUndefined<T>
17
+ }
18
+
19
+ return value as NullToUndefined<T>
20
+ }
@@ -0,0 +1,3 @@
1
+ import type { AnyObject } from '../objects'
2
+
3
+ export type NullToUndefined<T> = T extends null ? undefined : T extends Array<infer U> ? Array<NullToUndefined<U>> : T extends AnyObject ? { [K in keyof T]: NullToUndefined<T[K]> } : T
@@ -0,0 +1 @@
1
+ export const DEFAULT_TRUE_STRINGS = new Set(['1', 'on', 'true', 'yes'])
@@ -0,0 +1,9 @@
1
+ export const toString = (value: unknown) => Object.prototype.toString.call(value)
2
+
3
+ export function typeOf(value: unknown): string {
4
+ if (value === null) {
5
+ return 'null'
6
+ }
7
+
8
+ return typeof value === 'object' || typeof value === 'function' ? toString(value).slice(8, -1).toLowerCase() : typeof value
9
+ }
@@ -0,0 +1,57 @@
1
+ import type { JsonablePrimitive, Primitive } from './types'
2
+ import { DEFAULT_TRUE_STRINGS } from './constants'
3
+
4
+ export const isNull = (value: unknown): value is null => value === null
5
+ export const isUndefined = (value: unknown): value is undefined => value === undefined
6
+ export const isNullish = (value: unknown): value is null | undefined => isNull(value) || isUndefined(value)
7
+
8
+ export const notNull = <T>(value: T): value is Exclude<T, null> => !isNull(value)
9
+ export const notUndefined = <T>(value: T): value is Exclude<T, undefined> => !isUndefined(value)
10
+ export const notNullish = <T>(value: T): value is NonNullable<T> => !isNullish(value)
11
+
12
+ export const isBoolean = (value: unknown): value is boolean => typeof value === 'boolean'
13
+ export const isSymbol = (value: unknown): value is symbol => typeof value === 'symbol'
14
+ export const isBigInt = (value: unknown): value is bigint => typeof value === 'bigint'
15
+ export const isNumber = (value: unknown): value is number => typeof value === 'number'
16
+ export const isString = (value: unknown): value is string => typeof value === 'string'
17
+ export const isDate = (value: unknown): value is Date => value instanceof Date
18
+
19
+ export const isPrimitive = (value: unknown): value is Primitive => value === null || (typeof value !== 'object' && typeof value !== 'function')
20
+
21
+ export const isJsonablePrimitive = (value: unknown): value is JsonablePrimitive => (
22
+ isNull(value) || isString(value) || isBoolean(value) || (isNumber(value) && Number.isFinite(value))
23
+ )
24
+
25
+ export interface IsTrueLikeOptions {
26
+ anyNonZeroNumber?: boolean
27
+ trueStrings?: Set<string>
28
+ }
29
+
30
+ export function isTrueLike(value: unknown, options: IsTrueLikeOptions = {}) {
31
+ const { anyNonZeroNumber = false, trueStrings = DEFAULT_TRUE_STRINGS } = options
32
+
33
+ if (isBoolean(value)) {
34
+ return value
35
+ }
36
+
37
+ if (isString(value)) {
38
+ return trueStrings.has(value.toLowerCase())
39
+ }
40
+
41
+ if (isNumber(value)) {
42
+ return anyNonZeroNumber ? value !== 0 && Number.isFinite(value) : value === 1
43
+ }
44
+
45
+ if (isBigInt(value)) {
46
+ return anyNonZeroNumber ? value !== 0n : value === 1n
47
+ }
48
+
49
+ return false
50
+ }
51
+
52
+ export const isGenerator = (value: unknown): boolean => (
53
+ typeof value === 'object' &&
54
+ value !== null &&
55
+ typeof (value as Record<PropertyKey, unknown>).next === 'function' &&
56
+ typeof (value as Record<PropertyKey, unknown>)[Symbol.iterator] === 'function'
57
+ )
@@ -0,0 +1,5 @@
1
+ export * from './constants'
2
+ export * from './conversions'
3
+ export * from './guards'
4
+
5
+ export type * from './types'
@@ -0,0 +1,15 @@
1
+ export type Primitive = bigint | boolean | number | string | symbol | null | undefined
2
+
3
+ export type Optional<T> = T | undefined
4
+
5
+ export type Nullable<T> = T | null
6
+
7
+ export type Nullish<T> = T | null | undefined
8
+
9
+ export type Never<T extends never = never> = T
10
+
11
+ export type IsContainsType<T, U> = Extract<T, U> extends never ? false : true
12
+
13
+ export type JsonablePrimitive = boolean | number | string | null
14
+
15
+ export type Jsonable = Jsonable[] | JsonablePrimitive | { [key: string]: Jsonable }
@@ -0,0 +1,48 @@
1
+ export type BaseErrorCode = number | string
2
+
3
+ export interface BaseErrorOptions extends ErrorOptions {
4
+ cause?: unknown
5
+ code?: BaseErrorCode
6
+ details?: string
7
+ exitCode?: number
8
+ name?: string
9
+ retryable?: boolean
10
+ timestamp?: Date
11
+ }
12
+
13
+ export class BaseError extends Error {
14
+ public declare readonly timestamp: Date
15
+ public declare readonly code?: BaseErrorCode
16
+ public declare readonly cause?: unknown
17
+ public declare readonly details?: string
18
+ public declare readonly exitCode?: number
19
+ public declare readonly retryable?: boolean
20
+
21
+ public constructor(message: string, { code, details, exitCode, name, retryable, timestamp, ...options }: BaseErrorOptions = {}) {
22
+ super(message, options)
23
+
24
+ Object.setPrototypeOf(this, new.target.prototype)
25
+
26
+ this.defineValue('name', name ?? this.constructor.name)
27
+ this.defineValue('timestamp', timestamp ?? new Date())
28
+ this.defineValue('cause', options.cause)
29
+ this.defineValue('code', code)
30
+ this.defineValue('details', details)
31
+ this.defineValue('exitCode', exitCode)
32
+ this.defineValue('retryable', retryable)
33
+ }
34
+
35
+ public withValue<K extends string, V>(key: K, value: V): Record<K, V> & this {
36
+ if (Object.hasOwn(this, key)) {
37
+ throw new TypeError(`Cannot redefine property '${key}' on ${this.name}`)
38
+ }
39
+
40
+ return this.defineValue(key, value) as Record<K, V> & this
41
+ }
42
+
43
+ protected defineValue(key: string, value: unknown) {
44
+ Object.defineProperty(this, key, { configurable: false, enumerable: true, value, writable: false })
45
+
46
+ return this
47
+ }
48
+ }
@@ -0,0 +1,74 @@
1
+ import type { Errorable, ErrorCtor, ErrorLike } from './types'
2
+ import { isString, notNullish } from '../core'
3
+ import { isErrorLike } from './guards'
4
+
5
+ export const createAbortError = (message = 'This operation was aborted', name = 'AbortError') => new DOMException(message, name)
6
+
7
+ export const createTimeoutError = (message = 'The operation was aborted due to a timeout', name = 'TimeoutError') => createAbortError(message, name)
8
+
9
+ export function createAbortController(timeout?: number, timeoutError?: Errorable) {
10
+ const controller = new AbortController()
11
+
12
+ if (notNullish(timeout) && timeout > 0 && timeout <= Number.MAX_SAFE_INTEGER) {
13
+ let timeoutId: NodeJS.Timeout
14
+
15
+ const cleanup = () => {
16
+ clearTimeout(timeoutId)
17
+ controller.signal.removeEventListener('abort', cleanup)
18
+ }
19
+
20
+ controller.signal.addEventListener('abort', cleanup)
21
+ timeoutId = setTimeout(() => controller.abort(ensureError(timeoutError ?? createTimeoutError())), timeout)
22
+ }
23
+
24
+ return controller
25
+ }
26
+
27
+ export function ensureError(input: Errorable, ctor?: ErrorCtor) {
28
+ if (typeof input === 'string') {
29
+ return ctor ? new ctor(input) : new Error(input)
30
+ }
31
+
32
+ if (typeof input === 'function') {
33
+ return ensureError(input(), ctor)
34
+ }
35
+
36
+ return input
37
+ }
38
+
39
+ export function fromErrorLike({ cause, message, name, stack, ...properties }: ErrorLike, ctor?: ErrorCtor) {
40
+ const errorClass = ctor ?? Error
41
+ const error = new errorClass(message, { cause })
42
+
43
+ Object.defineProperty(error, 'name', { configurable: true, enumerable: false, value: name, writable: true })
44
+ Object.defineProperty(error, 'stack', { configurable: true, enumerable: false, value: stack, writable: true })
45
+
46
+ for (const [key, value] of Object.entries(properties)) {
47
+ Object.defineProperty(error, key, Object.getOwnPropertyDescriptor(properties, key) ?? { configurable: true, enumerable: true, value, writable: true })
48
+ }
49
+
50
+ return error
51
+ }
52
+
53
+ export interface NormalizeErrorOptions {
54
+ defaultMessage?: string
55
+ errorConstructor?: ErrorCtor
56
+ }
57
+
58
+ export function normalizeError(error: unknown, { defaultMessage = 'Unknown error', errorConstructor }: NormalizeErrorOptions = {}) {
59
+ const errorClass = errorConstructor ?? Error
60
+
61
+ if (error instanceof errorClass) {
62
+ return error
63
+ }
64
+
65
+ if (isString(error)) {
66
+ return ensureError(error, errorConstructor)
67
+ }
68
+
69
+ if (isErrorLike(error)) {
70
+ return fromErrorLike(error, errorConstructor)
71
+ }
72
+
73
+ return new errorClass(defaultMessage, { cause: error })
74
+ }
@@ -0,0 +1,12 @@
1
+ import type { ErrorLike } from './types'
2
+ import { isString } from '../core'
3
+ import { isKeysOf, isObject } from '../objects'
4
+ import { BaseError } from './base-error'
5
+
6
+ export const isError = (value: unknown): value is Error => value instanceof Error
7
+
8
+ export const isBaseError = (value: unknown): value is BaseError => value instanceof BaseError
9
+
10
+ export const isAbortError = (error: unknown): error is DOMException => error instanceof DOMException && error.name === 'AbortError'
11
+
12
+ export const isErrorLike = (value: unknown): value is ErrorLike => isObject(value) && isKeysOf(value, 'name') && isString(value.name)
@@ -0,0 +1,7 @@
1
+ export * from './base-error'
2
+ export * from './factories'
3
+ export * from './guards'
4
+ export * from './operations'
5
+ export * from './stringify'
6
+
7
+ export type * from './types'
@@ -0,0 +1,15 @@
1
+ import { notNullish, type Nullish } from '../core'
2
+
3
+ export function combineSignals(...signals: Array<Nullish<AbortSignal>>) {
4
+ const validSignals = signals.filter(notNullish)
5
+
6
+ if (validSignals.length === 0) {
7
+ return new AbortController().signal
8
+ }
9
+
10
+ if (validSignals.length === 1) {
11
+ return validSignals[0]!
12
+ }
13
+
14
+ return AbortSignal.any(validSignals)
15
+ }
@@ -0,0 +1,131 @@
1
+ import { isString, notNullish } from '../core'
2
+ import { isObject } from '../objects'
3
+ import { normalizeError, type NormalizeErrorOptions } from './factories'
4
+
5
+ export interface StringifyErrorFormatters {
6
+ code?: (code: string) => string
7
+ message?: (message: string) => string
8
+ name?: (name: string) => string
9
+ }
10
+
11
+ export interface StringifyErrorOptions extends NormalizeErrorOptions {
12
+ causeIndent?: number
13
+ causePrefix?: string
14
+ circularReferenceMessage?: string
15
+ formatters?: StringifyErrorFormatters
16
+ includeCause?: boolean
17
+ includeCode?: boolean
18
+ includeName?: boolean
19
+ maxCauseDepth?: number
20
+ }
21
+
22
+ export const DEFAULT_STRINGIFY_FORMATTERS: Required<StringifyErrorFormatters> = {
23
+ code: (value) => `[${value}]`,
24
+ message: (value) => value,
25
+ name: (value) => `${value}:`,
26
+ }
27
+
28
+ export interface StringifyErrorState {
29
+ causeIndent: number
30
+ causePrefix: string
31
+ circularReferenceMessage: string
32
+ defaultMessage: string
33
+ formatters: Required<StringifyErrorFormatters>
34
+ includeCause: boolean
35
+ includeCode: boolean
36
+ includeName: boolean
37
+ maxCauseDepth: number
38
+ normalizeOptions: NormalizeErrorOptions
39
+ visited: Set<unknown>
40
+ }
41
+
42
+ export function collectCauses(error: Error, depth: number, indent: string, state: StringifyErrorState) {
43
+ const childIndent = indent + ' '.repeat(state.causeIndent)
44
+ const pointers: string[] = []
45
+
46
+ if (error instanceof AggregateError && error.errors.length > 0) {
47
+ for (const subError of error.errors) {
48
+ pointers.push(stringifyErrorNode(subError, depth - 1, childIndent, state.causePrefix, state))
49
+ }
50
+ }
51
+
52
+ if (isObject(error.cause) || isString(error.cause)) {
53
+ pointers.push(stringifyErrorNode(error.cause, depth - 1, childIndent, state.causePrefix, state))
54
+ }
55
+
56
+ return pointers
57
+ }
58
+
59
+ export function appendCauses(parts: string[], error: Error, error_: unknown, depth: number, indent: string, state: StringifyErrorState) {
60
+ if (!state.includeCause || depth <= 0 || (error !== error_ && error.cause === error_)) {
61
+ return
62
+ }
63
+
64
+ const pointers = collectCauses(error, depth, indent, state)
65
+
66
+ if (pointers.length > 0) {
67
+ parts.push(`\n${pointers.join('\n')}`)
68
+ }
69
+ }
70
+
71
+ export function buildErrorParts(error: Error, state: StringifyErrorState) {
72
+ const parts: string[] = []
73
+
74
+ if (state.includeCode && 'code' in error && notNullish(error.code)) {
75
+ parts.push(state.formatters.code(String(error.code)))
76
+ }
77
+
78
+ if (state.includeName) {
79
+ parts.push(state.formatters.name(error.name))
80
+ }
81
+
82
+ parts.push(state.formatters.message(error.message || state.defaultMessage))
83
+
84
+ return parts
85
+ }
86
+
87
+ export function stringifyErrorNode(error_: unknown, depth: number, indent: string, prefix: string, state: StringifyErrorState): string {
88
+ if (state.visited.has(error_)) {
89
+ return `${indent}${prefix}${state.circularReferenceMessage}`
90
+ }
91
+
92
+ if (error_ instanceof Error) {
93
+ state.visited.add(error_)
94
+ }
95
+
96
+ if (error_ instanceof Error && error_.toString !== Error.prototype.toString) {
97
+ const parts = [error_.toString()]
98
+ appendCauses(parts, error_, error_, depth, indent, state)
99
+
100
+ return indent + prefix + parts.join(' ')
101
+ }
102
+
103
+ const error = normalizeError(error_, { ...state.normalizeOptions, defaultMessage: state.defaultMessage })
104
+
105
+ state.visited.add(error)
106
+
107
+ const parts = buildErrorParts(error, state)
108
+ appendCauses(parts, error, error_, depth, indent, state)
109
+
110
+ return indent + prefix + parts.join(' ')
111
+ }
112
+
113
+ export function stringifyError(error: unknown, options: StringifyErrorOptions = {}) {
114
+ const { causeIndent = 2, causePrefix = '-> ', circularReferenceMessage = '[Circular Reference]', defaultMessage = 'Unknown error', formatters: formatters_ = {}, includeCause = true, includeCode = true, includeName = true, maxCauseDepth = Number.POSITIVE_INFINITY, ...normalizeOptions } = options
115
+
116
+ const state: StringifyErrorState = {
117
+ causeIndent,
118
+ causePrefix,
119
+ circularReferenceMessage,
120
+ defaultMessage,
121
+ formatters: { ...DEFAULT_STRINGIFY_FORMATTERS, ...formatters_ },
122
+ includeCause,
123
+ includeCode,
124
+ includeName,
125
+ maxCauseDepth,
126
+ normalizeOptions,
127
+ visited: new Set<unknown>(),
128
+ }
129
+
130
+ return stringifyErrorNode(error, maxCauseDepth, '', '', state)
131
+ }
@@ -0,0 +1,11 @@
1
+ export type Errorable = Error | (() => Error | string) | string
2
+
3
+ export type ErrorCtor = new (message?: string, options?: ErrorOptions) => Error
4
+
5
+ export interface ErrorLike {
6
+ [key: string]: unknown
7
+ cause?: unknown
8
+ message?: string
9
+ name: string
10
+ stack?: string
11
+ }
@@ -0,0 +1,117 @@
1
+ import type { EventArgs, EventListener, EventListenerMap, EventMap, EventNames } from './types'
2
+
3
+ export class Emitter<TEventMap = EventMap, TStrict extends boolean = false> {
4
+ protected readonly eventListeners: EventListenerMap
5
+ protected readonly onceListeners: EventListenerMap
6
+
7
+ public constructor() {
8
+ this.eventListeners = new Map()
9
+ this.onceListeners = new Map()
10
+ }
11
+
12
+ public listeners<TEventName extends EventNames<TEventMap, TStrict>>(eventName: TEventName): Array<EventListener<EventArgs<TEventMap, TEventName, TStrict>>> {
13
+ const listeners = this.eventListeners.get(eventName) ?? []
14
+ const onceListeners = this.onceListeners.get(eventName) ?? []
15
+
16
+ return [...listeners, ...onceListeners]
17
+ }
18
+
19
+ public listenersCount<TEventName extends EventNames<TEventMap, TStrict>>(eventName: TEventName) {
20
+ const listeners = this.eventListeners.get(eventName)
21
+ const onceListeners = this.onceListeners.get(eventName)
22
+
23
+ return (listeners?.size ?? 0) + (onceListeners?.size ?? 0)
24
+ }
25
+
26
+ public eventNames(): Array<PropertyKey | keyof TEventMap> {
27
+ return [...new Set([...this.eventListeners.keys(), ...this.onceListeners.keys()])]
28
+ }
29
+
30
+ public on<TEventName extends EventNames<TEventMap, TStrict>>(eventName: TEventName, listener: EventListener<EventArgs<TEventMap, TEventName, TStrict>>): this {
31
+ this.#addTo(this.eventListeners, eventName, listener)
32
+
33
+ return this
34
+ }
35
+
36
+ public once<TEventName extends EventNames<TEventMap, TStrict>>(eventName: TEventName, listener: EventListener<EventArgs<TEventMap, TEventName, TStrict>>): this {
37
+ this.#addTo(this.onceListeners, eventName, listener)
38
+
39
+ return this
40
+ }
41
+
42
+ public off<TEventName extends EventNames<TEventMap, TStrict>>(eventName: TEventName, listener: EventListener<EventArgs<TEventMap, TEventName, TStrict>>): this {
43
+ this.#removeFrom(this.eventListeners, eventName, listener)
44
+ this.#removeFrom(this.onceListeners, eventName, listener)
45
+
46
+ return this
47
+ }
48
+
49
+ public emit<TEventName extends EventNames<TEventMap, TStrict>>(eventName: TEventName, ...args: EventArgs<TEventMap, TEventName, TStrict>): boolean {
50
+ const regularSnapshot = this.#takeSnapshot(this.eventListeners.get(eventName))
51
+ const onceSnapshot = this.#takeSnapshot(this.onceListeners.get(eventName))
52
+
53
+ this.onceListeners.delete(eventName)
54
+
55
+ const fromRegular = this.#emitSnapshot(regularSnapshot, args)
56
+ const fromOnce = this.#emitSnapshot(onceSnapshot, args)
57
+
58
+ return fromRegular || fromOnce
59
+ }
60
+
61
+ public removeAllListeners<TEventName extends EventNames<TEventMap, TStrict>>(eventName?: TEventName): this {
62
+ if (eventName === undefined) {
63
+ this.eventListeners.clear()
64
+ this.onceListeners.clear()
65
+ } else {
66
+ this.eventListeners.delete(eventName)
67
+ this.onceListeners.delete(eventName)
68
+ }
69
+
70
+ return this
71
+ }
72
+
73
+ #addTo(map: EventListenerMap, eventName: PropertyKey, listener: EventListener) {
74
+ let set = map.get(eventName)
75
+
76
+ if (!set) {
77
+ set = new Set()
78
+ map.set(eventName, set)
79
+ }
80
+
81
+ set.add(listener)
82
+ }
83
+
84
+ #removeFrom(map: EventListenerMap, eventName: PropertyKey, listener: EventListener) {
85
+ const set = map.get(eventName)
86
+
87
+ if (!set) {
88
+ return
89
+ }
90
+
91
+ set.delete(listener)
92
+
93
+ if (set.size === 0) {
94
+ map.delete(eventName)
95
+ }
96
+ }
97
+
98
+ #takeSnapshot(set: Set<EventListener> | undefined) {
99
+ if (!set || set.size === 0) {
100
+ return []
101
+ }
102
+
103
+ return [...set]
104
+ }
105
+
106
+ #emitSnapshot(snapshot: EventListener[], args: any[]) {
107
+ if (snapshot.length === 0) {
108
+ return false
109
+ }
110
+
111
+ for (const listener of snapshot) {
112
+ listener(...args)
113
+ }
114
+
115
+ return true
116
+ }
117
+ }
@@ -0,0 +1,2 @@
1
+ export * from './emitter'
2
+ export type * from './types'
@@ -0,0 +1,11 @@
1
+ export type EventMap = Record<PropertyKey, any[]>
2
+
3
+ export type EventNames<TEventMap, TStrict extends boolean> = TStrict extends true ? keyof TEventMap : keyof TEventMap | string
4
+
5
+ export type ResolveEventArgs<TEventMap, TEventName> = TEventName extends keyof TEventMap ? TEventMap[TEventName] extends any[] ? TEventMap[TEventName] : any[] : any[]
6
+
7
+ export type EventArgs<TEventMap, TEventName, TStrict extends boolean> = TStrict extends true ? TEventName extends keyof TEventMap ? ResolveEventArgs<TEventMap, TEventName> : never : ResolveEventArgs<TEventMap, TEventName>
8
+
9
+ export type EventListener<TArgs = any[]> = (...args: TArgs extends any[] ? TArgs : any[]) => void
10
+
11
+ export type EventListenerMap = Map<PropertyKey, Set<EventListener>>
@@ -0,0 +1,17 @@
1
+ import { isFunction } from './guards'
2
+
3
+ export function tap<T>(value: T, callback: (value: T) => void) {
4
+ callback(value)
5
+
6
+ return value
7
+ }
8
+
9
+ export const transform = <T, R>(value: T, callback: (value: T) => R) => callback(value)
10
+
11
+ export function tryCatch<T>(fn: () => T, fallback: T | ((error: unknown) => T)) {
12
+ try {
13
+ return fn()
14
+ } catch (error) {
15
+ return isFunction(fallback) ? fallback(error) : fallback
16
+ }
17
+ }
@@ -0,0 +1,34 @@
1
+ import type { Args, Fn, TimingControlled } from './types'
2
+ import { createTimerState, flushTimer, invokeTimer } from './timer-state'
3
+
4
+ export type Debounced<T extends Fn> = TimingControlled<T>
5
+
6
+ export function debounce<T extends Fn>(fn: T, wait: number): Debounced<T> {
7
+ const state = createTimerState<T>()
8
+ const invoke = () => invokeTimer(state, fn)
9
+
10
+ const debounced: Debounced<T> = function (this: unknown, ...args: Args<T>) {
11
+ state.lastArgs = args
12
+ state.lastThis = this
13
+
14
+ if (state.timeoutId !== undefined) {
15
+ clearTimeout(state.timeoutId)
16
+ }
17
+
18
+ state.timeoutId = setTimeout(invoke, wait)
19
+ }
20
+
21
+ debounced.cancel = () => {
22
+ if (state.timeoutId !== undefined) {
23
+ clearTimeout(state.timeoutId)
24
+ state.timeoutId = undefined
25
+ state.lastArgs = undefined
26
+ }
27
+ }
28
+
29
+ debounced.flush = () => {
30
+ return flushTimer(state, invoke)
31
+ }
32
+
33
+ return debounced
34
+ }