@kdtlabs/utils 0.0.4 → 0.0.5

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 (447) hide show
  1. package/SKILL.md +7 -9
  2. package/{common → dist/common}/assertions.d.ts +1 -1
  3. package/{common → dist/common}/assertions.d.ts.map +1 -1
  4. package/{common → dist/common}/types.d.ts +1 -1
  5. package/{common → dist/common}/types.d.ts.map +1 -1
  6. package/{functions → dist/functions}/executions.d.ts +1 -1
  7. package/{functions → dist/functions}/executions.d.ts.map +1 -1
  8. package/dist/index.js +7 -0
  9. package/dist/index.js.map +99 -0
  10. package/{objects → dist/objects}/transformations.d.ts +1 -1
  11. package/{objects → dist/objects}/transformations.d.ts.map +1 -1
  12. package/{objects → dist/objects}/types.d.ts +1 -1
  13. package/{objects → dist/objects}/types.d.ts.map +1 -1
  14. package/{promises → dist/promises}/deferred.d.ts +1 -1
  15. package/{promises → dist/promises}/deferred.d.ts.map +1 -1
  16. package/{promises → dist/promises}/timers.d.ts +1 -1
  17. package/{promises → dist/promises}/timers.d.ts.map +1 -1
  18. package/{serializer → dist/serializer}/context.d.ts +1 -1
  19. package/{serializer → dist/serializer}/context.d.ts.map +1 -1
  20. package/{serializer → dist/serializer}/serialize.d.ts +1 -1
  21. package/{serializer → dist/serializer}/serialize.d.ts.map +1 -1
  22. package/{serializer → dist/serializer}/serializers/array.d.ts +1 -1
  23. package/{serializer → dist/serializer}/serializers/array.d.ts.map +1 -1
  24. package/{serializer → dist/serializer}/serializers/binary.d.ts +1 -1
  25. package/dist/serializer/serializers/binary.d.ts.map +1 -0
  26. package/{serializer → dist/serializer}/serializers/blob.d.ts +1 -1
  27. package/dist/serializer/serializers/blob.d.ts.map +1 -0
  28. package/{serializer → dist/serializer}/serializers/collection.d.ts +1 -1
  29. package/{serializer → dist/serializer}/serializers/collection.d.ts.map +1 -1
  30. package/{serializer → dist/serializer}/serializers/compound.d.ts +1 -1
  31. package/{serializer → dist/serializer}/serializers/compound.d.ts.map +1 -1
  32. package/{serializer → dist/serializer}/serializers/error.d.ts +1 -1
  33. package/{serializer → dist/serializer}/serializers/error.d.ts.map +1 -1
  34. package/{serializer → dist/serializer}/serializers/function.d.ts +1 -1
  35. package/{serializer → dist/serializer}/serializers/function.d.ts.map +1 -1
  36. package/{serializer → dist/serializer}/serializers/leaf-object.d.ts +1 -1
  37. package/{serializer → dist/serializer}/serializers/leaf-object.d.ts.map +1 -1
  38. package/{serializer → dist/serializer}/serializers/number.d.ts +1 -1
  39. package/dist/serializer/serializers/number.d.ts.map +1 -0
  40. package/{serializer → dist/serializer}/serializers/object.d.ts +1 -1
  41. package/{serializer → dist/serializer}/serializers/object.d.ts.map +1 -1
  42. package/{serializer → dist/serializer}/serializers/opaque.d.ts +1 -1
  43. package/dist/serializer/serializers/opaque.d.ts.map +1 -0
  44. package/{serializer → dist/serializer}/serializers/primitive.d.ts +1 -1
  45. package/{serializer → dist/serializer}/serializers/primitive.d.ts.map +1 -1
  46. package/{serializer → dist/serializer}/types.d.ts +1 -1
  47. package/{serializer → dist/serializer}/types.d.ts.map +1 -1
  48. package/{serializer → dist/serializer}/utils.d.ts +1 -1
  49. package/{serializer → dist/serializer}/utils.d.ts.map +1 -1
  50. package/{system → dist/system}/fetch.d.ts +2 -2
  51. package/{system → dist/system}/fetch.d.ts.map +1 -1
  52. package/dist/system/types.d.ts +3 -0
  53. package/{system → dist/system}/types.d.ts.map +1 -1
  54. package/{times → dist/times}/conversions.d.ts +1 -1
  55. package/{times → dist/times}/conversions.d.ts.map +1 -1
  56. package/package.json +11 -73
  57. package/src/arrays/accessors.ts +25 -0
  58. package/src/arrays/conversions.ts +16 -0
  59. package/src/arrays/factories.ts +13 -0
  60. package/src/arrays/guards.ts +7 -0
  61. package/src/arrays/index.ts +8 -0
  62. package/src/arrays/operations.ts +103 -0
  63. package/src/arrays/set-operations.ts +11 -0
  64. package/src/arrays/types.ts +21 -0
  65. package/src/buffers/conversions.ts +26 -0
  66. package/src/buffers/guards.ts +13 -0
  67. package/src/buffers/index.ts +5 -0
  68. package/src/buffers/operations.ts +44 -0
  69. package/src/buffers/types.ts +1 -0
  70. package/src/collections/fifo-map.ts +33 -0
  71. package/src/collections/fifo-set.ts +29 -0
  72. package/src/collections/guards.ts +11 -0
  73. package/src/collections/index.ts +10 -0
  74. package/src/collections/linked-base.ts +117 -0
  75. package/src/collections/linked-map.ts +82 -0
  76. package/src/collections/linked-set.ts +69 -0
  77. package/src/collections/lru-map.ts +36 -0
  78. package/src/collections/lru-set.ts +25 -0
  79. package/src/collections/types.ts +12 -0
  80. package/src/common/assertions.ts +11 -0
  81. package/src/common/guards.ts +58 -0
  82. package/src/common/index.ts +5 -0
  83. package/src/common/transformations.ts +20 -0
  84. package/src/common/types.ts +3 -0
  85. package/src/core/constants.ts +1 -0
  86. package/src/core/conversions.ts +9 -0
  87. package/src/core/guards.ts +57 -0
  88. package/src/core/index.ts +5 -0
  89. package/src/core/types.ts +15 -0
  90. package/src/errors/base-error.ts +48 -0
  91. package/src/errors/factories.ts +74 -0
  92. package/src/errors/guards.ts +12 -0
  93. package/src/errors/index.ts +7 -0
  94. package/src/errors/operations.ts +15 -0
  95. package/src/errors/stringify.ts +131 -0
  96. package/src/errors/types.ts +11 -0
  97. package/src/events/emitter.ts +117 -0
  98. package/src/events/index.ts +2 -0
  99. package/src/events/types.ts +11 -0
  100. package/src/functions/compositions.ts +17 -0
  101. package/src/functions/debounce.ts +34 -0
  102. package/src/functions/executions.ts +12 -0
  103. package/src/functions/guards.ts +5 -0
  104. package/src/functions/index.ts +11 -0
  105. package/src/functions/memoize.ts +33 -0
  106. package/src/functions/once.ts +33 -0
  107. package/src/functions/pipe.ts +39 -0
  108. package/src/functions/throttle.ts +59 -0
  109. package/src/functions/timer-state.ts +33 -0
  110. package/src/functions/types.ts +8 -0
  111. package/src/index.ts +16 -0
  112. package/src/json-rpc/constants.ts +15 -0
  113. package/src/json-rpc/factories.ts +22 -0
  114. package/src/json-rpc/guards.ts +58 -0
  115. package/src/json-rpc/index.ts +5 -0
  116. package/src/json-rpc/types.ts +48 -0
  117. package/src/numbers/bigint-math.ts +163 -0
  118. package/src/numbers/constants.ts +14 -0
  119. package/src/numbers/conversions.ts +83 -0
  120. package/src/numbers/factories.ts +6 -0
  121. package/src/numbers/formats.ts +52 -0
  122. package/src/numbers/guards.ts +22 -0
  123. package/src/numbers/index.ts +10 -0
  124. package/src/numbers/maths.ts +28 -0
  125. package/src/numbers/ranges.ts +17 -0
  126. package/src/numbers/types.ts +7 -0
  127. package/src/objects/deep-merge.ts +76 -0
  128. package/src/objects/guards.ts +21 -0
  129. package/src/objects/index.ts +5 -0
  130. package/src/objects/transformations.ts +34 -0
  131. package/src/objects/types.ts +33 -0
  132. package/src/promises/abortable.ts +37 -0
  133. package/src/promises/compositions.ts +18 -0
  134. package/src/promises/deferred.ts +131 -0
  135. package/src/promises/guards.ts +8 -0
  136. package/src/promises/index.ts +10 -0
  137. package/src/promises/pipe.ts +39 -0
  138. package/src/promises/poll.ts +92 -0
  139. package/src/promises/retry.ts +138 -0
  140. package/src/promises/timers.ts +16 -0
  141. package/src/promises/types.ts +1 -0
  142. package/src/serializer/constants.ts +5 -0
  143. package/src/serializer/context.ts +24 -0
  144. package/src/serializer/index.ts +8 -0
  145. package/src/serializer/serialize.ts +51 -0
  146. package/src/serializer/serializers/array.ts +17 -0
  147. package/src/serializer/serializers/binary.ts +24 -0
  148. package/src/serializer/serializers/blob.ts +18 -0
  149. package/src/serializer/serializers/collection.ts +25 -0
  150. package/src/serializer/serializers/compound.ts +79 -0
  151. package/src/serializer/serializers/error.ts +75 -0
  152. package/src/serializer/serializers/function.ts +13 -0
  153. package/src/serializer/serializers/index.ts +12 -0
  154. package/src/serializer/serializers/leaf-object.ts +18 -0
  155. package/src/serializer/serializers/number.ts +14 -0
  156. package/src/serializer/serializers/object.ts +62 -0
  157. package/src/serializer/serializers/opaque.ts +36 -0
  158. package/src/serializer/serializers/primitive.ts +32 -0
  159. package/src/serializer/symbol-registry.ts +28 -0
  160. package/src/serializer/types.ts +42 -0
  161. package/src/serializer/utils.ts +15 -0
  162. package/src/strings/constants.ts +1 -0
  163. package/src/strings/factories.ts +9 -0
  164. package/src/strings/guards.ts +51 -0
  165. package/src/strings/index.ts +6 -0
  166. package/src/strings/manipulations.ts +99 -0
  167. package/src/strings/types.ts +3 -0
  168. package/src/system/env.ts +32 -0
  169. package/src/system/fetch.ts +23 -0
  170. package/src/system/graceful-exit.ts +46 -0
  171. package/src/system/index.ts +6 -0
  172. package/src/system/path.ts +12 -0
  173. package/src/system/types.ts +3 -0
  174. package/src/times/constants.ts +6 -0
  175. package/src/times/conversions.ts +85 -0
  176. package/src/times/factories.ts +3 -0
  177. package/src/times/guards.ts +3 -0
  178. package/src/times/index.ts +5 -0
  179. package/src/times/operations.ts +9 -0
  180. package/CHANGELOG.md +0 -57
  181. package/arrays/index.js +0 -4
  182. package/arrays/index.js.map +0 -9
  183. package/buffers/index.js +0 -4
  184. package/buffers/index.js.map +0 -9
  185. package/chunk-25ja9350.js +0 -4
  186. package/chunk-25ja9350.js.map +0 -13
  187. package/chunk-3w6nt7kb.js +0 -4
  188. package/chunk-3w6nt7kb.js.map +0 -12
  189. package/chunk-5txwcr6j.js +0 -4
  190. package/chunk-5txwcr6j.js.map +0 -17
  191. package/chunk-6dxad51h.js +0 -4
  192. package/chunk-6dxad51h.js.map +0 -12
  193. package/chunk-6kdnnxe0.js +0 -4
  194. package/chunk-6kdnnxe0.js.map +0 -17
  195. package/chunk-7cndek91.js +0 -4
  196. package/chunk-7cndek91.js.map +0 -15
  197. package/chunk-bee0nxse.js +0 -6
  198. package/chunk-bee0nxse.js.map +0 -14
  199. package/chunk-bjmntg2y.js +0 -4
  200. package/chunk-bjmntg2y.js.map +0 -18
  201. package/chunk-d0d0d285.js +0 -4
  202. package/chunk-d0d0d285.js.map +0 -26
  203. package/chunk-jny2gdyy.js +0 -4
  204. package/chunk-jny2gdyy.js.map +0 -12
  205. package/chunk-kbzgn0z4.js +0 -4
  206. package/chunk-kbzgn0z4.js.map +0 -10
  207. package/chunk-qmbgp0vr.js +0 -4
  208. package/chunk-qmbgp0vr.js.map +0 -12
  209. package/chunk-qn6n0ff5.js +0 -4
  210. package/chunk-qn6n0ff5.js.map +0 -17
  211. package/chunk-r3maskdb.js +0 -5
  212. package/chunk-r3maskdb.js.map +0 -13
  213. package/chunk-st3dxvqt.js +0 -4
  214. package/chunk-st3dxvqt.js.map +0 -14
  215. package/chunk-xp18wdk6.js +0 -4
  216. package/chunk-xp18wdk6.js.map +0 -12
  217. package/collections/index.js +0 -4
  218. package/collections/index.js.map +0 -9
  219. package/common/index.js +0 -4
  220. package/common/index.js.map +0 -9
  221. package/core/index.js +0 -4
  222. package/core/index.js.map +0 -9
  223. package/errors/index.js +0 -4
  224. package/errors/index.js.map +0 -9
  225. package/events/index.js +0 -4
  226. package/events/index.js.map +0 -9
  227. package/functions/index.js +0 -4
  228. package/functions/index.js.map +0 -9
  229. package/index.js +0 -4
  230. package/index.js.map +0 -9
  231. package/json-rpc/index.js +0 -4
  232. package/json-rpc/index.js.map +0 -9
  233. package/meta.json +0 -2998
  234. package/meta.md +0 -1816
  235. package/numbers/index.js +0 -4
  236. package/numbers/index.js.map +0 -9
  237. package/objects/index.js +0 -4
  238. package/objects/index.js.map +0 -9
  239. package/promises/index.js +0 -4
  240. package/promises/index.js.map +0 -9
  241. package/serializer/index.js +0 -4
  242. package/serializer/index.js.map +0 -9
  243. package/serializer/serializers/binary.d.ts.map +0 -1
  244. package/serializer/serializers/blob.d.ts.map +0 -1
  245. package/serializer/serializers/number.d.ts.map +0 -1
  246. package/serializer/serializers/opaque.d.ts.map +0 -1
  247. package/strings/index.js +0 -4
  248. package/strings/index.js.map +0 -9
  249. package/system/index.js +0 -4
  250. package/system/index.js.map +0 -9
  251. package/system/types.d.ts +0 -3
  252. package/times/index.js +0 -4
  253. package/times/index.js.map +0 -9
  254. /package/{arrays → dist/arrays}/accessors.d.ts +0 -0
  255. /package/{arrays → dist/arrays}/accessors.d.ts.map +0 -0
  256. /package/{arrays → dist/arrays}/conversions.d.ts +0 -0
  257. /package/{arrays → dist/arrays}/conversions.d.ts.map +0 -0
  258. /package/{arrays → dist/arrays}/factories.d.ts +0 -0
  259. /package/{arrays → dist/arrays}/factories.d.ts.map +0 -0
  260. /package/{arrays → dist/arrays}/guards.d.ts +0 -0
  261. /package/{arrays → dist/arrays}/guards.d.ts.map +0 -0
  262. /package/{arrays → dist/arrays}/index.d.ts +0 -0
  263. /package/{arrays → dist/arrays}/index.d.ts.map +0 -0
  264. /package/{arrays → dist/arrays}/operations.d.ts +0 -0
  265. /package/{arrays → dist/arrays}/operations.d.ts.map +0 -0
  266. /package/{arrays → dist/arrays}/set-operations.d.ts +0 -0
  267. /package/{arrays → dist/arrays}/set-operations.d.ts.map +0 -0
  268. /package/{arrays → dist/arrays}/types.d.ts +0 -0
  269. /package/{arrays → dist/arrays}/types.d.ts.map +0 -0
  270. /package/{buffers → dist/buffers}/conversions.d.ts +0 -0
  271. /package/{buffers → dist/buffers}/conversions.d.ts.map +0 -0
  272. /package/{buffers → dist/buffers}/guards.d.ts +0 -0
  273. /package/{buffers → dist/buffers}/guards.d.ts.map +0 -0
  274. /package/{buffers → dist/buffers}/index.d.ts +0 -0
  275. /package/{buffers → dist/buffers}/index.d.ts.map +0 -0
  276. /package/{buffers → dist/buffers}/operations.d.ts +0 -0
  277. /package/{buffers → dist/buffers}/operations.d.ts.map +0 -0
  278. /package/{buffers → dist/buffers}/types.d.ts +0 -0
  279. /package/{buffers → dist/buffers}/types.d.ts.map +0 -0
  280. /package/{collections → dist/collections}/fifo-map.d.ts +0 -0
  281. /package/{collections → dist/collections}/fifo-map.d.ts.map +0 -0
  282. /package/{collections → dist/collections}/fifo-set.d.ts +0 -0
  283. /package/{collections → dist/collections}/fifo-set.d.ts.map +0 -0
  284. /package/{collections → dist/collections}/guards.d.ts +0 -0
  285. /package/{collections → dist/collections}/guards.d.ts.map +0 -0
  286. /package/{collections → dist/collections}/index.d.ts +0 -0
  287. /package/{collections → dist/collections}/index.d.ts.map +0 -0
  288. /package/{collections → dist/collections}/linked-base.d.ts +0 -0
  289. /package/{collections → dist/collections}/linked-base.d.ts.map +0 -0
  290. /package/{collections → dist/collections}/linked-map.d.ts +0 -0
  291. /package/{collections → dist/collections}/linked-map.d.ts.map +0 -0
  292. /package/{collections → dist/collections}/linked-set.d.ts +0 -0
  293. /package/{collections → dist/collections}/linked-set.d.ts.map +0 -0
  294. /package/{collections → dist/collections}/lru-map.d.ts +0 -0
  295. /package/{collections → dist/collections}/lru-map.d.ts.map +0 -0
  296. /package/{collections → dist/collections}/lru-set.d.ts +0 -0
  297. /package/{collections → dist/collections}/lru-set.d.ts.map +0 -0
  298. /package/{collections → dist/collections}/types.d.ts +0 -0
  299. /package/{collections → dist/collections}/types.d.ts.map +0 -0
  300. /package/{common → dist/common}/guards.d.ts +0 -0
  301. /package/{common → dist/common}/guards.d.ts.map +0 -0
  302. /package/{common → dist/common}/index.d.ts +0 -0
  303. /package/{common → dist/common}/index.d.ts.map +0 -0
  304. /package/{common → dist/common}/transformations.d.ts +0 -0
  305. /package/{common → dist/common}/transformations.d.ts.map +0 -0
  306. /package/{core → dist/core}/constants.d.ts +0 -0
  307. /package/{core → dist/core}/constants.d.ts.map +0 -0
  308. /package/{core → dist/core}/conversions.d.ts +0 -0
  309. /package/{core → dist/core}/conversions.d.ts.map +0 -0
  310. /package/{core → dist/core}/guards.d.ts +0 -0
  311. /package/{core → dist/core}/guards.d.ts.map +0 -0
  312. /package/{core → dist/core}/index.d.ts +0 -0
  313. /package/{core → dist/core}/index.d.ts.map +0 -0
  314. /package/{core → dist/core}/types.d.ts +0 -0
  315. /package/{core → dist/core}/types.d.ts.map +0 -0
  316. /package/{errors → dist/errors}/base-error.d.ts +0 -0
  317. /package/{errors → dist/errors}/base-error.d.ts.map +0 -0
  318. /package/{errors → dist/errors}/factories.d.ts +0 -0
  319. /package/{errors → dist/errors}/factories.d.ts.map +0 -0
  320. /package/{errors → dist/errors}/guards.d.ts +0 -0
  321. /package/{errors → dist/errors}/guards.d.ts.map +0 -0
  322. /package/{errors → dist/errors}/index.d.ts +0 -0
  323. /package/{errors → dist/errors}/index.d.ts.map +0 -0
  324. /package/{errors → dist/errors}/operations.d.ts +0 -0
  325. /package/{errors → dist/errors}/operations.d.ts.map +0 -0
  326. /package/{errors → dist/errors}/stringify.d.ts +0 -0
  327. /package/{errors → dist/errors}/stringify.d.ts.map +0 -0
  328. /package/{errors → dist/errors}/types.d.ts +0 -0
  329. /package/{errors → dist/errors}/types.d.ts.map +0 -0
  330. /package/{events → dist/events}/emitter.d.ts +0 -0
  331. /package/{events → dist/events}/emitter.d.ts.map +0 -0
  332. /package/{events → dist/events}/index.d.ts +0 -0
  333. /package/{events → dist/events}/index.d.ts.map +0 -0
  334. /package/{events → dist/events}/types.d.ts +0 -0
  335. /package/{events → dist/events}/types.d.ts.map +0 -0
  336. /package/{functions → dist/functions}/compositions.d.ts +0 -0
  337. /package/{functions → dist/functions}/compositions.d.ts.map +0 -0
  338. /package/{functions → dist/functions}/debounce.d.ts +0 -0
  339. /package/{functions → dist/functions}/debounce.d.ts.map +0 -0
  340. /package/{functions → dist/functions}/guards.d.ts +0 -0
  341. /package/{functions → dist/functions}/guards.d.ts.map +0 -0
  342. /package/{functions → dist/functions}/index.d.ts +0 -0
  343. /package/{functions → dist/functions}/index.d.ts.map +0 -0
  344. /package/{functions → dist/functions}/memoize.d.ts +0 -0
  345. /package/{functions → dist/functions}/memoize.d.ts.map +0 -0
  346. /package/{functions → dist/functions}/once.d.ts +0 -0
  347. /package/{functions → dist/functions}/once.d.ts.map +0 -0
  348. /package/{functions → dist/functions}/pipe.d.ts +0 -0
  349. /package/{functions → dist/functions}/pipe.d.ts.map +0 -0
  350. /package/{functions → dist/functions}/throttle.d.ts +0 -0
  351. /package/{functions → dist/functions}/throttle.d.ts.map +0 -0
  352. /package/{functions → dist/functions}/timer-state.d.ts +0 -0
  353. /package/{functions → dist/functions}/timer-state.d.ts.map +0 -0
  354. /package/{functions → dist/functions}/types.d.ts +0 -0
  355. /package/{functions → dist/functions}/types.d.ts.map +0 -0
  356. /package/{index.d.ts → dist/index.d.ts} +0 -0
  357. /package/{index.d.ts.map → dist/index.d.ts.map} +0 -0
  358. /package/{json-rpc → dist/json-rpc}/constants.d.ts +0 -0
  359. /package/{json-rpc → dist/json-rpc}/constants.d.ts.map +0 -0
  360. /package/{json-rpc → dist/json-rpc}/factories.d.ts +0 -0
  361. /package/{json-rpc → dist/json-rpc}/factories.d.ts.map +0 -0
  362. /package/{json-rpc → dist/json-rpc}/guards.d.ts +0 -0
  363. /package/{json-rpc → dist/json-rpc}/guards.d.ts.map +0 -0
  364. /package/{json-rpc → dist/json-rpc}/index.d.ts +0 -0
  365. /package/{json-rpc → dist/json-rpc}/index.d.ts.map +0 -0
  366. /package/{json-rpc → dist/json-rpc}/types.d.ts +0 -0
  367. /package/{json-rpc → dist/json-rpc}/types.d.ts.map +0 -0
  368. /package/{numbers → dist/numbers}/bigint-math.d.ts +0 -0
  369. /package/{numbers → dist/numbers}/bigint-math.d.ts.map +0 -0
  370. /package/{numbers → dist/numbers}/constants.d.ts +0 -0
  371. /package/{numbers → dist/numbers}/constants.d.ts.map +0 -0
  372. /package/{numbers → dist/numbers}/conversions.d.ts +0 -0
  373. /package/{numbers → dist/numbers}/conversions.d.ts.map +0 -0
  374. /package/{numbers → dist/numbers}/factories.d.ts +0 -0
  375. /package/{numbers → dist/numbers}/factories.d.ts.map +0 -0
  376. /package/{numbers → dist/numbers}/formats.d.ts +0 -0
  377. /package/{numbers → dist/numbers}/formats.d.ts.map +0 -0
  378. /package/{numbers → dist/numbers}/guards.d.ts +0 -0
  379. /package/{numbers → dist/numbers}/guards.d.ts.map +0 -0
  380. /package/{numbers → dist/numbers}/index.d.ts +0 -0
  381. /package/{numbers → dist/numbers}/index.d.ts.map +0 -0
  382. /package/{numbers → dist/numbers}/maths.d.ts +0 -0
  383. /package/{numbers → dist/numbers}/maths.d.ts.map +0 -0
  384. /package/{numbers → dist/numbers}/ranges.d.ts +0 -0
  385. /package/{numbers → dist/numbers}/ranges.d.ts.map +0 -0
  386. /package/{numbers → dist/numbers}/types.d.ts +0 -0
  387. /package/{numbers → dist/numbers}/types.d.ts.map +0 -0
  388. /package/{objects → dist/objects}/deep-merge.d.ts +0 -0
  389. /package/{objects → dist/objects}/deep-merge.d.ts.map +0 -0
  390. /package/{objects → dist/objects}/guards.d.ts +0 -0
  391. /package/{objects → dist/objects}/guards.d.ts.map +0 -0
  392. /package/{objects → dist/objects}/index.d.ts +0 -0
  393. /package/{objects → dist/objects}/index.d.ts.map +0 -0
  394. /package/{promises → dist/promises}/abortable.d.ts +0 -0
  395. /package/{promises → dist/promises}/abortable.d.ts.map +0 -0
  396. /package/{promises → dist/promises}/compositions.d.ts +0 -0
  397. /package/{promises → dist/promises}/compositions.d.ts.map +0 -0
  398. /package/{promises → dist/promises}/guards.d.ts +0 -0
  399. /package/{promises → dist/promises}/guards.d.ts.map +0 -0
  400. /package/{promises → dist/promises}/index.d.ts +0 -0
  401. /package/{promises → dist/promises}/index.d.ts.map +0 -0
  402. /package/{promises → dist/promises}/pipe.d.ts +0 -0
  403. /package/{promises → dist/promises}/pipe.d.ts.map +0 -0
  404. /package/{promises → dist/promises}/poll.d.ts +0 -0
  405. /package/{promises → dist/promises}/poll.d.ts.map +0 -0
  406. /package/{promises → dist/promises}/retry.d.ts +0 -0
  407. /package/{promises → dist/promises}/retry.d.ts.map +0 -0
  408. /package/{promises → dist/promises}/types.d.ts +0 -0
  409. /package/{promises → dist/promises}/types.d.ts.map +0 -0
  410. /package/{serializer → dist/serializer}/constants.d.ts +0 -0
  411. /package/{serializer → dist/serializer}/constants.d.ts.map +0 -0
  412. /package/{serializer → dist/serializer}/index.d.ts +0 -0
  413. /package/{serializer → dist/serializer}/index.d.ts.map +0 -0
  414. /package/{serializer → dist/serializer}/serializers/index.d.ts +0 -0
  415. /package/{serializer → dist/serializer}/serializers/index.d.ts.map +0 -0
  416. /package/{serializer → dist/serializer}/symbol-registry.d.ts +0 -0
  417. /package/{serializer → dist/serializer}/symbol-registry.d.ts.map +0 -0
  418. /package/{strings → dist/strings}/constants.d.ts +0 -0
  419. /package/{strings → dist/strings}/constants.d.ts.map +0 -0
  420. /package/{strings → dist/strings}/factories.d.ts +0 -0
  421. /package/{strings → dist/strings}/factories.d.ts.map +0 -0
  422. /package/{strings → dist/strings}/guards.d.ts +0 -0
  423. /package/{strings → dist/strings}/guards.d.ts.map +0 -0
  424. /package/{strings → dist/strings}/index.d.ts +0 -0
  425. /package/{strings → dist/strings}/index.d.ts.map +0 -0
  426. /package/{strings → dist/strings}/manipulations.d.ts +0 -0
  427. /package/{strings → dist/strings}/manipulations.d.ts.map +0 -0
  428. /package/{strings → dist/strings}/types.d.ts +0 -0
  429. /package/{strings → dist/strings}/types.d.ts.map +0 -0
  430. /package/{system → dist/system}/env.d.ts +0 -0
  431. /package/{system → dist/system}/env.d.ts.map +0 -0
  432. /package/{system → dist/system}/graceful-exit.d.ts +0 -0
  433. /package/{system → dist/system}/graceful-exit.d.ts.map +0 -0
  434. /package/{system → dist/system}/index.d.ts +0 -0
  435. /package/{system → dist/system}/index.d.ts.map +0 -0
  436. /package/{system → dist/system}/path.d.ts +0 -0
  437. /package/{system → dist/system}/path.d.ts.map +0 -0
  438. /package/{times → dist/times}/constants.d.ts +0 -0
  439. /package/{times → dist/times}/constants.d.ts.map +0 -0
  440. /package/{times → dist/times}/factories.d.ts +0 -0
  441. /package/{times → dist/times}/factories.d.ts.map +0 -0
  442. /package/{times → dist/times}/guards.d.ts +0 -0
  443. /package/{times → dist/times}/guards.d.ts.map +0 -0
  444. /package/{times → dist/times}/index.d.ts +0 -0
  445. /package/{times → dist/times}/index.d.ts.map +0 -0
  446. /package/{times → dist/times}/operations.d.ts +0 -0
  447. /package/{times → dist/times}/operations.d.ts.map +0 -0
@@ -0,0 +1,76 @@
1
+ import type { AnyObject, DeepPartial } from './types'
2
+ import { isArray } from '../arrays'
3
+ import { unique } from '../arrays/set-operations'
4
+ import { isPlainObject } from './guards'
5
+
6
+ export type DeepMergeArrayMode = 'merge' | 'merge-dedupe' | 'replace'
7
+
8
+ export interface DeepMergeOptions {
9
+ arrayMode?: DeepMergeArrayMode
10
+ }
11
+
12
+ const DANGEROUS_KEYS = new Set(['__proto__', 'constructor', 'prototype'])
13
+
14
+ function mergeArrays(base: unknown[], override: unknown[], arrayMode: DeepMergeArrayMode): unknown[] {
15
+ if (arrayMode === 'replace') {
16
+ return override.map(deepCloneValue)
17
+ }
18
+
19
+ const merged = [...base, ...override]
20
+ const deduped = arrayMode === 'merge-dedupe' ? unique(merged) : merged
21
+
22
+ return deduped.map(deepCloneValue)
23
+ }
24
+
25
+ function deepCloneValue(value: unknown): unknown {
26
+ if (isPlainObject(value)) {
27
+ const cloned: Record<string, unknown> = {}
28
+
29
+ for (const key of Object.keys(value)) {
30
+ if (!DANGEROUS_KEYS.has(key)) {
31
+ cloned[key] = deepCloneValue(value[key])
32
+ }
33
+ }
34
+
35
+ return cloned
36
+ }
37
+
38
+ if (isArray(value)) {
39
+ return value.map(deepCloneValue)
40
+ }
41
+
42
+ return value
43
+ }
44
+
45
+ function mergeRecursive(base: Record<string, unknown>, override: Record<string, unknown>, arrayMode: DeepMergeArrayMode): Record<string, unknown> {
46
+ const result: Record<string, unknown> = {}
47
+
48
+ for (const key of Object.keys(base)) {
49
+ if (!DANGEROUS_KEYS.has(key)) {
50
+ result[key] = deepCloneValue(base[key])
51
+ }
52
+ }
53
+
54
+ for (const key of Object.keys(override)) {
55
+ if (DANGEROUS_KEYS.has(key)) {
56
+ continue
57
+ }
58
+
59
+ const baseVal = result[key]
60
+ const overrideVal = override[key]
61
+
62
+ if (isPlainObject(baseVal) && isPlainObject(overrideVal)) {
63
+ result[key] = mergeRecursive(baseVal, overrideVal, arrayMode)
64
+ } else if (isArray(baseVal) && isArray(overrideVal)) {
65
+ result[key] = mergeArrays(baseVal, overrideVal, arrayMode)
66
+ } else {
67
+ result[key] = deepCloneValue(overrideVal)
68
+ }
69
+ }
70
+
71
+ return result
72
+ }
73
+
74
+ export const deepMerge = <T extends AnyObject>(base: T, override: DeepPartial<T>, { arrayMode = 'replace' }: DeepMergeOptions = {}): T => (
75
+ mergeRecursive(base, override as Record<string, unknown>, arrayMode) as T
76
+ )
@@ -0,0 +1,21 @@
1
+ import type { AnyObject, UnknownObject } from './types'
2
+ import { isArray } from '../arrays'
3
+ import { toString } from '../core'
4
+
5
+ export const isObject = (value: unknown): value is AnyObject => value !== null && typeof value === 'object' && !isArray(value)
6
+
7
+ export const isPlainObject = (value: unknown): value is UnknownObject => {
8
+ if (toString(value) !== '[object Object]') {
9
+ return false
10
+ }
11
+
12
+ const proto = Object.getPrototypeOf(value)
13
+
14
+ return proto === null || proto === Object.prototype
15
+ }
16
+
17
+ export const isEmptyObject = (value: AnyObject) => Object.keys(value).length === 0
18
+
19
+ export const isKeyOf = <T extends AnyObject>(obj: T, name: PropertyKey): name is keyof T => name in obj
20
+
21
+ export const isKeysOf = <T extends PropertyKey>(data: AnyObject, ...keys: T[]): data is Record<T, unknown> => keys.every((key) => isKeyOf(data, key))
@@ -0,0 +1,5 @@
1
+ export * from './deep-merge'
2
+ export * from './guards'
3
+ export * from './transformations'
4
+
5
+ export type * from './types'
@@ -0,0 +1,34 @@
1
+ import type { AnyObject, FilterPredicate } from './types'
2
+ import { isNullish, type Nullish } from '../core'
3
+
4
+ export const entries = <O extends AnyObject>(obj: O) => Object.entries(obj) as Array<[keyof O, O[keyof O]]>
5
+
6
+ export const filter = <O extends AnyObject>(obj: O, predicate: FilterPredicate<O, keyof O>): Partial<O> => (
7
+ Object.fromEntries(entries(obj).filter(([key, value], index) => predicate(key, value, index))) as Partial<O>
8
+ )
9
+
10
+ export const filterByValue = <O extends AnyObject>(obj: O, predicate: (value: O[keyof O]) => boolean) => filter(obj, (_, value) => predicate(value))
11
+
12
+ export const pick = <O extends AnyObject, K extends keyof O>(obj: O, ...keys: K[]) => {
13
+ const set = new Set<PropertyKey>(keys)
14
+
15
+ return filter(obj, (key) => set.has(key)) as Pick<O, K>
16
+ }
17
+
18
+ export const omit = <O extends AnyObject, K extends keyof O>(object: O, ...keys: K[]) => {
19
+ const set = new Set<PropertyKey>(keys)
20
+
21
+ return filter(object, (key) => !set.has(key)) as Omit<O, K>
22
+ }
23
+
24
+ export const map = <K extends PropertyKey, V, NK extends PropertyKey, NV>(obj: Record<K, V>, fn: (k: K, v: V, i: number) => [NK, NV]) => (
25
+ Object.fromEntries(entries(obj).map(([k, v], i) => fn(k, v, i))) as Record<NK, NV>
26
+ )
27
+
28
+ export function resolveOptions<T extends AnyObject>(options: Nullish<T | boolean>, defaultValue: T | false): T | false {
29
+ if (options === false) {
30
+ return false
31
+ }
32
+
33
+ return isNullish(options) || options === true ? defaultValue : options
34
+ }
@@ -0,0 +1,33 @@
1
+ import type { Primitive } from '../core'
2
+
3
+ export type PartialBy<T, K extends keyof T> = Omit<T, K> & Partial<Pick<T, K>>
4
+
5
+ export type RequiredBy<T, K extends keyof T> = Omit<T, K> & Required<Pick<T, K>>
6
+
7
+ export type Mutable<T> = { -readonly [K in keyof T]: T[K] }
8
+
9
+ export type DeepPartial<T> = T extends object ? { [K in keyof T]?: DeepPartial<T[K]> } : T
10
+
11
+ export type DeepReadonly<T> = T extends Primitive ? T : T extends Array<infer U> ? ReadonlyArray<DeepReadonly<U>> : { readonly [K in keyof T]: DeepReadonly<T[K]> }
12
+
13
+ export type KeysOfType<T, V> = { [K in keyof T]-?: T[K] extends V ? K : never }[keyof T]
14
+
15
+ export type StringKeys<T> = Extract<keyof T, string>
16
+
17
+ export type Dictionary<T = unknown> = Record<string, T>
18
+
19
+ export type DiscriminateUnion<T, K extends keyof T, V extends T[K]> = T extends Record<K, V> ? T : never
20
+
21
+ export type AnyObject = Record<string, any>
22
+
23
+ export type UnknownObject = Record<string, unknown>
24
+
25
+ export type Constructor<T> = new (...args: any[]) => T
26
+
27
+ export type ClassMethods<T> = { [K in keyof T]: T[K] extends (...args: any[]) => any ? K : never }[keyof T]
28
+
29
+ export type ClassMethodArgs<T, M extends ClassMethods<T>> = T[M] extends (...args: infer A) => any ? A : never
30
+
31
+ export type ClassMethodReturn<T, M extends ClassMethods<T>> = T[M] extends (...args: any[]) => infer R ? R : never
32
+
33
+ export type FilterPredicate<O, K extends keyof O> = (key: K, value: O[K], index: number) => boolean
@@ -0,0 +1,37 @@
1
+ import { createAbortError, ensureError, type Errorable } from '../errors'
2
+
3
+ export function abortable<T>(promise: Promise<T>, signal?: AbortSignal, error?: Errorable): Promise<T> {
4
+ if (!signal) {
5
+ return promise
6
+ }
7
+
8
+ const createError = () => (error ? ensureError(error) : (signal.reason ?? createAbortError()))
9
+
10
+ if (signal.aborted) {
11
+ return Promise.reject(createError())
12
+ }
13
+
14
+ return new Promise<T>((resolve, reject) => {
15
+ let isSettled = false
16
+ let onAbort: () => void
17
+
18
+ const cleanup = (afterCleanup?: () => void) => {
19
+ if (!isSettled) {
20
+ isSettled = true
21
+ signal.removeEventListener('abort', onAbort)
22
+ afterCleanup?.()
23
+ }
24
+ }
25
+
26
+ onAbort = () => {
27
+ cleanup(() => reject(createError()))
28
+ }
29
+
30
+ signal.addEventListener('abort', onAbort)
31
+
32
+ promise.then(
33
+ (value) => cleanup(() => resolve(value)),
34
+ (error_) => cleanup(() => reject(error_)),
35
+ )
36
+ })
37
+ }
@@ -0,0 +1,18 @@
1
+ import type { Awaitable } from './types'
2
+
3
+ export const pTap = <T>(fn: (value: T) => Awaitable<unknown>) => async (value: T): Promise<T> => {
4
+ return Promise.resolve(fn(value)).then(() => value)
5
+ }
6
+
7
+ pTap.catch = (fn: (error: unknown) => Awaitable<unknown>) => async (error: unknown): Promise<never> => {
8
+ await fn(error)
9
+ throw error
10
+ }
11
+
12
+ export async function tryCatchAsync<T>(fn: () => Awaitable<T>, fallback: (error: unknown) => Awaitable<T>) {
13
+ try {
14
+ return await fn()
15
+ } catch (error) {
16
+ return await fallback(error)
17
+ }
18
+ }
@@ -0,0 +1,131 @@
1
+ import { combineSignals, createAbortController, createAbortError, type Errorable } from '../errors'
2
+
3
+ export interface DeferredPromiseOptions<T> {
4
+ onCallbackError?: (error: unknown) => void
5
+ onReject?: (reason: unknown) => void
6
+ onResolve?: (value: PromiseLike<T> | T) => void
7
+ onSettle?: () => void
8
+ signal?: AbortSignal
9
+ synchronousCallbacks?: boolean
10
+ }
11
+
12
+ export interface DeferredPromise<T> extends Promise<T> {
13
+ isPending: boolean
14
+ isRejected: boolean
15
+ isResolved: boolean
16
+ isSettled: boolean
17
+ reject: (reason?: unknown) => void
18
+ resolve: (value: PromiseLike<T> | T) => void
19
+ }
20
+
21
+ export function cleanupAbortSignal(signal: AbortSignal | undefined, abortHandler: (() => void) | undefined) {
22
+ if (abortHandler) {
23
+ signal?.removeEventListener('abort', abortHandler)
24
+ }
25
+ }
26
+
27
+ export function setupAbortSignal(signal: AbortSignal | undefined, onAbort: () => void) {
28
+ const abortHandler = () => onAbort()
29
+
30
+ if (signal?.aborted) {
31
+ onAbort()
32
+ } else {
33
+ signal?.addEventListener('abort', abortHandler)
34
+ }
35
+
36
+ return abortHandler
37
+ }
38
+
39
+ export function invokeSettleCallback(cb: () => void, onSettle: (() => void) | undefined, onCallbackError: ((error: unknown) => void) | undefined, synchronousCallbacks: boolean) {
40
+ const callback = () => {
41
+ try {
42
+ cb()
43
+ } catch (error) {
44
+ onCallbackError?.(error)
45
+ }
46
+
47
+ try {
48
+ onSettle?.()
49
+ } catch (error) {
50
+ onCallbackError?.(error)
51
+ }
52
+ }
53
+
54
+ if (synchronousCallbacks) {
55
+ callback()
56
+ } else {
57
+ queueMicrotask(callback)
58
+ }
59
+ }
60
+
61
+ export function createDeferred<T>({ onCallbackError, onReject, onResolve, onSettle, signal, synchronousCallbacks = false }: DeferredPromiseOptions<T> = {}): DeferredPromise<T> {
62
+ let resolveFn: (value: PromiseLike<T> | T) => void
63
+ let rejectFn: (reason?: unknown) => void
64
+ let abortHandler: (() => void) | undefined
65
+
66
+ let isSettled = false
67
+ let isResolved = false
68
+ let isRejected = false
69
+
70
+ const promise = <DeferredPromise<T>> new Promise<T>((resolve, reject) => {
71
+ resolveFn = resolve
72
+ rejectFn = reject
73
+ })
74
+
75
+ const afterSettle = (cb: () => void) => {
76
+ cleanupAbortSignal(signal, abortHandler)
77
+ invokeSettleCallback(cb, onSettle, onCallbackError, synchronousCallbacks)
78
+ }
79
+
80
+ Object.defineProperty(promise, 'isSettled', { enumerable: true, get: () => isSettled })
81
+ Object.defineProperty(promise, 'isPending', { enumerable: true, get: () => !isSettled })
82
+ Object.defineProperty(promise, 'isResolved', { enumerable: true, get: () => isResolved })
83
+ Object.defineProperty(promise, 'isRejected', { enumerable: true, get: () => isRejected })
84
+
85
+ promise.resolve = (value: PromiseLike<T> | T) => {
86
+ if (isSettled) {
87
+ return
88
+ }
89
+
90
+ isSettled = true
91
+ isResolved = true
92
+
93
+ resolveFn(value)
94
+ afterSettle(() => onResolve?.(value))
95
+ }
96
+
97
+ promise.reject = (reason?: unknown) => {
98
+ if (isSettled) {
99
+ return
100
+ }
101
+
102
+ isSettled = true
103
+ isRejected = true
104
+
105
+ rejectFn(reason)
106
+ afterSettle(() => onReject?.(reason))
107
+ }
108
+
109
+ abortHandler = setupAbortSignal(signal, () => {
110
+ promise.reject(signal?.reason ?? createAbortError())
111
+ })
112
+
113
+ return promise
114
+ }
115
+
116
+ export interface DeferredPromiseWithTimeoutOptions<T> extends DeferredPromiseOptions<T> {
117
+ error?: Errorable
118
+ }
119
+
120
+ export const createDeferredWithTimeout = <T>(ms: number, { error, signal, ...options }: DeferredPromiseWithTimeoutOptions<T> = {}) => {
121
+ const timeoutController = createAbortController(ms, error)
122
+
123
+ return createDeferred<T>({
124
+ ...options,
125
+ onSettle() {
126
+ timeoutController.abort()
127
+ options.onSettle?.()
128
+ },
129
+ signal: combineSignals(signal, timeoutController.signal),
130
+ })
131
+ }
@@ -0,0 +1,8 @@
1
+ import { isFunction } from '../functions'
2
+ import { isObject } from '../objects'
3
+
4
+ export const isPromiseLike = <T>(value: unknown): value is PromiseLike<T> => isObject(value) && isFunction(value.then)
5
+
6
+ export const isPromise = <T>(value: unknown): value is Promise<T> => (
7
+ isObject(value) && isFunction(value.then) && isFunction(value.catch) && isFunction(value.finally)
8
+ )
@@ -0,0 +1,10 @@
1
+ export * from './abortable'
2
+ export * from './compositions'
3
+ export * from './deferred'
4
+ export * from './guards'
5
+ export * from './pipe'
6
+ export * from './poll'
7
+ export * from './retry'
8
+ export * from './timers'
9
+
10
+ export type * from './types'
@@ -0,0 +1,39 @@
1
+ import type { Awaitable } from './types'
2
+ import { isNonEmptyArray } from '../arrays'
3
+
4
+ export async function pPipe(): Promise<void>
5
+ export async function pPipe<T>(fn: () => Awaitable<T>): Promise<T>
6
+ export async function pPipe<T1, T2>(fn1: () => Awaitable<T1>, fn2: (arg: T1) => Awaitable<T2>): Promise<T2>
7
+ export async function pPipe<T1, T2, T3>(fn1: () => Awaitable<T1>, fn2: (arg: T1) => Awaitable<T2>, fn3: (arg: T2) => Awaitable<T3>): Promise<T3>
8
+ export async function pPipe<T1, T2, T3, T4>(fn1: () => Awaitable<T1>, fn2: (arg: T1) => Awaitable<T2>, fn3: (arg: T2) => Awaitable<T3>, fn4: (arg: T3) => Awaitable<T4>): Promise<T4>
9
+ export async function pPipe<T1, T2, T3, T4, T5>(fn1: () => Awaitable<T1>, fn2: (arg: T1) => Awaitable<T2>, fn3: (arg: T2) => Awaitable<T3>, fn4: (arg: T3) => Awaitable<T4>, fn5: (arg: T4) => Awaitable<T5>): Promise<T5>
10
+ export async function pPipe<T1, T2, T3, T4, T5, T6>(fn1: () => Awaitable<T1>, fn2: (arg: T1) => Awaitable<T2>, fn3: (arg: T2) => Awaitable<T3>, fn4: (arg: T3) => Awaitable<T4>, fn5: (arg: T4) => Awaitable<T5>, fn6: (arg: T5) => Awaitable<T6>): Promise<T6>
11
+ export async function pPipe<T1, T2, T3, T4, T5, T6, T7>(fn1: () => Awaitable<T1>, fn2: (arg: T1) => Awaitable<T2>, fn3: (arg: T2) => Awaitable<T3>, fn4: (arg: T3) => Awaitable<T4>, fn5: (arg: T4) => Awaitable<T5>, fn6: (arg: T5) => Awaitable<T6>, fn7: (arg: T6) => Awaitable<T7>): Promise<T7>
12
+ export async function pPipe<T1, T2, T3, T4, T5, T6, T7, T8>(fn1: () => Awaitable<T1>, fn2: (arg: T1) => Awaitable<T2>, fn3: (arg: T2) => Awaitable<T3>, fn4: (arg: T3) => Awaitable<T4>, fn5: (arg: T4) => Awaitable<T5>, fn6: (arg: T5) => Awaitable<T6>, fn7: (arg: T6) => Awaitable<T7>, fn8: (arg: T7) => Awaitable<T8>): Promise<T8>
13
+ export async function pPipe<T1, T2, T3, T4, T5, T6, T7, T8, T9>(fn1: () => Awaitable<T1>, fn2: (arg: T1) => Awaitable<T2>, fn3: (arg: T2) => Awaitable<T3>, fn4: (arg: T3) => Awaitable<T4>, fn5: (arg: T4) => Awaitable<T5>, fn6: (arg: T5) => Awaitable<T6>, fn7: (arg: T6) => Awaitable<T7>, fn8: (arg: T7) => Awaitable<T8>, fn9: (arg: T8) => Awaitable<T9>): Promise<T9>
14
+ export async function pPipe<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10>(fn1: () => Awaitable<T1>, fn2: (arg: T1) => Awaitable<T2>, fn3: (arg: T2) => Awaitable<T3>, fn4: (arg: T3) => Awaitable<T4>, fn5: (arg: T4) => Awaitable<T5>, fn6: (arg: T5) => Awaitable<T6>, fn7: (arg: T6) => Awaitable<T7>, fn8: (arg: T7) => Awaitable<T8>, fn9: (arg: T8) => Awaitable<T9>, fn10: (arg: T9) => Awaitable<T10>): Promise<T10>
15
+ export async function pPipe<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11>(fn1: () => Awaitable<T1>, fn2: (arg: T1) => Awaitable<T2>, fn3: (arg: T2) => Awaitable<T3>, fn4: (arg: T3) => Awaitable<T4>, fn5: (arg: T4) => Awaitable<T5>, fn6: (arg: T5) => Awaitable<T6>, fn7: (arg: T6) => Awaitable<T7>, fn8: (arg: T7) => Awaitable<T8>, fn9: (arg: T8) => Awaitable<T9>, fn10: (arg: T9) => Awaitable<T10>, fn11: (arg: T10) => Awaitable<T11>): Promise<T11>
16
+ export async function pPipe<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12>(fn1: () => Awaitable<T1>, fn2: (arg: T1) => Awaitable<T2>, fn3: (arg: T2) => Awaitable<T3>, fn4: (arg: T3) => Awaitable<T4>, fn5: (arg: T4) => Awaitable<T5>, fn6: (arg: T5) => Awaitable<T6>, fn7: (arg: T6) => Awaitable<T7>, fn8: (arg: T7) => Awaitable<T8>, fn9: (arg: T8) => Awaitable<T9>, fn10: (arg: T9) => Awaitable<T10>, fn11: (arg: T10) => Awaitable<T11>, fn12: (arg: T11) => Awaitable<T12>): Promise<T12>
17
+ export async function pPipe<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13>(fn1: () => Awaitable<T1>, fn2: (arg: T1) => Awaitable<T2>, fn3: (arg: T2) => Awaitable<T3>, fn4: (arg: T3) => Awaitable<T4>, fn5: (arg: T4) => Awaitable<T5>, fn6: (arg: T5) => Awaitable<T6>, fn7: (arg: T6) => Awaitable<T7>, fn8: (arg: T7) => Awaitable<T8>, fn9: (arg: T8) => Awaitable<T9>, fn10: (arg: T9) => Awaitable<T10>, fn11: (arg: T10) => Awaitable<T11>, fn12: (arg: T11) => Awaitable<T12>, fn13: (arg: T12) => Awaitable<T13>): Promise<T13>
18
+ export async function pPipe<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14>(fn1: () => Awaitable<T1>, fn2: (arg: T1) => Awaitable<T2>, fn3: (arg: T2) => Awaitable<T3>, fn4: (arg: T3) => Awaitable<T4>, fn5: (arg: T4) => Awaitable<T5>, fn6: (arg: T5) => Awaitable<T6>, fn7: (arg: T6) => Awaitable<T7>, fn8: (arg: T7) => Awaitable<T8>, fn9: (arg: T8) => Awaitable<T9>, fn10: (arg: T9) => Awaitable<T10>, fn11: (arg: T10) => Awaitable<T11>, fn12: (arg: T11) => Awaitable<T12>, fn13: (arg: T12) => Awaitable<T13>, fn14: (arg: T13) => Awaitable<T14>): Promise<T14>
19
+ export async function pPipe<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15>(fn1: () => Awaitable<T1>, fn2: (arg: T1) => Awaitable<T2>, fn3: (arg: T2) => Awaitable<T3>, fn4: (arg: T3) => Awaitable<T4>, fn5: (arg: T4) => Awaitable<T5>, fn6: (arg: T5) => Awaitable<T6>, fn7: (arg: T6) => Awaitable<T7>, fn8: (arg: T7) => Awaitable<T8>, fn9: (arg: T8) => Awaitable<T9>, fn10: (arg: T9) => Awaitable<T10>, fn11: (arg: T10) => Awaitable<T11>, fn12: (arg: T11) => Awaitable<T12>, fn13: (arg: T12) => Awaitable<T13>, fn14: (arg: T13) => Awaitable<T14>, fn15: (arg: T14) => Awaitable<T15>): Promise<T15>
20
+ export async function pPipe<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16>(fn1: () => Awaitable<T1>, fn2: (arg: T1) => Awaitable<T2>, fn3: (arg: T2) => Awaitable<T3>, fn4: (arg: T3) => Awaitable<T4>, fn5: (arg: T4) => Awaitable<T5>, fn6: (arg: T5) => Awaitable<T6>, fn7: (arg: T6) => Awaitable<T7>, fn8: (arg: T7) => Awaitable<T8>, fn9: (arg: T8) => Awaitable<T9>, fn10: (arg: T9) => Awaitable<T10>, fn11: (arg: T10) => Awaitable<T11>, fn12: (arg: T11) => Awaitable<T12>, fn13: (arg: T12) => Awaitable<T13>, fn14: (arg: T13) => Awaitable<T14>, fn15: (arg: T14) => Awaitable<T15>, fn16: (arg: T15) => Awaitable<T16>): Promise<T16>
21
+ export async function pPipe<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17>(fn1: () => Awaitable<T1>, fn2: (arg: T1) => Awaitable<T2>, fn3: (arg: T2) => Awaitable<T3>, fn4: (arg: T3) => Awaitable<T4>, fn5: (arg: T4) => Awaitable<T5>, fn6: (arg: T5) => Awaitable<T6>, fn7: (arg: T6) => Awaitable<T7>, fn8: (arg: T7) => Awaitable<T8>, fn9: (arg: T8) => Awaitable<T9>, fn10: (arg: T9) => Awaitable<T10>, fn11: (arg: T10) => Awaitable<T11>, fn12: (arg: T11) => Awaitable<T12>, fn13: (arg: T12) => Awaitable<T13>, fn14: (arg: T13) => Awaitable<T14>, fn15: (arg: T14) => Awaitable<T15>, fn16: (arg: T15) => Awaitable<T16>, fn17: (arg: T16) => Awaitable<T17>): Promise<T17>
22
+ export async function pPipe<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18>(fn1: () => Awaitable<T1>, fn2: (arg: T1) => Awaitable<T2>, fn3: (arg: T2) => Awaitable<T3>, fn4: (arg: T3) => Awaitable<T4>, fn5: (arg: T4) => Awaitable<T5>, fn6: (arg: T5) => Awaitable<T6>, fn7: (arg: T6) => Awaitable<T7>, fn8: (arg: T7) => Awaitable<T8>, fn9: (arg: T8) => Awaitable<T9>, fn10: (arg: T9) => Awaitable<T10>, fn11: (arg: T10) => Awaitable<T11>, fn12: (arg: T11) => Awaitable<T12>, fn13: (arg: T12) => Awaitable<T13>, fn14: (arg: T13) => Awaitable<T14>, fn15: (arg: T14) => Awaitable<T15>, fn16: (arg: T15) => Awaitable<T16>, fn17: (arg: T16) => Awaitable<T17>, fn18: (arg: T17) => Awaitable<T18>): Promise<T18>
23
+ export async function pPipe<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19>(fn1: () => Awaitable<T1>, fn2: (arg: T1) => Awaitable<T2>, fn3: (arg: T2) => Awaitable<T3>, fn4: (arg: T3) => Awaitable<T4>, fn5: (arg: T4) => Awaitable<T5>, fn6: (arg: T5) => Awaitable<T6>, fn7: (arg: T6) => Awaitable<T7>, fn8: (arg: T7) => Awaitable<T8>, fn9: (arg: T8) => Awaitable<T9>, fn10: (arg: T9) => Awaitable<T10>, fn11: (arg: T10) => Awaitable<T11>, fn12: (arg: T11) => Awaitable<T12>, fn13: (arg: T12) => Awaitable<T13>, fn14: (arg: T13) => Awaitable<T14>, fn15: (arg: T14) => Awaitable<T15>, fn16: (arg: T15) => Awaitable<T16>, fn17: (arg: T16) => Awaitable<T17>, fn18: (arg: T17) => Awaitable<T18>, fn19: (arg: T18) => Awaitable<T19>): Promise<T19>
24
+ export async function pPipe<T1, T2, T3, T4, T5, T6, T7, T8, T9, T10, T11, T12, T13, T14, T15, T16, T17, T18, T19, T20>(fn1: () => Awaitable<T1>, fn2: (arg: T1) => Awaitable<T2>, fn3: (arg: T2) => Awaitable<T3>, fn4: (arg: T3) => Awaitable<T4>, fn5: (arg: T4) => Awaitable<T5>, fn6: (arg: T5) => Awaitable<T6>, fn7: (arg: T6) => Awaitable<T7>, fn8: (arg: T7) => Awaitable<T8>, fn9: (arg: T8) => Awaitable<T9>, fn10: (arg: T9) => Awaitable<T10>, fn11: (arg: T10) => Awaitable<T11>, fn12: (arg: T11) => Awaitable<T12>, fn13: (arg: T12) => Awaitable<T13>, fn14: (arg: T13) => Awaitable<T14>, fn15: (arg: T14) => Awaitable<T15>, fn16: (arg: T15) => Awaitable<T16>, fn17: (arg: T16) => Awaitable<T17>, fn18: (arg: T17) => Awaitable<T18>, fn19: (arg: T18) => Awaitable<T19>, fn20: (arg: T19) => Awaitable<T20>): Promise<T20>
25
+ export async function pPipe(...fns: CallableFunction[]): Promise<unknown>
26
+
27
+ export async function pPipe(...fns: CallableFunction[]) {
28
+ if (!isNonEmptyArray(fns)) {
29
+ return
30
+ }
31
+
32
+ let result = await fns[0]()
33
+
34
+ for (let i = 1; i < fns.length; i++) {
35
+ result = await fns[i]!(result)
36
+ }
37
+
38
+ return result
39
+ }
@@ -0,0 +1,92 @@
1
+ import type { Awaitable } from './types'
2
+ import { assertParam } from '../common'
3
+ import { createAbortController, isAbortError } from '../errors'
4
+ import { isFunction } from '../functions'
5
+ import { isPlainObject } from '../objects'
6
+ import { abortable } from './abortable'
7
+ import { sleep } from './timers'
8
+
9
+ export interface PollOptions {
10
+ delay?: number
11
+ immediately?: boolean
12
+ onError?: (error: unknown) => void
13
+ stopOnError?: boolean
14
+ }
15
+
16
+ export type PollFn = (signal: AbortSignal) => Awaitable<void>
17
+
18
+ export function poll(fn: PollFn, options?: PollOptions): () => Promise<void>
19
+ export function poll(options: PollOptions, fn: PollFn): () => Promise<void>
20
+
21
+ export function poll(fnOrOptions: PollFn | PollOptions, optionsOrFn: PollFn | PollOptions = {}) {
22
+ let fn: PollFn
23
+ let options: PollOptions
24
+
25
+ if (isFunction(fnOrOptions) && isPlainObject(optionsOrFn)) {
26
+ fn = fnOrOptions
27
+ options = optionsOrFn
28
+ } else {
29
+ assertParam(isPlainObject(fnOrOptions), 'options must be an object')
30
+ assertParam(isFunction(optionsOrFn), 'fn must be a function')
31
+
32
+ fn = optionsOrFn
33
+ options = fnOrOptions
34
+ }
35
+
36
+ const { delay = 0, immediately = true, onError, stopOnError = true } = options
37
+ const abortController = createAbortController()
38
+
39
+ let isActive = true
40
+ let currentTask: Promise<void> | undefined
41
+
42
+ const stop = () => {
43
+ isActive = false
44
+ abortController.abort()
45
+
46
+ return currentTask ?? Promise.resolve()
47
+ }
48
+
49
+ let startRun: () => void
50
+
51
+ const run = async () => {
52
+ if (!isActive) {
53
+ return
54
+ }
55
+
56
+ try {
57
+ await abortable(Promise.resolve(fn(abortController.signal)), abortController.signal)
58
+
59
+ if (isActive) {
60
+ await sleep(delay, { signal: abortController.signal })
61
+ }
62
+ } catch (error) {
63
+ if (isAbortError(error) && !isActive) {
64
+ return
65
+ }
66
+
67
+ onError?.(error)
68
+
69
+ if (stopOnError) {
70
+ stop()
71
+
72
+ return
73
+ }
74
+ }
75
+
76
+ setTimeout(startRun, 0)
77
+ }
78
+
79
+ startRun = () => {
80
+ currentTask = run().finally(() => {
81
+ currentTask = undefined
82
+ })
83
+ }
84
+
85
+ if (immediately) {
86
+ Promise.resolve().then(startRun)
87
+ } else {
88
+ setTimeout(startRun, delay)
89
+ }
90
+
91
+ return stop
92
+ }
@@ -0,0 +1,138 @@
1
+ import type { Awaitable } from './types'
2
+ import { isAbortError } from '../errors'
3
+ import { clamp } from '../numbers'
4
+ import { abortable } from './abortable'
5
+ import { sleep } from './timers'
6
+
7
+ export interface GetRetryDelayOptions {
8
+ backoff?: number
9
+ delay?: number
10
+ jitter?: number
11
+ maxDelay?: number
12
+ }
13
+
14
+ export function getRetryDelay(attempts: number, { backoff = 2, delay = 1000, jitter = 0.01, maxDelay = 10_000 }: GetRetryDelayOptions = {}) {
15
+ const exponentialDelay = delay * backoff ** (attempts - 1)
16
+ const clampedDelay = clamp(exponentialDelay, 0, maxDelay)
17
+
18
+ if (jitter <= 0) {
19
+ return clampedDelay
20
+ }
21
+
22
+ const jitterRange = clampedDelay * jitter
23
+ const jitterOffset = (Math.random() - 0.5) * 2 * jitterRange
24
+
25
+ return clamp(clampedDelay + jitterOffset, 0, maxDelay)
26
+ }
27
+
28
+ export interface WithRetryContext {
29
+ attempts: number
30
+ retriesLeft: number
31
+ signal?: AbortSignal
32
+ }
33
+
34
+ export interface WithRetryOptions<T> extends GetRetryDelayOptions {
35
+ maxAttempts?: number
36
+ onBeforeWaitForNextAttempt?: (delay: number, context: WithRetryContext) => Awaitable<void>
37
+ onFailedAttempt?: (error: unknown, context: WithRetryContext) => Awaitable<void>
38
+ onSuccessAttempt?: (response: T, context: WithRetryContext) => Awaitable<void>
39
+ shouldRetry?: (error: unknown, context: WithRetryContext) => Awaitable<boolean>
40
+ shouldRetryOnSuccess?: (result: T, context: WithRetryContext) => Awaitable<boolean>
41
+ signal?: AbortSignal
42
+ }
43
+
44
+ export function createRetryError(errors: unknown[]) {
45
+ if (errors.length === 1) {
46
+ return errors[0]
47
+ }
48
+
49
+ return new AggregateError(errors, 'All retry attempts failed')
50
+ }
51
+
52
+ export function rethrowNonAbortError(error: unknown) {
53
+ if (!isAbortError(error)) {
54
+ throw error
55
+ }
56
+ }
57
+
58
+ export async function waitForNextRetryAttempt(attempts: number, delayOptions: GetRetryDelayOptions, onBeforeWaitForNextAttempt: WithRetryOptions<unknown>['onBeforeWaitForNextAttempt'], signal: AbortSignal | undefined, context: WithRetryContext) {
59
+ const delay = getRetryDelay(attempts, delayOptions)
60
+
61
+ await onBeforeWaitForNextAttempt?.(delay, context)
62
+ await sleep(delay, { signal }).catch(rethrowNonAbortError)
63
+ }
64
+
65
+ export async function handleRetryFailure<T>(error: unknown, errors: unknown[], retriesLeft: number, shouldRetry: WithRetryOptions<T>['shouldRetry'], onFailedAttempt: WithRetryOptions<T>['onFailedAttempt'], context: WithRetryContext) {
66
+ if (isAbortError(error)) {
67
+ throw error
68
+ }
69
+
70
+ errors.push(error)
71
+
72
+ if (retriesLeft <= 0) {
73
+ throw createRetryError(errors)
74
+ }
75
+
76
+ if (shouldRetry && !(await shouldRetry(error, context))) {
77
+ throw createRetryError(errors)
78
+ }
79
+
80
+ await onFailedAttempt?.(error, context)
81
+ }
82
+
83
+ export async function handleRetrySuccess<T>(result: T, errors: unknown[], retriesLeft: number, shouldRetryOnSuccess: WithRetryOptions<T>['shouldRetryOnSuccess'], onSuccessAttempt: WithRetryOptions<T>['onSuccessAttempt'], context: WithRetryContext): Promise<boolean> {
84
+ if (!shouldRetryOnSuccess || !(await shouldRetryOnSuccess(result, context))) {
85
+ return true
86
+ }
87
+
88
+ if (retriesLeft <= 0) {
89
+ throw createRetryError(errors)
90
+ }
91
+
92
+ await onSuccessAttempt?.(result, context)
93
+
94
+ return false
95
+ }
96
+
97
+ export async function withRetry<T>(fn: (signal?: AbortSignal) => Awaitable<T>, { maxAttempts = 3, onBeforeWaitForNextAttempt, onFailedAttempt, onSuccessAttempt, shouldRetry, shouldRetryOnSuccess, signal, ...delayOptions }: WithRetryOptions<T> = {}): Promise<T> {
98
+ if (maxAttempts < 1) {
99
+ throw new RangeError('maxAttempts must be at least 1')
100
+ }
101
+
102
+ if (signal) {
103
+ signal.throwIfAborted()
104
+ }
105
+
106
+ let attempts = 0
107
+ let result: T
108
+
109
+ const errors: unknown[] = []
110
+
111
+ while (attempts < maxAttempts) {
112
+ const retriesLeft = maxAttempts - ((attempts++) + 1)
113
+ const context = { attempts, retriesLeft, signal }
114
+
115
+ try {
116
+ if (signal) {
117
+ signal.throwIfAborted()
118
+ }
119
+
120
+ result = await abortable(Promise.resolve(fn(signal)), signal)
121
+ } catch (error) {
122
+ await handleRetryFailure(error, errors, retriesLeft, shouldRetry, onFailedAttempt, context)
123
+ await waitForNextRetryAttempt(attempts, delayOptions, onBeforeWaitForNextAttempt, signal, context)
124
+
125
+ continue
126
+ }
127
+
128
+ const shouldReturn = await handleRetrySuccess(result, errors, retriesLeft, shouldRetryOnSuccess, onSuccessAttempt, context)
129
+
130
+ if (shouldReturn) {
131
+ return result
132
+ }
133
+
134
+ await waitForNextRetryAttempt(attempts, delayOptions, onBeforeWaitForNextAttempt, signal, context)
135
+ }
136
+
137
+ throw createRetryError(errors)
138
+ }