ts-data-forge 3.2.0 → 3.3.1
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 +45 -21
- package/dist/array/impl/array-utils-creation.d.mts +116 -0
- package/dist/array/impl/array-utils-creation.d.mts.map +1 -0
- package/dist/array/impl/array-utils-creation.mjs +110 -0
- package/dist/array/impl/array-utils-creation.mjs.map +1 -0
- package/dist/array/impl/array-utils-element-access.d.mts +61 -0
- package/dist/array/impl/array-utils-element-access.d.mts.map +1 -0
- package/dist/array/impl/array-utils-element-access.mjs +66 -0
- package/dist/array/impl/array-utils-element-access.mjs.map +1 -0
- package/dist/array/impl/array-utils-iterators.d.mts +59 -0
- package/dist/array/impl/array-utils-iterators.d.mts.map +1 -0
- package/dist/array/impl/array-utils-iterators.mjs +104 -0
- package/dist/array/impl/array-utils-iterators.mjs.map +1 -0
- package/dist/array/impl/array-utils-modification.d.mts +154 -0
- package/dist/array/impl/array-utils-modification.d.mts.map +1 -0
- package/dist/array/impl/array-utils-modification.mjs +139 -0
- package/dist/array/impl/array-utils-modification.mjs.map +1 -0
- package/dist/array/impl/array-utils-reducing-value.d.mts +214 -0
- package/dist/array/impl/array-utils-reducing-value.d.mts.map +1 -0
- package/dist/array/impl/array-utils-reducing-value.mjs +160 -0
- package/dist/array/impl/array-utils-reducing-value.mjs.map +1 -0
- package/dist/array/impl/array-utils-search.d.mts +179 -0
- package/dist/array/impl/array-utils-search.d.mts.map +1 -0
- package/dist/array/impl/array-utils-search.mjs +153 -0
- package/dist/array/impl/array-utils-search.mjs.map +1 -0
- package/dist/array/impl/array-utils-set-op.d.mts +100 -0
- package/dist/array/impl/array-utils-set-op.d.mts.map +1 -0
- package/dist/array/impl/array-utils-set-op.mjs +137 -0
- package/dist/array/impl/array-utils-set-op.mjs.map +1 -0
- package/dist/array/impl/array-utils-size.d.mts +24 -0
- package/dist/array/impl/array-utils-size.d.mts.map +1 -0
- package/dist/array/impl/array-utils-size.mjs +28 -0
- package/dist/array/impl/array-utils-size.mjs.map +1 -0
- package/dist/array/impl/array-utils-slice-clamped.d.mts +18 -0
- package/dist/array/impl/array-utils-slice-clamped.d.mts.map +1 -0
- package/dist/array/impl/array-utils-slice-clamped.mjs +49 -0
- package/dist/array/impl/array-utils-slice-clamped.mjs.map +1 -0
- package/dist/array/impl/array-utils-slicing.d.mts +120 -0
- package/dist/array/impl/array-utils-slicing.d.mts.map +1 -0
- package/dist/array/impl/array-utils-slicing.mjs +140 -0
- package/dist/array/impl/array-utils-slicing.mjs.map +1 -0
- package/dist/array/impl/array-utils-transformation.d.mts +348 -0
- package/dist/array/impl/array-utils-transformation.d.mts.map +1 -0
- package/dist/array/impl/array-utils-transformation.mjs +331 -0
- package/dist/array/impl/array-utils-transformation.mjs.map +1 -0
- package/dist/array/impl/array-utils-validation.d.mts +149 -0
- package/dist/array/impl/array-utils-validation.d.mts.map +1 -0
- package/dist/array/impl/array-utils-validation.mjs +166 -0
- package/dist/array/impl/array-utils-validation.mjs.map +1 -0
- package/dist/array/impl/index.d.mts +13 -0
- package/dist/array/impl/index.d.mts.map +1 -0
- package/dist/array/impl/index.mjs +13 -0
- package/dist/array/impl/index.mjs.map +1 -0
- package/dist/array/index.d.mts +1 -1
- package/dist/array/index.d.mts.map +1 -1
- package/dist/array/index.mjs +2 -1
- package/dist/array/index.mjs.map +1 -1
- package/dist/collections/imap-mapped.d.mts +83 -253
- package/dist/collections/imap-mapped.d.mts.map +1 -1
- package/dist/collections/imap-mapped.mjs +33 -164
- package/dist/collections/imap-mapped.mjs.map +1 -1
- package/dist/collections/imap.d.mts +436 -163
- package/dist/collections/imap.d.mts.map +1 -1
- package/dist/collections/imap.mjs +74 -94
- package/dist/collections/imap.mjs.map +1 -1
- package/dist/collections/iset-mapped.d.mts +828 -345
- package/dist/collections/iset-mapped.d.mts.map +1 -1
- package/dist/collections/iset-mapped.mjs +200 -242
- package/dist/collections/iset-mapped.mjs.map +1 -1
- package/dist/collections/iset.d.mts +397 -205
- package/dist/collections/iset.d.mts.map +1 -1
- package/dist/collections/iset.mjs +102 -184
- package/dist/collections/iset.mjs.map +1 -1
- package/dist/collections/queue.d.mts +155 -135
- package/dist/collections/queue.d.mts.map +1 -1
- package/dist/collections/queue.mjs +55 -156
- package/dist/collections/queue.mjs.map +1 -1
- package/dist/collections/stack.d.mts +154 -154
- package/dist/collections/stack.d.mts.map +1 -1
- package/dist/collections/stack.mjs +54 -203
- package/dist/collections/stack.mjs.map +1 -1
- package/dist/entry-point.d.mts +3 -0
- package/dist/entry-point.d.mts.map +1 -0
- package/dist/entry-point.mjs +62 -0
- package/dist/entry-point.mjs.map +1 -0
- package/dist/expect-type.d.mts +43 -172
- package/dist/expect-type.d.mts.map +1 -1
- package/dist/expect-type.mjs +43 -172
- package/dist/expect-type.mjs.map +1 -1
- package/dist/functional/match.d.mts +35 -140
- package/dist/functional/match.d.mts.map +1 -1
- package/dist/functional/match.mjs.map +1 -1
- package/dist/functional/optional.d.mts +282 -160
- package/dist/functional/optional.d.mts.map +1 -1
- package/dist/functional/optional.mjs +131 -71
- package/dist/functional/optional.mjs.map +1 -1
- package/dist/functional/pipe.d.mts +59 -113
- package/dist/functional/pipe.d.mts.map +1 -1
- package/dist/functional/pipe.mjs.map +1 -1
- package/dist/functional/result.d.mts +433 -332
- package/dist/functional/result.d.mts.map +1 -1
- package/dist/functional/result.mjs +233 -239
- package/dist/functional/result.mjs.map +1 -1
- package/dist/globals.d.mts +12 -5
- package/dist/guard/has-key.d.mts +23 -74
- package/dist/guard/has-key.d.mts.map +1 -1
- package/dist/guard/has-key.mjs +23 -74
- package/dist/guard/has-key.mjs.map +1 -1
- package/dist/guard/is-non-empty-string.d.mts +20 -87
- package/dist/guard/is-non-empty-string.d.mts.map +1 -1
- package/dist/guard/is-non-empty-string.mjs +20 -87
- package/dist/guard/is-non-empty-string.mjs.map +1 -1
- package/dist/guard/is-non-null-object.d.mts +14 -84
- package/dist/guard/is-non-null-object.d.mts.map +1 -1
- package/dist/guard/is-non-null-object.mjs +14 -84
- package/dist/guard/is-non-null-object.mjs.map +1 -1
- package/dist/guard/is-primitive.d.mts +13 -126
- package/dist/guard/is-primitive.d.mts.map +1 -1
- package/dist/guard/is-primitive.mjs +13 -126
- package/dist/guard/is-primitive.mjs.map +1 -1
- package/dist/guard/is-record.d.mts +21 -132
- package/dist/guard/is-record.d.mts.map +1 -1
- package/dist/guard/is-record.mjs +21 -132
- package/dist/guard/is-record.mjs.map +1 -1
- package/dist/guard/is-type.d.mts +201 -238
- package/dist/guard/is-type.d.mts.map +1 -1
- package/dist/guard/is-type.mjs +201 -238
- package/dist/guard/is-type.mjs.map +1 -1
- package/dist/guard/key-is-in.d.mts +22 -139
- package/dist/guard/key-is-in.d.mts.map +1 -1
- package/dist/guard/key-is-in.mjs +22 -139
- package/dist/guard/key-is-in.mjs.map +1 -1
- package/dist/index.d.mts +0 -1
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +0 -1
- package/dist/index.mjs.map +1 -1
- package/dist/iterator/range.d.mts +29 -62
- package/dist/iterator/range.d.mts.map +1 -1
- package/dist/iterator/range.mjs.map +1 -1
- package/dist/json/json.d.mts +191 -121
- package/dist/json/json.d.mts.map +1 -1
- package/dist/json/json.mjs +238 -136
- package/dist/json/json.mjs.map +1 -1
- package/dist/number/branded-types/finite-number.d.mts +24 -156
- package/dist/number/branded-types/finite-number.d.mts.map +1 -1
- package/dist/number/branded-types/finite-number.mjs +27 -159
- package/dist/number/branded-types/finite-number.mjs.map +1 -1
- package/dist/number/branded-types/int.d.mts +122 -120
- package/dist/number/branded-types/int.d.mts.map +1 -1
- package/dist/number/branded-types/int.mjs +122 -120
- package/dist/number/branded-types/int.mjs.map +1 -1
- package/dist/number/branded-types/int16.d.mts +22 -30
- package/dist/number/branded-types/int16.d.mts.map +1 -1
- package/dist/number/branded-types/int16.mjs +22 -30
- package/dist/number/branded-types/int16.mjs.map +1 -1
- package/dist/number/branded-types/int32.d.mts +22 -31
- package/dist/number/branded-types/int32.d.mts.map +1 -1
- package/dist/number/branded-types/int32.mjs +22 -31
- package/dist/number/branded-types/int32.mjs.map +1 -1
- package/dist/number/branded-types/non-negative-finite-number.d.mts +28 -36
- package/dist/number/branded-types/non-negative-finite-number.d.mts.map +1 -1
- package/dist/number/branded-types/non-negative-finite-number.mjs +31 -39
- package/dist/number/branded-types/non-negative-finite-number.mjs.map +1 -1
- package/dist/number/branded-types/non-negative-int16.d.mts +24 -34
- package/dist/number/branded-types/non-negative-int16.d.mts.map +1 -1
- package/dist/number/branded-types/non-negative-int16.mjs +24 -34
- package/dist/number/branded-types/non-negative-int16.mjs.map +1 -1
- package/dist/number/branded-types/non-negative-int32.d.mts +26 -35
- package/dist/number/branded-types/non-negative-int32.d.mts.map +1 -1
- package/dist/number/branded-types/non-negative-int32.mjs +26 -35
- package/dist/number/branded-types/non-negative-int32.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-finite-number.d.mts +22 -37
- package/dist/number/branded-types/non-zero-finite-number.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-finite-number.mjs +25 -40
- package/dist/number/branded-types/non-zero-finite-number.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-int.d.mts +15 -30
- package/dist/number/branded-types/non-zero-int.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-int.mjs +15 -30
- package/dist/number/branded-types/non-zero-int.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-int16.d.mts +27 -35
- package/dist/number/branded-types/non-zero-int16.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-int16.mjs +27 -35
- package/dist/number/branded-types/non-zero-int16.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-int32.d.mts +29 -36
- package/dist/number/branded-types/non-zero-int32.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-int32.mjs +29 -36
- package/dist/number/branded-types/non-zero-int32.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-safe-int.d.mts +37 -38
- package/dist/number/branded-types/non-zero-safe-int.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-safe-int.mjs +39 -40
- package/dist/number/branded-types/non-zero-safe-int.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-uint16.d.mts +24 -35
- package/dist/number/branded-types/non-zero-uint16.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-uint16.mjs +24 -35
- package/dist/number/branded-types/non-zero-uint16.mjs.map +1 -1
- package/dist/number/branded-types/non-zero-uint32.d.mts +24 -35
- package/dist/number/branded-types/non-zero-uint32.d.mts.map +1 -1
- package/dist/number/branded-types/non-zero-uint32.mjs +24 -35
- package/dist/number/branded-types/non-zero-uint32.mjs.map +1 -1
- package/dist/number/branded-types/positive-finite-number.d.mts +26 -40
- package/dist/number/branded-types/positive-finite-number.d.mts.map +1 -1
- package/dist/number/branded-types/positive-finite-number.mjs +29 -43
- package/dist/number/branded-types/positive-finite-number.mjs.map +1 -1
- package/dist/number/branded-types/positive-int.d.mts +133 -123
- package/dist/number/branded-types/positive-int.d.mts.map +1 -1
- package/dist/number/branded-types/positive-int.mjs +133 -123
- package/dist/number/branded-types/positive-int.mjs.map +1 -1
- package/dist/number/branded-types/positive-int16.d.mts +24 -35
- package/dist/number/branded-types/positive-int16.d.mts.map +1 -1
- package/dist/number/branded-types/positive-int16.mjs +24 -35
- package/dist/number/branded-types/positive-int16.mjs.map +1 -1
- package/dist/number/branded-types/positive-int32.d.mts +24 -35
- package/dist/number/branded-types/positive-int32.d.mts.map +1 -1
- package/dist/number/branded-types/positive-int32.mjs +24 -35
- package/dist/number/branded-types/positive-int32.mjs.map +1 -1
- package/dist/number/branded-types/positive-safe-int.d.mts +159 -33
- package/dist/number/branded-types/positive-safe-int.d.mts.map +1 -1
- package/dist/number/branded-types/positive-safe-int.mjs +160 -34
- package/dist/number/branded-types/positive-safe-int.mjs.map +1 -1
- package/dist/number/branded-types/positive-uint16.d.mts +24 -35
- package/dist/number/branded-types/positive-uint16.d.mts.map +1 -1
- package/dist/number/branded-types/positive-uint16.mjs +24 -35
- package/dist/number/branded-types/positive-uint16.mjs.map +1 -1
- package/dist/number/branded-types/positive-uint32.d.mts +26 -36
- package/dist/number/branded-types/positive-uint32.d.mts.map +1 -1
- package/dist/number/branded-types/positive-uint32.mjs +26 -36
- package/dist/number/branded-types/positive-uint32.mjs.map +1 -1
- package/dist/number/branded-types/safe-int.d.mts +140 -99
- package/dist/number/branded-types/safe-int.d.mts.map +1 -1
- package/dist/number/branded-types/safe-int.mjs +142 -101
- package/dist/number/branded-types/safe-int.mjs.map +1 -1
- package/dist/number/branded-types/safe-uint.d.mts +24 -33
- package/dist/number/branded-types/safe-uint.d.mts.map +1 -1
- package/dist/number/branded-types/safe-uint.mjs +25 -34
- package/dist/number/branded-types/safe-uint.mjs.map +1 -1
- package/dist/number/branded-types/uint.d.mts +121 -30
- package/dist/number/branded-types/uint.d.mts.map +1 -1
- package/dist/number/branded-types/uint.mjs +121 -30
- package/dist/number/branded-types/uint.mjs.map +1 -1
- package/dist/number/branded-types/uint16.d.mts +26 -34
- package/dist/number/branded-types/uint16.d.mts.map +1 -1
- package/dist/number/branded-types/uint16.mjs +26 -34
- package/dist/number/branded-types/uint16.mjs.map +1 -1
- package/dist/number/branded-types/uint32.d.mts +26 -68
- package/dist/number/branded-types/uint32.d.mts.map +1 -1
- package/dist/number/branded-types/uint32.mjs +26 -68
- package/dist/number/branded-types/uint32.mjs.map +1 -1
- package/dist/number/enum/int8.d.mts +37 -101
- package/dist/number/enum/int8.d.mts.map +1 -1
- package/dist/number/enum/int8.mjs +39 -170
- package/dist/number/enum/int8.mjs.map +1 -1
- package/dist/number/enum/uint8.d.mts +45 -55
- package/dist/number/enum/uint8.d.mts.map +1 -1
- package/dist/number/enum/uint8.mjs +46 -155
- package/dist/number/enum/uint8.mjs.map +1 -1
- package/dist/number/num.d.mts +145 -206
- package/dist/number/num.d.mts.map +1 -1
- package/dist/number/num.mjs +143 -199
- package/dist/number/num.mjs.map +1 -1
- package/dist/number/refined-number-utils.d.mts +97 -21
- package/dist/number/refined-number-utils.d.mts.map +1 -1
- package/dist/number/refined-number-utils.mjs +91 -20
- package/dist/number/refined-number-utils.mjs.map +1 -1
- package/dist/object/object.d.mts +126 -208
- package/dist/object/object.d.mts.map +1 -1
- package/dist/object/object.mjs +68 -102
- package/dist/object/object.mjs.map +1 -1
- package/dist/others/cast-mutable.d.mts +12 -88
- package/dist/others/cast-mutable.d.mts.map +1 -1
- package/dist/others/cast-mutable.mjs +13 -89
- package/dist/others/cast-mutable.mjs.map +1 -1
- package/dist/others/cast-readonly.d.mts +12 -168
- package/dist/others/cast-readonly.d.mts.map +1 -1
- package/dist/others/cast-readonly.mjs +13 -169
- package/dist/others/cast-readonly.mjs.map +1 -1
- package/dist/others/if-then.d.mts +6 -83
- package/dist/others/if-then.d.mts.map +1 -1
- package/dist/others/if-then.mjs +6 -83
- package/dist/others/if-then.mjs.map +1 -1
- package/dist/others/map-nullable.d.mts +12 -136
- package/dist/others/map-nullable.d.mts.map +1 -1
- package/dist/others/map-nullable.mjs.map +1 -1
- package/dist/others/memoize-function.d.mts +14 -157
- package/dist/others/memoize-function.d.mts.map +1 -1
- package/dist/others/memoize-function.mjs +14 -157
- package/dist/others/memoize-function.mjs.map +1 -1
- package/dist/others/tuple.d.mts +33 -151
- package/dist/others/tuple.d.mts.map +1 -1
- package/dist/others/tuple.mjs +33 -151
- package/dist/others/tuple.mjs.map +1 -1
- package/dist/others/unknown-to-string.d.mts +11 -125
- package/dist/others/unknown-to-string.d.mts.map +1 -1
- package/dist/others/unknown-to-string.mjs +14 -127
- package/dist/others/unknown-to-string.mjs.map +1 -1
- package/dist/promise/promise.d.mts +33 -20
- package/dist/promise/promise.d.mts.map +1 -1
- package/dist/promise/promise.mjs +34 -21
- package/dist/promise/promise.mjs.map +1 -1
- package/dist/types.d.mts +1 -1
- package/package.json +54 -50
- package/src/array/impl/array-utils-creation.mts +192 -0
- package/src/array/{array-utils-creation.test.mts → impl/array-utils-creation.test.mts} +121 -72
- package/src/array/impl/array-utils-element-access.mts +115 -0
- package/src/array/impl/array-utils-element-access.test.mts +151 -0
- package/src/array/impl/array-utils-iterators.mts +79 -0
- package/src/array/impl/array-utils-iterators.test.mts +98 -0
- package/src/array/impl/array-utils-modification.mts +434 -0
- package/src/array/{array-utils-modification.test.mts → impl/array-utils-modification.test.mts} +41 -28
- package/src/array/{array-utils-overload-type-error.test.mts → impl/array-utils-overload-type-error.test.mts} +33 -33
- package/src/array/impl/array-utils-reducing-value.mts +551 -0
- package/src/array/{array-utils-reducing-value.test.mts → impl/array-utils-reducing-value.test.mts} +45 -50
- package/src/array/impl/array-utils-search.mts +509 -0
- package/src/array/impl/array-utils-search.test.mts +346 -0
- package/src/array/impl/array-utils-set-op.mts +166 -0
- package/src/array/{array-utils-set-op.test.mts → impl/array-utils-set-op.test.mts} +42 -35
- package/src/array/impl/array-utils-size.mts +30 -0
- package/src/array/impl/array-utils-size.test.mts +9 -0
- package/src/array/impl/array-utils-slice-clamped.mts +51 -0
- package/src/array/{array-utils-slice-clamped.test.mts → impl/array-utils-slice-clamped.test.mts} +12 -12
- package/src/array/impl/array-utils-slicing.mts +275 -0
- package/src/array/impl/array-utils-slicing.test.mts +158 -0
- package/src/array/impl/array-utils-transformation.mts +746 -0
- package/src/array/{array-utils-transformation.test.mts → impl/array-utils-transformation.test.mts} +662 -889
- package/src/array/impl/array-utils-validation.mts +241 -0
- package/src/array/{array-utils-validation.test.mts → impl/array-utils-validation.test.mts} +194 -107
- package/src/array/{array.test.mts → impl/array.test.mts} +2 -2
- package/src/array/impl/index.mts +12 -0
- package/src/array/index.mts +1 -1
- package/src/collections/imap-mapped.mts +99 -265
- package/src/collections/imap.mts +477 -174
- package/src/collections/imap.test.mts +12 -19
- package/src/collections/iset-mapped.mts +892 -358
- package/src/collections/iset.mts +429 -213
- package/src/collections/queue.mts +174 -200
- package/src/collections/stack.mts +172 -245
- package/src/collections/stack.test.mts +9 -1
- package/src/entry-point.mts +2 -0
- package/src/expect-type.mts +43 -172
- package/src/functional/match.mts +35 -145
- package/src/functional/optional.mts +285 -163
- package/src/functional/optional.test.mts +4 -1
- package/src/functional/pipe.mts +60 -113
- package/src/functional/result.mts +452 -351
- package/src/functional/result.test.mts +9 -2
- package/src/globals.d.mts +12 -5
- package/src/guard/has-key.mts +23 -74
- package/src/guard/is-non-empty-string.mts +20 -87
- package/src/guard/is-non-null-object.mts +14 -84
- package/src/guard/is-non-null-object.test.mts +1 -1
- package/src/guard/is-primitive.mts +13 -126
- package/src/guard/is-primitive.test.mts +1 -1
- package/src/guard/is-record.mts +21 -132
- package/src/guard/is-record.test.mts +0 -1
- package/src/guard/is-type.mts +201 -238
- package/src/guard/is-type.test.mts +7 -7
- package/src/guard/key-is-in.mts +22 -139
- package/src/index.mts +0 -1
- package/src/iterator/range.mts +29 -62
- package/src/json/json.mts +202 -134
- package/src/json/json.test.mts +1 -3
- package/src/number/branded-types/finite-number.mts +27 -159
- package/src/number/branded-types/int.mts +122 -120
- package/src/number/branded-types/int16.mts +22 -30
- package/src/number/branded-types/int16.test.mts +24 -24
- package/src/number/branded-types/int32.mts +22 -31
- package/src/number/branded-types/int32.test.mts +39 -39
- package/src/number/branded-types/non-negative-finite-number.mts +31 -39
- package/src/number/branded-types/non-negative-int16.mts +24 -34
- package/src/number/branded-types/non-negative-int16.test.mts +16 -16
- package/src/number/branded-types/non-negative-int32.mts +26 -35
- package/src/number/branded-types/non-negative-int32.test.mts +30 -30
- package/src/number/branded-types/non-zero-finite-number.mts +25 -40
- package/src/number/branded-types/non-zero-int.mts +15 -30
- package/src/number/branded-types/non-zero-int16.mts +27 -35
- package/src/number/branded-types/non-zero-int16.test.mts +26 -26
- package/src/number/branded-types/non-zero-int32.mts +29 -36
- package/src/number/branded-types/non-zero-int32.test.mts +45 -42
- package/src/number/branded-types/non-zero-safe-int.mts +39 -40
- package/src/number/branded-types/non-zero-uint16.mts +24 -35
- package/src/number/branded-types/non-zero-uint16.test.mts +16 -16
- package/src/number/branded-types/non-zero-uint32.mts +24 -35
- package/src/number/branded-types/non-zero-uint32.test.mts +28 -28
- package/src/number/branded-types/positive-finite-number.mts +29 -43
- package/src/number/branded-types/positive-int.mts +134 -124
- package/src/number/branded-types/positive-int16.mts +24 -35
- package/src/number/branded-types/positive-int16.test.mts +14 -14
- package/src/number/branded-types/positive-int32.mts +24 -35
- package/src/number/branded-types/positive-int32.test.mts +26 -26
- package/src/number/branded-types/positive-safe-int.mts +160 -34
- package/src/number/branded-types/positive-uint16.mts +24 -35
- package/src/number/branded-types/positive-uint16.test.mts +16 -16
- package/src/number/branded-types/positive-uint32.mts +26 -36
- package/src/number/branded-types/positive-uint32.test.mts +31 -28
- package/src/number/branded-types/safe-int.mts +142 -101
- package/src/number/branded-types/safe-uint.mts +25 -34
- package/src/number/branded-types/uint.mts +121 -30
- package/src/number/branded-types/uint16.mts +26 -34
- package/src/number/branded-types/uint16.test.mts +16 -16
- package/src/number/branded-types/uint32.mts +26 -68
- package/src/number/branded-types/uint32.test.mts +28 -28
- package/src/number/enum/int8.mts +39 -170
- package/src/number/enum/uint8.mts +46 -155
- package/src/number/num.mts +157 -212
- package/src/number/num.test.mts +4 -4
- package/src/number/refined-number-utils.mts +109 -26
- package/src/object/object.mts +130 -212
- package/src/object/object.test.mts +29 -0
- package/src/others/cast-mutable.mts +13 -89
- package/src/others/cast-mutable.test.mts +80 -0
- package/src/others/cast-readonly.mts +13 -169
- package/src/others/if-then.mts +6 -83
- package/src/others/map-nullable.mts +12 -136
- package/src/others/map-nullable.test.mts +6 -6
- package/src/others/memoize-function.mts +14 -157
- package/src/others/tuple.mts +33 -151
- package/src/others/unknown-to-string.mts +15 -127
- package/src/others/unknown-to-string.test.mts +14 -2
- package/src/promise/promise.mts +34 -21
- package/src/promise/promise.test.mts +43 -0
- package/dist/array/array-utils.d.mts +0 -2956
- package/dist/array/array-utils.d.mts.map +0 -1
- package/dist/array/array-utils.mjs +0 -1838
- package/dist/array/array-utils.mjs.map +0 -1
- package/src/array/array-utils-search.test.mts +0 -169
- package/src/array/array-utils-slicing.test.mts +0 -274
- package/src/array/array-utils.mts +0 -4834
|
@@ -1,187 +1,31 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Casts a mutable type `T` to its `Readonly<T>` equivalent.
|
|
3
3
|
*
|
|
4
|
-
* This is a safe type assertion that adds immutability constraints at the type
|
|
5
|
-
* The runtime value remains unchanged - only TypeScript's view of it
|
|
6
|
-
* This helps prevent accidental mutations and makes code
|
|
4
|
+
* This is a safe type assertion that adds immutability constraints at the type
|
|
5
|
+
* level. The runtime value remains unchanged - only TypeScript's view of it
|
|
6
|
+
* becomes readonly. This helps prevent accidental mutations and makes code
|
|
7
|
+
* intentions clearer.
|
|
7
8
|
*
|
|
8
9
|
* @template T - The type of the mutable value
|
|
9
10
|
* @param mutable - The mutable value to cast to readonly
|
|
10
11
|
* @returns The same value with readonly modifiers added to its type
|
|
11
|
-
*
|
|
12
|
-
* @example Basic usage with arrays and objects
|
|
13
|
-
* ```typescript
|
|
14
|
-
* const mutableArr: number[] = [1, 2, 3];
|
|
15
|
-
* const readonlyArr = castReadonly(mutableArr);
|
|
16
|
-
* // readonlyArr.push(4); // ❌ TypeScript Error: no 'push' on readonly array
|
|
17
|
-
*
|
|
18
|
-
* const mutableObj = { x: 1, y: 2 };
|
|
19
|
-
* const readonlyObj = castReadonly(mutableObj);
|
|
20
|
-
* // readonlyObj.x = 5; // ❌ TypeScript Error: cannot assign to readonly property
|
|
21
|
-
* ```
|
|
22
|
-
*
|
|
23
|
-
* @example Protecting function return values
|
|
24
|
-
* ```typescript
|
|
25
|
-
* // Prevent callers from mutating internal state
|
|
26
|
-
* class UserService {
|
|
27
|
-
* private users: User[] = [];
|
|
28
|
-
*
|
|
29
|
-
* getUsers(): readonly User[] {
|
|
30
|
-
* return castReadonly(this.users); // Callers can't mutate the array
|
|
31
|
-
* }
|
|
32
|
-
* }
|
|
33
|
-
*
|
|
34
|
-
* const service = new UserService();
|
|
35
|
-
* const users = service.getUsers();
|
|
36
|
-
* // users.push(newUser); // ❌ TypeScript prevents this
|
|
37
|
-
* ```
|
|
38
|
-
*
|
|
39
|
-
* @example Creating immutable configurations
|
|
40
|
-
* ```typescript
|
|
41
|
-
* // Start with mutable object for initialization
|
|
42
|
-
* const config = {
|
|
43
|
-
* apiUrl: 'https://api.example.com',
|
|
44
|
-
* timeout: 5000,
|
|
45
|
-
* retries: 3
|
|
46
|
-
* };
|
|
47
|
-
*
|
|
48
|
-
* // Validate and process config...
|
|
49
|
-
*
|
|
50
|
-
* // Export as readonly to prevent modifications
|
|
51
|
-
* export const APP_CONFIG = castReadonly(config);
|
|
52
|
-
* // APP_CONFIG.timeout = 10000; // ❌ TypeScript Error
|
|
53
|
-
* ```
|
|
54
|
-
*
|
|
55
|
-
* @example Working with array methods
|
|
56
|
-
* ```typescript
|
|
57
|
-
* const numbers: number[] = [1, 2, 3, 4, 5];
|
|
58
|
-
* const readonlyNumbers = castReadonly(numbers);
|
|
59
|
-
*
|
|
60
|
-
* // Read operations still work
|
|
61
|
-
* const doubled = readonlyNumbers.map(n => n * 2); // ✅ Returns new array
|
|
62
|
-
* const sum = readonlyNumbers.reduce((a, b) => a + b, 0); // ✅ Works
|
|
63
|
-
* const first = readonlyNumbers[0]; // ✅ Reading is allowed
|
|
64
|
-
*
|
|
65
|
-
* // Mutations are prevented
|
|
66
|
-
* // readonlyNumbers[0] = 10; // ❌ TypeScript Error
|
|
67
|
-
* // readonlyNumbers.sort(); // ❌ TypeScript Error (sort mutates)
|
|
68
|
-
* ```
|
|
69
|
-
*
|
|
70
12
|
* @see castDeepReadonly - For deeply nested structures
|
|
71
13
|
* @see castMutable - For the opposite operation (use with caution)
|
|
72
14
|
*/
|
|
73
15
|
export declare const castReadonly: <T>(mutable: T) => Readonly<T>;
|
|
74
16
|
/**
|
|
75
|
-
* Casts a mutable type `T` to its `DeepReadonly<T>` equivalent, recursively
|
|
17
|
+
* Casts a mutable type `T` to its `DeepReadonly<T>` equivalent, recursively
|
|
18
|
+
* adding readonly modifiers.
|
|
76
19
|
*
|
|
77
|
-
* This is a safe type assertion that adds immutability constraints at ALL
|
|
78
|
-
* Provides complete protection against mutations in complex
|
|
79
|
-
* The runtime value is unchanged - only TypeScript's type
|
|
20
|
+
* This is a safe type assertion that adds immutability constraints at ALL
|
|
21
|
+
* levels of nesting. Provides complete protection against mutations in complex
|
|
22
|
+
* data structures. The runtime value is unchanged - only TypeScript's type
|
|
23
|
+
* checking is enhanced.
|
|
80
24
|
*
|
|
81
25
|
* @template T - The type of the mutable value
|
|
82
26
|
* @param mutable - The mutable value to cast to deeply readonly
|
|
83
|
-
* @returns The same value with readonly modifiers recursively added to all
|
|
84
|
-
*
|
|
85
|
-
* @example Basic usage with nested structures
|
|
86
|
-
* ```typescript
|
|
87
|
-
* const mutableNested = {
|
|
88
|
-
* a: { b: [1, 2, 3] },
|
|
89
|
-
* c: { d: { e: 'value' } }
|
|
90
|
-
* };
|
|
91
|
-
*
|
|
92
|
-
* const readonlyNested = castDeepReadonly(mutableNested);
|
|
93
|
-
* // readonlyNested.a.b.push(4); // ❌ Error: readonly at all levels
|
|
94
|
-
* // readonlyNested.c.d.e = 'new'; // ❌ Error: readonly at all levels
|
|
95
|
-
* // readonlyNested.a = {}; // ❌ Error: cannot reassign readonly property
|
|
96
|
-
* ```
|
|
97
|
-
*
|
|
98
|
-
* @example Protecting complex state objects
|
|
99
|
-
* ```typescript
|
|
100
|
-
* interface AppState {
|
|
101
|
-
* user: {
|
|
102
|
-
* id: number;
|
|
103
|
-
* profile: {
|
|
104
|
-
* name: string;
|
|
105
|
-
* settings: {
|
|
106
|
-
* theme: string;
|
|
107
|
-
* notifications: boolean[];
|
|
108
|
-
* };
|
|
109
|
-
* };
|
|
110
|
-
* };
|
|
111
|
-
* data: {
|
|
112
|
-
* items: Array<{ id: number; value: string }>;
|
|
113
|
-
* };
|
|
114
|
-
* }
|
|
115
|
-
*
|
|
116
|
-
* class StateManager {
|
|
117
|
-
* private state: AppState = initialState;
|
|
118
|
-
*
|
|
119
|
-
* getState(): DeepReadonly<AppState> {
|
|
120
|
-
* return castDeepReadonly(this.state);
|
|
121
|
-
* }
|
|
122
|
-
*
|
|
123
|
-
* // Mutations only allowed through specific methods
|
|
124
|
-
* updateTheme(theme: string) {
|
|
125
|
-
* this.state.user.profile.settings.theme = theme;
|
|
126
|
-
* }
|
|
127
|
-
* }
|
|
128
|
-
* ```
|
|
129
|
-
*
|
|
130
|
-
* @example Creating immutable API responses
|
|
131
|
-
* ```typescript
|
|
132
|
-
* async function fetchUserData(): Promise<DeepReadonly<UserData>> {
|
|
133
|
-
* const response = await api.get<UserData>('/user');
|
|
134
|
-
*
|
|
135
|
-
* // Process and validate data...
|
|
136
|
-
*
|
|
137
|
-
* // Return as deeply immutable to prevent accidental mutations
|
|
138
|
-
* return castDeepReadonly(response.data);
|
|
139
|
-
* }
|
|
140
|
-
*
|
|
141
|
-
* const userData = await fetchUserData();
|
|
142
|
-
* // userData is fully protected from mutations at any depth
|
|
143
|
-
* // userData.preferences.emails.push('new@email.com'); // ❌ TypeScript Error
|
|
144
|
-
* ```
|
|
145
|
-
*
|
|
146
|
-
* @example Working with Redux or state management
|
|
147
|
-
* ```typescript
|
|
148
|
-
* // Redux reducer example
|
|
149
|
-
* type State = DeepReadonly<AppState>;
|
|
150
|
-
*
|
|
151
|
-
* function reducer(state: State, action: Action): State {
|
|
152
|
-
* switch (action.type) {
|
|
153
|
-
* case 'UPDATE_USER_NAME':
|
|
154
|
-
* // Must create new objects, can't mutate
|
|
155
|
-
* return castDeepReadonly({
|
|
156
|
-
* ...state,
|
|
157
|
-
* user: {
|
|
158
|
-
* ...state.user,
|
|
159
|
-
* profile: {
|
|
160
|
-
* ...state.user.profile,
|
|
161
|
-
* name: action.payload
|
|
162
|
-
* }
|
|
163
|
-
* }
|
|
164
|
-
* });
|
|
165
|
-
* default:
|
|
166
|
-
* return state;
|
|
167
|
-
* }
|
|
168
|
-
* }
|
|
169
|
-
* ```
|
|
170
|
-
*
|
|
171
|
-
* @example Type inference with generics
|
|
172
|
-
* ```typescript
|
|
173
|
-
* function processData<T>(data: T): DeepReadonly<T> {
|
|
174
|
-
* // Perform processing...
|
|
175
|
-
* console.log('Processing:', data);
|
|
176
|
-
*
|
|
177
|
-
* // Return immutable version
|
|
178
|
-
* return castDeepReadonly(data);
|
|
179
|
-
* }
|
|
180
|
-
*
|
|
181
|
-
* const result = processData({ nested: { value: [1, 2, 3] } });
|
|
182
|
-
* // Type of result is DeepReadonly<{ nested: { value: number[] } }>
|
|
183
|
-
* ```
|
|
184
|
-
*
|
|
27
|
+
* @returns The same value with readonly modifiers recursively added to all
|
|
28
|
+
* properties
|
|
185
29
|
* @see castReadonly - For shallow readonly casting
|
|
186
30
|
* @see castDeepMutable - For the opposite operation (use with extreme caution)
|
|
187
31
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cast-readonly.d.mts","sourceRoot":"","sources":["../../src/others/cast-readonly.mts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"cast-readonly.d.mts","sourceRoot":"","sources":["../../src/others/cast-readonly.mts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,eAAO,MAAM,YAAY,GAAI,CAAC,EAAG,SAAS,CAAC,KAAG,QAAQ,CAAC,CAAC,CAChC,CAAC;AAEzB;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,gBAAgB,GAAI,CAAC,EAAG,SAAS,CAAC,KAAG,YAAY,CAAC,CAAC,CAEpC,CAAC"}
|
|
@@ -1,192 +1,36 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Casts a mutable type `T` to its `Readonly<T>` equivalent.
|
|
3
3
|
*
|
|
4
|
-
* This is a safe type assertion that adds immutability constraints at the type
|
|
5
|
-
* The runtime value remains unchanged - only TypeScript's view of it
|
|
6
|
-
* This helps prevent accidental mutations and makes code
|
|
4
|
+
* This is a safe type assertion that adds immutability constraints at the type
|
|
5
|
+
* level. The runtime value remains unchanged - only TypeScript's view of it
|
|
6
|
+
* becomes readonly. This helps prevent accidental mutations and makes code
|
|
7
|
+
* intentions clearer.
|
|
7
8
|
*
|
|
8
9
|
* @template T - The type of the mutable value
|
|
9
10
|
* @param mutable - The mutable value to cast to readonly
|
|
10
11
|
* @returns The same value with readonly modifiers added to its type
|
|
11
|
-
*
|
|
12
|
-
* @example Basic usage with arrays and objects
|
|
13
|
-
* ```typescript
|
|
14
|
-
* const mutableArr: number[] = [1, 2, 3];
|
|
15
|
-
* const readonlyArr = castReadonly(mutableArr);
|
|
16
|
-
* // readonlyArr.push(4); // ❌ TypeScript Error: no 'push' on readonly array
|
|
17
|
-
*
|
|
18
|
-
* const mutableObj = { x: 1, y: 2 };
|
|
19
|
-
* const readonlyObj = castReadonly(mutableObj);
|
|
20
|
-
* // readonlyObj.x = 5; // ❌ TypeScript Error: cannot assign to readonly property
|
|
21
|
-
* ```
|
|
22
|
-
*
|
|
23
|
-
* @example Protecting function return values
|
|
24
|
-
* ```typescript
|
|
25
|
-
* // Prevent callers from mutating internal state
|
|
26
|
-
* class UserService {
|
|
27
|
-
* private users: User[] = [];
|
|
28
|
-
*
|
|
29
|
-
* getUsers(): readonly User[] {
|
|
30
|
-
* return castReadonly(this.users); // Callers can't mutate the array
|
|
31
|
-
* }
|
|
32
|
-
* }
|
|
33
|
-
*
|
|
34
|
-
* const service = new UserService();
|
|
35
|
-
* const users = service.getUsers();
|
|
36
|
-
* // users.push(newUser); // ❌ TypeScript prevents this
|
|
37
|
-
* ```
|
|
38
|
-
*
|
|
39
|
-
* @example Creating immutable configurations
|
|
40
|
-
* ```typescript
|
|
41
|
-
* // Start with mutable object for initialization
|
|
42
|
-
* const config = {
|
|
43
|
-
* apiUrl: 'https://api.example.com',
|
|
44
|
-
* timeout: 5000,
|
|
45
|
-
* retries: 3
|
|
46
|
-
* };
|
|
47
|
-
*
|
|
48
|
-
* // Validate and process config...
|
|
49
|
-
*
|
|
50
|
-
* // Export as readonly to prevent modifications
|
|
51
|
-
* export const APP_CONFIG = castReadonly(config);
|
|
52
|
-
* // APP_CONFIG.timeout = 10000; // ❌ TypeScript Error
|
|
53
|
-
* ```
|
|
54
|
-
*
|
|
55
|
-
* @example Working with array methods
|
|
56
|
-
* ```typescript
|
|
57
|
-
* const numbers: number[] = [1, 2, 3, 4, 5];
|
|
58
|
-
* const readonlyNumbers = castReadonly(numbers);
|
|
59
|
-
*
|
|
60
|
-
* // Read operations still work
|
|
61
|
-
* const doubled = readonlyNumbers.map(n => n * 2); // ✅ Returns new array
|
|
62
|
-
* const sum = readonlyNumbers.reduce((a, b) => a + b, 0); // ✅ Works
|
|
63
|
-
* const first = readonlyNumbers[0]; // ✅ Reading is allowed
|
|
64
|
-
*
|
|
65
|
-
* // Mutations are prevented
|
|
66
|
-
* // readonlyNumbers[0] = 10; // ❌ TypeScript Error
|
|
67
|
-
* // readonlyNumbers.sort(); // ❌ TypeScript Error (sort mutates)
|
|
68
|
-
* ```
|
|
69
|
-
*
|
|
70
12
|
* @see castDeepReadonly - For deeply nested structures
|
|
71
13
|
* @see castMutable - For the opposite operation (use with caution)
|
|
72
14
|
*/
|
|
73
15
|
const castReadonly = (mutable) => mutable;
|
|
74
16
|
/**
|
|
75
|
-
* Casts a mutable type `T` to its `DeepReadonly<T>` equivalent, recursively
|
|
17
|
+
* Casts a mutable type `T` to its `DeepReadonly<T>` equivalent, recursively
|
|
18
|
+
* adding readonly modifiers.
|
|
76
19
|
*
|
|
77
|
-
* This is a safe type assertion that adds immutability constraints at ALL
|
|
78
|
-
* Provides complete protection against mutations in complex
|
|
79
|
-
* The runtime value is unchanged - only TypeScript's type
|
|
20
|
+
* This is a safe type assertion that adds immutability constraints at ALL
|
|
21
|
+
* levels of nesting. Provides complete protection against mutations in complex
|
|
22
|
+
* data structures. The runtime value is unchanged - only TypeScript's type
|
|
23
|
+
* checking is enhanced.
|
|
80
24
|
*
|
|
81
25
|
* @template T - The type of the mutable value
|
|
82
26
|
* @param mutable - The mutable value to cast to deeply readonly
|
|
83
|
-
* @returns The same value with readonly modifiers recursively added to all
|
|
84
|
-
*
|
|
85
|
-
* @example Basic usage with nested structures
|
|
86
|
-
* ```typescript
|
|
87
|
-
* const mutableNested = {
|
|
88
|
-
* a: { b: [1, 2, 3] },
|
|
89
|
-
* c: { d: { e: 'value' } }
|
|
90
|
-
* };
|
|
91
|
-
*
|
|
92
|
-
* const readonlyNested = castDeepReadonly(mutableNested);
|
|
93
|
-
* // readonlyNested.a.b.push(4); // ❌ Error: readonly at all levels
|
|
94
|
-
* // readonlyNested.c.d.e = 'new'; // ❌ Error: readonly at all levels
|
|
95
|
-
* // readonlyNested.a = {}; // ❌ Error: cannot reassign readonly property
|
|
96
|
-
* ```
|
|
97
|
-
*
|
|
98
|
-
* @example Protecting complex state objects
|
|
99
|
-
* ```typescript
|
|
100
|
-
* interface AppState {
|
|
101
|
-
* user: {
|
|
102
|
-
* id: number;
|
|
103
|
-
* profile: {
|
|
104
|
-
* name: string;
|
|
105
|
-
* settings: {
|
|
106
|
-
* theme: string;
|
|
107
|
-
* notifications: boolean[];
|
|
108
|
-
* };
|
|
109
|
-
* };
|
|
110
|
-
* };
|
|
111
|
-
* data: {
|
|
112
|
-
* items: Array<{ id: number; value: string }>;
|
|
113
|
-
* };
|
|
114
|
-
* }
|
|
115
|
-
*
|
|
116
|
-
* class StateManager {
|
|
117
|
-
* private state: AppState = initialState;
|
|
118
|
-
*
|
|
119
|
-
* getState(): DeepReadonly<AppState> {
|
|
120
|
-
* return castDeepReadonly(this.state);
|
|
121
|
-
* }
|
|
122
|
-
*
|
|
123
|
-
* // Mutations only allowed through specific methods
|
|
124
|
-
* updateTheme(theme: string) {
|
|
125
|
-
* this.state.user.profile.settings.theme = theme;
|
|
126
|
-
* }
|
|
127
|
-
* }
|
|
128
|
-
* ```
|
|
129
|
-
*
|
|
130
|
-
* @example Creating immutable API responses
|
|
131
|
-
* ```typescript
|
|
132
|
-
* async function fetchUserData(): Promise<DeepReadonly<UserData>> {
|
|
133
|
-
* const response = await api.get<UserData>('/user');
|
|
134
|
-
*
|
|
135
|
-
* // Process and validate data...
|
|
136
|
-
*
|
|
137
|
-
* // Return as deeply immutable to prevent accidental mutations
|
|
138
|
-
* return castDeepReadonly(response.data);
|
|
139
|
-
* }
|
|
140
|
-
*
|
|
141
|
-
* const userData = await fetchUserData();
|
|
142
|
-
* // userData is fully protected from mutations at any depth
|
|
143
|
-
* // userData.preferences.emails.push('new@email.com'); // ❌ TypeScript Error
|
|
144
|
-
* ```
|
|
145
|
-
*
|
|
146
|
-
* @example Working with Redux or state management
|
|
147
|
-
* ```typescript
|
|
148
|
-
* // Redux reducer example
|
|
149
|
-
* type State = DeepReadonly<AppState>;
|
|
150
|
-
*
|
|
151
|
-
* function reducer(state: State, action: Action): State {
|
|
152
|
-
* switch (action.type) {
|
|
153
|
-
* case 'UPDATE_USER_NAME':
|
|
154
|
-
* // Must create new objects, can't mutate
|
|
155
|
-
* return castDeepReadonly({
|
|
156
|
-
* ...state,
|
|
157
|
-
* user: {
|
|
158
|
-
* ...state.user,
|
|
159
|
-
* profile: {
|
|
160
|
-
* ...state.user.profile,
|
|
161
|
-
* name: action.payload
|
|
162
|
-
* }
|
|
163
|
-
* }
|
|
164
|
-
* });
|
|
165
|
-
* default:
|
|
166
|
-
* return state;
|
|
167
|
-
* }
|
|
168
|
-
* }
|
|
169
|
-
* ```
|
|
170
|
-
*
|
|
171
|
-
* @example Type inference with generics
|
|
172
|
-
* ```typescript
|
|
173
|
-
* function processData<T>(data: T): DeepReadonly<T> {
|
|
174
|
-
* // Perform processing...
|
|
175
|
-
* console.log('Processing:', data);
|
|
176
|
-
*
|
|
177
|
-
* // Return immutable version
|
|
178
|
-
* return castDeepReadonly(data);
|
|
179
|
-
* }
|
|
180
|
-
*
|
|
181
|
-
* const result = processData({ nested: { value: [1, 2, 3] } });
|
|
182
|
-
* // Type of result is DeepReadonly<{ nested: { value: number[] } }>
|
|
183
|
-
* ```
|
|
184
|
-
*
|
|
27
|
+
* @returns The same value with readonly modifiers recursively added to all
|
|
28
|
+
* properties
|
|
185
29
|
* @see castReadonly - For shallow readonly casting
|
|
186
30
|
* @see castDeepMutable - For the opposite operation (use with extreme caution)
|
|
187
31
|
*/
|
|
188
32
|
const castDeepReadonly = (mutable) =>
|
|
189
|
-
// eslint-disable-next-line
|
|
33
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
190
34
|
mutable;
|
|
191
35
|
|
|
192
36
|
export { castDeepReadonly, castReadonly };
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cast-readonly.mjs","sources":["../../src/others/cast-readonly.mts"],"sourcesContent":[null],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"cast-readonly.mjs","sources":["../../src/others/cast-readonly.mts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;;;;;;;;;;;;;AAaG;AACI,MAAM,YAAY,GAAG,CAAK,OAAU,KACzC;AAEF;;;;;;;;;;;;;;;AAeG;AACI,MAAM,gBAAgB,GAAG,CAAK,OAAU;AAC7C;AACA;;;;"}
|
|
@@ -1,98 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Implements the logical implication (if-then) operator.
|
|
3
3
|
*
|
|
4
|
-
* Returns `true` if the antecedent is `false` or the consequent is `true`.
|
|
5
|
-
*
|
|
4
|
+
* Returns `true` if the antecedent is `false` or the consequent is `true`. In
|
|
5
|
+
* logical terms: `antecedent → consequent` is equivalent to `¬antecedent ∨
|
|
6
|
+
* consequent`.
|
|
6
7
|
*
|
|
7
8
|
* **Truth table:**
|
|
9
|
+
*
|
|
8
10
|
* - `true → true` = `true` (valid implication)
|
|
9
11
|
* - `true → false` = `false` (invalid implication)
|
|
10
12
|
* - `false → true` = `true` (vacuously true)
|
|
11
13
|
* - `false → false` = `true` (vacuously true)
|
|
12
14
|
*
|
|
13
15
|
* @param antecedent - The condition (if part)
|
|
14
|
-
* @param consequent - The result that should hold if the condition is true
|
|
16
|
+
* @param consequent - The result that should hold if the condition is true
|
|
17
|
+
* (then part)
|
|
15
18
|
* @returns `true` if the implication holds, `false` otherwise
|
|
16
|
-
*
|
|
17
|
-
* @example Basic truth table demonstration
|
|
18
|
-
* ```typescript
|
|
19
|
-
* ifThen(true, true); // true (if true then true = true)
|
|
20
|
-
* ifThen(true, false); // false (if true then false = false)
|
|
21
|
-
* ifThen(false, true); // true (if false then true = true - vacuously true)
|
|
22
|
-
* ifThen(false, false); // true (if false then false = true - vacuously true)
|
|
23
|
-
* ```
|
|
24
|
-
*
|
|
25
|
-
* @example Validation logic - "if required then must have value"
|
|
26
|
-
* ```typescript
|
|
27
|
-
* function validateField(value: string, isRequired: boolean): boolean {
|
|
28
|
-
* const hasValue = value.trim().length > 0;
|
|
29
|
-
* return ifThen(isRequired, hasValue);
|
|
30
|
-
* }
|
|
31
|
-
*
|
|
32
|
-
* validateField('hello', true); // true (required and has value)
|
|
33
|
-
* validateField('', true); // false (required but no value)
|
|
34
|
-
* validateField('', false); // true (not required, so valid)
|
|
35
|
-
* validateField('hello', false); // true (not required, but has value is fine)
|
|
36
|
-
* ```
|
|
37
|
-
*
|
|
38
|
-
* @example Access control - "if admin then has all permissions"
|
|
39
|
-
* ```typescript
|
|
40
|
-
* function checkPermission(user: User, permission: string): boolean {
|
|
41
|
-
* const isAdmin = user.role === 'admin';
|
|
42
|
-
* const hasPermission = user.permissions.includes(permission);
|
|
43
|
-
*
|
|
44
|
-
* // Admin must have all permissions
|
|
45
|
-
* return ifThen(isAdmin, hasPermission);
|
|
46
|
-
* }
|
|
47
|
-
*
|
|
48
|
-
* const adminUser = { role: 'admin', permissions: ['read', 'write'] };
|
|
49
|
-
* checkPermission(adminUser, 'delete'); // false (admin without delete permission = invalid)
|
|
50
|
-
*
|
|
51
|
-
* const regularUser = { role: 'user', permissions: ['read'] };
|
|
52
|
-
* checkPermission(regularUser, 'delete'); // true (non-admin without permission is valid)
|
|
53
|
-
* ```
|
|
54
|
-
*
|
|
55
|
-
* @example Contract validation - "if premium then features enabled"
|
|
56
|
-
* ```typescript
|
|
57
|
-
* interface Subscription {
|
|
58
|
-
* isPremium: boolean;
|
|
59
|
-
* features: {
|
|
60
|
-
* advancedAnalytics: boolean;
|
|
61
|
-
* unlimitedStorage: boolean;
|
|
62
|
-
* prioritySupport: boolean;
|
|
63
|
-
* };
|
|
64
|
-
* }
|
|
65
|
-
*
|
|
66
|
-
* function validateSubscription(sub: Subscription): boolean {
|
|
67
|
-
* // If premium, then all premium features must be enabled
|
|
68
|
-
* return ifThen(sub.isPremium,
|
|
69
|
-
* sub.features.advancedAnalytics &&
|
|
70
|
-
* sub.features.unlimitedStorage &&
|
|
71
|
-
* sub.features.prioritySupport
|
|
72
|
-
* );
|
|
73
|
-
* }
|
|
74
|
-
* ```
|
|
75
|
-
*
|
|
76
|
-
* @example Chaining multiple implications
|
|
77
|
-
* ```typescript
|
|
78
|
-
* // "If A then B" AND "If B then C"
|
|
79
|
-
* function validateChain(a: boolean, b: boolean, c: boolean): boolean {
|
|
80
|
-
* return ifThen(a, b) && ifThen(b, c);
|
|
81
|
-
* }
|
|
82
|
-
*
|
|
83
|
-
* validateChain(true, true, true); // true (valid chain)
|
|
84
|
-
* validateChain(true, false, true); // false (breaks at first implication)
|
|
85
|
-
* validateChain(false, false, false); // true (vacuously true chain)
|
|
86
|
-
* ```
|
|
87
|
-
*
|
|
88
|
-
* @example Negation patterns
|
|
89
|
-
* ```typescript
|
|
90
|
-
* // "If not expired then valid" is equivalent to "expired OR valid"
|
|
91
|
-
* const isExpired = Date.now() > expiryDate;
|
|
92
|
-
* const isValid = checkValidity();
|
|
93
|
-
* const result = ifThen(!isExpired, isValid);
|
|
94
|
-
* // Same as: isExpired || isValid
|
|
95
|
-
* ```
|
|
96
19
|
*/
|
|
97
20
|
export declare const ifThen: (antecedent: boolean, consequent: boolean) => boolean;
|
|
98
21
|
//# sourceMappingURL=if-then.d.mts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"if-then.d.mts","sourceRoot":"","sources":["../../src/others/if-then.mts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"if-then.d.mts","sourceRoot":"","sources":["../../src/others/if-then.mts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,eAAO,MAAM,MAAM,GAAI,YAAY,OAAO,EAAE,YAAY,OAAO,KAAG,OACvC,CAAC"}
|
package/dist/others/if-then.mjs
CHANGED
|
@@ -1,98 +1,21 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Implements the logical implication (if-then) operator.
|
|
3
3
|
*
|
|
4
|
-
* Returns `true` if the antecedent is `false` or the consequent is `true`.
|
|
5
|
-
*
|
|
4
|
+
* Returns `true` if the antecedent is `false` or the consequent is `true`. In
|
|
5
|
+
* logical terms: `antecedent → consequent` is equivalent to `¬antecedent ∨
|
|
6
|
+
* consequent`.
|
|
6
7
|
*
|
|
7
8
|
* **Truth table:**
|
|
9
|
+
*
|
|
8
10
|
* - `true → true` = `true` (valid implication)
|
|
9
11
|
* - `true → false` = `false` (invalid implication)
|
|
10
12
|
* - `false → true` = `true` (vacuously true)
|
|
11
13
|
* - `false → false` = `true` (vacuously true)
|
|
12
14
|
*
|
|
13
15
|
* @param antecedent - The condition (if part)
|
|
14
|
-
* @param consequent - The result that should hold if the condition is true
|
|
16
|
+
* @param consequent - The result that should hold if the condition is true
|
|
17
|
+
* (then part)
|
|
15
18
|
* @returns `true` if the implication holds, `false` otherwise
|
|
16
|
-
*
|
|
17
|
-
* @example Basic truth table demonstration
|
|
18
|
-
* ```typescript
|
|
19
|
-
* ifThen(true, true); // true (if true then true = true)
|
|
20
|
-
* ifThen(true, false); // false (if true then false = false)
|
|
21
|
-
* ifThen(false, true); // true (if false then true = true - vacuously true)
|
|
22
|
-
* ifThen(false, false); // true (if false then false = true - vacuously true)
|
|
23
|
-
* ```
|
|
24
|
-
*
|
|
25
|
-
* @example Validation logic - "if required then must have value"
|
|
26
|
-
* ```typescript
|
|
27
|
-
* function validateField(value: string, isRequired: boolean): boolean {
|
|
28
|
-
* const hasValue = value.trim().length > 0;
|
|
29
|
-
* return ifThen(isRequired, hasValue);
|
|
30
|
-
* }
|
|
31
|
-
*
|
|
32
|
-
* validateField('hello', true); // true (required and has value)
|
|
33
|
-
* validateField('', true); // false (required but no value)
|
|
34
|
-
* validateField('', false); // true (not required, so valid)
|
|
35
|
-
* validateField('hello', false); // true (not required, but has value is fine)
|
|
36
|
-
* ```
|
|
37
|
-
*
|
|
38
|
-
* @example Access control - "if admin then has all permissions"
|
|
39
|
-
* ```typescript
|
|
40
|
-
* function checkPermission(user: User, permission: string): boolean {
|
|
41
|
-
* const isAdmin = user.role === 'admin';
|
|
42
|
-
* const hasPermission = user.permissions.includes(permission);
|
|
43
|
-
*
|
|
44
|
-
* // Admin must have all permissions
|
|
45
|
-
* return ifThen(isAdmin, hasPermission);
|
|
46
|
-
* }
|
|
47
|
-
*
|
|
48
|
-
* const adminUser = { role: 'admin', permissions: ['read', 'write'] };
|
|
49
|
-
* checkPermission(adminUser, 'delete'); // false (admin without delete permission = invalid)
|
|
50
|
-
*
|
|
51
|
-
* const regularUser = { role: 'user', permissions: ['read'] };
|
|
52
|
-
* checkPermission(regularUser, 'delete'); // true (non-admin without permission is valid)
|
|
53
|
-
* ```
|
|
54
|
-
*
|
|
55
|
-
* @example Contract validation - "if premium then features enabled"
|
|
56
|
-
* ```typescript
|
|
57
|
-
* interface Subscription {
|
|
58
|
-
* isPremium: boolean;
|
|
59
|
-
* features: {
|
|
60
|
-
* advancedAnalytics: boolean;
|
|
61
|
-
* unlimitedStorage: boolean;
|
|
62
|
-
* prioritySupport: boolean;
|
|
63
|
-
* };
|
|
64
|
-
* }
|
|
65
|
-
*
|
|
66
|
-
* function validateSubscription(sub: Subscription): boolean {
|
|
67
|
-
* // If premium, then all premium features must be enabled
|
|
68
|
-
* return ifThen(sub.isPremium,
|
|
69
|
-
* sub.features.advancedAnalytics &&
|
|
70
|
-
* sub.features.unlimitedStorage &&
|
|
71
|
-
* sub.features.prioritySupport
|
|
72
|
-
* );
|
|
73
|
-
* }
|
|
74
|
-
* ```
|
|
75
|
-
*
|
|
76
|
-
* @example Chaining multiple implications
|
|
77
|
-
* ```typescript
|
|
78
|
-
* // "If A then B" AND "If B then C"
|
|
79
|
-
* function validateChain(a: boolean, b: boolean, c: boolean): boolean {
|
|
80
|
-
* return ifThen(a, b) && ifThen(b, c);
|
|
81
|
-
* }
|
|
82
|
-
*
|
|
83
|
-
* validateChain(true, true, true); // true (valid chain)
|
|
84
|
-
* validateChain(true, false, true); // false (breaks at first implication)
|
|
85
|
-
* validateChain(false, false, false); // true (vacuously true chain)
|
|
86
|
-
* ```
|
|
87
|
-
*
|
|
88
|
-
* @example Negation patterns
|
|
89
|
-
* ```typescript
|
|
90
|
-
* // "If not expired then valid" is equivalent to "expired OR valid"
|
|
91
|
-
* const isExpired = Date.now() > expiryDate;
|
|
92
|
-
* const isValid = checkValidity();
|
|
93
|
-
* const result = ifThen(!isExpired, isValid);
|
|
94
|
-
* // Same as: isExpired || isValid
|
|
95
|
-
* ```
|
|
96
19
|
*/
|
|
97
20
|
const ifThen = (antecedent, consequent) => !antecedent || consequent;
|
|
98
21
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"if-then.mjs","sources":["../../src/others/if-then.mts"],"sourcesContent":[null],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"if-then.mjs","sources":["../../src/others/if-then.mts"],"sourcesContent":[null],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;AAkBG;AACI,MAAM,MAAM,GAAG,CAAC,UAAmB,EAAE,UAAmB,KAC7D,CAAC,UAAU,IAAI;;;;"}
|