@fluixi/utils 1.0.0-alpha.100

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 (364) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +68 -0
  3. package/dist/index.cjs +2858 -0
  4. package/dist/index.d.ts +2 -0
  5. package/dist/index.d.ts.map +1 -0
  6. package/dist/index.js +1 -0
  7. package/dist/index.mjs +2838 -0
  8. package/dist/lib/array/advanced.cjs +2227 -0
  9. package/dist/lib/array/advanced.d.ts +1116 -0
  10. package/dist/lib/array/advanced.d.ts.map +1 -0
  11. package/dist/lib/array/advanced.js +2429 -0
  12. package/dist/lib/array/advanced.mjs +2204 -0
  13. package/dist/lib/array/array.cjs +57 -0
  14. package/dist/lib/array/array.d.ts +6 -0
  15. package/dist/lib/array/array.d.ts.map +1 -0
  16. package/dist/lib/array/array.js +31 -0
  17. package/dist/lib/array/array.mjs +36 -0
  18. package/dist/lib/array/index.cjs +2344 -0
  19. package/dist/lib/array/index.d.ts +4 -0
  20. package/dist/lib/array/index.d.ts.map +1 -0
  21. package/dist/lib/array/index.js +3 -0
  22. package/dist/lib/array/index.mjs +2322 -0
  23. package/dist/lib/array/utils.cjs +103 -0
  24. package/dist/lib/array/utils.d.ts +100 -0
  25. package/dist/lib/array/utils.d.ts.map +1 -0
  26. package/dist/lib/array/utils.js +165 -0
  27. package/dist/lib/array/utils.mjs +82 -0
  28. package/dist/lib/color/color.cjs +2190 -0
  29. package/dist/lib/color/color.d.ts +366 -0
  30. package/dist/lib/color/color.d.ts.map +1 -0
  31. package/dist/lib/color/color.js +722 -0
  32. package/dist/lib/color/color.mjs +2167 -0
  33. package/dist/lib/color/constants.cjs +380 -0
  34. package/dist/lib/color/constants.d.ts +361 -0
  35. package/dist/lib/color/constants.d.ts.map +1 -0
  36. package/dist/lib/color/constants.js +358 -0
  37. package/dist/lib/color/constants.mjs +359 -0
  38. package/dist/lib/color/conversions.cjs +629 -0
  39. package/dist/lib/color/conversions.d.ts +166 -0
  40. package/dist/lib/color/conversions.d.ts.map +1 -0
  41. package/dist/lib/color/conversions.js +766 -0
  42. package/dist/lib/color/conversions.mjs +608 -0
  43. package/dist/lib/color/helpers.cjs +2534 -0
  44. package/dist/lib/color/helpers.d.ts +75 -0
  45. package/dist/lib/color/helpers.d.ts.map +1 -0
  46. package/dist/lib/color/helpers.js +419 -0
  47. package/dist/lib/color/helpers.mjs +2511 -0
  48. package/dist/lib/color/index.cjs +2641 -0
  49. package/dist/lib/color/index.d.ts +12 -0
  50. package/dist/lib/color/index.d.ts.map +1 -0
  51. package/dist/lib/color/index.js +15 -0
  52. package/dist/lib/color/index.mjs +2619 -0
  53. package/dist/lib/color/types.cjs +18 -0
  54. package/dist/lib/color/types.d.ts +179 -0
  55. package/dist/lib/color/types.d.ts.map +1 -0
  56. package/dist/lib/color/types.js +1 -0
  57. package/dist/lib/color/types.mjs +0 -0
  58. package/dist/lib/color/utils.cjs +962 -0
  59. package/dist/lib/color/utils.d.ts +199 -0
  60. package/dist/lib/color/utils.d.ts.map +1 -0
  61. package/dist/lib/color/utils.js +858 -0
  62. package/dist/lib/color/utils.mjs +939 -0
  63. package/dist/lib/compare/comparators.cjs +171 -0
  64. package/dist/lib/compare/comparators.d.ts +65 -0
  65. package/dist/lib/compare/comparators.d.ts.map +1 -0
  66. package/dist/lib/compare/comparators.js +210 -0
  67. package/dist/lib/compare/comparators.mjs +150 -0
  68. package/dist/lib/compare/index.cjs +172 -0
  69. package/dist/lib/compare/index.d.ts +2 -0
  70. package/dist/lib/compare/index.d.ts.map +1 -0
  71. package/dist/lib/compare/index.js +1 -0
  72. package/dist/lib/compare/index.mjs +152 -0
  73. package/dist/lib/cookie/codec.cjs +72 -0
  74. package/dist/lib/cookie/codec.d.ts +22 -0
  75. package/dist/lib/cookie/codec.d.ts.map +1 -0
  76. package/dist/lib/cookie/codec.js +67 -0
  77. package/dist/lib/cookie/codec.mjs +51 -0
  78. package/dist/lib/cookie/index.cjs +75 -0
  79. package/dist/lib/cookie/index.d.ts +2 -0
  80. package/dist/lib/cookie/index.d.ts.map +1 -0
  81. package/dist/lib/cookie/index.js +1 -0
  82. package/dist/lib/cookie/index.mjs +53 -0
  83. package/dist/lib/crypto/hash.cjs +83 -0
  84. package/dist/lib/crypto/hash.d.ts +6 -0
  85. package/dist/lib/crypto/hash.d.ts.map +1 -0
  86. package/dist/lib/crypto/hash.js +53 -0
  87. package/dist/lib/crypto/hash.mjs +62 -0
  88. package/dist/lib/crypto/index.cjs +85 -0
  89. package/dist/lib/crypto/index.d.ts +2 -0
  90. package/dist/lib/crypto/index.d.ts.map +1 -0
  91. package/dist/lib/crypto/index.js +1 -0
  92. package/dist/lib/crypto/index.mjs +62 -0
  93. package/dist/lib/dom/events.cjs +40 -0
  94. package/dist/lib/dom/events.d.ts +159 -0
  95. package/dist/lib/dom/events.d.ts.map +1 -0
  96. package/dist/lib/dom/events.js +50 -0
  97. package/dist/lib/dom/events.mjs +19 -0
  98. package/dist/lib/dom/index.cjs +78 -0
  99. package/dist/lib/dom/index.d.ts +3 -0
  100. package/dist/lib/dom/index.d.ts.map +1 -0
  101. package/dist/lib/dom/index.js +2 -0
  102. package/dist/lib/dom/index.mjs +56 -0
  103. package/dist/lib/dom/utils.cjs +57 -0
  104. package/dist/lib/dom/utils.d.ts +6 -0
  105. package/dist/lib/dom/utils.d.ts.map +1 -0
  106. package/dist/lib/dom/utils.js +37 -0
  107. package/dist/lib/dom/utils.mjs +36 -0
  108. package/dist/lib/functions/functions.cjs +366 -0
  109. package/dist/lib/functions/functions.d.ts +329 -0
  110. package/dist/lib/functions/functions.d.ts.map +1 -0
  111. package/dist/lib/functions/functions.js +585 -0
  112. package/dist/lib/functions/functions.mjs +345 -0
  113. package/dist/lib/functions/index.cjs +369 -0
  114. package/dist/lib/functions/index.d.ts +3 -0
  115. package/dist/lib/functions/index.d.ts.map +1 -0
  116. package/dist/lib/functions/index.js +1 -0
  117. package/dist/lib/functions/index.mjs +347 -0
  118. package/dist/lib/functions/types.cjs +18 -0
  119. package/dist/lib/functions/types.d.ts +2 -0
  120. package/dist/lib/functions/types.d.ts.map +1 -0
  121. package/dist/lib/functions/types.js +1 -0
  122. package/dist/lib/functions/types.mjs +0 -0
  123. package/dist/lib/helpers.cjs +78 -0
  124. package/dist/lib/helpers.d.ts +13 -0
  125. package/dist/lib/helpers.d.ts.map +1 -0
  126. package/dist/lib/helpers.js +66 -0
  127. package/dist/lib/helpers.mjs +59 -0
  128. package/dist/lib/index.cjs +2857 -0
  129. package/dist/lib/index.d.ts +6 -0
  130. package/dist/lib/index.d.ts.map +1 -0
  131. package/dist/lib/index.js +8 -0
  132. package/dist/lib/index.mjs +2836 -0
  133. package/dist/lib/maths/constants.cjs +70 -0
  134. package/dist/lib/maths/constants.d.ts +84 -0
  135. package/dist/lib/maths/constants.d.ts.map +1 -0
  136. package/dist/lib/maths/constants.js +79 -0
  137. package/dist/lib/maths/constants.mjs +50 -0
  138. package/dist/lib/maths/fn/advanced.cjs +231 -0
  139. package/dist/lib/maths/fn/advanced.d.ts +149 -0
  140. package/dist/lib/maths/fn/advanced.d.ts.map +1 -0
  141. package/dist/lib/maths/fn/advanced.js +264 -0
  142. package/dist/lib/maths/fn/advanced.mjs +208 -0
  143. package/dist/lib/maths/fn/basic.cjs +212 -0
  144. package/dist/lib/maths/fn/basic.d.ts +182 -0
  145. package/dist/lib/maths/fn/basic.d.ts.map +1 -0
  146. package/dist/lib/maths/fn/basic.js +343 -0
  147. package/dist/lib/maths/fn/basic.mjs +191 -0
  148. package/dist/lib/maths/fn/complex.cjs +268 -0
  149. package/dist/lib/maths/fn/complex.d.ts +153 -0
  150. package/dist/lib/maths/fn/complex.d.ts.map +1 -0
  151. package/dist/lib/maths/fn/complex.js +383 -0
  152. package/dist/lib/maths/fn/complex.mjs +247 -0
  153. package/dist/lib/maths/fn/index.cjs +877 -0
  154. package/dist/lib/maths/fn/index.d.ts +10 -0
  155. package/dist/lib/maths/fn/index.d.ts.map +1 -0
  156. package/dist/lib/maths/fn/index.js +9 -0
  157. package/dist/lib/maths/fn/index.mjs +855 -0
  158. package/dist/lib/maths/fn/trigo.cjs +179 -0
  159. package/dist/lib/maths/fn/trigo.d.ts +147 -0
  160. package/dist/lib/maths/fn/trigo.d.ts.map +1 -0
  161. package/dist/lib/maths/fn/trigo.js +227 -0
  162. package/dist/lib/maths/fn/trigo.mjs +156 -0
  163. package/dist/lib/maths/fn/vector.cjs +728 -0
  164. package/dist/lib/maths/fn/vector.d.ts +512 -0
  165. package/dist/lib/maths/fn/vector.d.ts.map +1 -0
  166. package/dist/lib/maths/fn/vector.js +1136 -0
  167. package/dist/lib/maths/fn/vector.mjs +707 -0
  168. package/dist/lib/maths/formatter.cjs +61 -0
  169. package/dist/lib/maths/formatter.d.ts +35 -0
  170. package/dist/lib/maths/formatter.d.ts.map +1 -0
  171. package/dist/lib/maths/formatter.js +56 -0
  172. package/dist/lib/maths/formatter.mjs +40 -0
  173. package/dist/lib/maths/guards.cjs +164 -0
  174. package/dist/lib/maths/guards.d.ts +166 -0
  175. package/dist/lib/maths/guards.d.ts.map +1 -0
  176. package/dist/lib/maths/guards.js +315 -0
  177. package/dist/lib/maths/guards.mjs +144 -0
  178. package/dist/lib/maths/index.cjs +1152 -0
  179. package/dist/lib/maths/index.d.ts +24 -0
  180. package/dist/lib/maths/index.d.ts.map +1 -0
  181. package/dist/lib/maths/index.js +29 -0
  182. package/dist/lib/maths/index.mjs +1130 -0
  183. package/dist/lib/maths/parser.cjs +75 -0
  184. package/dist/lib/maths/parser.d.ts +20 -0
  185. package/dist/lib/maths/parser.d.ts.map +1 -0
  186. package/dist/lib/maths/parser.js +78 -0
  187. package/dist/lib/maths/parser.mjs +54 -0
  188. package/dist/lib/maths/random.cjs +49 -0
  189. package/dist/lib/maths/random.d.ts +27 -0
  190. package/dist/lib/maths/random.d.ts.map +1 -0
  191. package/dist/lib/maths/random.js +49 -0
  192. package/dist/lib/maths/random.mjs +28 -0
  193. package/dist/lib/maths/types/advanced.cjs +18 -0
  194. package/dist/lib/maths/types/advanced.d.ts +357 -0
  195. package/dist/lib/maths/types/advanced.d.ts.map +1 -0
  196. package/dist/lib/maths/types/advanced.js +5 -0
  197. package/dist/lib/maths/types/advanced.mjs +0 -0
  198. package/dist/lib/maths/types/basic.cjs +18 -0
  199. package/dist/lib/maths/types/basic.d.ts +95 -0
  200. package/dist/lib/maths/types/basic.d.ts.map +1 -0
  201. package/dist/lib/maths/types/basic.js +5 -0
  202. package/dist/lib/maths/types/basic.mjs +0 -0
  203. package/dist/lib/maths/types/index.cjs +19 -0
  204. package/dist/lib/maths/types/index.d.ts +4 -0
  205. package/dist/lib/maths/types/index.d.ts.map +1 -0
  206. package/dist/lib/maths/types/index.js +3 -0
  207. package/dist/lib/maths/types/index.mjs +1 -0
  208. package/dist/lib/maths/types/negative.cjs +18 -0
  209. package/dist/lib/maths/types/negative.d.ts +51 -0
  210. package/dist/lib/maths/types/negative.d.ts.map +1 -0
  211. package/dist/lib/maths/types/negative.js +5 -0
  212. package/dist/lib/maths/types/negative.mjs +0 -0
  213. package/dist/lib/maths/types/operations.cjs +18 -0
  214. package/dist/lib/maths/types/operations.d.ts +188 -0
  215. package/dist/lib/maths/types/operations.d.ts.map +1 -0
  216. package/dist/lib/maths/types/operations.js +6 -0
  217. package/dist/lib/maths/types/operations.mjs +0 -0
  218. package/dist/lib/object/clone.cjs +88 -0
  219. package/dist/lib/object/clone.d.ts +46 -0
  220. package/dist/lib/object/clone.d.ts.map +1 -0
  221. package/dist/lib/object/clone.js +104 -0
  222. package/dist/lib/object/clone.mjs +65 -0
  223. package/dist/lib/object/diff.cjs +573 -0
  224. package/dist/lib/object/diff.d.ts +203 -0
  225. package/dist/lib/object/diff.d.ts.map +1 -0
  226. package/dist/lib/object/diff.js +805 -0
  227. package/dist/lib/object/diff.mjs +550 -0
  228. package/dist/lib/object/getter-setter.cjs +2351 -0
  229. package/dist/lib/object/getter-setter.d.ts +361 -0
  230. package/dist/lib/object/getter-setter.d.ts.map +1 -0
  231. package/dist/lib/object/getter-setter.js +1771 -0
  232. package/dist/lib/object/getter-setter.mjs +2330 -0
  233. package/dist/lib/object/index.cjs +3956 -0
  234. package/dist/lib/object/index.d.ts +13 -0
  235. package/dist/lib/object/index.d.ts.map +1 -0
  236. package/dist/lib/object/index.js +12 -0
  237. package/dist/lib/object/index.mjs +3936 -0
  238. package/dist/lib/object/merge.cjs +1029 -0
  239. package/dist/lib/object/merge.d.ts +93 -0
  240. package/dist/lib/object/merge.d.ts.map +1 -0
  241. package/dist/lib/object/merge.js +474 -0
  242. package/dist/lib/object/merge.mjs +1006 -0
  243. package/dist/lib/object/object.cjs +280 -0
  244. package/dist/lib/object/object.d.ts +128 -0
  245. package/dist/lib/object/object.d.ts.map +1 -0
  246. package/dist/lib/object/object.js +432 -0
  247. package/dist/lib/object/object.mjs +257 -0
  248. package/dist/lib/object/omit.cjs +2022 -0
  249. package/dist/lib/object/omit.d.ts +351 -0
  250. package/dist/lib/object/omit.d.ts.map +1 -0
  251. package/dist/lib/object/omit.js +656 -0
  252. package/dist/lib/object/omit.mjs +1999 -0
  253. package/dist/lib/object/reconcile.cjs +126 -0
  254. package/dist/lib/object/reconcile.d.ts +7 -0
  255. package/dist/lib/object/reconcile.d.ts.map +1 -0
  256. package/dist/lib/object/reconcile.js +122 -0
  257. package/dist/lib/object/reconcile.mjs +105 -0
  258. package/dist/lib/object/selector.cjs +303 -0
  259. package/dist/lib/object/selector.d.ts +50 -0
  260. package/dist/lib/object/selector.d.ts.map +1 -0
  261. package/dist/lib/object/selector.js +371 -0
  262. package/dist/lib/object/selector.mjs +282 -0
  263. package/dist/lib/object/sort.cjs +209 -0
  264. package/dist/lib/object/sort.d.ts +149 -0
  265. package/dist/lib/object/sort.d.ts.map +1 -0
  266. package/dist/lib/object/sort.js +298 -0
  267. package/dist/lib/object/sort.mjs +186 -0
  268. package/dist/lib/object/transform.cjs +2211 -0
  269. package/dist/lib/object/transform.d.ts +620 -0
  270. package/dist/lib/object/transform.d.ts.map +1 -0
  271. package/dist/lib/object/transform.js +1058 -0
  272. package/dist/lib/object/transform.mjs +2190 -0
  273. package/dist/lib/object/types.cjs +18 -0
  274. package/dist/lib/object/types.d.ts +250 -0
  275. package/dist/lib/object/types.d.ts.map +1 -0
  276. package/dist/lib/object/types.js +1 -0
  277. package/dist/lib/object/types.mjs +0 -0
  278. package/dist/lib/object/utils.cjs +326 -0
  279. package/dist/lib/object/utils.d.ts +165 -0
  280. package/dist/lib/object/utils.d.ts.map +1 -0
  281. package/dist/lib/object/utils.js +444 -0
  282. package/dist/lib/object/utils.mjs +305 -0
  283. package/dist/lib/primitive/boolean/boolean.cjs +407 -0
  284. package/dist/lib/primitive/boolean/boolean.d.ts +276 -0
  285. package/dist/lib/primitive/boolean/boolean.d.ts.map +1 -0
  286. package/dist/lib/primitive/boolean/boolean.js +615 -0
  287. package/dist/lib/primitive/boolean/boolean.mjs +386 -0
  288. package/dist/lib/primitive/boolean/index.cjs +382 -0
  289. package/dist/lib/primitive/boolean/index.d.ts +3 -0
  290. package/dist/lib/primitive/boolean/index.d.ts.map +1 -0
  291. package/dist/lib/primitive/boolean/index.js +2 -0
  292. package/dist/lib/primitive/boolean/index.mjs +359 -0
  293. package/dist/lib/primitive/boolean/types.cjs +18 -0
  294. package/dist/lib/primitive/boolean/types.d.ts +14 -0
  295. package/dist/lib/primitive/boolean/types.d.ts.map +1 -0
  296. package/dist/lib/primitive/boolean/types.js +1 -0
  297. package/dist/lib/primitive/boolean/types.mjs +0 -0
  298. package/dist/lib/primitive/date/date.cjs +1126 -0
  299. package/dist/lib/primitive/date/date.d.ts +641 -0
  300. package/dist/lib/primitive/date/date.d.ts.map +1 -0
  301. package/dist/lib/primitive/date/date.js +1998 -0
  302. package/dist/lib/primitive/date/date.mjs +1105 -0
  303. package/dist/lib/primitive/date/index.cjs +1128 -0
  304. package/dist/lib/primitive/date/index.d.ts +3 -0
  305. package/dist/lib/primitive/date/index.d.ts.map +1 -0
  306. package/dist/lib/primitive/date/index.js +2 -0
  307. package/dist/lib/primitive/date/index.mjs +1105 -0
  308. package/dist/lib/primitive/date/types.cjs +18 -0
  309. package/dist/lib/primitive/date/types.d.ts +205 -0
  310. package/dist/lib/primitive/date/types.d.ts.map +1 -0
  311. package/dist/lib/primitive/date/types.js +7 -0
  312. package/dist/lib/primitive/date/types.mjs +0 -0
  313. package/dist/lib/primitive/index.cjs +2338 -0
  314. package/dist/lib/primitive/index.d.ts +5 -0
  315. package/dist/lib/primitive/index.d.ts.map +1 -0
  316. package/dist/lib/primitive/index.js +4 -0
  317. package/dist/lib/primitive/index.mjs +2316 -0
  318. package/dist/lib/primitive/string/index.cjs +875 -0
  319. package/dist/lib/primitive/string/index.d.ts +3 -0
  320. package/dist/lib/primitive/string/index.d.ts.map +1 -0
  321. package/dist/lib/primitive/string/index.js +2 -0
  322. package/dist/lib/primitive/string/index.mjs +852 -0
  323. package/dist/lib/primitive/string/parser-2.cjs +543 -0
  324. package/dist/lib/primitive/string/parser-2.d.ts +17 -0
  325. package/dist/lib/primitive/string/parser-2.d.ts.map +1 -0
  326. package/dist/lib/primitive/string/parser-2.js +656 -0
  327. package/dist/lib/primitive/string/parser-2.mjs +522 -0
  328. package/dist/lib/primitive/string/parser.cjs +236 -0
  329. package/dist/lib/primitive/string/parser.d.ts +9 -0
  330. package/dist/lib/primitive/string/parser.d.ts.map +1 -0
  331. package/dist/lib/primitive/string/parser.js +775 -0
  332. package/dist/lib/primitive/string/parser.mjs +215 -0
  333. package/dist/lib/primitive/string/string.cjs +926 -0
  334. package/dist/lib/primitive/string/string.d.ts +535 -0
  335. package/dist/lib/primitive/string/string.d.ts.map +1 -0
  336. package/dist/lib/primitive/string/string.js +1301 -0
  337. package/dist/lib/primitive/string/string.mjs +903 -0
  338. package/dist/lib/primitive/string/types.cjs +18 -0
  339. package/dist/lib/primitive/string/types.d.ts +318 -0
  340. package/dist/lib/primitive/string/types.d.ts.map +1 -0
  341. package/dist/lib/primitive/string/types.js +5 -0
  342. package/dist/lib/primitive/string/types.mjs +0 -0
  343. package/dist/lib/primitive/types.cjs +18 -0
  344. package/dist/lib/primitive/types.d.ts +27 -0
  345. package/dist/lib/primitive/types.d.ts.map +1 -0
  346. package/dist/lib/primitive/types.js +1 -0
  347. package/dist/lib/primitive/types.mjs +0 -0
  348. package/dist/lib/url/index.cjs +327 -0
  349. package/dist/lib/url/index.d.ts +3 -0
  350. package/dist/lib/url/index.d.ts.map +1 -0
  351. package/dist/lib/url/index.js +2 -0
  352. package/dist/lib/url/index.mjs +304 -0
  353. package/dist/lib/url/parser.cjs +325 -0
  354. package/dist/lib/url/parser.d.ts +216 -0
  355. package/dist/lib/url/parser.d.ts.map +1 -0
  356. package/dist/lib/url/parser.js +488 -0
  357. package/dist/lib/url/parser.mjs +304 -0
  358. package/dist/lib/url/types.cjs +18 -0
  359. package/dist/lib/url/types.d.ts +18 -0
  360. package/dist/lib/url/types.d.ts.map +1 -0
  361. package/dist/lib/url/types.js +1 -0
  362. package/dist/lib/url/types.mjs +0 -0
  363. package/dist/tsconfig.lib.tsbuildinfo +1 -0
  364. package/package.json +127 -0
@@ -0,0 +1,432 @@
1
+ import { isObject } from './utils.js';
2
+ import { deepClone } from './clone.js';
3
+ /**
4
+ * Inverts an object (swaps keys and values)
5
+ * @param obj - Source object
6
+ * @returns Inverted object
7
+ * @example
8
+ * invert({a: 1, b: 2}) // {1: 'a', 2: 'b'}
9
+ */
10
+ export const invert = (obj, deep = false) => {
11
+ if (Array.isArray(obj)) {
12
+ return obj.map((item) => invert(item, deep));
13
+ }
14
+ if (!isObject(obj)) {
15
+ return {};
16
+ }
17
+ const result = {};
18
+ for (const key in obj) {
19
+ let value = obj[key];
20
+ // Only invert if value can be used as a key
21
+ if (typeof value === 'string' ||
22
+ typeof value === 'number' ||
23
+ typeof value === 'symbol') {
24
+ result[value] = key;
25
+ }
26
+ else if (isObject(value)) {
27
+ if (deep) {
28
+ result[key] = invert(value, deep);
29
+ }
30
+ }
31
+ else if (Array.isArray(value)) {
32
+ if (deep) {
33
+ result[key] = value.map((item) => invert(item, deep));
34
+ }
35
+ }
36
+ }
37
+ return result;
38
+ };
39
+ /**
40
+ * Maps object values using a callback function
41
+ * @param obj - Source object
42
+ * @param callback - Mapping function
43
+ * @returns New object with mapped values
44
+ * @example
45
+ * mapValues({a: 1, b: 2}, (value) => value * 2) // {a: 2, b: 4}
46
+ */
47
+ // export const mapValues = <T extends AnyObject, U>(
48
+ // obj: T,
49
+ // callback: (value: T[keyof T], key: keyof T) => U
50
+ // ): Record<keyof T, U> => {
51
+ // if (Array.isArray(obj)) {
52
+ // return (obj as any).map(callback);
53
+ // }
54
+ // if (!isObject(obj)) {
55
+ // return {} as Record<keyof T, U>;
56
+ // }
57
+ // const result: Partial<Record<keyof T, U>> = {};
58
+ // for (const key in obj) {
59
+ // result[key] = callback(obj[key], key as any);
60
+ // }
61
+ // return result as Record<keyof T, U>;
62
+ // };
63
+ /**
64
+ * Maps object keys using a callback function
65
+ * @param obj - Source object
66
+ * @param callback - Mapping function
67
+ * @returns New object with mapped keys
68
+ * @example
69
+ * mapKeys({a: 1, b: 2}, (key) => key.toUpperCase()) // {A: 1, B: 2}
70
+ */
71
+ // export const mapKeys = <T extends AnyObject>(
72
+ // obj: T,
73
+ // callback: (key: keyof T, value: T[keyof T]) => string
74
+ // ): AnyObject => {
75
+ // if (Array.isArray(obj)) {
76
+ // return (obj as any).map(callback);
77
+ // }
78
+ // if (!isObject(obj)) {
79
+ // return {};
80
+ // }
81
+ // const result: AnyObject = {};
82
+ // for (const key in obj) {
83
+ // const newKey = callback(key as any, obj[key]);
84
+ // result[newKey] = obj[key];
85
+ // }
86
+ // return result;
87
+ // };
88
+ /**
89
+ * Filters object properties using a predicate
90
+ * @param obj - Source object
91
+ * @param predicate - Filter function
92
+ * @returns New object with filtered properties
93
+ * @example
94
+ * filter({a: 1, b: 2, c: 3}, (value) => value > 1) // {b: 2, c: 3}
95
+ */
96
+ export const filter = (obj, predicate) => {
97
+ if (Array.isArray(obj)) {
98
+ return obj.filter(predicate);
99
+ }
100
+ if (!isObject(obj)) {
101
+ return {};
102
+ }
103
+ const result = {};
104
+ for (const key in obj) {
105
+ if (predicate(obj[key], key)) {
106
+ result[key] = obj[key];
107
+ }
108
+ }
109
+ return result;
110
+ };
111
+ /**
112
+ * Flattens a nested object
113
+ * @param obj - Source object
114
+ * @param separator - Separator for nested keys (default: '.')
115
+ * @returns Flattened object
116
+ * @example
117
+ * flatten({a: {b: {c: 1}}, d: 2}) // {'a.b.c': 1, d: 2}
118
+ */
119
+ // export const flatten = (obj: AnyObject, separator: string = '.'): AnyObject => {
120
+ // if (Array.isArray(obj)) {
121
+ // return obj.map((item) => flatten(item, separator));
122
+ // // return obj.reduce((acc, item) => {
123
+ // // return {
124
+ // // ...acc,
125
+ // // ...flatten(item, separator),
126
+ // // };
127
+ // // }, {});
128
+ // }
129
+ // const result: AnyObject = {};
130
+ // const flattenRecursive = (current: any, path: string = '') => {
131
+ // if (!isObject(current) && !Array.isArray(current)) {
132
+ // if (path) {
133
+ // result[path] = current;
134
+ // }
135
+ // return;
136
+ // }
137
+ // if (Array.isArray(current)) {
138
+ // for (let i = 0; i < current.length; i++) {
139
+ // const newPath = path ? `${path}[${i}]` : `[${i}]`;
140
+ // flattenRecursive(current[i], newPath);
141
+ // }
142
+ // } else {
143
+ // for (const key in current) {
144
+ // const newPath = path ? `${path}${separator}${key}` : key;
145
+ // flattenRecursive(current[key], newPath);
146
+ // }
147
+ // // Handle symbols
148
+ // const symbols = Object.getOwnPropertySymbols(current);
149
+ // for (const symbol of symbols) {
150
+ // const newPath = path
151
+ // ? `${path}${separator}${symbol.toString()}`
152
+ // : symbol.toString();
153
+ // flattenRecursive(current[symbol], newPath);
154
+ // }
155
+ // }
156
+ // };
157
+ // flattenRecursive(obj);
158
+ // return result;
159
+ // };
160
+ /**
161
+ * Unflattens an object (reverse of flatten)
162
+ * @param obj - Source object
163
+ * @param separator - Separator used for nested keys (default: '.')
164
+ * @returns Unflattened object
165
+ * @example
166
+ * unflatten({'a.b.c': 1, d: 2}) // {a: {b: {c: 1}}, d: 2}
167
+ */
168
+ // export const unflatten = (
169
+ // obj: AnyObject,
170
+ // separator: string = '.'
171
+ // ): AnyObject => {
172
+ // const result: AnyObject = {};
173
+ // for (const key in obj) {
174
+ // const keys = key.split(separator);
175
+ // let current: any = result;
176
+ // for (let i = 0; i < keys.length - 1; i++) {
177
+ // const part = keys[i];
178
+ // // Handle array indices
179
+ // if (part.startsWith('[') && part.endsWith(']')) {
180
+ // const index = parseInt(part.slice(1, -1), 10);
181
+ // if (!Array.isArray(current)) {
182
+ // current = [];
183
+ // }
184
+ // if (current[index] == null) {
185
+ // current[index] = {};
186
+ // }
187
+ // current = current[index];
188
+ // } else {
189
+ // if (current[part] == null) {
190
+ // current[part] = {};
191
+ // }
192
+ // current = current[part];
193
+ // }
194
+ // }
195
+ // const lastKey = keys[keys.length - 1];
196
+ // // Handle array indices
197
+ // if (lastKey.startsWith('[') && lastKey.endsWith(']')) {
198
+ // const index = parseInt(lastKey.slice(1, -1), 10);
199
+ // if (!Array.isArray(current)) {
200
+ // current = [];
201
+ // }
202
+ // if (index >= current.length) {
203
+ // for (let i = current.length; i <= index; i++) {
204
+ // current.push(undefined);
205
+ // }
206
+ // }
207
+ // current[index] = obj[key];
208
+ // } else {
209
+ // current[lastKey] = obj[key];
210
+ // }
211
+ // }
212
+ // return result;
213
+ // };
214
+ /**
215
+ * Removes undefined or null properties from an object
216
+ * @param obj - Source object
217
+ * @param deep - Whether to clean recursively (default: false)
218
+ * @returns Cleaned object
219
+ * @example
220
+ * clean({a: 1, b: null, c: undefined, d: {e: null}}) // {a: 1, d: {}}
221
+ * clean({a: 1, b: null, d: {e: null}}, true) // {a: 1}
222
+ */
223
+ export const clean = (obj, deep = false) => {
224
+ if (!isObject(obj)) {
225
+ return {};
226
+ }
227
+ const result = {};
228
+ for (const key in obj) {
229
+ const value = obj[key];
230
+ if (value != null) {
231
+ if (deep && isObject(value)) {
232
+ const cleaned = clean(value, true);
233
+ if (Object.keys(cleaned).length > 0) {
234
+ result[key] = cleaned;
235
+ }
236
+ }
237
+ else {
238
+ result[key] = value;
239
+ }
240
+ }
241
+ }
242
+ return result;
243
+ };
244
+ /**
245
+ * Creates a new object with default values
246
+ * @param defaults - Default values
247
+ * @param overrides - Override values
248
+ * @returns Merged object with defaults
249
+ * @example
250
+ * defaults({a: 1, b: 2}, {b: 3, c: 4}) // {a: 1, b: 3, c: 4}
251
+ */
252
+ export const defaults = (current, overrides) => {
253
+ if (Array.isArray(current)) {
254
+ if (Array.isArray(overrides)) {
255
+ return [...current, ...overrides];
256
+ }
257
+ return [...current, overrides];
258
+ }
259
+ const result = deepClone(current);
260
+ for (const key in overrides) {
261
+ if (result[key] === undefined) {
262
+ result[key] = overrides[key];
263
+ }
264
+ }
265
+ return result;
266
+ };
267
+ /**
268
+ * Gets the size of an object (number of own enumerable properties)
269
+ * @param obj - Source object
270
+ * @returns Number of properties
271
+ * @example
272
+ * size({a: 1, b: 2, c: 3}) // 3
273
+ */
274
+ export const size = (obj) => {
275
+ if (!isObject(obj)) {
276
+ return 0;
277
+ }
278
+ return Object.keys(obj).length;
279
+ };
280
+ /**
281
+ * Creates a new object with the same keys but transformed values
282
+ * @param obj - Source object
283
+ * @param transformer - Transformation function
284
+ * @returns Transformed object
285
+ * @example
286
+ * transform({a: 1, b: 2}, (key, value) => ({[key]: value * 2})) // {a: 2, b: 4}
287
+ */
288
+ export const transform = (obj, transformer) => {
289
+ if (Array.isArray(obj)) {
290
+ return obj.map(transformer);
291
+ }
292
+ if (!isObject(obj)) {
293
+ return {};
294
+ }
295
+ const result = {};
296
+ for (const key in obj) {
297
+ const [newKey, newValue] = transformer(key, obj[key]);
298
+ result[newKey] = newValue;
299
+ }
300
+ return result;
301
+ };
302
+ /**
303
+ * Groups an array of objects by a key
304
+ * @param array - Array of objects
305
+ * @param key - Key to group by
306
+ * @returns Grouped object
307
+ * @example
308
+ * groupBy([{type: 'a', value: 1}, {type: 'b', value: 2}, {type: 'a', value: 3}], 'type')
309
+ * // {a: [{type: 'a', value: 1}, {type: 'a', value: 3}], b: [{type: 'b', value: 2}]}
310
+ */
311
+ export const groupBy = (array, key) => {
312
+ if (!Array.isArray(array)) {
313
+ return {};
314
+ }
315
+ return array.reduce((groups, item) => {
316
+ const groupKey = item[key];
317
+ if (groupKey == null) {
318
+ return groups;
319
+ }
320
+ const keyStr = String(groupKey);
321
+ if (!groups[keyStr]) {
322
+ groups[keyStr] = [];
323
+ }
324
+ groups[keyStr].push(item);
325
+ return groups;
326
+ }, {});
327
+ };
328
+ /**
329
+ * Converts an object to a query string
330
+ * @param obj - Source object
331
+ * @returns Query string
332
+ * @example
333
+ * toQueryString({a: 1, b: 'test', c: [1, 2, 3]}) // 'a=1&b=test&c=1&c=2&c=3'
334
+ */
335
+ export const toQueryString = (obj) => {
336
+ if (!isObject(obj)) {
337
+ return '';
338
+ }
339
+ const params = [];
340
+ const addParam = (key, value) => {
341
+ if (value == null)
342
+ return;
343
+ if (Array.isArray(value)) {
344
+ value.forEach((item) => {
345
+ params.push(`${encodeURIComponent(key)}=${encodeURIComponent(item)}`);
346
+ });
347
+ }
348
+ else {
349
+ params.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);
350
+ }
351
+ };
352
+ for (const key in obj) {
353
+ addParam(key, obj[key]);
354
+ }
355
+ return params.join('&');
356
+ };
357
+ /**
358
+ * Parses a query string to an object
359
+ * @param queryString - Query string
360
+ * @returns Parsed object
361
+ * @example
362
+ * fromQueryString('a=1&b=test&c=1&c=2&c=3') // {a: '1', b: 'test', c: ['1', '2', '3']}
363
+ */
364
+ export const fromQueryString = (queryString) => {
365
+ if (!queryString || typeof queryString !== 'string') {
366
+ return {};
367
+ }
368
+ // Remove leading ?
369
+ const str = queryString.startsWith('?') ? queryString.slice(1) : queryString;
370
+ if (!str) {
371
+ return {};
372
+ }
373
+ const result = {};
374
+ const pairs = str.split('&');
375
+ for (const pair of pairs) {
376
+ const [key, value] = pair.split('=').map(decodeURIComponent);
377
+ if (key) {
378
+ if (key in result) {
379
+ // Handle duplicate keys as arrays
380
+ if (Array.isArray(result[key])) {
381
+ result[key].push(value || '');
382
+ }
383
+ else {
384
+ result[key] = [result[key], value || ''];
385
+ }
386
+ }
387
+ else {
388
+ result[key] = value || '';
389
+ }
390
+ }
391
+ }
392
+ return result;
393
+ };
394
+ /**
395
+ * Creates a frozen deep clone of an object
396
+ * @param obj - Source object
397
+ * @returns Deep frozen object
398
+ * @example
399
+ * const frozen = deepFreeze({a: {b: 1}})
400
+ * frozen.a.b = 2 // Error in strict mode
401
+ */
402
+ export const deepFreeze = (obj) => {
403
+ if (obj == null || typeof obj !== 'object') {
404
+ return obj;
405
+ }
406
+ // Freeze the object itself
407
+ Object.freeze(obj);
408
+ // Recursively freeze all properties
409
+ for (const key in obj) {
410
+ const value = obj[key];
411
+ if (value != null && typeof value === 'object') {
412
+ deepFreeze(value);
413
+ }
414
+ }
415
+ // Freeze symbols
416
+ const symbols = Object.getOwnPropertySymbols(obj);
417
+ for (const symbol of symbols) {
418
+ const value = obj[symbol];
419
+ if (value != null && typeof value === 'object') {
420
+ deepFreeze(value);
421
+ }
422
+ }
423
+ return obj;
424
+ };
425
+ /**
426
+ * Type guard for non-null object
427
+ * @param value - Value to check
428
+ * @returns True if value is a non-null object
429
+ */
430
+ export const isNonNullObject = (value) => {
431
+ return value != null && typeof value === 'object' && !Array.isArray(value);
432
+ };
@@ -0,0 +1,257 @@
1
+ // src/lib/object/utils.ts
2
+ var isObject = (value) => {
3
+ if (value == null) return false;
4
+ if (Array.isArray(value)) return false;
5
+ if (typeof value === "function") return false;
6
+ if (value instanceof Date) return false;
7
+ if (value instanceof RegExp) return false;
8
+ if (value instanceof Map) return false;
9
+ if (value instanceof Set) return false;
10
+ if (value instanceof Error) return false;
11
+ return typeof value === "object";
12
+ };
13
+
14
+ // src/lib/object/clone.ts
15
+ var deepClone = (obj, skipKeys) => {
16
+ if (obj == null || typeof obj !== "object") {
17
+ return obj;
18
+ }
19
+ if (obj instanceof Date) {
20
+ return new Date(obj.getTime());
21
+ }
22
+ if (obj instanceof RegExp) {
23
+ return new RegExp(obj.source, obj.flags);
24
+ }
25
+ if (obj instanceof Map) {
26
+ const clone = /* @__PURE__ */ new Map();
27
+ obj.forEach((value, key) => {
28
+ if (!skipKeys || !skipKeys.some((k) => k.toString() === key.toString())) {
29
+ clone.set(key, deepClone(value));
30
+ }
31
+ });
32
+ return clone;
33
+ }
34
+ if (obj instanceof Set) {
35
+ const clone = /* @__PURE__ */ new Set();
36
+ obj.forEach((value) => {
37
+ clone.add(deepClone(value));
38
+ });
39
+ return clone;
40
+ }
41
+ if (Array.isArray(obj)) {
42
+ return Array.from(obj).map((item) => deepClone(item));
43
+ }
44
+ if (isObject(obj)) {
45
+ const clone = {};
46
+ for (const key in obj) {
47
+ if (Object.prototype.hasOwnProperty.call(obj, key)) {
48
+ if (!skipKeys || !skipKeys.some((k) => k.toString() === key.toString())) {
49
+ clone[key] = deepClone(obj[key]);
50
+ }
51
+ }
52
+ }
53
+ const symbols = Object.getOwnPropertySymbols(obj);
54
+ for (const symbol of symbols) {
55
+ if (!skipKeys || !skipKeys.some((s) => s.toString() === symbol.toString())) {
56
+ clone[symbol] = deepClone(obj[symbol]);
57
+ }
58
+ }
59
+ return clone;
60
+ }
61
+ return obj;
62
+ };
63
+
64
+ // src/lib/object/object.ts
65
+ var invert = (obj, deep = false) => {
66
+ if (Array.isArray(obj)) {
67
+ return obj.map((item) => invert(item, deep));
68
+ }
69
+ if (!isObject(obj)) {
70
+ return {};
71
+ }
72
+ const result = {};
73
+ for (const key in obj) {
74
+ let value = obj[key];
75
+ if (typeof value === "string" || typeof value === "number" || typeof value === "symbol") {
76
+ result[value] = key;
77
+ } else if (isObject(value)) {
78
+ if (deep) {
79
+ result[key] = invert(value, deep);
80
+ }
81
+ } else if (Array.isArray(value)) {
82
+ if (deep) {
83
+ result[key] = value.map((item) => invert(item, deep));
84
+ }
85
+ }
86
+ }
87
+ return result;
88
+ };
89
+ var filter = (obj, predicate) => {
90
+ if (Array.isArray(obj)) {
91
+ return obj.filter(predicate);
92
+ }
93
+ if (!isObject(obj)) {
94
+ return {};
95
+ }
96
+ const result = {};
97
+ for (const key in obj) {
98
+ if (predicate(obj[key], key)) {
99
+ result[key] = obj[key];
100
+ }
101
+ }
102
+ return result;
103
+ };
104
+ var clean = (obj, deep = false) => {
105
+ if (!isObject(obj)) {
106
+ return {};
107
+ }
108
+ const result = {};
109
+ for (const key in obj) {
110
+ const value = obj[key];
111
+ if (value != null) {
112
+ if (deep && isObject(value)) {
113
+ const cleaned = clean(value, true);
114
+ if (Object.keys(cleaned).length > 0) {
115
+ result[key] = cleaned;
116
+ }
117
+ } else {
118
+ result[key] = value;
119
+ }
120
+ }
121
+ }
122
+ return result;
123
+ };
124
+ var defaults = (current, overrides) => {
125
+ if (Array.isArray(current)) {
126
+ if (Array.isArray(overrides)) {
127
+ return [...current, ...overrides];
128
+ }
129
+ return [...current, overrides];
130
+ }
131
+ const result = deepClone(current);
132
+ for (const key in overrides) {
133
+ if (result[key] === void 0) {
134
+ result[key] = overrides[key];
135
+ }
136
+ }
137
+ return result;
138
+ };
139
+ var size = (obj) => {
140
+ if (!isObject(obj)) {
141
+ return 0;
142
+ }
143
+ return Object.keys(obj).length;
144
+ };
145
+ var transform = (obj, transformer) => {
146
+ if (Array.isArray(obj)) {
147
+ return obj.map(transformer);
148
+ }
149
+ if (!isObject(obj)) {
150
+ return {};
151
+ }
152
+ const result = {};
153
+ for (const key in obj) {
154
+ const [newKey, newValue] = transformer(key, obj[key]);
155
+ result[newKey] = newValue;
156
+ }
157
+ return result;
158
+ };
159
+ var groupBy = (array, key) => {
160
+ if (!Array.isArray(array)) {
161
+ return {};
162
+ }
163
+ return array.reduce((groups, item) => {
164
+ const groupKey = item[key];
165
+ if (groupKey == null) {
166
+ return groups;
167
+ }
168
+ const keyStr = String(groupKey);
169
+ if (!groups[keyStr]) {
170
+ groups[keyStr] = [];
171
+ }
172
+ groups[keyStr].push(item);
173
+ return groups;
174
+ }, {});
175
+ };
176
+ var toQueryString = (obj) => {
177
+ if (!isObject(obj)) {
178
+ return "";
179
+ }
180
+ const params = [];
181
+ const addParam = (key, value) => {
182
+ if (value == null) return;
183
+ if (Array.isArray(value)) {
184
+ value.forEach((item) => {
185
+ params.push(`${encodeURIComponent(key)}=${encodeURIComponent(item)}`);
186
+ });
187
+ } else {
188
+ params.push(`${encodeURIComponent(key)}=${encodeURIComponent(value)}`);
189
+ }
190
+ };
191
+ for (const key in obj) {
192
+ addParam(key, obj[key]);
193
+ }
194
+ return params.join("&");
195
+ };
196
+ var fromQueryString = (queryString) => {
197
+ if (!queryString || typeof queryString !== "string") {
198
+ return {};
199
+ }
200
+ const str = queryString.startsWith("?") ? queryString.slice(1) : queryString;
201
+ if (!str) {
202
+ return {};
203
+ }
204
+ const result = {};
205
+ const pairs = str.split("&");
206
+ for (const pair of pairs) {
207
+ const [key, value] = pair.split("=").map(decodeURIComponent);
208
+ if (key) {
209
+ if (key in result) {
210
+ if (Array.isArray(result[key])) {
211
+ result[key].push(value || "");
212
+ } else {
213
+ result[key] = [result[key], value || ""];
214
+ }
215
+ } else {
216
+ result[key] = value || "";
217
+ }
218
+ }
219
+ }
220
+ return result;
221
+ };
222
+ var deepFreeze = (obj) => {
223
+ if (obj == null || typeof obj !== "object") {
224
+ return obj;
225
+ }
226
+ Object.freeze(obj);
227
+ for (const key in obj) {
228
+ const value = obj[key];
229
+ if (value != null && typeof value === "object") {
230
+ deepFreeze(value);
231
+ }
232
+ }
233
+ const symbols = Object.getOwnPropertySymbols(obj);
234
+ for (const symbol of symbols) {
235
+ const value = obj[symbol];
236
+ if (value != null && typeof value === "object") {
237
+ deepFreeze(value);
238
+ }
239
+ }
240
+ return obj;
241
+ };
242
+ var isNonNullObject = (value) => {
243
+ return value != null && typeof value === "object" && !Array.isArray(value);
244
+ };
245
+ export {
246
+ clean,
247
+ deepFreeze,
248
+ defaults,
249
+ filter,
250
+ fromQueryString,
251
+ groupBy,
252
+ invert,
253
+ isNonNullObject,
254
+ size,
255
+ toQueryString,
256
+ transform
257
+ };