ts-data-forge 14.6.0 → 14.6.2
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/dist/array/impl/array-utils-creation.mjs +126 -26
- package/dist/array/impl/array-utils-creation.mjs.map +1 -1
- package/dist/array/impl/array-utils-element-access.mjs +63 -30
- package/dist/array/impl/array-utils-element-access.mjs.map +1 -1
- package/dist/array/impl/array-utils-iterators.mjs +69 -53
- package/dist/array/impl/array-utils-iterators.mjs.map +1 -1
- package/dist/array/impl/array-utils-length-bounded-array-cast.mjs +109 -73
- package/dist/array/impl/array-utils-length-bounded-array-cast.mjs.map +1 -1
- package/dist/array/impl/array-utils-length-bounded-array-guard.mjs +71 -33
- package/dist/array/impl/array-utils-length-bounded-array-guard.mjs.map +1 -1
- package/dist/array/impl/array-utils-length-bounded-tuple-cast.mjs +102 -73
- package/dist/array/impl/array-utils-length-bounded-tuple-cast.mjs.map +1 -1
- package/dist/array/impl/array-utils-length-bounded-tuple-guard.mjs +77 -33
- package/dist/array/impl/array-utils-length-bounded-tuple-guard.mjs.map +1 -1
- package/dist/array/impl/array-utils-modification.mjs +75 -122
- package/dist/array/impl/array-utils-modification.mjs.map +1 -1
- package/dist/array/impl/array-utils-reducing-value.mjs +100 -150
- package/dist/array/impl/array-utils-reducing-value.mjs.map +1 -1
- package/dist/array/impl/array-utils-search.mjs +110 -134
- package/dist/array/impl/array-utils-search.mjs.map +1 -1
- package/dist/array/impl/array-utils-set-op.mjs +146 -38
- package/dist/array/impl/array-utils-set-op.mjs.map +1 -1
- package/dist/array/impl/array-utils-size.mjs +10 -8
- package/dist/array/impl/array-utils-size.mjs.map +1 -1
- package/dist/array/impl/array-utils-slice-clamped.mjs +13 -50
- package/dist/array/impl/array-utils-slice-clamped.mjs.map +1 -1
- package/dist/array/impl/array-utils-slicing.mjs +94 -78
- package/dist/array/impl/array-utils-slicing.mjs.map +1 -1
- package/dist/array/impl/array-utils-transformation.mjs +291 -199
- package/dist/array/impl/array-utils-transformation.mjs.map +1 -1
- package/dist/array/impl/array-utils-validation.mjs +54 -56
- package/dist/array/impl/array-utils-validation.mjs.map +1 -1
- package/dist/array/impl/index.mjs +17 -17
- package/dist/array/impl/index.mjs.map +1 -1
- package/dist/array/index.mjs +2 -3
- package/dist/array/index.mjs.map +1 -1
- package/dist/collections/imap-mapped.mjs +335 -291
- package/dist/collections/imap-mapped.mjs.map +1 -1
- package/dist/collections/imap.mjs +280 -239
- package/dist/collections/imap.mjs.map +1 -1
- package/dist/collections/index.mjs +7 -7
- package/dist/collections/index.mjs.map +1 -1
- package/dist/collections/iset-mapped.d.mts.map +1 -1
- package/dist/collections/iset-mapped.mjs +448 -263
- package/dist/collections/iset-mapped.mjs.map +1 -1
- package/dist/collections/iset.mjs +328 -201
- package/dist/collections/iset.mjs.map +1 -1
- package/dist/collections/queue.mjs +183 -151
- package/dist/collections/queue.mjs.map +1 -1
- package/dist/collections/stack.mjs +169 -140
- package/dist/collections/stack.mjs.map +1 -1
- package/dist/entry-point.mjs +4 -77
- package/dist/entry-point.mjs.map +1 -1
- package/dist/expect-type.mjs +70 -4
- package/dist/expect-type.mjs.map +1 -1
- package/dist/functional/async-result/async-result.mjs +2 -3
- package/dist/functional/async-result/async-result.mjs.map +1 -1
- package/dist/functional/async-result/impl/async-result-flat-map.mjs +19 -21
- package/dist/functional/async-result/impl/async-result-flat-map.mjs.map +1 -1
- package/dist/functional/async-result/impl/async-result-from-promise.mjs +9 -10
- package/dist/functional/async-result/impl/async-result-from-promise.mjs.map +1 -1
- package/dist/functional/async-result/impl/async-result-from-throwable.mjs +12 -14
- package/dist/functional/async-result/impl/async-result-from-throwable.mjs.map +1 -1
- package/dist/functional/async-result/impl/async-result-map-err.mjs +16 -19
- package/dist/functional/async-result/impl/async-result-map-err.mjs.map +1 -1
- package/dist/functional/async-result/impl/async-result-map.mjs +16 -19
- package/dist/functional/async-result/impl/async-result-map.mjs.map +1 -1
- package/dist/functional/async-result/impl/async-result-unwrap-or.mjs +36 -9
- package/dist/functional/async-result/impl/async-result-unwrap-or.mjs.map +1 -1
- package/dist/functional/async-result/impl/index.mjs +8 -7
- package/dist/functional/async-result/impl/index.mjs.map +1 -1
- package/dist/functional/async-result/impl/types.mjs +2 -2
- package/dist/functional/async-result/impl/types.mjs.map +1 -1
- package/dist/functional/async-result/index.mjs +2 -3
- package/dist/functional/async-result/index.mjs.map +1 -1
- package/dist/functional/index.mjs +7 -11
- package/dist/functional/index.mjs.map +1 -1
- package/dist/functional/match.mjs +27 -13
- package/dist/functional/match.mjs.map +1 -1
- package/dist/functional/optional/impl/index.mjs +19 -18
- package/dist/functional/optional/impl/index.mjs.map +1 -1
- package/dist/functional/optional/impl/optional-expect-to-be.mjs +16 -18
- package/dist/functional/optional/impl/optional-expect-to-be.mjs.map +1 -1
- package/dist/functional/optional/impl/optional-filter.mjs +17 -19
- package/dist/functional/optional/impl/optional-filter.mjs.map +1 -1
- package/dist/functional/optional/impl/optional-flat-map.mjs +13 -15
- package/dist/functional/optional/impl/optional-flat-map.mjs.map +1 -1
- package/dist/functional/optional/impl/optional-from-nullable.mjs +26 -5
- package/dist/functional/optional/impl/optional-from-nullable.mjs.map +1 -1
- package/dist/functional/optional/impl/optional-is-none.mjs +21 -5
- package/dist/functional/optional/impl/optional-is-none.mjs.map +1 -1
- package/dist/functional/optional/impl/optional-is-optional.mjs +26 -8
- package/dist/functional/optional/impl/optional-is-optional.mjs.map +1 -1
- package/dist/functional/optional/impl/optional-is-some.mjs +22 -5
- package/dist/functional/optional/impl/optional-is-some.mjs.map +1 -1
- package/dist/functional/optional/impl/optional-map.mjs +16 -18
- package/dist/functional/optional/impl/optional-map.mjs.map +1 -1
- package/dist/functional/optional/impl/optional-match.mjs +16 -18
- package/dist/functional/optional/impl/optional-match.mjs.map +1 -1
- package/dist/functional/optional/impl/optional-none.mjs +18 -5
- package/dist/functional/optional/impl/optional-none.mjs.map +1 -1
- package/dist/functional/optional/impl/optional-or-else.mjs +13 -15
- package/dist/functional/optional/impl/optional-or-else.mjs.map +1 -1
- package/dist/functional/optional/impl/optional-some.mjs +23 -7
- package/dist/functional/optional/impl/optional-some.mjs.map +1 -1
- package/dist/functional/optional/impl/optional-to-nullable.mjs +28 -5
- package/dist/functional/optional/impl/optional-to-nullable.mjs.map +1 -1
- package/dist/functional/optional/impl/optional-unwrap-or.mjs +12 -14
- package/dist/functional/optional/impl/optional-unwrap-or.mjs.map +1 -1
- package/dist/functional/optional/impl/optional-unwrap-throw.mjs +34 -9
- package/dist/functional/optional/impl/optional-unwrap-throw.mjs.map +1 -1
- package/dist/functional/optional/impl/optional-unwrap.mjs +6 -9
- package/dist/functional/optional/impl/optional-unwrap.mjs.map +1 -1
- package/dist/functional/optional/impl/optional-zip.mjs +36 -5
- package/dist/functional/optional/impl/optional-zip.mjs.map +1 -1
- package/dist/functional/optional/impl/tag.mjs +4 -5
- package/dist/functional/optional/impl/tag.mjs.map +1 -1
- package/dist/functional/optional/impl/types.mjs +2 -2
- package/dist/functional/optional/impl/types.mjs.map +1 -1
- package/dist/functional/optional/index.mjs +2 -3
- package/dist/functional/optional/index.mjs.map +1 -1
- package/dist/functional/optional/optional.mjs +2 -3
- package/dist/functional/optional/optional.mjs.map +1 -1
- package/dist/functional/pipe.mjs +42 -14
- package/dist/functional/pipe.mjs.map +1 -1
- package/dist/functional/result/impl/index.mjs +28 -27
- package/dist/functional/result/impl/index.mjs.map +1 -1
- package/dist/functional/result/impl/result-err.mjs +29 -7
- package/dist/functional/result/impl/result-err.mjs.map +1 -1
- package/dist/functional/result/impl/result-expect-to-be.mjs +17 -18
- package/dist/functional/result/impl/result-expect-to-be.mjs.map +1 -1
- package/dist/functional/result/impl/result-flat-map.mjs +18 -21
- package/dist/functional/result/impl/result-flat-map.mjs.map +1 -1
- package/dist/functional/result/impl/result-fold.mjs +18 -21
- package/dist/functional/result/impl/result-fold.mjs.map +1 -1
- package/dist/functional/result/impl/result-from-optional.mjs +17 -20
- package/dist/functional/result/impl/result-from-optional.mjs.map +1 -1
- package/dist/functional/result/impl/result-from-promise.mjs +37 -8
- package/dist/functional/result/impl/result-from-promise.mjs.map +1 -1
- package/dist/functional/result/impl/result-from-throwable.mjs +41 -14
- package/dist/functional/result/impl/result-from-throwable.mjs.map +1 -1
- package/dist/functional/result/impl/result-is-err.mjs +21 -5
- package/dist/functional/result/impl/result-is-err.mjs.map +1 -1
- package/dist/functional/result/impl/result-is-ok.mjs +21 -5
- package/dist/functional/result/impl/result-is-ok.mjs.map +1 -1
- package/dist/functional/result/impl/result-is-result.mjs +25 -7
- package/dist/functional/result/impl/result-is-result.mjs.map +1 -1
- package/dist/functional/result/impl/result-map-err.mjs +18 -21
- package/dist/functional/result/impl/result-map-err.mjs.map +1 -1
- package/dist/functional/result/impl/result-map.mjs +18 -21
- package/dist/functional/result/impl/result-map.mjs.map +1 -1
- package/dist/functional/result/impl/result-match.mjs +17 -21
- package/dist/functional/result/impl/result-match.mjs.map +1 -1
- package/dist/functional/result/impl/result-ok.mjs +29 -7
- package/dist/functional/result/impl/result-ok.mjs.map +1 -1
- package/dist/functional/result/impl/result-or-else.mjs +14 -15
- package/dist/functional/result/impl/result-or-else.mjs.map +1 -1
- package/dist/functional/result/impl/result-safe-try.mjs +32 -21
- package/dist/functional/result/impl/result-safe-try.mjs.map +1 -1
- package/dist/functional/result/impl/result-safe-unwrap.mjs +40 -12
- package/dist/functional/result/impl/result-safe-unwrap.mjs.map +1 -1
- package/dist/functional/result/impl/result-swap.mjs +23 -8
- package/dist/functional/result/impl/result-swap.mjs.map +1 -1
- package/dist/functional/result/impl/result-to-optional.mjs +30 -7
- package/dist/functional/result/impl/result-to-optional.mjs.map +1 -1
- package/dist/functional/result/impl/result-unwrap-err-or.mjs +13 -14
- package/dist/functional/result/impl/result-unwrap-err-or.mjs.map +1 -1
- package/dist/functional/result/impl/result-unwrap-err-throw.mjs +43 -20
- package/dist/functional/result/impl/result-unwrap-err-throw.mjs.map +1 -1
- package/dist/functional/result/impl/result-unwrap-err.mjs +33 -8
- package/dist/functional/result/impl/result-unwrap-err.mjs.map +1 -1
- package/dist/functional/result/impl/result-unwrap-ok-or.mjs +13 -14
- package/dist/functional/result/impl/result-unwrap-ok-or.mjs.map +1 -1
- package/dist/functional/result/impl/result-unwrap-ok.mjs +6 -9
- package/dist/functional/result/impl/result-unwrap-ok.mjs.map +1 -1
- package/dist/functional/result/impl/result-unwrap-throw.mjs +38 -11
- package/dist/functional/result/impl/result-unwrap-throw.mjs.map +1 -1
- package/dist/functional/result/impl/result-zip.mjs +35 -5
- package/dist/functional/result/impl/result-zip.mjs.map +1 -1
- package/dist/functional/result/impl/tag.mjs +4 -5
- package/dist/functional/result/impl/tag.mjs.map +1 -1
- package/dist/functional/result/impl/types.mjs +2 -2
- package/dist/functional/result/impl/types.mjs.map +1 -1
- package/dist/functional/result/index.mjs +2 -3
- package/dist/functional/result/index.mjs.map +1 -1
- package/dist/functional/result/result.mjs +2 -3
- package/dist/functional/result/result.mjs.map +1 -1
- package/dist/functional/ternary-result/impl/index.mjs +29 -28
- package/dist/functional/ternary-result/impl/index.mjs.map +1 -1
- package/dist/functional/ternary-result/impl/tag.mjs +6 -6
- package/dist/functional/ternary-result/impl/tag.mjs.map +1 -1
- package/dist/functional/ternary-result/impl/ternary-result-err.mjs +17 -7
- package/dist/functional/ternary-result/impl/ternary-result-err.mjs.map +1 -1
- package/dist/functional/ternary-result/impl/ternary-result-expect-to-be.mjs +15 -18
- package/dist/functional/ternary-result/impl/ternary-result-expect-to-be.mjs.map +1 -1
- package/dist/functional/ternary-result/impl/ternary-result-flat-map.mjs +28 -32
- package/dist/functional/ternary-result/impl/ternary-result-flat-map.mjs.map +1 -1
- package/dist/functional/ternary-result/impl/ternary-result-fold.mjs +24 -26
- package/dist/functional/ternary-result/impl/ternary-result-fold.mjs.map +1 -1
- package/dist/functional/ternary-result/impl/ternary-result-from-promise.mjs +21 -8
- package/dist/functional/ternary-result/impl/ternary-result-from-promise.mjs.map +1 -1
- package/dist/functional/ternary-result/impl/ternary-result-from-throwable.mjs +28 -13
- package/dist/functional/ternary-result/impl/ternary-result-from-throwable.mjs.map +1 -1
- package/dist/functional/ternary-result/impl/ternary-result-is-err.mjs +19 -5
- package/dist/functional/ternary-result/impl/ternary-result-is-err.mjs.map +1 -1
- package/dist/functional/ternary-result/impl/ternary-result-is-ok.mjs +21 -5
- package/dist/functional/ternary-result/impl/ternary-result-is-ok.mjs.map +1 -1
- package/dist/functional/ternary-result/impl/ternary-result-is-ternary-result.mjs +28 -8
- package/dist/functional/ternary-result/impl/ternary-result-is-ternary-result.mjs.map +1 -1
- package/dist/functional/ternary-result/impl/ternary-result-is-warn.mjs +20 -5
- package/dist/functional/ternary-result/impl/ternary-result-is-warn.mjs.map +1 -1
- package/dist/functional/ternary-result/impl/ternary-result-map-err.mjs +17 -18
- package/dist/functional/ternary-result/impl/ternary-result-map-err.mjs.map +1 -1
- package/dist/functional/ternary-result/impl/ternary-result-map-warn.mjs +20 -23
- package/dist/functional/ternary-result/impl/ternary-result-map-warn.mjs.map +1 -1
- package/dist/functional/ternary-result/impl/ternary-result-map.mjs +24 -26
- package/dist/functional/ternary-result/impl/ternary-result-map.mjs.map +1 -1
- package/dist/functional/ternary-result/impl/ternary-result-ok.mjs +18 -7
- package/dist/functional/ternary-result/impl/ternary-result-ok.mjs.map +1 -1
- package/dist/functional/ternary-result/impl/ternary-result-or-else.mjs +11 -14
- package/dist/functional/ternary-result/impl/ternary-result-or-else.mjs.map +1 -1
- package/dist/functional/ternary-result/impl/ternary-result-to-optional.mjs +24 -10
- package/dist/functional/ternary-result/impl/ternary-result-to-optional.mjs.map +1 -1
- package/dist/functional/ternary-result/impl/ternary-result-unwrap-err-or.mjs +11 -14
- package/dist/functional/ternary-result/impl/ternary-result-unwrap-err-or.mjs.map +1 -1
- package/dist/functional/ternary-result/impl/ternary-result-unwrap-err-throw.mjs +30 -19
- package/dist/functional/ternary-result/impl/ternary-result-unwrap-err-throw.mjs.map +1 -1
- package/dist/functional/ternary-result/impl/ternary-result-unwrap-err.mjs +20 -8
- package/dist/functional/ternary-result/impl/ternary-result-unwrap-err.mjs.map +1 -1
- package/dist/functional/ternary-result/impl/ternary-result-unwrap-ok-or.mjs +11 -14
- package/dist/functional/ternary-result/impl/ternary-result-unwrap-ok-or.mjs.map +1 -1
- package/dist/functional/ternary-result/impl/ternary-result-unwrap-ok.mjs +7 -9
- package/dist/functional/ternary-result/impl/ternary-result-unwrap-ok.mjs.map +1 -1
- package/dist/functional/ternary-result/impl/ternary-result-unwrap-throw.mjs +30 -22
- package/dist/functional/ternary-result/impl/ternary-result-unwrap-throw.mjs.map +1 -1
- package/dist/functional/ternary-result/impl/ternary-result-unwrap-warn-or.mjs +11 -14
- package/dist/functional/ternary-result/impl/ternary-result-unwrap-warn-or.mjs.map +1 -1
- package/dist/functional/ternary-result/impl/ternary-result-unwrap-warn-throw.mjs +27 -17
- package/dist/functional/ternary-result/impl/ternary-result-unwrap-warn-throw.mjs.map +1 -1
- package/dist/functional/ternary-result/impl/ternary-result-unwrap-warn.mjs +20 -8
- package/dist/functional/ternary-result/impl/ternary-result-unwrap-warn.mjs.map +1 -1
- package/dist/functional/ternary-result/impl/ternary-result-warn.mjs +21 -8
- package/dist/functional/ternary-result/impl/ternary-result-warn.mjs.map +1 -1
- package/dist/functional/ternary-result/impl/ternary-result-zip.mjs +47 -19
- package/dist/functional/ternary-result/impl/ternary-result-zip.mjs.map +1 -1
- package/dist/functional/ternary-result/impl/types.mjs +2 -2
- package/dist/functional/ternary-result/impl/types.mjs.map +1 -1
- package/dist/functional/ternary-result/impl/variant-name.mjs +12 -14
- package/dist/functional/ternary-result/impl/variant-name.mjs.map +1 -1
- package/dist/functional/ternary-result/index.mjs +2 -3
- package/dist/functional/ternary-result/index.mjs.map +1 -1
- package/dist/functional/ternary-result/ternary-result.mjs +2 -3
- package/dist/functional/ternary-result/ternary-result.mjs.map +1 -1
- package/dist/guard/has-key.mjs +43 -4
- package/dist/guard/has-key.mjs.map +1 -1
- package/dist/guard/index.mjs +8 -8
- package/dist/guard/index.mjs.map +1 -1
- package/dist/guard/is-non-empty-string.mjs +39 -4
- package/dist/guard/is-non-empty-string.mjs.map +1 -1
- package/dist/guard/is-non-null-object.mjs +36 -4
- package/dist/guard/is-non-null-object.mjs.map +1 -1
- package/dist/guard/is-primitive.mjs +46 -15
- package/dist/guard/is-primitive.mjs.map +1 -1
- package/dist/guard/is-record.mjs +89 -6
- package/dist/guard/is-record.mjs.map +1 -1
- package/dist/guard/is-type.mjs +404 -19
- package/dist/guard/is-type.mjs.map +1 -1
- package/dist/guard/key-is-in.mjs +42 -4
- package/dist/guard/key-is-in.mjs.map +1 -1
- package/dist/index.mjs +12 -65
- package/dist/index.mjs.map +1 -1
- package/dist/iterator/index.mjs +2 -2
- package/dist/iterator/index.mjs.map +1 -1
- package/dist/iterator/range.mjs +19 -57
- package/dist/iterator/range.mjs.map +1 -1
- package/dist/json/index.mjs +2 -2
- package/dist/json/index.mjs.map +1 -1
- package/dist/json/json.mjs +346 -105
- package/dist/json/json.mjs.map +1 -1
- package/dist/number/branded-types/finite-number.mjs +148 -137
- package/dist/number/branded-types/finite-number.mjs.map +1 -1
- package/dist/number/branded-types/index.mjs +33 -33
- package/dist/number/branded-types/index.mjs.map +1 -1
- package/dist/number/branded-types/int.mjs +245 -209
- package/dist/number/branded-types/int.mjs.map +1 -1
- package/dist/number/branded-types/int16.mjs +141 -131
- package/dist/number/branded-types/int16.mjs.map +1 -1
- package/dist/number/branded-types/int32.mjs +141 -131
- package/dist/number/branded-types/int32.mjs.map +1 -1
- package/dist/number/branded-types/negative-finite-number.mjs +155 -149
- package/dist/number/branded-types/negative-finite-number.mjs.map +1 -1
- package/dist/number/branded-types/negative-int.mjs +125 -110
- package/dist/number/branded-types/negative-int.mjs.map +1 -1
- package/dist/number/branded-types/negative-safe-int.mjs +126 -115
- package/dist/number/branded-types/negative-safe-int.mjs.map +1 -1
- package/dist/number/branded-types/non-negative-finite-number.mjs +164 -154
- package/dist/number/branded-types/non-negative-finite-number.mjs.map +1 -1
- package/dist/number/branded-types/non-negative-int16.mjs +137 -125
- package/dist/number/branded-types/non-negative-int16.mjs.map +1 -1
- package/dist/number/branded-types/non-negative-int32.mjs +137 -125
- package/dist/number/branded-types/non-negative-int32.mjs.map +1 -1
- package/dist/number/branded-types/non-positive-finite-number.mjs +143 -139
- package/dist/number/branded-types/non-positive-finite-number.mjs.map +1 -1
- package/dist/number/branded-types/non-positive-int.mjs +116 -99
- package/dist/number/branded-types/non-positive-int.mjs.map +1 -1
- package/dist/number/branded-types/non-positive-safe-int.mjs +118 -107
- package/dist/number/branded-types/non-positive-safe-int.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-finite-number.mjs +144 -129
- package/dist/number/branded-types/non-zero-finite-number.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-int.mjs +102 -82
- package/dist/number/branded-types/non-zero-int.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-int16.mjs +118 -105
- package/dist/number/branded-types/non-zero-int16.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-int32.mjs +118 -105
- package/dist/number/branded-types/non-zero-int32.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-safe-int.mjs +122 -108
- package/dist/number/branded-types/non-zero-safe-int.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-uint16.mjs +118 -104
- package/dist/number/branded-types/non-zero-uint16.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-uint32.mjs +118 -104
- package/dist/number/branded-types/non-zero-uint32.mjs.map +1 -1
- package/dist/number/branded-types/positive-finite-number.mjs +167 -160
- package/dist/number/branded-types/positive-finite-number.mjs.map +1 -1
- package/dist/number/branded-types/positive-int.mjs +260 -224
- package/dist/number/branded-types/positive-int.mjs.map +1 -1
- package/dist/number/branded-types/positive-int16.mjs +134 -122
- package/dist/number/branded-types/positive-int16.mjs.map +1 -1
- package/dist/number/branded-types/positive-int32.mjs +134 -122
- package/dist/number/branded-types/positive-int32.mjs.map +1 -1
- package/dist/number/branded-types/positive-safe-int.mjs +292 -258
- package/dist/number/branded-types/positive-safe-int.mjs.map +1 -1
- package/dist/number/branded-types/positive-uint16.mjs +134 -122
- package/dist/number/branded-types/positive-uint16.mjs.map +1 -1
- package/dist/number/branded-types/positive-uint32.mjs +134 -122
- package/dist/number/branded-types/positive-uint32.mjs.map +1 -1
- package/dist/number/branded-types/safe-int.mjs +284 -255
- package/dist/number/branded-types/safe-int.mjs.map +1 -1
- package/dist/number/branded-types/safe-uint.mjs +135 -124
- package/dist/number/branded-types/safe-uint.mjs.map +1 -1
- package/dist/number/branded-types/uint.mjs +248 -211
- package/dist/number/branded-types/uint.mjs.map +1 -1
- package/dist/number/branded-types/uint16.mjs +132 -121
- package/dist/number/branded-types/uint16.mjs.map +1 -1
- package/dist/number/branded-types/uint32.mjs +132 -121
- package/dist/number/branded-types/uint32.mjs.map +1 -1
- package/dist/number/enum/index.mjs +3 -3
- package/dist/number/enum/index.mjs.map +1 -1
- package/dist/number/enum/int8.mjs +146 -131
- package/dist/number/enum/int8.mjs.map +1 -1
- package/dist/number/enum/uint8.mjs +133 -119
- package/dist/number/enum/uint8.mjs.map +1 -1
- package/dist/number/index.mjs +6 -37
- package/dist/number/index.mjs.map +1 -1
- package/dist/number/num-arithmetic-types.mjs +42 -1
- package/dist/number/num-arithmetic-types.mjs.map +1 -1
- package/dist/number/num.mjs +541 -83
- package/dist/number/num.mjs.map +1 -1
- package/dist/number/refined-number-utils.mjs +294 -133
- package/dist/number/refined-number-utils.mjs.map +1 -1
- package/dist/object/index.mjs +2 -2
- package/dist/object/index.mjs.map +1 -1
- package/dist/object/object.mjs +355 -202
- package/dist/object/object.mjs.map +1 -1
- package/dist/others/cast-mutable.mjs +38 -11
- package/dist/others/cast-mutable.mjs.map +1 -1
- package/dist/others/cast-readonly.mjs +37 -11
- package/dist/others/cast-readonly.mjs.map +1 -1
- package/dist/others/debounce-function.mjs +22 -11
- package/dist/others/debounce-function.mjs.map +1 -1
- package/dist/others/fast-deep-equal.mjs +70 -51
- package/dist/others/fast-deep-equal.mjs.map +1 -1
- package/dist/others/if-then.mjs +32 -5
- package/dist/others/if-then.mjs.map +1 -1
- package/dist/others/index.mjs +10 -10
- package/dist/others/index.mjs.map +1 -1
- package/dist/others/map-nullable.mjs +11 -13
- package/dist/others/map-nullable.mjs.map +1 -1
- package/dist/others/memoize-function.mjs +14 -16
- package/dist/others/memoize-function.mjs.map +1 -1
- package/dist/others/tuple.mjs +52 -4
- package/dist/others/tuple.mjs.map +1 -1
- package/dist/others/unknown-to-string.mjs +91 -47
- package/dist/others/unknown-to-string.mjs.map +1 -1
- package/dist/promise/index.mjs +2 -2
- package/dist/promise/index.mjs.map +1 -1
- package/dist/promise/promise.mjs +51 -10
- package/dist/promise/promise.mjs.map +1 -1
- package/dist/string/index.mjs +2 -2
- package/dist/string/index.mjs.map +1 -1
- package/dist/string/str.mjs +250 -83
- package/dist/string/str.mjs.map +1 -1
- package/dist/types.mjs +3 -2
- package/dist/types.mjs.map +1 -1
- package/package.json +5 -6
- package/src/array/impl/array-utils-length-constraint-preservation.test.mts +2 -2
- package/src/collections/imap-mapped.mts +4 -4
- package/src/collections/imap.mts +1 -1
- package/src/collections/imap.test.mts +1 -1
- package/src/collections/iset-mapped.mts +2 -1
- package/src/collections/iset.mts +1 -1
- package/src/functional/async-result.test.mts +3 -2
- package/src/functional/optional.test.mts +2 -1
- package/src/functional/result.test.mts +0 -2
- package/src/guard/is-non-empty-string.test.mts +2 -2
- package/src/guard/is-non-null-object.test.mts +3 -3
- package/src/guard/is-primitive.test.mts +3 -3
- package/src/guard/is-type.test.mts +3 -3
- package/src/json/json.test.mts +1 -1
- package/src/number/enum/int8.mts +1 -1
package/dist/object/object.mjs
CHANGED
|
@@ -1,214 +1,367 @@
|
|
|
1
|
-
import '../
|
|
2
|
-
import '../
|
|
3
|
-
import '../
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
const
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
1
|
+
import { Arr } from '../array/index.mjs';
|
|
2
|
+
import { Optional } from '../functional/index.mjs';
|
|
3
|
+
import { hasKey, isRecord } from '../guard/index.mjs';
|
|
4
|
+
/**
|
|
5
|
+
* A collection of type-safe object utility functions providing functional
|
|
6
|
+
* programming patterns for object manipulation, including pick, omit, shallow
|
|
7
|
+
* equality checks, and more.
|
|
8
|
+
*
|
|
9
|
+
* All functions maintain TypeScript type safety and support both direct and
|
|
10
|
+
* curried usage patterns for better composition with pipe operations.
|
|
11
|
+
*/
|
|
12
|
+
export var Obj;
|
|
13
|
+
(function (Obj) {
|
|
14
|
+
/**
|
|
15
|
+
* Performs a shallow equality check on two records using a configurable
|
|
16
|
+
* equality function. Verifies that both records have the same number of
|
|
17
|
+
* entries and that for every key in the first record, the corresponding value
|
|
18
|
+
* passes the equality test with the value in the second record.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
*
|
|
22
|
+
* ```ts
|
|
23
|
+
* const obj1 = { name: 'Alice', age: 30 } as const;
|
|
24
|
+
*
|
|
25
|
+
* const obj2 = { name: 'Alice', age: 30 } as const;
|
|
26
|
+
*
|
|
27
|
+
* const obj3 = { name: 'Alice', age: 31 } as const;
|
|
28
|
+
*
|
|
29
|
+
* assert.isTrue(Obj.shallowEq(obj1, obj2));
|
|
30
|
+
*
|
|
31
|
+
* assert.isFalse(Obj.shallowEq(obj1, obj3));
|
|
32
|
+
*
|
|
33
|
+
* // Custom equality function
|
|
34
|
+
* const obj4 = { value: 1 } as const;
|
|
35
|
+
*
|
|
36
|
+
* const obj5 = { value: 1.00001 } as const;
|
|
37
|
+
*
|
|
38
|
+
* const closeEnough = (a: unknown, b: unknown): boolean => {
|
|
39
|
+
* if (typeof a === 'number' && typeof b === 'number') {
|
|
40
|
+
* return Math.abs(a - b) < 0.001;
|
|
41
|
+
* }
|
|
42
|
+
*
|
|
43
|
+
* return Object.is(a, b);
|
|
44
|
+
* };
|
|
45
|
+
*
|
|
46
|
+
* assert.isTrue(Obj.shallowEq(obj4, obj5, closeEnough));
|
|
47
|
+
* ```
|
|
48
|
+
*
|
|
49
|
+
* @param a - The first record to compare
|
|
50
|
+
* @param b - The second record to compare
|
|
51
|
+
* @param eq - Optional equality function (defaults to Object.is for strict
|
|
52
|
+
* equality)
|
|
53
|
+
* @returns `true` if the records are shallowly equal according to the
|
|
54
|
+
* equality function, `false` otherwise
|
|
55
|
+
*/
|
|
56
|
+
Obj.shallowEq = (a, b, eq = Object.is) => {
|
|
57
|
+
const aEntries = Object.entries(a);
|
|
58
|
+
const bEntries = Object.entries(b);
|
|
59
|
+
if (aEntries.length !== bEntries.length)
|
|
60
|
+
return false;
|
|
61
|
+
return aEntries.every(([k, v]) => eq(b[k], v));
|
|
62
|
+
};
|
|
63
|
+
function pick(...args) {
|
|
64
|
+
switch (args.length) {
|
|
65
|
+
case 2: {
|
|
66
|
+
const [record, keys] = args;
|
|
67
|
+
const keysSet = new Set(keys);
|
|
68
|
+
return (
|
|
69
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
70
|
+
Object.fromEntries(Object.entries(record).filter(([k, _v]) => keysSet.has(k))));
|
|
71
|
+
}
|
|
72
|
+
case 1: {
|
|
73
|
+
const [keys] = args;
|
|
74
|
+
return (record) => pick(record, keys);
|
|
75
|
+
}
|
|
76
|
+
}
|
|
71
77
|
}
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
);
|
|
94
|
-
return result;
|
|
95
|
-
};
|
|
96
|
-
}
|
|
78
|
+
Obj.pick = pick;
|
|
79
|
+
function omit(...args) {
|
|
80
|
+
switch (args.length) {
|
|
81
|
+
case 2: {
|
|
82
|
+
const [record, keys] = args;
|
|
83
|
+
const keysSet = new Set(keys);
|
|
84
|
+
return (
|
|
85
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
86
|
+
Object.fromEntries(Object.entries(record).filter(([k, _v]) => !keysSet.has(k))));
|
|
87
|
+
}
|
|
88
|
+
case 1: {
|
|
89
|
+
const [keys] = args;
|
|
90
|
+
return (record) => {
|
|
91
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
92
|
+
const result = omit(record,
|
|
93
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
94
|
+
keys);
|
|
95
|
+
return result;
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
}
|
|
97
99
|
}
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
100
|
+
Obj.omit = omit;
|
|
101
|
+
/**
|
|
102
|
+
* Creates an object from an array of key-value pairs with precise TypeScript
|
|
103
|
+
* typing. This is a type-safe wrapper around `Object.fromEntries` that
|
|
104
|
+
* provides better type inference and compile-time guarantees about the
|
|
105
|
+
* resulting object structure.
|
|
106
|
+
*
|
|
107
|
+
* **Type Behavior**:
|
|
108
|
+
*
|
|
109
|
+
* - When entries is a fixed-length tuple, the exact object type is inferred
|
|
110
|
+
* - When entries has dynamic length with union key types, `Partial` is applied
|
|
111
|
+
* to prevent incorrect assumptions about which keys will be present
|
|
112
|
+
*
|
|
113
|
+
* @example
|
|
114
|
+
*
|
|
115
|
+
* ```ts
|
|
116
|
+
* // Fixed-length tuple - exact type inferred
|
|
117
|
+
* const entries1 = [
|
|
118
|
+
* ['name', 'David'],
|
|
119
|
+
* ['age', 25],
|
|
120
|
+
* ['active', true],
|
|
121
|
+
* ] as const;
|
|
122
|
+
*
|
|
123
|
+
* const obj1 = Obj.fromEntries(entries1);
|
|
124
|
+
*
|
|
125
|
+
* assert.deepStrictEqual(obj1, {
|
|
126
|
+
* name: 'David',
|
|
127
|
+
* age: 25,
|
|
128
|
+
* active: true,
|
|
129
|
+
* });
|
|
130
|
+
*
|
|
131
|
+
* // Dynamic length array - Partial type applied
|
|
132
|
+
* const dynamicEntries: readonly (readonly ['x' | 'y', number])[] = [
|
|
133
|
+
* ['x', 10],
|
|
134
|
+
* ['y', 20],
|
|
135
|
+
* ] as const;
|
|
136
|
+
*
|
|
137
|
+
* const obj2 = Obj.fromEntries(dynamicEntries);
|
|
138
|
+
*
|
|
139
|
+
* assert.deepStrictEqual(obj2, { x: 10, y: 20 });
|
|
140
|
+
* ```
|
|
141
|
+
*
|
|
142
|
+
* @template Entries - The readonly array type of key-value entry tuples
|
|
143
|
+
* @param entries - An array of readonly key-value entry tuples `[key, value]`
|
|
144
|
+
* @returns An object created from the entries with precise typing
|
|
145
|
+
*/
|
|
146
|
+
Obj.fromEntries = (entries) =>
|
|
101
147
|
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
102
|
-
Object.fromEntries(entries)
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
148
|
+
Object.fromEntries(entries);
|
|
149
|
+
/**
|
|
150
|
+
* Transforms every value of a record, leaving the key set untouched.
|
|
151
|
+
*
|
|
152
|
+
* **Type Behavior**: the result is a mapped type over `keyof R`, so the keys
|
|
153
|
+
* — and their optional modifiers — survive verbatim:
|
|
154
|
+
* `{ a: number; b?: number }` maps to `{ a: V2; b?: V2 }`, and a record with
|
|
155
|
+
* an index signature stays total rather than becoming `Partial`.
|
|
156
|
+
*
|
|
157
|
+
* This is what `Object.fromEntries(Object.entries(record).map(...))` cannot
|
|
158
|
+
* express: an entries array carries no evidence that it still covers every
|
|
159
|
+
* key of the record it came from, so its element type is all the return type
|
|
160
|
+
* can be built from. Going through a mapped type instead states the
|
|
161
|
+
* invariant that a value-only transform preserves the key set.
|
|
162
|
+
*
|
|
163
|
+
* **Key handling**: keys reach the callback the way `Object.entries` yields
|
|
164
|
+
* them, so a numeric key `1` arrives as `'1'`. Symbol-keyed properties are
|
|
165
|
+
* not enumerated by `Object.entries`; they are dropped from both the result
|
|
166
|
+
* and its type.
|
|
167
|
+
*
|
|
168
|
+
* @example
|
|
169
|
+
*
|
|
170
|
+
* <!-- doc:embed:jsdoc:example:./samples/src/object/map-example.mts -->
|
|
171
|
+
*
|
|
172
|
+
* ```ts
|
|
173
|
+
* const scores = { alice: 1, bob: 2 } as const;
|
|
174
|
+
*
|
|
175
|
+
* const doubled = Obj.map(scores, (value) => value * 2);
|
|
176
|
+
*
|
|
177
|
+
* assert.deepStrictEqual(doubled, { alice: 2, bob: 4 });
|
|
178
|
+
*
|
|
179
|
+
* // The key is available as the second argument.
|
|
180
|
+
* const labelled = Obj.map(scores, (value, key) => `${key}=${value}`);
|
|
181
|
+
*
|
|
182
|
+
* assert.deepStrictEqual(labelled, { alice: 'alice=1', bob: 'bob=2' });
|
|
183
|
+
* ```
|
|
184
|
+
*
|
|
185
|
+
* <!-- /doc:embed:jsdoc:example:./samples/src/object/map-example.mts -->
|
|
186
|
+
*
|
|
187
|
+
* @template R - The type of the source record
|
|
188
|
+
* @template V2 - The type the callback returns for every key
|
|
189
|
+
* @param record - The record whose values are transformed
|
|
190
|
+
* @param mapFn - Called once per own enumerable string key, with the value
|
|
191
|
+
* and the key
|
|
192
|
+
* @returns A new record with the same keys as `record` and the mapped values
|
|
193
|
+
*/
|
|
194
|
+
Obj.map = (record, mapFn) => {
|
|
195
|
+
// `Object.entries` erases both the key and the value type of `R`, so the
|
|
196
|
+
// callback is widened once here instead of asserting on every entry.
|
|
197
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
198
|
+
const mapFnWidened = mapFn;
|
|
199
|
+
return (
|
|
200
|
+
// `Object.entries` enumerates exactly the own enumerable string keys of
|
|
201
|
+
// `record`, and nothing here adds or removes an entry, so the result has
|
|
202
|
+
// the key set `MappedRecord` claims.
|
|
203
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
204
|
+
Object.fromEntries(Object.entries(record).map(([k, v]) => [k, mapFnWidened(v, k)])));
|
|
205
|
+
};
|
|
206
|
+
function filter(record, predicate) {
|
|
207
|
+
// `Object.entries` erases both the key and the value type of `R`, so the
|
|
208
|
+
// callback is widened once here instead of asserting on every entry.
|
|
209
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
210
|
+
const predicateWidened = predicate;
|
|
154
211
|
return (
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
const [path] = args;
|
|
161
|
-
return (record) => deepPick(record, path);
|
|
162
|
-
}
|
|
212
|
+
// `Object.entries` enumerates exactly the own enumerable string keys of
|
|
213
|
+
// `record`, and filtering only ever removes entries, so the result has a
|
|
214
|
+
// subset of those keys — which is what `FilteredRecord` claims.
|
|
215
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
216
|
+
Object.fromEntries(Object.entries(record).filter(([k, v]) => predicateWidened(v, k))));
|
|
163
217
|
}
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
218
|
+
Obj.filter = filter;
|
|
219
|
+
/**
|
|
220
|
+
* Transforms and drops entries in one pass: the callback returns
|
|
221
|
+
* `Optional.some(value)` to keep an entry with a new value, or
|
|
222
|
+
* `Optional.none` to drop it.
|
|
223
|
+
*
|
|
224
|
+
* **Type Behavior**: as with {@link filter}, the surviving keys are the keys
|
|
225
|
+
* of the source record made optional, and a record keyed by an index
|
|
226
|
+
* signature stays total. Unlike {@link filter}, every kept value takes the
|
|
227
|
+
* type the callback returns.
|
|
228
|
+
*
|
|
229
|
+
* `Optional` rather than `undefined` marks the dropped entries, so a record
|
|
230
|
+
* whose values are legitimately `undefined` stays expressible.
|
|
231
|
+
*
|
|
232
|
+
* **Key handling**: keys reach the callback the way `Object.entries` yields
|
|
233
|
+
* them, so a numeric key `1` arrives as `'1'`. Symbol-keyed properties are
|
|
234
|
+
* not enumerated by `Object.entries`; they are dropped from both the result
|
|
235
|
+
* and its type.
|
|
236
|
+
*
|
|
237
|
+
* @example
|
|
238
|
+
*
|
|
239
|
+
* <!-- doc:embed:jsdoc:example:./samples/src/object/filter-map-example.mts -->
|
|
240
|
+
*
|
|
241
|
+
* ```ts
|
|
242
|
+
* const scores = { alice: 1, bob: 2 } as const;
|
|
243
|
+
*
|
|
244
|
+
* // `Optional.some` keeps an entry with a new value, `Optional.none` drops it.
|
|
245
|
+
* const labelled = Obj.filterMap(scores, (value, key) =>
|
|
246
|
+
* value > 1 ? Optional.some(`${key}=${value}`) : Optional.none,
|
|
247
|
+
* );
|
|
248
|
+
*
|
|
249
|
+
* assert.deepStrictEqual(labelled, { bob: 'bob=2' });
|
|
250
|
+
* ```
|
|
251
|
+
*
|
|
252
|
+
* <!-- /doc:embed:jsdoc:example:./samples/src/object/filter-map-example.mts -->
|
|
253
|
+
*
|
|
254
|
+
* @template R - The type of the source record
|
|
255
|
+
* @template V2 - The type the callback returns for the entries it keeps
|
|
256
|
+
* @param record - The record whose entries are transformed and filtered
|
|
257
|
+
* @param mapFn - Called once per own enumerable string key, with the value
|
|
258
|
+
* and the key
|
|
259
|
+
* @returns A new record holding only the kept entries, with mapped values
|
|
260
|
+
*/
|
|
261
|
+
Obj.filterMap = (record, mapFn) => {
|
|
262
|
+
// `Object.entries` erases both the key and the value type of `R`, so the
|
|
263
|
+
// callback is widened once here instead of asserting on every entry.
|
|
264
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
265
|
+
const mapFnWidened = mapFn;
|
|
170
266
|
return (
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
267
|
+
// `Object.entries` enumerates exactly the own enumerable string keys of
|
|
268
|
+
// `record`, and this only ever drops entries or replaces their values, so
|
|
269
|
+
// the result has a subset of those keys with `V2` values.
|
|
270
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
271
|
+
Object.fromEntries(Object.entries(record).flatMap(([k, v]) => {
|
|
272
|
+
const mapped = mapFnWidened(v, k);
|
|
273
|
+
return Optional.isSome(mapped) ? [[k, mapped.value]] : [];
|
|
274
|
+
})));
|
|
275
|
+
};
|
|
276
|
+
/**
|
|
277
|
+
* Merges multiple records into a single record using `Object.assign`.
|
|
278
|
+
* Later records override properties from earlier records with the same key.
|
|
279
|
+
*
|
|
280
|
+
* @example
|
|
281
|
+
*
|
|
282
|
+
* <!-- doc:embed:jsdoc:example:./samples/src/object/merge-example.mts -->
|
|
283
|
+
*
|
|
284
|
+
* ```ts
|
|
285
|
+
* const a = { a: 0, b: 0 } as const;
|
|
286
|
+
*
|
|
287
|
+
* const b = { b: 1, c: 0 } as const;
|
|
288
|
+
*
|
|
289
|
+
* const result = Obj.merge(a, b);
|
|
290
|
+
*
|
|
291
|
+
* assert.deepStrictEqual(result, { a: 0, b: 1, c: 0 });
|
|
292
|
+
* ```
|
|
293
|
+
*
|
|
294
|
+
* <!-- /doc:embed:jsdoc:example:./samples/src/object/merge-example.mts -->
|
|
295
|
+
*
|
|
296
|
+
* @param records - The records to merge
|
|
297
|
+
* @returns A new record with all properties merged
|
|
298
|
+
*/
|
|
299
|
+
Obj.merge = (...records) =>
|
|
300
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
301
|
+
Object.fromEntries(records.flatMap((r) => Object.entries(r)));
|
|
302
|
+
function deepPick(...args) {
|
|
303
|
+
switch (args.length) {
|
|
304
|
+
case 2: {
|
|
305
|
+
const [record, path] = args;
|
|
306
|
+
return (
|
|
307
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
308
|
+
deepPickImpl(record, path));
|
|
309
|
+
}
|
|
310
|
+
case 1: {
|
|
311
|
+
const [path] = args;
|
|
312
|
+
return (record) => deepPick(record, path);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
}
|
|
316
|
+
Obj.deepPick = deepPick;
|
|
317
|
+
function deepOmit(...args) {
|
|
318
|
+
switch (args.length) {
|
|
319
|
+
case 2: {
|
|
320
|
+
const [record, path] = args;
|
|
321
|
+
return (
|
|
322
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
323
|
+
deepOmitImpl(record, path));
|
|
324
|
+
}
|
|
325
|
+
case 1: {
|
|
326
|
+
const [path] = args;
|
|
327
|
+
return (record) => deepOmit(record, path);
|
|
328
|
+
}
|
|
329
|
+
}
|
|
179
330
|
}
|
|
180
|
-
|
|
181
|
-
Obj2.deepOmit = deepOmit;
|
|
331
|
+
Obj.deepOmit = deepOmit;
|
|
182
332
|
})(Obj || (Obj = {}));
|
|
183
333
|
const deepPickImpl = (record, path) => {
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
334
|
+
if (!Arr.isNonEmpty(path))
|
|
335
|
+
return record;
|
|
336
|
+
const head = path[0];
|
|
337
|
+
if (!hasKey(record, head))
|
|
338
|
+
return {};
|
|
339
|
+
const value = record[head];
|
|
340
|
+
const tail = path.slice(1);
|
|
341
|
+
if (!Arr.isNonEmpty(tail))
|
|
342
|
+
return { [head]: value };
|
|
343
|
+
if (!isRecord(value))
|
|
344
|
+
return { [head]: {} };
|
|
345
|
+
return {
|
|
346
|
+
[head]: deepPickImpl(value, tail),
|
|
347
|
+
};
|
|
194
348
|
};
|
|
195
349
|
const deepOmitImpl = (record, path) => {
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
350
|
+
if (!Arr.isNonEmpty(path))
|
|
351
|
+
return record;
|
|
352
|
+
const head = path[0];
|
|
353
|
+
if (!hasKey(record, head))
|
|
354
|
+
return record;
|
|
355
|
+
const tail = path.slice(1);
|
|
356
|
+
if (!Arr.isNonEmpty(tail)) {
|
|
357
|
+
return Object.fromEntries(Object.entries(record).filter(([k]) => k !== head));
|
|
358
|
+
}
|
|
359
|
+
const value = record[head];
|
|
360
|
+
if (!isRecord(value))
|
|
361
|
+
return record;
|
|
362
|
+
return {
|
|
363
|
+
...record,
|
|
364
|
+
[head]: deepOmitImpl(value, tail),
|
|
365
|
+
};
|
|
211
366
|
};
|
|
212
|
-
|
|
213
|
-
export { Obj };
|
|
214
|
-
//# sourceMappingURL=object.mjs.map
|
|
367
|
+
//# sourceMappingURL=object.mjs.map
|