ts-data-forge 14.10.1 → 14.11.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 (437) hide show
  1. package/README.md +34 -1
  2. package/dist/array/impl/array-utils-reducing-value.d.mts.map +1 -1
  3. package/dist/array/impl/array-utils-reducing-value.mjs +4 -3
  4. package/dist/array/impl/array-utils-reducing-value.mjs.map +1 -1
  5. package/dist/array/impl/array-utils-slice-clamped.mjs +1 -1
  6. package/dist/array/impl/array-utils-slice-clamped.mjs.map +1 -1
  7. package/dist/array/impl/array-utils-slicing.d.mts.map +1 -1
  8. package/dist/array/impl/array-utils-slicing.mjs +10 -3
  9. package/dist/array/impl/array-utils-slicing.mjs.map +1 -1
  10. package/dist/array/impl/array-utils-transformation.d.mts.map +1 -1
  11. package/dist/array/impl/array-utils-transformation.mjs +3 -3
  12. package/dist/array/impl/array-utils-transformation.mjs.map +1 -1
  13. package/dist/array/impl/array-utils-validation.d.mts.map +1 -1
  14. package/dist/array/impl/array-utils-validation.mjs +2 -1
  15. package/dist/array/impl/array-utils-validation.mjs.map +1 -1
  16. package/dist/built-in-tag.d.mts +22 -0
  17. package/dist/built-in-tag.d.mts.map +1 -0
  18. package/dist/built-in-tag.mjs +34 -0
  19. package/dist/built-in-tag.mjs.map +1 -0
  20. package/dist/collections/imap-mapped.mjs +6 -3
  21. package/dist/collections/imap-mapped.mjs.map +1 -1
  22. package/dist/collections/imap.mjs +6 -3
  23. package/dist/collections/imap.mjs.map +1 -1
  24. package/dist/collections/stack.mjs +3 -3
  25. package/dist/collections/stack.mjs.map +1 -1
  26. package/dist/iterator/range.d.mts +1 -1
  27. package/dist/iterator/range.d.mts.map +1 -1
  28. package/dist/iterator/range.mjs +5 -2
  29. package/dist/iterator/range.mjs.map +1 -1
  30. package/dist/json/json.d.mts.map +1 -1
  31. package/dist/json/json.mjs +13 -47
  32. package/dist/json/json.mjs.map +1 -1
  33. package/dist/number/branded-types/finite-number.d.mts +4 -9
  34. package/dist/number/branded-types/finite-number.d.mts.map +1 -1
  35. package/dist/number/branded-types/finite-number.mjs +9 -9
  36. package/dist/number/branded-types/finite-number.mjs.map +1 -1
  37. package/dist/number/branded-types/int.d.mts +3 -9
  38. package/dist/number/branded-types/int.d.mts.map +1 -1
  39. package/dist/number/branded-types/int.mjs +9 -10
  40. package/dist/number/branded-types/int.mjs.map +1 -1
  41. package/dist/number/branded-types/int16.d.mts +3 -18
  42. package/dist/number/branded-types/int16.d.mts.map +1 -1
  43. package/dist/number/branded-types/int16.mjs +9 -10
  44. package/dist/number/branded-types/int16.mjs.map +1 -1
  45. package/dist/number/branded-types/int32.d.mts +3 -14
  46. package/dist/number/branded-types/int32.d.mts.map +1 -1
  47. package/dist/number/branded-types/int32.mjs +9 -10
  48. package/dist/number/branded-types/int32.mjs.map +1 -1
  49. package/dist/number/branded-types/negative-finite-number.d.mts +4 -16
  50. package/dist/number/branded-types/negative-finite-number.d.mts.map +1 -1
  51. package/dist/number/branded-types/negative-finite-number.mjs +9 -10
  52. package/dist/number/branded-types/negative-finite-number.mjs.map +1 -1
  53. package/dist/number/branded-types/negative-int.d.mts +3 -16
  54. package/dist/number/branded-types/negative-int.d.mts.map +1 -1
  55. package/dist/number/branded-types/negative-int.mjs +9 -11
  56. package/dist/number/branded-types/negative-int.mjs.map +1 -1
  57. package/dist/number/branded-types/negative-safe-int.d.mts +3 -17
  58. package/dist/number/branded-types/negative-safe-int.d.mts.map +1 -1
  59. package/dist/number/branded-types/negative-safe-int.mjs +9 -11
  60. package/dist/number/branded-types/negative-safe-int.mjs.map +1 -1
  61. package/dist/number/branded-types/non-negative-finite-number.d.mts +4 -14
  62. package/dist/number/branded-types/non-negative-finite-number.d.mts.map +1 -1
  63. package/dist/number/branded-types/non-negative-finite-number.mjs +9 -9
  64. package/dist/number/branded-types/non-negative-finite-number.mjs.map +1 -1
  65. package/dist/number/branded-types/non-negative-int16.d.mts +3 -19
  66. package/dist/number/branded-types/non-negative-int16.d.mts.map +1 -1
  67. package/dist/number/branded-types/non-negative-int16.mjs +9 -10
  68. package/dist/number/branded-types/non-negative-int16.mjs.map +1 -1
  69. package/dist/number/branded-types/non-negative-int32.d.mts +3 -17
  70. package/dist/number/branded-types/non-negative-int32.d.mts.map +1 -1
  71. package/dist/number/branded-types/non-negative-int32.mjs +9 -10
  72. package/dist/number/branded-types/non-negative-int32.mjs.map +1 -1
  73. package/dist/number/branded-types/non-positive-finite-number.d.mts +4 -14
  74. package/dist/number/branded-types/non-positive-finite-number.d.mts.map +1 -1
  75. package/dist/number/branded-types/non-positive-finite-number.mjs +9 -9
  76. package/dist/number/branded-types/non-positive-finite-number.mjs.map +1 -1
  77. package/dist/number/branded-types/non-positive-int.d.mts +3 -14
  78. package/dist/number/branded-types/non-positive-int.d.mts.map +1 -1
  79. package/dist/number/branded-types/non-positive-int.mjs +9 -10
  80. package/dist/number/branded-types/non-positive-int.mjs.map +1 -1
  81. package/dist/number/branded-types/non-positive-safe-int.d.mts +3 -15
  82. package/dist/number/branded-types/non-positive-safe-int.d.mts.map +1 -1
  83. package/dist/number/branded-types/non-positive-safe-int.mjs +9 -10
  84. package/dist/number/branded-types/non-positive-safe-int.mjs.map +1 -1
  85. package/dist/number/branded-types/non-zero-finite-number.d.mts +4 -10
  86. package/dist/number/branded-types/non-zero-finite-number.d.mts.map +1 -1
  87. package/dist/number/branded-types/non-zero-finite-number.mjs +9 -10
  88. package/dist/number/branded-types/non-zero-finite-number.mjs.map +1 -1
  89. package/dist/number/branded-types/non-zero-int.d.mts +3 -10
  90. package/dist/number/branded-types/non-zero-int.d.mts.map +1 -1
  91. package/dist/number/branded-types/non-zero-int.mjs +9 -11
  92. package/dist/number/branded-types/non-zero-int.mjs.map +1 -1
  93. package/dist/number/branded-types/non-zero-int16.d.mts +3 -19
  94. package/dist/number/branded-types/non-zero-int16.d.mts.map +1 -1
  95. package/dist/number/branded-types/non-zero-int16.mjs +12 -11
  96. package/dist/number/branded-types/non-zero-int16.mjs.map +1 -1
  97. package/dist/number/branded-types/non-zero-int32.d.mts +3 -15
  98. package/dist/number/branded-types/non-zero-int32.d.mts.map +1 -1
  99. package/dist/number/branded-types/non-zero-int32.mjs +12 -11
  100. package/dist/number/branded-types/non-zero-int32.mjs.map +1 -1
  101. package/dist/number/branded-types/non-zero-safe-int.d.mts +6 -14
  102. package/dist/number/branded-types/non-zero-safe-int.d.mts.map +1 -1
  103. package/dist/number/branded-types/non-zero-safe-int.mjs +9 -13
  104. package/dist/number/branded-types/non-zero-safe-int.mjs.map +1 -1
  105. package/dist/number/branded-types/non-zero-uint16.d.mts +3 -20
  106. package/dist/number/branded-types/non-zero-uint16.d.mts.map +1 -1
  107. package/dist/number/branded-types/non-zero-uint16.mjs +9 -11
  108. package/dist/number/branded-types/non-zero-uint16.mjs.map +1 -1
  109. package/dist/number/branded-types/non-zero-uint32.d.mts +3 -18
  110. package/dist/number/branded-types/non-zero-uint32.d.mts.map +1 -1
  111. package/dist/number/branded-types/non-zero-uint32.mjs +9 -11
  112. package/dist/number/branded-types/non-zero-uint32.mjs.map +1 -1
  113. package/dist/number/branded-types/positive-finite-number.d.mts +4 -16
  114. package/dist/number/branded-types/positive-finite-number.d.mts.map +1 -1
  115. package/dist/number/branded-types/positive-finite-number.mjs +9 -9
  116. package/dist/number/branded-types/positive-finite-number.mjs.map +1 -1
  117. package/dist/number/branded-types/positive-int.d.mts +3 -16
  118. package/dist/number/branded-types/positive-int.d.mts.map +1 -1
  119. package/dist/number/branded-types/positive-int.mjs +9 -10
  120. package/dist/number/branded-types/positive-int.mjs.map +1 -1
  121. package/dist/number/branded-types/positive-int16.d.mts +3 -21
  122. package/dist/number/branded-types/positive-int16.d.mts.map +1 -1
  123. package/dist/number/branded-types/positive-int16.mjs +9 -10
  124. package/dist/number/branded-types/positive-int16.mjs.map +1 -1
  125. package/dist/number/branded-types/positive-int32.d.mts +3 -19
  126. package/dist/number/branded-types/positive-int32.d.mts.map +1 -1
  127. package/dist/number/branded-types/positive-int32.mjs +9 -10
  128. package/dist/number/branded-types/positive-int32.mjs.map +1 -1
  129. package/dist/number/branded-types/positive-safe-int.d.mts +5 -19
  130. package/dist/number/branded-types/positive-safe-int.d.mts.map +1 -1
  131. package/dist/number/branded-types/positive-safe-int.mjs +9 -11
  132. package/dist/number/branded-types/positive-safe-int.mjs.map +1 -1
  133. package/dist/number/branded-types/positive-uint16.d.mts +3 -20
  134. package/dist/number/branded-types/positive-uint16.d.mts.map +1 -1
  135. package/dist/number/branded-types/positive-uint16.mjs +9 -10
  136. package/dist/number/branded-types/positive-uint16.mjs.map +1 -1
  137. package/dist/number/branded-types/positive-uint32.d.mts +3 -18
  138. package/dist/number/branded-types/positive-uint32.d.mts.map +1 -1
  139. package/dist/number/branded-types/positive-uint32.mjs +9 -10
  140. package/dist/number/branded-types/positive-uint32.mjs.map +1 -1
  141. package/dist/number/branded-types/safe-int.d.mts +5 -12
  142. package/dist/number/branded-types/safe-int.d.mts.map +1 -1
  143. package/dist/number/branded-types/safe-int.mjs +9 -12
  144. package/dist/number/branded-types/safe-int.mjs.map +1 -1
  145. package/dist/number/branded-types/safe-uint.d.mts +3 -15
  146. package/dist/number/branded-types/safe-uint.d.mts.map +1 -1
  147. package/dist/number/branded-types/safe-uint.mjs +9 -11
  148. package/dist/number/branded-types/safe-uint.mjs.map +1 -1
  149. package/dist/number/branded-types/uint.d.mts +3 -14
  150. package/dist/number/branded-types/uint.d.mts.map +1 -1
  151. package/dist/number/branded-types/uint.mjs +9 -10
  152. package/dist/number/branded-types/uint.mjs.map +1 -1
  153. package/dist/number/branded-types/uint16.d.mts +3 -18
  154. package/dist/number/branded-types/uint16.d.mts.map +1 -1
  155. package/dist/number/branded-types/uint16.mjs +9 -10
  156. package/dist/number/branded-types/uint16.mjs.map +1 -1
  157. package/dist/number/branded-types/uint32.d.mts +3 -16
  158. package/dist/number/branded-types/uint32.d.mts.map +1 -1
  159. package/dist/number/branded-types/uint32.mjs +9 -10
  160. package/dist/number/branded-types/uint32.mjs.map +1 -1
  161. package/dist/number/enum/int8.d.mts +13 -15
  162. package/dist/number/enum/int8.d.mts.map +1 -1
  163. package/dist/number/enum/int8.mjs +20 -25
  164. package/dist/number/enum/int8.mjs.map +1 -1
  165. package/dist/number/enum/uint8.d.mts +12 -14
  166. package/dist/number/enum/uint8.d.mts.map +1 -1
  167. package/dist/number/enum/uint8.mjs +18 -23
  168. package/dist/number/enum/uint8.mjs.map +1 -1
  169. package/dist/number/index.d.mts +1 -1
  170. package/dist/number/index.d.mts.map +1 -1
  171. package/dist/number/index.mjs +1 -1
  172. package/dist/number/index.mjs.map +1 -1
  173. package/dist/number/num/impl/index.d.mts +2 -0
  174. package/dist/number/num/impl/index.d.mts.map +1 -0
  175. package/dist/number/num/impl/index.mjs +2 -0
  176. package/dist/number/num/impl/index.mjs.map +1 -0
  177. package/dist/number/num/impl/num.d.mts +531 -0
  178. package/dist/number/num/impl/num.d.mts.map +1 -0
  179. package/dist/number/num/impl/num.mjs +542 -0
  180. package/dist/number/num/impl/num.mjs.map +1 -0
  181. package/dist/number/num/index.d.mts +17 -0
  182. package/dist/number/num/index.d.mts.map +1 -0
  183. package/dist/number/num/index.mjs +17 -0
  184. package/dist/number/num/index.mjs.map +1 -0
  185. package/dist/number/operators/finite-number.d.mts +16 -0
  186. package/dist/number/operators/finite-number.d.mts.map +1 -0
  187. package/dist/number/operators/finite-number.mjs +7 -0
  188. package/dist/number/operators/finite-number.mjs.map +1 -0
  189. package/dist/number/operators/int.d.mts +16 -0
  190. package/dist/number/operators/int.d.mts.map +1 -0
  191. package/dist/number/operators/int.mjs +8 -0
  192. package/dist/number/operators/int.mjs.map +1 -0
  193. package/dist/number/operators/int16.d.mts +25 -0
  194. package/dist/number/operators/int16.d.mts.map +1 -0
  195. package/dist/number/operators/int16.mjs +8 -0
  196. package/dist/number/operators/int16.mjs.map +1 -0
  197. package/dist/number/operators/int32.d.mts +21 -0
  198. package/dist/number/operators/int32.d.mts.map +1 -0
  199. package/dist/number/operators/int32.mjs +8 -0
  200. package/dist/number/operators/int32.mjs.map +1 -0
  201. package/dist/number/operators/int8.d.mts +24 -0
  202. package/dist/number/operators/int8.d.mts.map +1 -0
  203. package/dist/number/operators/int8.mjs +8 -0
  204. package/dist/number/operators/int8.mjs.map +1 -0
  205. package/dist/number/operators/negative-finite-number.d.mts +11 -0
  206. package/dist/number/operators/negative-finite-number.d.mts.map +1 -0
  207. package/dist/number/operators/negative-finite-number.mjs +8 -0
  208. package/dist/number/operators/negative-finite-number.mjs.map +1 -0
  209. package/dist/number/operators/negative-int.d.mts +10 -0
  210. package/dist/number/operators/negative-int.d.mts.map +1 -0
  211. package/dist/number/operators/negative-int.mjs +9 -0
  212. package/dist/number/operators/negative-int.mjs.map +1 -0
  213. package/dist/number/operators/negative-safe-int.d.mts +10 -0
  214. package/dist/number/operators/negative-safe-int.d.mts.map +1 -0
  215. package/dist/number/operators/negative-safe-int.mjs +9 -0
  216. package/dist/number/operators/negative-safe-int.mjs.map +1 -0
  217. package/dist/number/operators/non-negative-finite-number.d.mts +22 -0
  218. package/dist/number/operators/non-negative-finite-number.d.mts.map +1 -0
  219. package/dist/number/operators/non-negative-finite-number.mjs +7 -0
  220. package/dist/number/operators/non-negative-finite-number.mjs.map +1 -0
  221. package/dist/number/operators/non-negative-int16.d.mts +27 -0
  222. package/dist/number/operators/non-negative-int16.d.mts.map +1 -0
  223. package/dist/number/operators/non-negative-int16.mjs +8 -0
  224. package/dist/number/operators/non-negative-int16.mjs.map +1 -0
  225. package/dist/number/operators/non-negative-int32.d.mts +25 -0
  226. package/dist/number/operators/non-negative-int32.d.mts.map +1 -0
  227. package/dist/number/operators/non-negative-int32.mjs +8 -0
  228. package/dist/number/operators/non-negative-int32.mjs.map +1 -0
  229. package/dist/number/operators/non-positive-finite-number.d.mts +11 -0
  230. package/dist/number/operators/non-positive-finite-number.d.mts.map +1 -0
  231. package/dist/number/operators/non-positive-finite-number.mjs +7 -0
  232. package/dist/number/operators/non-positive-finite-number.mjs.map +1 -0
  233. package/dist/number/operators/non-positive-int.d.mts +10 -0
  234. package/dist/number/operators/non-positive-int.d.mts.map +1 -0
  235. package/dist/number/operators/non-positive-int.mjs +8 -0
  236. package/dist/number/operators/non-positive-int.mjs.map +1 -0
  237. package/dist/number/operators/non-positive-safe-int.d.mts +10 -0
  238. package/dist/number/operators/non-positive-safe-int.d.mts.map +1 -0
  239. package/dist/number/operators/non-positive-safe-int.mjs +8 -0
  240. package/dist/number/operators/non-positive-safe-int.mjs.map +1 -0
  241. package/dist/number/operators/non-zero-finite-number.d.mts +16 -0
  242. package/dist/number/operators/non-zero-finite-number.d.mts.map +1 -0
  243. package/dist/number/operators/non-zero-finite-number.mjs +8 -0
  244. package/dist/number/operators/non-zero-finite-number.mjs.map +1 -0
  245. package/dist/number/operators/non-zero-int.d.mts +10 -0
  246. package/dist/number/operators/non-zero-int.d.mts.map +1 -0
  247. package/dist/number/operators/non-zero-int.mjs +9 -0
  248. package/dist/number/operators/non-zero-int.mjs.map +1 -0
  249. package/dist/number/operators/non-zero-int16.d.mts +10 -0
  250. package/dist/number/operators/non-zero-int16.d.mts.map +1 -0
  251. package/dist/number/operators/non-zero-int16.mjs +9 -0
  252. package/dist/number/operators/non-zero-int16.mjs.map +1 -0
  253. package/dist/number/operators/non-zero-int32.d.mts +10 -0
  254. package/dist/number/operators/non-zero-int32.d.mts.map +1 -0
  255. package/dist/number/operators/non-zero-int32.mjs +9 -0
  256. package/dist/number/operators/non-zero-int32.mjs.map +1 -0
  257. package/dist/number/operators/non-zero-safe-int.d.mts +10 -0
  258. package/dist/number/operators/non-zero-safe-int.d.mts.map +1 -0
  259. package/dist/number/operators/non-zero-safe-int.mjs +11 -0
  260. package/dist/number/operators/non-zero-safe-int.mjs.map +1 -0
  261. package/dist/number/operators/non-zero-uint16.d.mts +2 -0
  262. package/dist/number/operators/non-zero-uint16.d.mts.map +1 -0
  263. package/dist/number/operators/non-zero-uint16.mjs +9 -0
  264. package/dist/number/operators/non-zero-uint16.mjs.map +1 -0
  265. package/dist/number/operators/non-zero-uint32.d.mts +2 -0
  266. package/dist/number/operators/non-zero-uint32.d.mts.map +1 -0
  267. package/dist/number/operators/non-zero-uint32.mjs +9 -0
  268. package/dist/number/operators/non-zero-uint32.mjs.map +1 -0
  269. package/dist/number/operators/positive-finite-number.d.mts +23 -0
  270. package/dist/number/operators/positive-finite-number.d.mts.map +1 -0
  271. package/dist/number/operators/positive-finite-number.mjs +7 -0
  272. package/dist/number/operators/positive-finite-number.mjs.map +1 -0
  273. package/dist/number/operators/positive-int.d.mts +23 -0
  274. package/dist/number/operators/positive-int.d.mts.map +1 -0
  275. package/dist/number/operators/positive-int.mjs +8 -0
  276. package/dist/number/operators/positive-int.mjs.map +1 -0
  277. package/dist/number/operators/positive-int16.d.mts +28 -0
  278. package/dist/number/operators/positive-int16.d.mts.map +1 -0
  279. package/dist/number/operators/positive-int16.mjs +8 -0
  280. package/dist/number/operators/positive-int16.mjs.map +1 -0
  281. package/dist/number/operators/positive-int32.d.mts +26 -0
  282. package/dist/number/operators/positive-int32.d.mts.map +1 -0
  283. package/dist/number/operators/positive-int32.mjs +8 -0
  284. package/dist/number/operators/positive-int32.mjs.map +1 -0
  285. package/dist/number/operators/positive-safe-int.d.mts +24 -0
  286. package/dist/number/operators/positive-safe-int.d.mts.map +1 -0
  287. package/dist/number/operators/positive-safe-int.mjs +9 -0
  288. package/dist/number/operators/positive-safe-int.mjs.map +1 -0
  289. package/dist/number/operators/positive-uint16.d.mts +27 -0
  290. package/dist/number/operators/positive-uint16.d.mts.map +1 -0
  291. package/dist/number/operators/positive-uint16.mjs +8 -0
  292. package/dist/number/operators/positive-uint16.mjs.map +1 -0
  293. package/dist/number/operators/positive-uint32.d.mts +25 -0
  294. package/dist/number/operators/positive-uint32.d.mts.map +1 -0
  295. package/dist/number/operators/positive-uint32.mjs +8 -0
  296. package/dist/number/operators/positive-uint32.mjs.map +1 -0
  297. package/dist/number/operators/safe-int.d.mts +17 -0
  298. package/dist/number/operators/safe-int.d.mts.map +1 -0
  299. package/dist/number/operators/safe-int.mjs +10 -0
  300. package/dist/number/operators/safe-int.mjs.map +1 -0
  301. package/dist/number/operators/safe-uint.d.mts +22 -0
  302. package/dist/number/operators/safe-uint.d.mts.map +1 -0
  303. package/dist/number/operators/safe-uint.mjs +9 -0
  304. package/dist/number/operators/safe-uint.mjs.map +1 -0
  305. package/dist/number/operators/uint.d.mts +14 -0
  306. package/dist/number/operators/uint.d.mts.map +1 -0
  307. package/dist/number/operators/uint.mjs +8 -0
  308. package/dist/number/operators/uint.mjs.map +1 -0
  309. package/dist/number/operators/uint16.d.mts +25 -0
  310. package/dist/number/operators/uint16.d.mts.map +1 -0
  311. package/dist/number/operators/uint16.mjs +8 -0
  312. package/dist/number/operators/uint16.mjs.map +1 -0
  313. package/dist/number/operators/uint32.d.mts +23 -0
  314. package/dist/number/operators/uint32.d.mts.map +1 -0
  315. package/dist/number/operators/uint32.mjs +8 -0
  316. package/dist/number/operators/uint32.mjs.map +1 -0
  317. package/dist/number/operators/uint8.d.mts +24 -0
  318. package/dist/number/operators/uint8.d.mts.map +1 -0
  319. package/dist/number/operators/uint8.mjs +8 -0
  320. package/dist/number/operators/uint8.mjs.map +1 -0
  321. package/dist/number/refined-number-utils.d.mts +2 -2
  322. package/dist/number/refined-number-utils.d.mts.map +1 -1
  323. package/dist/number/refined-number-utils.mjs +1 -1
  324. package/dist/number/refined-number-utils.mjs.map +1 -1
  325. package/dist/object/object.d.mts +8 -0
  326. package/dist/object/object.d.mts.map +1 -1
  327. package/dist/object/object.mjs +17 -5
  328. package/dist/object/object.mjs.map +1 -1
  329. package/dist/others/fast-deep-equal.mjs +1 -1
  330. package/dist/others/fast-deep-equal.mjs.map +1 -1
  331. package/dist/others/replace-equal-deep.mjs +10 -3
  332. package/dist/others/replace-equal-deep.mjs.map +1 -1
  333. package/package.json +22 -9
  334. package/src/array/impl/array-utils-reducing-value.mts +4 -3
  335. package/src/array/impl/array-utils-shape-invariants.test.mts +1 -1
  336. package/src/array/impl/array-utils-slice-clamped.mts +1 -1
  337. package/src/array/impl/array-utils-slicing.mts +12 -3
  338. package/src/array/impl/array-utils-transformation.mts +7 -3
  339. package/src/array/impl/array-utils-transformation.test.mts +52 -3
  340. package/src/array/impl/array-utils-validation.mts +2 -1
  341. package/src/built-in-tag.mts +59 -0
  342. package/src/built-in-tag.test.mts +215 -0
  343. package/src/collections/imap-mapped.mts +6 -4
  344. package/src/collections/imap-mapped.test.mts +27 -0
  345. package/src/collections/imap.mts +6 -4
  346. package/src/collections/imap.test.mts +13 -0
  347. package/src/collections/stack.mts +3 -3
  348. package/src/iterator/range.mts +10 -2
  349. package/src/iterator/range.test.mts +7 -0
  350. package/src/json/json.mts +17 -57
  351. package/src/json/json.test.mts +32 -0
  352. package/src/number/branded-types/finite-number.mts +23 -25
  353. package/src/number/branded-types/int.mts +20 -26
  354. package/src/number/branded-types/int16.mts +21 -26
  355. package/src/number/branded-types/int32.mts +21 -26
  356. package/src/number/branded-types/negative-finite-number.mts +25 -26
  357. package/src/number/branded-types/negative-int.mts +20 -27
  358. package/src/number/branded-types/negative-safe-int.mts +23 -28
  359. package/src/number/branded-types/non-negative-finite-number.mts +24 -25
  360. package/src/number/branded-types/non-negative-int16.mts +23 -26
  361. package/src/number/branded-types/non-negative-int32.mts +23 -26
  362. package/src/number/branded-types/non-positive-finite-number.mts +24 -25
  363. package/src/number/branded-types/non-positive-int.mts +20 -26
  364. package/src/number/branded-types/non-positive-safe-int.mts +21 -26
  365. package/src/number/branded-types/non-zero-finite-number.mts +23 -25
  366. package/src/number/branded-types/non-zero-int.mts +19 -25
  367. package/src/number/branded-types/non-zero-int16.mts +27 -28
  368. package/src/number/branded-types/non-zero-int32.mts +27 -28
  369. package/src/number/branded-types/non-zero-safe-int.mts +25 -35
  370. package/src/number/branded-types/non-zero-uint16.mts +24 -28
  371. package/src/number/branded-types/non-zero-uint32.mts +24 -28
  372. package/src/number/branded-types/positive-finite-number.mts +25 -25
  373. package/src/number/branded-types/positive-int.mts +21 -26
  374. package/src/number/branded-types/positive-int16.mts +23 -26
  375. package/src/number/branded-types/positive-int32.mts +23 -26
  376. package/src/number/branded-types/positive-safe-int.mts +24 -31
  377. package/src/number/branded-types/positive-uint16.mts +23 -26
  378. package/src/number/branded-types/positive-uint32.mts +23 -26
  379. package/src/number/branded-types/safe-int.mts +22 -29
  380. package/src/number/branded-types/safe-uint.mts +21 -27
  381. package/src/number/branded-types/uint.mts +21 -26
  382. package/src/number/branded-types/uint16.mts +21 -26
  383. package/src/number/branded-types/uint32.mts +21 -26
  384. package/src/number/enum/int8.mts +40 -52
  385. package/src/number/enum/uint8.mts +40 -48
  386. package/src/number/index.mts +1 -1
  387. package/src/number/num/impl/index.mts +1 -0
  388. package/src/number/num/impl/num.mts +715 -0
  389. package/src/number/{num.test.mts → num/impl/num.test.mts} +17 -5
  390. package/src/number/num/index.mts +16 -0
  391. package/src/number/num-arithmetic.test.mts +1 -1
  392. package/src/number/operators/finite-number.mts +20 -0
  393. package/src/number/operators/int.mts +20 -0
  394. package/src/number/operators/int16.mts +33 -0
  395. package/src/number/operators/int32.mts +33 -0
  396. package/src/number/operators/int8.mts +18 -0
  397. package/src/number/operators/negative-finite-number.mts +22 -0
  398. package/src/number/operators/negative-int.mts +22 -0
  399. package/src/number/operators/negative-safe-int.mts +32 -0
  400. package/src/number/operators/non-negative-finite-number.mts +32 -0
  401. package/src/number/operators/non-negative-int16.mts +33 -0
  402. package/src/number/operators/non-negative-int32.mts +33 -0
  403. package/src/number/operators/non-positive-finite-number.mts +21 -0
  404. package/src/number/operators/non-positive-int.mts +21 -0
  405. package/src/number/operators/non-positive-safe-int.mts +31 -0
  406. package/src/number/operators/non-zero-finite-number.mts +21 -0
  407. package/src/number/operators/non-zero-int.mts +22 -0
  408. package/src/number/operators/non-zero-int16.mts +32 -0
  409. package/src/number/operators/non-zero-int32.mts +32 -0
  410. package/src/number/operators/non-zero-safe-int.mts +34 -0
  411. package/src/number/operators/non-zero-uint16.mts +32 -0
  412. package/src/number/operators/non-zero-uint32.mts +32 -0
  413. package/src/number/operators/positive-finite-number.mts +32 -0
  414. package/src/number/operators/positive-int.mts +32 -0
  415. package/src/number/operators/positive-int16.mts +33 -0
  416. package/src/number/operators/positive-int32.mts +33 -0
  417. package/src/number/operators/positive-safe-int.mts +34 -0
  418. package/src/number/operators/positive-uint16.mts +33 -0
  419. package/src/number/operators/positive-uint32.mts +33 -0
  420. package/src/number/operators/safe-int.mts +35 -0
  421. package/src/number/operators/safe-uint.mts +33 -0
  422. package/src/number/operators/uint.mts +31 -0
  423. package/src/number/operators/uint16.mts +32 -0
  424. package/src/number/operators/uint32.mts +32 -0
  425. package/src/number/operators/uint8.mts +16 -0
  426. package/src/number/refined-number-utils.mts +4 -4
  427. package/src/object/object.mts +33 -5
  428. package/src/object/object.test.mts +55 -0
  429. package/src/others/fast-deep-equal.mts +1 -1
  430. package/src/others/replace-equal-deep.mts +11 -4
  431. package/src/others/replace-equal-deep.test.mts +26 -0
  432. package/dist/number/num.d.mts +0 -546
  433. package/dist/number/num.d.mts.map +0 -1
  434. package/dist/number/num.mjs +0 -559
  435. package/dist/number/num.mjs.map +0 -1
  436. package/src/guard/is-error.test.mts +0 -145
  437. package/src/number/num.mts +0 -731
@@ -0,0 +1,32 @@
1
+ /**
2
+ * The operators of `PositiveFiniteNumber` other than `isPositiveFiniteNumber`
3
+ * and `asPositiveFiniteNumber`, which
4
+ * `../branded-types/positive-finite-number.mts` reads. Generated by
5
+ * `gen:branded-number`; `renderModule` in
6
+ * `scripts/gen-branded-number/render.mts` says why they are in a module of
7
+ * their own.
8
+ */
9
+ import type { PositiveFiniteNumber } from 'ts-type-forge';
10
+ import { TsDataForgeInternals } from '../refined-number-utils.mjs';
11
+
12
+ export const {
13
+ MIN_VALUE,
14
+ add,
15
+ div,
16
+ fromNumber,
17
+ is,
18
+ max,
19
+ min,
20
+ mul,
21
+ pow,
22
+ random,
23
+ sub,
24
+ } = TsDataForgeInternals.RefinedNumberUtils.operatorsForFloat<
25
+ PositiveFiniteNumber,
26
+ number,
27
+ number
28
+ >({
29
+ MIN_VALUE: Number.MIN_VALUE,
30
+ MAX_VALUE: Number.MAX_VALUE,
31
+ typeNameInMessage: 'a positive finite number',
32
+ } as const);
@@ -0,0 +1,32 @@
1
+ /**
2
+ * The operators of `PositiveInt` other than `isPositiveInt` and
3
+ * `asPositiveInt`, which `../branded-types/positive-int.mts` reads. Generated
4
+ * by `gen:branded-number`; `renderModule` in
5
+ * `scripts/gen-branded-number/render.mts` says why they are in a module of
6
+ * their own.
7
+ */
8
+ import type { PositiveInt } from 'ts-type-forge';
9
+ import { TsDataForgeInternals } from '../refined-number-utils.mjs';
10
+
11
+ export const {
12
+ MIN_VALUE,
13
+ add,
14
+ div,
15
+ fromNumber,
16
+ is,
17
+ max,
18
+ min,
19
+ mul,
20
+ pow,
21
+ random,
22
+ sub,
23
+ } = TsDataForgeInternals.RefinedNumberUtils.operatorsForInteger<
24
+ PositiveInt,
25
+ 1,
26
+ number
27
+ >({
28
+ integerOrSafeInteger: 'Integer',
29
+ MIN_VALUE: 1,
30
+ MAX_VALUE: Number.MAX_VALUE,
31
+ typeNameInMessage: 'a positive integer',
32
+ } as const);
@@ -0,0 +1,33 @@
1
+ /**
2
+ * The operators of `PositiveInt16` other than `isPositiveInt16` and
3
+ * `asPositiveInt16`, which `../branded-types/positive-int16.mts` reads.
4
+ * Generated by `gen:branded-number`; `renderModule` in
5
+ * `scripts/gen-branded-number/render.mts` says why they are in a module of
6
+ * their own.
7
+ */
8
+ import type { PositiveInt16 } from 'ts-type-forge';
9
+ import { TsDataForgeInternals } from '../refined-number-utils.mjs';
10
+
11
+ export const {
12
+ MAX_VALUE,
13
+ MIN_VALUE,
14
+ add,
15
+ div,
16
+ fromNumber,
17
+ is,
18
+ max,
19
+ min,
20
+ mul,
21
+ pow,
22
+ random,
23
+ sub,
24
+ } = TsDataForgeInternals.RefinedNumberUtils.operatorsForInteger<
25
+ PositiveInt16,
26
+ 1,
27
+ number
28
+ >({
29
+ integerOrSafeInteger: 'SafeInteger',
30
+ MIN_VALUE: 1,
31
+ MAX_VALUE: 2 ** 15 - 1,
32
+ typeNameInMessage: 'a positive integer in [1, 2^15)',
33
+ } as const);
@@ -0,0 +1,33 @@
1
+ /**
2
+ * The operators of `PositiveInt32` other than `isPositiveInt32` and
3
+ * `asPositiveInt32`, which `../branded-types/positive-int32.mts` reads.
4
+ * Generated by `gen:branded-number`; `renderModule` in
5
+ * `scripts/gen-branded-number/render.mts` says why they are in a module of
6
+ * their own.
7
+ */
8
+ import type { PositiveInt32 } from 'ts-type-forge';
9
+ import { TsDataForgeInternals } from '../refined-number-utils.mjs';
10
+
11
+ export const {
12
+ MAX_VALUE,
13
+ MIN_VALUE,
14
+ add,
15
+ div,
16
+ fromNumber,
17
+ is,
18
+ max,
19
+ min,
20
+ mul,
21
+ pow,
22
+ random,
23
+ sub,
24
+ } = TsDataForgeInternals.RefinedNumberUtils.operatorsForInteger<
25
+ PositiveInt32,
26
+ 1,
27
+ number
28
+ >({
29
+ integerOrSafeInteger: 'SafeInteger',
30
+ MIN_VALUE: 1,
31
+ MAX_VALUE: 2 ** 31 - 1,
32
+ typeNameInMessage: 'a positive integer in [1, 2^31)',
33
+ } as const);
@@ -0,0 +1,34 @@
1
+ /**
2
+ * The operators of `PositiveSafeInt` other than `isPositiveSafeInt` and
3
+ * `asPositiveSafeInt`, which `../branded-types/positive-safe-int.mts` reads.
4
+ * Generated by `gen:branded-number`; `renderModule` in
5
+ * `scripts/gen-branded-number/render.mts` says why they are in a module of
6
+ * their own.
7
+ */
8
+ import type { PositiveSafeInt, SafeUint } from 'ts-type-forge';
9
+ import { TsDataForgeInternals } from '../refined-number-utils.mjs';
10
+
11
+ export const {
12
+ MAX_VALUE,
13
+ MIN_VALUE,
14
+ add,
15
+ div,
16
+ fromNumber,
17
+ is,
18
+ max,
19
+ min,
20
+ mul,
21
+ pow,
22
+ random,
23
+ sub,
24
+ } = TsDataForgeInternals.RefinedNumberUtils.operatorsForInteger<
25
+ PositiveSafeInt,
26
+ 1,
27
+ SafeUint
28
+ >({
29
+ integerOrSafeInteger: 'SafeInteger',
30
+ MIN_VALUE: 1,
31
+ // eslint-disable-next-line total-functions/no-unsafe-type-assertion, math/prefer-number-max-safe-integer
32
+ MAX_VALUE: Number.MAX_SAFE_INTEGER as SafeUint,
33
+ typeNameInMessage: 'a positive safe integer',
34
+ } as const);
@@ -0,0 +1,33 @@
1
+ /**
2
+ * The operators of `PositiveUint16` other than `isPositiveUint16` and
3
+ * `asPositiveUint16`, which `../branded-types/positive-uint16.mts` reads.
4
+ * Generated by `gen:branded-number`; `renderModule` in
5
+ * `scripts/gen-branded-number/render.mts` says why they are in a module of
6
+ * their own.
7
+ */
8
+ import type { PositiveUint16 } from 'ts-type-forge';
9
+ import { TsDataForgeInternals } from '../refined-number-utils.mjs';
10
+
11
+ export const {
12
+ MAX_VALUE,
13
+ MIN_VALUE,
14
+ add,
15
+ div,
16
+ fromNumber,
17
+ is,
18
+ max,
19
+ min,
20
+ mul,
21
+ pow,
22
+ random,
23
+ sub,
24
+ } = TsDataForgeInternals.RefinedNumberUtils.operatorsForInteger<
25
+ PositiveUint16,
26
+ 1,
27
+ number
28
+ >({
29
+ integerOrSafeInteger: 'SafeInteger',
30
+ MIN_VALUE: 1,
31
+ MAX_VALUE: 2 ** 16 - 1,
32
+ typeNameInMessage: 'a positive integer in [1, 2^16)',
33
+ } as const);
@@ -0,0 +1,33 @@
1
+ /**
2
+ * The operators of `PositiveUint32` other than `isPositiveUint32` and
3
+ * `asPositiveUint32`, which `../branded-types/positive-uint32.mts` reads.
4
+ * Generated by `gen:branded-number`; `renderModule` in
5
+ * `scripts/gen-branded-number/render.mts` says why they are in a module of
6
+ * their own.
7
+ */
8
+ import type { PositiveUint32 } from 'ts-type-forge';
9
+ import { TsDataForgeInternals } from '../refined-number-utils.mjs';
10
+
11
+ export const {
12
+ MAX_VALUE,
13
+ MIN_VALUE,
14
+ add,
15
+ div,
16
+ fromNumber,
17
+ is,
18
+ max,
19
+ min,
20
+ mul,
21
+ pow,
22
+ random,
23
+ sub,
24
+ } = TsDataForgeInternals.RefinedNumberUtils.operatorsForInteger<
25
+ PositiveUint32,
26
+ 1,
27
+ number
28
+ >({
29
+ integerOrSafeInteger: 'SafeInteger',
30
+ MIN_VALUE: 1,
31
+ MAX_VALUE: 2 ** 32 - 1,
32
+ typeNameInMessage: 'a positive integer in [1, 2^32)',
33
+ } as const);
@@ -0,0 +1,35 @@
1
+ /**
2
+ * The operators of `SafeInt` other than `isSafeInt` and `asSafeInt`, which
3
+ * `../branded-types/safe-int.mts` reads. Generated by `gen:branded-number`;
4
+ * `renderModule` in `scripts/gen-branded-number/render.mts` says why they are
5
+ * in a module of their own.
6
+ */
7
+ import type { SafeInt, SafeUint } from 'ts-type-forge';
8
+ import { TsDataForgeInternals } from '../refined-number-utils.mjs';
9
+
10
+ export const {
11
+ MAX_VALUE,
12
+ MIN_VALUE,
13
+ abs,
14
+ add,
15
+ div,
16
+ fromNumber,
17
+ is,
18
+ max,
19
+ min,
20
+ mul,
21
+ pow,
22
+ random,
23
+ sub,
24
+ } = TsDataForgeInternals.RefinedNumberUtils.operatorsForInteger<
25
+ SafeInt,
26
+ SafeInt,
27
+ SafeUint
28
+ >({
29
+ integerOrSafeInteger: 'SafeInteger',
30
+ // eslint-disable-next-line total-functions/no-unsafe-type-assertion, math/prefer-number-min-safe-integer
31
+ MIN_VALUE: Number.MIN_SAFE_INTEGER as SafeInt,
32
+ // eslint-disable-next-line total-functions/no-unsafe-type-assertion, math/prefer-number-max-safe-integer
33
+ MAX_VALUE: Number.MAX_SAFE_INTEGER as SafeUint,
34
+ typeNameInMessage: 'a safe integer',
35
+ } as const);
@@ -0,0 +1,33 @@
1
+ /**
2
+ * The operators of `SafeUint` other than `isSafeUint` and `asSafeUint`, which
3
+ * `../branded-types/safe-uint.mts` reads. Generated by `gen:branded-number`;
4
+ * `renderModule` in `scripts/gen-branded-number/render.mts` says why they are
5
+ * in a module of their own.
6
+ */
7
+ import type { SafeUint } from 'ts-type-forge';
8
+ import { TsDataForgeInternals } from '../refined-number-utils.mjs';
9
+
10
+ export const {
11
+ MAX_VALUE,
12
+ MIN_VALUE,
13
+ add,
14
+ div,
15
+ fromNumber,
16
+ is,
17
+ max,
18
+ min,
19
+ mul,
20
+ pow,
21
+ random,
22
+ sub,
23
+ } = TsDataForgeInternals.RefinedNumberUtils.operatorsForInteger<
24
+ SafeUint,
25
+ 0,
26
+ SafeUint
27
+ >({
28
+ integerOrSafeInteger: 'SafeInteger',
29
+ MIN_VALUE: 0,
30
+ // eslint-disable-next-line total-functions/no-unsafe-type-assertion, math/prefer-number-max-safe-integer
31
+ MAX_VALUE: Number.MAX_SAFE_INTEGER as SafeUint,
32
+ typeNameInMessage: 'a non-negative safe integer',
33
+ } as const);
@@ -0,0 +1,31 @@
1
+ /**
2
+ * The operators of `Uint` other than `isUint` and `asUint`, which
3
+ * `../branded-types/uint.mts` reads. Generated by `gen:branded-number`;
4
+ * `renderModule` in `scripts/gen-branded-number/render.mts` says why they are
5
+ * in a module of their own.
6
+ */
7
+ import type { Uint } from 'ts-type-forge';
8
+ import { TsDataForgeInternals } from '../refined-number-utils.mjs';
9
+
10
+ export const {
11
+ MIN_VALUE,
12
+ add,
13
+ div,
14
+ fromNumber,
15
+ is,
16
+ max,
17
+ min,
18
+ mul,
19
+ pow,
20
+ random,
21
+ sub,
22
+ } = TsDataForgeInternals.RefinedNumberUtils.operatorsForInteger<
23
+ Uint,
24
+ 0,
25
+ number
26
+ >({
27
+ integerOrSafeInteger: 'Integer',
28
+ MIN_VALUE: 0,
29
+ MAX_VALUE: Number.MAX_VALUE,
30
+ typeNameInMessage: 'a non-negative integer',
31
+ } as const);
@@ -0,0 +1,32 @@
1
+ /**
2
+ * The operators of `Uint16` other than `isUint16` and `asUint16`, which
3
+ * `../branded-types/uint16.mts` reads. Generated by `gen:branded-number`;
4
+ * `renderModule` in `scripts/gen-branded-number/render.mts` says why they are
5
+ * in a module of their own.
6
+ */
7
+ import type { Uint16 } from 'ts-type-forge';
8
+ import { TsDataForgeInternals } from '../refined-number-utils.mjs';
9
+
10
+ export const {
11
+ MAX_VALUE,
12
+ MIN_VALUE,
13
+ add,
14
+ div,
15
+ fromNumber,
16
+ is,
17
+ max,
18
+ min,
19
+ mul,
20
+ pow,
21
+ random,
22
+ sub,
23
+ } = TsDataForgeInternals.RefinedNumberUtils.operatorsForInteger<
24
+ Uint16,
25
+ 0,
26
+ number
27
+ >({
28
+ integerOrSafeInteger: 'SafeInteger',
29
+ MIN_VALUE: 0,
30
+ MAX_VALUE: 2 ** 16 - 1,
31
+ typeNameInMessage: 'a non-negative integer less than 2^16',
32
+ } as const);
@@ -0,0 +1,32 @@
1
+ /**
2
+ * The operators of `Uint32` other than `isUint32` and `asUint32`, which
3
+ * `../branded-types/uint32.mts` reads. Generated by `gen:branded-number`;
4
+ * `renderModule` in `scripts/gen-branded-number/render.mts` says why they are
5
+ * in a module of their own.
6
+ */
7
+ import type { Uint32 } from 'ts-type-forge';
8
+ import { TsDataForgeInternals } from '../refined-number-utils.mjs';
9
+
10
+ export const {
11
+ MAX_VALUE,
12
+ MIN_VALUE,
13
+ add,
14
+ div,
15
+ fromNumber,
16
+ is,
17
+ max,
18
+ min,
19
+ mul,
20
+ pow,
21
+ random,
22
+ sub,
23
+ } = TsDataForgeInternals.RefinedNumberUtils.operatorsForInteger<
24
+ Uint32,
25
+ 0,
26
+ number
27
+ >({
28
+ integerOrSafeInteger: 'SafeInteger',
29
+ MIN_VALUE: 0,
30
+ MAX_VALUE: 2 ** 32 - 1,
31
+ typeNameInMessage: 'a non-negative integer less than 2^32',
32
+ } as const);
@@ -0,0 +1,16 @@
1
+ /**
2
+ * The operators of `Uint8` other than `isUint8` and `asUint8`, which
3
+ * `../enum/uint8.mts` reads. Generated by `gen:branded-number`; `renderModule`
4
+ * in `scripts/gen-branded-number/render.mts` says why they are in a module of
5
+ * their own.
6
+ */
7
+ import type { Uint16 } from 'ts-type-forge';
8
+ import { TsDataForgeInternals } from '../refined-number-utils.mjs';
9
+
10
+ export const { MAX_VALUE, MIN_VALUE, castType, fromNumber, is, random } =
11
+ TsDataForgeInternals.RefinedNumberUtils.operatorsForInteger<Uint16, 0, 255>({
12
+ integerOrSafeInteger: 'SafeInteger',
13
+ MIN_VALUE: 0,
14
+ MAX_VALUE: 255,
15
+ typeNameInMessage: 'an non-negative integer less than 256',
16
+ } as const);
@@ -17,7 +17,7 @@ import type {
17
17
  } from 'ts-type-forge';
18
18
  import { expectType } from '../expect-type.mjs';
19
19
  import { pipe } from '../functional/index.mjs';
20
- import { Num } from './num.mjs';
20
+ import * as Num from './num/impl/index.mjs';
21
21
 
22
22
  /** @internal */
23
23
  export namespace TsDataForgeInternals {
@@ -106,6 +106,9 @@ export namespace TsDataForgeInternals {
106
106
 
107
107
  type CastToInt<N> = N extends Int ? N : never;
108
108
 
109
+ /** The closed binary arithmetic operations a branded namespace may expose. */
110
+ export type NumberClassBinOp = 'add' | 'div' | 'mul' | 'sub';
111
+
109
112
  /**
110
113
  * Generates a type-safe API for a branded number type based on its
111
114
  * characteristics.
@@ -122,9 +125,6 @@ export namespace TsDataForgeInternals {
122
125
  * 'positive' | 'range'
123
126
  * @internal
124
127
  */
125
- /** The closed binary arithmetic operations a branded namespace may expose. */
126
- export type NumberClassBinOp = 'add' | 'div' | 'mul' | 'sub';
127
-
128
128
  export type NumberClass<
129
129
  N extends UnknownNumberBrand,
130
130
  classes extends 'int' | 'non-negative' | 'positive' | 'range',
@@ -16,7 +16,7 @@ import type {
16
16
  TypeEq,
17
17
  UnknownRecord,
18
18
  } from 'ts-type-forge';
19
- import { Arr } from '../array/index.mjs';
19
+ import * as Arr from '../array/impl/index.mjs';
20
20
  import { Optional } from '../functional/index.mjs';
21
21
  import { hasKey, isRecord } from '../guard/index.mjs';
22
22
 
@@ -91,6 +91,10 @@ export namespace Obj {
91
91
  * **Type Safety**: Only keys that exist in the source record type are
92
92
  * allowed, preventing runtime errors from accessing non-existent properties.
93
93
  *
94
+ * **Key handling**: a numeric key `1` matches the property `'1'`, and
95
+ * symbol-keyed properties are picked like string-keyed ones. Only own
96
+ * enumerable properties are read.
97
+ *
94
98
  * @example
95
99
  *
96
100
  * ```ts
@@ -150,12 +154,12 @@ export namespace Obj {
150
154
  case 2: {
151
155
  const [record, keys] = args;
152
156
 
153
- const keysSet = new Set<keyof R>(keys);
157
+ const keysSet = toOwnKeySet(keys);
154
158
 
155
159
  return (
156
160
  // eslint-disable-next-line total-functions/no-unsafe-type-assertion
157
161
  Object.fromEntries(
158
- Object.entries(record).filter(([k, _v]) => keysSet.has(k)),
162
+ ownEnumerableEntries(record).filter(([k]) => keysSet.has(k)),
159
163
  ) as never
160
164
  );
161
165
  }
@@ -177,6 +181,10 @@ export namespace Obj {
177
181
  * allowed, and the return type precisely reflects which properties remain
178
182
  * after omission.
179
183
  *
184
+ * **Key handling**: a numeric key `1` matches the property `'1'`, and
185
+ * symbol-keyed properties are kept unless omitted, like string-keyed ones.
186
+ * Only own enumerable properties are copied.
187
+ *
180
188
  * @example
181
189
  *
182
190
  * ```ts
@@ -238,12 +246,12 @@ export namespace Obj {
238
246
  case 2: {
239
247
  const [record, keys] = args;
240
248
 
241
- const keysSet = new Set<keyof R>(keys);
249
+ const keysSet = toOwnKeySet(keys);
242
250
 
243
251
  return (
244
252
  // eslint-disable-next-line total-functions/no-unsafe-type-assertion
245
253
  Object.fromEntries(
246
- Object.entries(record).filter(([k, _v]) => !keysSet.has(k)),
254
+ ownEnumerableEntries(record).filter(([k]) => !keysSet.has(k)),
247
255
  ) as never
248
256
  );
249
257
  }
@@ -996,3 +1004,23 @@ declare namespace TsDataForgeInternals {
996
1004
  ? MergeAll<Rest, MergeTwo<Acc, First>>
997
1005
  : Acc;
998
1006
  }
1007
+
1008
+ /**
1009
+ * The keys as `Reflect.ownKeys` reports them: a numeric key `1` becomes `'1'`,
1010
+ * a symbol stays a symbol.
1011
+ */
1012
+ const toOwnKeySet = (
1013
+ keys: readonly PropertyKey[],
1014
+ ): ReadonlySet<string | symbol> =>
1015
+ new Set(keys.map((k) => (typeof k === 'number' ? k.toString() : k)));
1016
+
1017
+ /**
1018
+ * The own enumerable entries of `record`, string and symbol keys alike, in
1019
+ * `Reflect.ownKeys` order. `Object.entries` would leave out the symbols.
1020
+ */
1021
+ const ownEnumerableEntries = (
1022
+ record: UnknownRecord,
1023
+ ): readonly (readonly [string | symbol, unknown])[] =>
1024
+ Reflect.ownKeys(record)
1025
+ .filter((k) => Object.prototype.propertyIsEnumerable.call(record, k))
1026
+ .map((k) => [k, Reflect.get(record, k)] as const);
@@ -89,6 +89,32 @@ describe('pick', () => {
89
89
 
90
90
  assert.deepStrictEqual(result, { name: 'Alice' });
91
91
  });
92
+
93
+ test('pick matches a numeric key', () => {
94
+ const record = { 1: 'a', b: 2 } as const;
95
+
96
+ const result = Obj.pick(record, [1]);
97
+
98
+ expectType<typeof result, Readonly<{ 1: 'a' }>>('=');
99
+
100
+ assert.deepStrictEqual(result, { 1: 'a' });
101
+
102
+ assert.deepStrictEqual(Obj.pick([1])(record), { 1: 'a' });
103
+ });
104
+
105
+ test('pick matches a symbol key', () => {
106
+ const sym = Symbol('s');
107
+
108
+ const record = { [sym]: 'a', b: 2 } as const;
109
+
110
+ const result = Obj.pick(record, [sym]);
111
+
112
+ assert.deepStrictEqual(result, { [sym]: 'a' });
113
+
114
+ assert.deepStrictEqual(Obj.pick([sym])(record), { [sym]: 'a' });
115
+
116
+ assert.deepStrictEqual(Obj.pick(record, ['b']), { b: 2 });
117
+ });
92
118
  });
93
119
 
94
120
  describe('omit', () => {
@@ -132,6 +158,35 @@ describe('omit', () => {
132
158
  assert.deepStrictEqual(result, original);
133
159
  });
134
160
 
161
+ test('omit matches a numeric key', () => {
162
+ const record = { 1: 'a', b: 2 } as const;
163
+
164
+ const result = Obj.omit(record, [1]);
165
+
166
+ expectType<typeof result, Readonly<{ b: 2 }>>('=');
167
+
168
+ assert.deepStrictEqual(result, { b: 2 });
169
+
170
+ assert.deepStrictEqual(Obj.omit([1])(record), { b: 2 });
171
+ });
172
+
173
+ test('omit keeps the symbol keys it is not asked to omit', () => {
174
+ const sym = Symbol('s');
175
+
176
+ const other = Symbol('other');
177
+
178
+ const record = { [sym]: 'a', [other]: 'o', b: 2 } as const;
179
+
180
+ assert.deepStrictEqual(Obj.omit(record, [sym]), { [other]: 'o', b: 2 });
181
+
182
+ assert.deepStrictEqual(Obj.omit([sym])(record), { [other]: 'o', b: 2 });
183
+
184
+ assert.deepStrictEqual(Obj.omit(record, ['b']), {
185
+ [sym]: 'a',
186
+ [other]: 'o',
187
+ });
188
+ });
189
+
135
190
  test('should omit multiple keys in curried form', () => {
136
191
  const omitBAndD = Obj.omit(['b', 'd']);
137
192
 
@@ -1,4 +1,4 @@
1
- import { isMap, isRegExp, isSet, isTypedArray } from '@sindresorhus/is';
1
+ import { isMap, isRegExp, isSet, isTypedArray } from '../built-in-tag.mjs';
2
2
  import { hasKey, isRecord } from '../guard/index.mjs';
3
3
 
4
4
  /**
@@ -1,4 +1,4 @@
1
- import type { MutableRecord, UnknownRecord } from 'ts-type-forge';
1
+ import type { UnknownRecord } from 'ts-type-forge';
2
2
  import { hasKey, isRecord } from '../guard/index.mjs';
3
3
  import { fastDeepEqual } from './fast-deep-equal.mjs';
4
4
 
@@ -202,7 +202,10 @@ const replaceObject = (
202
202
 
203
203
  let mut_isNext = true;
204
204
 
205
- const mut_shared: MutableRecord<string, unknown> = {};
205
+ // Entries rather than `copy[k] = result`: assigning an own `__proto__` key
206
+ // (which `JSON.parse` produces) would call the setter and replace the copy's
207
+ // prototype, while `Object.fromEntries` defines it as a property.
208
+ const mut_sharedEntries: (readonly [string, unknown])[] = [];
206
209
 
207
210
  for (const k of nextKeys) {
208
211
  const value = next[k];
@@ -215,10 +218,14 @@ const replaceObject = (
215
218
 
216
219
  mut_isNext &&= Object.is(result, value);
217
220
 
218
- mut_shared[k] = result;
221
+ mut_sharedEntries.push([k, result]);
219
222
  }
220
223
 
221
- return mut_isCurrent ? current : mut_isNext ? next : mut_shared;
224
+ return mut_isCurrent
225
+ ? current
226
+ : mut_isNext
227
+ ? next
228
+ : Object.fromEntries(mut_sharedEntries);
222
229
  };
223
230
 
224
231
  // What an item of `next` is matched with when nothing of `current` is.
@@ -117,6 +117,32 @@ describe(replaceEqualDeep, () => {
117
117
  assert.isFalse(Object.hasOwn(shared, 'a'));
118
118
  });
119
119
 
120
+ test('copies an own __proto__ key as a property, not as the prototype', () => {
121
+ const current: unknown = JSON.parse('{"__proto__":{"x":1},"a":[1]}');
122
+
123
+ const next: unknown = JSON.parse('{"__proto__":{"x":1},"a":[2]}');
124
+
125
+ const result = replaceEqualDeep(current, next);
126
+
127
+ assert.isTrue(isRecord(result));
128
+
129
+ assert.strictEqual(Object.getPrototypeOf(result), Object.prototype);
130
+
131
+ assert.deepStrictEqual(Object.keys(result), ['__proto__', 'a']);
132
+
133
+ assert.strictEqual(JSON.stringify(result), '{"__proto__":{"x":1},"a":[2]}');
134
+
135
+ assert.notProperty(result, 'x');
136
+
137
+ // The unchanged `__proto__` value is reused from `current`.
138
+ assert.isTrue(isRecord(current));
139
+
140
+ assert.strictEqual(
141
+ Object.getOwnPropertyDescriptor(result, '__proto__')?.value,
142
+ Object.getOwnPropertyDescriptor(current, '__proto__')?.value,
143
+ );
144
+ });
145
+
120
146
  test('matches array items by index by default', () => {
121
147
  const one: Numbered = { number: 1 } as const;
122
148