@vielzeug/toolkit 1.1.3 → 2.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (764) hide show
  1. package/README.md +325 -452
  2. package/dist/array/chunk.cjs +2 -2
  3. package/dist/array/chunk.cjs.map +1 -1
  4. package/dist/array/chunk.d.ts +29 -0
  5. package/dist/array/chunk.d.ts.map +1 -0
  6. package/dist/array/chunk.js +22 -24
  7. package/dist/array/chunk.js.map +1 -1
  8. package/dist/array/contains.cjs +2 -2
  9. package/dist/array/contains.cjs.map +1 -1
  10. package/dist/array/contains.d.ts +19 -0
  11. package/dist/array/contains.d.ts.map +1 -0
  12. package/dist/array/contains.js +12 -9
  13. package/dist/array/contains.js.map +1 -1
  14. package/dist/array/fold.cjs +2 -0
  15. package/dist/array/fold.cjs.map +1 -0
  16. package/dist/array/fold.d.ts +21 -0
  17. package/dist/array/fold.d.ts.map +1 -0
  18. package/dist/array/fold.js +19 -0
  19. package/dist/array/fold.js.map +1 -0
  20. package/dist/array/group.cjs +2 -2
  21. package/dist/array/group.cjs.map +1 -1
  22. package/dist/array/group.d.ts +19 -0
  23. package/dist/array/group.d.ts.map +1 -0
  24. package/dist/array/group.js +18 -15
  25. package/dist/array/group.js.map +1 -1
  26. package/dist/array/index.d.ts +16 -0
  27. package/dist/array/index.d.ts.map +1 -0
  28. package/dist/array/keyBy.cjs +2 -0
  29. package/dist/array/keyBy.cjs.map +1 -0
  30. package/dist/array/keyBy.d.ts +20 -0
  31. package/dist/array/keyBy.d.ts.map +1 -0
  32. package/dist/array/keyBy.js +19 -0
  33. package/dist/array/keyBy.js.map +1 -0
  34. package/dist/array/list.cjs +2 -2
  35. package/dist/array/list.cjs.map +1 -1
  36. package/dist/array/list.d.ts +58 -0
  37. package/dist/array/list.d.ts.map +1 -0
  38. package/dist/array/list.js +103 -106
  39. package/dist/array/list.js.map +1 -1
  40. package/dist/array/pick.cjs +2 -2
  41. package/dist/array/pick.cjs.map +1 -1
  42. package/dist/array/pick.d.ts +19 -0
  43. package/dist/array/pick.d.ts.map +1 -0
  44. package/dist/array/pick.js +15 -14
  45. package/dist/array/pick.js.map +1 -1
  46. package/dist/array/remoteList.cjs +2 -2
  47. package/dist/array/remoteList.cjs.map +1 -1
  48. package/dist/array/remoteList.d.ts +64 -0
  49. package/dist/array/remoteList.d.ts.map +1 -0
  50. package/dist/array/remoteList.js +121 -122
  51. package/dist/array/remoteList.js.map +1 -1
  52. package/dist/array/replace.cjs +2 -0
  53. package/dist/array/replace.cjs.map +1 -0
  54. package/dist/array/replace.d.ts +20 -0
  55. package/dist/array/replace.d.ts.map +1 -0
  56. package/dist/array/replace.js +19 -0
  57. package/dist/array/replace.js.map +1 -0
  58. package/dist/array/rotate.cjs +2 -0
  59. package/dist/array/rotate.cjs.map +1 -0
  60. package/dist/array/rotate.d.ts +22 -0
  61. package/dist/array/rotate.d.ts.map +1 -0
  62. package/dist/array/rotate.js +19 -0
  63. package/dist/array/rotate.js.map +1 -0
  64. package/dist/array/search.cjs +2 -2
  65. package/dist/array/search.cjs.map +1 -1
  66. package/dist/array/search.d.ts +19 -0
  67. package/dist/array/search.d.ts.map +1 -0
  68. package/dist/array/search.js +23 -13
  69. package/dist/array/search.js.map +1 -1
  70. package/dist/array/select.cjs +2 -2
  71. package/dist/array/select.cjs.map +1 -1
  72. package/dist/array/select.d.ts +21 -0
  73. package/dist/array/select.d.ts.map +1 -0
  74. package/dist/array/select.js +16 -15
  75. package/dist/array/select.js.map +1 -1
  76. package/dist/array/sort.cjs +2 -2
  77. package/dist/array/sort.cjs.map +1 -1
  78. package/dist/array/sort.d.ts +26 -0
  79. package/dist/array/sort.d.ts.map +1 -0
  80. package/dist/array/sort.js +18 -12
  81. package/dist/array/sort.js.map +1 -1
  82. package/dist/array/toggle.cjs +2 -0
  83. package/dist/array/toggle.cjs.map +1 -0
  84. package/dist/array/toggle.d.ts +29 -0
  85. package/dist/array/toggle.d.ts.map +1 -0
  86. package/dist/array/toggle.js +9 -0
  87. package/dist/array/toggle.js.map +1 -0
  88. package/dist/array/uniq.cjs +2 -2
  89. package/dist/array/uniq.cjs.map +1 -1
  90. package/dist/array/uniq.d.ts +21 -0
  91. package/dist/array/uniq.d.ts.map +1 -0
  92. package/dist/array/uniq.js +15 -17
  93. package/dist/array/uniq.js.map +1 -1
  94. package/dist/async/attempt.cjs +2 -2
  95. package/dist/async/attempt.cjs.map +1 -1
  96. package/dist/async/attempt.d.ts +40 -0
  97. package/dist/async/attempt.d.ts.map +1 -0
  98. package/dist/async/attempt.js +19 -14
  99. package/dist/async/attempt.js.map +1 -1
  100. package/dist/async/defer.cjs +2 -2
  101. package/dist/async/defer.cjs.map +1 -1
  102. package/dist/async/defer.d.ts +23 -0
  103. package/dist/async/defer.d.ts.map +1 -0
  104. package/dist/async/defer.js +12 -9
  105. package/dist/async/defer.js.map +1 -1
  106. package/dist/async/index.d.ts +12 -0
  107. package/dist/async/index.d.ts.map +1 -0
  108. package/dist/async/parallel.cjs +2 -2
  109. package/dist/async/parallel.cjs.map +1 -1
  110. package/dist/async/parallel.d.ts +31 -0
  111. package/dist/async/parallel.d.ts.map +1 -0
  112. package/dist/async/parallel.js +26 -27
  113. package/dist/async/parallel.js.map +1 -1
  114. package/dist/async/pool.cjs +2 -2
  115. package/dist/async/pool.cjs.map +1 -1
  116. package/dist/async/pool.d.ts +21 -0
  117. package/dist/async/pool.d.ts.map +1 -0
  118. package/dist/async/pool.js +23 -21
  119. package/dist/async/pool.js.map +1 -1
  120. package/dist/async/predict.cjs +2 -2
  121. package/dist/async/predict.cjs.map +1 -1
  122. package/dist/async/predict.d.ts +24 -0
  123. package/dist/async/predict.d.ts.map +1 -0
  124. package/dist/async/predict.js +10 -12
  125. package/dist/async/predict.js.map +1 -1
  126. package/dist/async/queue.cjs +2 -2
  127. package/dist/async/queue.cjs.map +1 -1
  128. package/dist/async/queue.d.ts +43 -0
  129. package/dist/async/queue.d.ts.map +1 -0
  130. package/dist/async/queue.js +52 -56
  131. package/dist/async/queue.js.map +1 -1
  132. package/dist/async/race.cjs +2 -2
  133. package/dist/async/race.cjs.map +1 -1
  134. package/dist/async/race.d.ts +16 -0
  135. package/dist/async/race.d.ts.map +1 -0
  136. package/dist/async/race.js +8 -7
  137. package/dist/async/race.js.map +1 -1
  138. package/dist/async/retry.cjs +2 -2
  139. package/dist/async/retry.cjs.map +1 -1
  140. package/dist/async/retry.d.ts +32 -0
  141. package/dist/async/retry.d.ts.map +1 -0
  142. package/dist/async/retry.js +19 -24
  143. package/dist/async/retry.js.map +1 -1
  144. package/dist/async/scheduler.cjs +2 -0
  145. package/dist/async/scheduler.cjs.map +1 -0
  146. package/dist/async/scheduler.d.ts +51 -0
  147. package/dist/async/scheduler.d.ts.map +1 -0
  148. package/dist/async/scheduler.js +43 -0
  149. package/dist/async/scheduler.js.map +1 -0
  150. package/dist/async/sleep.cjs +2 -2
  151. package/dist/async/sleep.cjs.map +1 -1
  152. package/dist/async/sleep.d.ts +16 -0
  153. package/dist/async/sleep.d.ts.map +1 -0
  154. package/dist/async/sleep.js +11 -11
  155. package/dist/async/sleep.js.map +1 -1
  156. package/dist/async/waitFor.cjs +2 -2
  157. package/dist/async/waitFor.cjs.map +1 -1
  158. package/dist/async/waitFor.d.ts +33 -0
  159. package/dist/async/waitFor.d.ts.map +1 -0
  160. package/dist/async/waitFor.js +29 -36
  161. package/dist/async/waitFor.js.map +1 -1
  162. package/dist/date/expires.cjs +2 -2
  163. package/dist/date/expires.cjs.map +1 -1
  164. package/dist/date/expires.d.ts +15 -0
  165. package/dist/date/expires.d.ts.map +1 -0
  166. package/dist/date/expires.js +11 -10
  167. package/dist/date/expires.js.map +1 -1
  168. package/dist/date/index.d.ts +4 -0
  169. package/dist/date/index.d.ts.map +1 -0
  170. package/dist/date/interval.cjs +2 -2
  171. package/dist/date/interval.cjs.map +1 -1
  172. package/dist/date/interval.d.ts +25 -0
  173. package/dist/date/interval.d.ts.map +1 -0
  174. package/dist/date/interval.js +31 -37
  175. package/dist/date/interval.js.map +1 -1
  176. package/dist/date/timeDiff.cjs +2 -2
  177. package/dist/date/timeDiff.cjs.map +1 -1
  178. package/dist/date/timeDiff.d.ts +24 -0
  179. package/dist/date/timeDiff.d.ts.map +1 -0
  180. package/dist/date/timeDiff.js +58 -25
  181. package/dist/date/timeDiff.js.map +1 -1
  182. package/dist/function/assert.cjs +2 -3
  183. package/dist/function/assert.cjs.map +1 -1
  184. package/dist/function/assert.d.ts +38 -0
  185. package/dist/function/assert.d.ts.map +1 -0
  186. package/dist/function/assert.js +13 -11
  187. package/dist/function/assert.js.map +1 -1
  188. package/dist/function/assertParams.cjs +2 -2
  189. package/dist/function/assertParams.cjs.map +1 -1
  190. package/dist/function/assertParams.d.ts +24 -0
  191. package/dist/function/assertParams.d.ts.map +1 -0
  192. package/dist/function/assertParams.js +13 -12
  193. package/dist/function/assertParams.js.map +1 -1
  194. package/dist/function/compare.cjs +2 -2
  195. package/dist/function/compare.cjs.map +1 -1
  196. package/dist/function/compare.d.ts +23 -0
  197. package/dist/function/compare.d.ts.map +1 -0
  198. package/dist/function/compare.js +22 -21
  199. package/dist/function/compare.js.map +1 -1
  200. package/dist/function/compareBy.cjs +2 -2
  201. package/dist/function/compareBy.cjs.map +1 -1
  202. package/dist/function/compareBy.d.ts +24 -0
  203. package/dist/function/compareBy.d.ts.map +1 -0
  204. package/dist/function/compareBy.js +15 -14
  205. package/dist/function/compareBy.js.map +1 -1
  206. package/dist/function/compose.cjs +2 -2
  207. package/dist/function/compose.cjs.map +1 -1
  208. package/dist/function/compose.d.ts +22 -0
  209. package/dist/function/compose.d.ts.map +1 -0
  210. package/dist/function/compose.js +10 -13
  211. package/dist/function/compose.js.map +1 -1
  212. package/dist/function/curry.cjs +2 -2
  213. package/dist/function/curry.cjs.map +1 -1
  214. package/dist/function/curry.d.ts +21 -0
  215. package/dist/function/curry.d.ts.map +1 -0
  216. package/dist/function/curry.js +8 -7
  217. package/dist/function/curry.js.map +1 -1
  218. package/dist/function/debounce.cjs +2 -2
  219. package/dist/function/debounce.cjs.map +1 -1
  220. package/dist/function/debounce.d.ts +12 -0
  221. package/dist/function/debounce.d.ts.map +1 -0
  222. package/dist/function/debounce.js +34 -26
  223. package/dist/function/debounce.js.map +1 -1
  224. package/dist/function/fp.cjs +2 -2
  225. package/dist/function/fp.cjs.map +1 -1
  226. package/dist/function/fp.d.ts +24 -0
  227. package/dist/function/fp.d.ts.map +1 -0
  228. package/dist/function/fp.js +6 -10
  229. package/dist/function/fp.js.map +1 -1
  230. package/dist/function/index.d.ts +13 -0
  231. package/dist/function/index.d.ts.map +1 -0
  232. package/dist/function/memo.cjs +2 -2
  233. package/dist/function/memo.cjs.map +1 -1
  234. package/dist/function/memo.d.ts +30 -0
  235. package/dist/function/memo.d.ts.map +1 -0
  236. package/dist/function/memo.js +16 -24
  237. package/dist/function/memo.js.map +1 -1
  238. package/dist/function/once.cjs +2 -2
  239. package/dist/function/once.cjs.map +1 -1
  240. package/dist/function/once.d.ts +24 -0
  241. package/dist/function/once.d.ts.map +1 -0
  242. package/dist/function/once.js +10 -10
  243. package/dist/function/once.js.map +1 -1
  244. package/dist/function/pipe.cjs +2 -2
  245. package/dist/function/pipe.cjs.map +1 -1
  246. package/dist/function/pipe.d.ts +23 -0
  247. package/dist/function/pipe.d.ts.map +1 -0
  248. package/dist/function/pipe.js +10 -10
  249. package/dist/function/pipe.js.map +1 -1
  250. package/dist/function/throttle.cjs +2 -2
  251. package/dist/function/throttle.cjs.map +1 -1
  252. package/dist/function/throttle.d.ts +21 -0
  253. package/dist/function/throttle.d.ts.map +1 -0
  254. package/dist/function/throttle.js +45 -37
  255. package/dist/function/throttle.js.map +1 -1
  256. package/dist/index.cjs +1 -2
  257. package/dist/index.d.ts +77 -2813
  258. package/dist/index.d.ts.map +1 -0
  259. package/dist/index.js +75 -253
  260. package/dist/math/abs.cjs +2 -2
  261. package/dist/math/abs.cjs.map +1 -1
  262. package/dist/math/abs.d.ts +17 -0
  263. package/dist/math/abs.d.ts.map +1 -0
  264. package/dist/math/abs.js +7 -6
  265. package/dist/math/abs.js.map +1 -1
  266. package/dist/math/allocate.cjs +2 -2
  267. package/dist/math/allocate.cjs.map +1 -1
  268. package/dist/math/allocate.d.ts +24 -0
  269. package/dist/math/allocate.d.ts.map +1 -0
  270. package/dist/math/allocate.js +20 -28
  271. package/dist/math/allocate.js.map +1 -1
  272. package/dist/math/average.cjs +2 -2
  273. package/dist/math/average.cjs.map +1 -1
  274. package/dist/math/average.d.ts +16 -0
  275. package/dist/math/average.d.ts.map +1 -0
  276. package/dist/math/average.js +13 -24
  277. package/dist/math/average.js.map +1 -1
  278. package/dist/math/clamp.cjs +2 -2
  279. package/dist/math/clamp.cjs.map +1 -1
  280. package/dist/math/clamp.d.ts +18 -0
  281. package/dist/math/clamp.d.ts.map +1 -0
  282. package/dist/math/clamp.js +7 -6
  283. package/dist/math/clamp.js.map +1 -1
  284. package/dist/math/distribute.cjs +2 -2
  285. package/dist/math/distribute.cjs.map +1 -1
  286. package/dist/math/distribute.d.ts +24 -0
  287. package/dist/math/distribute.d.ts.map +1 -0
  288. package/dist/math/distribute.js +14 -17
  289. package/dist/math/distribute.js.map +1 -1
  290. package/dist/math/index.d.ts +14 -0
  291. package/dist/math/index.d.ts.map +1 -0
  292. package/dist/math/linspace.cjs +2 -0
  293. package/dist/math/linspace.cjs.map +1 -0
  294. package/dist/math/linspace.d.ts +19 -0
  295. package/dist/math/linspace.d.ts.map +1 -0
  296. package/dist/math/linspace.js +11 -0
  297. package/dist/math/linspace.js.map +1 -0
  298. package/dist/math/max.cjs +2 -2
  299. package/dist/math/max.cjs.map +1 -1
  300. package/dist/math/max.d.ts +23 -0
  301. package/dist/math/max.d.ts.map +1 -0
  302. package/dist/math/max.js +10 -11
  303. package/dist/math/max.js.map +1 -1
  304. package/dist/math/median.cjs +2 -2
  305. package/dist/math/median.cjs.map +1 -1
  306. package/dist/math/median.d.ts +17 -0
  307. package/dist/math/median.d.ts.map +1 -0
  308. package/dist/math/median.js +11 -10
  309. package/dist/math/median.js.map +1 -1
  310. package/dist/math/min.cjs +2 -2
  311. package/dist/math/min.cjs.map +1 -1
  312. package/dist/math/min.d.ts +23 -0
  313. package/dist/math/min.d.ts.map +1 -0
  314. package/dist/math/min.js +10 -11
  315. package/dist/math/min.js.map +1 -1
  316. package/dist/math/percent.cjs +2 -0
  317. package/dist/math/percent.cjs.map +1 -0
  318. package/dist/math/percent.d.ts +19 -0
  319. package/dist/math/percent.d.ts.map +1 -0
  320. package/dist/math/percent.js +8 -0
  321. package/dist/math/percent.js.map +1 -0
  322. package/dist/math/range.cjs +2 -2
  323. package/dist/math/range.cjs.map +1 -1
  324. package/dist/math/range.d.ts +23 -0
  325. package/dist/math/range.d.ts.map +1 -0
  326. package/dist/math/range.js +28 -17
  327. package/dist/math/range.js.map +1 -1
  328. package/dist/math/round.cjs +2 -2
  329. package/dist/math/round.cjs.map +1 -1
  330. package/dist/math/round.d.ts +21 -0
  331. package/dist/math/round.d.ts.map +1 -0
  332. package/dist/math/round.js +9 -8
  333. package/dist/math/round.js.map +1 -1
  334. package/dist/math/sum.cjs +2 -2
  335. package/dist/math/sum.cjs.map +1 -1
  336. package/dist/math/sum.d.ts +17 -0
  337. package/dist/math/sum.d.ts.map +1 -0
  338. package/dist/math/sum.js +11 -14
  339. package/dist/math/sum.js.map +1 -1
  340. package/dist/money/currency.cjs +2 -2
  341. package/dist/money/currency.cjs.map +1 -1
  342. package/dist/money/currency.d.ts +30 -0
  343. package/dist/money/currency.d.ts.map +1 -0
  344. package/dist/money/currency.js +19 -47
  345. package/dist/money/currency.js.map +1 -1
  346. package/dist/money/exchange.cjs +2 -2
  347. package/dist/money/exchange.cjs.map +1 -1
  348. package/dist/money/exchange.d.ts +29 -0
  349. package/dist/money/exchange.d.ts.map +1 -0
  350. package/dist/money/exchange.js +12 -12
  351. package/dist/money/exchange.js.map +1 -1
  352. package/dist/money/index.d.ts +4 -0
  353. package/dist/money/index.d.ts.map +1 -0
  354. package/dist/money/types.d.ts +9 -0
  355. package/dist/money/types.d.ts.map +1 -0
  356. package/dist/object/diff.cjs +2 -2
  357. package/dist/object/diff.cjs.map +1 -1
  358. package/dist/object/diff.d.ts +26 -0
  359. package/dist/object/diff.d.ts.map +1 -0
  360. package/dist/object/diff.js +19 -17
  361. package/dist/object/diff.js.map +1 -1
  362. package/dist/object/index.d.ts +9 -0
  363. package/dist/object/index.d.ts.map +1 -0
  364. package/dist/object/merge.cjs +2 -2
  365. package/dist/object/merge.cjs.map +1 -1
  366. package/dist/object/merge.d.ts +44 -0
  367. package/dist/object/merge.d.ts.map +1 -0
  368. package/dist/object/merge.js +27 -21
  369. package/dist/object/merge.js.map +1 -1
  370. package/dist/object/parseJSON.cjs +2 -2
  371. package/dist/object/parseJSON.cjs.map +1 -1
  372. package/dist/object/parseJSON.d.ts +32 -0
  373. package/dist/object/parseJSON.d.ts.map +1 -0
  374. package/dist/object/parseJSON.js +17 -18
  375. package/dist/object/parseJSON.js.map +1 -1
  376. package/dist/object/path.cjs +2 -2
  377. package/dist/object/path.cjs.map +1 -1
  378. package/dist/object/path.d.ts +32 -0
  379. package/dist/object/path.d.ts.map +1 -0
  380. package/dist/object/path.js +25 -23
  381. package/dist/object/path.js.map +1 -1
  382. package/dist/object/proxy.cjs +2 -0
  383. package/dist/object/proxy.cjs.map +1 -0
  384. package/dist/object/proxy.d.ts +30 -0
  385. package/dist/object/proxy.d.ts.map +1 -0
  386. package/dist/object/proxy.js +21 -0
  387. package/dist/object/proxy.js.map +1 -0
  388. package/dist/object/prune.cjs +2 -0
  389. package/dist/object/prune.cjs.map +1 -0
  390. package/dist/object/prune.d.ts +21 -0
  391. package/dist/object/prune.d.ts.map +1 -0
  392. package/dist/object/prune.js +31 -0
  393. package/dist/object/prune.js.map +1 -0
  394. package/dist/object/seek.cjs +2 -2
  395. package/dist/object/seek.cjs.map +1 -1
  396. package/dist/object/seek.d.ts +2 -0
  397. package/dist/object/seek.d.ts.map +1 -0
  398. package/dist/object/seek.js +25 -12
  399. package/dist/object/seek.js.map +1 -1
  400. package/dist/object/stash.cjs +2 -0
  401. package/dist/object/stash.cjs.map +1 -0
  402. package/dist/object/stash.d.ts +45 -0
  403. package/dist/object/stash.d.ts.map +1 -0
  404. package/dist/object/stash.js +99 -0
  405. package/dist/object/stash.js.map +1 -0
  406. package/dist/random/draw.cjs +2 -2
  407. package/dist/random/draw.cjs.map +1 -1
  408. package/dist/random/draw.d.ts +16 -0
  409. package/dist/random/draw.d.ts.map +1 -0
  410. package/dist/random/draw.js +13 -10
  411. package/dist/random/draw.js.map +1 -1
  412. package/dist/random/index.d.ts +5 -0
  413. package/dist/random/index.d.ts.map +1 -0
  414. package/dist/random/random.cjs +2 -2
  415. package/dist/random/random.cjs.map +1 -1
  416. package/dist/random/random.d.ts +14 -0
  417. package/dist/random/random.d.ts.map +1 -0
  418. package/dist/random/random.js +16 -9
  419. package/dist/random/random.js.map +1 -1
  420. package/dist/random/shuffle.cjs +2 -2
  421. package/dist/random/shuffle.cjs.map +1 -1
  422. package/dist/random/shuffle.d.ts +17 -0
  423. package/dist/random/shuffle.d.ts.map +1 -0
  424. package/dist/random/shuffle.js +18 -14
  425. package/dist/random/shuffle.js.map +1 -1
  426. package/dist/random/uuid.cjs +2 -2
  427. package/dist/random/uuid.cjs.map +1 -1
  428. package/dist/random/uuid.d.ts +12 -0
  429. package/dist/random/uuid.d.ts.map +1 -0
  430. package/dist/random/uuid.js +7 -9
  431. package/dist/random/uuid.js.map +1 -1
  432. package/dist/string/_caseUtils.cjs +2 -2
  433. package/dist/string/_caseUtils.cjs.map +1 -1
  434. package/dist/string/_caseUtils.d.ts +13 -0
  435. package/dist/string/_caseUtils.d.ts.map +1 -0
  436. package/dist/string/_caseUtils.js +8 -8
  437. package/dist/string/_caseUtils.js.map +1 -1
  438. package/dist/string/camelCase.cjs +2 -2
  439. package/dist/string/camelCase.cjs.map +1 -1
  440. package/dist/string/camelCase.d.ts +14 -0
  441. package/dist/string/camelCase.d.ts.map +1 -0
  442. package/dist/string/camelCase.js +8 -7
  443. package/dist/string/camelCase.js.map +1 -1
  444. package/dist/string/index.d.ts +7 -0
  445. package/dist/string/index.d.ts.map +1 -0
  446. package/dist/string/kebabCase.cjs +2 -2
  447. package/dist/string/kebabCase.cjs.map +1 -1
  448. package/dist/string/kebabCase.d.ts +15 -0
  449. package/dist/string/kebabCase.d.ts.map +1 -0
  450. package/dist/string/kebabCase.js +8 -7
  451. package/dist/string/kebabCase.js.map +1 -1
  452. package/dist/string/pascalCase.cjs +2 -2
  453. package/dist/string/pascalCase.cjs.map +1 -1
  454. package/dist/string/pascalCase.d.ts +15 -0
  455. package/dist/string/pascalCase.d.ts.map +1 -0
  456. package/dist/string/pascalCase.js +8 -7
  457. package/dist/string/pascalCase.js.map +1 -1
  458. package/dist/string/similarity.cjs +2 -2
  459. package/dist/string/similarity.cjs.map +1 -1
  460. package/dist/string/similarity.d.ts +20 -0
  461. package/dist/string/similarity.d.ts.map +1 -0
  462. package/dist/string/similarity.js +20 -36
  463. package/dist/string/similarity.js.map +1 -1
  464. package/dist/string/snakeCase.cjs +2 -2
  465. package/dist/string/snakeCase.cjs.map +1 -1
  466. package/dist/string/snakeCase.d.ts +15 -0
  467. package/dist/string/snakeCase.d.ts.map +1 -0
  468. package/dist/string/snakeCase.js +8 -7
  469. package/dist/string/snakeCase.js.map +1 -1
  470. package/dist/string/truncate.cjs +2 -2
  471. package/dist/string/truncate.cjs.map +1 -1
  472. package/dist/string/truncate.d.ts +28 -0
  473. package/dist/string/truncate.d.ts.map +1 -0
  474. package/dist/string/truncate.js +20 -17
  475. package/dist/string/truncate.js.map +1 -1
  476. package/dist/toolkit.cjs +2 -0
  477. package/dist/toolkit.cjs.map +1 -0
  478. package/dist/toolkit.js +1523 -0
  479. package/dist/toolkit.js.map +1 -0
  480. package/dist/typed/index.d.ts +24 -0
  481. package/dist/typed/index.d.ts.map +1 -0
  482. package/dist/typed/is.cjs +2 -2
  483. package/dist/typed/is.cjs.map +1 -1
  484. package/dist/typed/is.d.ts +95 -0
  485. package/dist/typed/is.d.ts.map +1 -0
  486. package/dist/typed/is.js +54 -42
  487. package/dist/typed/is.js.map +1 -1
  488. package/dist/typed/isArray.cjs +2 -2
  489. package/dist/typed/isArray.cjs.map +1 -1
  490. package/dist/typed/isArray.d.ts +16 -0
  491. package/dist/typed/isArray.d.ts.map +1 -0
  492. package/dist/typed/isArray.js +8 -8
  493. package/dist/typed/isArray.js.map +1 -1
  494. package/dist/typed/isBoolean.cjs +2 -2
  495. package/dist/typed/isBoolean.cjs.map +1 -1
  496. package/dist/typed/isBoolean.d.ts +23 -0
  497. package/dist/typed/isBoolean.d.ts.map +1 -0
  498. package/dist/typed/isBoolean.js +7 -6
  499. package/dist/typed/isBoolean.js.map +1 -1
  500. package/dist/typed/isDate.cjs +2 -2
  501. package/dist/typed/isDate.cjs.map +1 -1
  502. package/dist/typed/isDate.d.ts +16 -0
  503. package/dist/typed/isDate.d.ts.map +1 -0
  504. package/dist/typed/isDate.js +7 -8
  505. package/dist/typed/isDate.js.map +1 -1
  506. package/dist/typed/isDefined.cjs +2 -2
  507. package/dist/typed/isDefined.cjs.map +1 -1
  508. package/dist/typed/isDefined.d.ts +19 -0
  509. package/dist/typed/isDefined.d.ts.map +1 -0
  510. package/dist/typed/isDefined.js +7 -6
  511. package/dist/typed/isDefined.js.map +1 -1
  512. package/dist/typed/isEmpty.cjs +2 -2
  513. package/dist/typed/isEmpty.cjs.map +1 -1
  514. package/dist/typed/isEmpty.d.ts +24 -0
  515. package/dist/typed/isEmpty.d.ts.map +1 -0
  516. package/dist/typed/isEmpty.js +8 -9
  517. package/dist/typed/isEmpty.js.map +1 -1
  518. package/dist/typed/isEqual.cjs +2 -2
  519. package/dist/typed/isEqual.cjs.map +1 -1
  520. package/dist/typed/isEqual.d.ts +24 -0
  521. package/dist/typed/isEqual.d.ts.map +1 -0
  522. package/dist/typed/isEqual.js +27 -28
  523. package/dist/typed/isEqual.js.map +1 -1
  524. package/dist/typed/isEven.cjs +2 -2
  525. package/dist/typed/isEven.cjs.map +1 -1
  526. package/dist/typed/isEven.d.ts +9 -0
  527. package/dist/typed/isEven.d.ts.map +1 -0
  528. package/dist/typed/isEven.js +7 -6
  529. package/dist/typed/isEven.js.map +1 -1
  530. package/dist/typed/isFunction.cjs +2 -2
  531. package/dist/typed/isFunction.cjs.map +1 -1
  532. package/dist/typed/isFunction.d.ts +16 -0
  533. package/dist/typed/isFunction.d.ts.map +1 -0
  534. package/dist/typed/isFunction.js +7 -8
  535. package/dist/typed/isFunction.js.map +1 -1
  536. package/dist/typed/isMatch.cjs +2 -2
  537. package/dist/typed/isMatch.cjs.map +1 -1
  538. package/dist/typed/isMatch.d.ts +23 -0
  539. package/dist/typed/isMatch.d.ts.map +1 -0
  540. package/dist/typed/isMatch.js +16 -18
  541. package/dist/typed/isMatch.js.map +1 -1
  542. package/dist/typed/isNegative.cjs +2 -2
  543. package/dist/typed/isNegative.cjs.map +1 -1
  544. package/dist/typed/isNegative.d.ts +26 -0
  545. package/dist/typed/isNegative.d.ts.map +1 -0
  546. package/dist/typed/isNegative.js +7 -6
  547. package/dist/typed/isNegative.js.map +1 -1
  548. package/dist/typed/isNil.cjs +2 -2
  549. package/dist/typed/isNil.cjs.map +1 -1
  550. package/dist/typed/isNil.d.ts +17 -0
  551. package/dist/typed/isNil.d.ts.map +1 -0
  552. package/dist/typed/isNil.js +7 -8
  553. package/dist/typed/isNil.js.map +1 -1
  554. package/dist/typed/isNumber.cjs +2 -2
  555. package/dist/typed/isNumber.cjs.map +1 -1
  556. package/dist/typed/isNumber.d.ts +16 -0
  557. package/dist/typed/isNumber.d.ts.map +1 -0
  558. package/dist/typed/isNumber.js +8 -8
  559. package/dist/typed/isNumber.js.map +1 -1
  560. package/dist/typed/isObject.cjs +2 -2
  561. package/dist/typed/isObject.cjs.map +1 -1
  562. package/dist/typed/isObject.d.ts +19 -0
  563. package/dist/typed/isObject.d.ts.map +1 -0
  564. package/dist/typed/isObject.js +8 -8
  565. package/dist/typed/isObject.js.map +1 -1
  566. package/dist/typed/isOdd.cjs +2 -2
  567. package/dist/typed/isOdd.cjs.map +1 -1
  568. package/dist/typed/isOdd.d.ts +9 -0
  569. package/dist/typed/isOdd.d.ts.map +1 -0
  570. package/dist/typed/isOdd.js +7 -6
  571. package/dist/typed/isOdd.js.map +1 -1
  572. package/dist/typed/isPositive.cjs +2 -2
  573. package/dist/typed/isPositive.cjs.map +1 -1
  574. package/dist/typed/isPositive.d.ts +26 -0
  575. package/dist/typed/isPositive.d.ts.map +1 -0
  576. package/dist/typed/isPositive.js +7 -6
  577. package/dist/typed/isPositive.js.map +1 -1
  578. package/dist/typed/isPrimitive.cjs +2 -2
  579. package/dist/typed/isPrimitive.cjs.map +1 -1
  580. package/dist/typed/isPrimitive.d.ts +18 -0
  581. package/dist/typed/isPrimitive.d.ts.map +1 -0
  582. package/dist/typed/isPrimitive.js +8 -9
  583. package/dist/typed/isPrimitive.js.map +1 -1
  584. package/dist/typed/isPromise.cjs +2 -2
  585. package/dist/typed/isPromise.cjs.map +1 -1
  586. package/dist/typed/isPromise.d.ts +17 -0
  587. package/dist/typed/isPromise.d.ts.map +1 -0
  588. package/dist/typed/isPromise.js +7 -9
  589. package/dist/typed/isPromise.js.map +1 -1
  590. package/dist/typed/isRegex.cjs +2 -2
  591. package/dist/typed/isRegex.cjs.map +1 -1
  592. package/dist/typed/isRegex.d.ts +21 -0
  593. package/dist/typed/isRegex.d.ts.map +1 -0
  594. package/dist/typed/isRegex.js +7 -6
  595. package/dist/typed/isRegex.js.map +1 -1
  596. package/dist/typed/isString.cjs +2 -2
  597. package/dist/typed/isString.cjs.map +1 -1
  598. package/dist/typed/isString.d.ts +16 -0
  599. package/dist/typed/isString.d.ts.map +1 -0
  600. package/dist/typed/isString.js +8 -8
  601. package/dist/typed/isString.js.map +1 -1
  602. package/dist/typed/isWithin.cjs +2 -2
  603. package/dist/typed/isWithin.cjs.map +1 -1
  604. package/dist/typed/isWithin.d.ts +20 -0
  605. package/dist/typed/isWithin.d.ts.map +1 -0
  606. package/dist/typed/isWithin.js +9 -9
  607. package/dist/typed/isWithin.js.map +1 -1
  608. package/dist/typed/isZero.cjs +2 -2
  609. package/dist/typed/isZero.cjs.map +1 -1
  610. package/dist/typed/isZero.d.ts +25 -0
  611. package/dist/typed/isZero.d.ts.map +1 -0
  612. package/dist/typed/isZero.js +7 -6
  613. package/dist/typed/isZero.js.map +1 -1
  614. package/dist/typed/typeOf.cjs +2 -2
  615. package/dist/typed/typeOf.cjs.map +1 -1
  616. package/dist/typed/typeOf.d.ts +30 -0
  617. package/dist/typed/typeOf.d.ts.map +1 -0
  618. package/dist/typed/typeOf.js +11 -13
  619. package/dist/typed/typeOf.js.map +1 -1
  620. package/dist/types.d.ts +9 -0
  621. package/dist/types.d.ts.map +1 -0
  622. package/package.json +77 -12
  623. package/dist/array/aggregate.cjs +0 -2
  624. package/dist/array/aggregate.cjs.map +0 -1
  625. package/dist/array/aggregate.js +0 -16
  626. package/dist/array/aggregate.js.map +0 -1
  627. package/dist/array/alternate.cjs +0 -2
  628. package/dist/array/alternate.cjs.map +0 -1
  629. package/dist/array/alternate.js +0 -9
  630. package/dist/array/alternate.js.map +0 -1
  631. package/dist/array/arrange.cjs +0 -2
  632. package/dist/array/arrange.cjs.map +0 -1
  633. package/dist/array/arrange.js +0 -6
  634. package/dist/array/arrange.js.map +0 -1
  635. package/dist/array/compact.cjs +0 -2
  636. package/dist/array/compact.cjs.map +0 -1
  637. package/dist/array/compact.js +0 -9
  638. package/dist/array/compact.js.map +0 -1
  639. package/dist/array/every.cjs +0 -2
  640. package/dist/array/every.cjs.map +0 -1
  641. package/dist/array/every.js +0 -14
  642. package/dist/array/every.js.map +0 -1
  643. package/dist/array/filter.cjs +0 -2
  644. package/dist/array/filter.cjs.map +0 -1
  645. package/dist/array/filter.js +0 -14
  646. package/dist/array/filter.js.map +0 -1
  647. package/dist/array/find.cjs +0 -2
  648. package/dist/array/find.cjs.map +0 -1
  649. package/dist/array/find.js +0 -14
  650. package/dist/array/find.js.map +0 -1
  651. package/dist/array/findIndex.cjs +0 -2
  652. package/dist/array/findIndex.cjs.map +0 -1
  653. package/dist/array/findIndex.js +0 -14
  654. package/dist/array/findIndex.js.map +0 -1
  655. package/dist/array/findLast.cjs +0 -2
  656. package/dist/array/findLast.cjs.map +0 -1
  657. package/dist/array/findLast.js +0 -14
  658. package/dist/array/findLast.js.map +0 -1
  659. package/dist/array/flatten.cjs +0 -2
  660. package/dist/array/flatten.cjs.map +0 -1
  661. package/dist/array/flatten.js +0 -7
  662. package/dist/array/flatten.js.map +0 -1
  663. package/dist/array/map.cjs +0 -2
  664. package/dist/array/map.cjs.map +0 -1
  665. package/dist/array/map.js +0 -18
  666. package/dist/array/map.js.map +0 -1
  667. package/dist/array/reduce.cjs +0 -2
  668. package/dist/array/reduce.cjs.map +0 -1
  669. package/dist/array/reduce.js +0 -16
  670. package/dist/array/reduce.js.map +0 -1
  671. package/dist/array/shift.cjs +0 -2
  672. package/dist/array/shift.cjs.map +0 -1
  673. package/dist/array/shift.js +0 -13
  674. package/dist/array/shift.js.map +0 -1
  675. package/dist/array/some.cjs +0 -2
  676. package/dist/array/some.cjs.map +0 -1
  677. package/dist/array/some.js +0 -14
  678. package/dist/array/some.js.map +0 -1
  679. package/dist/array/substitute.cjs +0 -2
  680. package/dist/array/substitute.cjs.map +0 -1
  681. package/dist/array/substitute.js +0 -13
  682. package/dist/array/substitute.js.map +0 -1
  683. package/dist/async/delay.cjs +0 -2
  684. package/dist/async/delay.cjs.map +0 -1
  685. package/dist/async/delay.js +0 -8
  686. package/dist/async/delay.js.map +0 -1
  687. package/dist/function/proxy.cjs +0 -2
  688. package/dist/function/proxy.cjs.map +0 -1
  689. package/dist/function/proxy.js +0 -22
  690. package/dist/function/proxy.js.map +0 -1
  691. package/dist/function/prune.cjs +0 -2
  692. package/dist/function/prune.cjs.map +0 -1
  693. package/dist/function/prune.js +0 -30
  694. package/dist/function/prune.js.map +0 -1
  695. package/dist/function/worker.cjs +0 -14
  696. package/dist/function/worker.cjs.map +0 -1
  697. package/dist/function/worker.js +0 -29
  698. package/dist/function/worker.js.map +0 -1
  699. package/dist/index.cjs.map +0 -1
  700. package/dist/index.js.map +0 -1
  701. package/dist/logit/dist/logit.cjs +0 -2
  702. package/dist/logit/dist/logit.cjs.map +0 -1
  703. package/dist/logit/dist/logit.js +0 -263
  704. package/dist/logit/dist/logit.js.map +0 -1
  705. package/dist/math/add.cjs +0 -2
  706. package/dist/math/add.cjs.map +0 -1
  707. package/dist/math/add.js +0 -9
  708. package/dist/math/add.js.map +0 -1
  709. package/dist/math/boil.cjs +0 -2
  710. package/dist/math/boil.cjs.map +0 -1
  711. package/dist/math/boil.js +0 -17
  712. package/dist/math/boil.js.map +0 -1
  713. package/dist/math/divide.cjs +0 -2
  714. package/dist/math/divide.cjs.map +0 -1
  715. package/dist/math/divide.js +0 -11
  716. package/dist/math/divide.js.map +0 -1
  717. package/dist/math/multiply.cjs +0 -2
  718. package/dist/math/multiply.cjs.map +0 -1
  719. package/dist/math/multiply.js +0 -9
  720. package/dist/math/multiply.js.map +0 -1
  721. package/dist/math/rate.cjs +0 -2
  722. package/dist/math/rate.cjs.map +0 -1
  723. package/dist/math/rate.js +0 -9
  724. package/dist/math/rate.js.map +0 -1
  725. package/dist/math/subtract.cjs +0 -2
  726. package/dist/math/subtract.cjs.map +0 -1
  727. package/dist/math/subtract.js +0 -9
  728. package/dist/math/subtract.js.map +0 -1
  729. package/dist/object/cache.cjs +0 -2
  730. package/dist/object/cache.cjs.map +0 -1
  731. package/dist/object/cache.js +0 -63
  732. package/dist/object/cache.js.map +0 -1
  733. package/dist/object/clone.cjs +0 -2
  734. package/dist/object/clone.cjs.map +0 -1
  735. package/dist/object/clone.js +0 -17
  736. package/dist/object/clone.js.map +0 -1
  737. package/dist/object/entries.cjs +0 -2
  738. package/dist/object/entries.cjs.map +0 -1
  739. package/dist/object/entries.js +0 -9
  740. package/dist/object/entries.js.map +0 -1
  741. package/dist/object/keys.cjs +0 -2
  742. package/dist/object/keys.cjs.map +0 -1
  743. package/dist/object/keys.js +0 -9
  744. package/dist/object/keys.js.map +0 -1
  745. package/dist/object/values.cjs +0 -2
  746. package/dist/object/values.cjs.map +0 -1
  747. package/dist/object/values.js +0 -9
  748. package/dist/object/values.js.map +0 -1
  749. package/dist/typed/ge.cjs +0 -2
  750. package/dist/typed/ge.cjs.map +0 -1
  751. package/dist/typed/ge.js +0 -7
  752. package/dist/typed/ge.js.map +0 -1
  753. package/dist/typed/gt.cjs +0 -2
  754. package/dist/typed/gt.cjs.map +0 -1
  755. package/dist/typed/gt.js +0 -7
  756. package/dist/typed/gt.js.map +0 -1
  757. package/dist/typed/le.cjs +0 -2
  758. package/dist/typed/le.cjs.map +0 -1
  759. package/dist/typed/le.js +0 -7
  760. package/dist/typed/le.js.map +0 -1
  761. package/dist/typed/lt.cjs +0 -2
  762. package/dist/typed/lt.cjs.map +0 -1
  763. package/dist/typed/lt.js +0 -7
  764. package/dist/typed/lt.js.map +0 -1
package/README.md CHANGED
@@ -1,546 +1,419 @@
1
1
  # @vielzeug/toolkit
2
2
 
3
- <div align="center">
4
- <img src="../../docs/public/logo-utils.svg" alt="Toolkit Logo" width="120" />
5
-
6
- <p><strong>A comprehensive, type-safe utility library for modern JavaScript and TypeScript.</strong></p>
3
+ > Typed utility functions for everyday TypeScript — arrays, objects, strings, async, dates, math, and more
7
4
 
8
- [![npm version](https://img.shields.io/npm/v/@vielzeug/toolkit.svg)](https://www.npmjs.com/package/@vielzeug/toolkit)
9
- [![npm downloads](https://img.shields.io/npm/dm/@vielzeug/toolkit.svg)](https://www.npmjs.com/package/@vielzeug/toolkit)
10
- [![License: MIT](https://img.shields.io/badge/License-MIT-blue.svg)](https://opensource.org/licenses/MIT)
11
- [![TypeScript](https://img.shields.io/badge/TypeScript-100%25-blue)](https://www.typescriptlang.org/)
12
- [![Bundle Size](https://img.shields.io/bundlephobia/minzip/@vielzeug/toolkit)](https://bundlephobia.com/package/@vielzeug/toolkit)
5
+ [![npm version](https://img.shields.io/npm/v/@vielzeug/toolkit)](https://www.npmjs.com/package/@vielzeug/toolkit) [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)
13
6
 
14
- </div>
15
-
16
- ## Features
17
-
18
- - 🎯 **119 Type-Safe Utilities** - Covering arrays, objects, strings, async operations, and more
19
- - 📦 **Tree-Shakeable** - Import only what you need, minimize bundle size
20
- - 🔒 **Zero Dependencies** - No supply chain risks, no version conflicts
21
- - 💪 **Full TypeScript Support** - Complete type inference and safety
22
- - ⚡ **Async-First** - Built-in support for promises and async operations
23
- - 🧪 **Battle-Tested** - >95% test coverage, production-ready
24
- - 🌐 **Isomorphic** - Works in both browser and Node.js environments
7
+ **Toolkit** is a tree-shakeable collection of TypeScript utility functions covering arrays, objects, strings, async control-flow, dates, math, money, and type guards — all individually importable with full type inference and zero dependencies.
25
8
 
26
9
  ## Installation
27
10
 
28
- ::: code-group
29
-
30
- ```bash [pnpm]
11
+ ```sh
31
12
  pnpm add @vielzeug/toolkit
13
+ # npm install @vielzeug/toolkit
14
+ # yarn add @vielzeug/toolkit
32
15
  ```
33
16
 
34
- ```bash [npm]
35
- npm install @vielzeug/toolkit
36
- ```
37
-
38
- ```bash [yarn]
39
- yarn add @vielzeug/toolkit
40
- ```
41
-
42
- :::
43
-
44
17
  ## Quick Start
45
18
 
46
19
  ```typescript
47
- import { chunk, map, retry, pool } from '@vielzeug/toolkit';
48
-
49
- // Array operations
50
- const batches = chunk([1, 2, 3, 4, 5], 2);
51
- // [[1, 2], [3, 4], [5]]
52
-
53
- // Async map with automatic Promise handling
54
- const users = await map([1, 2, 3], async (id) => fetchUser(id));
55
-
56
- // Retry with exponential backoff
57
- const data = await retry(() => fetch('/api/data').then((r) => r.json()), { times: 3, delay: 1000, backoff: 2 });
20
+ import { group, chunk, debounce, retry, merge, uuid, is } from '@vielzeug/toolkit';
58
21
 
59
- // Rate limiting with promise pool
60
- const apiPool = pool(5); // Max 5 concurrent requests
61
- const results = await Promise.all(urls.map((url) => apiPool(() => fetch(url))));
62
- ```
63
-
64
- ## Categories
22
+ // Group an array by a key
23
+ const byStatus = group(users, (u) => u.status);
24
+ // { active: [...], inactive: [...] }
65
25
 
66
- ### 📊 Array (25 utilities)
26
+ // Split array into chunks
27
+ const pages = chunk([1, 2, 3, 4, 5], 2); // [[1,2],[3,4],[5]]
67
28
 
68
- Transform, filter, group, and manipulate arrays with full type safety.
29
+ // Debounce an event handler
30
+ const handleSearch = debounce((query: string) => fetchResults(query), 300);
69
31
 
70
- ```typescript
71
- import { group, uniq, flatten, sort } from '@vielzeug/toolkit';
32
+ // Retry a failing async function
33
+ const result = await retry(() => fetchData(), { times: 3, delay: 200 });
72
34
 
73
- // Group by property
74
- const grouped = group(users, (user) => user.role);
35
+ // Deep merge objects
36
+ const config = merge('deep', defaults, overrides);
75
37
 
76
- // Remove duplicates
77
- const unique = uniq([1, 2, 2, 3, 3, 3]);
38
+ // Generate a UUID
39
+ const id = uuid(); // e.g. "550e8400-e29b-41d4-a716-446655440000"
78
40
 
79
- // Flatten nested arrays
80
- const flat = flatten([
81
- [1, 2],
82
- [3, [4, 5]],
83
- ]);
84
-
85
- // Sort with custom comparator
86
- const sorted = sort(items, (a, b) => a.price - b.price);
41
+ // Runtime type checks
42
+ if (is.string(value)) { /* value narrowed to string */ }
87
43
  ```
88
44
 
89
- **Available utilities:**
90
- `aggregate`, `alternate`, `arrange`, `chunk`, `compact`, `contains`, `every`, `filter`, `find`, `findIndex`, `findLast`, `flatten`, `group`, `list`, `map`, `pick`, `reduce`, `remoteList`, `search`, `select`, `shift`, `some`, `sort`, `substitute`, `uniq`
45
+ ## Features
91
46
 
92
- ---
47
+ - ✅ **Tree-shakeable** — import only what you use
48
+ - ✅ **Type-safe** — full TypeScript inference on every utility
49
+ - ✅ **Array** — `chunk`, `group`, `keyBy`, `fold`, `select`, `toggle`, `rotate`, `replace`, `search`, `uniq`, `sort`, `contains`, `pick`, `list`, `remoteList`
50
+ - ✅ **Object** — `merge`, `diff`, `get`, `seek`, `prune`, `proxy`, `cache`, `parseJSON`
51
+ - ✅ **String** — `camelCase`, `kebabCase`, `pascalCase`, `snakeCase`, `truncate`, `similarity`
52
+ - ✅ **Async** — `retry`, `sleep`, `parallel`, `pool`, `queue`, `race`, `attempt`, `defer`, `waitFor`
53
+ - ✅ **Function** — `debounce`, `throttle`, `memo`, `once`, `pipe`, `compose`, `curry`, `compare`, `fp`
54
+ - ✅ **Math** — `sum`, `average`, `median`, `min`, `max`, `clamp`, `round`, `range`, `percent`, `linspace`, `allocate`, `distribute`
55
+ - ✅ **Date** — `timeDiff`, `interval`, `expires`
56
+ - ✅ **Money** — `currency`, `exchange`
57
+ - ✅ **Random** — `uuid`, `random`, `draw`, `shuffle`
58
+ - ✅ **Type guards** — `is.string`, `is.number`, `is.array`, `is.nil`, `is.equal`, `is.match`, and more
59
+ - ✅ **Zero dependencies**
93
60
 
94
- ### ⚡ Async (11 utilities)
61
+ ## Usage
95
62
 
96
- Promise utilities, concurrency control, retries, and async patterns.
63
+ ### Array Utilities
97
64
 
98
65
  ```typescript
99
- import { parallel, queue, waitFor, race, defer } from '@vielzeug/toolkit';
100
-
101
- // Process with controlled concurrency
102
- await parallel(3, urls, async (url) => fetch(url));
103
-
104
- // Task queue with monitoring
105
- const taskQueue = queue({ concurrency: 5 });
106
- taskQueue.add(() => processTask());
107
- await taskQueue.onIdle();
108
-
109
- // Wait for condition
110
- await waitFor(() => document.querySelector('#app') !== null);
111
-
112
- // Race with minimum delay (better UX)
113
- const data = await race(fetchData(), 500);
114
-
115
- // Externally-controlled promise
116
- const deferred = defer<string>();
117
- setTimeout(() => deferred.resolve('Done!'), 1000);
118
- ```
66
+ import { group, chunk, keyBy, fold, select, toggle, uniq, sort } from '@vielzeug/toolkit';
119
67
 
120
- **Available utilities:**
121
- `attempt`, `defer`, `delay`, `parallel`, `pool`, `predict`, `queue`, `race`, `retry`, `sleep`, `waitFor`
68
+ // Group by key
69
+ const byRole = group(users, (u) => u.role); // { admin: [...], user: [...] }
122
70
 
123
- ---
71
+ // Split into chunks
72
+ const pages = chunk(items, 10); // Item[][]
124
73
 
125
- ### 📅 Date (3 utilities)
74
+ // Index by key
75
+ const byId = keyBy(users, 'id'); // { '1': user1, '2': user2 }
126
76
 
127
- Date manipulation and time calculations.
77
+ // Fold (reduce without initial value)
78
+ fold([1, 2, 3], (a, b) => a + b); // 6
128
79
 
129
- ```typescript
130
- import { interval, timeDiff, expires } from '@vielzeug/toolkit';
131
-
132
- // Calculate time intervals
133
- const days = interval(new Date('2024-01-01'), new Date('2024-12-31'), 'days');
134
-
135
- // Time difference
136
- const diff = timeDiff(date1, date2);
137
-
138
- // Check expiration
139
- if (expires(expiryDate)) {
140
- // Handle expired
141
- }
142
- ```
80
+ // Filter nil elements from source, then map remaining
81
+ select([null, 1, null, 2], (n) => n * 10); // [10, 20]
143
82
 
144
- **Available utilities:**
145
- `expires`, `interval`, `timeDiff`
83
+ // Filter by predicate, then map
84
+ select([1, 2, 3, 4], (n) => n * 10, (n) => n > 2); // [30, 40]
146
85
 
147
- ---
86
+ // Toggle item in/out of array
87
+ toggle([1, 2, 3], 2); // [1, 3]
88
+ toggle([1, 2, 3], 4); // [1, 2, 3, 4]
148
89
 
149
- ### ⚙️ Function (14 utilities)
90
+ // Sort by selector (single-field)
91
+ sort([{ value: 3 }, { value: 1 }], (item) => item.value); // [{ value: 1 }, { value: 3 }]
150
92
 
151
- Function composition, memoization, and execution control.
152
-
153
- ```typescript
154
- import { debounce, throttle, memo, pipe, curry } from '@vielzeug/toolkit';
155
-
156
- // Debounce user input
157
- const search = debounce((query) => fetchResults(query), 300);
158
-
159
- // Throttle scroll events
160
- const onScroll = throttle(() => updateUI(), 100);
161
-
162
- // Memoize expensive calculations
163
- const fibonacci = memo((n) => (n <= 1 ? n : fibonacci(n - 1) + fibonacci(n - 2)));
164
-
165
- // Function composition
166
- const transform = pipe(
167
- (x) => x * 2,
168
- (x) => x + 1,
169
- (x) => x.toString(),
93
+ // Sort by object selectors (multi-field)
94
+ sort(
95
+ [
96
+ { age: 30, name: 'Bob' },
97
+ { age: 30, name: 'Alice' },
98
+ { age: 25, name: 'Chris' },
99
+ ],
100
+ { age: 'desc', name: 'asc' },
170
101
  );
171
102
 
172
- // Currying
173
- const add = curry((a, b, c) => a + b + c);
174
- const add5 = add(5);
175
- ```
176
-
177
- **Available utilities:**
178
- `assert`, `assertParams`, `compare`, `compareBy`, `compose`, `curry`, `debounce`, `fp`, `memo`, `once`, `pipe`, `proxy`, `prune`, `throttle`, `worker`
179
-
180
- ---
181
-
182
- ### 🔢 Math (17 utilities)
183
-
184
- Mathematical operations, statistics, and calculations.
185
-
186
- ```typescript
187
- import { average, median, clamp, range, distribute } from '@vielzeug/toolkit';
188
-
189
- // Calculate average
190
- const avg = average([1, 2, 3, 4, 5]); // 3
191
-
192
- // Find median
193
- const med = median([1, 2, 3, 4, 5]); // 3
194
-
195
- // Clamp value to range
196
- const clamped = clamp(150, 0, 100); // 100
197
-
198
- // Generate range
199
- const numbers = range(1, 10); // [1, 2, 3, ..., 10]
200
-
201
- // Distribute amount
202
- const shares = distribute(100, 3); // [33.33, 33.33, 33.34]
203
- ```
204
-
205
- **Available utilities:**
206
- `abs`, `add`, `allocate`, `average`, `boil`, `clamp`, `distribute`, `divide`, `max`, `median`, `min`, `multiply`, `range`, `rate`, `round`, `subtract`, `sum`
207
-
208
- ---
209
-
210
- ### 💰 Money (3 utilities)
211
-
212
- Currency formatting and exchange calculations.
213
-
214
- ```typescript
215
- import { currency, exchange } from '@vielzeug/toolkit';
216
-
217
- // Format currency
218
- const formatted = currency(1234.56, 'USD'); // "$1,234.56"
219
-
220
- // Currency exchange
221
- const converted = exchange(100, 'USD', 'EUR', 0.85); // 85
103
+ // Remove duplicates
104
+ uniq([1, 2, 2, 3]); // [1, 2, 3]
222
105
  ```
223
106
 
224
- **Available utilities:**
225
- `currency`, `exchange`, `types`
226
-
227
- ---
228
-
229
- ### 📦 Object (10 utilities)
230
-
231
- Deep merging, cloning, diffing, and object manipulation.
107
+ ### Object Utilities
232
108
 
233
109
  ```typescript
234
- import { merge, clone, diff, path, seek } from '@vielzeug/toolkit';
110
+ import { merge, diff, get, seek, prune, parseJSON } from '@vielzeug/toolkit';
235
111
 
236
112
  // Deep merge
237
- const merged = merge(obj1, obj2);
113
+ const cfg = merge('deep', { api: { host: 'localhost' } }, { api: { port: 3000 } });
114
+ // { api: { host: 'localhost', port: 3000 } }
238
115
 
239
- // Deep clone
240
- const copy = clone(original);
116
+ // Nested path access
117
+ get(cfg, 'api.host'); // 'localhost'
241
118
 
242
- // Diff objects
243
- const changes = diff(oldObj, newObj);
119
+ // Recursively search object values by similarity
120
+ seek(cfg, 'localhost', 1); // true (exact match)
244
121
 
245
- // Get nested value
246
- const value = path(obj, 'user.address.city');
122
+ // Remove nulls/empty values
123
+ prune({ a: 1, b: null, c: '' }); // { a: 1 }
247
124
 
248
- // Search object
249
- const results = seek(data, (val) => val > 100);
125
+ // Safe JSON parse
126
+ parseJSON('{"a":1}', {}); // { a: 1 }
127
+ parseJSON('bad json', {}); // {}
250
128
  ```
251
129
 
252
- **Available utilities:**
253
- `cache`, `clone`, `diff`, `entries`, `keys`, `merge`, `parseJSON`, `path`, `seek`, `values`
254
-
255
- ---
256
-
257
- ### 🎲 Random (4 utilities)
258
-
259
- Random values, shuffling, and UUID generation.
130
+ ### Async Utilities
260
131
 
261
132
  ```typescript
262
- import { random, shuffle, draw, uuid } from '@vielzeug/toolkit';
133
+ import { retry, sleep, parallel, pool, race, attempt, waitFor } from '@vielzeug/toolkit';
263
134
 
264
- // Random number
265
- const num = random(1, 100);
135
+ // Retry with backoff
136
+ const result = await retry(() => fetchData(), { times: 3, delay: 200, backoff: 2 });
266
137
 
267
- // Shuffle array
268
- const shuffled = shuffle([1, 2, 3, 4, 5]);
138
+ // Delay
139
+ await sleep(500);
269
140
 
270
- // Draw random items
271
- const winners = draw(participants, 3);
141
+ // Process items with concurrency limit
142
+ const results = await parallel(5, urls, async (url) => fetch(url).then((r) => r.json()));
272
143
 
273
- // Generate UUID
274
- const id = uuid(); // "550e8400-e29b-41d4-a716-446655440000"
275
- ```
276
-
277
- **Available utilities:**
278
- `draw`, `random`, `shuffle`, `uuid`
144
+ // Race promise against minimum delay (prevents loading flicker)
145
+ const data = await race(fetchUser(id), 300);
279
146
 
280
- ---
147
+ // Attempt with explicit success/failure handling
148
+ const userAttempt = await attempt(fetchUser, { times: 2, timeout: 5000 });
149
+ if (userAttempt.ok) {
150
+ console.log(userAttempt.value);
151
+ } else {
152
+ console.error(userAttempt.error);
153
+ }
281
154
 
282
- ### 📝 String (6 utilities)
155
+ // Poll until condition is true
156
+ await waitFor(() => document.querySelector('#app') !== null, { timeout: 5000 });
157
+ ```
283
158
 
284
- String formatting, case conversion, and similarity.
159
+ ### String Utilities
285
160
 
286
161
  ```typescript
287
- import { camelCase, kebabCase, pascalCase, snakeCase, truncate, similarity } from '@vielzeug/toolkit';
288
-
289
- // Case conversions
290
- camelCase('hello world'); // "helloWorld"
291
- kebabCase('hello world'); // "hello-world"
292
- pascalCase('hello world'); // "HelloWorld"
293
- snakeCase('hello world'); // "hello_world"
294
-
295
- // Truncate text
296
- truncate('Long text here', 10); // "Long text..."
297
-
298
- // String similarity
299
- similarity('hello', 'hallo'); // 0.8
162
+ import { camelCase, kebabCase, snakeCase, pascalCase, truncate, similarity } from '@vielzeug/toolkit';
163
+
164
+ camelCase('hello-world'); // 'helloWorld'
165
+ kebabCase('helloWorld'); // 'hello-world'
166
+ snakeCase('helloWorld'); // 'hello_world'
167
+ pascalCase('hello-world'); // 'HelloWorld'
168
+ truncate('A very long string', 10); // 'A very lon...'
169
+ similarity('hello', 'hallo'); // ~0.8
300
170
  ```
301
171
 
302
- **Available utilities:**
303
- `camelCase`, `kebabCase`, `pascalCase`, `similarity`, `snakeCase`, `truncate`
304
-
305
- ---
306
-
307
- ### ✅ Typed (27 utilities)
308
-
309
- Type guards, type checking, and validation.
172
+ ### Function Utilities
310
173
 
311
174
  ```typescript
312
- import { isString, isArray, isPromise, isEmpty, isEqual } from '@vielzeug/toolkit';
175
+ import { memo, once, pipe, debounce, throttle, compare } from '@vielzeug/toolkit';
313
176
 
314
- // Type guards with narrowing
315
- if (isString(value)) {
316
- // TypeScript knows value is string
317
- console.log(value.toUpperCase());
318
- }
177
+ const fib = memo((n: number): number => n <= 1 ? n : fib(n - 1) + fib(n - 2));
178
+ const init = once(() => bootstrap());
179
+ const process = pipe(trim, normalize, validate);
180
+ const search = debounce(fetchResults, 300);
181
+ const scroll = throttle(updatePosition, 16);
319
182
 
320
- // Check arrays
321
- if (isArray(data)) {
322
- data.forEach((item) => console.log(item));
323
- }
324
-
325
- // Promise detection
326
- if (isPromise(result)) {
327
- await result;
328
- }
329
-
330
- // Empty check
331
- if (isEmpty(obj)) {
332
- // Handle empty
333
- }
334
-
335
- // Deep equality
336
- if (isEqual(obj1, obj2)) {
337
- // Objects are equal
338
- }
183
+ // Compare → always -1 | 0 | 1 (safe for sort)
184
+ compare(1, 2); // -1
185
+ compare('b', 'a'); // 1
339
186
  ```
340
187
 
341
- **Available utilities:**
342
- `ge`, `gt`, `is`, `isArray`, `isBoolean`, `isDate`, `isDefined`, `isEmpty`, `isEqual`, `isEven`, `isFunction`, `isNegative`, `isNil`, `isNumber`, `isObject`, `isOdd`, `isPositive`, `isPrimitive`, `isPromise`, `isRegex`, `isString`, `isWithin`, `isZero`, `le`, `lt`, `typeOf`
343
-
344
- ## Real-World Examples
345
-
346
- ### API Rate Limiting with Retry
188
+ ### Math Utilities
347
189
 
348
190
  ```typescript
349
- import { pool, retry, predict } from '@vielzeug/toolkit';
350
-
351
- // Create rate-limited pool
352
- const apiPool = pool(10); // Max 10 concurrent requests
353
-
354
- async function fetchWithRetry(url: string) {
355
- return apiPool(() =>
356
- retry(
357
- () =>
358
- predict(
359
- async (signal) => {
360
- const response = await fetch(url, { signal });
361
- if (!response.ok) throw new Error(`HTTP ${response.status}`);
362
- return response.json();
363
- },
364
- { timeout: 5000 },
365
- ),
366
- { times: 3, delay: 1000, backoff: 2 },
367
- ),
368
- );
369
- }
370
-
371
- // Process many URLs with rate limiting and retry
372
- const results = await Promise.all(urls.map((url) => fetchWithRetry(url)));
191
+ import { sum, average, clamp, round, range, percent, linspace } from '@vielzeug/toolkit';
192
+
193
+ sum([1, 2, 3, 4]); // 10
194
+ average([10, 20, 30]); // 20
195
+ clamp(105, 0, 100); // 100
196
+ round(Math.PI, 4); // 3.1416
197
+ range(1, 6, 1); // [1, 2, 3, 4, 5]
198
+ percent(25, 100); // 25
199
+ linspace(0, 10, 5); // [0, 2.5, 5, 7.5, 10]
373
200
  ```
374
201
 
375
- ### Batch Processing with Progress
202
+ ### Date Utilities
376
203
 
377
204
  ```typescript
378
- import { chunk, parallel, sleep } from '@vielzeug/toolkit';
379
-
380
- async function processBatch(items: any[], batchSize = 10) {
381
- const batches = chunk(items, batchSize);
382
- const results = [];
383
-
384
- for (let i = 0; i < batches.length; i++) {
385
- console.log(`Processing batch ${i + 1}/${batches.length}`);
205
+ import { timeDiff, interval, expires } from '@vielzeug/toolkit';
386
206
 
387
- const batchResults = await parallel(3, batches[i], async (item) => {
388
- return await processItem(item);
389
- });
207
+ // Human-readable time difference
208
+ timeDiff(new Date('2025-01-01'), new Date());
209
+ // e.g. { value: 2, unit: 'MONTH' }
390
210
 
391
- results.push(...batchResults);
211
+ // Generate date range
212
+ interval('2024-01-01', '2024-01-07', { interval: 'day' });
213
+ // [Date, Date, Date, Date, Date, Date, Date]
392
214
 
393
- // Delay between batches
394
- if (i < batches.length - 1) {
395
- await sleep(1000);
396
- }
397
- }
398
-
399
- return results;
400
- }
401
- ```
402
-
403
- ### Form Validation Pipeline
404
-
405
- ```typescript
406
- import { pipe, curry, isEmpty, isString } from '@vielzeug/toolkit';
407
-
408
- const required = (value: any) => {
409
- if (isEmpty(value)) throw new Error('Required field');
410
- return value;
411
- };
412
-
413
- const minLength = curry((min: number, value: string) => {
414
- if (!isString(value) || value.length < min) {
415
- throw new Error(`Minimum ${min} characters`);
416
- }
417
- return value;
418
- });
419
-
420
- const email = (value: string) => {
421
- if (!/^[^\s@]+@[^\s@]+\.[^\s@]+$/.test(value)) {
422
- throw new Error('Invalid email');
423
- }
424
- return value;
425
- };
426
-
427
- // Create validation pipeline
428
- const validateEmail = pipe(required, minLength(5), email);
429
-
430
- try {
431
- const validEmail = validateEmail(userInput);
432
- } catch (error) {
433
- console.error(error.message);
434
- }
215
+ // Check expiration
216
+ expires('2023-01-01'); // e.g. 'EXPIRED'
435
217
  ```
436
218
 
437
- ## Performance & Bundle Size
438
-
439
- ### Tree-Shaking
440
-
441
- Toolkit is designed for optimal tree-shaking. Import only what you use:
219
+ ### Type Guards
442
220
 
443
221
  ```typescript
444
- // Good - Only includes chunk function (~0.5KB gzipped)
445
- import { chunk } from '@vielzeug/toolkit';
446
-
447
- // ⚠️ Avoid - Imports entire library (~35KB gzipped)
448
- import * as toolkit from '@vielzeug/toolkit';
222
+ import { is } from '@vielzeug/toolkit';
223
+
224
+ is.string(v);
225
+ is.number(v);
226
+ is.boolean(v);
227
+ is.array(v);
228
+ is.object(v);
229
+ is.fn(v);
230
+ is.date(v);
231
+ is.promise(v);
232
+ is.regex(v);
233
+ is.nil(v);
234
+ is.defined(v);
235
+ is.primitive(v);
236
+ is.empty(v);
237
+ is.equal(a, b);
238
+ is.match(obj, src);
239
+ is.even(n);
240
+ is.odd(n);
241
+ is.positive(n);
242
+ is.negative(n);
243
+ is.zero(n);
244
+ is.within(n, min, max);
245
+ is.ge(a, b);
246
+ is.gt(a, b);
247
+ is.le(a, b);
248
+ is.lt(a, b);
249
+ is.typeOf(v); // e.g. 'string' | 'number' | 'array'
449
250
  ```
450
251
 
451
- ### Bundle Size by Category
452
-
453
- | Category | Utilities | Approx. Size (gzipped) |
454
- | -------- | --------- | ---------------------- |
455
- | Array | 25 | ~8KB |
456
- | Async | 11 | ~3KB |
457
- | Date | 3 | ~1KB |
458
- | Function | 14 | ~5KB |
459
- | Math | 17 | ~4KB |
460
- | Money | 3 | ~1KB |
461
- | Object | 10 | ~3KB |
462
- | Random | 4 | ~1KB |
463
- | String | 6 | ~2KB |
464
- | Typed | 27 | ~3KB |
465
-
466
- > **Note**: Individual utilities are typically **0.1-0.8 KB gzipped** each.
467
-
468
- ## TypeScript Support
469
-
470
- Full TypeScript support with complete type inference:
252
+ ## API
253
+
254
+ ### Array
255
+
256
+ | Function | Description |
257
+ |---|---|
258
+ | `chunk(arr, size)` | Split array into chunks of given size |
259
+ | `contains(arr, value)` | Check if array contains a value (deep equality) |
260
+ | `fold(arr, fn)` | Reduce without initial value |
261
+ | `group(arr, selector)` | Group by key — returns `Record<string, T[]>` |
262
+ | `keyBy(arr, selector)` | Index by key — returns `Record<string, T>` |
263
+ | `list(data, opts?)` | Reactive client-side pagination |
264
+ | `pick(arr, valueFn, predicate?)` | Pick single transformed element |
265
+ | `remoteList(opts)` | Reactive server-side pagination |
266
+ | `replace(arr, predicate, value)` | Replace first matching element |
267
+ | `rotate(arr, n, opts?)` | Rotate elements by N positions |
268
+ | `search(arr, query, opts?)` | Fuzzy search |
269
+ | `select(arr, mapper, predicate?)` | Map elements matching predicate (default: not nil) |
270
+ | `sort(arr, selector, direction?)` | Sort by selector with `'asc'`/`'desc'` direction |
271
+ | `sort(arr, selectors)` | Sort by multiple fields using object selectors |
272
+ | `toggle(arr, item, selector?, opts?)` | Add or remove item |
273
+ | `uniq(arr)` | Remove duplicates |
274
+
275
+ ### Object
276
+
277
+ | Function | Description |
278
+ |---|---|
279
+ | `cache()` | Key-value cache with auto GC |
280
+ | `diff(a, b)` | Find differences between objects |
281
+ | `merge(strategy, ...objs)` | Merge objects (deep/shallow/concat) |
282
+ | `parseJSON(str, fallback?)` | Safe JSON parse |
283
+ | `get(obj, path, default?)` | Access nested property by dot-path |
284
+ | `proxy(obj, opts)` | Object proxy with get/set hooks |
285
+ | `prune(value)` | Remove nulls/empty values recursively |
286
+ | `seek(obj, query, tone?)` | Search object values by similarity score |
287
+
288
+ ### String
289
+
290
+ | Function | Description |
291
+ |---|---|
292
+ | `camelCase(str)` | Convert to camelCase |
293
+ | `kebabCase(str)` | Convert to kebab-case |
294
+ | `pascalCase(str)` | Convert to PascalCase |
295
+ | `similarity(a, b)` | Similarity score (0–1) between two strings |
296
+ | `snakeCase(str)` | Convert to snake_case |
297
+ | `truncate(str, limit)` | Truncate with ellipsis |
298
+
299
+ ### Function
300
+
301
+ | Function | Description |
302
+ |---|---|
303
+ | `assert(cond, msg, opts?)` | Assert condition, throw on failure |
304
+ | `assertParams(params, keys)` | Validate required object keys |
305
+ | `compare(a, b)` | Safe comparator returning -1 \| 0 \| 1 |
306
+ | `compareBy(criteria)` | Multi-key object comparator |
307
+ | `compose(...fns)` | Right-to-left function composition |
308
+ | `curry(fn)` | Curry with partial application |
309
+ | `debounce(fn, ms)` | Delay execution until idle |
310
+ | `fp(fn, ...args)` | Functional pipeline helper |
311
+ | `memo(fn)` | Cache results by arguments |
312
+ | `once(fn)` | Execute only on first call |
313
+ | `pipe(...fns)` | Left-to-right function composition |
314
+ | `throttle(fn, ms)` | Limit execution rate |
315
+
316
+ ### Async
317
+
318
+ | Function | Description |
319
+ |---|---|
320
+ | `attempt(fn, opts?)` | Execute with retry and error handling |
321
+ | `defer()` | Deferred promise with external resolve/reject |
322
+ | `parallel(n, items, fn, signal?)` | Process array with concurrency limit |
323
+ | `pool(n)` | Concurrency-limited promise pool |
324
+ | `queue(opts?)` | Sequential/concurrent task queue |
325
+ | `race(promise, minDelay)` | Race promise against minimum delay |
326
+ | `retry(fn, opts?)` | Retry with backoff |
327
+ | `sleep(ms)` | Async delay |
328
+ | `waitFor(cond, opts?)` | Poll until condition is true |
329
+
330
+ ### Math
331
+
332
+ | Function | Description |
333
+ |---|---|
334
+ | `abs(n)` | Absolute value |
335
+ | `allocate(amount, ratios)` | Distribute proportionally (bigint) |
336
+ | `average(arr, fn?)` | Average of numbers |
337
+ | `clamp(n, min, max)` | Clamp to range |
338
+ | `distribute(amount, n)` | Distribute evenly (bigint) |
339
+ | `linspace(start, end, steps?)` | Evenly spaced number array |
340
+ | `max(arr, fn?)` | Maximum value |
341
+ | `median(arr, fn?)` | Median value |
342
+ | `min(arr, fn?)` | Minimum value |
343
+ | `percent(value, total)` | Percentage (0–100) |
344
+ | `range(start, end, step?)` | Generate number array |
345
+ | `round(n, precision?)` | Round to decimal places |
346
+ | `sum(arr, fn?)` | Sum of numbers |
347
+
348
+ ### Date
349
+
350
+ | Function | Description |
351
+ |---|---|
352
+ | `expires(date)` | Check expiration status |
353
+ | `interval(start, end, opts?)` | Generate date array for a range |
354
+ | `timeDiff(a, b?, units?)` | Time difference as `{ value, unit }` |
355
+
356
+ ### Money
357
+
358
+ | Function | Description |
359
+ |---|---|
360
+ | `currency(money)` | Format for display |
361
+ | `exchange(money, opts)` | Convert between currencies |
362
+
363
+ ### Random
364
+
365
+ | Function | Description |
366
+ |---|---|
367
+ | `draw(arr)` | Random element from array |
368
+ | `random(min, max)` | Random number in range |
369
+ | `shuffle(arr)` | Shuffle array |
370
+ | `uuid()` | Generate UUID v4 |
371
+
372
+ ### Type Guards (`is` namespace)
373
+
374
+ All type checks live on the `is` object:
471
375
 
472
376
  ```typescript
473
- import { map, filter, group } from '@vielzeug/toolkit';
474
-
475
- const numbers = [1, 2, 3, 4, 5];
476
-
477
- // Type inferred as number[]
478
- const doubled = map(numbers, (n) => n * 2);
479
-
480
- // Type inferred as number[]
481
- const evens = filter(numbers, (n) => n % 2 === 0);
482
-
483
- // Type inferred as Record<string, User[]>
484
- const byRole = group(users, (u) => u.role);
485
-
486
- // Async operations automatically return Promise
487
- const results = await map(ids, async (id) => fetchUser(id));
488
- // Type: Promise<User[]>
377
+ import { is } from '@vielzeug/toolkit';
378
+
379
+ is.string(v);
380
+ is.number(v);
381
+ is.boolean(v);
382
+ is.array(v);
383
+ is.object(v);
384
+ is.fn(v);
385
+ is.date(v);
386
+ is.promise(v);
387
+ is.regex(v);
388
+ is.nil(v);
389
+ is.defined(v);
390
+ is.primitive(v);
391
+ is.empty(v);
392
+ is.equal(a, b);
393
+ is.match(obj, src);
394
+ is.even(n);
395
+ is.odd(n);
396
+ is.positive(n);
397
+ is.negative(n);
398
+ is.zero(n);
399
+ is.within(n, min, max);
400
+ is.ge(a, b);
401
+ is.gt(a, b);
402
+ is.le(a, b);
403
+ is.lt(a, b);
404
+ is.typeOf(v); // e.g. 'string' | 'number' | 'array'
489
405
  ```
490
406
 
491
- ## Comparison with Alternatives
492
-
493
- | Feature | Toolkit | Lodash | Ramda | Native JS |
494
- | ---------------------- | ---------------- | ----------------- | ----------------- | ---------- |
495
- | TypeScript Support | ✅ First-class | ⚠️ Via @types | ⚠️ Via @types | ❌ Limited |
496
- | Tree-shakeable | ✅ By default | ⚠️ lodash-es only | ✅ Yes | N/A |
497
- | Bundle Size (min+gzip) | ~0.1-1KB/utility | ~24KB (full) | ~12KB (full) | 0KB |
498
- | Dependencies | 0 | 0 | 0 | N/A |
499
- | Async Support | ✅ Built-in | ❌ Limited | ❌ Limited | ⚠️ Manual |
500
- | Learning Curve | Low | Low | High (FP focused) | Low |
501
-
502
407
  ## Documentation
503
408
 
504
- - **[Full Documentation](https://helmuthdu.github.io/vielzeug/toolkit/)**
505
- - **[API Reference](https://helmuthdu.github.io/vielzeug/toolkit/api)**
506
- - **[Usage Guide](https://helmuthdu.github.io/vielzeug/toolkit/usage)**
507
- - **[Examples](https://helmuthdu.github.io/vielzeug/toolkit/examples/array)**
508
-
509
- ## Contributing
510
-
511
- We welcome contributions! Please see our [Contributing Guide](../../CONTRIBUTING.md) for details.
512
-
513
- ### Development
514
-
515
- ```bash
516
- # Install dependencies
517
- pnpm install
409
+ Full docs at **[vielzeug.dev/toolkit](https://vielzeug.dev/toolkit)**
518
410
 
519
- # Build the package
520
- pnpm build
521
-
522
- # Run tests
523
- pnpm test
524
-
525
- # Run tests in watch mode
526
- pnpm test:watch
527
-
528
- # Type check
529
- pnpm typecheck
530
- ```
411
+ | | |
412
+ |---|---|
413
+ | [Usage Guide](https://vielzeug.dev/toolkit/usage) | Arrays, objects, async, strings |
414
+ | [API Reference](https://vielzeug.dev/toolkit/api) | Complete function signatures |
415
+ | [Examples](https://vielzeug.dev/toolkit/examples) | Real-world utility patterns |
531
416
 
532
417
  ## License
533
418
 
534
- MIT © [Helmuth Saatkamp](https://github.com/helmuthdu/vielzeug)
535
-
536
- ## Related Packages
537
-
538
- Part of the [@vielzeug](https://helmuthdu.github.io/vielzeug/) monorepo:
539
-
540
- - **[@vielzeug/deposit](../deposit)** - Type-safe local storage with schemas and expiration
541
- - **[@vielzeug/fetchit](../fetchit)** - Advanced HTTP client with caching and retries
542
- - **[@vielzeug/formit](../formit)** - Type-safe form state and validation
543
- - **[@vielzeug/i18nit](../i18nit)** - Internationalization with TypeScript
544
- - **[@vielzeug/logit](../logit)** - Beautiful console logging
545
- - **[@vielzeug/permit](../permit)** - Role-based access control
546
- - **[@vielzeug/validit](../validit)** - Type-safe validation schemas
419
+ MIT © [Helmuth Saatkamp](https://github.com/helmuthdu) — Part of the [Vielzeug](https://github.com/helmuthdu/vielzeug) monorepo.