ts-data-forge 14.7.1 → 14.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (287) hide show
  1. package/README.md +22 -34
  2. package/dist/array/impl/array-utils-creation.d.mts +3 -3
  3. package/dist/array/impl/array-utils-creation.d.mts.map +1 -1
  4. package/dist/array/impl/array-utils-creation.mjs.map +1 -1
  5. package/dist/array/impl/array-utils-element-access.d.mts +2 -2
  6. package/dist/array/impl/array-utils-element-access.d.mts.map +1 -1
  7. package/dist/array/impl/array-utils-element-access.mjs +1 -1
  8. package/dist/array/impl/array-utils-element-access.mjs.map +1 -1
  9. package/dist/array/impl/array-utils-iterators.d.mts +1 -1
  10. package/dist/array/impl/array-utils-iterators.d.mts.map +1 -1
  11. package/dist/array/impl/array-utils-length-bounded-array-cast.d.mts +1 -1
  12. package/dist/array/impl/array-utils-length-bounded-array-cast.d.mts.map +1 -1
  13. package/dist/array/impl/array-utils-length-bounded-array-guard.d.mts +9 -9
  14. package/dist/array/impl/array-utils-length-bounded-array-guard.d.mts.map +1 -1
  15. package/dist/array/impl/array-utils-length-bounded-array-guard.mjs +1 -1
  16. package/dist/array/impl/array-utils-length-bounded-array-guard.mjs.map +1 -1
  17. package/dist/array/impl/array-utils-length-bounded-tuple-cast.d.mts +2 -2
  18. package/dist/array/impl/array-utils-length-bounded-tuple-cast.d.mts.map +1 -1
  19. package/dist/array/impl/array-utils-length-bounded-tuple-guard.d.mts +3 -3
  20. package/dist/array/impl/array-utils-length-bounded-tuple-guard.d.mts.map +1 -1
  21. package/dist/array/impl/array-utils-length-bounded-tuple-guard.mjs +1 -1
  22. package/dist/array/impl/array-utils-length-bounded-tuple-guard.mjs.map +1 -1
  23. package/dist/array/impl/array-utils-modification.d.mts +2 -2
  24. package/dist/array/impl/array-utils-modification.d.mts.map +1 -1
  25. package/dist/array/impl/array-utils-reducing-value.d.mts +2 -2
  26. package/dist/array/impl/array-utils-reducing-value.d.mts.map +1 -1
  27. package/dist/array/impl/array-utils-reducing-value.mjs +3 -4
  28. package/dist/array/impl/array-utils-reducing-value.mjs.map +1 -1
  29. package/dist/array/impl/array-utils-search.d.mts +1 -1
  30. package/dist/array/impl/array-utils-search.d.mts.map +1 -1
  31. package/dist/array/impl/array-utils-set-op.d.mts +1 -1
  32. package/dist/array/impl/array-utils-set-op.d.mts.map +1 -1
  33. package/dist/array/impl/array-utils-size.d.mts +2 -2
  34. package/dist/array/impl/array-utils-size.d.mts.map +1 -1
  35. package/dist/array/impl/array-utils-slice-clamped.d.mts +1 -1
  36. package/dist/array/impl/array-utils-slice-clamped.d.mts.map +1 -1
  37. package/dist/array/impl/array-utils-slicing.d.mts +2 -2
  38. package/dist/array/impl/array-utils-slicing.d.mts.map +1 -1
  39. package/dist/array/impl/array-utils-transformation.d.mts +2 -2
  40. package/dist/array/impl/array-utils-transformation.d.mts.map +1 -1
  41. package/dist/array/impl/array-utils-transformation.mjs +6 -3
  42. package/dist/array/impl/array-utils-transformation.mjs.map +1 -1
  43. package/dist/array/impl/array-utils-validation.d.mts +2 -2
  44. package/dist/array/impl/array-utils-validation.d.mts.map +1 -1
  45. package/dist/collections/imap-mapped.d.mts +2 -2
  46. package/dist/collections/imap-mapped.d.mts.map +1 -1
  47. package/dist/collections/imap-mapped.mjs +10 -7
  48. package/dist/collections/imap-mapped.mjs.map +1 -1
  49. package/dist/collections/imap.d.mts +2 -2
  50. package/dist/collections/imap.d.mts.map +1 -1
  51. package/dist/collections/imap.mjs +10 -7
  52. package/dist/collections/imap.mjs.map +1 -1
  53. package/dist/collections/iset-mapped.d.mts +2 -2
  54. package/dist/collections/iset-mapped.d.mts.map +1 -1
  55. package/dist/collections/iset-mapped.mjs +6 -3
  56. package/dist/collections/iset-mapped.mjs.map +1 -1
  57. package/dist/collections/iset.d.mts +2 -2
  58. package/dist/collections/iset.d.mts.map +1 -1
  59. package/dist/collections/iset.mjs +5 -5
  60. package/dist/collections/iset.mjs.map +1 -1
  61. package/dist/collections/queue.d.mts +1 -1
  62. package/dist/collections/queue.d.mts.map +1 -1
  63. package/dist/collections/stack.d.mts +1 -1
  64. package/dist/collections/stack.d.mts.map +1 -1
  65. package/dist/functional/index.d.mts +2 -2
  66. package/dist/functional/index.d.mts.map +1 -1
  67. package/dist/functional/index.mjs +1 -1
  68. package/dist/functional/index.mjs.map +1 -1
  69. package/dist/guard/is-non-empty-string.d.mts +1 -1
  70. package/dist/guard/is-non-empty-string.d.mts.map +1 -1
  71. package/dist/guard/is-primitive.d.mts +1 -1
  72. package/dist/guard/is-primitive.d.mts.map +1 -1
  73. package/dist/guard/is-type.d.mts +1 -1
  74. package/dist/guard/is-type.d.mts.map +1 -1
  75. package/dist/iterator/range.d.mts +5 -4
  76. package/dist/iterator/range.d.mts.map +1 -1
  77. package/dist/iterator/range.mjs.map +1 -1
  78. package/dist/json/json.d.mts +29 -32
  79. package/dist/json/json.d.mts.map +1 -1
  80. package/dist/json/json.mjs +1 -4
  81. package/dist/json/json.mjs.map +1 -1
  82. package/dist/number/branded-types/finite-number.d.mts +1 -1
  83. package/dist/number/branded-types/finite-number.d.mts.map +1 -1
  84. package/dist/number/branded-types/int.d.mts +2 -2
  85. package/dist/number/branded-types/int.d.mts.map +1 -1
  86. package/dist/number/branded-types/int16.d.mts +1 -1
  87. package/dist/number/branded-types/int16.d.mts.map +1 -1
  88. package/dist/number/branded-types/int32.d.mts +1 -1
  89. package/dist/number/branded-types/int32.d.mts.map +1 -1
  90. package/dist/number/branded-types/negative-finite-number.d.mts +1 -1
  91. package/dist/number/branded-types/negative-finite-number.d.mts.map +1 -1
  92. package/dist/number/branded-types/negative-int.d.mts +1 -1
  93. package/dist/number/branded-types/negative-int.d.mts.map +1 -1
  94. package/dist/number/branded-types/negative-safe-int.d.mts +1 -1
  95. package/dist/number/branded-types/negative-safe-int.d.mts.map +1 -1
  96. package/dist/number/branded-types/non-negative-finite-number.d.mts +1 -1
  97. package/dist/number/branded-types/non-negative-finite-number.d.mts.map +1 -1
  98. package/dist/number/branded-types/non-negative-int16.d.mts +1 -1
  99. package/dist/number/branded-types/non-negative-int16.d.mts.map +1 -1
  100. package/dist/number/branded-types/non-negative-int32.d.mts +1 -1
  101. package/dist/number/branded-types/non-negative-int32.d.mts.map +1 -1
  102. package/dist/number/branded-types/non-positive-finite-number.d.mts +1 -1
  103. package/dist/number/branded-types/non-positive-finite-number.d.mts.map +1 -1
  104. package/dist/number/branded-types/non-positive-int.d.mts +1 -1
  105. package/dist/number/branded-types/non-positive-int.d.mts.map +1 -1
  106. package/dist/number/branded-types/non-positive-safe-int.d.mts +1 -1
  107. package/dist/number/branded-types/non-positive-safe-int.d.mts.map +1 -1
  108. package/dist/number/branded-types/non-zero-finite-number.d.mts +1 -1
  109. package/dist/number/branded-types/non-zero-finite-number.d.mts.map +1 -1
  110. package/dist/number/branded-types/non-zero-int.d.mts +1 -1
  111. package/dist/number/branded-types/non-zero-int.d.mts.map +1 -1
  112. package/dist/number/branded-types/non-zero-int16.d.mts +1 -1
  113. package/dist/number/branded-types/non-zero-int16.d.mts.map +1 -1
  114. package/dist/number/branded-types/non-zero-int32.d.mts +1 -1
  115. package/dist/number/branded-types/non-zero-int32.d.mts.map +1 -1
  116. package/dist/number/branded-types/non-zero-safe-int.d.mts +1 -1
  117. package/dist/number/branded-types/non-zero-safe-int.d.mts.map +1 -1
  118. package/dist/number/branded-types/non-zero-uint16.d.mts +1 -1
  119. package/dist/number/branded-types/non-zero-uint16.d.mts.map +1 -1
  120. package/dist/number/branded-types/non-zero-uint32.d.mts +1 -1
  121. package/dist/number/branded-types/non-zero-uint32.d.mts.map +1 -1
  122. package/dist/number/branded-types/positive-finite-number.d.mts +1 -1
  123. package/dist/number/branded-types/positive-finite-number.d.mts.map +1 -1
  124. package/dist/number/branded-types/positive-int.d.mts +2 -2
  125. package/dist/number/branded-types/positive-int.d.mts.map +1 -1
  126. package/dist/number/branded-types/positive-int16.d.mts +1 -1
  127. package/dist/number/branded-types/positive-int16.d.mts.map +1 -1
  128. package/dist/number/branded-types/positive-int32.d.mts +1 -1
  129. package/dist/number/branded-types/positive-int32.d.mts.map +1 -1
  130. package/dist/number/branded-types/positive-safe-int.d.mts +2 -2
  131. package/dist/number/branded-types/positive-safe-int.d.mts.map +1 -1
  132. package/dist/number/branded-types/positive-uint16.d.mts +1 -1
  133. package/dist/number/branded-types/positive-uint16.d.mts.map +1 -1
  134. package/dist/number/branded-types/positive-uint32.d.mts +1 -1
  135. package/dist/number/branded-types/positive-uint32.d.mts.map +1 -1
  136. package/dist/number/branded-types/safe-int.d.mts +2 -2
  137. package/dist/number/branded-types/safe-int.d.mts.map +1 -1
  138. package/dist/number/branded-types/safe-int.mjs.map +1 -1
  139. package/dist/number/branded-types/safe-uint.d.mts +1 -1
  140. package/dist/number/branded-types/safe-uint.d.mts.map +1 -1
  141. package/dist/number/branded-types/uint.d.mts +2 -2
  142. package/dist/number/branded-types/uint.d.mts.map +1 -1
  143. package/dist/number/branded-types/uint16.d.mts +1 -1
  144. package/dist/number/branded-types/uint16.d.mts.map +1 -1
  145. package/dist/number/branded-types/uint32.d.mts +1 -1
  146. package/dist/number/branded-types/uint32.d.mts.map +1 -1
  147. package/dist/number/enum/int8.d.mts +1 -1
  148. package/dist/number/enum/int8.d.mts.map +1 -1
  149. package/dist/number/enum/uint8.d.mts +1 -1
  150. package/dist/number/enum/uint8.d.mts.map +1 -1
  151. package/dist/number/num-arithmetic-types.d.mts +1 -1
  152. package/dist/number/num-arithmetic-types.d.mts.map +1 -1
  153. package/dist/number/num.d.mts +3 -3
  154. package/dist/number/num.d.mts.map +1 -1
  155. package/dist/number/refined-number-utils.d.mts +2 -2
  156. package/dist/number/refined-number-utils.d.mts.map +1 -1
  157. package/dist/number/refined-number-utils.mjs +6 -4
  158. package/dist/number/refined-number-utils.mjs.map +1 -1
  159. package/dist/object/object.d.mts +5 -8
  160. package/dist/object/object.d.mts.map +1 -1
  161. package/dist/object/object.mjs +16 -13
  162. package/dist/object/object.mjs.map +1 -1
  163. package/dist/others/cast-mutable.d.mts +1 -1
  164. package/dist/others/cast-mutable.d.mts.map +1 -1
  165. package/dist/others/cast-readonly.d.mts +1 -1
  166. package/dist/others/cast-readonly.d.mts.map +1 -1
  167. package/dist/others/debounce-function.d.mts.map +1 -1
  168. package/dist/others/debounce-function.mjs +1 -5
  169. package/dist/others/debounce-function.mjs.map +1 -1
  170. package/dist/others/memoize-function.d.mts +1 -1
  171. package/dist/others/memoize-function.d.mts.map +1 -1
  172. package/dist/string/str.d.mts +26 -18
  173. package/dist/string/str.d.mts.map +1 -1
  174. package/dist/string/str.mjs +9 -1
  175. package/dist/string/str.mjs.map +1 -1
  176. package/dist/types.d.mts +1 -1
  177. package/dist/types.d.mts.map +1 -1
  178. package/package.json +32 -31
  179. package/src/array/impl/array-utils-creation.mts +24 -22
  180. package/src/array/impl/array-utils-creation.test.mts +25 -22
  181. package/src/array/impl/array-utils-element-access.mts +7 -7
  182. package/src/array/impl/array-utils-element-access.test.mts +2 -2
  183. package/src/array/impl/array-utils-iterators.mts +1 -1
  184. package/src/array/impl/array-utils-iterators.test.mts +1 -1
  185. package/src/array/impl/array-utils-length-bounded-array-cast.mts +7 -7
  186. package/src/array/impl/array-utils-length-bounded-array-cast.test.mts +6 -6
  187. package/src/array/impl/array-utils-length-bounded-array-guard.mts +15 -15
  188. package/src/array/impl/array-utils-length-bounded-array-guard.test.mts +66 -54
  189. package/src/array/impl/array-utils-length-bounded-tuple-cast.mts +6 -6
  190. package/src/array/impl/array-utils-length-bounded-tuple-cast.test.mts +10 -10
  191. package/src/array/impl/array-utils-length-bounded-tuple-guard.mts +8 -8
  192. package/src/array/impl/array-utils-length-bounded-tuple-guard.test.mts +38 -28
  193. package/src/array/impl/array-utils-length-constraint-preservation.test.mts +14 -14
  194. package/src/array/impl/array-utils-modification.mts +12 -12
  195. package/src/array/impl/array-utils-modification.test.mts +7 -7
  196. package/src/array/impl/array-utils-overload-type-error.test.mts +1 -1
  197. package/src/array/impl/array-utils-reducing-value.mts +9 -11
  198. package/src/array/impl/array-utils-reducing-value.test.mts +2 -2
  199. package/src/array/impl/array-utils-search.mts +4 -4
  200. package/src/array/impl/array-utils-search.test.mts +25 -17
  201. package/src/array/impl/array-utils-set-op.mts +1 -1
  202. package/src/array/impl/array-utils-shape-invariants.test.mts +8 -8
  203. package/src/array/impl/array-utils-size.mts +5 -5
  204. package/src/array/impl/array-utils-slice-clamped.mts +2 -2
  205. package/src/array/impl/array-utils-slicing.mts +8 -8
  206. package/src/array/impl/array-utils-slicing.test.mts +1 -1
  207. package/src/array/impl/array-utils-transformation.mts +26 -24
  208. package/src/array/impl/array-utils-transformation.test.mts +12 -10
  209. package/src/array/impl/array-utils-validation.mts +7 -7
  210. package/src/array/impl/array-utils-validation.test.mts +39 -39
  211. package/src/array/impl/array.test.mts +1 -1
  212. package/src/collections/imap-mapped.mts +15 -9
  213. package/src/collections/imap-mapped.test.mts +1 -1
  214. package/src/collections/imap.mts +15 -9
  215. package/src/collections/imap.test.mts +7 -5
  216. package/src/collections/iset-mapped.mts +14 -8
  217. package/src/collections/iset.mts +12 -10
  218. package/src/collections/iset.test.mts +14 -12
  219. package/src/collections/queue.mts +1 -1
  220. package/src/collections/stack.mts +1 -1
  221. package/src/collections/stack.test.mts +8 -6
  222. package/src/functional/index.mts +5 -0
  223. package/src/guard/is-error.test.mts +6 -4
  224. package/src/guard/is-non-empty-string.mts +1 -1
  225. package/src/guard/is-non-empty-string.test.mts +15 -11
  226. package/src/guard/is-primitive.mts +1 -1
  227. package/src/guard/is-type.mts +1 -1
  228. package/src/guard/is-type.test.mts +87 -59
  229. package/src/iterator/range.mts +5 -9
  230. package/src/iterator/range.test.mts +29 -0
  231. package/src/json/json.mts +32 -35
  232. package/src/json/json.test.mts +106 -89
  233. package/src/number/branded-types/finite-number.mts +4 -4
  234. package/src/number/branded-types/int.mts +2 -2
  235. package/src/number/branded-types/int16.mts +1 -1
  236. package/src/number/branded-types/int32.mts +1 -1
  237. package/src/number/branded-types/negative-finite-number.mts +1 -1
  238. package/src/number/branded-types/negative-finite-number.test.mts +4 -4
  239. package/src/number/branded-types/negative-int.mts +3 -3
  240. package/src/number/branded-types/negative-int.test.mts +1 -1
  241. package/src/number/branded-types/negative-safe-int.mts +3 -3
  242. package/src/number/branded-types/negative-safe-int.test.mts +1 -1
  243. package/src/number/branded-types/non-negative-finite-number.mts +3 -3
  244. package/src/number/branded-types/non-negative-int16.mts +1 -1
  245. package/src/number/branded-types/non-negative-int32.mts +1 -1
  246. package/src/number/branded-types/non-positive-finite-number.mts +1 -1
  247. package/src/number/branded-types/non-positive-int.mts +1 -1
  248. package/src/number/branded-types/non-positive-safe-int.mts +1 -1
  249. package/src/number/branded-types/non-zero-finite-number.mts +5 -5
  250. package/src/number/branded-types/non-zero-int.mts +1 -1
  251. package/src/number/branded-types/non-zero-int16.mts +1 -1
  252. package/src/number/branded-types/non-zero-int32.mts +1 -1
  253. package/src/number/branded-types/non-zero-safe-int.mts +4 -4
  254. package/src/number/branded-types/non-zero-uint16.mts +1 -1
  255. package/src/number/branded-types/non-zero-uint32.mts +1 -1
  256. package/src/number/branded-types/positive-finite-number.mts +4 -4
  257. package/src/number/branded-types/positive-int.mts +2 -2
  258. package/src/number/branded-types/positive-int16.mts +1 -1
  259. package/src/number/branded-types/positive-int32.mts +1 -1
  260. package/src/number/branded-types/positive-safe-int.mts +4 -4
  261. package/src/number/branded-types/positive-uint16.mts +1 -1
  262. package/src/number/branded-types/positive-uint32.mts +1 -1
  263. package/src/number/branded-types/safe-int.mts +2 -5
  264. package/src/number/branded-types/safe-uint.mts +1 -1
  265. package/src/number/branded-types/uint.mts +2 -2
  266. package/src/number/branded-types/uint16.mts +1 -1
  267. package/src/number/branded-types/uint32.mts +1 -1
  268. package/src/number/enum/int8.mts +5 -5
  269. package/src/number/enum/uint8.mts +4 -4
  270. package/src/number/num-arithmetic-types.mts +27 -27
  271. package/src/number/num-arithmetic-types.test.mts +21 -21
  272. package/src/number/num-arithmetic.test.mts +6 -6
  273. package/src/number/num.mts +24 -24
  274. package/src/number/num.test.mts +1 -1
  275. package/src/number/refined-number-utils.mts +25 -21
  276. package/src/object/object.mts +46 -34
  277. package/src/object/object.test.mts +5 -5
  278. package/src/others/cast-mutable.mts +1 -1
  279. package/src/others/cast-readonly.mts +1 -1
  280. package/src/others/debounce-function.mts +1 -5
  281. package/src/others/debounce-function.test.mts +3 -0
  282. package/src/others/fast-deep-equal.test.mts +1 -1
  283. package/src/others/map-nullable.test.mts +1 -1
  284. package/src/others/memoize-function.mts +1 -1
  285. package/src/string/str.mts +33 -25
  286. package/src/string/str.test.mts +48 -38
  287. package/src/types.mts +14 -14
package/src/json/json.mts CHANGED
@@ -1,7 +1,7 @@
1
- import {
2
- type JsonValue,
3
- type UintRangeInclusive,
4
- type UnknownRecord,
1
+ import type {
2
+ JsonValue,
3
+ UintRangeInclusive,
4
+ UnknownRecord,
5
5
  } from 'ts-type-forge';
6
6
  import { Arr } from '../array/index.mjs';
7
7
  import { pipe, Result } from '../functional/index.mjs';
@@ -44,13 +44,9 @@ export namespace Json {
44
44
  * // With reviver
45
45
  * const jsonWithDate = '{"created": "2024-01-01T00:00:00.000Z"}';
46
46
  *
47
- * const withReviver = Json.parse(jsonWithDate, (key, value) => {
48
- * if (key === 'created' && typeof value === 'string') {
49
- * return new Date(value);
50
- * }
51
- *
52
- * return value;
53
- * });
47
+ * const withReviver = Json.parse(jsonWithDate, (key, value) =>
48
+ * key === 'created' && typeof value === 'string' ? new Date(value) : value,
49
+ * );
54
50
  *
55
51
  * assert.isTrue(Result.isOk(withReviver));
56
52
  * ```
@@ -115,19 +111,20 @@ export namespace Json {
115
111
  * assert.isTrue(Result.isOk(formatted));
116
112
  *
117
113
  * // With replacer
118
- * const filtered = Json.stringify(data, (key, value) => {
119
- * if (key === 'age') return undefined; // omit age field
120
- *
121
- * return value;
122
- * });
114
+ * const filtered = Json.stringify(data, (key, value) =>
115
+ * // omit age field
116
+ * key === 'age' ? undefined : value,
117
+ * );
123
118
  *
124
119
  * assert.isTrue(Result.isOk(filtered));
125
120
  *
126
- * if (Result.isOk(filtered)) {
127
- * assert.isTrue(isString(filtered.value));
128
- *
129
- * assert.isFalse(filtered.value.includes('age'));
121
+ * if (!Result.isOk(filtered)) {
122
+ * return;
130
123
  * }
124
+ *
125
+ * assert.isTrue(isString(filtered.value));
126
+ *
127
+ * assert.isFalse(filtered.value.includes('age'));
131
128
  * ```
132
129
  *
133
130
  * @param value - The JavaScript value to serialize. Can be any value that
@@ -287,24 +284,24 @@ export namespace Json {
287
284
  *
288
285
  * assert.isTrue(Result.isOk(formatted));
289
286
  *
290
- * if (Result.isOk(formatted)) {
291
- * assert.isTrue(isString(formatted.value));
287
+ * if (!Result.isOk(formatted)) {
288
+ * return;
289
+ * }
290
+ *
291
+ * assert.isTrue(isString(formatted.value));
292
292
  *
293
- * // Check that keys are in order (first key should be "apple")
294
- * assert.isTrue(
295
- * formatted.value.indexOf('"apple"') < formatted.value.indexOf('"mango"'),
296
- * );
293
+ * // Check that keys are in order (first key should be "apple")
294
+ * assert.isTrue(
295
+ * formatted.value.indexOf('"apple"') < formatted.value.indexOf('"mango"'),
296
+ * );
297
297
  *
298
- * assert.isTrue(
299
- * formatted.value.indexOf('"mango"') <
300
- * formatted.value.indexOf('"nested"'),
301
- * );
298
+ * assert.isTrue(
299
+ * formatted.value.indexOf('"mango"') < formatted.value.indexOf('"nested"'),
300
+ * );
302
301
  *
303
- * assert.isTrue(
304
- * formatted.value.indexOf('"nested"') <
305
- * formatted.value.indexOf('"zebra"'),
306
- * );
307
- * }
302
+ * assert.isTrue(
303
+ * formatted.value.indexOf('"nested"') < formatted.value.indexOf('"zebra"'),
304
+ * );
308
305
  * ```
309
306
  *
310
307
  * @param value - An object (`UnknownRecord`) to serialize. Must be a plain
@@ -127,13 +127,10 @@ describe('parse', () => {
127
127
  });
128
128
 
129
129
  test('should use reviver function to transform values', () => {
130
- const dateReviver = (_key: string, value: unknown): unknown => {
131
- if (typeof value === 'string' && /^\d{4}-\d{2}-\d{2}T/u.test(value)) {
132
- return new Date(value);
133
- }
134
-
135
- return value;
136
- };
130
+ const dateReviver = (_key: string, value: unknown): unknown =>
131
+ typeof value === 'string' && /^\d{4}-\d{2}-\d{2}T/u.test(value)
132
+ ? new Date(value)
133
+ : value;
137
134
 
138
135
  const jsonString = '{"name":"test","created":"2023-12-01T10:00:00.000Z"}';
139
136
 
@@ -141,25 +138,24 @@ describe('parse', () => {
141
138
 
142
139
  assert.isTrue(Result.isOk(result));
143
140
 
144
- if (
141
+ if (!(
145
142
  isRecord(result.value) &&
146
143
  hasKey(result.value, 'name') &&
147
144
  hasKey(result.value, 'created')
148
- ) {
149
- expect(result.value.name).toBe('test');
150
-
151
- expect(result.value.created).toBeInstanceOf(Date);
145
+ )) {
146
+ return;
152
147
  }
148
+
149
+ expect(result.value.name).toBe('test');
150
+
151
+ expect(result.value.created).toBeInstanceOf(Date);
153
152
  });
154
153
 
155
154
  test('should handle reviver returning different types', () => {
156
- const transformReviver = (key: string, value: unknown): unknown => {
157
- if (key === 'number' && typeof value === 'string') {
158
- return Result.unwrapOkOr(Num.safeParseInt(value), Number.NaN);
159
- }
160
-
161
- return value;
162
- };
155
+ const transformReviver = (key: string, value: unknown): unknown =>
156
+ key === 'number' && typeof value === 'string'
157
+ ? Result.unwrapOkOr(Num.safeParseInt(value), Number.NaN)
158
+ : value;
163
159
 
164
160
  const result = Json.parse(
165
161
  '{"number":"42","text":"hello"}',
@@ -172,15 +168,17 @@ describe('parse', () => {
172
168
 
173
169
  expect(result.value).toHaveProperty('text');
174
170
 
175
- if (
171
+ if (!(
176
172
  isRecord(result.value) &&
177
173
  hasKey(result.value, 'number') &&
178
174
  hasKey(result.value, 'text')
179
- ) {
180
- expect(result.value.number).toBe(42);
181
-
182
- expect(result.value.text).toBe('hello');
175
+ )) {
176
+ return;
183
177
  }
178
+
179
+ expect(result.value.number).toBe(42);
180
+
181
+ expect(result.value.text).toBe('hello');
184
182
  });
185
183
  });
186
184
 
@@ -336,11 +334,8 @@ describe('stringify', () => {
336
334
  email: 'john@example.com',
337
335
  } as const;
338
336
 
339
- const secureReplacer = (key: string, value: unknown): unknown => {
340
- if (key === 'password') return '[REDACTED]';
341
-
342
- return value;
343
- };
337
+ const secureReplacer = (key: string, value: unknown): unknown =>
338
+ key === 'password' ? '[REDACTED]' : value;
344
339
 
345
340
  const result = Json.stringify(data, secureReplacer);
346
341
 
@@ -428,25 +423,29 @@ describe('stringifySelected', () => {
428
423
 
429
424
  const parsed: unknown = JSON.parse(result.value);
430
425
 
431
- if (isRecord(parsed) && hasKey(parsed, 'users')) {
432
- assert.isTrue(Arr.isArray(parsed.users));
433
-
434
- expect(parsed.users).toHaveLength(2);
426
+ if (!(isRecord(parsed) && hasKey(parsed, 'users'))) {
427
+ return;
428
+ }
435
429
 
436
- if (Arr.isArray(parsed.users)) {
437
- assert.deepStrictEqual(parsed.users[0], { id: 1, name: 'Alice' });
430
+ assert.isTrue(Arr.isArray(parsed.users));
438
431
 
439
- expect(parsed.users[0]).not.toHaveProperty('secret');
440
- }
432
+ expect(parsed.users).toHaveLength(2);
441
433
 
442
- if (isRecord(parsed) && hasKey(parsed, 'metadata')) {
443
- assert.deepStrictEqual(parsed.metadata, { total: 2 });
434
+ if (Arr.isArray(parsed.users)) {
435
+ assert.deepStrictEqual(parsed.users[0], { id: 1, name: 'Alice' });
444
436
 
445
- expect(parsed.metadata).not.toHaveProperty('page');
437
+ expect(parsed.users[0]).not.toHaveProperty('secret');
438
+ }
446
439
 
447
- expect(parsed.metadata).not.toHaveProperty('internal');
448
- }
440
+ if (!(isRecord(parsed) && hasKey(parsed, 'metadata'))) {
441
+ return;
449
442
  }
443
+
444
+ assert.deepStrictEqual(parsed.metadata, { total: 2 });
445
+
446
+ expect(parsed.metadata).not.toHaveProperty('page');
447
+
448
+ expect(parsed.metadata).not.toHaveProperty('internal');
450
449
  });
451
450
 
452
451
  test('should work with array indices', () => {
@@ -569,23 +568,29 @@ describe('stringifySortedKey', () => {
569
568
 
570
569
  const parsed: unknown = JSON.parse(result.value);
571
570
 
572
- if (isRecord(parsed)) {
573
- const keys = Object.keys(parsed);
571
+ if (!isRecord(parsed)) {
572
+ return;
573
+ }
574
+
575
+ const keys = Object.keys(parsed);
574
576
 
575
- assert.deepStrictEqual(keys, ['settings', 'user']); // sorted top-level keys
577
+ assert.deepStrictEqual(keys, ['settings', 'user']); // sorted top-level keys
576
578
 
577
- if (hasKey(parsed, 'user') && isRecord(parsed.user)) {
578
- const userKeys = Object.keys(parsed.user);
579
+ if (!hasKey(parsed, 'user') || !isRecord(parsed.user)) {
580
+ return;
581
+ }
579
582
 
580
- assert.deepStrictEqual(userKeys, ['address', 'age', 'name']); // sorted nested keys
583
+ const userKeys = Object.keys(parsed.user);
581
584
 
582
- if (hasKey(parsed.user, 'address') && isRecord(parsed.user.address)) {
583
- const addressKeys = Object.keys(parsed.user.address);
585
+ assert.deepStrictEqual(userKeys, ['address', 'age', 'name']); // sorted nested keys
584
586
 
585
- assert.deepStrictEqual(addressKeys, ['city', 'country', 'zip']); // sorted deeper nested keys
586
- }
587
- }
587
+ if (!hasKey(parsed.user, 'address') || !isRecord(parsed.user.address)) {
588
+ return;
588
589
  }
590
+
591
+ const addressKeys = Object.keys(parsed.user.address);
592
+
593
+ assert.deepStrictEqual(addressKeys, ['city', 'country', 'zip']); // sorted deeper nested keys
589
594
  });
590
595
 
591
596
  test('should handle arrays with objects', () => {
@@ -609,34 +614,40 @@ describe('stringifySortedKey', () => {
609
614
 
610
615
  const parsed: unknown = JSON.parse(result.value);
611
616
 
612
- if (isRecord(parsed)) {
613
- // Check top-level keys are sorted
614
- const topKeys = Object.keys(parsed);
617
+ if (!isRecord(parsed)) {
618
+ return;
619
+ }
615
620
 
616
- assert.deepStrictEqual(topKeys, ['metadata', 'users']);
621
+ // Check top-level keys are sorted
622
+ const topKeys = Object.keys(parsed);
617
623
 
618
- // Check metadata keys are sorted
619
- if (hasKey(parsed, 'metadata') && isRecord(parsed.metadata)) {
620
- const metadataKeys = Object.keys(parsed.metadata);
624
+ assert.deepStrictEqual(topKeys, ['metadata', 'users']);
621
625
 
622
- assert.deepStrictEqual(metadataKeys, ['author', 'created', 'version']);
623
- }
626
+ // Check metadata keys are sorted
627
+ if (hasKey(parsed, 'metadata') && isRecord(parsed.metadata)) {
628
+ const metadataKeys = Object.keys(parsed.metadata);
624
629
 
625
- // Check user object keys are sorted
626
- if (
627
- hasKey(parsed, 'users') &&
628
- Arr.isArray(parsed.users) &&
629
- Arr.isNonEmpty(parsed.users)
630
- ) {
631
- const firstUser = parsed.users[0];
630
+ assert.deepStrictEqual(metadataKeys, ['author', 'created', 'version']);
631
+ }
632
632
 
633
- if (isRecord(firstUser)) {
634
- const userKeys = Object.keys(firstUser);
633
+ // Check user object keys are sorted
634
+ if (
635
+ !hasKey(parsed, 'users') ||
636
+ !Arr.isArray(parsed.users) ||
637
+ !Arr.isNonEmpty(parsed.users)
638
+ ) {
639
+ return;
640
+ }
635
641
 
636
- assert.deepStrictEqual(userKeys, ['active', 'id', 'name']);
637
- }
638
- }
642
+ const firstUser = parsed.users[0];
643
+
644
+ if (!isRecord(firstUser)) {
645
+ return;
639
646
  }
647
+
648
+ const userKeys = Object.keys(firstUser);
649
+
650
+ assert.deepStrictEqual(userKeys, ['active', 'id', 'name']);
640
651
  });
641
652
 
642
653
  test('should handle formatting with space parameter', () => {
@@ -727,24 +738,30 @@ describe('stringifySortedKey', () => {
727
738
 
728
739
  const parsed: unknown = JSON.parse(result.value);
729
740
 
730
- if (isRecord(parsed) && hasKey(parsed, 'level1')) {
731
- const level1 = parsed.level1;
741
+ if (!isRecord(parsed) || !hasKey(parsed, 'level1')) {
742
+ return;
743
+ }
732
744
 
733
- if (isRecord(level1)) {
734
- assert.deepStrictEqual(Object.keys(level1), ['a', 'z']);
745
+ const level1 = parsed.level1;
735
746
 
736
- if (
737
- hasKey(level1, 'a') &&
738
- isRecord(level1.a) &&
739
- hasKey(level1.a, 'nested')
740
- ) {
741
- const nested = level1.a.nested;
747
+ if (!isRecord(level1)) {
748
+ return;
749
+ }
742
750
 
743
- if (isRecord(nested)) {
744
- assert.deepStrictEqual(Object.keys(nested), ['x', 'y']);
745
- }
746
- }
747
- }
751
+ assert.deepStrictEqual(Object.keys(level1), ['a', 'z']);
752
+
753
+ if (
754
+ !hasKey(level1, 'a') ||
755
+ !isRecord(level1.a) ||
756
+ !hasKey(level1.a, 'nested')
757
+ ) {
758
+ return;
759
+ }
760
+
761
+ const nested = level1.a.nested;
762
+
763
+ if (isRecord(nested)) {
764
+ assert.deepStrictEqual(Object.keys(nested), ['x', 'y']);
748
765
  }
749
766
  });
750
767
  });
@@ -1,7 +1,7 @@
1
- import {
2
- type Int,
3
- type NonNegativeFiniteNumber,
4
- type FiniteNumber as TtfImported_FiniteNumber,
1
+ import type {
2
+ Int,
3
+ NonNegativeFiniteNumber,
4
+ FiniteNumber as TtfImported_FiniteNumber,
5
5
  } from 'ts-type-forge';
6
6
  import { expectType } from '../../expect-type.mjs';
7
7
  import { TsDataForgeInternals } from '../refined-number-utils.mjs';
@@ -1,4 +1,4 @@
1
- import { type Int as TtfImported_Int } from 'ts-type-forge';
1
+ import type { Int as TtfImported_Int } from 'ts-type-forge';
2
2
  import { expectType } from '../../expect-type.mjs';
3
3
  import { TsDataForgeInternals } from '../refined-number-utils.mjs';
4
4
 
@@ -175,7 +175,7 @@ export const Int = {
175
175
  *
176
176
  * assert.isTrue(Int.is(randomValue));
177
177
  *
178
- * assert.isTrue(randomValue >= 1 && randomValue <= 6);
178
+ * assert.isTrue(1 <= randomValue && randomValue <= 6);
179
179
  * ```
180
180
  *
181
181
  * @param min - The minimum value (inclusive)
@@ -1,4 +1,4 @@
1
- import { type Int16 as TtfImported_Int16 } from 'ts-type-forge';
1
+ import type { Int16 as TtfImported_Int16 } from 'ts-type-forge';
2
2
  import { expectType } from '../../expect-type.mjs';
3
3
  import { TsDataForgeInternals } from '../refined-number-utils.mjs';
4
4
 
@@ -1,4 +1,4 @@
1
- import { type Int32 as TtfImported_Int32 } from 'ts-type-forge';
1
+ import type { Int32 as TtfImported_Int32 } from 'ts-type-forge';
2
2
  import { expectType } from '../../expect-type.mjs';
3
3
  import { TsDataForgeInternals } from '../refined-number-utils.mjs';
4
4
 
@@ -1,4 +1,4 @@
1
- import { type NegativeFiniteNumber as TtfImported_NegativeFiniteNumber } from 'ts-type-forge';
1
+ import type { NegativeFiniteNumber as TtfImported_NegativeFiniteNumber } from 'ts-type-forge';
2
2
  import { TsDataForgeInternals } from '../refined-number-utils.mjs';
3
3
  import { PositiveFiniteNumber } from './positive-finite-number.mjs';
4
4
 
@@ -1,7 +1,7 @@
1
- import {
2
- type NegativeInt,
3
- type NonPositiveInt,
4
- type PositiveFiniteNumber,
1
+ import type {
2
+ NegativeInt,
3
+ NonPositiveInt,
4
+ PositiveFiniteNumber,
5
5
  } from 'ts-type-forge';
6
6
  import { expectType } from '../../expect-type.mjs';
7
7
  import { range } from '../../iterator/index.mjs';
@@ -1,6 +1,6 @@
1
- import {
2
- type NegativeInt as TtfImported_NegativeInt,
3
- type WithSmallInt,
1
+ import type {
2
+ NegativeInt as TtfImported_NegativeInt,
3
+ WithSmallInt,
4
4
  } from 'ts-type-forge';
5
5
  import { TsDataForgeInternals } from '../refined-number-utils.mjs';
6
6
  import { PositiveInt } from './positive-int.mjs';
@@ -1,4 +1,4 @@
1
- import { type PositiveInt } from 'ts-type-forge';
1
+ import type { PositiveInt } from 'ts-type-forge';
2
2
  import { expectType } from '../../expect-type.mjs';
3
3
  import { range } from '../../iterator/index.mjs';
4
4
  import { asNegativeInt, isNegativeInt, NegativeInt } from './negative-int.mjs';
@@ -1,6 +1,6 @@
1
- import {
2
- type NegativeSafeInt as TtfImported_NegativeSafeInt,
3
- type WithSmallInt,
1
+ import type {
2
+ NegativeSafeInt as TtfImported_NegativeSafeInt,
3
+ WithSmallInt,
4
4
  } from 'ts-type-forge';
5
5
  import { TsDataForgeInternals } from '../refined-number-utils.mjs';
6
6
  import { PositiveSafeInt } from './positive-safe-int.mjs';
@@ -1,4 +1,4 @@
1
- import { type PositiveSafeInt } from 'ts-type-forge';
1
+ import type { PositiveSafeInt } from 'ts-type-forge';
2
2
  import { expectType } from '../../expect-type.mjs';
3
3
  import { range } from '../../iterator/index.mjs';
4
4
  import {
@@ -1,6 +1,6 @@
1
- import {
2
- type NonNegativeFiniteNumber as TtfImported_NonNegativeFiniteNumber,
3
- type Uint,
1
+ import type {
2
+ NonNegativeFiniteNumber as TtfImported_NonNegativeFiniteNumber,
3
+ Uint,
4
4
  } from 'ts-type-forge';
5
5
  import { expectType } from '../../expect-type.mjs';
6
6
  import { TsDataForgeInternals } from '../refined-number-utils.mjs';
@@ -1,4 +1,4 @@
1
- import { type NonNegativeInt16 as TtfImported_NonNegativeInt16 } from 'ts-type-forge';
1
+ import type { NonNegativeInt16 as TtfImported_NonNegativeInt16 } from 'ts-type-forge';
2
2
  import { expectType } from '../../expect-type.mjs';
3
3
  import { TsDataForgeInternals } from '../refined-number-utils.mjs';
4
4
 
@@ -1,4 +1,4 @@
1
- import { type NonNegativeInt32 as TtfImported_NonNegativeInt32 } from 'ts-type-forge';
1
+ import type { NonNegativeInt32 as TtfImported_NonNegativeInt32 } from 'ts-type-forge';
2
2
  import { expectType } from '../../expect-type.mjs';
3
3
  import { TsDataForgeInternals } from '../refined-number-utils.mjs';
4
4
 
@@ -1,4 +1,4 @@
1
- import { type NonPositiveFiniteNumber as TtfImported_NonPositiveFiniteNumber } from 'ts-type-forge';
1
+ import type { NonPositiveFiniteNumber as TtfImported_NonPositiveFiniteNumber } from 'ts-type-forge';
2
2
  import { TsDataForgeInternals } from '../refined-number-utils.mjs';
3
3
 
4
4
  export type NonPositiveFiniteNumber = TtfImported_NonPositiveFiniteNumber;
@@ -1,4 +1,4 @@
1
- import { type NonPositiveInt as TtfImported_NonPositiveInt } from 'ts-type-forge';
1
+ import type { NonPositiveInt as TtfImported_NonPositiveInt } from 'ts-type-forge';
2
2
  import { TsDataForgeInternals } from '../refined-number-utils.mjs';
3
3
 
4
4
  export type NonPositiveInt = TtfImported_NonPositiveInt;
@@ -1,4 +1,4 @@
1
- import { type NonPositiveSafeInt as TtfImported_NonPositiveSafeInt } from 'ts-type-forge';
1
+ import type { NonPositiveSafeInt as TtfImported_NonPositiveSafeInt } from 'ts-type-forge';
2
2
  import { TsDataForgeInternals } from '../refined-number-utils.mjs';
3
3
 
4
4
  export type NonPositiveSafeInt = TtfImported_NonPositiveSafeInt;
@@ -1,8 +1,8 @@
1
- import {
2
- type Int,
3
- type NonZeroInt,
4
- type PositiveFiniteNumber,
5
- type NonZeroFiniteNumber as TtfImported_NonZeroFiniteNumber,
1
+ import type {
2
+ Int,
3
+ NonZeroInt,
4
+ PositiveFiniteNumber,
5
+ NonZeroFiniteNumber as TtfImported_NonZeroFiniteNumber,
6
6
  } from 'ts-type-forge';
7
7
  import { expectType } from '../../expect-type.mjs';
8
8
  import { TsDataForgeInternals } from '../refined-number-utils.mjs';
@@ -1,4 +1,4 @@
1
- import { type NonZeroInt as TtfImported_NonZeroInt } from 'ts-type-forge';
1
+ import type { NonZeroInt as TtfImported_NonZeroInt } from 'ts-type-forge';
2
2
  import { expectType } from '../../expect-type.mjs';
3
3
  import { TsDataForgeInternals } from '../refined-number-utils.mjs';
4
4
 
@@ -1,4 +1,4 @@
1
- import { type NonZeroInt16 as TtfImported_NonZeroInt16 } from 'ts-type-forge';
1
+ import type { NonZeroInt16 as TtfImported_NonZeroInt16 } from 'ts-type-forge';
2
2
  import { expectType } from '../../expect-type.mjs';
3
3
  import { TsDataForgeInternals } from '../refined-number-utils.mjs';
4
4
 
@@ -1,4 +1,4 @@
1
- import { type NonZeroInt32 as TtfImported_NonZeroInt32 } from 'ts-type-forge';
1
+ import type { NonZeroInt32 as TtfImported_NonZeroInt32 } from 'ts-type-forge';
2
2
  import { expectType } from '../../expect-type.mjs';
3
3
  import { TsDataForgeInternals } from '../refined-number-utils.mjs';
4
4
 
@@ -1,7 +1,7 @@
1
- import {
2
- type SafeInt,
3
- type SafeUint,
4
- type NonZeroSafeInt as TtfImported_NonZeroSafeInt,
1
+ import type {
2
+ SafeInt,
3
+ SafeUint,
4
+ NonZeroSafeInt as TtfImported_NonZeroSafeInt,
5
5
  } from 'ts-type-forge';
6
6
  import { expectType } from '../../expect-type.mjs';
7
7
  import { TsDataForgeInternals } from '../refined-number-utils.mjs';
@@ -1,4 +1,4 @@
1
- import { type NonZeroUint16 as TtfImported_NonZeroUint16 } from 'ts-type-forge';
1
+ import type { NonZeroUint16 as TtfImported_NonZeroUint16 } from 'ts-type-forge';
2
2
  import { expectType } from '../../expect-type.mjs';
3
3
  import { TsDataForgeInternals } from '../refined-number-utils.mjs';
4
4
 
@@ -1,4 +1,4 @@
1
- import { type NonZeroUint32 as TtfImported_NonZeroUint32 } from 'ts-type-forge';
1
+ import type { NonZeroUint32 as TtfImported_NonZeroUint32 } from 'ts-type-forge';
2
2
  import { expectType } from '../../expect-type.mjs';
3
3
  import { TsDataForgeInternals } from '../refined-number-utils.mjs';
4
4
 
@@ -1,7 +1,7 @@
1
- import {
2
- type PositiveInt,
3
- type PositiveFiniteNumber as TtfImported_PositiveFiniteNumber,
4
- type Uint,
1
+ import type {
2
+ PositiveInt,
3
+ PositiveFiniteNumber as TtfImported_PositiveFiniteNumber,
4
+ Uint,
5
5
  } from 'ts-type-forge';
6
6
  import { expectType } from '../../expect-type.mjs';
7
7
  import { TsDataForgeInternals } from '../refined-number-utils.mjs';
@@ -1,4 +1,4 @@
1
- import { type PositiveInt as TtfImported_PositiveInt } from 'ts-type-forge';
1
+ import type { PositiveInt as TtfImported_PositiveInt } from 'ts-type-forge';
2
2
  import { expectType } from '../../expect-type.mjs';
3
3
  import { TsDataForgeInternals } from '../refined-number-utils.mjs';
4
4
 
@@ -192,7 +192,7 @@ export const PositiveInt = {
192
192
  *
193
193
  * assert.isTrue(PositiveInt.is(randomValue));
194
194
  *
195
- * assert.isTrue(randomValue >= 3 && randomValue <= 6);
195
+ * assert.isTrue(3 <= randomValue && randomValue <= 6);
196
196
  * ```
197
197
  *
198
198
  * @param min - The minimum value (inclusive)
@@ -1,4 +1,4 @@
1
- import { type PositiveInt16 as TtfImported_PositiveInt16 } from 'ts-type-forge';
1
+ import type { PositiveInt16 as TtfImported_PositiveInt16 } from 'ts-type-forge';
2
2
  import { expectType } from '../../expect-type.mjs';
3
3
  import { TsDataForgeInternals } from '../refined-number-utils.mjs';
4
4
 
@@ -1,4 +1,4 @@
1
- import { type PositiveInt32 as TtfImported_PositiveInt32 } from 'ts-type-forge';
1
+ import type { PositiveInt32 as TtfImported_PositiveInt32 } from 'ts-type-forge';
2
2
  import { expectType } from '../../expect-type.mjs';
3
3
  import { TsDataForgeInternals } from '../refined-number-utils.mjs';
4
4