@rzl-zone/utils-js 3.12.1-beta.0 → 3.13.0-beta.2

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 (243) hide show
  1. package/README.md +15 -35
  2. package/dist/.references/index.d.cts +1 -3
  3. package/dist/.references/index.d.ts +1 -3
  4. package/dist/{assertIsArray-BfAbIUfa.js → assertIsArray-6BcSdNa-.js} +3 -3
  5. package/dist/{assertIsArray-BfAbIUfa.js.map → assertIsArray-6BcSdNa-.js.map} +1 -1
  6. package/dist/{assertIsArray-BChqwPiP.cjs → assertIsArray-BqjMoan3.cjs} +3 -3
  7. package/dist/{assertIsArray-BChqwPiP.cjs.map → assertIsArray-BqjMoan3.cjs.map} +1 -1
  8. package/dist/{assertIsBoolean-BlBct0Fc.js → assertIsBoolean-Bv6gL-xe.js} +8 -8
  9. package/dist/assertIsBoolean-Bv6gL-xe.js.map +1 -0
  10. package/dist/{assertIsBoolean-DozdtbNi.cjs → assertIsBoolean-amRiJHnh.cjs} +8 -8
  11. package/dist/assertIsBoolean-amRiJHnh.cjs.map +1 -0
  12. package/dist/{assertIsString-DqV9NwbI.js → assertIsString-1WiUjgqf.js} +3 -3
  13. package/dist/{assertIsString-DqV9NwbI.js.map → assertIsString-1WiUjgqf.js.map} +1 -1
  14. package/dist/{assertIsString-Bvk7bUL7.cjs → assertIsString-C0b28AU1.cjs} +3 -3
  15. package/dist/{assertIsString-Bvk7bUL7.cjs.map → assertIsString-C0b28AU1.cjs.map} +1 -1
  16. package/dist/assertions/index.cjs +5 -5
  17. package/dist/assertions/index.d.cts +2 -2
  18. package/dist/assertions/index.d.ts +2 -2
  19. package/dist/assertions/index.js +5 -5
  20. package/dist/conversions/index.cjs +6 -6
  21. package/dist/conversions/index.d.cts +2 -2
  22. package/dist/conversions/index.d.ts +2 -2
  23. package/dist/conversions/index.js +6 -6
  24. package/dist/{conversions-EMJa3g-D.js → conversions-BrI0GIOr.js} +16 -18
  25. package/dist/conversions-BrI0GIOr.js.map +1 -0
  26. package/dist/{conversions-CBs8-REq.cjs → conversions-lvvAYiZs.cjs} +16 -18
  27. package/dist/conversions-lvvAYiZs.cjs.map +1 -0
  28. package/dist/events/index.cjs +4 -4
  29. package/dist/events/index.cjs.map +1 -1
  30. package/dist/events/index.d.cts +153 -151
  31. package/dist/events/index.d.ts +153 -151
  32. package/dist/events/index.js +4 -4
  33. package/dist/events/index.js.map +1 -1
  34. package/dist/formatters/index.cjs +2 -2
  35. package/dist/formatters/index.d.cts +2 -2
  36. package/dist/formatters/index.d.ts +2 -2
  37. package/dist/formatters/index.js +2 -2
  38. package/dist/{formatters-lAYgA11L.cjs → formatters-DQr05EUA.cjs} +17 -15
  39. package/dist/formatters-DQr05EUA.cjs.map +1 -0
  40. package/dist/{formatters-QcZO_Cpx.js → formatters-zDzQvtb4.js} +17 -15
  41. package/dist/formatters-zDzQvtb4.js.map +1 -0
  42. package/dist/generators/index.cjs +12 -8
  43. package/dist/generators/index.cjs.map +1 -1
  44. package/dist/generators/index.d.cts +2 -2
  45. package/dist/generators/index.d.ts +2 -2
  46. package/dist/generators/index.js +12 -8
  47. package/dist/generators/index.js.map +1 -1
  48. package/dist/index-3jBnthag.d.cts +340 -0
  49. package/dist/index-BXwimNPA.d.cts +2361 -0
  50. package/dist/index-BlTCrSyc.d.cts +2158 -0
  51. package/dist/index-CEm8ZOvj.d.ts +2158 -0
  52. package/dist/index-CLq5kZmQ.d.cts +822 -0
  53. package/dist/index-Ckao53JY.d.ts +2361 -0
  54. package/dist/index-DHHrLc0B.d.ts +947 -0
  55. package/dist/index-DIeR8qa-.d.ts +340 -0
  56. package/dist/index-DxZlGbAH.d.ts +1716 -0
  57. package/dist/index-DyVWeYP3.d.cts +765 -0
  58. package/dist/index-GSUN6rjA.d.ts +822 -0
  59. package/dist/index-_dJhBl1h.d.ts +765 -0
  60. package/dist/index-bMa-0Yr4.d.cts +1716 -0
  61. package/dist/index-z_uCh5KW.d.cts +947 -0
  62. package/dist/{isBigInt-B1cijjqm.cjs → isBigInt-CIFRnsdx.cjs} +2 -2
  63. package/dist/{isBigInt-B1cijjqm.cjs.map → isBigInt-CIFRnsdx.cjs.map} +1 -1
  64. package/dist/{isBigInt-C0bN0Rhu.js → isBigInt-D-Pu9sxp.js} +2 -2
  65. package/dist/{isBigInt-C0bN0Rhu.js.map → isBigInt-D-Pu9sxp.js.map} +1 -1
  66. package/dist/{isEmptyObject-DI42NEo0.cjs → isEmptyObject-CEySmyHK.cjs} +3 -3
  67. package/dist/{isEmptyObject-DI42NEo0.cjs.map → isEmptyObject-CEySmyHK.cjs.map} +1 -1
  68. package/dist/{isEmptyObject-DeLVIJpl.js → isEmptyObject-CZ9DLi7R.js} +3 -3
  69. package/dist/{isEmptyObject-DeLVIJpl.js.map → isEmptyObject-CZ9DLi7R.js.map} +1 -1
  70. package/dist/{isEmptyString-BTUWYTbw.js → isEmptyString-DFDtBbNr.js} +3 -3
  71. package/dist/{isEmptyString-BTUWYTbw.js.map → isEmptyString-DFDtBbNr.js.map} +1 -1
  72. package/dist/{isEmptyString-CCK3bP74.cjs → isEmptyString-DI64RQCy.cjs} +3 -3
  73. package/dist/{isEmptyString-CCK3bP74.cjs.map → isEmptyString-DI64RQCy.cjs.map} +1 -1
  74. package/dist/{isEmptyValue-DMSMFTU8.cjs → isEmptyValue-Cw6ovu7z.cjs} +5 -5
  75. package/dist/{isEmptyValue-DMSMFTU8.cjs.map → isEmptyValue-Cw6ovu7z.cjs.map} +1 -1
  76. package/dist/{isEmptyValue-fjnfQnt5.js → isEmptyValue-aGyeClwA.js} +5 -5
  77. package/dist/{isEmptyValue-fjnfQnt5.js.map → isEmptyValue-aGyeClwA.js.map} +1 -1
  78. package/dist/{isEqual-DhyP8fB_.js → isEqual-Dtb2sXUv.js} +4 -4
  79. package/dist/{isEqual-DhyP8fB_.js.map → isEqual-Dtb2sXUv.js.map} +1 -1
  80. package/dist/{isEqual-B1fRgEuU.cjs → isEqual-UsvOwrlY.cjs} +4 -4
  81. package/dist/{isEqual-B1fRgEuU.cjs.map → isEqual-UsvOwrlY.cjs.map} +1 -1
  82. package/dist/{isFinite-BYMOo0os.js → isFinite-Cz_IFXuV.js} +3 -3
  83. package/dist/{isFinite-BYMOo0os.js.map → isFinite-Cz_IFXuV.js.map} +1 -1
  84. package/dist/{isFinite-sFkps2TY.cjs → isFinite-uukWvxJh.cjs} +3 -3
  85. package/dist/{isFinite-sFkps2TY.cjs.map → isFinite-uukWvxJh.cjs.map} +1 -1
  86. package/dist/{isInteger-FTCthMre.cjs → isInteger-DPYjliLZ.cjs} +2 -2
  87. package/dist/{isInteger-FTCthMre.cjs.map → isInteger-DPYjliLZ.cjs.map} +1 -1
  88. package/dist/{isInteger-DS9V7l_f.js → isInteger-DZ163OQg.js} +2 -2
  89. package/dist/{isInteger-DS9V7l_f.js.map → isInteger-DZ163OQg.js.map} +1 -1
  90. package/dist/isPlainObject-CBABRyEX.d.cts +339 -0
  91. package/dist/isPlainObject-Dr8gi89U.d.ts +339 -0
  92. package/dist/{isServer-D1TXfOs3.js → isServer-BDShLyVJ.js} +2 -2
  93. package/dist/{isServer-D1TXfOs3.js.map → isServer-BDShLyVJ.js.map} +1 -1
  94. package/dist/{isServer-q-QLFCqE.cjs → isServer-BzDeYuGg.cjs} +2 -2
  95. package/dist/{isServer-q-QLFCqE.cjs.map → isServer-BzDeYuGg.cjs.map} +1 -1
  96. package/dist/{isTypedArray-DiCoqffZ.cjs → isTypedArray-DaYAkyrt.cjs} +3 -3
  97. package/dist/{isTypedArray-DiCoqffZ.cjs.map → isTypedArray-DaYAkyrt.cjs.map} +1 -1
  98. package/dist/{isTypedArray-47R0wdrc.js → isTypedArray-DuUUA4CL.js} +3 -3
  99. package/dist/{isTypedArray-47R0wdrc.js.map → isTypedArray-DuUUA4CL.js.map} +1 -1
  100. package/dist/{isValidDomain-BSXshgkC.cjs → isValidDomain-BxyToAlh.cjs} +74 -8
  101. package/dist/isValidDomain-BxyToAlh.cjs.map +1 -0
  102. package/dist/{isValidDomain-DwA2EN79.js → isValidDomain-CTw5vZFY.js} +57 -9
  103. package/dist/isValidDomain-CTw5vZFY.js.map +1 -0
  104. package/dist/{noop-B2mTBhW-.cjs → noop-7KrqC9DC.cjs} +2 -2
  105. package/dist/{noop-B2mTBhW-.cjs.map → noop-7KrqC9DC.cjs.map} +1 -1
  106. package/dist/{noop-BzktGBVz.js → noop-DGg9vMSD.js} +2 -2
  107. package/dist/{noop-BzktGBVz.js.map → noop-DGg9vMSD.js.map} +1 -1
  108. package/dist/{normalizeSpaces-DQHR3Tlr.cjs → normalizeSpaces-B6ZQOZRX.cjs} +3 -3
  109. package/dist/{normalizeSpaces-DQHR3Tlr.cjs.map → normalizeSpaces-B6ZQOZRX.cjs.map} +1 -1
  110. package/dist/{normalizeSpaces-WS_iERJk.js → normalizeSpaces-C1eLwykD.js} +3 -3
  111. package/dist/{normalizeSpaces-WS_iERJk.js.map → normalizeSpaces-C1eLwykD.js.map} +1 -1
  112. package/dist/operations/index.cjs +10 -10
  113. package/dist/operations/index.cjs.map +1 -1
  114. package/dist/operations/index.d.cts +120 -120
  115. package/dist/operations/index.d.ts +120 -120
  116. package/dist/operations/index.js +10 -10
  117. package/dist/operations/index.js.map +1 -1
  118. package/dist/parsers/index.cjs +2 -2
  119. package/dist/parsers/index.d.cts +222 -222
  120. package/dist/parsers/index.d.ts +222 -222
  121. package/dist/parsers/index.js +2 -2
  122. package/dist/{parsers-DXtpsDyj.cjs → parsers-DEFpCYhw.cjs} +4 -4
  123. package/dist/{parsers-DXtpsDyj.cjs.map → parsers-DEFpCYhw.cjs.map} +1 -1
  124. package/dist/{parsers-Dpuq-V4u.js → parsers-bQQ9mStV.js} +4 -4
  125. package/dist/{parsers-Dpuq-V4u.js.map → parsers-bQQ9mStV.js.map} +1 -1
  126. package/dist/{parsing-B43x1sxn.js → parsing-BngARhmu.js} +3 -3
  127. package/dist/{parsing-B43x1sxn.js.map → parsing-BngARhmu.js.map} +1 -1
  128. package/dist/{parsing-lRoxn1Nz.cjs → parsing-lI5EN4LY.cjs} +3 -3
  129. package/dist/{parsing-lRoxn1Nz.cjs.map → parsing-lI5EN4LY.cjs.map} +1 -1
  130. package/dist/predicates/index.cjs +15 -16
  131. package/dist/predicates/index.d.cts +3 -3
  132. package/dist/predicates/index.d.ts +3 -3
  133. package/dist/predicates/index.js +14 -15
  134. package/dist/{predicates-DiaYA7Ps.cjs → predicates-CMmP3fPJ.cjs} +15 -16
  135. package/dist/{predicates-DiaYA7Ps.cjs.map → predicates-CMmP3fPJ.cjs.map} +1 -1
  136. package/dist/{predicates-gNepszvo.js → predicates-V87QD8hs.js} +13 -14
  137. package/dist/{predicates-gNepszvo.js.map → predicates-V87QD8hs.js.map} +1 -1
  138. package/dist/promises/index.cjs +4 -4
  139. package/dist/promises/index.d.cts +101 -101
  140. package/dist/promises/index.d.ts +101 -101
  141. package/dist/promises/index.js +4 -4
  142. package/dist/{punyCode-hmiFzLWT.js → punyCode-BeFYDjj0.js} +6 -6
  143. package/dist/punyCode-BeFYDjj0.js.map +1 -0
  144. package/dist/{punyCode-CTWXVVFo.cjs → punyCode-DmTsB7q_.cjs} +6 -6
  145. package/dist/punyCode-DmTsB7q_.cjs.map +1 -0
  146. package/dist/{removeSpaces-BE8lfh-4.js → removeSpaces-B96axxP6.js} +7 -4
  147. package/dist/removeSpaces-B96axxP6.js.map +1 -0
  148. package/dist/{removeSpaces-DRRxNWlb.cjs → removeSpaces-C8mu_yp3.cjs} +12 -3
  149. package/dist/removeSpaces-C8mu_yp3.cjs.map +1 -0
  150. package/dist/rzl-utils.global.js +21 -0
  151. package/dist/{safeJsonParse-BBnQElk8.cjs → safeJsonParse-BXbtX_j7.cjs} +9 -9
  152. package/dist/safeJsonParse-BXbtX_j7.cjs.map +1 -0
  153. package/dist/{safeJsonParse-CXruaP0p.js → safeJsonParse-DyCsTXlU.js} +9 -9
  154. package/dist/safeJsonParse-DyCsTXlU.js.map +1 -0
  155. package/dist/{safeStableStringify-BNh3D0K0.js → safeStableStringify-BrOcdX9n.js} +4 -4
  156. package/dist/{safeStableStringify-BNh3D0K0.js.map → safeStableStringify-BrOcdX9n.js.map} +1 -1
  157. package/dist/{safeStableStringify-Cc62pfRp.cjs → safeStableStringify-DRYQ56Dg.cjs} +4 -4
  158. package/dist/{safeStableStringify-Cc62pfRp.cjs.map → safeStableStringify-DRYQ56Dg.cjs.map} +1 -1
  159. package/dist/strings/index.cjs +12 -10
  160. package/dist/strings/index.cjs.map +1 -1
  161. package/dist/strings/index.d.cts +2 -2
  162. package/dist/strings/index.d.ts +2 -2
  163. package/dist/strings/index.js +11 -9
  164. package/dist/strings/index.js.map +1 -1
  165. package/dist/tailwind/index.cjs +6 -2
  166. package/dist/tailwind/index.d.cts +3 -3
  167. package/dist/tailwind/index.d.ts +3 -3
  168. package/dist/tailwind/index.js +3 -3
  169. package/dist/{tailwind-IJvOdkZp.js → tailwind-BZ2_MeNX.js} +18 -8
  170. package/dist/tailwind-BZ2_MeNX.js.map +1 -0
  171. package/dist/{tailwind-DJ4cmLUw.cjs → tailwind-C1YtxJ-K.cjs} +39 -5
  172. package/dist/tailwind-C1YtxJ-K.cjs.map +1 -0
  173. package/dist/{toStringArrayUnRecursive-xUaU8Ot9.cjs → toStringArrayUnRecursive-D1mPM4wg.cjs} +6 -6
  174. package/dist/{toStringArrayUnRecursive-xUaU8Ot9.cjs.map → toStringArrayUnRecursive-D1mPM4wg.cjs.map} +1 -1
  175. package/dist/{toStringArrayUnRecursive-CFs0jTEg.js → toStringArrayUnRecursive-tHp2a7KR.js} +6 -6
  176. package/dist/{toStringArrayUnRecursive-CFs0jTEg.js.map → toStringArrayUnRecursive-tHp2a7KR.js.map} +1 -1
  177. package/dist/urls/index.cjs +9 -119
  178. package/dist/urls/index.d.cts +656 -659
  179. package/dist/urls/index.d.ts +656 -659
  180. package/dist/urls/index.js +3 -113
  181. package/dist/urls-CoxDAoki.js +263 -0
  182. package/dist/urls-CoxDAoki.js.map +1 -0
  183. package/dist/urls-DCyx8Wpk.cjs +299 -0
  184. package/dist/urls-DCyx8Wpk.cjs.map +1 -0
  185. package/package.json +4 -25
  186. package/dist/assertIsBoolean-BlBct0Fc.js.map +0 -1
  187. package/dist/assertIsBoolean-DozdtbNi.cjs.map +0 -1
  188. package/dist/conversions-CBs8-REq.cjs.map +0 -1
  189. package/dist/conversions-EMJa3g-D.js.map +0 -1
  190. package/dist/formatEnvPort-DpIXzPAZ.js +0 -159
  191. package/dist/formatEnvPort-DpIXzPAZ.js.map +0 -1
  192. package/dist/formatEnvPort-hHNvOim-.cjs +0 -171
  193. package/dist/formatEnvPort-hHNvOim-.cjs.map +0 -1
  194. package/dist/formatters-QcZO_Cpx.js.map +0 -1
  195. package/dist/formatters-lAYgA11L.cjs.map +0 -1
  196. package/dist/index-26W7ItWx.d.ts +0 -760
  197. package/dist/index-BPPQjAfs.d.cts +0 -2359
  198. package/dist/index-BXjlgBLz.d.cts +0 -2139
  199. package/dist/index-B_Wwo91H.d.ts +0 -2359
  200. package/dist/index-CpufydcI.d.cts +0 -704
  201. package/dist/index-Czc4O526.d.ts +0 -333
  202. package/dist/index-DPs1_p5G.d.cts +0 -760
  203. package/dist/index-DRpOyBSC.d.ts +0 -1703
  204. package/dist/index-DWWvtHUn.d.cts +0 -822
  205. package/dist/index-DnM0LD0n.d.cts +0 -333
  206. package/dist/index-GUZ9fK6T.d.ts +0 -2139
  207. package/dist/index-I4fAzwXV.d.ts +0 -704
  208. package/dist/index-JDrOl_19.d.ts +0 -822
  209. package/dist/index-b66P49Qe.d.cts +0 -1703
  210. package/dist/isPlainObject-DcFGh3_5.d.ts +0 -530
  211. package/dist/isPlainObject-doTI11Ib.d.cts +0 -530
  212. package/dist/isURL-CQiowFq2.js +0 -14
  213. package/dist/isURL-CQiowFq2.js.map +0 -1
  214. package/dist/isURL-WZypXsax.cjs +0 -20
  215. package/dist/isURL-WZypXsax.cjs.map +0 -1
  216. package/dist/isValidDomain-BSXshgkC.cjs.map +0 -1
  217. package/dist/isValidDomain-DwA2EN79.js.map +0 -1
  218. package/dist/next/index.cjs +0 -129
  219. package/dist/next/index.cjs.map +0 -1
  220. package/dist/next/index.d.cts +0 -226
  221. package/dist/next/index.d.ts +0 -226
  222. package/dist/next/index.js +0 -124
  223. package/dist/next/index.js.map +0 -1
  224. package/dist/next/server/index.cjs +0 -28
  225. package/dist/next/server/index.cjs.map +0 -1
  226. package/dist/next/server/index.d.cts +0 -39
  227. package/dist/next/server/index.d.ts +0 -39
  228. package/dist/next/server/index.js +0 -26
  229. package/dist/next/server/index.js.map +0 -1
  230. package/dist/normalizeString-2WLth_Gj.js +0 -15
  231. package/dist/normalizeString-2WLth_Gj.js.map +0 -1
  232. package/dist/normalizeString-D8euBcRD.cjs +0 -21
  233. package/dist/normalizeString-D8euBcRD.cjs.map +0 -1
  234. package/dist/punyCode-CTWXVVFo.cjs.map +0 -1
  235. package/dist/punyCode-hmiFzLWT.js.map +0 -1
  236. package/dist/removeSpaces-BE8lfh-4.js.map +0 -1
  237. package/dist/removeSpaces-DRRxNWlb.cjs.map +0 -1
  238. package/dist/safeJsonParse-BBnQElk8.cjs.map +0 -1
  239. package/dist/safeJsonParse-CXruaP0p.js.map +0 -1
  240. package/dist/tailwind-DJ4cmLUw.cjs.map +0 -1
  241. package/dist/tailwind-IJvOdkZp.js.map +0 -1
  242. package/dist/urls/index.cjs.map +0 -1
  243. package/dist/urls/index.js.map +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tailwind-C1YtxJ-K.cjs","names":["isNonEmptyString","isNumber","isObjectOrArray","isStringObject","isNumberObject","isBooleanObject","isArray","isPlainObject","isNumber","isNonEmptyString","isFunction","hasOwnProp","isNonEmptyArray","defaultConfig","isPlainObject","isPlainObject","twMergeV3","isFunction","getPreciseType","twMergeV4","isString","getPreciseType","isEmptyString","isNonEmptyArray"],"sources":["../src/tailwind/class-names/cx.ts","../src/tailwind/tw-merge/_private/validate-props.ts","../src/tailwind/tw-merge/v3/twMergeDefault.ts","../src/tailwind/tw-merge/v4/twMergeDefault.ts","../src/tailwind/class-names/customCn.ts","../src/tailwind/class-names/cn.ts","../src/tailwind/tw-macro/shouldForwardProp.ts"],"sourcesContent":["import { isArray } from \"@/predicates/is/isArray\";\nimport { isNumber } from \"@/predicates/is/isNumber\";\nimport { isStringObject } from \"@/predicates/is/isStringObject\";\nimport { isNumberObject } from \"@/predicates/is/isNumberObject\";\nimport { isBooleanObject } from \"@/predicates/is/isBooleanObject\";\nimport { isObjectOrArray } from \"@/predicates/is/isObjectOrArray\";\nimport { isNonEmptyString } from \"@/predicates/is/isNonEmptyString\";\n\n/** ----------------------------------------------------------\n * * ***Type-Utility: `ClassValue`.***\n * ----------------------------------------------------------\n * **Represents a single valid value that can be converted to a CSS class string.**\n * @description\n * - Supports the following types:\n * - `string` → literal class names (non-empty only)\n * - `number | bigint` → numeric class names\n * - `boolean` → only `true` is considered in objects/arrays\n * - `null | undefined` → ignored\n * - `ClassObject` → objects where **keys with truthy values** are included\n * - `ClassValues` → arrays recursively flattened\n * - Used internally by ***`cx` utility function*** to process mixed input values.\n * @example\n * ```ts\n * const val1: ClassValue = \"button\"; // ➔ string\n * const val2: ClassValue = 0; // ➔ number\n * const val3: ClassValue = [\"a\", { b: true }]; // ➔ array with object\n * const val4: ClassValue = { d: true, e: false }; // ➔ object\n * const val5: ClassValue = new String(\"foo\"); // ➔ boxed string\n * const val6: ClassValue = new Number(\"123\"); // ➔ boxed number\n * const val7: ClassValue = new Boolean(\"true\"); // ➔ boxed boolean\n * ```\n */\nexport type ClassValue =\n | ClassValues\n | ClassObject\n | string\n | number\n | bigint\n | null\n | boolean\n | undefined;\n\n/** ----------------------------------------------------------\n * * ***Type-Utility: `ClassObject`.***\n * ----------------------------------------------------------\n * **Represents an object whose keys with truthy values are included in the final class string.**\n * @example\n * ```ts\n * const obj: ClassObject = { \"text-red\": true, \"hidden\": false };\n * // ➔ \"text-red\" when processed by cx\n * ```\n */\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type ClassObject = Record<string, any>;\n\n/** ----------------------------------------------------------\n * * ***Type-Utility: `ClassValues`.***\n * ----------------------------------------------------------\n * **Represents an array of {@link ClassValue | `ClassValue's`}, potentially nested.**\n * @example\n * ```ts\n * const arr: ClassValues = [\n * \"a\",\n * 1,\n * [\"b\", { c: true, d: false }],\n * { e: 2 }\n * ];\n * ```\n */\nexport type ClassValues = ClassValue[];\n\n/** ----------------------------------------------------------\n * * ***Utility: `toStringValue`.***\n * ----------------------------------------------------------\n * **Converts a `ClassValue` into a single space-separated string suitable for CSS class usage.**\n * @param {ClassValue} value The mixed value to process.\n * @returns {string} A string containing all valid class names.\n * @description\n * - Arrays are recursively flattened.\n * - Objects include only keys with truthy values.\n * - Skips `null`, `undefined`, and empty strings.\n * - Numbers, strings, and bigint are included as-is.\n * - Boolean `false` is ignored in objects/arrays.\n * - Boxed primitives (`new String()`, `new Number()`, `new Boolean()`) are supported.\n * - Preserves inherited object keys.\n * @example\n * ```ts\n * toStringValue(\"btn\"); // ➔ \"btn\"\n * toStringValue([\"a\", 0, \"b\"]); // ➔ \"a b\"\n * toStringValue({ a: true, b: false, c: 1 }); // ➔ \"a c\"\n * toStringValue([\"a\", [\"b\", { c: true, d: false }]]); // ➔ \"a b c\"\n * toStringValue(new String(\"foo\")); // ➔ \"foo\"\n * toStringValue(new Number(42)); // ➔ \"42\"\n * toStringValue(new Boolean(true)); // ➔ \"true\"\n * toStringValue(new Boolean(false));// ➔ \"\"\n * ```\n */\nfunction toStringValue(value: ClassValue): string {\n let str = \"\";\n\n if (isNonEmptyString(value) || isNumber(value)) {\n str += value;\n } else if (isObjectOrArray(value)) {\n if (\n isStringObject(value) ||\n isNumberObject(value) ||\n isBooleanObject(value)\n ) {\n const val = value.valueOf();\n if (val) str += val; // skip falsy\n } else if (isArray(value)) {\n for (const item of value) {\n if (!item) continue; // skip falsy\n const y = toStringValue(item);\n if (!y) continue;\n if (str) str += \" \";\n str += y;\n }\n } else {\n for (const key in value) {\n if (!value[key]) continue; // skip falsy\n if (str) str += \" \";\n str += key;\n }\n }\n }\n\n return str;\n}\n\n/** ----------------------------------------------------------\n * * ***Utility: `cx`.***\n * ----------------------------------------------------------\n * **Merge multiple class values into a single, space-separated string suitable for CSS usage.**\n * @description\n * - Supports **nested combinations** of arrays and objects, recursively.\n * - **Falsy values** are skipped:\n * - `false`, `null`, `undefined`, empty strings `\"\"` are ignored anywhere.\n * - Numbers `0` are ignored inside nested arrays/objects.\n * - **Boxed primitives** are correctly unwrapped to their primitive value.\n * - **Inherited object keys** are included in the final class string.\n * - Optimized for **CSS class merging** where conditional inclusion is common.\n * @param {ClassValues} values\n * A list of mixed class values, which can include:\n * - **Strings** → literal class names.\n * - **Numbers** → numeric class names.\n * - **BigInt** → numeric class names larger than JS safe integer limit.\n * - **Arrays** → recursively flattened, can contain nested arrays or objects.\n * - **Objects** → include keys whose values are truthy. Inherited keys are also included.\n * - **Boxed primitives** (`new String()`, `new Number()`, `new Boolean()`) → automatically unwrapped.\n * - **Falsy values** (`false`, `null`, `undefined`, `\"\"`, `0`) are ignored according to original behavior.\n * @returns {string}\n * A single space-separated string containing all valid class names.\n * @example\n * ```ts\n * // Basic string merge\n * cx(\"btn\", \"btn-primary\");\n * // ➔ \"btn btn-primary\"\n *\n * // Mixed arrays and objects\n * cx(\"a\", [\"b\", { c: true, d: false }], { e: 1, f: 0 }, null, 2);\n * // ➔ \"a b c e 2\"\n *\n * // Empty and falsy values are ignored\n * cx(\"\", null, undefined, false, 0);\n * // ➔ \"\"\n *\n * // Nested arrays with objects\n * cx([\"a\", [\"b\", { c: true, d: false }]]);\n * // ➔ \"a b c\"\n *\n * // Boxed primitives are unwrapped\n * cx(new String(\"foo\"), new Number(42), new Boolean(true), new Number(0), new Boolean(false));\n * // ➔ \"foo 42 true\"\n *\n * // Inherited keys from objects are included\n * const proto = { inherited: true };\n * const obj = Object.create(proto);\n * obj.own = true;\n * cx(obj);\n * // ➔ \"own inherited\"\n * ```\n */\nexport function cx(...values: ClassValues): string {\n let str = \"\";\n\n for (const value of values) {\n if (!value) continue; // skip falsy arguments\n const x = toStringValue(value);\n if (!x) continue;\n if (str) str += \" \";\n str += x;\n }\n\n return str;\n}\n","import type { Config as TwConfig } from \"tailwindcss\";\nimport type { ConfigExtension } from \"tailwind-merge-v4\";\n\nimport type { OptionsMergeTwClsV4 } from \"../v4/_private/types\";\n\nimport { hasOwnProp } from \"@/predicates/has/hasOwnProp\";\n\nimport { isNumber } from \"@/predicates/is/isNumber\";\nimport { isFunction } from \"@/predicates/is/isFunction\";\nimport { isPlainObject } from \"@/predicates/is/isPlainObject\";\nimport { isNonEmptyArray } from \"@/predicates/is/isNonEmptyArray\";\nimport { isNonEmptyString } from \"@/predicates/is/isNonEmptyString\";\n\nexport type TailwindConfig = TwConfig;\n\n/**\n * @internal\n */\ntype TwMergeConfigExt = ConfigExtension<string, string>;\n\n/**\n * @internal\n */\ntype ValidatorTwMergeReturn = {\n config: TwConfig;\n override: TwMergeConfigExt[\"override\"];\n cacheSize: TwMergeConfigExt[\"cacheSize\"];\n prefix: TwMergeConfigExt[\"prefix\"];\n experimentalParseClassName?: TwMergeConfigExt[\"experimentalParseClassName\"];\n theme: NonNullable<NonNullable<TwMergeConfigExt[\"extend\"]>[\"theme\"]>;\n classGroups: NonNullable<\n NonNullable<TwMergeConfigExt[\"extend\"]>[\"classGroups\"]\n >;\n conflictingClassGroupModifiers: NonNullable<\n NonNullable<TwMergeConfigExt[\"extend\"]>[\"conflictingClassGroupModifiers\"]\n >;\n conflictingClassGroups: NonNullable<\n NonNullable<TwMergeConfigExt[\"extend\"]>[\"conflictingClassGroups\"]\n >;\n orderSensitiveModifiers: NonNullable<\n NonNullable<TwMergeConfigExt[\"extend\"]>[\"orderSensitiveModifiers\"]\n >;\n};\n\n/**\n * @internal\n */\nexport const validatorPropsTwMerge = (\n options: OptionsMergeTwClsV4\n): ValidatorTwMergeReturn => {\n if (!isPlainObject(options)) options = {};\n let {\n config,\n prefix,\n extend,\n override,\n cacheSize,\n experimentalParseClassName\n } = options;\n\n if (!isPlainObject(config)) config = {};\n if (!isPlainObject(extend)) extend = {};\n if (!isPlainObject(override)) override = {};\n if (!isNumber(cacheSize)) cacheSize = undefined;\n if (!isNonEmptyString(prefix)) prefix = undefined;\n if (!isFunction(experimentalParseClassName))\n experimentalParseClassName = undefined;\n\n const theme = hasOwnProp(extend, \"theme\") ? extend.theme : {};\n const classGroups = hasOwnProp(extend, \"classGroups\")\n ? extend.classGroups\n : {};\n const conflictingClassGroupModifiers = hasOwnProp(\n extend,\n \"conflictingClassGroupModifiers\"\n )\n ? extend.conflictingClassGroupModifiers\n : {};\n\n const conflictingClassGroups = hasOwnProp(extend, \"conflictingClassGroups\")\n ? extend.conflictingClassGroups\n : {};\n const orderSensitiveModifiers =\n hasOwnProp(extend, \"orderSensitiveModifiers\") &&\n isNonEmptyArray(extend.orderSensitiveModifiers)\n ? extend.orderSensitiveModifiers\n : [];\n\n return {\n config,\n override,\n cacheSize,\n prefix,\n experimentalParseClassName,\n theme,\n classGroups,\n conflictingClassGroupModifiers,\n conflictingClassGroups,\n orderSensitiveModifiers\n };\n};\n","import type { OptionsMergeTwClsV3, TwMergeDefaultFnV3 } from \"./_private/types\";\n\nimport { extendTailwindMerge, getDefaultConfig } from \"tailwind-merge-v3\";\n\nimport { isPlainObject } from \"@/predicates/is/isPlainObject\";\nimport { validatorPropsTwMerge } from \"../_private/validate-props\";\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { customCnVer3 } from \"../../class-names/customCn\";\n\n// Get default Tailwind merge configuration\nconst defaultConfig = getDefaultConfig();\n\n/** -------------------------------------------------------------\n * * ***Customized Tailwind class merger Version 3 with extended rules.***\n * -------------------------------------------------------------\n *\n * **Wraps ***`extendTailwindMerge` from tailwind-merge-v3*** with Tailwind’s default\n * config (_*`getDefaultConfig()` from tailwind-merge-v3*_) to create a **project-ready `twMerge`**.**\n * - 🔑 **When to use it?**\n * - Your project uses **Tailwind v3**.\n * - Extend **class groups** (e.g. add `text-shadow`).\n * - Respect your own **`tailwind.config.ts`** (colors, spacing, fontSize, etc).\n * - Override or fine-tune **merge behavior**.\n * - Create a **project-wide `cn` helper** that replaces raw `twMerge`.\n *\n * @deprecated ***Still supported for advanced Tailwind merge customization, but significantly slower than native `twMerge` during SSR and hydration because merge rules are extended at runtime, prefer `twMerge` + {@link customCnVer3 | `customCnVer3`} for better performance, this utility may be removed in a future release.***\n *\n * @param {OptionsMergeTwClsV3} [options={}]\n * ***Merge options:***\n * - `config` – Your Tailwind config (from `tailwind.config.ts`).\n * - `prefix` - Utility prefix (e.g. `tw-` or `tw`).\n * - `extend` – Extra merge rules (classGroups, theme, etc).\n * - `override` – Fully replace rules.\n * - `cacheSize` – Parsed class cache size.\n * - `experimentalParseClassName` – Custom classname parser.\n *\n * @returns {TwMergeDefaultFnV3}\n * Customized Tailwind class merge function version 3 (same signature as `twMerge`).\n *\n * @example\n * #### Example 1: ***Default behavior (same as tailwind-merge).***\n * ```ts\n * import { twMergeDefaultV3 } from \"@rzl-zone/utils-js/tailwind\";\n *\n * const twMerge = twMergeDefaultV3();\n * twMerge(\"p-2 p-4\");\n * // ➔ \"p-4\"\n * ```\n * #### Example 2: ***Extend class groups.***\n * ```ts\n * import { twMergeDefaultV3 } from \"@rzl-zone/utils-js/tailwind\";\n *\n * const twMerge2 = twMergeDefaultV3({\n * extend: {\n * classGroups: {\n * shadow: [\"shadow-soft\", \"shadow-hard\"],\n * },\n * },\n * });\n * twMerge2(\"shadow-soft shadow-hard\");\n * // ➔ \"shadow-hard\"\n * ```\n * #### Example 3: ***Respect your Tailwind config.***\n * ```ts\n * import config from \"../tailwind.config\";\n * import { twMergeDefaultV3 } from \"@rzl-zone/utils-js/tailwind\";\n *\n * const twMerge3 = twMergeDefaultV3({ config });\n * twMerge3(\"text-base text-xxs\");\n * // ➔ \"text-xxs\" (resolved from config)\n * ```\n * #### Example 4: ***Project-wide helper (recommended).***\n * ```ts\n * import configTwCss from \"../tailwind.config\";\n * import { customCnV3, twMergeDefaultV3, type ClassValues } from \"@rzl-zone/utils-js/tailwind\";\n *\n * const customTwMerge = twMergeDefaultV3({\n * config: configTwCss,\n * extend: {\n * classGroups: { shadow: [\"shadow-soft\", \"shadow-hard\"] },\n * },\n * });\n *\n * export const cnApp = (...classes: ClassValues) => {\n * return customCnV3(customTwMerge, ...classes);\n * };\n *\n * // ✅ Usage\n * cnApp(\"p-2 p-4\"); // ➔ \"p-4\"\n * cnApp(\"shadow-soft shadow-hard\"); // ➔ \"shadow-hard\"\n * cnApp(\"text-base text-xxs\"); // ➔ \"text-xxs\" (uses config)\n *\n * // ⚡ Difference with package-level `cn`\n * import { cnV3, cnV4 } from \"@rzl-zone/utils-js/tailwind\";\n *\n * cnV3(\"text-base text-xxs\");\n * // or\n * cnV4(\"text-base text-xxs\");\n * // ➔ \"text-base\" (❌ doesn't know about your config)\n *\n * cnApp(\"text-base text-xxs\");\n * // ➔ \"text-xxs\" (✅ respects config)\n * ```\n */\nexport const twMergeDefaultV3 = (\n options: OptionsMergeTwClsV3 = {}\n): TwMergeDefaultFnV3 => {\n if (!isPlainObject(options)) options = {};\n const {\n cacheSize,\n classGroups,\n config,\n conflictingClassGroupModifiers,\n conflictingClassGroups,\n override,\n prefix,\n theme,\n experimentalParseClassName\n } = validatorPropsTwMerge(options);\n\n return extendTailwindMerge<string, string>({\n prefix: prefix ?? config.prefix,\n cacheSize: cacheSize || defaultConfig.cacheSize,\n experimentalParseClassName,\n override,\n extend: {\n conflictingClassGroupModifiers: {\n ...defaultConfig.conflictingClassGroupModifiers,\n ...conflictingClassGroupModifiers\n },\n theme: { ...defaultConfig.theme, ...theme },\n conflictingClassGroups: {\n ...defaultConfig.conflictingClassGroups,\n ...conflictingClassGroups\n },\n classGroups: {\n ...defaultConfig.classGroups,\n ...classGroups,\n\n \"text-shadow\": [\n \"\",\n \"-sm\",\n \"-md\",\n \"-lg\",\n \"-xl\",\n \"-xxl\",\n \"-none\",\n \"-default\"\n ].map((size) => `text-shadow${size}`),\n \"font-size\": Object.keys({\n ...(config.theme?.fontSize || {}),\n ...(config.theme?.extend?.fontSize || {})\n }).map((size) => `text-${size}`)\n }\n }\n });\n};\n","import type { OptionsMergeTwClsV4, TwMergeDefaultFnV4 } from \"./_private/types\";\n\nimport { extendTailwindMerge, getDefaultConfig } from \"tailwind-merge-v4\";\n\nimport { isPlainObject } from \"@/predicates/is/isPlainObject\";\nimport { validatorPropsTwMerge } from \"../_private/validate-props\";\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { customCnVer4 } from \"../../class-names/customCn\";\n\n// Get default Tailwind merge configuration\nconst defaultConfig = getDefaultConfig();\n\n/** -------------------------------------------------------------\n * * ***Customized Tailwind class merger Version 4 with extended rules.***\n * -------------------------------------------------------------\n *\n * **Wraps ***`extendTailwindMerge` from tailwind-merge-v4*** with Tailwind’s default\n * config (_*`getDefaultConfig()` from tailwind-merge-v4*_) to create a **project-ready `twMerge`**.**\n * - 🔑 **When to use it?**\n * - Your project uses **Tailwind v4**.\n * - Extend **class groups** (e.g. add `text-shadow`).\n * - Respect your own **`tailwind.config.ts`** (colors, spacing, fontSize, etc).\n * - Override or fine-tune **merge behavior**.\n * - Create a **project-wide `cn` helper** that replaces raw `twMerge`.\n *\n * @deprecated ***Still supported for advanced Tailwind merge customization, but significantly slower than native `twMerge` during SSR and hydration because merge rules are extended at runtime, prefer `twMerge` + {@link customCnVer4 | `customCnVer4`} for better performance, this utility may be removed in a future release.***\n *\n * @deprecated ***Slower than the default `twMerge`, but still safe to use when custom merge behavior is needed.***\n *\n * @param {OptionsMergeTwClsV4} [options={}]\n * ***Merge options:***\n * - `config` – Your Tailwind config (from `tailwind.config.ts`).\n * - `prefix` - Utility prefix (e.g. `tw-` or `tw`).\n * - `extend` – Extra merge rules (classGroups, theme, etc).\n * - `override` – Fully replace rules.\n * - `cacheSize` – Parsed class cache size.\n * - `experimentalParseClassName` – Custom classname parser.\n *\n * @returns {TwMergeDefaultFnV4}\n * Customized Tailwind class merge function version 4 (same signature as `twMerge`).\n *\n * @example\n * #### Example 1: ***Default behavior (same as tailwind-merge).***\n * ```ts\n * import { twMergeDefaultV4 } from \"@rzl-zone/utils-js/tailwind\";\n *\n * const twMerge = twMergeDefaultV4();\n * twMerge(\"p-2 p-4\");\n * // ➔ \"p-4\"\n * ```\n * #### Example 2: ***Extend class groups.***\n * ```ts\n * import { twMergeDefaultV4 } from \"@rzl-zone/utils-js/tailwind\";\n *\n * const twMerge2 = twMergeDefaultV4({\n * extend: {\n * classGroups: {\n * shadow: [\"shadow-soft\", \"shadow-hard\"],\n * },\n * },\n * });\n * twMerge2(\"shadow-soft shadow-hard\");\n * // ➔ \"shadow-hard\"\n * ```\n * #### Example 3: ***Respect your Tailwind config.***\n * ```ts\n * import config from \"../tailwind.config\";\n * import { twMergeDefaultV4 } from \"@rzl-zone/utils-js/tailwind\";\n *\n * const twMerge3 = twMergeDefaultV4({ config });\n * twMerge3(\"text-base text-xxs\");\n * // ➔ \"text-xxs\" (resolved from config)\n * ```\n * #### Example 4: ***Project-wide helper (recommended).***\n * ```ts\n * import configTwCss from \"../tailwind.config\";\n * import { customCnV4, twMergeDefaultV4, type ClassValues } from \"@rzl-zone/utils-js/tailwind\";\n *\n * const customTwMerge = twMergeDefaultV4({\n * config: configTwCss,\n * extend: {\n * classGroups: { shadow: [\"shadow-soft\", \"shadow-hard\"] },\n * },\n * });\n *\n * export const cnApp = (...classes: ClassValues) => {\n * return customCnV4(customTwMerge, ...classes);\n * };\n *\n * // ✅ Usage\n * cnApp(\"p-2 p-4\"); // ➔ \"p-4\"\n * cnApp(\"shadow-soft shadow-hard\"); // ➔ \"shadow-hard\"\n * cnApp(\"text-base text-xxs\"); // ➔ \"text-xxs\" (uses config)\n *\n * // ⚡ Difference with package-level `cn`\n * import { cnV3, cnV4 } from \"@rzl-zone/utils-js/tailwind\";\n *\n * cnV3(\"text-base text-xxs\");\n * // or\n * cnV4(\"text-base text-xxs\");\n * // ➔ \"text-base\" (❌ doesn't know about your config)\n *\n * cnApp(\"text-base text-xxs\");\n * // ➔ \"text-xxs\" (✅ respects config)\n * ```\n */\nexport const twMergeDefaultV4 = (\n options: OptionsMergeTwClsV4 = {}\n): TwMergeDefaultFnV4 => {\n if (!isPlainObject(options)) options = {};\n const {\n cacheSize,\n classGroups,\n config,\n conflictingClassGroupModifiers,\n conflictingClassGroups,\n orderSensitiveModifiers,\n override,\n prefix,\n theme,\n experimentalParseClassName\n } = validatorPropsTwMerge(options);\n\n return extendTailwindMerge<string, string>({\n prefix: prefix || config.prefix,\n cacheSize: cacheSize || defaultConfig.cacheSize,\n experimentalParseClassName,\n override,\n extend: {\n conflictingClassGroupModifiers: {\n ...defaultConfig.conflictingClassGroupModifiers,\n ...conflictingClassGroupModifiers\n },\n theme: { ...defaultConfig.theme, ...theme },\n conflictingClassGroups: {\n ...defaultConfig.conflictingClassGroups,\n ...conflictingClassGroups\n },\n orderSensitiveModifiers: [\n ...defaultConfig.orderSensitiveModifiers,\n ...orderSensitiveModifiers\n ],\n classGroups: {\n ...defaultConfig.classGroups,\n ...classGroups,\n\n \"text-shadow\": [\n \"\",\n \"-sm\",\n \"-md\",\n \"-lg\",\n \"-xl\",\n \"-xxl\",\n \"-none\",\n \"-default\"\n ].map((size) => `text-shadow${size}`),\n \"font-size\": Object.keys({\n ...(config.theme?.fontSize || {}),\n ...(config.theme?.extend?.fontSize || {})\n }).map((size) => `text-${size}`)\n }\n }\n });\n};\n","import type { TwMergeDefaultFnV3 } from \"../tw-merge/v3/_private/types\";\nimport type { TwMergeDefaultFnV4 } from \"../tw-merge/v4/_private/types\";\n\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { twMergeDefaultV3 } from \"../tw-merge/v3/twMergeDefault\";\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { twMergeDefaultV4 } from \"../tw-merge/v4/twMergeDefault\";\n\nimport { isFunction } from \"@/predicates/is/isFunction\";\nimport { getPreciseType } from \"@/predicates/type/getPreciseType\";\nimport { cx, type ClassValues } from \"./cx\";\n\nexport type { ClassValues };\n\nimport { twMerge as twMergeV3 } from \"tailwind-merge-v3\";\nimport { twMerge as twMergeV4 } from \"tailwind-merge-v4\";\n\n/** -------------------------------------------------------------\n * * ***High-performance `cn` factory utility (Tailwind `v3`).***\n * -------------------------------------------------------------\n * **Combines class-name values and applies the provided Tailwind merge\n * function using the native {@link twMergeV3 | `twMergeV3`} implementation\n * from `tailwind-merge` version 2 for `tailwind version 3`.**\n *\n * This utility is the recommended replacement for deprecated extended\n * runtime merge helpers because it provides significantly better hydration\n * and runtime performance.\n *\n * - ✅ **Recommended when:**\n * - Your project uses **Tailwind v3**.\n * - You want the fastest possible `cn` utility.\n * - You need reusable project-wide `cn*` helpers.\n * - You want predictable Tailwind conflict resolution with minimal overhead.\n *\n * - ⚡ **Performance note**\n * - Uses the native `twMergeV3` implementation directly.\n * - Faster than deprecated extended merge utilities.\n * - Better suited for SSR and hydration-heavy applications.\n *\n * @param {TwMergeDefaultFnV3} customTwMergeV3 - Merge function created via {@link twMergeV3 | `twMergeV3`}.\n * @param {ClassValues} classes - Class values (`string`, `array`, `object`, `etc`).\n * @returns {string} Merged Tailwind class string.\n *\n * @example\n * ```ts\n * import { twMerge as twMergeV3 } from \"tailwind-merge\"; // tw-merge (v2) for tailwind version 3\n * import { customCnVer3, type ClassValues } from \"@rzl-zone/utils-js/tailwind\";\n *\n * // 1. Create app-level helper\n * export const cnApp = (...classes: ClassValues) => {\n * return customCnVer3(twMergeV3, ...classes);\n * };\n *\n * // ✅ Usage\n * cnApp(\"p-2\", \"p-4\"); // ➔ \"p-4\"\n * cnApp(\"text-sm text-lg\"); // ➔ \"text-lg\"\n * cnApp(\"shadow-sm shadow-md\"); // ➔ \"shadow-md\"\n * ```\n */\nexport const customCnVer3 = (\n customTwMergeV3: TwMergeDefaultFnV3 = twMergeV3,\n ...classes: ClassValues\n): string => {\n if (!isFunction(customTwMergeV3)) {\n throw new TypeError(\n `first Parameter (\\`customTwMergeV3\\`) must be of type \\`function\\`, but received: \\`${getPreciseType(\n customTwMergeV3\n )}\\`.`\n );\n }\n\n return customTwMergeV3(cx(...classes));\n};\n\n/** -------------------------------------------------------------\n * * ***High-performance `cn` factory utility (Tailwind `v4`).***\n * -------------------------------------------------------------\n * **Combines class-name values and applies the provided Tailwind merge\n * function using the native {@link twMergeV4 | `twMergeV4`} implementation\n * from `tailwind-merge` version 3 for `tailwind version 4`.**\n *\n * This utility is the recommended replacement for deprecated extended\n * runtime merge helpers because it provides significantly better hydration\n * and runtime performance.\n *\n * - ✅ **Recommended when:**\n * - Your project uses **Tailwind v4**.\n * - You want the fastest possible `cn` utility.\n * - You need reusable project-wide `cn*` helpers.\n * - You want predictable Tailwind conflict resolution with minimal overhead.\n *\n * - ⚡ **Performance note**\n * - Uses the native `twMergeV4` implementation directly.\n * - Faster than deprecated extended merge utilities.\n * - Better suited for SSR and hydration-heavy applications.\n *\n * @param {TwMergeDefaultFnV4} customTwMergeV4 - Merge function created via {@link twMergeV4 | `twMergeV4`}.\n * @param {ClassValues} classes - Class values (`string`, `array`, `object`, `etc`).\n * @returns {string} Merged Tailwind class string.\n *\n * @example\n * ```ts\n * import { twMerge as twMergeV4 } from \"tailwind-merge\"; // tw-merge (v3) for tailwind version 4\n * import { customCnVer4, type ClassValues } from \"@rzl-zone/utils-js/tailwind\";\n *\n * // 1. Create app-level helper\n * export const cnApp = (...classes: ClassValues) => {\n * return customCnVer4(twMergeV4, ...classes);\n * };\n *\n * // ✅ Usage\n * cnApp(\"p-2\", \"p-4\"); // ➔ \"p-4\"\n * cnApp(\"text-sm text-lg\"); // ➔ \"text-lg\"\n * cnApp(\"shadow-sm shadow-md\"); // ➔ \"shadow-md\"\n * ```\n */\nexport const customCnVer4 = (\n customTwMergeV4: TwMergeDefaultFnV4 = twMergeV4,\n ...classes: ClassValues\n): string => {\n if (!isFunction(customTwMergeV4)) {\n throw new TypeError(\n `first Parameter (\\`customTwMergeV4\\`) must be of type \\`function\\`, but received: \\`${getPreciseType(\n customTwMergeV4\n )}\\`.`\n );\n }\n\n return customTwMergeV4(cx(...classes));\n};\n\n/** -------------------------------------------------------------\n * * ***Factory utility for building a custom `cn` helper (Tailwind `v3`).***\n * -------------------------------------------------------------\n *\n * **Wraps internally function to combines class-name values and applies the provided\n * Tailwind merge function (from {@link twMergeDefaultV3 | `twMergeDefaultV3`}).**\n *\n * - 🔑 **When to use it?**\n * - Your project uses **Tailwind v3**.\n * - You extend Tailwind merge rules (`classGroups`, `tailwind.config`).\n * - You need multiple `cn*` variants across apps/packages.\n *\n * @deprecated ***Still supported, but slower during SSR and hydration because it relies on extended runtime merge logic,\n * prefer {@link customCnVer3 | `customCnVer3`}for better performance, this utility may be removed in a future release.***\n *\n * @param {TwMergeDefaultFnV3} customTwMergeV3 - Merge function created via {@link twMergeDefaultV3 | `twMergeDefaultV3`}.\n * @param {ClassValues} classes - Class values (`string`, `array`, `object`, `etc`).\n *\n * @returns {string} Merged Tailwind class string.\n *\n * @example\n * ```ts\n * import tailwindConfig from \"../tailwind.config\";\n * import { twMergeDefaultV3, customCnV3, type ClassValues } from \"@rzl-zone/utils-js/tailwind\";\n *\n * // 1. Create a custom merge function\n * const myCustomTwMerge = twMergeDefaultV3({\n * config: tailwindConfig,\n * extend: {\n * classGroups: {\n * \"text-shadow\": [\"text-shadow\", \"text-shadow-sm\", \"text-shadow-md\"],\n * },\n * },\n * });\n *\n * // 2. Build your helper using `customCnV3`\n * export const cnApp = (...classes: ClassValues) => {\n * return customCnV3(myCustomTwMerge, ...classes);\n * };\n * // ✅ Usage\n * cnApp(\"p-2\", \"p-4\"); // ➔ \"p-4\"\n * cnApp(\"shadow-sm shadow-md\"); // ➔ \"shadow-md\"\n * cnApp(\"text-base text-xxs\"); // ➔ \"text-xxs\" (resolved from config)\n * ```\n */\nexport const customCnV3 = (\n customTwMergeV3: TwMergeDefaultFnV3,\n ...classes: ClassValues\n): string => {\n if (!isFunction(customTwMergeV3)) {\n throw new TypeError(\n `first Parameter (\\`customTwMergeV3\\`) must be of type \\`function\\`, but received: \\`${getPreciseType(\n customTwMergeV3\n )}\\`.`\n );\n }\n\n return customTwMergeV3(cx(...classes));\n};\n\n/** -------------------------------------------------------------\n * * ***Factory utility for building a custom `cn` helper (Tailwind `v4`).***\n * -------------------------------------------------------------\n *\n * **Wraps internally function to combines class-name values and applies the provided\n * Tailwind merge function (from {@link twMergeDefaultV4 | `twMergeDefaultV4`}).**\n *\n * - 🔑 **When to use it?**\n * - Your project uses **Tailwind v4**.\n * - You extend Tailwind merge rules (`classGroups`, `tailwind.config`).\n * - You need multiple `cn*` variants across apps/packages.\n *\n * @deprecated ***Still supported, but slower during SSR and hydration because it relies on extended runtime merge logic,\n * prefer {@link customCnVer4 | `customCnVer4`}for better performance, this utility may be removed in a future release.***\n *\n * @param {TwMergeDefaultFnV4} customTwMergeV4 - Merge function created via {@link twMergeDefaultV4 | `twMergeDefaultV4`}.\n * @param {ClassValues} classes - Class values (`string`, `array`, `object`, `etc`).\n *\n * @returns {string} Merged Tailwind class string.\n *\n * @example\n * ```ts\n * import tailwindConfig from \"../tailwind.config\";\n * import { twMergeDefaultV4, customCnV4, type ClassValues } from \"@rzl-zone/utils-js/tailwind\";\n *\n * // 1. Create a custom merge function\n * const myCustomTwMerge = twMergeDefaultV4({\n * config: tailwindConfig,\n * extend: {\n * classGroups: {\n * \"text-shadow\": [\"text-shadow\", \"text-shadow-sm\", \"text-shadow-md\"],\n * },\n * },\n * });\n *\n * // 2. Build your helper using `customCnV4`\n * export const cnApp = (...classes: ClassValues) => {\n * return customCnV4(myCustomTwMerge, ...classes);\n * };\n *\n * // ✅ Usage\n * cnApp(\"p-2\", \"p-4\"); // ➔ \"p-4\"\n * cnApp(\"shadow-sm shadow-md\"); // ➔ \"shadow-md\"\n * cnApp(\"text-base text-xxs\"); // ➔ \"text-xxs\" (resolved from config)\n * ```\n */\nexport const customCnV4 = (\n customTwMergeV4: TwMergeDefaultFnV4,\n ...classes: ClassValues\n): string => {\n if (!isFunction(customTwMergeV4)) {\n throw new TypeError(\n `first Parameter (\\`customTwMergeV4\\`) must be of type \\`function\\`, but received: \\`${getPreciseType(\n customTwMergeV4\n )}\\`.`\n );\n }\n\n return customTwMergeV4(cx(...classes));\n};\n","import { twMerge as twMergeV3 } from \"tailwind-merge-v3\";\nimport { twMerge as twMergeV4 } from \"tailwind-merge-v4\";\n\nimport { cx, type ClassValues } from \"./cx\";\n// eslint-disable-next-line @typescript-eslint/no-unused-vars\nimport { customCnV3, customCnV4 } from \"./customCn\";\nimport { twMergeDefaultV3 } from \"../tw-merge/v3/twMergeDefault\";\nimport { twMergeDefaultV4 } from \"../tw-merge/v4/twMergeDefault\";\n\n/** -------------------------------------------------------------------\n * * ***Combines and merges class utility values into a single normalized\n * string with `Tailwind CSS v3` conflict resolution.***\n * --------------------------------------------------------------------\n *\n * This utility composes {@link cx | `cx`} and {@link twMergeV3 | `twMerge`} version **2** for ***`tailwind version 3`***:\n *\n * - `cx` handles flexible class inputs (like `clsx`)\n * - `twMerge` resolves Tailwind CSS utility conflicts\n *\n * This provides a complete solution for conditional class composition\n * with deterministic Tailwind merging.\n *\n * - **Behavior:**\n * - Accepts strings, numbers, arrays, and objects\n * - Supports deeply nested class structures\n * - Ignores falsy values (`false`, `null`, `undefined`, `\"\"`, `0`)\n * - Includes object keys with truthy values (including inherited keys)\n * - Unwraps boxed primitives (`new String()`, etc.)\n * - Resolves Tailwind utility conflicts deterministically\n * - Keeps the last conflicting class based on input order\n * - Produces a clean, space-normalized class string\n *\n * This utility is a drop-in replacement for `clsx` or `classnames`\n * with built-in Tailwind conflict resolution.\n *\n * @param values - A list of mixed class values including strings,\n * numbers, arrays, objects, and conditional expressions.\n *\n * @returns A merged and normalized CSS class string.\n *\n * @example\n * ```ts\n * cn(\n * \"p-2\",\n * isActive && \"bg-blue-500\",\n * [\"text-sm\", { \"font-bold\": isBold }],\n * null,\n * 0\n * );\n * // => \"p-2 bg-blue-500 text-sm font-bold\"\n * ```\n *\n * @example\n * ```ts\n * cn(\"p-2 p-4\", { \"text-sm\": true, \"text-lg\": true });\n * // => \"p-4 text-lg\"\n * ```\n */\nexport const cnVer3 = (...values: ClassValues): string =>\n twMergeV3(cx(...values));\n\n/** -------------------------------------------------------------------\n * * ***Combines and merges class utility values into a single normalized\n * string with `Tailwind CSS v4` conflict resolution.***\n * --------------------------------------------------------------------\n *\n * This utility composes {@link cx | `cx`} and {@link twMergeV4 | `twMerge`} version **3** for ***`tailwind version 4`***:\n *\n * - `cx` handles flexible class inputs (like `clsx`)\n * - `twMerge` resolves Tailwind CSS utility conflicts\n *\n * This provides a complete solution for conditional class composition\n * with deterministic Tailwind merging.\n *\n * - **Behavior:**\n * - Accepts strings, numbers, arrays, and objects\n * - Supports deeply nested class structures\n * - Ignores falsy values (`false`, `null`, `undefined`, `\"\"`, `0`)\n * - Includes object keys with truthy values (including inherited keys)\n * - Unwraps boxed primitives (`new String()`, etc.)\n * - Resolves Tailwind utility conflicts deterministically\n * - Keeps the last conflicting class based on input order\n * - Produces a clean, space-normalized class string\n *\n * This utility is a drop-in replacement for `clsx` or `classnames`\n * with built-in Tailwind conflict resolution.\n *\n * @param values - A list of mixed class values including strings,\n * numbers, arrays, objects, and conditional expressions.\n *\n * @returns A merged and normalized CSS class string.\n *\n * @example\n * ```ts\n * cn(\n * \"p-2\",\n * isActive && \"bg-blue-500\",\n * [\"text-sm\", { \"font-bold\": isBold }],\n * null,\n * 0\n * );\n * // => \"p-2 bg-blue-500 text-sm font-bold\"\n * ```\n *\n * @example\n * ```ts\n * cn(\"p-2 p-4\", { \"text-sm\": true, \"text-lg\": true });\n * // => \"p-4 text-lg\"\n * ```\n */\nexport const cnVer4 = (...values: ClassValues): string =>\n twMergeV4(cx(...values));\n\nconst defaultTwMergeV3 = twMergeDefaultV3();\nconst defaultTwMergeV4 = twMergeDefaultV4();\n\n/** -------------------------------------------------------------\n * * ***Default `cnV3` utility (Tailwind v3).***\n * -------------------------------------------------------------\n *\n * **Combines class-name values and then deduplicates/resolves\n * conflicts using {@link twMergeDefaultV3 | `twMergeDefaultV3`}\n * with **Tailwind v3 default config only**.**\n * - ✅ **Use this when:**\n * - Your project uses **Tailwind v3**.\n * - You need a simple `cn` that works out of the box without a custom config.\n * - ⚡ **Need custom rules?**\n * - Create a project-wide helper using\n * {@link twMergeDefaultV3 | `twMergeDefaultV3`} +\n * {@link customCnV3 | `customCnV3`} (see Example 2).\n *\n * @deprecated ***Still supported, but significantly slower during hydration because it uses extended runtime merge logic, prefer {@link cnVer3 | `cnVer3`} for\n * better performance, this utility may be removed in a future release.***\n *\n * @param {ClassValues} classes - Class values (`string`, `array`, `object`, `etc`).\n * @returns {string} Merged Tailwind class string.\n *\n * @example\n * #### Example 1: ✅ Default usage (Tailwind v3).\n * ```ts\n * cnV3(\"p-2\", \"p-4\");\n * // ➔ \"p-4\"\n *\n * cnV3(\"text-red-500\", { \"text-blue-500\": true });\n * // ➔ \"text-blue-500\"\n *\n * cnV3([\"m-2\", [\"m-4\"]], \"m-8\");\n * // ➔ \"m-8\"\n * ```\n * #### Example 2: ⚡ Custom project-wide usage with Tailwind config.\n * ```ts\n * import tailwindConfig from \"../tailwind.config\";\n * import { twMergeDefaultV3, customCnV3, type ClassValues } from \"@rzl-zone/utils-js/tailwind\";\n *\n * const cnApp = (...classes: ClassValues) => {\n * return customCnV3(\n * twMergeDefaultV3({\n * config: tailwindConfig,\n * extend: {\n * classGroups: {\n * \"text-shadow\": [\n * \"text-shadow\",\n * \"text-shadow-sm\",\n * \"text-shadow-md\",\n * ],\n * },\n * },\n * }),\n * // ...other options classes,\n * );\n * };\n *\n * cnApp(\"p-2 p-4\"); // ➔ \"p-4\"\n * cnApp(\"shadow-sm shadow-md\"); // ➔ \"shadow-md\"\n * cnApp(\"text-base text-xxs\"); // ➔ \"text-xxs\" (resolved from config)\n * ```\n */\nexport const cnV3 = (...classes: ClassValues): string => {\n return defaultTwMergeV3(cx(...classes));\n};\n\n/** -------------------------------------------------------------\n * * ***Default `cnV4` utility (Tailwind v4).***\n * -------------------------------------------------------------\n *\n * **Combines class-name values and then deduplicates/resolves\n * conflicts using {@link twMergeDefaultV4 | `twMergeDefaultV4`}\n * with **Tailwind v4 default config only**.**\n * - ✅ **Use this when:**\n * - Your project uses **Tailwind v4**.\n * - You need a simple `cn` that works out of the box without a custom config.\n * - ⚡ **Need custom rules?**\n * - Create a project-wide helper using\n * {@link twMergeDefaultV4 | `twMergeDefaultV4`} +\n * {@link customCnV4 | `customCnV4`} (see Example 2).\n *\n * @deprecated ***Still supported, but significantly slower during hydration because it uses extended runtime merge logic, prefer {@link cnVer4 | `cnVer4`} for\n * better performance, this utility may be removed in a future release.***\n *\n * @param {ClassValues} classes - Class values (`string`, `array`, `object`, `etc`).\n * @returns {string} Merged Tailwind class string.\n * @example\n * #### Example 1: ✅ Default usage (Tailwind v4).\n * ```ts\n * cnV4(\"p-2\", \"p-4\");\n * // ➔ \"p-4\"\n *\n * cnV4(\"text-red-500\", { \"text-blue-500\": true });\n * // ➔ \"text-blue-500\"\n *\n * cnV4([\"m-2\", [\"m-4\"]], \"m-8\");\n * // ➔ \"m-8\"\n * ```\n * #### Example 2: ⚡ Custom project-wide usage with Tailwind config.\n * ```ts\n * import tailwindConfig from \"../tailwind.config\";\n * import { twMergeDefaultV4, customCnV4, type ClassValues } from \"@rzl-zone/utils-js/tailwind\";\n *\n * const cnApp = (...classes: ClassValues) => {\n * return customCnV4(\n * twMergeDefaultV4({\n * config: tailwindConfig,\n * extend: {\n * classGroups: {\n * \"text-shadow\": [\n * \"text-shadow\",\n * \"text-shadow-sm\",\n * \"text-shadow-md\",\n * ],\n * },\n * },\n * }),\n * // ...other options classes,\n * );\n * };\n *\n * cnApp(\"p-2 p-4\"); // ➔ \"p-4\"\n * cnApp(\"shadow-sm shadow-md\"); // ➔ \"shadow-md\"\n * cnApp(\"text-base text-xxs\"); // ➔ \"text-xxs\" (resolved from config)\n * ```\n */\nexport const cnV4 = (...classes: ClassValues): string => {\n return defaultTwMergeV4(cx(...classes));\n};\n","import type { Stringify } from \"@rzl-zone/ts-types-plus\";\n\nimport { isString } from \"@/predicates/is/isString\";\nimport { isEmptyString } from \"@/predicates/is/isEmptyString\";\nimport { getPreciseType } from \"@/predicates/type/getPreciseType\";\nimport { isNonEmptyArray } from \"@/predicates/is/isNonEmptyArray\";\nimport { assertIsArray } from \"@/assertions/objects/assertIsArray\";\n\n/** ----------------------------------------------------------\n * * ***Utility: `shouldForwardProp`.***\n * ----------------------------------------------------------\n * **Creates a helper for styled-components `shouldForwardProp`.**\n *\n * @description\n * 1. Returns a **predicate function** that determines whether a given prop\n * should be forwarded to the DOM.\n * 2. Useful for filtering out internal props (e.g., `$size`, `$active`)\n * so they don't become invalid HTML attributes.\n *\n * - **Behavior:**\n * - Accepts a strict tuple of **string keys** to exclude from forwarding.\n * - Every key is validated as a **non-empty string** at runtime.\n * - Throws a `TypeError` if:\n * - `props` is not an array, or\n * - any item is not a non-empty string.\n * - Automatically coerces the tested prop name to string for matching.\n *\n * @template CustomProps\n * The component props type to validate against.\n *\n * @param {readonly Stringify<keyof CustomProps>[]}\n * props\n * The list of prop names (keys of `CustomProps`) to exclude from forwarding.\n *\n * @returns {(propName: keyof CustomProps | ({} & string)) => boolean}\n * A function that receives a prop name and returns:\n * - `true` ➔ the prop **will** be forwarded to the DOM.\n * - `false` ➔ the prop **will not** be forwarded.\n *\n * @throws **{@link TypeError | `TypeError`}**\n * when:\n * - `props` is not an array, or\n * - any item is not a non-empty string.\n *\n * @example\n * // Basic usage\n * type Props = { $size: string; color: string; visible: boolean };\n * const filter = shouldForwardProp<Props>([\"$size\"]);\n *\n * filter(\"$size\"); // ➔ false (blocked).\n * filter(\"color\"); // ➔ true (forwarded).\n * filter(\"visible\"); // ➔ true (forwarded).\n *\n * @example\n * // With styled-components\n * type CustomProps = { $internal: boolean; public: string; another: boolean };\n *\n * styled.div.withConfig({\n * shouldForwardProp: shouldForwardProp<CustomProps>([\"$internal\"])\n * });\n */\nexport const shouldForwardProp = <CustomProps extends Record<string, unknown>>(\n props: readonly Stringify<keyof CustomProps>[]\n // props: Partial<UnionToTupleStrict<keyof CustomProps>>\n): ((propName: keyof CustomProps | ({} & string)) => boolean) => {\n assertIsArray(props, {\n message: ({ currentType, validType }) =>\n `First parameter (\\`props\\`) must be of type \\`${validType}\\`, but received: \\`${currentType}\\`.`\n });\n\n const invalidItems: { index: number; reason: string }[] = [];\n\n props.forEach((p, idx) => {\n if (!isString(p)) {\n invalidItems.push({\n index: idx,\n reason: `Expected a non-empty string, but received ${getPreciseType(p, {\n formatCase: \"toPascalCaseSpace\"\n })}.`\n });\n } else if (isEmptyString(p)) {\n invalidItems.push({\n index: idx,\n reason: \"Expected a non-empty string, but received EmptyString.\"\n });\n }\n });\n\n if (isNonEmptyArray(invalidItems)) {\n const maxWidth = Math.max(\n ...invalidItems.map((item) => String(item.index).length)\n );\n\n const details = invalidItems\n .map(\n (item) =>\n `• [Index ${String(item.index).padStart(maxWidth, \"0\")}] ${item.reason}`\n )\n .join(\"\\n\");\n\n throw new TypeError(\n `First parameter (\\`props\\`) contains invalid entries:\\n${details}`\n );\n }\n\n return (propName): boolean => {\n return !props.map(String).includes(String(propName));\n };\n};\n"],"mappings":"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"}
@@ -2,16 +2,16 @@
2
2
  * ========================================================================
3
3
  * @rzl-zone/utils-js
4
4
  * ------------------------------------------------------------------------
5
- * Version: `3.12.1-beta.0`
5
+ * Version: `3.13.0-beta.2`
6
6
  * Author: `Rizalvin Dwiky <rizalvindwiky@gmail.com>`
7
7
  * Repository: `https://github.com/rzl-zone/rzl-zone/tree/main/packages/utils-js`
8
8
  * ========================================================================
9
9
  */
10
10
  "use strict";
11
- const require_assertIsBoolean = require('./assertIsBoolean-DozdtbNi.cjs');
12
- const require_isBigInt = require('./isBigInt-B1cijjqm.cjs');
13
- const require_isEmptyObject = require('./isEmptyObject-DI42NEo0.cjs');
14
- const require_isFinite = require('./isFinite-sFkps2TY.cjs');
11
+ const require_assertIsBoolean = require('./assertIsBoolean-amRiJHnh.cjs');
12
+ const require_isBigInt = require('./isBigInt-CIFRnsdx.cjs');
13
+ const require_isEmptyObject = require('./isEmptyObject-CEySmyHK.cjs');
14
+ const require_isFinite = require('./isFinite-uukWvxJh.cjs');
15
15
  function filterNilArray(input) {
16
16
  if (require_assertIsBoolean.isNil(input)) return void 0;
17
17
  if (!require_assertIsBoolean.isArray(input)) return [];
@@ -48,4 +48,4 @@ Object.defineProperty(exports, 'toStringArrayUnRecursive', {
48
48
  return toStringArrayUnRecursive;
49
49
  }
50
50
  });
51
- //# sourceMappingURL=toStringArrayUnRecursive-xUaU8Ot9.cjs.map
51
+ //# sourceMappingURL=toStringArrayUnRecursive-D1mPM4wg.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"toStringArrayUnRecursive-xUaU8Ot9.cjs","names":["isNil","isArray","isEmptyArray","hasOwnProp","isArray","isString","isFinite","isBoolean","isBigInt","isNull"],"sources":["../src/conversions/arrays/transforms/filterNilArray.ts","../src/conversions/arrays/casts/toStringArrayUnRecursive.ts"],"sourcesContent":["import type {\n FilterNilArray,\n FilterNilArrayFromTuple,\n PreserveMutability\n} from \"./_private/filterNilArray.types\";\n\nimport { isNil } from \"@/predicates/is/isNil\";\nimport { isArray } from \"@/predicates/is/isArray\";\nimport { isEmptyArray } from \"@/predicates/is/isEmptyArray\";\n\n/** ----------------------------------------------------------\n * * ***Utility: `filterNilArray`.***\n * ---------------------------------------------\n * **Removes `null` and `undefined` values from an array, including nested arrays.**\n * - **Behavior:**\n * - Returns `undefined` if the input is explicitly `undefined` or `null`.\n * - Returns `[]` if input is empty or all elements are removed after filtering.\n * - Recursively filters nested arrays while preserving structure.\n * - Ensures proper type inference for safer downstream operations.\n * @template A - The type of elements in the array.\n * @param {T[]|null|undefined} input - The array to be filtered.\n * @returns {T[] | undefined} A new array with `null` and `undefined` values removed,\n * or `undefined` if the input is explicitly `undefined` or `null`.\n * @example\n * ```ts\n * filterNilArray([1, null, 2, undefined, 3]);\n * // ➔ [1, 2, 3]\n * filterNilArray([null, undefined]);\n * // ➔ []\n * filterNilArray(undefined);\n * // ➔ undefined\n * filterNilArray(null);\n * // ➔ undefined\n * filterNilArray([]); // or\n * filterNilArray([[[]]]); // or\n * filterNilArray([[[],undefined,null]]);\n * // ➔ []\n * filterNilArray([1, [null, 2, [undefined, 3]]]);\n * // ➔ [1, [2, [3]]]\n * ```\n */\nexport function filterNilArray(input: null | undefined): undefined;\nexport function filterNilArray<A extends readonly unknown[]>(\n input: A\n): PreserveMutability<A, FilterNilArrayFromTuple<A>>;\nexport function filterNilArray<A extends readonly unknown[]>(\n input: A | null | undefined\n): PreserveMutability<A, FilterNilArrayFromTuple<A>> | undefined;\nexport function filterNilArray<A>(\n input: (A | null | undefined)[] | null | undefined\n): FilterNilArray<A> | undefined;\nexport function filterNilArray(\n input: readonly unknown[] | null | undefined\n): unknown[] | undefined;\nexport function filterNilArray(input: unknown[]): unknown[];\nexport function filterNilArray(input: unknown): unknown {\n if (isNil(input)) return undefined;\n if (!isArray(input)) return [];\n\n const filtered = input.reduce<unknown[]>((output, element) => {\n if (!isNil(element)) {\n if (isArray(element)) {\n const cleanedNested = filterNilArray(element);\n if (cleanedNested && !isEmptyArray(cleanedNested)) {\n output.push(cleanedNested);\n }\n } else {\n output.push(element);\n }\n }\n return output;\n }, []);\n\n return filtered;\n}\n","import type {\n ToStringArrayUnRecursiveOptions,\n ToStringArrayUnRecursiveReturn\n} from \"./toStringArrayUnRecursive.types\";\n\nimport { isNull } from \"@/predicates/is/isNull\";\nimport { isArray } from \"@/predicates/is/isArray\";\nimport { isString } from \"@/predicates/is/isString\";\nimport { isFinite } from \"@/predicates/is/isFinite\";\nimport { isBigInt } from \"@/predicates/is/isBigInt\";\nimport { isBoolean } from \"@/predicates/is/isBoolean\";\nimport { hasOwnProp } from \"@/predicates/has/hasOwnProp\";\nimport { assertIsBoolean } from \"@/assertions/booleans/assertIsBoolean\";\nimport { assertIsPlainObject } from \"@/assertions/objects/assertIsPlainObject\";\n\nimport { filterNilArray } from \"../transforms/filterNilArray\";\n\n/** ---------------------------------------------\n * * ***Utility: `toStringArrayUnRecursive`.***\n * ---------------------------------------------\n * **Converts all values in a flat array into string representations.**\n * - **Behavior:**\n * - Only processes **flat arrays** (non-recursive).\n * - Supports input values: `string`, `number`, `bigint`, `boolean`,\n * `null`, `undefined`.\n * - Invalid values (`null` and `undefined`) can be **removed** or **kept**\n * depending on the option.\n * - Other unsupported types will be converted to `undefined` (and removed\n * if `removeInvalidValue=true`).\n * - **ℹ️ Note:**\n * - _For recursive / nested arrays, use ***`toStringDeep` utility function*** instead._\n * @template T - Element type of the input array.\n * @template R - Whether invalid values should be removed (`true`) or kept (`false`).\n * @param {Array<string | number | bigint | boolean | null | undefined> | null | undefined} [array] - The array to convert, returns `undefined` if not an array.\n * @param {ToStringArrayUnRecursiveOptions<RemoveInvalidValue>} [options] - Options to control transformation behavior, defaults to `{ removeInvalidValue: true }`.\n * @param {RemoveInvalidValue extends true ? boolean : boolean} [options.removeInvalidValue=true] Whether to remove invalid values (`null`, `undefined`, or unsupported types), default: `true`.\n * @returns {RemoveInvalidValue extends true ? string[] : (string | null | undefined)[]} A new array of string representations, with invalid values optionally removed.\n * @example\n * ```ts\n * // Convert numbers and strings\n * toStringArrayUnRecursive([1, 2, '3']);\n * // ➔ ['1', '2', '3']\n * // Remove null and undefined\n * toStringArrayUnRecursive([1, null, undefined, 'abc'], {\n * removeInvalidValue: true\n * });\n * // ➔ ['1', 'abc']\n * // Keep null and undefined\n * toStringArrayUnRecursive([1, null, undefined, 'abc'], {\n * removeInvalidValue: false\n * });\n * // ➔ ['1', null, undefined, 'abc']\n * // Convert boolean and bigint\n * toStringArrayUnRecursive([true, false, 10n]);\n * // ➔ ['true', 'false', '10']\n * // Not an array ➔ returns undefined\n * toStringArrayUnRecursive(null);\n * // ➔ undefined\n * toStringArrayUnRecursive(undefined);\n * // ➔ undefined\n * toStringArrayUnRecursive(1);\n * // ➔ undefined\n * toStringArrayUnRecursive(\"string\");\n * // ➔ undefined\n * ```\n */\nexport function toStringArrayUnRecursive(\n array?: undefined | null,\n options?: ToStringArrayUnRecursiveOptions<boolean>\n): undefined;\nexport function toStringArrayUnRecursive(\n array?: Array<never>,\n options?: ToStringArrayUnRecursiveOptions<boolean>\n): [];\nexport function toStringArrayUnRecursive<T, R extends boolean = true>(\n array?: Array<T> | readonly T[] | null,\n options?: ToStringArrayUnRecursiveOptions<R>\n): ToStringArrayUnRecursiveReturn<T, R>;\nexport function toStringArrayUnRecursive<T = unknown>(\n array?: T,\n options?: ToStringArrayUnRecursiveOptions<boolean>\n): undefined;\nexport function toStringArrayUnRecursive<T>(\n array?: Array<T> | readonly T[] | null,\n options: ToStringArrayUnRecursiveOptions<boolean> = {}\n) {\n assertIsPlainObject(options, {\n message: ({ currentType, validType }) =>\n `Second parameter (\\`options\\`) must be of type \\`${validType}\\`, but received: \\`${currentType}\\`.`\n });\n\n const riv = hasOwnProp(options, \"removeInvalidValue\")\n ? options.removeInvalidValue\n : true;\n\n assertIsBoolean(riv, {\n message: ({ currentType, validType }) =>\n `Parameter \\`removeInvalidValue\\` property of the \\`options\\` (second parameter) must be of type \\`${validType}\\`, but received: \\`${currentType}\\`.`\n });\n\n if (isArray(array)) {\n // Convert each item in the array to a string, or null/undefined if it's not a valid value.\n const result = Array.from(array, (x) => {\n // Convert finite number, boolean, bigInt or string to string\n if (isString(x) || isFinite(x) || isBoolean(x) || isBigInt(x))\n return String(x);\n\n // Handle null or undefined values\n return isNull(x) ? null : undefined;\n });\n\n // Remove invalid values (null, undefined) if specified in options\n if (riv) return filterNilArray(result);\n\n return result;\n }\n\n // Return undefined if no array is provided\n return undefined;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAuDA,SAAgB,eAAe,OAAyB;CACtD,IAAIA,8BAAM,MAAM,EAAE,OAAO;CACzB,IAAI,CAACC,gCAAQ,MAAM,EAAE,OAAO,EAAE;CAgB9B,OAdiB,MAAM,QAAmB,QAAQ,YAAY;EAC5D,IAAI,CAACD,8BAAM,QAAQ,EACjB,IAAIC,gCAAQ,QAAQ,EAAE;GACpB,MAAM,gBAAgB,eAAe,QAAQ;GAC7C,IAAI,iBAAiB,CAACC,mCAAa,cAAc,EAC/C,OAAO,KAAK,cAAc;SAG5B,OAAO,KAAK,QAAQ;EAGxB,OAAO;IACN,EAAE,CAEU;;;;;ACSjB,SAAgB,yBACd,OACA,UAAoD,EAAE,EACtD;CACA,4CAAoB,SAAS,EAC3B,UAAU,EAAE,aAAa,gBACvB,oDAAoD,UAAU,sBAAsB,YAAY,MACnG,CAAC;CAEF,MAAM,MAAMC,mCAAW,SAAS,qBAAqB,GACjD,QAAQ,qBACR;CAEJ,wCAAgB,KAAK,EACnB,UAAU,EAAE,aAAa,gBACvB,qGAAqG,UAAU,sBAAsB,YAAY,MACpJ,CAAC;CAEF,IAAIC,gCAAQ,MAAM,EAAE;EAElB,MAAM,SAAS,MAAM,KAAK,QAAQ,MAAM;GAEtC,IAAIC,iCAAS,EAAE,IAAIC,0BAAS,EAAE,IAAIC,kCAAU,EAAE,IAAIC,0BAAS,EAAE,EAC3D,OAAO,OAAO,EAAE;GAGlB,OAAOC,+BAAO,EAAE,GAAG,OAAO;IAC1B;EAGF,IAAI,KAAK,OAAO,eAAe,OAAO;EAEtC,OAAO"}
1
+ {"version":3,"file":"toStringArrayUnRecursive-D1mPM4wg.cjs","names":["isNil","isArray","isEmptyArray","hasOwnProp","isArray","isString","isFinite","isBoolean","isBigInt","isNull"],"sources":["../src/conversions/arrays/transforms/filterNilArray.ts","../src/conversions/arrays/casts/toStringArrayUnRecursive.ts"],"sourcesContent":["import type {\n FilterNilArray,\n FilterNilArrayFromTuple,\n PreserveMutability\n} from \"./_private/filterNilArray.types\";\n\nimport { isNil } from \"@/predicates/is/isNil\";\nimport { isArray } from \"@/predicates/is/isArray\";\nimport { isEmptyArray } from \"@/predicates/is/isEmptyArray\";\n\n/** ----------------------------------------------------------\n * * ***Utility: `filterNilArray`.***\n * ---------------------------------------------\n * **Removes `null` and `undefined` values from an array, including nested arrays.**\n * - **Behavior:**\n * - Returns `undefined` if the input is explicitly `undefined` or `null`.\n * - Returns `[]` if input is empty or all elements are removed after filtering.\n * - Recursively filters nested arrays while preserving structure.\n * - Ensures proper type inference for safer downstream operations.\n * @template A - The type of elements in the array.\n * @param {T[]|null|undefined} input - The array to be filtered.\n * @returns {T[] | undefined} A new array with `null` and `undefined` values removed,\n * or `undefined` if the input is explicitly `undefined` or `null`.\n * @example\n * ```ts\n * filterNilArray([1, null, 2, undefined, 3]);\n * // ➔ [1, 2, 3]\n * filterNilArray([null, undefined]);\n * // ➔ []\n * filterNilArray(undefined);\n * // ➔ undefined\n * filterNilArray(null);\n * // ➔ undefined\n * filterNilArray([]); // or\n * filterNilArray([[[]]]); // or\n * filterNilArray([[[],undefined,null]]);\n * // ➔ []\n * filterNilArray([1, [null, 2, [undefined, 3]]]);\n * // ➔ [1, [2, [3]]]\n * ```\n */\nexport function filterNilArray(input: null | undefined): undefined;\nexport function filterNilArray<A extends readonly unknown[]>(\n input: A\n): PreserveMutability<A, FilterNilArrayFromTuple<A>>;\nexport function filterNilArray<A extends readonly unknown[]>(\n input: A | null | undefined\n): PreserveMutability<A, FilterNilArrayFromTuple<A>> | undefined;\nexport function filterNilArray<A>(\n input: (A | null | undefined)[] | null | undefined\n): FilterNilArray<A> | undefined;\nexport function filterNilArray(\n input: readonly unknown[] | null | undefined\n): unknown[] | undefined;\nexport function filterNilArray(input: unknown[]): unknown[];\nexport function filterNilArray(input: unknown): unknown {\n if (isNil(input)) return undefined;\n if (!isArray(input)) return [];\n\n const filtered = input.reduce<unknown[]>((output, element) => {\n if (!isNil(element)) {\n if (isArray(element)) {\n const cleanedNested = filterNilArray(element);\n if (cleanedNested && !isEmptyArray(cleanedNested)) {\n output.push(cleanedNested);\n }\n } else {\n output.push(element);\n }\n }\n return output;\n }, []);\n\n return filtered;\n}\n","import type {\n ToStringArrayUnRecursiveOptions,\n ToStringArrayUnRecursiveReturn\n} from \"./toStringArrayUnRecursive.types\";\n\nimport { isNull } from \"@/predicates/is/isNull\";\nimport { isArray } from \"@/predicates/is/isArray\";\nimport { isString } from \"@/predicates/is/isString\";\nimport { isFinite } from \"@/predicates/is/isFinite\";\nimport { isBigInt } from \"@/predicates/is/isBigInt\";\nimport { isBoolean } from \"@/predicates/is/isBoolean\";\nimport { hasOwnProp } from \"@/predicates/has/hasOwnProp\";\nimport { assertIsBoolean } from \"@/assertions/booleans/assertIsBoolean\";\nimport { assertIsPlainObject } from \"@/assertions/objects/assertIsPlainObject\";\n\nimport { filterNilArray } from \"../transforms/filterNilArray\";\n\n/** ---------------------------------------------\n * * ***Utility: `toStringArrayUnRecursive`.***\n * ---------------------------------------------\n * **Converts all values in a flat array into string representations.**\n * - **Behavior:**\n * - Only processes **flat arrays** (non-recursive).\n * - Supports input values: `string`, `number`, `bigint`, `boolean`,\n * `null`, `undefined`.\n * - Invalid values (`null` and `undefined`) can be **removed** or **kept**\n * depending on the option.\n * - Other unsupported types will be converted to `undefined` (and removed\n * if `removeInvalidValue=true`).\n * - **ℹ️ Note:**\n * - _For recursive / nested arrays, use ***`toStringDeep` utility function*** instead._\n * @template T - Element type of the input array.\n * @template R - Whether invalid values should be removed (`true`) or kept (`false`).\n * @param {Array<string | number | bigint | boolean | null | undefined> | null | undefined} [array] - The array to convert, returns `undefined` if not an array.\n * @param {ToStringArrayUnRecursiveOptions<RemoveInvalidValue>} [options] - Options to control transformation behavior, defaults to `{ removeInvalidValue: true }`.\n * @param {RemoveInvalidValue extends true ? boolean : boolean} [options.removeInvalidValue=true] Whether to remove invalid values (`null`, `undefined`, or unsupported types), default: `true`.\n * @returns {RemoveInvalidValue extends true ? string[] : (string | null | undefined)[]} A new array of string representations, with invalid values optionally removed.\n * @example\n * ```ts\n * // Convert numbers and strings\n * toStringArrayUnRecursive([1, 2, '3']);\n * // ➔ ['1', '2', '3']\n * // Remove null and undefined\n * toStringArrayUnRecursive([1, null, undefined, 'abc'], {\n * removeInvalidValue: true\n * });\n * // ➔ ['1', 'abc']\n * // Keep null and undefined\n * toStringArrayUnRecursive([1, null, undefined, 'abc'], {\n * removeInvalidValue: false\n * });\n * // ➔ ['1', null, undefined, 'abc']\n * // Convert boolean and bigint\n * toStringArrayUnRecursive([true, false, 10n]);\n * // ➔ ['true', 'false', '10']\n * // Not an array ➔ returns undefined\n * toStringArrayUnRecursive(null);\n * // ➔ undefined\n * toStringArrayUnRecursive(undefined);\n * // ➔ undefined\n * toStringArrayUnRecursive(1);\n * // ➔ undefined\n * toStringArrayUnRecursive(\"string\");\n * // ➔ undefined\n * ```\n */\nexport function toStringArrayUnRecursive(\n array?: undefined | null,\n options?: ToStringArrayUnRecursiveOptions<boolean>\n): undefined;\nexport function toStringArrayUnRecursive(\n array?: Array<never>,\n options?: ToStringArrayUnRecursiveOptions<boolean>\n): [];\nexport function toStringArrayUnRecursive<T, R extends boolean = true>(\n array?: Array<T> | readonly T[] | null,\n options?: ToStringArrayUnRecursiveOptions<R>\n): ToStringArrayUnRecursiveReturn<T, R>;\nexport function toStringArrayUnRecursive<T = unknown>(\n array?: T,\n options?: ToStringArrayUnRecursiveOptions<boolean>\n): undefined;\nexport function toStringArrayUnRecursive<T>(\n array?: Array<T> | readonly T[] | null,\n options: ToStringArrayUnRecursiveOptions<boolean> = {}\n) {\n assertIsPlainObject(options, {\n message: ({ currentType, validType }) =>\n `Second parameter (\\`options\\`) must be of type \\`${validType}\\`, but received: \\`${currentType}\\`.`\n });\n\n const riv = hasOwnProp(options, \"removeInvalidValue\")\n ? options.removeInvalidValue\n : true;\n\n assertIsBoolean(riv, {\n message: ({ currentType, validType }) =>\n `Parameter \\`removeInvalidValue\\` property of the \\`options\\` (second parameter) must be of type \\`${validType}\\`, but received: \\`${currentType}\\`.`\n });\n\n if (isArray(array)) {\n // Convert each item in the array to a string, or null/undefined if it's not a valid value.\n const result = Array.from(array, (x) => {\n // Convert finite number, boolean, bigInt or string to string\n if (isString(x) || isFinite(x) || isBoolean(x) || isBigInt(x))\n return String(x);\n\n // Handle null or undefined values\n return isNull(x) ? null : undefined;\n });\n\n // Remove invalid values (null, undefined) if specified in options\n if (riv) return filterNilArray(result);\n\n return result;\n }\n\n // Return undefined if no array is provided\n return undefined;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAuDA,SAAgB,eAAe,OAAyB;CACtD,IAAIA,8BAAM,MAAM,EAAE,OAAO;CACzB,IAAI,CAACC,gCAAQ,MAAM,EAAE,OAAO,EAAE;CAgB9B,OAdiB,MAAM,QAAmB,QAAQ,YAAY;EAC5D,IAAI,CAACD,8BAAM,QAAQ,EACjB,IAAIC,gCAAQ,QAAQ,EAAE;GACpB,MAAM,gBAAgB,eAAe,QAAQ;GAC7C,IAAI,iBAAiB,CAACC,mCAAa,cAAc,EAC/C,OAAO,KAAK,cAAc;SAG5B,OAAO,KAAK,QAAQ;EAGxB,OAAO;IACN,EAAE,CAEU;;;;;ACSjB,SAAgB,yBACd,OACA,UAAoD,EAAE,EACtD;CACA,4CAAoB,SAAS,EAC3B,UAAU,EAAE,aAAa,gBACvB,oDAAoD,UAAU,sBAAsB,YAAY,MACnG,CAAC;CAEF,MAAM,MAAMC,mCAAW,SAAS,qBAAqB,GACjD,QAAQ,qBACR;CAEJ,wCAAgB,KAAK,EACnB,UAAU,EAAE,aAAa,gBACvB,qGAAqG,UAAU,sBAAsB,YAAY,MACpJ,CAAC;CAEF,IAAIC,gCAAQ,MAAM,EAAE;EAElB,MAAM,SAAS,MAAM,KAAK,QAAQ,MAAM;GAEtC,IAAIC,iCAAS,EAAE,IAAIC,0BAAS,EAAE,IAAIC,kCAAU,EAAE,IAAIC,0BAAS,EAAE,EAC3D,OAAO,OAAO,EAAE;GAGlB,OAAOC,+BAAO,EAAE,GAAG,OAAO;IAC1B;EAGF,IAAI,KAAK,OAAO,eAAe,OAAO;EAEtC,OAAO"}
@@ -2,15 +2,15 @@
2
2
  * ========================================================================
3
3
  * @rzl-zone/utils-js
4
4
  * ------------------------------------------------------------------------
5
- * Version: `3.12.1-beta.0`
5
+ * Version: `3.13.0-beta.2`
6
6
  * Author: `Rizalvin Dwiky <rizalvindwiky@gmail.com>`
7
7
  * Repository: `https://github.com/rzl-zone/rzl-zone/tree/main/packages/utils-js`
8
8
  * ========================================================================
9
9
  */
10
- import { E as isNull, F as isBoolean, M as isArray, N as isNil, T as assertIsPlainObject, b as hasOwnProp, k as isString, t as assertIsBoolean } from "./assertIsBoolean-BlBct0Fc.js";
11
- import { t as isBigInt } from "./isBigInt-C0bN0Rhu.js";
12
- import { n as isEmptyArray } from "./isEmptyObject-DeLVIJpl.js";
13
- import { t as isFinite } from "./isFinite-BYMOo0os.js";
10
+ import { E as isNull, F as isBoolean, M as isArray, N as isNil, T as assertIsPlainObject, b as hasOwnProp, k as isString, t as assertIsBoolean } from "./assertIsBoolean-Bv6gL-xe.js";
11
+ import { t as isBigInt } from "./isBigInt-D-Pu9sxp.js";
12
+ import { n as isEmptyArray } from "./isEmptyObject-CZ9DLi7R.js";
13
+ import { t as isFinite } from "./isFinite-Cz_IFXuV.js";
14
14
  function filterNilArray(input) {
15
15
  if (isNil(input)) return void 0;
16
16
  if (!isArray(input)) return [];
@@ -36,4 +36,4 @@ function toStringArrayUnRecursive(array, options = {}) {
36
36
  }
37
37
  }
38
38
  export { filterNilArray as n, toStringArrayUnRecursive as t };
39
- //# sourceMappingURL=toStringArrayUnRecursive-CFs0jTEg.js.map
39
+ //# sourceMappingURL=toStringArrayUnRecursive-tHp2a7KR.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"toStringArrayUnRecursive-CFs0jTEg.js","names":[],"sources":["../src/conversions/arrays/transforms/filterNilArray.ts","../src/conversions/arrays/casts/toStringArrayUnRecursive.ts"],"sourcesContent":["import type {\n FilterNilArray,\n FilterNilArrayFromTuple,\n PreserveMutability\n} from \"./_private/filterNilArray.types\";\n\nimport { isNil } from \"@/predicates/is/isNil\";\nimport { isArray } from \"@/predicates/is/isArray\";\nimport { isEmptyArray } from \"@/predicates/is/isEmptyArray\";\n\n/** ----------------------------------------------------------\n * * ***Utility: `filterNilArray`.***\n * ---------------------------------------------\n * **Removes `null` and `undefined` values from an array, including nested arrays.**\n * - **Behavior:**\n * - Returns `undefined` if the input is explicitly `undefined` or `null`.\n * - Returns `[]` if input is empty or all elements are removed after filtering.\n * - Recursively filters nested arrays while preserving structure.\n * - Ensures proper type inference for safer downstream operations.\n * @template A - The type of elements in the array.\n * @param {T[]|null|undefined} input - The array to be filtered.\n * @returns {T[] | undefined} A new array with `null` and `undefined` values removed,\n * or `undefined` if the input is explicitly `undefined` or `null`.\n * @example\n * ```ts\n * filterNilArray([1, null, 2, undefined, 3]);\n * // ➔ [1, 2, 3]\n * filterNilArray([null, undefined]);\n * // ➔ []\n * filterNilArray(undefined);\n * // ➔ undefined\n * filterNilArray(null);\n * // ➔ undefined\n * filterNilArray([]); // or\n * filterNilArray([[[]]]); // or\n * filterNilArray([[[],undefined,null]]);\n * // ➔ []\n * filterNilArray([1, [null, 2, [undefined, 3]]]);\n * // ➔ [1, [2, [3]]]\n * ```\n */\nexport function filterNilArray(input: null | undefined): undefined;\nexport function filterNilArray<A extends readonly unknown[]>(\n input: A\n): PreserveMutability<A, FilterNilArrayFromTuple<A>>;\nexport function filterNilArray<A extends readonly unknown[]>(\n input: A | null | undefined\n): PreserveMutability<A, FilterNilArrayFromTuple<A>> | undefined;\nexport function filterNilArray<A>(\n input: (A | null | undefined)[] | null | undefined\n): FilterNilArray<A> | undefined;\nexport function filterNilArray(\n input: readonly unknown[] | null | undefined\n): unknown[] | undefined;\nexport function filterNilArray(input: unknown[]): unknown[];\nexport function filterNilArray(input: unknown): unknown {\n if (isNil(input)) return undefined;\n if (!isArray(input)) return [];\n\n const filtered = input.reduce<unknown[]>((output, element) => {\n if (!isNil(element)) {\n if (isArray(element)) {\n const cleanedNested = filterNilArray(element);\n if (cleanedNested && !isEmptyArray(cleanedNested)) {\n output.push(cleanedNested);\n }\n } else {\n output.push(element);\n }\n }\n return output;\n }, []);\n\n return filtered;\n}\n","import type {\n ToStringArrayUnRecursiveOptions,\n ToStringArrayUnRecursiveReturn\n} from \"./toStringArrayUnRecursive.types\";\n\nimport { isNull } from \"@/predicates/is/isNull\";\nimport { isArray } from \"@/predicates/is/isArray\";\nimport { isString } from \"@/predicates/is/isString\";\nimport { isFinite } from \"@/predicates/is/isFinite\";\nimport { isBigInt } from \"@/predicates/is/isBigInt\";\nimport { isBoolean } from \"@/predicates/is/isBoolean\";\nimport { hasOwnProp } from \"@/predicates/has/hasOwnProp\";\nimport { assertIsBoolean } from \"@/assertions/booleans/assertIsBoolean\";\nimport { assertIsPlainObject } from \"@/assertions/objects/assertIsPlainObject\";\n\nimport { filterNilArray } from \"../transforms/filterNilArray\";\n\n/** ---------------------------------------------\n * * ***Utility: `toStringArrayUnRecursive`.***\n * ---------------------------------------------\n * **Converts all values in a flat array into string representations.**\n * - **Behavior:**\n * - Only processes **flat arrays** (non-recursive).\n * - Supports input values: `string`, `number`, `bigint`, `boolean`,\n * `null`, `undefined`.\n * - Invalid values (`null` and `undefined`) can be **removed** or **kept**\n * depending on the option.\n * - Other unsupported types will be converted to `undefined` (and removed\n * if `removeInvalidValue=true`).\n * - **ℹ️ Note:**\n * - _For recursive / nested arrays, use ***`toStringDeep` utility function*** instead._\n * @template T - Element type of the input array.\n * @template R - Whether invalid values should be removed (`true`) or kept (`false`).\n * @param {Array<string | number | bigint | boolean | null | undefined> | null | undefined} [array] - The array to convert, returns `undefined` if not an array.\n * @param {ToStringArrayUnRecursiveOptions<RemoveInvalidValue>} [options] - Options to control transformation behavior, defaults to `{ removeInvalidValue: true }`.\n * @param {RemoveInvalidValue extends true ? boolean : boolean} [options.removeInvalidValue=true] Whether to remove invalid values (`null`, `undefined`, or unsupported types), default: `true`.\n * @returns {RemoveInvalidValue extends true ? string[] : (string | null | undefined)[]} A new array of string representations, with invalid values optionally removed.\n * @example\n * ```ts\n * // Convert numbers and strings\n * toStringArrayUnRecursive([1, 2, '3']);\n * // ➔ ['1', '2', '3']\n * // Remove null and undefined\n * toStringArrayUnRecursive([1, null, undefined, 'abc'], {\n * removeInvalidValue: true\n * });\n * // ➔ ['1', 'abc']\n * // Keep null and undefined\n * toStringArrayUnRecursive([1, null, undefined, 'abc'], {\n * removeInvalidValue: false\n * });\n * // ➔ ['1', null, undefined, 'abc']\n * // Convert boolean and bigint\n * toStringArrayUnRecursive([true, false, 10n]);\n * // ➔ ['true', 'false', '10']\n * // Not an array ➔ returns undefined\n * toStringArrayUnRecursive(null);\n * // ➔ undefined\n * toStringArrayUnRecursive(undefined);\n * // ➔ undefined\n * toStringArrayUnRecursive(1);\n * // ➔ undefined\n * toStringArrayUnRecursive(\"string\");\n * // ➔ undefined\n * ```\n */\nexport function toStringArrayUnRecursive(\n array?: undefined | null,\n options?: ToStringArrayUnRecursiveOptions<boolean>\n): undefined;\nexport function toStringArrayUnRecursive(\n array?: Array<never>,\n options?: ToStringArrayUnRecursiveOptions<boolean>\n): [];\nexport function toStringArrayUnRecursive<T, R extends boolean = true>(\n array?: Array<T> | readonly T[] | null,\n options?: ToStringArrayUnRecursiveOptions<R>\n): ToStringArrayUnRecursiveReturn<T, R>;\nexport function toStringArrayUnRecursive<T = unknown>(\n array?: T,\n options?: ToStringArrayUnRecursiveOptions<boolean>\n): undefined;\nexport function toStringArrayUnRecursive<T>(\n array?: Array<T> | readonly T[] | null,\n options: ToStringArrayUnRecursiveOptions<boolean> = {}\n) {\n assertIsPlainObject(options, {\n message: ({ currentType, validType }) =>\n `Second parameter (\\`options\\`) must be of type \\`${validType}\\`, but received: \\`${currentType}\\`.`\n });\n\n const riv = hasOwnProp(options, \"removeInvalidValue\")\n ? options.removeInvalidValue\n : true;\n\n assertIsBoolean(riv, {\n message: ({ currentType, validType }) =>\n `Parameter \\`removeInvalidValue\\` property of the \\`options\\` (second parameter) must be of type \\`${validType}\\`, but received: \\`${currentType}\\`.`\n });\n\n if (isArray(array)) {\n // Convert each item in the array to a string, or null/undefined if it's not a valid value.\n const result = Array.from(array, (x) => {\n // Convert finite number, boolean, bigInt or string to string\n if (isString(x) || isFinite(x) || isBoolean(x) || isBigInt(x))\n return String(x);\n\n // Handle null or undefined values\n return isNull(x) ? null : undefined;\n });\n\n // Remove invalid values (null, undefined) if specified in options\n if (riv) return filterNilArray(result);\n\n return result;\n }\n\n // Return undefined if no array is provided\n return undefined;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAuDA,SAAgB,eAAe,OAAyB;CACtD,IAAI,MAAM,MAAM,EAAE,OAAO;CACzB,IAAI,CAAC,QAAQ,MAAM,EAAE,OAAO,EAAE;CAgB9B,OAdiB,MAAM,QAAmB,QAAQ,YAAY;EAC5D,IAAI,CAAC,MAAM,QAAQ,EACjB,IAAI,QAAQ,QAAQ,EAAE;GACpB,MAAM,gBAAgB,eAAe,QAAQ;GAC7C,IAAI,iBAAiB,CAAC,aAAa,cAAc,EAC/C,OAAO,KAAK,cAAc;SAG5B,OAAO,KAAK,QAAQ;EAGxB,OAAO;IACN,EAAE,CAEU;;;;;ACSjB,SAAgB,yBACd,OACA,UAAoD,EAAE,EACtD;CACA,oBAAoB,SAAS,EAC3B,UAAU,EAAE,aAAa,gBACvB,oDAAoD,UAAU,sBAAsB,YAAY,MACnG,CAAC;CAEF,MAAM,MAAM,WAAW,SAAS,qBAAqB,GACjD,QAAQ,qBACR;CAEJ,gBAAgB,KAAK,EACnB,UAAU,EAAE,aAAa,gBACvB,qGAAqG,UAAU,sBAAsB,YAAY,MACpJ,CAAC;CAEF,IAAI,QAAQ,MAAM,EAAE;EAElB,MAAM,SAAS,MAAM,KAAK,QAAQ,MAAM;GAEtC,IAAI,SAAS,EAAE,IAAI,SAAS,EAAE,IAAI,UAAU,EAAE,IAAI,SAAS,EAAE,EAC3D,OAAO,OAAO,EAAE;GAGlB,OAAO,OAAO,EAAE,GAAG,OAAO;IAC1B;EAGF,IAAI,KAAK,OAAO,eAAe,OAAO;EAEtC,OAAO"}
1
+ {"version":3,"file":"toStringArrayUnRecursive-tHp2a7KR.js","names":[],"sources":["../src/conversions/arrays/transforms/filterNilArray.ts","../src/conversions/arrays/casts/toStringArrayUnRecursive.ts"],"sourcesContent":["import type {\n FilterNilArray,\n FilterNilArrayFromTuple,\n PreserveMutability\n} from \"./_private/filterNilArray.types\";\n\nimport { isNil } from \"@/predicates/is/isNil\";\nimport { isArray } from \"@/predicates/is/isArray\";\nimport { isEmptyArray } from \"@/predicates/is/isEmptyArray\";\n\n/** ----------------------------------------------------------\n * * ***Utility: `filterNilArray`.***\n * ---------------------------------------------\n * **Removes `null` and `undefined` values from an array, including nested arrays.**\n * - **Behavior:**\n * - Returns `undefined` if the input is explicitly `undefined` or `null`.\n * - Returns `[]` if input is empty or all elements are removed after filtering.\n * - Recursively filters nested arrays while preserving structure.\n * - Ensures proper type inference for safer downstream operations.\n * @template A - The type of elements in the array.\n * @param {T[]|null|undefined} input - The array to be filtered.\n * @returns {T[] | undefined} A new array with `null` and `undefined` values removed,\n * or `undefined` if the input is explicitly `undefined` or `null`.\n * @example\n * ```ts\n * filterNilArray([1, null, 2, undefined, 3]);\n * // ➔ [1, 2, 3]\n * filterNilArray([null, undefined]);\n * // ➔ []\n * filterNilArray(undefined);\n * // ➔ undefined\n * filterNilArray(null);\n * // ➔ undefined\n * filterNilArray([]); // or\n * filterNilArray([[[]]]); // or\n * filterNilArray([[[],undefined,null]]);\n * // ➔ []\n * filterNilArray([1, [null, 2, [undefined, 3]]]);\n * // ➔ [1, [2, [3]]]\n * ```\n */\nexport function filterNilArray(input: null | undefined): undefined;\nexport function filterNilArray<A extends readonly unknown[]>(\n input: A\n): PreserveMutability<A, FilterNilArrayFromTuple<A>>;\nexport function filterNilArray<A extends readonly unknown[]>(\n input: A | null | undefined\n): PreserveMutability<A, FilterNilArrayFromTuple<A>> | undefined;\nexport function filterNilArray<A>(\n input: (A | null | undefined)[] | null | undefined\n): FilterNilArray<A> | undefined;\nexport function filterNilArray(\n input: readonly unknown[] | null | undefined\n): unknown[] | undefined;\nexport function filterNilArray(input: unknown[]): unknown[];\nexport function filterNilArray(input: unknown): unknown {\n if (isNil(input)) return undefined;\n if (!isArray(input)) return [];\n\n const filtered = input.reduce<unknown[]>((output, element) => {\n if (!isNil(element)) {\n if (isArray(element)) {\n const cleanedNested = filterNilArray(element);\n if (cleanedNested && !isEmptyArray(cleanedNested)) {\n output.push(cleanedNested);\n }\n } else {\n output.push(element);\n }\n }\n return output;\n }, []);\n\n return filtered;\n}\n","import type {\n ToStringArrayUnRecursiveOptions,\n ToStringArrayUnRecursiveReturn\n} from \"./toStringArrayUnRecursive.types\";\n\nimport { isNull } from \"@/predicates/is/isNull\";\nimport { isArray } from \"@/predicates/is/isArray\";\nimport { isString } from \"@/predicates/is/isString\";\nimport { isFinite } from \"@/predicates/is/isFinite\";\nimport { isBigInt } from \"@/predicates/is/isBigInt\";\nimport { isBoolean } from \"@/predicates/is/isBoolean\";\nimport { hasOwnProp } from \"@/predicates/has/hasOwnProp\";\nimport { assertIsBoolean } from \"@/assertions/booleans/assertIsBoolean\";\nimport { assertIsPlainObject } from \"@/assertions/objects/assertIsPlainObject\";\n\nimport { filterNilArray } from \"../transforms/filterNilArray\";\n\n/** ---------------------------------------------\n * * ***Utility: `toStringArrayUnRecursive`.***\n * ---------------------------------------------\n * **Converts all values in a flat array into string representations.**\n * - **Behavior:**\n * - Only processes **flat arrays** (non-recursive).\n * - Supports input values: `string`, `number`, `bigint`, `boolean`,\n * `null`, `undefined`.\n * - Invalid values (`null` and `undefined`) can be **removed** or **kept**\n * depending on the option.\n * - Other unsupported types will be converted to `undefined` (and removed\n * if `removeInvalidValue=true`).\n * - **ℹ️ Note:**\n * - _For recursive / nested arrays, use ***`toStringDeep` utility function*** instead._\n * @template T - Element type of the input array.\n * @template R - Whether invalid values should be removed (`true`) or kept (`false`).\n * @param {Array<string | number | bigint | boolean | null | undefined> | null | undefined} [array] - The array to convert, returns `undefined` if not an array.\n * @param {ToStringArrayUnRecursiveOptions<RemoveInvalidValue>} [options] - Options to control transformation behavior, defaults to `{ removeInvalidValue: true }`.\n * @param {RemoveInvalidValue extends true ? boolean : boolean} [options.removeInvalidValue=true] Whether to remove invalid values (`null`, `undefined`, or unsupported types), default: `true`.\n * @returns {RemoveInvalidValue extends true ? string[] : (string | null | undefined)[]} A new array of string representations, with invalid values optionally removed.\n * @example\n * ```ts\n * // Convert numbers and strings\n * toStringArrayUnRecursive([1, 2, '3']);\n * // ➔ ['1', '2', '3']\n * // Remove null and undefined\n * toStringArrayUnRecursive([1, null, undefined, 'abc'], {\n * removeInvalidValue: true\n * });\n * // ➔ ['1', 'abc']\n * // Keep null and undefined\n * toStringArrayUnRecursive([1, null, undefined, 'abc'], {\n * removeInvalidValue: false\n * });\n * // ➔ ['1', null, undefined, 'abc']\n * // Convert boolean and bigint\n * toStringArrayUnRecursive([true, false, 10n]);\n * // ➔ ['true', 'false', '10']\n * // Not an array ➔ returns undefined\n * toStringArrayUnRecursive(null);\n * // ➔ undefined\n * toStringArrayUnRecursive(undefined);\n * // ➔ undefined\n * toStringArrayUnRecursive(1);\n * // ➔ undefined\n * toStringArrayUnRecursive(\"string\");\n * // ➔ undefined\n * ```\n */\nexport function toStringArrayUnRecursive(\n array?: undefined | null,\n options?: ToStringArrayUnRecursiveOptions<boolean>\n): undefined;\nexport function toStringArrayUnRecursive(\n array?: Array<never>,\n options?: ToStringArrayUnRecursiveOptions<boolean>\n): [];\nexport function toStringArrayUnRecursive<T, R extends boolean = true>(\n array?: Array<T> | readonly T[] | null,\n options?: ToStringArrayUnRecursiveOptions<R>\n): ToStringArrayUnRecursiveReturn<T, R>;\nexport function toStringArrayUnRecursive<T = unknown>(\n array?: T,\n options?: ToStringArrayUnRecursiveOptions<boolean>\n): undefined;\nexport function toStringArrayUnRecursive<T>(\n array?: Array<T> | readonly T[] | null,\n options: ToStringArrayUnRecursiveOptions<boolean> = {}\n) {\n assertIsPlainObject(options, {\n message: ({ currentType, validType }) =>\n `Second parameter (\\`options\\`) must be of type \\`${validType}\\`, but received: \\`${currentType}\\`.`\n });\n\n const riv = hasOwnProp(options, \"removeInvalidValue\")\n ? options.removeInvalidValue\n : true;\n\n assertIsBoolean(riv, {\n message: ({ currentType, validType }) =>\n `Parameter \\`removeInvalidValue\\` property of the \\`options\\` (second parameter) must be of type \\`${validType}\\`, but received: \\`${currentType}\\`.`\n });\n\n if (isArray(array)) {\n // Convert each item in the array to a string, or null/undefined if it's not a valid value.\n const result = Array.from(array, (x) => {\n // Convert finite number, boolean, bigInt or string to string\n if (isString(x) || isFinite(x) || isBoolean(x) || isBigInt(x))\n return String(x);\n\n // Handle null or undefined values\n return isNull(x) ? null : undefined;\n });\n\n // Remove invalid values (null, undefined) if specified in options\n if (riv) return filterNilArray(result);\n\n return result;\n }\n\n // Return undefined if no array is provided\n return undefined;\n}\n"],"mappings":";;;;;;;;;;;;;;;;AAuDA,SAAgB,eAAe,OAAyB;CACtD,IAAI,MAAM,MAAM,EAAE,OAAO;CACzB,IAAI,CAAC,QAAQ,MAAM,EAAE,OAAO,EAAE;CAgB9B,OAdiB,MAAM,QAAmB,QAAQ,YAAY;EAC5D,IAAI,CAAC,MAAM,QAAQ,EACjB,IAAI,QAAQ,QAAQ,EAAE;GACpB,MAAM,gBAAgB,eAAe,QAAQ;GAC7C,IAAI,iBAAiB,CAAC,aAAa,cAAc,EAC/C,OAAO,KAAK,cAAc;SAG5B,OAAO,KAAK,QAAQ;EAGxB,OAAO;IACN,EAAE,CAEU;;;;;ACSjB,SAAgB,yBACd,OACA,UAAoD,EAAE,EACtD;CACA,oBAAoB,SAAS,EAC3B,UAAU,EAAE,aAAa,gBACvB,oDAAoD,UAAU,sBAAsB,YAAY,MACnG,CAAC;CAEF,MAAM,MAAM,WAAW,SAAS,qBAAqB,GACjD,QAAQ,qBACR;CAEJ,gBAAgB,KAAK,EACnB,UAAU,EAAE,aAAa,gBACvB,qGAAqG,UAAU,sBAAsB,YAAY,MACpJ,CAAC;CAEF,IAAI,QAAQ,MAAM,EAAE;EAElB,MAAM,SAAS,MAAM,KAAK,QAAQ,MAAM;GAEtC,IAAI,SAAS,EAAE,IAAI,SAAS,EAAE,IAAI,UAAU,EAAE,IAAI,SAAS,EAAE,EAC3D,OAAO,OAAO,EAAE;GAGlB,OAAO,OAAO,EAAE,GAAG,OAAO;IAC1B;EAGF,IAAI,KAAK,OAAO,eAAe,OAAO;EAEtC,OAAO"}
@@ -2,129 +2,19 @@
2
2
  * ========================================================================
3
3
  * @rzl-zone/utils-js
4
4
  * ------------------------------------------------------------------------
5
- * Version: `3.12.1-beta.0`
5
+ * Version: `3.13.0-beta.2`
6
6
  * Author: `Rizalvin Dwiky <rizalvindwiky@gmail.com>`
7
7
  * Repository: `https://github.com/rzl-zone/rzl-zone/tree/main/packages/utils-js`
8
8
  * ========================================================================
9
9
  */
10
10
  "use strict";
11
11
  Object.defineProperty(exports, Symbol.toStringTag, { value: 'Module' });
12
- const require_assertIsBoolean = require('../assertIsBoolean-DozdtbNi.cjs');
13
- const require_assertIsArray = require('../assertIsArray-BChqwPiP.cjs');
14
- const require_toStringArrayUnRecursive = require('../toStringArrayUnRecursive-xUaU8Ot9.cjs');
15
- const require_safeStableStringify = require('../safeStableStringify-Cc62pfRp.cjs');
16
- const require_isEmptyString = require('../isEmptyString-CCK3bP74.cjs');
17
- const require_isEmptyValue = require('../isEmptyValue-DMSMFTU8.cjs');
18
- const require_isInteger = require('../isInteger-FTCthMre.cjs');
19
- const require_punyCode = require('../punyCode-CTWXVVFo.cjs');
20
- const require_isURL = require('../isURL-WZypXsax.cjs');
21
- const require_normalizeString = require('../normalizeString-D8euBcRD.cjs');
22
- const require_formatEnvPort = require('../formatEnvPort-hHNvOim-.cjs');
23
- const constructURL = (baseUrl, queryParams, removeParams) => {
24
- if (require_assertIsBoolean.isString(baseUrl)) {
25
- if (require_isEmptyString.isEmptyString(baseUrl)) throw new TypeError("First parameter (`baseUrl`) cannot be an empty-string.");
26
- baseUrl = require_normalizeString.normalizeString(baseUrl);
27
- } else if (!require_isURL.isURL(baseUrl)) throw new TypeError(`First parameter (\`baseUrl\`) must be of type an URL instance or a \`string\` and a non empty-string, but received: \`${require_assertIsBoolean.getPreciseType(baseUrl)}\`, with current value: \`${require_safeStableStringify.safeStableStringify(baseUrl, { keepUndefined: true })}\`.`);
28
- if (!require_assertIsBoolean.isUndefined(removeParams)) {
29
- require_assertIsArray.assertIsArray(removeParams, { message: ({ currentType, validType }) => `Third parameter (\`removeParams\`) must be of type \`${validType} of strings\`, but received: \`${currentType}\`.` });
30
- if (!removeParams.every((param) => require_assertIsBoolean.isNonEmptyString(param))) throw new TypeError("Third parameter (`removeParams`) must be of type `array` and contains `string` only and non empty-string.");
31
- }
32
- try {
33
- if (!require_assertIsBoolean.isUndefined(queryParams) && !require_assertIsBoolean.isFunction(queryParams[Symbol.iterator])) throw new TypeError(`Second parameter (\`queryParams\`) must be iterable (like URLSearchParams.entries() or an array of [[string, string | number]...]), but received: \`${require_assertIsBoolean.getPreciseType(queryParams)}\`, with value: \`${require_safeStableStringify.safeStableStringify(queryParams, { keepUndefined: true })}\`.`);
34
- const urlInstance = new URL(baseUrl);
35
- if (!require_assertIsBoolean.isUndefined(queryParams)) {
36
- const paramObject = Object.fromEntries(queryParams);
37
- if (!require_isEmptyValue.isEmptyValue(paramObject)) {
38
- const mergedParams = new URLSearchParams(urlInstance.search);
39
- for (const [key, value] of Object.entries(paramObject)) {
40
- if (!require_assertIsBoolean.isNonEmptyString(value) && !require_assertIsBoolean.isNumber(value, { includeNaN: true })) throw new TypeError(`Second parameter (\`queryParams\`) must be iterable (like URLSearchParams.entries() or an array of [[string, string | number]...]), but received: \`${require_assertIsBoolean.getPreciseType(queryParams)}\`, with value: \`${require_safeStableStringify.safeStableStringify(queryParams, { keepUndefined: true })}\`.`);
41
- mergedParams.set(key, String(value));
42
- }
43
- if (removeParams?.length) require_toStringArrayUnRecursive.toStringArrayUnRecursive(removeParams).map((paramKey) => {
44
- mergedParams.delete(paramKey);
45
- });
46
- urlInstance.search = mergedParams.toString();
47
- }
48
- }
49
- removeParams?.forEach((param) => urlInstance.searchParams.delete(param));
50
- return urlInstance;
51
- } catch (error) {
52
- if (require_assertIsBoolean.isError(error)) throw error;
53
- throw new Error("Failed to construct a valid URL in `constructURL()`, Error:" + error, { cause: error });
54
- }
55
- };
56
- const extractURLs = (url) => {
57
- if (!require_assertIsBoolean.isNonEmptyString(url)) return null;
58
- let decoded;
59
- try {
60
- decoded = decodeURIComponent(url);
61
- } catch {
62
- return null;
63
- }
64
- const matches = decoded.match(/https?:\/\/.*?(?=https?:\/\/|\s|$)/g);
65
- if (!matches) return null;
66
- const cleaned = matches.map((url) => url.replace(/[.,;:!?)]*$/, "")).filter((url) => {
67
- try {
68
- const u = new URL(url);
69
- return u.protocol === "http:" || u.protocol === "https:";
70
- } catch {
71
- return false;
72
- }
73
- });
74
- return cleaned.length ? cleaned : null;
75
- };
76
- const getFirstPrefixPathname = (result, defaultValue = "/") => {
77
- if (!require_assertIsBoolean.isNonEmptyString(defaultValue)) throw new TypeError(`Second parameter (\`defaultValue\`) must be of type \`string\` and not an \`empty-string\`, but received: \`${require_assertIsBoolean.getPreciseType(defaultValue)}\`, with value: \`${require_safeStableStringify.safeStableStringify(defaultValue, { keepUndefined: true })}\`.`);
78
- if (require_assertIsBoolean.isArray(result)) {
79
- if (!result.every((item) => require_assertIsBoolean.isString(item))) throw new TypeError(`First parameter (\`result\`) must be of type \`string\` or \`array of string\`, but received: \`${require_assertIsBoolean.getPreciseType(result)}\`, with value: \`${require_safeStableStringify.safeStableStringify(result, { keepUndefined: true })}\`.`);
80
- for (const item of result) {
81
- const normalized = require_formatEnvPort.normalizePathname(item);
82
- if (normalized !== "/") return normalized;
83
- }
84
- return require_formatEnvPort.normalizePathname(defaultValue);
85
- }
86
- if (require_assertIsBoolean.isString(result)) {
87
- const normalized = require_formatEnvPort.normalizePathname(result);
88
- return normalized !== "/" ? normalized : require_formatEnvPort.normalizePathname(defaultValue);
89
- }
90
- if (!require_assertIsBoolean.isNil(result)) throw new TypeError(`First parameter (\`result\`) must be of type \`string\`, \`array-string\`, \`null\` or \`undefined\`, but received: \`${require_assertIsBoolean.getPreciseType(result)}\`.`);
91
- return require_formatEnvPort.normalizePathname(defaultValue);
92
- };
93
- const getPrefixPathname = (url, base = null, options = {}) => {
94
- const errors = [];
95
- if (!require_assertIsBoolean.isString(url) && !require_assertIsBoolean.isArray(url)) errors.push(`First parameter (\`url\`) must be of type \`string\` or \`array-string\`, but received: \`${require_assertIsBoolean.getPreciseType(url)}\`.`);
96
- if (!require_assertIsBoolean.isString(base) && !require_assertIsBoolean.isArray(base) && !require_assertIsBoolean.isNull(base)) errors.push(`Second parameter (\`base\`) must be of type \`string\`, \`array-string\` or \`null\`, but received: \`${require_assertIsBoolean.getPreciseType(base)}\`.`);
97
- if (!require_assertIsBoolean.isPlainObject(options)) errors.push(`Second parameter (\`options\`) must be of type \`plain-object\`, but received: \`${require_assertIsBoolean.getPreciseType(options)}\`.`);
98
- const { levels = 1, removeDuplicates = true } = options;
99
- if (!require_isInteger.isInteger(levels) || require_isInteger.isInteger(levels) && levels < 0) errors.push(`Parameter \`levels\` property of the \`options\` (second parameter) must be of type \`integer-number\` and minimum is \`0\`, but received: \`${require_assertIsBoolean.getPreciseType(levels)}\`, with value: \`${require_safeStableStringify.safeStableStringify(levels, { keepUndefined: true })}\`.`);
100
- if (!require_assertIsBoolean.isBoolean(removeDuplicates)) errors.push(`Parameter \`removeDuplicates\` property of the \`options\` (second parameter) must be of type \`boolean\`, but received: \`${require_assertIsBoolean.getPreciseType(removeDuplicates)}\`.`);
101
- if (require_assertIsBoolean.isNonEmptyArray(errors)) throw new TypeError(`Invalid parameter(s) in \`getPrefixPathname\` function:\n- ${errors.join("\n- ")}`);
102
- function getLevel(singleUrl) {
103
- return `/${require_formatEnvPort.normalizePathname(singleUrl).split("/").filter(Boolean).slice(0, levels).join("/")}`;
104
- }
105
- function processUrl(singleUrl) {
106
- if (base) {
107
- singleUrl = require_formatEnvPort.normalizePathname(singleUrl);
108
- if (require_assertIsBoolean.isArray(base)) {
109
- for (const b of base) if (singleUrl.startsWith(require_formatEnvPort.normalizePathname(b))) return getLevel(singleUrl);
110
- } else if (require_assertIsBoolean.isNonEmptyString(base) && singleUrl.startsWith(require_formatEnvPort.normalizePathname(base))) return getLevel(singleUrl);
111
- return null;
112
- }
113
- return getLevel(singleUrl);
114
- }
115
- if (require_assertIsBoolean.isArray(url)) {
116
- const result = url.map(processUrl).filter((r) => !require_assertIsBoolean.isNull(r));
117
- const uniqueResult = removeDuplicates ? [...new Set(result)] : result;
118
- if (uniqueResult.length === 1) return uniqueResult[0];
119
- return uniqueResult;
120
- }
121
- return processUrl(url);
122
- };
123
- exports.constructURL = constructURL;
124
- exports.extractURLs = extractURLs;
125
- exports.formatEnvPort = require_formatEnvPort.formatEnvPort;
126
- exports.getFirstPrefixPathname = getFirstPrefixPathname;
127
- exports.getPrefixPathname = getPrefixPathname;
128
- exports.normalizePathname = require_formatEnvPort.normalizePathname;
12
+ const require_punyCode = require('../punyCode-DmTsB7q_.cjs');
13
+ const require_urls = require('../urls-DCyx8Wpk.cjs');
14
+ exports.constructURL = require_urls.constructURL;
15
+ exports.extractURLs = require_urls.extractURLs;
16
+ exports.formatEnvPort = require_urls.formatEnvPort;
17
+ exports.getFirstPrefixPathname = require_urls.getFirstPrefixPathname;
18
+ exports.getPrefixPathname = require_urls.getPrefixPathname;
19
+ exports.normalizePathname = require_urls.normalizePathname;
129
20
  exports.punycodeUtilsJS = require_punyCode.punycodeUtilsJS;
130
- //# sourceMappingURL=index.cjs.map