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
package/src/json/json.mts
CHANGED
|
@@ -7,57 +7,55 @@ import { castMutable, unknownToString } from '../others/index.mjs';
|
|
|
7
7
|
* A collection of type-safe JSON utility functions that provide safe parsing,
|
|
8
8
|
* stringification, and manipulation of JSON data. All functions return `Result`
|
|
9
9
|
* types to handle errors without throwing exceptions.
|
|
10
|
-
*
|
|
11
|
-
* @example Basic usage
|
|
12
|
-
* ```typescript
|
|
13
|
-
* import { Json, Result } from 'ts-data-forge';
|
|
14
|
-
*
|
|
15
|
-
* // Parse JSON safely
|
|
16
|
-
* const parseResult = Json.parse('{"name": "Alice", "age": 30}');
|
|
17
|
-
* if (Result.isOk(parseResult)) {
|
|
18
|
-
* console.log(parseResult.value); // { name: 'Alice', age: 30 }
|
|
19
|
-
* }
|
|
20
|
-
*
|
|
21
|
-
* // Stringify with error handling
|
|
22
|
-
* const stringifyResult = Json.stringify({ name: 'Bob', age: 25 });
|
|
23
|
-
* if (Result.isOk(stringifyResult)) {
|
|
24
|
-
* console.log(stringifyResult.value); // '{"name":"Bob","age":25}'
|
|
25
|
-
* }
|
|
26
|
-
* ```
|
|
27
10
|
*/
|
|
28
11
|
export namespace Json {
|
|
29
12
|
/**
|
|
30
|
-
* Safely converts a JSON string into a JavaScript value without throwing
|
|
31
|
-
*
|
|
32
|
-
* This function provides type-safe JSON parsing by wrapping the native `JSON.parse`
|
|
33
|
-
* in a `Result` type, allowing you to handle parsing errors gracefully without
|
|
34
|
-
* try-catch blocks.
|
|
35
|
-
*
|
|
36
|
-
* @param text - A valid JSON string to parse. Can contain any valid JSON data type:
|
|
37
|
-
* primitives (string, number, boolean, null), arrays, or objects.
|
|
38
|
-
* @param reviver - Optional function that transforms parsed values. Called for each
|
|
39
|
-
* key-value pair in the JSON. The function receives the key name and parsed value,
|
|
40
|
-
* and should return the transformed value. For nested objects, inner objects are
|
|
41
|
-
* processed before outer objects.
|
|
42
|
-
* @returns A `Result<JsonValue, string>` containing:
|
|
43
|
-
* - On success: `Result.ok(parsedValue)` where `parsedValue` is the parsed JSON
|
|
44
|
-
* - On failure: `Result.err(errorMessage)` where `errorMessage` describes the parsing error
|
|
13
|
+
* Safely converts a JSON string into a JavaScript value without throwing
|
|
14
|
+
* exceptions.
|
|
45
15
|
*
|
|
46
|
-
*
|
|
47
|
-
*
|
|
48
|
-
*
|
|
49
|
-
* if (Result.isOk(result)) {
|
|
50
|
-
* console.log(result.value.name); // 'John'
|
|
51
|
-
* }
|
|
52
|
-
* ```
|
|
16
|
+
* This function provides type-safe JSON parsing by wrapping the native
|
|
17
|
+
* `JSON.parse` in a `Result` type, allowing you to handle parsing errors
|
|
18
|
+
* gracefully without try-catch blocks.
|
|
53
19
|
*
|
|
54
20
|
* @example
|
|
55
|
-
*
|
|
56
|
-
*
|
|
57
|
-
*
|
|
58
|
-
*
|
|
21
|
+
*
|
|
22
|
+
* ```ts
|
|
23
|
+
* const validJson = '{"name": "Alice", "age": 30}';
|
|
24
|
+
* const invalidJson = '{invalid json}';
|
|
25
|
+
*
|
|
26
|
+
* const parsed = Json.parse(validJson);
|
|
27
|
+
* const failed = Json.parse(invalidJson);
|
|
28
|
+
*
|
|
29
|
+
* assert.ok(Result.isOk(parsed));
|
|
30
|
+
* if (Result.isOk(parsed)) {
|
|
31
|
+
* assert.deepStrictEqual(parsed.value, { name: 'Alice', age: 30 });
|
|
59
32
|
* }
|
|
33
|
+
*
|
|
34
|
+
* assert.ok(Result.isErr(failed));
|
|
35
|
+
*
|
|
36
|
+
* // With reviver
|
|
37
|
+
* const jsonWithDate = '{"created": "2024-01-01T00:00:00.000Z"}';
|
|
38
|
+
* const withReviver = Json.parse(jsonWithDate, (key, value) => {
|
|
39
|
+
* if (key === 'created' && typeof value === 'string') {
|
|
40
|
+
* return new Date(value);
|
|
41
|
+
* }
|
|
42
|
+
* return value;
|
|
43
|
+
* });
|
|
44
|
+
*
|
|
45
|
+
* assert.ok(Result.isOk(withReviver));
|
|
60
46
|
* ```
|
|
47
|
+
*
|
|
48
|
+
* @param text - A valid JSON string to parse. Can contain any valid JSON data
|
|
49
|
+
* type: primitives (string, number, boolean, null), arrays, or objects.
|
|
50
|
+
* @param reviver - Optional function that transforms parsed values. Called
|
|
51
|
+
* for each key-value pair in the JSON. The function receives the key name
|
|
52
|
+
* and parsed value, and should return the transformed value. For nested
|
|
53
|
+
* objects, inner objects are processed before outer objects.
|
|
54
|
+
* @returns A `Result<JsonValue, string>` containing:
|
|
55
|
+
*
|
|
56
|
+
* - On success: `Result.ok(parsedValue)` where `parsedValue` is the parsed JSON
|
|
57
|
+
* - On failure: `Result.err(errorMessage)` where `errorMessage` describes the
|
|
58
|
+
* parsing error
|
|
61
59
|
*/
|
|
62
60
|
export const parse = (
|
|
63
61
|
text: string,
|
|
@@ -67,7 +65,7 @@ export namespace Json {
|
|
|
67
65
|
return Result.ok(
|
|
68
66
|
JSON.parse(
|
|
69
67
|
text,
|
|
70
|
-
// eslint-disable-next-line
|
|
68
|
+
// eslint-disable-next-line total-functions/no-unsafe-type-assertion
|
|
71
69
|
reviver as (this: unknown, key: string, value: unknown) => unknown,
|
|
72
70
|
),
|
|
73
71
|
);
|
|
@@ -78,44 +76,61 @@ export namespace Json {
|
|
|
78
76
|
};
|
|
79
77
|
|
|
80
78
|
/**
|
|
81
|
-
* Safely converts a JavaScript value to a JSON string without throwing
|
|
82
|
-
*
|
|
83
|
-
*
|
|
84
|
-
*
|
|
85
|
-
*
|
|
86
|
-
*
|
|
87
|
-
*
|
|
88
|
-
* accepts: primitives, objects, arrays. Non-serializable values (functions, undefined,
|
|
89
|
-
* symbols) will be omitted or converted to null according to JSON.stringify behavior.
|
|
90
|
-
* @param replacer - Optional function that transforms values during serialization.
|
|
91
|
-
* Called for each key-value pair. Should return the value to be serialized, or
|
|
92
|
-
* undefined to omit the property from the result.
|
|
93
|
-
* @param space - Optional parameter for formatting the output JSON:
|
|
94
|
-
* - Number (1-10): Number of spaces to indent each level
|
|
95
|
-
* - String: String to use for indentation (first 10 characters)
|
|
96
|
-
* - undefined/null: No formatting (compact output)
|
|
97
|
-
* @returns A `Result<string, string>` containing:
|
|
98
|
-
* - On success: `Result.ok(jsonString)` where `jsonString` is the serialized JSON
|
|
99
|
-
* - On failure: `Result.err(errorMessage)` where `errorMessage` describes the error
|
|
79
|
+
* Safely converts a JavaScript value to a JSON string without throwing
|
|
80
|
+
* exceptions.
|
|
81
|
+
*
|
|
82
|
+
* This function provides type-safe JSON stringification by wrapping the
|
|
83
|
+
* native `JSON.stringify` in a `Result` type, allowing you to handle
|
|
84
|
+
* serialization errors gracefully (such as circular references or BigInt
|
|
85
|
+
* values).
|
|
100
86
|
*
|
|
101
87
|
* @example
|
|
102
|
-
*
|
|
103
|
-
*
|
|
104
|
-
* const
|
|
105
|
-
*
|
|
106
|
-
*
|
|
88
|
+
*
|
|
89
|
+
* ```ts
|
|
90
|
+
* const data = { name: 'Bob', age: 25, active: true };
|
|
91
|
+
*
|
|
92
|
+
* // Basic stringify
|
|
93
|
+
* const basic = Json.stringify(data);
|
|
94
|
+
* assert.ok(Result.isOk(basic));
|
|
95
|
+
* if (Result.isOk(basic)) {
|
|
96
|
+
* assert(basic.value === '{"name":"Bob","age":25,"active":true}');
|
|
107
97
|
* }
|
|
108
|
-
* ```
|
|
109
98
|
*
|
|
110
|
-
*
|
|
111
|
-
*
|
|
112
|
-
*
|
|
113
|
-
*
|
|
114
|
-
*
|
|
115
|
-
*
|
|
116
|
-
*
|
|
99
|
+
* // With formatting
|
|
100
|
+
* const formatted = Json.stringify(data, undefined, 2);
|
|
101
|
+
* assert.ok(Result.isOk(formatted));
|
|
102
|
+
*
|
|
103
|
+
* // With replacer
|
|
104
|
+
* const filtered = Json.stringify(data, (key, value) => {
|
|
105
|
+
* if (key === 'age') return undefined; // omit age field
|
|
106
|
+
* return value;
|
|
107
|
+
* });
|
|
108
|
+
*
|
|
109
|
+
* assert.ok(Result.isOk(filtered));
|
|
110
|
+
* if (Result.isOk(filtered)) {
|
|
111
|
+
* assert.ok(!filtered.value.includes('age'));
|
|
117
112
|
* }
|
|
118
113
|
* ```
|
|
114
|
+
*
|
|
115
|
+
* @param value - The JavaScript value to serialize. Can be any value that
|
|
116
|
+
* JSON.stringify accepts: primitives, objects, arrays. Non-serializable
|
|
117
|
+
* values (functions, undefined, symbols) will be omitted or converted to
|
|
118
|
+
* null according to JSON.stringify behavior.
|
|
119
|
+
* @param replacer - Optional function that transforms values during
|
|
120
|
+
* serialization. Called for each key-value pair. Should return the value to
|
|
121
|
+
* be serialized, or undefined to omit the property from the result.
|
|
122
|
+
* @param space - Optional parameter for formatting the output JSON:
|
|
123
|
+
*
|
|
124
|
+
* - Number (1-10): Number of spaces to indent each level
|
|
125
|
+
* - String: String to use for indentation (first 10 characters)
|
|
126
|
+
* - Undefined/null: No formatting (compact output)
|
|
127
|
+
*
|
|
128
|
+
* @returns A `Result<string, string>` containing:
|
|
129
|
+
*
|
|
130
|
+
* - On success: `Result.ok(jsonString)` where `jsonString` is the serialized
|
|
131
|
+
* JSON
|
|
132
|
+
* - On failure: `Result.err(errorMessage)` where `errorMessage` describes the
|
|
133
|
+
* error
|
|
119
134
|
*/
|
|
120
135
|
export const stringify = (
|
|
121
136
|
value: unknown,
|
|
@@ -131,40 +146,62 @@ export namespace Json {
|
|
|
131
146
|
};
|
|
132
147
|
|
|
133
148
|
/**
|
|
134
|
-
* Safely converts a JavaScript value to a JSON string, including only the
|
|
149
|
+
* Safely converts a JavaScript value to a JSON string, including only the
|
|
150
|
+
* specified properties.
|
|
135
151
|
*
|
|
136
|
-
* This function provides selective serialization by allowing you to specify
|
|
137
|
-
* object properties should be included in the resulting JSON.
|
|
138
|
-
* filtered or minimal representations of objects,
|
|
139
|
-
*
|
|
140
|
-
* @param value - The JavaScript value to serialize. While any value is accepted,
|
|
141
|
-
* the property filtering only applies to objects and nested objects.
|
|
142
|
-
* @param propertiesToBeSelected - Optional array of property names (strings) and array
|
|
143
|
-
* indices (numbers) to include in the serialization. If provided, only these properties
|
|
144
|
-
* will appear in the output JSON. If undefined, all properties are included.
|
|
145
|
-
* @param space - Optional formatting parameter:
|
|
146
|
-
* - Number (1-10): Number of spaces to indent each level
|
|
147
|
-
* - String: String to use for indentation (first 10 characters)
|
|
148
|
-
* - undefined/null: No formatting (compact output)
|
|
149
|
-
* @returns A `Result<string, string>` containing:
|
|
150
|
-
* - On success: `Result.ok(jsonString)` with only selected properties
|
|
151
|
-
* - On failure: `Result.err(errorMessage)` describing the serialization error
|
|
152
|
+
* This function provides selective serialization by allowing you to specify
|
|
153
|
+
* exactly which object properties should be included in the resulting JSON.
|
|
154
|
+
* It's useful for creating filtered or minimal representations of objects,
|
|
155
|
+
* such as for API responses or logging.
|
|
152
156
|
*
|
|
153
157
|
* @example
|
|
154
|
-
*
|
|
158
|
+
*
|
|
159
|
+
* ```ts
|
|
155
160
|
* const user = {
|
|
156
161
|
* id: 1,
|
|
157
|
-
* name: '
|
|
158
|
-
* email: '
|
|
159
|
-
* password: 'secret123'
|
|
162
|
+
* name: 'Charlie',
|
|
163
|
+
* email: 'charlie@example.com',
|
|
164
|
+
* password: 'secret123',
|
|
165
|
+
* role: 'admin',
|
|
160
166
|
* };
|
|
161
167
|
*
|
|
162
|
-
*
|
|
163
|
-
*
|
|
164
|
-
*
|
|
165
|
-
*
|
|
168
|
+
* // Select only safe properties to serialize
|
|
169
|
+
* const safeJson = Json.stringifySelected(user, ['id', 'name', 'role']);
|
|
170
|
+
*
|
|
171
|
+
* assert.ok(Result.isOk(safeJson));
|
|
172
|
+
* if (Result.isOk(safeJson)) {
|
|
173
|
+
* const parsed: unknown = JSON.parse(safeJson.value);
|
|
174
|
+
* assert.deepStrictEqual(parsed, {
|
|
175
|
+
* id: 1,
|
|
176
|
+
* name: 'Charlie',
|
|
177
|
+
* role: 'admin',
|
|
178
|
+
* });
|
|
179
|
+
* assert.ok(!safeJson.value.includes('password'));
|
|
180
|
+
* assert.ok(!safeJson.value.includes('email'));
|
|
166
181
|
* }
|
|
182
|
+
*
|
|
183
|
+
* // With formatting
|
|
184
|
+
* const formatted = Json.stringifySelected(user, ['id', 'name'], 2);
|
|
185
|
+
* assert.ok(Result.isOk(formatted));
|
|
167
186
|
* ```
|
|
187
|
+
*
|
|
188
|
+
* @param value - The JavaScript value to serialize. While any value is
|
|
189
|
+
* accepted, the property filtering only applies to objects and nested
|
|
190
|
+
* objects.
|
|
191
|
+
* @param propertiesToBeSelected - Optional array of property names (strings)
|
|
192
|
+
* and array indices (numbers) to include in the serialization. If provided,
|
|
193
|
+
* only these properties will appear in the output JSON. If undefined, all
|
|
194
|
+
* properties are included.
|
|
195
|
+
* @param space - Optional formatting parameter:
|
|
196
|
+
*
|
|
197
|
+
* - Number (1-10): Number of spaces to indent each level
|
|
198
|
+
* - String: String to use for indentation (first 10 characters)
|
|
199
|
+
* - Undefined/null: No formatting (compact output)
|
|
200
|
+
*
|
|
201
|
+
* @returns A `Result<string, string>` containing:
|
|
202
|
+
*
|
|
203
|
+
* - On success: `Result.ok(jsonString)` with only selected properties
|
|
204
|
+
* - On failure: `Result.err(errorMessage)` describing the serialization error
|
|
168
205
|
*/
|
|
169
206
|
export const stringifySelected = (
|
|
170
207
|
value: unknown,
|
|
@@ -182,38 +219,71 @@ export namespace Json {
|
|
|
182
219
|
};
|
|
183
220
|
|
|
184
221
|
/**
|
|
185
|
-
* Safely converts a JavaScript record to a JSON string with keys sorted
|
|
222
|
+
* Safely converts a JavaScript record to a JSON string with keys sorted
|
|
223
|
+
* alphabetically at all levels.
|
|
186
224
|
*
|
|
187
|
-
* This function creates deterministic JSON output by ensuring that object
|
|
188
|
-
* alphabetical order at every level of nesting. This is
|
|
189
|
-
* consistent output for comparison, hashing,
|
|
190
|
-
*
|
|
191
|
-
*
|
|
192
|
-
* @param value - An object (`UnknownRecord`) to serialize. Must be a plain object
|
|
193
|
-
* (not an array, primitive, or null). Nested objects and arrays within the object
|
|
194
|
-
* will also have their keys sorted alphabetically.
|
|
195
|
-
* @param space - Optional formatting parameter:
|
|
196
|
-
* - Number (1-10): Number of spaces to indent each level
|
|
197
|
-
* - String: String to use for indentation (first 10 characters)
|
|
198
|
-
* - undefined/null: No formatting (compact output)
|
|
199
|
-
* @returns A `Result<string, string>` containing:
|
|
200
|
-
* - On success: `Result.ok(jsonString)` with all object keys sorted alphabetically
|
|
201
|
-
* - On failure: `Result.err(errorMessage)` describing the serialization error
|
|
225
|
+
* This function creates deterministic JSON output by ensuring that object
|
|
226
|
+
* keys appear in alphabetical order at every level of nesting. This is
|
|
227
|
+
* particularly useful for creating consistent output for comparison, hashing,
|
|
228
|
+
* caching, or when you need reproducible JSON representations across
|
|
229
|
+
* different JavaScript engines or runs.
|
|
202
230
|
*
|
|
203
231
|
* @example
|
|
204
|
-
*
|
|
205
|
-
*
|
|
206
|
-
*
|
|
207
|
-
*
|
|
208
|
-
*
|
|
232
|
+
*
|
|
233
|
+
* ```ts
|
|
234
|
+
* const unorderedData = {
|
|
235
|
+
* zebra: 1,
|
|
236
|
+
* apple: 2,
|
|
237
|
+
* mango: 3,
|
|
238
|
+
* nested: {
|
|
239
|
+
* zulu: 'z',
|
|
240
|
+
* alpha: 'a',
|
|
241
|
+
* beta: 'b',
|
|
242
|
+
* },
|
|
209
243
|
* };
|
|
210
244
|
*
|
|
211
|
-
*
|
|
245
|
+
* // Keys will be sorted alphabetically at all levels
|
|
246
|
+
* const sorted = Json.stringifySortedKey(unorderedData);
|
|
247
|
+
*
|
|
248
|
+
* assert.ok(Result.isOk(sorted));
|
|
212
249
|
* if (Result.isOk(sorted)) {
|
|
213
|
-
*
|
|
214
|
-
*
|
|
250
|
+
* // Keys should appear in alphabetical order
|
|
251
|
+
* const expected =
|
|
252
|
+
* '{"apple":2,"mango":3,"nested":{"alpha":"a","beta":"b","zulu":"z"},"zebra":1}';
|
|
253
|
+
* assert(sorted.value === expected);
|
|
254
|
+
* }
|
|
255
|
+
*
|
|
256
|
+
* // With formatting
|
|
257
|
+
* const formatted = Json.stringifySortedKey(unorderedData, 2);
|
|
258
|
+
* assert.ok(Result.isOk(formatted));
|
|
259
|
+
* if (Result.isOk(formatted)) {
|
|
260
|
+
* // Check that keys are in order (first key should be "apple")
|
|
261
|
+
* assert.ok(
|
|
262
|
+
* formatted.value.indexOf('"apple"') < formatted.value.indexOf('"mango"'),
|
|
263
|
+
* );
|
|
264
|
+
* assert.ok(
|
|
265
|
+
* formatted.value.indexOf('"mango"') < formatted.value.indexOf('"nested"'),
|
|
266
|
+
* );
|
|
267
|
+
* assert.ok(
|
|
268
|
+
* formatted.value.indexOf('"nested"') < formatted.value.indexOf('"zebra"'),
|
|
269
|
+
* );
|
|
215
270
|
* }
|
|
216
271
|
* ```
|
|
272
|
+
*
|
|
273
|
+
* @param value - An object (`UnknownRecord`) to serialize. Must be a plain
|
|
274
|
+
* object (not an array, primitive, or null). Nested objects and arrays
|
|
275
|
+
* within the object will also have their keys sorted alphabetically.
|
|
276
|
+
* @param space - Optional formatting parameter:
|
|
277
|
+
*
|
|
278
|
+
* - Number (1-10): Number of spaces to indent each level
|
|
279
|
+
* - String: String to use for indentation (first 10 characters)
|
|
280
|
+
* - Undefined/null: No formatting (compact output)
|
|
281
|
+
*
|
|
282
|
+
* @returns A `Result<string, string>` containing:
|
|
283
|
+
*
|
|
284
|
+
* - On success: `Result.ok(jsonString)` with all object keys sorted
|
|
285
|
+
* alphabetically
|
|
286
|
+
* - On failure: `Result.err(errorMessage)` describing the serialization error
|
|
217
287
|
*/
|
|
218
288
|
export const stringifySortedKey = (
|
|
219
289
|
value: UnknownRecord,
|
|
@@ -228,16 +298,15 @@ export namespace Json {
|
|
|
228
298
|
}
|
|
229
299
|
|
|
230
300
|
/**
|
|
301
|
+
* @param obj - The record to extract keys from. Must be a plain object.
|
|
302
|
+
* @param mut_keys - A mutable array to accumulate the collected keys. This
|
|
303
|
+
* array will be modified in-place by the function for performance reasons.
|
|
231
304
|
* @internal
|
|
232
305
|
* Recursively collects all property keys from a nested object structure.
|
|
233
306
|
*
|
|
234
307
|
* This helper function traverses an object and its nested objects and arrays,
|
|
235
308
|
* collecting all string keys found at any level of nesting. The function mutates
|
|
236
309
|
* the provided keys array for performance reasons.
|
|
237
|
-
*
|
|
238
|
-
* @param obj - The record to extract keys from. Must be a plain object.
|
|
239
|
-
* @param mut_keys - A mutable array to accumulate the collected keys. This array
|
|
240
|
-
* will be modified in-place by the function for performance reasons.
|
|
241
310
|
*/
|
|
242
311
|
const keysDeepImpl = (
|
|
243
312
|
obj: UnknownRecord,
|
|
@@ -261,17 +330,16 @@ const keysDeepImpl = (
|
|
|
261
330
|
};
|
|
262
331
|
|
|
263
332
|
/**
|
|
333
|
+
* @param obj - The record to extract keys from. Must be a plain object.
|
|
334
|
+
* @returns A readonly array of all string keys found in the object and its
|
|
335
|
+
* nested objects/arrays. May contain duplicates if the same key appears at
|
|
336
|
+
* multiple levels.
|
|
264
337
|
* @internal
|
|
265
338
|
* Extracts all property keys from a nested object structure into a flat array.
|
|
266
339
|
*
|
|
267
340
|
* This function serves as a safe wrapper around `keysDeepImpl`, creating a new
|
|
268
341
|
* mutable array and passing it to the recursive implementation. The result
|
|
269
342
|
* contains all keys found at any level of nesting within the input object.
|
|
270
|
-
*
|
|
271
|
-
* @param obj - The record to extract keys from. Must be a plain object.
|
|
272
|
-
* @returns A readonly array of all string keys found in the object and its
|
|
273
|
-
* nested objects/arrays. May contain duplicates if the same key appears
|
|
274
|
-
* at multiple levels.
|
|
275
343
|
*/
|
|
276
344
|
const keysDeep = (obj: UnknownRecord): readonly string[] => {
|
|
277
345
|
const mut_keys: string[] = [];
|
package/src/json/json.test.mts
CHANGED
|
@@ -216,11 +216,10 @@ describe('stringify', () => {
|
|
|
216
216
|
expect(Json.stringify(Symbol('test'))).toStrictEqual(Result.ok(undefined));
|
|
217
217
|
expect(Json.stringify(() => {})).toStrictEqual(Result.ok(undefined));
|
|
218
218
|
// BigInt should cause an error
|
|
219
|
-
expect(Result.isErr(Json.stringify(
|
|
219
|
+
expect(Result.isErr(Json.stringify(123n))).toBe(true);
|
|
220
220
|
});
|
|
221
221
|
|
|
222
222
|
test('should handle circular references', () => {
|
|
223
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
224
223
|
const mut_obj: any = { a: 1 };
|
|
225
224
|
// eslint-disable-next-line @typescript-eslint/no-unsafe-assignment, @typescript-eslint/no-unsafe-member-access
|
|
226
225
|
mut_obj.circular = mut_obj;
|
|
@@ -242,7 +241,6 @@ describe('stringify', () => {
|
|
|
242
241
|
});
|
|
243
242
|
|
|
244
243
|
test('should not throw errors', () => {
|
|
245
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
246
244
|
const mut_circularArray: any[] = [];
|
|
247
245
|
mut_circularArray.push(mut_circularArray);
|
|
248
246
|
|