@vielzeug/toolkit 1.1.3 → 2.0.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.
- package/README.md +325 -452
- package/dist/array/chunk.cjs +2 -2
- package/dist/array/chunk.cjs.map +1 -1
- package/dist/array/chunk.d.ts +29 -0
- package/dist/array/chunk.d.ts.map +1 -0
- package/dist/array/chunk.js +22 -24
- package/dist/array/chunk.js.map +1 -1
- package/dist/array/contains.cjs +2 -2
- package/dist/array/contains.cjs.map +1 -1
- package/dist/array/contains.d.ts +19 -0
- package/dist/array/contains.d.ts.map +1 -0
- package/dist/array/contains.js +12 -9
- package/dist/array/contains.js.map +1 -1
- package/dist/array/fold.cjs +2 -0
- package/dist/array/fold.cjs.map +1 -0
- package/dist/array/fold.d.ts +21 -0
- package/dist/array/fold.d.ts.map +1 -0
- package/dist/array/fold.js +19 -0
- package/dist/array/fold.js.map +1 -0
- package/dist/array/group.cjs +2 -2
- package/dist/array/group.cjs.map +1 -1
- package/dist/array/group.d.ts +19 -0
- package/dist/array/group.d.ts.map +1 -0
- package/dist/array/group.js +18 -15
- package/dist/array/group.js.map +1 -1
- package/dist/array/index.d.ts +16 -0
- package/dist/array/index.d.ts.map +1 -0
- package/dist/array/keyBy.cjs +2 -0
- package/dist/array/keyBy.cjs.map +1 -0
- package/dist/array/keyBy.d.ts +20 -0
- package/dist/array/keyBy.d.ts.map +1 -0
- package/dist/array/keyBy.js +19 -0
- package/dist/array/keyBy.js.map +1 -0
- package/dist/array/list.cjs +2 -2
- package/dist/array/list.cjs.map +1 -1
- package/dist/array/list.d.ts +58 -0
- package/dist/array/list.d.ts.map +1 -0
- package/dist/array/list.js +103 -106
- package/dist/array/list.js.map +1 -1
- package/dist/array/pick.cjs +2 -2
- package/dist/array/pick.cjs.map +1 -1
- package/dist/array/pick.d.ts +19 -0
- package/dist/array/pick.d.ts.map +1 -0
- package/dist/array/pick.js +15 -14
- package/dist/array/pick.js.map +1 -1
- package/dist/array/remoteList.cjs +2 -2
- package/dist/array/remoteList.cjs.map +1 -1
- package/dist/array/remoteList.d.ts +64 -0
- package/dist/array/remoteList.d.ts.map +1 -0
- package/dist/array/remoteList.js +121 -122
- package/dist/array/remoteList.js.map +1 -1
- package/dist/array/replace.cjs +2 -0
- package/dist/array/replace.cjs.map +1 -0
- package/dist/array/replace.d.ts +20 -0
- package/dist/array/replace.d.ts.map +1 -0
- package/dist/array/replace.js +19 -0
- package/dist/array/replace.js.map +1 -0
- package/dist/array/rotate.cjs +2 -0
- package/dist/array/rotate.cjs.map +1 -0
- package/dist/array/rotate.d.ts +22 -0
- package/dist/array/rotate.d.ts.map +1 -0
- package/dist/array/rotate.js +19 -0
- package/dist/array/rotate.js.map +1 -0
- package/dist/array/search.cjs +2 -2
- package/dist/array/search.cjs.map +1 -1
- package/dist/array/search.d.ts +19 -0
- package/dist/array/search.d.ts.map +1 -0
- package/dist/array/search.js +23 -13
- package/dist/array/search.js.map +1 -1
- package/dist/array/select.cjs +2 -2
- package/dist/array/select.cjs.map +1 -1
- package/dist/array/select.d.ts +21 -0
- package/dist/array/select.d.ts.map +1 -0
- package/dist/array/select.js +16 -15
- package/dist/array/select.js.map +1 -1
- package/dist/array/sort.cjs +2 -2
- package/dist/array/sort.cjs.map +1 -1
- package/dist/array/sort.d.ts +26 -0
- package/dist/array/sort.d.ts.map +1 -0
- package/dist/array/sort.js +18 -12
- package/dist/array/sort.js.map +1 -1
- package/dist/array/toggle.cjs +2 -0
- package/dist/array/toggle.cjs.map +1 -0
- package/dist/array/toggle.d.ts +29 -0
- package/dist/array/toggle.d.ts.map +1 -0
- package/dist/array/toggle.js +9 -0
- package/dist/array/toggle.js.map +1 -0
- package/dist/array/uniq.cjs +2 -2
- package/dist/array/uniq.cjs.map +1 -1
- package/dist/array/uniq.d.ts +21 -0
- package/dist/array/uniq.d.ts.map +1 -0
- package/dist/array/uniq.js +15 -17
- package/dist/array/uniq.js.map +1 -1
- package/dist/async/attempt.cjs +2 -2
- package/dist/async/attempt.cjs.map +1 -1
- package/dist/async/attempt.d.ts +40 -0
- package/dist/async/attempt.d.ts.map +1 -0
- package/dist/async/attempt.js +19 -14
- package/dist/async/attempt.js.map +1 -1
- package/dist/async/defer.cjs +2 -2
- package/dist/async/defer.cjs.map +1 -1
- package/dist/async/defer.d.ts +23 -0
- package/dist/async/defer.d.ts.map +1 -0
- package/dist/async/defer.js +12 -9
- package/dist/async/defer.js.map +1 -1
- package/dist/async/index.d.ts +12 -0
- package/dist/async/index.d.ts.map +1 -0
- package/dist/async/parallel.cjs +2 -2
- package/dist/async/parallel.cjs.map +1 -1
- package/dist/async/parallel.d.ts +31 -0
- package/dist/async/parallel.d.ts.map +1 -0
- package/dist/async/parallel.js +26 -27
- package/dist/async/parallel.js.map +1 -1
- package/dist/async/pool.cjs +2 -2
- package/dist/async/pool.cjs.map +1 -1
- package/dist/async/pool.d.ts +21 -0
- package/dist/async/pool.d.ts.map +1 -0
- package/dist/async/pool.js +23 -21
- package/dist/async/pool.js.map +1 -1
- package/dist/async/predict.cjs +2 -2
- package/dist/async/predict.cjs.map +1 -1
- package/dist/async/predict.d.ts +24 -0
- package/dist/async/predict.d.ts.map +1 -0
- package/dist/async/predict.js +10 -12
- package/dist/async/predict.js.map +1 -1
- package/dist/async/queue.cjs +2 -2
- package/dist/async/queue.cjs.map +1 -1
- package/dist/async/queue.d.ts +43 -0
- package/dist/async/queue.d.ts.map +1 -0
- package/dist/async/queue.js +52 -56
- package/dist/async/queue.js.map +1 -1
- package/dist/async/race.cjs +2 -2
- package/dist/async/race.cjs.map +1 -1
- package/dist/async/race.d.ts +16 -0
- package/dist/async/race.d.ts.map +1 -0
- package/dist/async/race.js +8 -7
- package/dist/async/race.js.map +1 -1
- package/dist/async/retry.cjs +2 -2
- package/dist/async/retry.cjs.map +1 -1
- package/dist/async/retry.d.ts +32 -0
- package/dist/async/retry.d.ts.map +1 -0
- package/dist/async/retry.js +19 -24
- package/dist/async/retry.js.map +1 -1
- package/dist/async/scheduler.cjs +2 -0
- package/dist/async/scheduler.cjs.map +1 -0
- package/dist/async/scheduler.d.ts +51 -0
- package/dist/async/scheduler.d.ts.map +1 -0
- package/dist/async/scheduler.js +43 -0
- package/dist/async/scheduler.js.map +1 -0
- package/dist/async/sleep.cjs +2 -2
- package/dist/async/sleep.cjs.map +1 -1
- package/dist/async/sleep.d.ts +16 -0
- package/dist/async/sleep.d.ts.map +1 -0
- package/dist/async/sleep.js +11 -11
- package/dist/async/sleep.js.map +1 -1
- package/dist/async/waitFor.cjs +2 -2
- package/dist/async/waitFor.cjs.map +1 -1
- package/dist/async/waitFor.d.ts +33 -0
- package/dist/async/waitFor.d.ts.map +1 -0
- package/dist/async/waitFor.js +29 -36
- package/dist/async/waitFor.js.map +1 -1
- package/dist/date/expires.cjs +2 -2
- package/dist/date/expires.cjs.map +1 -1
- package/dist/date/expires.d.ts +15 -0
- package/dist/date/expires.d.ts.map +1 -0
- package/dist/date/expires.js +11 -10
- package/dist/date/expires.js.map +1 -1
- package/dist/date/index.d.ts +4 -0
- package/dist/date/index.d.ts.map +1 -0
- package/dist/date/interval.cjs +2 -2
- package/dist/date/interval.cjs.map +1 -1
- package/dist/date/interval.d.ts +25 -0
- package/dist/date/interval.d.ts.map +1 -0
- package/dist/date/interval.js +31 -37
- package/dist/date/interval.js.map +1 -1
- package/dist/date/timeDiff.cjs +2 -2
- package/dist/date/timeDiff.cjs.map +1 -1
- package/dist/date/timeDiff.d.ts +24 -0
- package/dist/date/timeDiff.d.ts.map +1 -0
- package/dist/date/timeDiff.js +58 -25
- package/dist/date/timeDiff.js.map +1 -1
- package/dist/function/assert.cjs +2 -3
- package/dist/function/assert.cjs.map +1 -1
- package/dist/function/assert.d.ts +38 -0
- package/dist/function/assert.d.ts.map +1 -0
- package/dist/function/assert.js +13 -11
- package/dist/function/assert.js.map +1 -1
- package/dist/function/assertParams.cjs +2 -2
- package/dist/function/assertParams.cjs.map +1 -1
- package/dist/function/assertParams.d.ts +24 -0
- package/dist/function/assertParams.d.ts.map +1 -0
- package/dist/function/assertParams.js +13 -12
- package/dist/function/assertParams.js.map +1 -1
- package/dist/function/compare.cjs +2 -2
- package/dist/function/compare.cjs.map +1 -1
- package/dist/function/compare.d.ts +23 -0
- package/dist/function/compare.d.ts.map +1 -0
- package/dist/function/compare.js +22 -21
- package/dist/function/compare.js.map +1 -1
- package/dist/function/compareBy.cjs +2 -2
- package/dist/function/compareBy.cjs.map +1 -1
- package/dist/function/compareBy.d.ts +24 -0
- package/dist/function/compareBy.d.ts.map +1 -0
- package/dist/function/compareBy.js +15 -14
- package/dist/function/compareBy.js.map +1 -1
- package/dist/function/compose.cjs +2 -2
- package/dist/function/compose.cjs.map +1 -1
- package/dist/function/compose.d.ts +22 -0
- package/dist/function/compose.d.ts.map +1 -0
- package/dist/function/compose.js +10 -13
- package/dist/function/compose.js.map +1 -1
- package/dist/function/curry.cjs +2 -2
- package/dist/function/curry.cjs.map +1 -1
- package/dist/function/curry.d.ts +21 -0
- package/dist/function/curry.d.ts.map +1 -0
- package/dist/function/curry.js +8 -7
- package/dist/function/curry.js.map +1 -1
- package/dist/function/debounce.cjs +2 -2
- package/dist/function/debounce.cjs.map +1 -1
- package/dist/function/debounce.d.ts +12 -0
- package/dist/function/debounce.d.ts.map +1 -0
- package/dist/function/debounce.js +34 -26
- package/dist/function/debounce.js.map +1 -1
- package/dist/function/fp.cjs +2 -2
- package/dist/function/fp.cjs.map +1 -1
- package/dist/function/fp.d.ts +24 -0
- package/dist/function/fp.d.ts.map +1 -0
- package/dist/function/fp.js +6 -10
- package/dist/function/fp.js.map +1 -1
- package/dist/function/index.d.ts +13 -0
- package/dist/function/index.d.ts.map +1 -0
- package/dist/function/memo.cjs +2 -2
- package/dist/function/memo.cjs.map +1 -1
- package/dist/function/memo.d.ts +30 -0
- package/dist/function/memo.d.ts.map +1 -0
- package/dist/function/memo.js +16 -24
- package/dist/function/memo.js.map +1 -1
- package/dist/function/once.cjs +2 -2
- package/dist/function/once.cjs.map +1 -1
- package/dist/function/once.d.ts +24 -0
- package/dist/function/once.d.ts.map +1 -0
- package/dist/function/once.js +10 -10
- package/dist/function/once.js.map +1 -1
- package/dist/function/pipe.cjs +2 -2
- package/dist/function/pipe.cjs.map +1 -1
- package/dist/function/pipe.d.ts +23 -0
- package/dist/function/pipe.d.ts.map +1 -0
- package/dist/function/pipe.js +10 -10
- package/dist/function/pipe.js.map +1 -1
- package/dist/function/throttle.cjs +2 -2
- package/dist/function/throttle.cjs.map +1 -1
- package/dist/function/throttle.d.ts +21 -0
- package/dist/function/throttle.d.ts.map +1 -0
- package/dist/function/throttle.js +45 -37
- package/dist/function/throttle.js.map +1 -1
- package/dist/index.cjs +1 -2
- package/dist/index.d.ts +77 -2813
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +75 -253
- package/dist/math/abs.cjs +2 -2
- package/dist/math/abs.cjs.map +1 -1
- package/dist/math/abs.d.ts +17 -0
- package/dist/math/abs.d.ts.map +1 -0
- package/dist/math/abs.js +7 -6
- package/dist/math/abs.js.map +1 -1
- package/dist/math/allocate.cjs +2 -2
- package/dist/math/allocate.cjs.map +1 -1
- package/dist/math/allocate.d.ts +24 -0
- package/dist/math/allocate.d.ts.map +1 -0
- package/dist/math/allocate.js +20 -28
- package/dist/math/allocate.js.map +1 -1
- package/dist/math/average.cjs +2 -2
- package/dist/math/average.cjs.map +1 -1
- package/dist/math/average.d.ts +16 -0
- package/dist/math/average.d.ts.map +1 -0
- package/dist/math/average.js +13 -24
- package/dist/math/average.js.map +1 -1
- package/dist/math/clamp.cjs +2 -2
- package/dist/math/clamp.cjs.map +1 -1
- package/dist/math/clamp.d.ts +18 -0
- package/dist/math/clamp.d.ts.map +1 -0
- package/dist/math/clamp.js +7 -6
- package/dist/math/clamp.js.map +1 -1
- package/dist/math/distribute.cjs +2 -2
- package/dist/math/distribute.cjs.map +1 -1
- package/dist/math/distribute.d.ts +24 -0
- package/dist/math/distribute.d.ts.map +1 -0
- package/dist/math/distribute.js +14 -17
- package/dist/math/distribute.js.map +1 -1
- package/dist/math/index.d.ts +14 -0
- package/dist/math/index.d.ts.map +1 -0
- package/dist/math/linspace.cjs +2 -0
- package/dist/math/linspace.cjs.map +1 -0
- package/dist/math/linspace.d.ts +19 -0
- package/dist/math/linspace.d.ts.map +1 -0
- package/dist/math/linspace.js +11 -0
- package/dist/math/linspace.js.map +1 -0
- package/dist/math/max.cjs +2 -2
- package/dist/math/max.cjs.map +1 -1
- package/dist/math/max.d.ts +23 -0
- package/dist/math/max.d.ts.map +1 -0
- package/dist/math/max.js +10 -11
- package/dist/math/max.js.map +1 -1
- package/dist/math/median.cjs +2 -2
- package/dist/math/median.cjs.map +1 -1
- package/dist/math/median.d.ts +17 -0
- package/dist/math/median.d.ts.map +1 -0
- package/dist/math/median.js +11 -10
- package/dist/math/median.js.map +1 -1
- package/dist/math/min.cjs +2 -2
- package/dist/math/min.cjs.map +1 -1
- package/dist/math/min.d.ts +23 -0
- package/dist/math/min.d.ts.map +1 -0
- package/dist/math/min.js +10 -11
- package/dist/math/min.js.map +1 -1
- package/dist/math/percent.cjs +2 -0
- package/dist/math/percent.cjs.map +1 -0
- package/dist/math/percent.d.ts +19 -0
- package/dist/math/percent.d.ts.map +1 -0
- package/dist/math/percent.js +8 -0
- package/dist/math/percent.js.map +1 -0
- package/dist/math/range.cjs +2 -2
- package/dist/math/range.cjs.map +1 -1
- package/dist/math/range.d.ts +23 -0
- package/dist/math/range.d.ts.map +1 -0
- package/dist/math/range.js +28 -17
- package/dist/math/range.js.map +1 -1
- package/dist/math/round.cjs +2 -2
- package/dist/math/round.cjs.map +1 -1
- package/dist/math/round.d.ts +21 -0
- package/dist/math/round.d.ts.map +1 -0
- package/dist/math/round.js +9 -8
- package/dist/math/round.js.map +1 -1
- package/dist/math/sum.cjs +2 -2
- package/dist/math/sum.cjs.map +1 -1
- package/dist/math/sum.d.ts +17 -0
- package/dist/math/sum.d.ts.map +1 -0
- package/dist/math/sum.js +11 -14
- package/dist/math/sum.js.map +1 -1
- package/dist/money/currency.cjs +2 -2
- package/dist/money/currency.cjs.map +1 -1
- package/dist/money/currency.d.ts +30 -0
- package/dist/money/currency.d.ts.map +1 -0
- package/dist/money/currency.js +19 -47
- package/dist/money/currency.js.map +1 -1
- package/dist/money/exchange.cjs +2 -2
- package/dist/money/exchange.cjs.map +1 -1
- package/dist/money/exchange.d.ts +29 -0
- package/dist/money/exchange.d.ts.map +1 -0
- package/dist/money/exchange.js +12 -12
- package/dist/money/exchange.js.map +1 -1
- package/dist/money/index.d.ts +4 -0
- package/dist/money/index.d.ts.map +1 -0
- package/dist/money/types.d.ts +9 -0
- package/dist/money/types.d.ts.map +1 -0
- package/dist/object/diff.cjs +2 -2
- package/dist/object/diff.cjs.map +1 -1
- package/dist/object/diff.d.ts +26 -0
- package/dist/object/diff.d.ts.map +1 -0
- package/dist/object/diff.js +19 -17
- package/dist/object/diff.js.map +1 -1
- package/dist/object/index.d.ts +9 -0
- package/dist/object/index.d.ts.map +1 -0
- package/dist/object/merge.cjs +2 -2
- package/dist/object/merge.cjs.map +1 -1
- package/dist/object/merge.d.ts +44 -0
- package/dist/object/merge.d.ts.map +1 -0
- package/dist/object/merge.js +27 -21
- package/dist/object/merge.js.map +1 -1
- package/dist/object/parseJSON.cjs +2 -2
- package/dist/object/parseJSON.cjs.map +1 -1
- package/dist/object/parseJSON.d.ts +32 -0
- package/dist/object/parseJSON.d.ts.map +1 -0
- package/dist/object/parseJSON.js +17 -18
- package/dist/object/parseJSON.js.map +1 -1
- package/dist/object/path.cjs +2 -2
- package/dist/object/path.cjs.map +1 -1
- package/dist/object/path.d.ts +32 -0
- package/dist/object/path.d.ts.map +1 -0
- package/dist/object/path.js +25 -23
- package/dist/object/path.js.map +1 -1
- package/dist/object/proxy.cjs +2 -0
- package/dist/object/proxy.cjs.map +1 -0
- package/dist/object/proxy.d.ts +30 -0
- package/dist/object/proxy.d.ts.map +1 -0
- package/dist/object/proxy.js +21 -0
- package/dist/object/proxy.js.map +1 -0
- package/dist/object/prune.cjs +2 -0
- package/dist/object/prune.cjs.map +1 -0
- package/dist/object/prune.d.ts +21 -0
- package/dist/object/prune.d.ts.map +1 -0
- package/dist/object/prune.js +31 -0
- package/dist/object/prune.js.map +1 -0
- package/dist/object/seek.cjs +2 -2
- package/dist/object/seek.cjs.map +1 -1
- package/dist/object/seek.d.ts +2 -0
- package/dist/object/seek.d.ts.map +1 -0
- package/dist/object/seek.js +25 -12
- package/dist/object/seek.js.map +1 -1
- package/dist/object/stash.cjs +2 -0
- package/dist/object/stash.cjs.map +1 -0
- package/dist/object/stash.d.ts +45 -0
- package/dist/object/stash.d.ts.map +1 -0
- package/dist/object/stash.js +99 -0
- package/dist/object/stash.js.map +1 -0
- package/dist/random/draw.cjs +2 -2
- package/dist/random/draw.cjs.map +1 -1
- package/dist/random/draw.d.ts +16 -0
- package/dist/random/draw.d.ts.map +1 -0
- package/dist/random/draw.js +13 -10
- package/dist/random/draw.js.map +1 -1
- package/dist/random/index.d.ts +5 -0
- package/dist/random/index.d.ts.map +1 -0
- package/dist/random/random.cjs +2 -2
- package/dist/random/random.cjs.map +1 -1
- package/dist/random/random.d.ts +14 -0
- package/dist/random/random.d.ts.map +1 -0
- package/dist/random/random.js +16 -9
- package/dist/random/random.js.map +1 -1
- package/dist/random/shuffle.cjs +2 -2
- package/dist/random/shuffle.cjs.map +1 -1
- package/dist/random/shuffle.d.ts +17 -0
- package/dist/random/shuffle.d.ts.map +1 -0
- package/dist/random/shuffle.js +18 -14
- package/dist/random/shuffle.js.map +1 -1
- package/dist/random/uuid.cjs +2 -2
- package/dist/random/uuid.cjs.map +1 -1
- package/dist/random/uuid.d.ts +12 -0
- package/dist/random/uuid.d.ts.map +1 -0
- package/dist/random/uuid.js +7 -9
- package/dist/random/uuid.js.map +1 -1
- package/dist/string/_caseUtils.cjs +2 -2
- package/dist/string/_caseUtils.cjs.map +1 -1
- package/dist/string/_caseUtils.d.ts +13 -0
- package/dist/string/_caseUtils.d.ts.map +1 -0
- package/dist/string/_caseUtils.js +8 -8
- package/dist/string/_caseUtils.js.map +1 -1
- package/dist/string/camelCase.cjs +2 -2
- package/dist/string/camelCase.cjs.map +1 -1
- package/dist/string/camelCase.d.ts +14 -0
- package/dist/string/camelCase.d.ts.map +1 -0
- package/dist/string/camelCase.js +8 -7
- package/dist/string/camelCase.js.map +1 -1
- package/dist/string/index.d.ts +7 -0
- package/dist/string/index.d.ts.map +1 -0
- package/dist/string/kebabCase.cjs +2 -2
- package/dist/string/kebabCase.cjs.map +1 -1
- package/dist/string/kebabCase.d.ts +15 -0
- package/dist/string/kebabCase.d.ts.map +1 -0
- package/dist/string/kebabCase.js +8 -7
- package/dist/string/kebabCase.js.map +1 -1
- package/dist/string/pascalCase.cjs +2 -2
- package/dist/string/pascalCase.cjs.map +1 -1
- package/dist/string/pascalCase.d.ts +15 -0
- package/dist/string/pascalCase.d.ts.map +1 -0
- package/dist/string/pascalCase.js +8 -7
- package/dist/string/pascalCase.js.map +1 -1
- package/dist/string/similarity.cjs +2 -2
- package/dist/string/similarity.cjs.map +1 -1
- package/dist/string/similarity.d.ts +20 -0
- package/dist/string/similarity.d.ts.map +1 -0
- package/dist/string/similarity.js +20 -36
- package/dist/string/similarity.js.map +1 -1
- package/dist/string/snakeCase.cjs +2 -2
- package/dist/string/snakeCase.cjs.map +1 -1
- package/dist/string/snakeCase.d.ts +15 -0
- package/dist/string/snakeCase.d.ts.map +1 -0
- package/dist/string/snakeCase.js +8 -7
- package/dist/string/snakeCase.js.map +1 -1
- package/dist/string/truncate.cjs +2 -2
- package/dist/string/truncate.cjs.map +1 -1
- package/dist/string/truncate.d.ts +28 -0
- package/dist/string/truncate.d.ts.map +1 -0
- package/dist/string/truncate.js +20 -17
- package/dist/string/truncate.js.map +1 -1
- package/dist/toolkit.cjs +2 -0
- package/dist/toolkit.cjs.map +1 -0
- package/dist/toolkit.js +1523 -0
- package/dist/toolkit.js.map +1 -0
- package/dist/typed/index.d.ts +24 -0
- package/dist/typed/index.d.ts.map +1 -0
- package/dist/typed/is.cjs +2 -2
- package/dist/typed/is.cjs.map +1 -1
- package/dist/typed/is.d.ts +95 -0
- package/dist/typed/is.d.ts.map +1 -0
- package/dist/typed/is.js +54 -42
- package/dist/typed/is.js.map +1 -1
- package/dist/typed/isArray.cjs +2 -2
- package/dist/typed/isArray.cjs.map +1 -1
- package/dist/typed/isArray.d.ts +16 -0
- package/dist/typed/isArray.d.ts.map +1 -0
- package/dist/typed/isArray.js +8 -8
- package/dist/typed/isArray.js.map +1 -1
- package/dist/typed/isBoolean.cjs +2 -2
- package/dist/typed/isBoolean.cjs.map +1 -1
- package/dist/typed/isBoolean.d.ts +23 -0
- package/dist/typed/isBoolean.d.ts.map +1 -0
- package/dist/typed/isBoolean.js +7 -6
- package/dist/typed/isBoolean.js.map +1 -1
- package/dist/typed/isDate.cjs +2 -2
- package/dist/typed/isDate.cjs.map +1 -1
- package/dist/typed/isDate.d.ts +16 -0
- package/dist/typed/isDate.d.ts.map +1 -0
- package/dist/typed/isDate.js +7 -8
- package/dist/typed/isDate.js.map +1 -1
- package/dist/typed/isDefined.cjs +2 -2
- package/dist/typed/isDefined.cjs.map +1 -1
- package/dist/typed/isDefined.d.ts +19 -0
- package/dist/typed/isDefined.d.ts.map +1 -0
- package/dist/typed/isDefined.js +7 -6
- package/dist/typed/isDefined.js.map +1 -1
- package/dist/typed/isEmpty.cjs +2 -2
- package/dist/typed/isEmpty.cjs.map +1 -1
- package/dist/typed/isEmpty.d.ts +24 -0
- package/dist/typed/isEmpty.d.ts.map +1 -0
- package/dist/typed/isEmpty.js +8 -9
- package/dist/typed/isEmpty.js.map +1 -1
- package/dist/typed/isEqual.cjs +2 -2
- package/dist/typed/isEqual.cjs.map +1 -1
- package/dist/typed/isEqual.d.ts +24 -0
- package/dist/typed/isEqual.d.ts.map +1 -0
- package/dist/typed/isEqual.js +27 -28
- package/dist/typed/isEqual.js.map +1 -1
- package/dist/typed/isEven.cjs +2 -2
- package/dist/typed/isEven.cjs.map +1 -1
- package/dist/typed/isEven.d.ts +9 -0
- package/dist/typed/isEven.d.ts.map +1 -0
- package/dist/typed/isEven.js +7 -6
- package/dist/typed/isEven.js.map +1 -1
- package/dist/typed/isFunction.cjs +2 -2
- package/dist/typed/isFunction.cjs.map +1 -1
- package/dist/typed/isFunction.d.ts +16 -0
- package/dist/typed/isFunction.d.ts.map +1 -0
- package/dist/typed/isFunction.js +7 -8
- package/dist/typed/isFunction.js.map +1 -1
- package/dist/typed/isMatch.cjs +2 -2
- package/dist/typed/isMatch.cjs.map +1 -1
- package/dist/typed/isMatch.d.ts +23 -0
- package/dist/typed/isMatch.d.ts.map +1 -0
- package/dist/typed/isMatch.js +16 -18
- package/dist/typed/isMatch.js.map +1 -1
- package/dist/typed/isNegative.cjs +2 -2
- package/dist/typed/isNegative.cjs.map +1 -1
- package/dist/typed/isNegative.d.ts +26 -0
- package/dist/typed/isNegative.d.ts.map +1 -0
- package/dist/typed/isNegative.js +7 -6
- package/dist/typed/isNegative.js.map +1 -1
- package/dist/typed/isNil.cjs +2 -2
- package/dist/typed/isNil.cjs.map +1 -1
- package/dist/typed/isNil.d.ts +17 -0
- package/dist/typed/isNil.d.ts.map +1 -0
- package/dist/typed/isNil.js +7 -8
- package/dist/typed/isNil.js.map +1 -1
- package/dist/typed/isNumber.cjs +2 -2
- package/dist/typed/isNumber.cjs.map +1 -1
- package/dist/typed/isNumber.d.ts +16 -0
- package/dist/typed/isNumber.d.ts.map +1 -0
- package/dist/typed/isNumber.js +8 -8
- package/dist/typed/isNumber.js.map +1 -1
- package/dist/typed/isObject.cjs +2 -2
- package/dist/typed/isObject.cjs.map +1 -1
- package/dist/typed/isObject.d.ts +19 -0
- package/dist/typed/isObject.d.ts.map +1 -0
- package/dist/typed/isObject.js +8 -8
- package/dist/typed/isObject.js.map +1 -1
- package/dist/typed/isOdd.cjs +2 -2
- package/dist/typed/isOdd.cjs.map +1 -1
- package/dist/typed/isOdd.d.ts +9 -0
- package/dist/typed/isOdd.d.ts.map +1 -0
- package/dist/typed/isOdd.js +7 -6
- package/dist/typed/isOdd.js.map +1 -1
- package/dist/typed/isPositive.cjs +2 -2
- package/dist/typed/isPositive.cjs.map +1 -1
- package/dist/typed/isPositive.d.ts +26 -0
- package/dist/typed/isPositive.d.ts.map +1 -0
- package/dist/typed/isPositive.js +7 -6
- package/dist/typed/isPositive.js.map +1 -1
- package/dist/typed/isPrimitive.cjs +2 -2
- package/dist/typed/isPrimitive.cjs.map +1 -1
- package/dist/typed/isPrimitive.d.ts +18 -0
- package/dist/typed/isPrimitive.d.ts.map +1 -0
- package/dist/typed/isPrimitive.js +8 -9
- package/dist/typed/isPrimitive.js.map +1 -1
- package/dist/typed/isPromise.cjs +2 -2
- package/dist/typed/isPromise.cjs.map +1 -1
- package/dist/typed/isPromise.d.ts +17 -0
- package/dist/typed/isPromise.d.ts.map +1 -0
- package/dist/typed/isPromise.js +7 -9
- package/dist/typed/isPromise.js.map +1 -1
- package/dist/typed/isRegex.cjs +2 -2
- package/dist/typed/isRegex.cjs.map +1 -1
- package/dist/typed/isRegex.d.ts +21 -0
- package/dist/typed/isRegex.d.ts.map +1 -0
- package/dist/typed/isRegex.js +7 -6
- package/dist/typed/isRegex.js.map +1 -1
- package/dist/typed/isString.cjs +2 -2
- package/dist/typed/isString.cjs.map +1 -1
- package/dist/typed/isString.d.ts +16 -0
- package/dist/typed/isString.d.ts.map +1 -0
- package/dist/typed/isString.js +8 -8
- package/dist/typed/isString.js.map +1 -1
- package/dist/typed/isWithin.cjs +2 -2
- package/dist/typed/isWithin.cjs.map +1 -1
- package/dist/typed/isWithin.d.ts +20 -0
- package/dist/typed/isWithin.d.ts.map +1 -0
- package/dist/typed/isWithin.js +9 -9
- package/dist/typed/isWithin.js.map +1 -1
- package/dist/typed/isZero.cjs +2 -2
- package/dist/typed/isZero.cjs.map +1 -1
- package/dist/typed/isZero.d.ts +25 -0
- package/dist/typed/isZero.d.ts.map +1 -0
- package/dist/typed/isZero.js +7 -6
- package/dist/typed/isZero.js.map +1 -1
- package/dist/typed/typeOf.cjs +2 -2
- package/dist/typed/typeOf.cjs.map +1 -1
- package/dist/typed/typeOf.d.ts +30 -0
- package/dist/typed/typeOf.d.ts.map +1 -0
- package/dist/typed/typeOf.js +11 -13
- package/dist/typed/typeOf.js.map +1 -1
- package/dist/types.d.ts +9 -0
- package/dist/types.d.ts.map +1 -0
- package/package.json +77 -12
- package/dist/array/aggregate.cjs +0 -2
- package/dist/array/aggregate.cjs.map +0 -1
- package/dist/array/aggregate.js +0 -16
- package/dist/array/aggregate.js.map +0 -1
- package/dist/array/alternate.cjs +0 -2
- package/dist/array/alternate.cjs.map +0 -1
- package/dist/array/alternate.js +0 -9
- package/dist/array/alternate.js.map +0 -1
- package/dist/array/arrange.cjs +0 -2
- package/dist/array/arrange.cjs.map +0 -1
- package/dist/array/arrange.js +0 -6
- package/dist/array/arrange.js.map +0 -1
- package/dist/array/compact.cjs +0 -2
- package/dist/array/compact.cjs.map +0 -1
- package/dist/array/compact.js +0 -9
- package/dist/array/compact.js.map +0 -1
- package/dist/array/every.cjs +0 -2
- package/dist/array/every.cjs.map +0 -1
- package/dist/array/every.js +0 -14
- package/dist/array/every.js.map +0 -1
- package/dist/array/filter.cjs +0 -2
- package/dist/array/filter.cjs.map +0 -1
- package/dist/array/filter.js +0 -14
- package/dist/array/filter.js.map +0 -1
- package/dist/array/find.cjs +0 -2
- package/dist/array/find.cjs.map +0 -1
- package/dist/array/find.js +0 -14
- package/dist/array/find.js.map +0 -1
- package/dist/array/findIndex.cjs +0 -2
- package/dist/array/findIndex.cjs.map +0 -1
- package/dist/array/findIndex.js +0 -14
- package/dist/array/findIndex.js.map +0 -1
- package/dist/array/findLast.cjs +0 -2
- package/dist/array/findLast.cjs.map +0 -1
- package/dist/array/findLast.js +0 -14
- package/dist/array/findLast.js.map +0 -1
- package/dist/array/flatten.cjs +0 -2
- package/dist/array/flatten.cjs.map +0 -1
- package/dist/array/flatten.js +0 -7
- package/dist/array/flatten.js.map +0 -1
- package/dist/array/map.cjs +0 -2
- package/dist/array/map.cjs.map +0 -1
- package/dist/array/map.js +0 -18
- package/dist/array/map.js.map +0 -1
- package/dist/array/reduce.cjs +0 -2
- package/dist/array/reduce.cjs.map +0 -1
- package/dist/array/reduce.js +0 -16
- package/dist/array/reduce.js.map +0 -1
- package/dist/array/shift.cjs +0 -2
- package/dist/array/shift.cjs.map +0 -1
- package/dist/array/shift.js +0 -13
- package/dist/array/shift.js.map +0 -1
- package/dist/array/some.cjs +0 -2
- package/dist/array/some.cjs.map +0 -1
- package/dist/array/some.js +0 -14
- package/dist/array/some.js.map +0 -1
- package/dist/array/substitute.cjs +0 -2
- package/dist/array/substitute.cjs.map +0 -1
- package/dist/array/substitute.js +0 -13
- package/dist/array/substitute.js.map +0 -1
- package/dist/async/delay.cjs +0 -2
- package/dist/async/delay.cjs.map +0 -1
- package/dist/async/delay.js +0 -8
- package/dist/async/delay.js.map +0 -1
- package/dist/function/proxy.cjs +0 -2
- package/dist/function/proxy.cjs.map +0 -1
- package/dist/function/proxy.js +0 -22
- package/dist/function/proxy.js.map +0 -1
- package/dist/function/prune.cjs +0 -2
- package/dist/function/prune.cjs.map +0 -1
- package/dist/function/prune.js +0 -30
- package/dist/function/prune.js.map +0 -1
- package/dist/function/worker.cjs +0 -14
- package/dist/function/worker.cjs.map +0 -1
- package/dist/function/worker.js +0 -29
- package/dist/function/worker.js.map +0 -1
- package/dist/index.cjs.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/logit/dist/logit.cjs +0 -2
- package/dist/logit/dist/logit.cjs.map +0 -1
- package/dist/logit/dist/logit.js +0 -263
- package/dist/logit/dist/logit.js.map +0 -1
- package/dist/math/add.cjs +0 -2
- package/dist/math/add.cjs.map +0 -1
- package/dist/math/add.js +0 -9
- package/dist/math/add.js.map +0 -1
- package/dist/math/boil.cjs +0 -2
- package/dist/math/boil.cjs.map +0 -1
- package/dist/math/boil.js +0 -17
- package/dist/math/boil.js.map +0 -1
- package/dist/math/divide.cjs +0 -2
- package/dist/math/divide.cjs.map +0 -1
- package/dist/math/divide.js +0 -11
- package/dist/math/divide.js.map +0 -1
- package/dist/math/multiply.cjs +0 -2
- package/dist/math/multiply.cjs.map +0 -1
- package/dist/math/multiply.js +0 -9
- package/dist/math/multiply.js.map +0 -1
- package/dist/math/rate.cjs +0 -2
- package/dist/math/rate.cjs.map +0 -1
- package/dist/math/rate.js +0 -9
- package/dist/math/rate.js.map +0 -1
- package/dist/math/subtract.cjs +0 -2
- package/dist/math/subtract.cjs.map +0 -1
- package/dist/math/subtract.js +0 -9
- package/dist/math/subtract.js.map +0 -1
- package/dist/object/cache.cjs +0 -2
- package/dist/object/cache.cjs.map +0 -1
- package/dist/object/cache.js +0 -63
- package/dist/object/cache.js.map +0 -1
- package/dist/object/clone.cjs +0 -2
- package/dist/object/clone.cjs.map +0 -1
- package/dist/object/clone.js +0 -17
- package/dist/object/clone.js.map +0 -1
- package/dist/object/entries.cjs +0 -2
- package/dist/object/entries.cjs.map +0 -1
- package/dist/object/entries.js +0 -9
- package/dist/object/entries.js.map +0 -1
- package/dist/object/keys.cjs +0 -2
- package/dist/object/keys.cjs.map +0 -1
- package/dist/object/keys.js +0 -9
- package/dist/object/keys.js.map +0 -1
- package/dist/object/values.cjs +0 -2
- package/dist/object/values.cjs.map +0 -1
- package/dist/object/values.js +0 -9
- package/dist/object/values.js.map +0 -1
- package/dist/typed/ge.cjs +0 -2
- package/dist/typed/ge.cjs.map +0 -1
- package/dist/typed/ge.js +0 -7
- package/dist/typed/ge.js.map +0 -1
- package/dist/typed/gt.cjs +0 -2
- package/dist/typed/gt.cjs.map +0 -1
- package/dist/typed/gt.js +0 -7
- package/dist/typed/gt.js.map +0 -1
- package/dist/typed/le.cjs +0 -2
- package/dist/typed/le.cjs.map +0 -1
- package/dist/typed/le.js +0 -7
- package/dist/typed/le.js.map +0 -1
- package/dist/typed/lt.cjs +0 -2
- package/dist/typed/lt.cjs.map +0 -1
- package/dist/typed/lt.js +0 -7
- package/dist/typed/lt.js.map +0 -1
package/README.md
CHANGED
|
@@ -1,546 +1,419 @@
|
|
|
1
1
|
# @vielzeug/toolkit
|
|
2
2
|
|
|
3
|
-
|
|
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
|
-
[](https://www.npmjs.com/package/@vielzeug/toolkit)
|
|
10
|
-
[](https://opensource.org/licenses/MIT)
|
|
11
|
-
[](https://www.typescriptlang.org/)
|
|
12
|
-
[](https://bundlephobia.com/package/@vielzeug/toolkit)
|
|
5
|
+
[](https://www.npmjs.com/package/@vielzeug/toolkit) [](https://opensource.org/licenses/MIT)
|
|
13
6
|
|
|
14
|
-
|
|
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
|
-
|
|
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,
|
|
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
|
-
//
|
|
60
|
-
const
|
|
61
|
-
|
|
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
|
-
|
|
26
|
+
// Split array into chunks
|
|
27
|
+
const pages = chunk([1, 2, 3, 4, 5], 2); // [[1,2],[3,4],[5]]
|
|
67
28
|
|
|
68
|
-
|
|
29
|
+
// Debounce an event handler
|
|
30
|
+
const handleSearch = debounce((query: string) => fetchResults(query), 300);
|
|
69
31
|
|
|
70
|
-
|
|
71
|
-
|
|
32
|
+
// Retry a failing async function
|
|
33
|
+
const result = await retry(() => fetchData(), { times: 3, delay: 200 });
|
|
72
34
|
|
|
73
|
-
//
|
|
74
|
-
const
|
|
35
|
+
// Deep merge objects
|
|
36
|
+
const config = merge('deep', defaults, overrides);
|
|
75
37
|
|
|
76
|
-
//
|
|
77
|
-
const
|
|
38
|
+
// Generate a UUID
|
|
39
|
+
const id = uuid(); // e.g. "550e8400-e29b-41d4-a716-446655440000"
|
|
78
40
|
|
|
79
|
-
//
|
|
80
|
-
|
|
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
|
-
|
|
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
|
-
|
|
61
|
+
## Usage
|
|
95
62
|
|
|
96
|
-
|
|
63
|
+
### Array Utilities
|
|
97
64
|
|
|
98
65
|
```typescript
|
|
99
|
-
import {
|
|
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
|
-
|
|
121
|
-
|
|
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
|
-
|
|
74
|
+
// Index by key
|
|
75
|
+
const byId = keyBy(users, 'id'); // { '1': user1, '2': user2 }
|
|
126
76
|
|
|
127
|
-
|
|
77
|
+
// Fold (reduce without initial value)
|
|
78
|
+
fold([1, 2, 3], (a, b) => a + b); // 6
|
|
128
79
|
|
|
129
|
-
|
|
130
|
-
|
|
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
|
-
|
|
145
|
-
|
|
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
|
-
|
|
90
|
+
// Sort by selector (single-field)
|
|
91
|
+
sort([{ value: 3 }, { value: 1 }], (item) => item.value); // [{ value: 1 }, { value: 3 }]
|
|
150
92
|
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
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
|
-
//
|
|
173
|
-
|
|
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
|
-
|
|
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,
|
|
110
|
+
import { merge, diff, get, seek, prune, parseJSON } from '@vielzeug/toolkit';
|
|
235
111
|
|
|
236
112
|
// Deep merge
|
|
237
|
-
const
|
|
113
|
+
const cfg = merge('deep', { api: { host: 'localhost' } }, { api: { port: 3000 } });
|
|
114
|
+
// { api: { host: 'localhost', port: 3000 } }
|
|
238
115
|
|
|
239
|
-
//
|
|
240
|
-
|
|
116
|
+
// Nested path access
|
|
117
|
+
get(cfg, 'api.host'); // 'localhost'
|
|
241
118
|
|
|
242
|
-
//
|
|
243
|
-
|
|
119
|
+
// Recursively search object values by similarity
|
|
120
|
+
seek(cfg, 'localhost', 1); // true (exact match)
|
|
244
121
|
|
|
245
|
-
//
|
|
246
|
-
|
|
122
|
+
// Remove nulls/empty values
|
|
123
|
+
prune({ a: 1, b: null, c: '' }); // { a: 1 }
|
|
247
124
|
|
|
248
|
-
//
|
|
249
|
-
|
|
125
|
+
// Safe JSON parse
|
|
126
|
+
parseJSON('{"a":1}', {}); // { a: 1 }
|
|
127
|
+
parseJSON('bad json', {}); // {}
|
|
250
128
|
```
|
|
251
129
|
|
|
252
|
-
|
|
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 {
|
|
133
|
+
import { retry, sleep, parallel, pool, race, attempt, waitFor } from '@vielzeug/toolkit';
|
|
263
134
|
|
|
264
|
-
//
|
|
265
|
-
const
|
|
135
|
+
// Retry with backoff
|
|
136
|
+
const result = await retry(() => fetchData(), { times: 3, delay: 200, backoff: 2 });
|
|
266
137
|
|
|
267
|
-
//
|
|
268
|
-
|
|
138
|
+
// Delay
|
|
139
|
+
await sleep(500);
|
|
269
140
|
|
|
270
|
-
//
|
|
271
|
-
const
|
|
141
|
+
// Process items with concurrency limit
|
|
142
|
+
const results = await parallel(5, urls, async (url) => fetch(url).then((r) => r.json()));
|
|
272
143
|
|
|
273
|
-
//
|
|
274
|
-
const
|
|
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
|
-
|
|
155
|
+
// Poll until condition is true
|
|
156
|
+
await waitFor(() => document.querySelector('#app') !== null, { timeout: 5000 });
|
|
157
|
+
```
|
|
283
158
|
|
|
284
|
-
String
|
|
159
|
+
### String Utilities
|
|
285
160
|
|
|
286
161
|
```typescript
|
|
287
|
-
import { camelCase, kebabCase,
|
|
288
|
-
|
|
289
|
-
//
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
pascalCase('hello
|
|
293
|
-
|
|
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
|
-
|
|
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 {
|
|
175
|
+
import { memo, once, pipe, debounce, throttle, compare } from '@vielzeug/toolkit';
|
|
313
176
|
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
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
|
-
//
|
|
321
|
-
|
|
322
|
-
|
|
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
|
-
|
|
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 {
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
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
|
-
###
|
|
202
|
+
### Date Utilities
|
|
376
203
|
|
|
377
204
|
```typescript
|
|
378
|
-
import {
|
|
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
|
-
|
|
388
|
-
|
|
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
|
-
|
|
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
|
-
|
|
394
|
-
|
|
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
|
-
|
|
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
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
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
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
|
456
|
-
|
|
457
|
-
|
|
|
458
|
-
|
|
|
459
|
-
|
|
|
460
|
-
|
|
|
461
|
-
|
|
|
462
|
-
|
|
|
463
|
-
|
|
|
464
|
-
|
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
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 {
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
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
|
-
|
|
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
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
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.
|