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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (188) hide show
  1. package/dist/.references/index.d.cts +1 -1
  2. package/dist/.references/index.d.ts +1 -1
  3. package/dist/{assertIsArray-BgdgVjDu.cjs → assertIsArray-CqIFmlgj.cjs} +3 -3
  4. package/dist/{assertIsArray-BgdgVjDu.cjs.map → assertIsArray-CqIFmlgj.cjs.map} +1 -1
  5. package/dist/{assertIsArray-hZyYKvLb.js → assertIsArray-DrLORH0Y.js} +3 -3
  6. package/dist/{assertIsArray-hZyYKvLb.js.map → assertIsArray-DrLORH0Y.js.map} +1 -1
  7. package/dist/{assertIsBoolean-JGpkg5ju.cjs → assertIsBoolean-CEx4KbHg.cjs} +2 -2
  8. package/dist/{assertIsBoolean-JGpkg5ju.cjs.map → assertIsBoolean-CEx4KbHg.cjs.map} +1 -1
  9. package/dist/{assertIsBoolean-9-huIcIR.js → assertIsBoolean-DDhQ2D-k.js} +2 -2
  10. package/dist/{assertIsBoolean-9-huIcIR.js.map → assertIsBoolean-DDhQ2D-k.js.map} +1 -1
  11. package/dist/{assertIsString-CcOpQqcv.js → assertIsString-1iLqxrN0.js} +3 -3
  12. package/dist/{assertIsString-CcOpQqcv.js.map → assertIsString-1iLqxrN0.js.map} +1 -1
  13. package/dist/{assertIsString-UR6QjqyZ.cjs → assertIsString-DGDLC-XD.cjs} +3 -3
  14. package/dist/{assertIsString-UR6QjqyZ.cjs.map → assertIsString-DGDLC-XD.cjs.map} +1 -1
  15. package/dist/assertions/index.cjs +5 -5
  16. package/dist/assertions/index.cjs.map +1 -1
  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/assertions/index.js.map +1 -1
  21. package/dist/conversions/index.cjs +6 -6
  22. package/dist/conversions/index.d.cts +2 -2
  23. package/dist/conversions/index.d.ts +2 -2
  24. package/dist/conversions/index.js +6 -6
  25. package/dist/{conversions-DLt2zlyu.cjs → conversions-Bxa01uIl.cjs} +12 -12
  26. package/dist/{conversions-DLt2zlyu.cjs.map → conversions-Bxa01uIl.cjs.map} +1 -1
  27. package/dist/{conversions-Du6GC5JA.js → conversions-CA_3PTAH.js} +12 -12
  28. package/dist/{conversions-Du6GC5JA.js.map → conversions-CA_3PTAH.js.map} +1 -1
  29. package/dist/events/index.cjs +4 -4
  30. package/dist/events/index.cjs.map +1 -1
  31. package/dist/events/index.d.cts +1 -1
  32. package/dist/events/index.d.ts +1 -1
  33. package/dist/events/index.js +4 -4
  34. package/dist/events/index.js.map +1 -1
  35. package/dist/formatters/index.cjs +2 -2
  36. package/dist/formatters/index.d.cts +2 -2
  37. package/dist/formatters/index.d.ts +2 -2
  38. package/dist/formatters/index.js +2 -2
  39. package/dist/{formatters-RomzqDp_.js → formatters-Bm3a_akj.js} +10 -10
  40. package/dist/{formatters-RomzqDp_.js.map → formatters-Bm3a_akj.js.map} +1 -1
  41. package/dist/{formatters-C0t5CdX-.cjs → formatters-Bt6QuhxK.cjs} +10 -10
  42. package/dist/{formatters-C0t5CdX-.cjs.map → formatters-Bt6QuhxK.cjs.map} +1 -1
  43. package/dist/generators/index.cjs +5 -5
  44. package/dist/generators/index.cjs.map +1 -1
  45. package/dist/generators/index.d.cts +2 -2
  46. package/dist/generators/index.d.ts +2 -2
  47. package/dist/generators/index.js +5 -5
  48. package/dist/generators/index.js.map +1 -1
  49. package/dist/{index-CPc-TTMc.d.cts → index--h04HuBE.d.cts} +1 -1
  50. package/dist/{index-hsSSKuvW.d.ts → index--h04HuBE.d.ts} +1 -1
  51. package/dist/{index-DoteSYTy.d.cts → index-Ap8U-8Qx.d.cts} +1 -1
  52. package/dist/{index-DM_0q4CY.d.cts → index-BAeeggeh.d.cts} +1 -1
  53. package/dist/{index-5DpyzfpU.d.ts → index-BAeeggeh.d.ts} +1 -1
  54. package/dist/{index-BcKPWWfh.d.ts → index-Bm5odgLW.d.ts} +2 -2
  55. package/dist/{index-BFI4R7Pn.d.ts → index-BqkYm8qT.d.cts} +1 -1
  56. package/dist/{index-D-5AsV9K.d.cts → index-BqkYm8qT.d.ts} +1 -1
  57. package/dist/{index-tYmZ3X4Y.d.cts → index-CJx0EFQ4.d.cts} +2 -2
  58. package/dist/{index-bGRsmkyA.d.ts → index-CMglhpFG.d.ts} +1 -1
  59. package/dist/{index-B6Xg9Z8l.d.ts → index-CakviK5E.d.cts} +2 -2
  60. package/dist/{index-CMcxcN7w.d.cts → index-D5nTp1kV.d.ts} +2 -2
  61. package/dist/{index-50G4edI1.d.ts → index-hOCUw-B9.d.ts} +2 -2
  62. package/dist/{index-s7h0w-8H.d.cts → index-uaHl0X-r.d.cts} +2 -2
  63. package/dist/{isBigInt-C0gHDkh4.cjs → isBigInt-CqZNWVtI.cjs} +2 -2
  64. package/dist/{isBigInt-C0gHDkh4.cjs.map → isBigInt-CqZNWVtI.cjs.map} +1 -1
  65. package/dist/{isBigInt-bbW78ITJ.js → isBigInt-f6yY2fAV.js} +2 -2
  66. package/dist/{isBigInt-bbW78ITJ.js.map → isBigInt-f6yY2fAV.js.map} +1 -1
  67. package/dist/{isEmptyObject-CZsFdN7x.js → isEmptyObject-BYNnSKzw.js} +3 -3
  68. package/dist/{isEmptyObject-CZsFdN7x.js.map → isEmptyObject-BYNnSKzw.js.map} +1 -1
  69. package/dist/{isEmptyObject-D-fETD_f.cjs → isEmptyObject-C2lQyFZS.cjs} +3 -3
  70. package/dist/{isEmptyObject-D-fETD_f.cjs.map → isEmptyObject-C2lQyFZS.cjs.map} +1 -1
  71. package/dist/{isEmptyString-Dx6OM5PL.cjs → isEmptyString-DNMPmS-H.cjs} +3 -3
  72. package/dist/{isEmptyString-Dx6OM5PL.cjs.map → isEmptyString-DNMPmS-H.cjs.map} +1 -1
  73. package/dist/{isEmptyString-pmcf-orv.js → isEmptyString-Ga77_3Q1.js} +3 -3
  74. package/dist/{isEmptyString-pmcf-orv.js.map → isEmptyString-Ga77_3Q1.js.map} +1 -1
  75. package/dist/{isEmptyValue-CkiXENcT.js → isEmptyValue-D7-6WWS9.js} +5 -5
  76. package/dist/{isEmptyValue-CkiXENcT.js.map → isEmptyValue-D7-6WWS9.js.map} +1 -1
  77. package/dist/{isEmptyValue-v6BsHBiu.cjs → isEmptyValue-DZaDHEIw.cjs} +5 -5
  78. package/dist/{isEmptyValue-v6BsHBiu.cjs.map → isEmptyValue-DZaDHEIw.cjs.map} +1 -1
  79. package/dist/{isEqual-CZxetLzm.cjs → isEqual-D8W3Wizi.cjs} +4 -4
  80. package/dist/{isEqual-CZxetLzm.cjs.map → isEqual-D8W3Wizi.cjs.map} +1 -1
  81. package/dist/{isEqual-Dc8fNB2J.js → isEqual-ekId-j5b.js} +4 -4
  82. package/dist/{isEqual-Dc8fNB2J.js.map → isEqual-ekId-j5b.js.map} +1 -1
  83. package/dist/{isFinite-CI59vUHt.js → isFinite-BJO7Dt6B.js} +3 -3
  84. package/dist/{isFinite-CI59vUHt.js.map → isFinite-BJO7Dt6B.js.map} +1 -1
  85. package/dist/{isFinite-0z31xOa2.cjs → isFinite-Crw95XV8.cjs} +3 -3
  86. package/dist/{isFinite-0z31xOa2.cjs.map → isFinite-Crw95XV8.cjs.map} +1 -1
  87. package/dist/{isInteger-DeN5FIAr.js → isInteger-B75voxys.js} +2 -2
  88. package/dist/{isInteger-DeN5FIAr.js.map → isInteger-B75voxys.js.map} +1 -1
  89. package/dist/{isInteger-DUhd-dyt.cjs → isInteger-CSMNm--9.cjs} +2 -2
  90. package/dist/{isInteger-DUhd-dyt.cjs.map → isInteger-CSMNm--9.cjs.map} +1 -1
  91. package/dist/{isPlainObject-CjoJH9yk.d.ts → isPlainObject-ByfuseCf.d.cts} +1 -1
  92. package/dist/{isPlainObject-DvxdHoAf.d.cts → isPlainObject-ByfuseCf.d.ts} +1 -1
  93. package/dist/{isServer-BM5GzRpI.js → isServer-BHOSvBhV.js} +2 -2
  94. package/dist/{isServer-BM5GzRpI.js.map → isServer-BHOSvBhV.js.map} +1 -1
  95. package/dist/{isServer-TOmhgOtP.cjs → isServer-HA13Dzo2.cjs} +2 -2
  96. package/dist/{isServer-TOmhgOtP.cjs.map → isServer-HA13Dzo2.cjs.map} +1 -1
  97. package/dist/{isTypedArray-pAdBFUDl.cjs → isTypedArray-CWlHRz_O.cjs} +3 -3
  98. package/dist/{isTypedArray-pAdBFUDl.cjs.map → isTypedArray-CWlHRz_O.cjs.map} +1 -1
  99. package/dist/{isTypedArray-BPerK072.js → isTypedArray-CmnQ7Yx9.js} +3 -3
  100. package/dist/{isTypedArray-BPerK072.js.map → isTypedArray-CmnQ7Yx9.js.map} +1 -1
  101. package/dist/{isValidDomain-CHKOn79-.js → isValidDomain-BqyLVi7S.js} +5 -5
  102. package/dist/{isValidDomain-CHKOn79-.js.map → isValidDomain-BqyLVi7S.js.map} +1 -1
  103. package/dist/{isValidDomain-BMcr9vTp.cjs → isValidDomain-ByrOfQsh.cjs} +5 -5
  104. package/dist/{isValidDomain-BMcr9vTp.cjs.map → isValidDomain-ByrOfQsh.cjs.map} +1 -1
  105. package/dist/{noop-D4g9yTAW.cjs → noop-CkwxErJ2.cjs} +2 -2
  106. package/dist/{noop-D4g9yTAW.cjs.map → noop-CkwxErJ2.cjs.map} +1 -1
  107. package/dist/{noop-BaNz9ls5.js → noop-D_Ots__Z.js} +2 -2
  108. package/dist/{noop-BaNz9ls5.js.map → noop-D_Ots__Z.js.map} +1 -1
  109. package/dist/{normalizeSpaces-MWiYtSyS.cjs → normalizeSpaces-88yaixiu.cjs} +3 -3
  110. package/dist/{normalizeSpaces-MWiYtSyS.cjs.map → normalizeSpaces-88yaixiu.cjs.map} +1 -1
  111. package/dist/{normalizeSpaces-DupusmF5.js → normalizeSpaces-Cat8CHtt.js} +3 -3
  112. package/dist/{normalizeSpaces-DupusmF5.js.map → normalizeSpaces-Cat8CHtt.js.map} +1 -1
  113. package/dist/operations/index.cjs +7 -7
  114. package/dist/operations/index.cjs.map +1 -1
  115. package/dist/operations/index.d.cts +1 -1
  116. package/dist/operations/index.d.ts +1 -1
  117. package/dist/operations/index.js +7 -7
  118. package/dist/operations/index.js.map +1 -1
  119. package/dist/parsers/index.cjs +2 -2
  120. package/dist/parsers/index.d.cts +1 -1
  121. package/dist/parsers/index.d.ts +1 -1
  122. package/dist/parsers/index.js +2 -2
  123. package/dist/{parsers-Dl9fFra4.js → parsers-BLHzVoh-.js} +4 -4
  124. package/dist/{parsers-Dl9fFra4.js.map → parsers-BLHzVoh-.js.map} +1 -1
  125. package/dist/{parsers-Bd-YRt6j.cjs → parsers-xAQmKCgS.cjs} +4 -4
  126. package/dist/{parsers-Bd-YRt6j.cjs.map → parsers-xAQmKCgS.cjs.map} +1 -1
  127. package/dist/{parsing-BG73HUrI.js → parsing-BYo6U0EG.js} +3 -3
  128. package/dist/{parsing-BG73HUrI.js.map → parsing-BYo6U0EG.js.map} +1 -1
  129. package/dist/{parsing-CU_Mc7CF.cjs → parsing-CuezVd0e.cjs} +3 -3
  130. package/dist/{parsing-CU_Mc7CF.cjs.map → parsing-CuezVd0e.cjs.map} +1 -1
  131. package/dist/predicates/index.cjs +14 -14
  132. package/dist/predicates/index.d.cts +3 -3
  133. package/dist/predicates/index.d.ts +3 -3
  134. package/dist/predicates/index.js +14 -14
  135. package/dist/{predicates-VJN-VDha.js → predicates-BMTIIYx8.js} +11 -11
  136. package/dist/{predicates-VJN-VDha.js.map → predicates-BMTIIYx8.js.map} +1 -1
  137. package/dist/{predicates-Bd4AnXr0.cjs → predicates-ZmZpelMh.cjs} +11 -11
  138. package/dist/{predicates-Bd4AnXr0.cjs.map → predicates-ZmZpelMh.cjs.map} +1 -1
  139. package/dist/promises/index.cjs +4 -4
  140. package/dist/promises/index.cjs.map +1 -1
  141. package/dist/promises/index.d.cts +1 -1
  142. package/dist/promises/index.d.ts +1 -1
  143. package/dist/promises/index.js +4 -4
  144. package/dist/promises/index.js.map +1 -1
  145. package/dist/{punyCode-C0ft9dER.js → punyCode-COTqgXMJ.js} +6 -6
  146. package/dist/{punyCode-C0ft9dER.js.map → punyCode-COTqgXMJ.js.map} +1 -1
  147. package/dist/{punyCode-5wmummgP.cjs → punyCode-WZ6-GaTM.cjs} +6 -6
  148. package/dist/{punyCode-5wmummgP.cjs.map → punyCode-WZ6-GaTM.cjs.map} +1 -1
  149. package/dist/{removeSpaces-CPj1ABLa.cjs → removeSpaces-BeGkktUl.cjs} +3 -3
  150. package/dist/{removeSpaces-CPj1ABLa.cjs.map → removeSpaces-BeGkktUl.cjs.map} +1 -1
  151. package/dist/{removeSpaces-DpiJ1H1P.js → removeSpaces-CQJvw1yU.js} +3 -3
  152. package/dist/{removeSpaces-DpiJ1H1P.js.map → removeSpaces-CQJvw1yU.js.map} +1 -1
  153. package/dist/rzl-utils.global.js +13 -13
  154. package/dist/{safeJsonParse-v7ll9iFG.cjs → safeJsonParse-BznDD3fi.cjs} +6 -6
  155. package/dist/{safeJsonParse-v7ll9iFG.cjs.map → safeJsonParse-BznDD3fi.cjs.map} +1 -1
  156. package/dist/{safeJsonParse-BxOZgGy7.js → safeJsonParse-D8H3wCv7.js} +6 -6
  157. package/dist/{safeJsonParse-BxOZgGy7.js.map → safeJsonParse-D8H3wCv7.js.map} +1 -1
  158. package/dist/{safeStableStringify-BiUOLBYo.cjs → safeStableStringify-4b-E_UHM.cjs} +4 -4
  159. package/dist/{safeStableStringify-BiUOLBYo.cjs.map → safeStableStringify-4b-E_UHM.cjs.map} +1 -1
  160. package/dist/{safeStableStringify-C5Gc3ZED.js → safeStableStringify-BLwA1VC-.js} +4 -4
  161. package/dist/{safeStableStringify-C5Gc3ZED.js.map → safeStableStringify-BLwA1VC-.js.map} +1 -1
  162. package/dist/strings/index.cjs +5 -5
  163. package/dist/strings/index.cjs.map +1 -1
  164. package/dist/strings/index.d.cts +2 -2
  165. package/dist/strings/index.d.ts +2 -2
  166. package/dist/strings/index.js +5 -5
  167. package/dist/strings/index.js.map +1 -1
  168. package/dist/tailwind/index.cjs +2 -2
  169. package/dist/tailwind/index.d.cts +2 -2
  170. package/dist/tailwind/index.d.ts +2 -2
  171. package/dist/tailwind/index.js +2 -2
  172. package/dist/{tailwind-DhKiKZAc.cjs → tailwind-CjxdO7aL.cjs} +5 -5
  173. package/dist/{tailwind-DhKiKZAc.cjs.map → tailwind-CjxdO7aL.cjs.map} +1 -1
  174. package/dist/{tailwind-CxI2DXpR.js → tailwind-RSE3obLb.js} +5 -5
  175. package/dist/{tailwind-CxI2DXpR.js.map → tailwind-RSE3obLb.js.map} +1 -1
  176. package/dist/{toStringArrayUnRecursive-BuRBWRcB.cjs → toStringArrayUnRecursive-D-jHROts.cjs} +6 -6
  177. package/dist/{toStringArrayUnRecursive-BuRBWRcB.cjs.map → toStringArrayUnRecursive-D-jHROts.cjs.map} +1 -1
  178. package/dist/{toStringArrayUnRecursive-BaZrCGaR.js → toStringArrayUnRecursive-NreW1dyV.js} +6 -6
  179. package/dist/{toStringArrayUnRecursive-BaZrCGaR.js.map → toStringArrayUnRecursive-NreW1dyV.js.map} +1 -1
  180. package/dist/urls/index.cjs +3 -3
  181. package/dist/urls/index.d.cts +1 -1
  182. package/dist/urls/index.d.ts +1 -1
  183. package/dist/urls/index.js +3 -3
  184. package/dist/{urls-CyhKg1Cn.cjs → urls-C6BvhrrV.cjs} +11 -11
  185. package/dist/{urls-CyhKg1Cn.cjs.map → urls-C6BvhrrV.cjs.map} +1 -1
  186. package/dist/{urls-nr2hUK75.js → urls-CLVfEB7O.js} +11 -11
  187. package/dist/{urls-nr2hUK75.js.map → urls-CLVfEB7O.js.map} +1 -1
  188. package/package.json +2 -2
@@ -2,11 +2,11 @@
2
2
  * ========================================================================
3
3
  * @rzl-zone/utils-js
4
4
  * ------------------------------------------------------------------------
5
- * Version: `3.13.0`
5
+ * Version: `3.13.1-beta.0`
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
  const noop = () => {};
11
11
  export { noop as t };
12
- //# sourceMappingURL=noop-BaNz9ls5.js.map
12
+ //# sourceMappingURL=noop-D_Ots__Z.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"noop-BaNz9ls5.js","names":[],"sources":["../src/generators/utils/noop.ts"],"sourcesContent":["/**\n * --------------------------------------------------\n * * ***Utility: `noop`.***\n * --------------------------------------------------\n * **A no-operation function that performs no action.**\n *\n * @description\n * Commonly used as a **placeholder**, **default callback**, or **stub function**.\n *\n * - **Behavior**:\n * - Does not return any meaningful value (`void`).\n * - Safely callable in any context without side effects.\n *\n * @remarks\n * Although this function returns `void`, it implicitly results in `undefined`,\n * but the return value should never be relied upon.\n *\n * @example\n * **1. Basic usage** — does nothing and returns undefined implicitly:\n * ```\n * import { noop } from \"@rzl-zone/utils-js/generators\";\n *\n * noop(); // ➔ no effect (void)\n * ```\n * @example\n * **2. Using with type-checking helpers:**\n * ```ts\n * import { noop } from \"@rzl-zone/utils-js/generators\";\n * import { isFunction, isUndefined } from \"@rzl-zone/utils-js/predicates\";\n *\n * isFunction(noop); // ➔ true — `noop` is a function\n * isUndefined(noop()); // ➔ true — calling `noop()` returns `undefined`\n * isFunction(noop()); // ➔ false — the return value is `undefined`, not a function\n * ```\n * @example\n * **3. As a default callback:**\n * ```ts\n * import { noop } from \"@rzl-zone/utils-js/generators\";\n *\n * const callback = noop;\n * callback(); // ➔ no effect (void)\n * ```\n */\nexport const noop = (): void => {};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CA,MAAa,aAAmB"}
1
+ {"version":3,"file":"noop-D_Ots__Z.js","names":[],"sources":["../src/generators/utils/noop.ts"],"sourcesContent":["/**\n * --------------------------------------------------\n * * ***Utility: `noop`.***\n * --------------------------------------------------\n * **A no-operation function that performs no action.**\n *\n * @description\n * Commonly used as a **placeholder**, **default callback**, or **stub function**.\n *\n * - **Behavior**:\n * - Does not return any meaningful value (`void`).\n * - Safely callable in any context without side effects.\n *\n * @remarks\n * Although this function returns `void`, it implicitly results in `undefined`,\n * but the return value should never be relied upon.\n *\n * @example\n * **1. Basic usage** — does nothing and returns undefined implicitly:\n * ```\n * import { noop } from \"@rzl-zone/utils-js/generators\";\n *\n * noop(); // ➔ no effect (void)\n * ```\n * @example\n * **2. Using with type-checking helpers:**\n * ```ts\n * import { noop } from \"@rzl-zone/utils-js/generators\";\n * import { isFunction, isUndefined } from \"@rzl-zone/utils-js/predicates\";\n *\n * isFunction(noop); // ➔ true — `noop` is a function\n * isUndefined(noop()); // ➔ true — calling `noop()` returns `undefined`\n * isFunction(noop()); // ➔ false — the return value is `undefined`, not a function\n * ```\n * @example\n * **3. As a default callback:**\n * ```ts\n * import { noop } from \"@rzl-zone/utils-js/generators\";\n *\n * const callback = noop;\n * callback(); // ➔ no effect (void)\n * ```\n */\nexport const noop = (): void => {};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AA2CA,MAAa,aAAmB,CAAC"}
@@ -2,13 +2,13 @@
2
2
  * ========================================================================
3
3
  * @rzl-zone/utils-js
4
4
  * ------------------------------------------------------------------------
5
- * Version: `3.13.0`
5
+ * Version: `3.13.1-beta.0`
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-JGpkg5ju.cjs');
11
+ const require_assertIsBoolean = require('./assertIsBoolean-CEx4KbHg.cjs');
12
12
  const normalizeSpaces = (value, options = {
13
13
  withTrim: true,
14
14
  trimOnly: false
@@ -26,4 +26,4 @@ Object.defineProperty(exports, 'normalizeSpaces', {
26
26
  return normalizeSpaces;
27
27
  }
28
28
  });
29
- //# sourceMappingURL=normalizeSpaces-MWiYtSyS.cjs.map
29
+ //# sourceMappingURL=normalizeSpaces-88yaixiu.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"normalizeSpaces-MWiYtSyS.cjs","names":["isNonEmptyString","isPlainObject"],"sources":["../src/strings/sanitizations/normalizeSpaces.ts"],"sourcesContent":["import { isPlainObject } from \"@/predicates/is/isPlainObject\";\nimport { isNonEmptyString } from \"@/predicates/is/isNonEmptyString\";\n\ntype NormalizeSpacesOptions = {\n /** If `true`, skips normalization and only trims whitespace from start & end, defaultValue: `false`.\n *\n * @default false\n */\n trimOnly?: boolean;\n /** If `false`, skips trimming value, defaultValue: `true`.\n *\n * @default true\n */\n withTrim?: boolean;\n};\n\n/** ----------------------------------------------------------\n * * ***Utility: `normalizeSpaces`.***\n * ----------------------------------------------------------\n * **Normalizes whitespace in a string by reducing multiple spaces\n * to a single space, optionally trims, or only trims based on options.**\n * - **Behavior:**\n * - Collapses all consecutive whitespace (spaces, tabs, newlines) into a single space.\n * - Can trim leading/trailing spaces (default behavior), or preserve them with `withTrim: false`.\n * - Can skip normalization entirely and only trim using `trimOnly: true`.\n * - Returns an empty string if input is `null` or `undefined`.\n * @param {string | null | undefined} value - The input string to be processed. If `null` or `undefined`, returns an empty string.\n * @param {NormalizeSpacesOptions} [options] - Configuration options.\n * @param {NormalizeSpacesOptions[\"trimOnly\"]} [options.trimOnly=false] - If `true`, skips normalization and only trims the string.\n * @param {NormalizeSpacesOptions[\"withTrim\"]} [options.withTrim=true] - If `false`, preserves leading/trailing whitespace.\n * @returns {string} The processed string.\n * @example\n * normalizeSpaces(\" Hello World\\tthis is\\n\\nok \");\n * // ➔ \"Hello World this is ok\"\n * normalizeSpaces(\" Hello World\\tthis is\\n\\nok \", { trimOnly: true });\n * // ➔ \"Hello World\tthis is\\n\\nok\"\n * normalizeSpaces(\" Hello World \", { withTrim: false });\n * // ➔ \" Hello World \"\n * normalizeSpaces(null);\n * // ➔ \"\"\n */\nexport const normalizeSpaces = (\n value: string | null | undefined,\n options: NormalizeSpacesOptions = {\n withTrim: true,\n trimOnly: false\n }\n): string => {\n if (!isNonEmptyString(value)) return \"\";\n\n if (!isPlainObject(options)) {\n options = {};\n }\n\n const { trimOnly = false, withTrim = true } = options;\n\n if (trimOnly) return value.trim();\n\n if (withTrim) {\n value = value.trim();\n }\n\n // Remove all duplicate spaces (including tabs, newlines, etc.)\n return value.replace(/\\s+/g, \" \");\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCA,MAAa,mBACX,OACA,UAAkC;CAChC,UAAU;CACV,UAAU;CACX,KACU;CACX,IAAI,CAACA,yCAAiB,MAAM,EAAE,OAAO;CAErC,IAAI,CAACC,sCAAc,QAAQ,EACzB,UAAU,EAAE;CAGd,MAAM,EAAE,WAAW,OAAO,WAAW,SAAS;CAE9C,IAAI,UAAU,OAAO,MAAM,MAAM;CAEjC,IAAI,UACF,QAAQ,MAAM,MAAM;CAItB,OAAO,MAAM,QAAQ,QAAQ,IAAI"}
1
+ {"version":3,"file":"normalizeSpaces-88yaixiu.cjs","names":["isNonEmptyString","isPlainObject"],"sources":["../src/strings/sanitizations/normalizeSpaces.ts"],"sourcesContent":["import { isPlainObject } from \"@/predicates/is/isPlainObject\";\nimport { isNonEmptyString } from \"@/predicates/is/isNonEmptyString\";\n\ntype NormalizeSpacesOptions = {\n /** If `true`, skips normalization and only trims whitespace from start & end, defaultValue: `false`.\n *\n * @default false\n */\n trimOnly?: boolean;\n /** If `false`, skips trimming value, defaultValue: `true`.\n *\n * @default true\n */\n withTrim?: boolean;\n};\n\n/** ----------------------------------------------------------\n * * ***Utility: `normalizeSpaces`.***\n * ----------------------------------------------------------\n * **Normalizes whitespace in a string by reducing multiple spaces\n * to a single space, optionally trims, or only trims based on options.**\n * - **Behavior:**\n * - Collapses all consecutive whitespace (spaces, tabs, newlines) into a single space.\n * - Can trim leading/trailing spaces (default behavior), or preserve them with `withTrim: false`.\n * - Can skip normalization entirely and only trim using `trimOnly: true`.\n * - Returns an empty string if input is `null` or `undefined`.\n * @param {string | null | undefined} value - The input string to be processed. If `null` or `undefined`, returns an empty string.\n * @param {NormalizeSpacesOptions} [options] - Configuration options.\n * @param {NormalizeSpacesOptions[\"trimOnly\"]} [options.trimOnly=false] - If `true`, skips normalization and only trims the string.\n * @param {NormalizeSpacesOptions[\"withTrim\"]} [options.withTrim=true] - If `false`, preserves leading/trailing whitespace.\n * @returns {string} The processed string.\n * @example\n * normalizeSpaces(\" Hello World\\tthis is\\n\\nok \");\n * // ➔ \"Hello World this is ok\"\n * normalizeSpaces(\" Hello World\\tthis is\\n\\nok \", { trimOnly: true });\n * // ➔ \"Hello World\tthis is\\n\\nok\"\n * normalizeSpaces(\" Hello World \", { withTrim: false });\n * // ➔ \" Hello World \"\n * normalizeSpaces(null);\n * // ➔ \"\"\n */\nexport const normalizeSpaces = (\n value: string | null | undefined,\n options: NormalizeSpacesOptions = {\n withTrim: true,\n trimOnly: false\n }\n): string => {\n if (!isNonEmptyString(value)) return \"\";\n\n if (!isPlainObject(options)) {\n options = {};\n }\n\n const { trimOnly = false, withTrim = true } = options;\n\n if (trimOnly) return value.trim();\n\n if (withTrim) {\n value = value.trim();\n }\n\n // Remove all duplicate spaces (including tabs, newlines, etc.)\n return value.replace(/\\s+/g, \" \");\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCA,MAAa,mBACX,OACA,UAAkC;CAChC,UAAU;CACV,UAAU;AACZ,MACW;CACX,IAAI,CAACA,yCAAiB,KAAK,GAAG,OAAO;CAErC,IAAI,CAACC,sCAAc,OAAO,GACxB,UAAU,CAAC;CAGb,MAAM,EAAE,WAAW,OAAO,WAAW,SAAS;CAE9C,IAAI,UAAU,OAAO,MAAM,KAAK;CAEhC,IAAI,UACF,QAAQ,MAAM,KAAK;CAIrB,OAAO,MAAM,QAAQ,QAAQ,GAAG;AAClC"}
@@ -2,12 +2,12 @@
2
2
  * ========================================================================
3
3
  * @rzl-zone/utils-js
4
4
  * ------------------------------------------------------------------------
5
- * Version: `3.13.0`
5
+ * Version: `3.13.1-beta.0`
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 { A as isPlainObject, y as isNonEmptyString } from "./assertIsBoolean-9-huIcIR.js";
10
+ import { A as isPlainObject, y as isNonEmptyString } from "./assertIsBoolean-DDhQ2D-k.js";
11
11
  const normalizeSpaces = (value, options = {
12
12
  withTrim: true,
13
13
  trimOnly: false
@@ -20,4 +20,4 @@ const normalizeSpaces = (value, options = {
20
20
  return value.replace(/\s+/g, " ");
21
21
  };
22
22
  export { normalizeSpaces as t };
23
- //# sourceMappingURL=normalizeSpaces-DupusmF5.js.map
23
+ //# sourceMappingURL=normalizeSpaces-Cat8CHtt.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"normalizeSpaces-DupusmF5.js","names":[],"sources":["../src/strings/sanitizations/normalizeSpaces.ts"],"sourcesContent":["import { isPlainObject } from \"@/predicates/is/isPlainObject\";\nimport { isNonEmptyString } from \"@/predicates/is/isNonEmptyString\";\n\ntype NormalizeSpacesOptions = {\n /** If `true`, skips normalization and only trims whitespace from start & end, defaultValue: `false`.\n *\n * @default false\n */\n trimOnly?: boolean;\n /** If `false`, skips trimming value, defaultValue: `true`.\n *\n * @default true\n */\n withTrim?: boolean;\n};\n\n/** ----------------------------------------------------------\n * * ***Utility: `normalizeSpaces`.***\n * ----------------------------------------------------------\n * **Normalizes whitespace in a string by reducing multiple spaces\n * to a single space, optionally trims, or only trims based on options.**\n * - **Behavior:**\n * - Collapses all consecutive whitespace (spaces, tabs, newlines) into a single space.\n * - Can trim leading/trailing spaces (default behavior), or preserve them with `withTrim: false`.\n * - Can skip normalization entirely and only trim using `trimOnly: true`.\n * - Returns an empty string if input is `null` or `undefined`.\n * @param {string | null | undefined} value - The input string to be processed. If `null` or `undefined`, returns an empty string.\n * @param {NormalizeSpacesOptions} [options] - Configuration options.\n * @param {NormalizeSpacesOptions[\"trimOnly\"]} [options.trimOnly=false] - If `true`, skips normalization and only trims the string.\n * @param {NormalizeSpacesOptions[\"withTrim\"]} [options.withTrim=true] - If `false`, preserves leading/trailing whitespace.\n * @returns {string} The processed string.\n * @example\n * normalizeSpaces(\" Hello World\\tthis is\\n\\nok \");\n * // ➔ \"Hello World this is ok\"\n * normalizeSpaces(\" Hello World\\tthis is\\n\\nok \", { trimOnly: true });\n * // ➔ \"Hello World\tthis is\\n\\nok\"\n * normalizeSpaces(\" Hello World \", { withTrim: false });\n * // ➔ \" Hello World \"\n * normalizeSpaces(null);\n * // ➔ \"\"\n */\nexport const normalizeSpaces = (\n value: string | null | undefined,\n options: NormalizeSpacesOptions = {\n withTrim: true,\n trimOnly: false\n }\n): string => {\n if (!isNonEmptyString(value)) return \"\";\n\n if (!isPlainObject(options)) {\n options = {};\n }\n\n const { trimOnly = false, withTrim = true } = options;\n\n if (trimOnly) return value.trim();\n\n if (withTrim) {\n value = value.trim();\n }\n\n // Remove all duplicate spaces (including tabs, newlines, etc.)\n return value.replace(/\\s+/g, \" \");\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCA,MAAa,mBACX,OACA,UAAkC;CAChC,UAAU;CACV,UAAU;CACX,KACU;CACX,IAAI,CAAC,iBAAiB,MAAM,EAAE,OAAO;CAErC,IAAI,CAAC,cAAc,QAAQ,EACzB,UAAU,EAAE;CAGd,MAAM,EAAE,WAAW,OAAO,WAAW,SAAS;CAE9C,IAAI,UAAU,OAAO,MAAM,MAAM;CAEjC,IAAI,UACF,QAAQ,MAAM,MAAM;CAItB,OAAO,MAAM,QAAQ,QAAQ,IAAI"}
1
+ {"version":3,"file":"normalizeSpaces-Cat8CHtt.js","names":[],"sources":["../src/strings/sanitizations/normalizeSpaces.ts"],"sourcesContent":["import { isPlainObject } from \"@/predicates/is/isPlainObject\";\nimport { isNonEmptyString } from \"@/predicates/is/isNonEmptyString\";\n\ntype NormalizeSpacesOptions = {\n /** If `true`, skips normalization and only trims whitespace from start & end, defaultValue: `false`.\n *\n * @default false\n */\n trimOnly?: boolean;\n /** If `false`, skips trimming value, defaultValue: `true`.\n *\n * @default true\n */\n withTrim?: boolean;\n};\n\n/** ----------------------------------------------------------\n * * ***Utility: `normalizeSpaces`.***\n * ----------------------------------------------------------\n * **Normalizes whitespace in a string by reducing multiple spaces\n * to a single space, optionally trims, or only trims based on options.**\n * - **Behavior:**\n * - Collapses all consecutive whitespace (spaces, tabs, newlines) into a single space.\n * - Can trim leading/trailing spaces (default behavior), or preserve them with `withTrim: false`.\n * - Can skip normalization entirely and only trim using `trimOnly: true`.\n * - Returns an empty string if input is `null` or `undefined`.\n * @param {string | null | undefined} value - The input string to be processed. If `null` or `undefined`, returns an empty string.\n * @param {NormalizeSpacesOptions} [options] - Configuration options.\n * @param {NormalizeSpacesOptions[\"trimOnly\"]} [options.trimOnly=false] - If `true`, skips normalization and only trims the string.\n * @param {NormalizeSpacesOptions[\"withTrim\"]} [options.withTrim=true] - If `false`, preserves leading/trailing whitespace.\n * @returns {string} The processed string.\n * @example\n * normalizeSpaces(\" Hello World\\tthis is\\n\\nok \");\n * // ➔ \"Hello World this is ok\"\n * normalizeSpaces(\" Hello World\\tthis is\\n\\nok \", { trimOnly: true });\n * // ➔ \"Hello World\tthis is\\n\\nok\"\n * normalizeSpaces(\" Hello World \", { withTrim: false });\n * // ➔ \" Hello World \"\n * normalizeSpaces(null);\n * // ➔ \"\"\n */\nexport const normalizeSpaces = (\n value: string | null | undefined,\n options: NormalizeSpacesOptions = {\n withTrim: true,\n trimOnly: false\n }\n): string => {\n if (!isNonEmptyString(value)) return \"\";\n\n if (!isPlainObject(options)) {\n options = {};\n }\n\n const { trimOnly = false, withTrim = true } = options;\n\n if (trimOnly) return value.trim();\n\n if (withTrim) {\n value = value.trim();\n }\n\n // Remove all duplicate spaces (including tabs, newlines, etc.)\n return value.replace(/\\s+/g, \" \");\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAyCA,MAAa,mBACX,OACA,UAAkC;CAChC,UAAU;CACV,UAAU;AACZ,MACW;CACX,IAAI,CAAC,iBAAiB,KAAK,GAAG,OAAO;CAErC,IAAI,CAAC,cAAc,OAAO,GACxB,UAAU,CAAC;CAGb,MAAM,EAAE,WAAW,OAAO,WAAW,SAAS;CAE9C,IAAI,UAAU,OAAO,MAAM,KAAK;CAEhC,IAAI,UACF,QAAQ,MAAM,KAAK;CAIrB,OAAO,MAAM,QAAQ,QAAQ,GAAG;AAClC"}
@@ -2,19 +2,19 @@
2
2
  * ========================================================================
3
3
  * @rzl-zone/utils-js
4
4
  * ------------------------------------------------------------------------
5
- * Version: `3.13.0`
5
+ * Version: `3.13.1-beta.0`
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-JGpkg5ju.cjs');
13
- const require_assertIsArray = require('../assertIsArray-BgdgVjDu.cjs');
14
- const require_isEmptyObject = require('../isEmptyObject-D-fETD_f.cjs');
15
- const require_safeStableStringify = require('../safeStableStringify-BiUOLBYo.cjs');
16
- const require_isEqual = require('../isEqual-CZxetLzm.cjs');
17
- const require_safeJsonParse = require('../safeJsonParse-v7ll9iFG.cjs');
12
+ const require_assertIsBoolean = require('../assertIsBoolean-CEx4KbHg.cjs');
13
+ const require_assertIsArray = require('../assertIsArray-CqIFmlgj.cjs');
14
+ const require_isEmptyObject = require('../isEmptyObject-C2lQyFZS.cjs');
15
+ const require_safeStableStringify = require('../safeStableStringify-4b-E_UHM.cjs');
16
+ const require_isEqual = require('../isEqual-D8W3Wizi.cjs');
17
+ const require_safeJsonParse = require('../safeJsonParse-BznDD3fi.cjs');
18
18
  const findDuplicates = (values) => {
19
19
  require_assertIsArray.assertIsArray(values, { message: ({ currentType, validType }) => `First parameter (\`values\`) must be of type \`${validType}\` (array literal or instance), but received: \`${currentType}\`.` });
20
20
  const duplicates = [];
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["isEqual","isPlainObject","isPlainObject","isNonEmptyArray","safeStableStringify","isObjectOrArray","isEmptyArray","isArray","isNaN","isUndefined","safeJsonParse"],"sources":["../../src/operations/findDuplicates.ts","../../src/operations/omitKeys.ts","../../src/operations/omitKeysDeep.ts"],"sourcesContent":["import { isEqual } from \"@/predicates/is/isEqual\";\nimport { assertIsArray } from \"@/assertions/objects/assertIsArray\";\n\n/** ----------------------------------------------------------------------\n * * ***Utility: `findDuplicates`.***\n * ----------------------------------------------------------------------\n * **Finds duplicate values in an array by deep equality comparison.**\n * - **Behavior:**\n * - Uses ***`isEqual` utility function*** to compare elements\n * (handles objects, arrays, dates, NaN, etc.).\n * - Returns a new array containing only the *first occurrences* of duplicated values.\n * - Does **not mutate** the original array.\n * - Throws ***{@link TypeError | `TypeError`}*** if input is not an array.\n * @template T Type of elements in the input array.\n * @param {T[]} values - The array to check for duplicates.\n * @returns {T[]} An array of the duplicate values found in the input,\n * preserving order of their first duplicate appearance.\n * @throws **{@link TypeError | `TypeError`}** if the provided `values` argument is not an array.\n * @example\n * findDuplicates([1, 2, 2, 3, 4, 4]);\n * // ➔ [2, 4]\n * findDuplicates([\"apple\", \"banana\", \"apple\", \"orange\"]);\n * // ➔ [\"apple\"]\n * findDuplicates([{ a: 1 }, { a: 1 }, { a: 2 }]);\n * // ➔ [{ a: 1 }]\n * findDuplicates([NaN, NaN, 1]);\n * // ➔ [NaN]\n * findDuplicates([true, false, true]);\n * // ➔ [true]\n * findDuplicates([1, 2, 3]);\n * // ➔ []\n */\nexport const findDuplicates = <T>(values: T[]): T[] => {\n assertIsArray(values, {\n message: ({ currentType, validType }) =>\n `First parameter (\\`values\\`) must be of type \\`${validType}\\` (array literal or instance), but received: \\`${currentType}\\`.`\n });\n\n const duplicates: T[] = [];\n values.forEach((item, index) => {\n for (let i = index + 1; i < values.length; i++) {\n if (isEqual(item, values[i])) {\n if (!duplicates.some((dup) => isEqual(dup, item))) {\n duplicates.push(item);\n }\n break;\n }\n }\n });\n\n return duplicates;\n};\n","import { findDuplicates } from \"./findDuplicates\";\nimport { isPlainObject } from \"@/predicates/is/isPlainObject\";\nimport { assertIsArray } from \"@/assertions/objects/assertIsArray\";\n\n/** --------------------------------\n * * ***Utility: `omitKeys`.***\n * --------------------------------\n * **This function creates a shallow copy of the given object omitting the\n * specified keys.**\n * - **Behavior:**\n * - It will return a new object without mutating the original.\n * - It also validates that ***`keysToOmit`*** does not contain duplicate keys.\n * - **ℹ️ Internally:**\n * - It uses ***`isEqual`*** to check for duplicates in\n * the ***`keysToOmit`*** array.\n * @template I The type of the input object.\n * @template K The keys to omit from the object.\n * @param {I} object - The source object to omit keys from.\n * @param {K[]} keysToOmit - An array of keys to exclude from the returned object.\n * @returns {Omit<I, K>} A new object without the specified keys.\n * @throws **{@link TypeError | `TypeError`}** if `keysToOmit` is not an array.\n * @throws **{@link Error | `Error`}** if duplicate keys are found in `keysToOmit`.\n * @example\n * omitKeys({ a: 1, b: 2, c: 3 }, [\"b\", \"c\"]);\n * //➔ { a: 1 }\n * omitKeys({ name: \"John\", age: 30 }, [\"age\"]);\n * //➔ { name: \"John\" }\n * omitKeys({ a: 1, b: 2 }, []);\n * //➔ { a: 1, b: 2 } (no changes)\n */\nexport const omitKeys = <I extends Record<string, unknown>, K extends keyof I>(\n object: I,\n keysToOmit: K[]\n): Omit<I, K> => {\n if (!isPlainObject(object)) return {} as Omit<I, K>;\n\n assertIsArray(keysToOmit, {\n message: ({ currentType, validType }) =>\n `Second parameter (\\`keysToOmit\\`) must be of type \\`${validType}\\` (array literal or instance), but received: \\`${currentType}\\`.`\n });\n\n // Check for duplicate keys\n const duplicates = findDuplicates(keysToOmit);\n if (duplicates.length > 0) {\n throw new Error(\n `Function \"omitKeys\" Error: Duplicate keys detected - \\`${duplicates}\\``\n );\n }\n\n // Remove specified keys\n return Object.fromEntries(\n Object.entries(object).filter(([key]) => !keysToOmit.includes(key as K))\n ) as Omit<I, K>;\n};\n","import type { NumberRangeUnion } from \"@rzl-zone/ts-types-plus\";\n\nimport { findDuplicates } from \"./findDuplicates\";\n\nimport { isNaN } from \"@/predicates/is/isNaN\";\nimport { isArray } from \"@/predicates/is/isArray\";\nimport { isUndefined } from \"@/predicates/is/isUndefined\";\nimport { isEmptyArray } from \"@/predicates/is/isEmptyArray\";\nimport { isPlainObject } from \"@/predicates/is/isPlainObject\";\nimport { isNonEmptyArray } from \"@/predicates/is/isNonEmptyArray\";\nimport { isObjectOrArray } from \"@/predicates/is/isObjectOrArray\";\n\nimport { assertIsArray } from \"@/assertions/objects/assertIsArray\";\n\nimport { safeJsonParse } from \"@/conversions/json/safeJsonParse\";\nimport { safeStableStringify } from \"@/conversions/stringify/safeStableStringify\";\n\ntype IndexArray = NumberRangeUnion<0, 30>;\ntype DotPath<T, Prev extends string = \"\"> =\n T extends Array<infer U>\n ? DotPath<U, `${Prev}${Prev extends \"\" ? \"\" : \".\"}${IndexArray}`>\n : T extends object\n ? {\n [K in keyof T & string]:\n | `${Prev}${Prev extends \"\" ? \"\" : \".\"}${K}`\n | DotPath<T[K], `${Prev}${Prev extends \"\" ? \"\" : \".\"}${K}`>;\n }[keyof T & string]\n : never;\n\n/** ------------------------------------------------------\n * * ***Utility: `omitKeysDeep`.***\n * ------------------------------------------------------\n * **Recursively omits properties from an object using dot notation paths.**\n * - **Behavior:**\n * - Removes resulting empty objects (`{}`) and arrays (`[]`), cascading upwards\n * to remove empty parents until root if needed.\n * - **⚠️ Be careful:**\n * - If after omission an object or array becomes empty, it will be removed entirely\n * including all the way up to the root if necessary, resulting in `{}`.\n * - **ℹ️ Note:**\n * - For array indices, TypeScript autocomplete only suggests `0`–`30`\n * (to prevent editor lag on large unions).\n * However, higher indices are still fully supported at runtime — you can\n * manually type `\"arr.99.key\"` and it will work the same.\n * @template I - Type of the input object\n * @param {I} object\n * The object to process, should be a plain nested object or array structure.\n * @param {DotPath<I>[]} keysToOmit\n * An array of string paths in dot notation indicating the properties to remove, paths\n * can include numeric indices to target array elements, e.g. `\"arr.0.x\"` to\n * remove `x` from the first object inside the `arr` array.\n * @returns {Partial<I>}\n * A new deeply cloned object with the specified keys omitted, with resulting\n * empty objects or arrays fully removed (even if it collapses to `{}`).\n * @throws **{@link TypeError | `TypeError`}** if `keysToOmit` is not an array.\n * @throws **{@link Error | `Error`}** if `keysToOmit` contains duplicate paths.\n * @example\n * omitKeysDeep({ arr: [{ a: 1 }] }, [\"arr.0.a\"]);\n * // ➔ {} (array becomes empty and removed)\n * omitKeysDeep({ a: { b: { c: 1 }, d: 2 }, e: 3 }, [\"a.b.c\"]);\n * // ➔ { a: { d: 2 }, e: 3 }\n * omitKeysDeep({ a: [{ b: 1 }, { c: 2 }] }, [\"a.0.b\"]);\n * // ➔ { a: [{ c: 2 }] }\n * omitKeysDeep({ a: [{ b: 1 }] }, [\"a.0.b\"]);\n * // ➔ {} (array becomes empty and removed)\n * omitKeysDeep({ complex: [{ deep: [{ x: 1, y: 2 }] }] }, [\"complex.0.deep.0.x\"]);\n * // ➔ { complex: [{ deep: [{ y: 2 }] }] }\n * omitKeysDeep({ complex: [{ deep: [{ x: 1 }] }] }, [\"complex.0.deep.0.x\"]);\n * // ➔ {} (deep chain emptied and collapsed)\n * omitKeysDeep({ data: [[{ foo: 1, bar: 2 }]] }, [\"data.0.0.foo\"]);\n * // ➔ { data: [[{ bar: 2 }]] }\n * omitKeysDeep({ data: [[{ foo: 1 }]] }, [\"data.0.0.foo\"]);\n * // ➔ {} (nested arrays emptied completely)\n * omitKeysDeep({ x: [{ y: [{ z: 1 }, { w: 2 }] }] }, [\"x.0.y.0.z\"]);\n * // ➔ { x: [{ y: [{ w: 2 }] }] }\n * omitKeysDeep({ x: [{ y: [{ z: 1 }] }] }, [\"x.0.y.0.z\"]);\n * // ➔ {} (entire nested arrays removed)\n * omitKeysDeep({ p: { q: { r: 5 } }, s: 6 }, [\"p.q.r\"]);\n * // ➔ { s: 6 } (`p` removed because it becomes empty)\n * omitKeysDeep({ arr: [{ a: 1, b: 2 }, { c: 3 }] }, [\"arr.0.a\"]);\n * // ➔ { arr: [{ b: 2 }, { c: 3 }] }\n * omitKeysDeep({ root: [{ sub: [{ leaf: 10 }] }] }, [\"root.0.sub.0.leaf\"]);\n * // ➔ {} (deep nested arrays emptied to root)\n * omitKeysDeep({ meta: { tags: [\"x\", \"y\"], count: 2 } }, [\"meta.count\"]);\n * // ➔ { meta: { tags: [\"x\", \"y\"] } }\n * omitKeysDeep({ arr: [[{ a: 1 }, { b: 2 }]] }, [\"arr.0.0.a\"]);\n * // ➔ { arr: [[{ b: 2 }]] }\n * omitKeysDeep({ arr: [[{ a: 1 }]] }, [\"arr.0.0.a\"]);\n * // ➔ {} (double nested emptied)\n * omitKeysDeep({ nested: [{ list: [{ id: 1, val: 2 }] }] }, [\"nested.0.list.0.val\"]);\n * // ➔ { nested: [{ list: [{ id: 1 }] }] }\n * omitKeysDeep({ nested: [{ list: [{ id: 1 }] }] }, [\"nested.0.list.0.id\"]);\n * // ➔ {} (full collapse to empty)\n * omitKeysDeep({ mixed: { a: [1, 2, 3], b: { c: 4 } } }, [\"mixed.b.c\"]);\n * // ➔ { mixed: { a: [1, 2, 3] } }\n */\nexport const omitKeysDeep = <I extends Record<string, unknown>>(\n object: I,\n keysToOmit: DotPath<I>[]\n): Partial<I> => {\n if (!isPlainObject(object)) return {} as Partial<I>;\n\n assertIsArray(keysToOmit, {\n message: ({ currentType, validType }) =>\n `Second parameter (\\`keysToOmit\\`) must be of type \\`${validType}\\` (array literal or instance), but received: \\`${currentType}\\`.`\n });\n\n const duplicates = findDuplicates(keysToOmit);\n if (isNonEmptyArray(duplicates)) {\n throw new Error(\n `Function \"omitKeysDeep\" Error: Duplicate keys detected - \\`${safeStableStringify(\n duplicates,\n {\n keepUndefined: true\n }\n )}\\`.`\n );\n }\n\n const omitAtPath = (obj: unknown, pathParts: string[]) => {\n if (!isObjectOrArray(obj)) return obj;\n\n const [current, ...rest] = pathParts;\n\n if (isEmptyArray(rest) && current) {\n if (isArray(obj)) {\n // Support numeric index\n const index = parseInt(current);\n if (!isNaN(index) && index in obj) {\n obj.splice(index, 1);\n }\n } else {\n delete obj[current];\n }\n } else {\n const next = current ? obj[current] : undefined;\n if (isObjectOrArray(next) && current) {\n obj[current] = omitAtPath(next, rest);\n }\n }\n return obj;\n };\n\n const deepRemoveEmptyObjects = (obj: unknown): unknown => {\n if (isArray(obj)) {\n return obj\n .map(deepRemoveEmptyObjects)\n .filter(\n (item) => !(isObjectOrArray(item) && Object.keys(item).length === 0)\n );\n }\n if (isObjectOrArray(obj)) {\n const cleaned = Object.fromEntries(\n Object.entries(obj)\n .map(([k, v]) => [k, deepRemoveEmptyObjects(v)])\n .filter(\n ([, v]) =>\n !isUndefined(v) &&\n !(isObjectOrArray(v) && Object.keys(v).length === 0)\n )\n );\n return cleaned;\n }\n return obj;\n };\n\n const result = safeJsonParse(safeStableStringify(object)); // clone deep to avoid mutating original\n for (const key of keysToOmit) {\n const parts = key.split(\".\");\n omitAtPath(result, parts);\n }\n\n return deepRemoveEmptyObjects(result) as Partial<I>;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCA,MAAa,kBAAqB,WAAqB;CACrD,oCAAc,QAAQ,EACpB,UAAU,EAAE,aAAa,gBACvB,kDAAkD,UAAU,kDAAkD,YAAY,MAC7H,CAAC;CAEF,MAAM,aAAkB,EAAE;CAC1B,OAAO,SAAS,MAAM,UAAU;EAC9B,KAAK,IAAI,IAAI,QAAQ,GAAG,IAAI,OAAO,QAAQ,KACzC,IAAIA,wBAAQ,MAAM,OAAO,GAAG,EAAE;GAC5B,IAAI,CAAC,WAAW,MAAM,QAAQA,wBAAQ,KAAK,KAAK,CAAC,EAC/C,WAAW,KAAK,KAAK;GAEvB;;GAGJ;CAEF,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpBT,MAAa,YACX,QACA,eACe;CACf,IAAI,CAACC,sCAAc,OAAO,EAAE,OAAO,EAAE;CAErC,oCAAc,YAAY,EACxB,UAAU,EAAE,aAAa,gBACvB,uDAAuD,UAAU,kDAAkD,YAAY,MAClI,CAAC;CAGF,MAAM,aAAa,eAAe,WAAW;CAC7C,IAAI,WAAW,SAAS,GACtB,MAAM,IAAI,MACR,0DAA0D,WAAW,IACtE;CAIH,OAAO,OAAO,YACZ,OAAO,QAAQ,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,SAAS,IAAS,CAAC,CACzE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC4CH,MAAa,gBACX,QACA,eACe;CACf,IAAI,CAACC,sCAAc,OAAO,EAAE,OAAO,EAAE;CAErC,oCAAc,YAAY,EACxB,UAAU,EAAE,aAAa,gBACvB,uDAAuD,UAAU,kDAAkD,YAAY,MAClI,CAAC;CAEF,MAAM,aAAa,eAAe,WAAW;CAC7C,IAAIC,wCAAgB,WAAW,EAC7B,MAAM,IAAI,MACR,8DAA8DC,gDAC5D,YACA,EACE,eAAe,MAChB,CACF,CAAC,KACH;CAGH,MAAM,cAAc,KAAc,cAAwB;EACxD,IAAI,CAACC,wCAAgB,IAAI,EAAE,OAAO;EAElC,MAAM,CAAC,SAAS,GAAG,QAAQ;EAE3B,IAAIC,mCAAa,KAAK,IAAI,SACxB,IAAIC,gCAAQ,IAAI,EAAE;GAEhB,MAAM,QAAQ,SAAS,QAAQ;GAC/B,IAAI,CAACC,8BAAM,MAAM,IAAI,SAAS,KAC5B,IAAI,OAAO,OAAO,EAAE;SAGtB,OAAO,IAAI;OAER;GACL,MAAM,OAAO,UAAU,IAAI,WAAW;GACtC,IAAIH,wCAAgB,KAAK,IAAI,SAC3B,IAAI,WAAW,WAAW,MAAM,KAAK;;EAGzC,OAAO;;CAGT,MAAM,0BAA0B,QAA0B;EACxD,IAAIE,gCAAQ,IAAI,EACd,OAAO,IACJ,IAAI,uBAAuB,CAC3B,QACE,SAAS,EAAEF,wCAAgB,KAAK,IAAI,OAAO,KAAK,KAAK,CAAC,WAAW,GACnE;EAEL,IAAIA,wCAAgB,IAAI,EAUtB,OATgB,OAAO,YACrB,OAAO,QAAQ,IAAI,CAChB,KAAK,CAAC,GAAG,OAAO,CAAC,GAAG,uBAAuB,EAAE,CAAC,CAAC,CAC/C,QACE,GAAG,OACF,CAACI,oCAAY,EAAE,IACf,EAAEJ,wCAAgB,EAAE,IAAI,OAAO,KAAK,EAAE,CAAC,WAAW,GACrD,CAES;EAEhB,OAAO;;CAGT,MAAM,SAASK,oCAAcN,gDAAoB,OAAO,CAAC;CACzD,KAAK,MAAM,OAAO,YAEhB,WAAW,QADG,IAAI,MAAM,IACA,CAAC;CAG3B,OAAO,uBAAuB,OAAO"}
1
+ {"version":3,"file":"index.cjs","names":["isEqual","isPlainObject","isPlainObject","isNonEmptyArray","safeStableStringify","isObjectOrArray","isEmptyArray","isArray","isNaN","isUndefined","safeJsonParse"],"sources":["../../src/operations/findDuplicates.ts","../../src/operations/omitKeys.ts","../../src/operations/omitKeysDeep.ts"],"sourcesContent":["import { isEqual } from \"@/predicates/is/isEqual\";\nimport { assertIsArray } from \"@/assertions/objects/assertIsArray\";\n\n/** ----------------------------------------------------------------------\n * * ***Utility: `findDuplicates`.***\n * ----------------------------------------------------------------------\n * **Finds duplicate values in an array by deep equality comparison.**\n * - **Behavior:**\n * - Uses ***`isEqual` utility function*** to compare elements\n * (handles objects, arrays, dates, NaN, etc.).\n * - Returns a new array containing only the *first occurrences* of duplicated values.\n * - Does **not mutate** the original array.\n * - Throws ***{@link TypeError | `TypeError`}*** if input is not an array.\n * @template T Type of elements in the input array.\n * @param {T[]} values - The array to check for duplicates.\n * @returns {T[]} An array of the duplicate values found in the input,\n * preserving order of their first duplicate appearance.\n * @throws **{@link TypeError | `TypeError`}** if the provided `values` argument is not an array.\n * @example\n * findDuplicates([1, 2, 2, 3, 4, 4]);\n * // ➔ [2, 4]\n * findDuplicates([\"apple\", \"banana\", \"apple\", \"orange\"]);\n * // ➔ [\"apple\"]\n * findDuplicates([{ a: 1 }, { a: 1 }, { a: 2 }]);\n * // ➔ [{ a: 1 }]\n * findDuplicates([NaN, NaN, 1]);\n * // ➔ [NaN]\n * findDuplicates([true, false, true]);\n * // ➔ [true]\n * findDuplicates([1, 2, 3]);\n * // ➔ []\n */\nexport const findDuplicates = <T>(values: T[]): T[] => {\n assertIsArray(values, {\n message: ({ currentType, validType }) =>\n `First parameter (\\`values\\`) must be of type \\`${validType}\\` (array literal or instance), but received: \\`${currentType}\\`.`\n });\n\n const duplicates: T[] = [];\n values.forEach((item, index) => {\n for (let i = index + 1; i < values.length; i++) {\n if (isEqual(item, values[i])) {\n if (!duplicates.some((dup) => isEqual(dup, item))) {\n duplicates.push(item);\n }\n break;\n }\n }\n });\n\n return duplicates;\n};\n","import { findDuplicates } from \"./findDuplicates\";\nimport { isPlainObject } from \"@/predicates/is/isPlainObject\";\nimport { assertIsArray } from \"@/assertions/objects/assertIsArray\";\n\n/** --------------------------------\n * * ***Utility: `omitKeys`.***\n * --------------------------------\n * **This function creates a shallow copy of the given object omitting the\n * specified keys.**\n * - **Behavior:**\n * - It will return a new object without mutating the original.\n * - It also validates that ***`keysToOmit`*** does not contain duplicate keys.\n * - **ℹ️ Internally:**\n * - It uses ***`isEqual`*** to check for duplicates in\n * the ***`keysToOmit`*** array.\n * @template I The type of the input object.\n * @template K The keys to omit from the object.\n * @param {I} object - The source object to omit keys from.\n * @param {K[]} keysToOmit - An array of keys to exclude from the returned object.\n * @returns {Omit<I, K>} A new object without the specified keys.\n * @throws **{@link TypeError | `TypeError`}** if `keysToOmit` is not an array.\n * @throws **{@link Error | `Error`}** if duplicate keys are found in `keysToOmit`.\n * @example\n * omitKeys({ a: 1, b: 2, c: 3 }, [\"b\", \"c\"]);\n * //➔ { a: 1 }\n * omitKeys({ name: \"John\", age: 30 }, [\"age\"]);\n * //➔ { name: \"John\" }\n * omitKeys({ a: 1, b: 2 }, []);\n * //➔ { a: 1, b: 2 } (no changes)\n */\nexport const omitKeys = <I extends Record<string, unknown>, K extends keyof I>(\n object: I,\n keysToOmit: K[]\n): Omit<I, K> => {\n if (!isPlainObject(object)) return {} as Omit<I, K>;\n\n assertIsArray(keysToOmit, {\n message: ({ currentType, validType }) =>\n `Second parameter (\\`keysToOmit\\`) must be of type \\`${validType}\\` (array literal or instance), but received: \\`${currentType}\\`.`\n });\n\n // Check for duplicate keys\n const duplicates = findDuplicates(keysToOmit);\n if (duplicates.length > 0) {\n throw new Error(\n `Function \"omitKeys\" Error: Duplicate keys detected - \\`${duplicates}\\``\n );\n }\n\n // Remove specified keys\n return Object.fromEntries(\n Object.entries(object).filter(([key]) => !keysToOmit.includes(key as K))\n ) as Omit<I, K>;\n};\n","import type { NumberRangeUnion } from \"@rzl-zone/ts-types-plus\";\n\nimport { findDuplicates } from \"./findDuplicates\";\n\nimport { isNaN } from \"@/predicates/is/isNaN\";\nimport { isArray } from \"@/predicates/is/isArray\";\nimport { isUndefined } from \"@/predicates/is/isUndefined\";\nimport { isEmptyArray } from \"@/predicates/is/isEmptyArray\";\nimport { isPlainObject } from \"@/predicates/is/isPlainObject\";\nimport { isNonEmptyArray } from \"@/predicates/is/isNonEmptyArray\";\nimport { isObjectOrArray } from \"@/predicates/is/isObjectOrArray\";\n\nimport { assertIsArray } from \"@/assertions/objects/assertIsArray\";\n\nimport { safeJsonParse } from \"@/conversions/json/safeJsonParse\";\nimport { safeStableStringify } from \"@/conversions/stringify/safeStableStringify\";\n\ntype IndexArray = NumberRangeUnion<0, 30>;\ntype DotPath<T, Prev extends string = \"\"> =\n T extends Array<infer U>\n ? DotPath<U, `${Prev}${Prev extends \"\" ? \"\" : \".\"}${IndexArray}`>\n : T extends object\n ? {\n [K in keyof T & string]:\n | `${Prev}${Prev extends \"\" ? \"\" : \".\"}${K}`\n | DotPath<T[K], `${Prev}${Prev extends \"\" ? \"\" : \".\"}${K}`>;\n }[keyof T & string]\n : never;\n\n/** ------------------------------------------------------\n * * ***Utility: `omitKeysDeep`.***\n * ------------------------------------------------------\n * **Recursively omits properties from an object using dot notation paths.**\n * - **Behavior:**\n * - Removes resulting empty objects (`{}`) and arrays (`[]`), cascading upwards\n * to remove empty parents until root if needed.\n * - **⚠️ Be careful:**\n * - If after omission an object or array becomes empty, it will be removed entirely\n * including all the way up to the root if necessary, resulting in `{}`.\n * - **ℹ️ Note:**\n * - For array indices, TypeScript autocomplete only suggests `0`–`30`\n * (to prevent editor lag on large unions).\n * However, higher indices are still fully supported at runtime — you can\n * manually type `\"arr.99.key\"` and it will work the same.\n * @template I - Type of the input object\n * @param {I} object\n * The object to process, should be a plain nested object or array structure.\n * @param {DotPath<I>[]} keysToOmit\n * An array of string paths in dot notation indicating the properties to remove, paths\n * can include numeric indices to target array elements, e.g. `\"arr.0.x\"` to\n * remove `x` from the first object inside the `arr` array.\n * @returns {Partial<I>}\n * A new deeply cloned object with the specified keys omitted, with resulting\n * empty objects or arrays fully removed (even if it collapses to `{}`).\n * @throws **{@link TypeError | `TypeError`}** if `keysToOmit` is not an array.\n * @throws **{@link Error | `Error`}** if `keysToOmit` contains duplicate paths.\n * @example\n * omitKeysDeep({ arr: [{ a: 1 }] }, [\"arr.0.a\"]);\n * // ➔ {} (array becomes empty and removed)\n * omitKeysDeep({ a: { b: { c: 1 }, d: 2 }, e: 3 }, [\"a.b.c\"]);\n * // ➔ { a: { d: 2 }, e: 3 }\n * omitKeysDeep({ a: [{ b: 1 }, { c: 2 }] }, [\"a.0.b\"]);\n * // ➔ { a: [{ c: 2 }] }\n * omitKeysDeep({ a: [{ b: 1 }] }, [\"a.0.b\"]);\n * // ➔ {} (array becomes empty and removed)\n * omitKeysDeep({ complex: [{ deep: [{ x: 1, y: 2 }] }] }, [\"complex.0.deep.0.x\"]);\n * // ➔ { complex: [{ deep: [{ y: 2 }] }] }\n * omitKeysDeep({ complex: [{ deep: [{ x: 1 }] }] }, [\"complex.0.deep.0.x\"]);\n * // ➔ {} (deep chain emptied and collapsed)\n * omitKeysDeep({ data: [[{ foo: 1, bar: 2 }]] }, [\"data.0.0.foo\"]);\n * // ➔ { data: [[{ bar: 2 }]] }\n * omitKeysDeep({ data: [[{ foo: 1 }]] }, [\"data.0.0.foo\"]);\n * // ➔ {} (nested arrays emptied completely)\n * omitKeysDeep({ x: [{ y: [{ z: 1 }, { w: 2 }] }] }, [\"x.0.y.0.z\"]);\n * // ➔ { x: [{ y: [{ w: 2 }] }] }\n * omitKeysDeep({ x: [{ y: [{ z: 1 }] }] }, [\"x.0.y.0.z\"]);\n * // ➔ {} (entire nested arrays removed)\n * omitKeysDeep({ p: { q: { r: 5 } }, s: 6 }, [\"p.q.r\"]);\n * // ➔ { s: 6 } (`p` removed because it becomes empty)\n * omitKeysDeep({ arr: [{ a: 1, b: 2 }, { c: 3 }] }, [\"arr.0.a\"]);\n * // ➔ { arr: [{ b: 2 }, { c: 3 }] }\n * omitKeysDeep({ root: [{ sub: [{ leaf: 10 }] }] }, [\"root.0.sub.0.leaf\"]);\n * // ➔ {} (deep nested arrays emptied to root)\n * omitKeysDeep({ meta: { tags: [\"x\", \"y\"], count: 2 } }, [\"meta.count\"]);\n * // ➔ { meta: { tags: [\"x\", \"y\"] } }\n * omitKeysDeep({ arr: [[{ a: 1 }, { b: 2 }]] }, [\"arr.0.0.a\"]);\n * // ➔ { arr: [[{ b: 2 }]] }\n * omitKeysDeep({ arr: [[{ a: 1 }]] }, [\"arr.0.0.a\"]);\n * // ➔ {} (double nested emptied)\n * omitKeysDeep({ nested: [{ list: [{ id: 1, val: 2 }] }] }, [\"nested.0.list.0.val\"]);\n * // ➔ { nested: [{ list: [{ id: 1 }] }] }\n * omitKeysDeep({ nested: [{ list: [{ id: 1 }] }] }, [\"nested.0.list.0.id\"]);\n * // ➔ {} (full collapse to empty)\n * omitKeysDeep({ mixed: { a: [1, 2, 3], b: { c: 4 } } }, [\"mixed.b.c\"]);\n * // ➔ { mixed: { a: [1, 2, 3] } }\n */\nexport const omitKeysDeep = <I extends Record<string, unknown>>(\n object: I,\n keysToOmit: DotPath<I>[]\n): Partial<I> => {\n if (!isPlainObject(object)) return {} as Partial<I>;\n\n assertIsArray(keysToOmit, {\n message: ({ currentType, validType }) =>\n `Second parameter (\\`keysToOmit\\`) must be of type \\`${validType}\\` (array literal or instance), but received: \\`${currentType}\\`.`\n });\n\n const duplicates = findDuplicates(keysToOmit);\n if (isNonEmptyArray(duplicates)) {\n throw new Error(\n `Function \"omitKeysDeep\" Error: Duplicate keys detected - \\`${safeStableStringify(\n duplicates,\n {\n keepUndefined: true\n }\n )}\\`.`\n );\n }\n\n const omitAtPath = (obj: unknown, pathParts: string[]) => {\n if (!isObjectOrArray(obj)) return obj;\n\n const [current, ...rest] = pathParts;\n\n if (isEmptyArray(rest) && current) {\n if (isArray(obj)) {\n // Support numeric index\n const index = parseInt(current);\n if (!isNaN(index) && index in obj) {\n obj.splice(index, 1);\n }\n } else {\n delete obj[current];\n }\n } else {\n const next = current ? obj[current] : undefined;\n if (isObjectOrArray(next) && current) {\n obj[current] = omitAtPath(next, rest);\n }\n }\n return obj;\n };\n\n const deepRemoveEmptyObjects = (obj: unknown): unknown => {\n if (isArray(obj)) {\n return obj\n .map(deepRemoveEmptyObjects)\n .filter(\n (item) => !(isObjectOrArray(item) && Object.keys(item).length === 0)\n );\n }\n if (isObjectOrArray(obj)) {\n const cleaned = Object.fromEntries(\n Object.entries(obj)\n .map(([k, v]) => [k, deepRemoveEmptyObjects(v)])\n .filter(\n ([, v]) =>\n !isUndefined(v) &&\n !(isObjectOrArray(v) && Object.keys(v).length === 0)\n )\n );\n return cleaned;\n }\n return obj;\n };\n\n const result = safeJsonParse(safeStableStringify(object)); // clone deep to avoid mutating original\n for (const key of keysToOmit) {\n const parts = key.split(\".\");\n omitAtPath(result, parts);\n }\n\n return deepRemoveEmptyObjects(result) as Partial<I>;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCA,MAAa,kBAAqB,WAAqB;CACrD,oCAAc,QAAQ,EACpB,UAAU,EAAE,aAAa,gBACvB,kDAAkD,UAAU,kDAAkD,YAAY,KAC9H,CAAC;CAED,MAAM,aAAkB,CAAC;CACzB,OAAO,SAAS,MAAM,UAAU;EAC9B,KAAK,IAAI,IAAI,QAAQ,GAAG,IAAI,OAAO,QAAQ,KACzC,IAAIA,wBAAQ,MAAM,OAAO,EAAE,GAAG;GAC5B,IAAI,CAAC,WAAW,MAAM,QAAQA,wBAAQ,KAAK,IAAI,CAAC,GAC9C,WAAW,KAAK,IAAI;GAEtB;EACF;CAEJ,CAAC;CAED,OAAO;AACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACrBA,MAAa,YACX,QACA,eACe;CACf,IAAI,CAACC,sCAAc,MAAM,GAAG,OAAO,CAAC;CAEpC,oCAAc,YAAY,EACxB,UAAU,EAAE,aAAa,gBACvB,uDAAuD,UAAU,kDAAkD,YAAY,KACnI,CAAC;CAGD,MAAM,aAAa,eAAe,UAAU;CAC5C,IAAI,WAAW,SAAS,GACtB,MAAM,IAAI,MACR,0DAA0D,WAAW,GACvE;CAIF,OAAO,OAAO,YACZ,OAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,WAAW,SAAS,GAAQ,CAAC,CACzE;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC2CA,MAAa,gBACX,QACA,eACe;CACf,IAAI,CAACC,sCAAc,MAAM,GAAG,OAAO,CAAC;CAEpC,oCAAc,YAAY,EACxB,UAAU,EAAE,aAAa,gBACvB,uDAAuD,UAAU,kDAAkD,YAAY,KACnI,CAAC;CAED,MAAM,aAAa,eAAe,UAAU;CAC5C,IAAIC,wCAAgB,UAAU,GAC5B,MAAM,IAAI,MACR,8DAA8DC,gDAC5D,YACA,EACE,eAAe,KACjB,CACF,EAAE,IACJ;CAGF,MAAM,cAAc,KAAc,cAAwB;EACxD,IAAI,CAACC,wCAAgB,GAAG,GAAG,OAAO;EAElC,MAAM,CAAC,SAAS,GAAG,QAAQ;EAE3B,IAAIC,mCAAa,IAAI,KAAK,SACxB,IAAIC,gCAAQ,GAAG,GAAG;GAEhB,MAAM,QAAQ,SAAS,OAAO;GAC9B,IAAI,CAACC,8BAAM,KAAK,KAAK,SAAS,KAC5B,IAAI,OAAO,OAAO,CAAC;EAEvB,OACE,OAAO,IAAI;OAER;GACL,MAAM,OAAO,UAAU,IAAI,WAAW;GACtC,IAAIH,wCAAgB,IAAI,KAAK,SAC3B,IAAI,WAAW,WAAW,MAAM,IAAI;EAExC;EACA,OAAO;CACT;CAEA,MAAM,0BAA0B,QAA0B;EACxD,IAAIE,gCAAQ,GAAG,GACb,OAAO,IACJ,IAAI,sBAAsB,EAC1B,QACE,SAAS,EAAEF,wCAAgB,IAAI,KAAK,OAAO,KAAK,IAAI,EAAE,WAAW,EACpE;EAEJ,IAAIA,wCAAgB,GAAG,GAUrB,OATgB,OAAO,YACrB,OAAO,QAAQ,GAAG,EACf,KAAK,CAAC,GAAG,OAAO,CAAC,GAAG,uBAAuB,CAAC,CAAC,CAAC,EAC9C,QACE,GAAG,OACF,CAACI,oCAAY,CAAC,KACd,EAAEJ,wCAAgB,CAAC,KAAK,OAAO,KAAK,CAAC,EAAE,WAAW,EACtD,CAES;EAEf,OAAO;CACT;CAEA,MAAM,SAASK,oCAAcN,gDAAoB,MAAM,CAAC;CACxD,KAAK,MAAM,OAAO,YAEhB,WAAW,QADG,IAAI,MAAM,GACD,CAAC;CAG1B,OAAO,uBAAuB,MAAM;AACtC"}
@@ -2,7 +2,7 @@
2
2
  * ========================================================================
3
3
  * @rzl-zone/utils-js
4
4
  * ------------------------------------------------------------------------
5
- * Version: `3.13.0`
5
+ * Version: `3.13.1-beta.0`
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
  * ========================================================================
@@ -2,7 +2,7 @@
2
2
  * ========================================================================
3
3
  * @rzl-zone/utils-js
4
4
  * ------------------------------------------------------------------------
5
- * Version: `3.13.0`
5
+ * Version: `3.13.1-beta.0`
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
  * ========================================================================
@@ -2,17 +2,17 @@
2
2
  * ========================================================================
3
3
  * @rzl-zone/utils-js
4
4
  * ------------------------------------------------------------------------
5
- * Version: `3.13.0`
5
+ * Version: `3.13.1-beta.0`
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 { A as isPlainObject, D as isNaN, M as isArray, S as isUndefined, p as isNonEmptyArray, x as isObjectOrArray } from "../assertIsBoolean-9-huIcIR.js";
11
- import { t as assertIsArray } from "../assertIsArray-hZyYKvLb.js";
12
- import { n as isEmptyArray } from "../isEmptyObject-CZsFdN7x.js";
13
- import { t as safeStableStringify } from "../safeStableStringify-C5Gc3ZED.js";
14
- import { t as isEqual } from "../isEqual-Dc8fNB2J.js";
15
- import { t as safeJsonParse } from "../safeJsonParse-BxOZgGy7.js";
10
+ import { A as isPlainObject, D as isNaN, M as isArray, S as isUndefined, p as isNonEmptyArray, x as isObjectOrArray } from "../assertIsBoolean-DDhQ2D-k.js";
11
+ import { t as assertIsArray } from "../assertIsArray-DrLORH0Y.js";
12
+ import { n as isEmptyArray } from "../isEmptyObject-BYNnSKzw.js";
13
+ import { t as safeStableStringify } from "../safeStableStringify-BLwA1VC-.js";
14
+ import { t as isEqual } from "../isEqual-ekId-j5b.js";
15
+ import { t as safeJsonParse } from "../safeJsonParse-D8H3wCv7.js";
16
16
  const findDuplicates = (values) => {
17
17
  assertIsArray(values, { message: ({ currentType, validType }) => `First parameter (\`values\`) must be of type \`${validType}\` (array literal or instance), but received: \`${currentType}\`.` });
18
18
  const duplicates = [];
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":[],"sources":["../../src/operations/findDuplicates.ts","../../src/operations/omitKeys.ts","../../src/operations/omitKeysDeep.ts"],"sourcesContent":["import { isEqual } from \"@/predicates/is/isEqual\";\nimport { assertIsArray } from \"@/assertions/objects/assertIsArray\";\n\n/** ----------------------------------------------------------------------\n * * ***Utility: `findDuplicates`.***\n * ----------------------------------------------------------------------\n * **Finds duplicate values in an array by deep equality comparison.**\n * - **Behavior:**\n * - Uses ***`isEqual` utility function*** to compare elements\n * (handles objects, arrays, dates, NaN, etc.).\n * - Returns a new array containing only the *first occurrences* of duplicated values.\n * - Does **not mutate** the original array.\n * - Throws ***{@link TypeError | `TypeError`}*** if input is not an array.\n * @template T Type of elements in the input array.\n * @param {T[]} values - The array to check for duplicates.\n * @returns {T[]} An array of the duplicate values found in the input,\n * preserving order of their first duplicate appearance.\n * @throws **{@link TypeError | `TypeError`}** if the provided `values` argument is not an array.\n * @example\n * findDuplicates([1, 2, 2, 3, 4, 4]);\n * // ➔ [2, 4]\n * findDuplicates([\"apple\", \"banana\", \"apple\", \"orange\"]);\n * // ➔ [\"apple\"]\n * findDuplicates([{ a: 1 }, { a: 1 }, { a: 2 }]);\n * // ➔ [{ a: 1 }]\n * findDuplicates([NaN, NaN, 1]);\n * // ➔ [NaN]\n * findDuplicates([true, false, true]);\n * // ➔ [true]\n * findDuplicates([1, 2, 3]);\n * // ➔ []\n */\nexport const findDuplicates = <T>(values: T[]): T[] => {\n assertIsArray(values, {\n message: ({ currentType, validType }) =>\n `First parameter (\\`values\\`) must be of type \\`${validType}\\` (array literal or instance), but received: \\`${currentType}\\`.`\n });\n\n const duplicates: T[] = [];\n values.forEach((item, index) => {\n for (let i = index + 1; i < values.length; i++) {\n if (isEqual(item, values[i])) {\n if (!duplicates.some((dup) => isEqual(dup, item))) {\n duplicates.push(item);\n }\n break;\n }\n }\n });\n\n return duplicates;\n};\n","import { findDuplicates } from \"./findDuplicates\";\nimport { isPlainObject } from \"@/predicates/is/isPlainObject\";\nimport { assertIsArray } from \"@/assertions/objects/assertIsArray\";\n\n/** --------------------------------\n * * ***Utility: `omitKeys`.***\n * --------------------------------\n * **This function creates a shallow copy of the given object omitting the\n * specified keys.**\n * - **Behavior:**\n * - It will return a new object without mutating the original.\n * - It also validates that ***`keysToOmit`*** does not contain duplicate keys.\n * - **ℹ️ Internally:**\n * - It uses ***`isEqual`*** to check for duplicates in\n * the ***`keysToOmit`*** array.\n * @template I The type of the input object.\n * @template K The keys to omit from the object.\n * @param {I} object - The source object to omit keys from.\n * @param {K[]} keysToOmit - An array of keys to exclude from the returned object.\n * @returns {Omit<I, K>} A new object without the specified keys.\n * @throws **{@link TypeError | `TypeError`}** if `keysToOmit` is not an array.\n * @throws **{@link Error | `Error`}** if duplicate keys are found in `keysToOmit`.\n * @example\n * omitKeys({ a: 1, b: 2, c: 3 }, [\"b\", \"c\"]);\n * //➔ { a: 1 }\n * omitKeys({ name: \"John\", age: 30 }, [\"age\"]);\n * //➔ { name: \"John\" }\n * omitKeys({ a: 1, b: 2 }, []);\n * //➔ { a: 1, b: 2 } (no changes)\n */\nexport const omitKeys = <I extends Record<string, unknown>, K extends keyof I>(\n object: I,\n keysToOmit: K[]\n): Omit<I, K> => {\n if (!isPlainObject(object)) return {} as Omit<I, K>;\n\n assertIsArray(keysToOmit, {\n message: ({ currentType, validType }) =>\n `Second parameter (\\`keysToOmit\\`) must be of type \\`${validType}\\` (array literal or instance), but received: \\`${currentType}\\`.`\n });\n\n // Check for duplicate keys\n const duplicates = findDuplicates(keysToOmit);\n if (duplicates.length > 0) {\n throw new Error(\n `Function \"omitKeys\" Error: Duplicate keys detected - \\`${duplicates}\\``\n );\n }\n\n // Remove specified keys\n return Object.fromEntries(\n Object.entries(object).filter(([key]) => !keysToOmit.includes(key as K))\n ) as Omit<I, K>;\n};\n","import type { NumberRangeUnion } from \"@rzl-zone/ts-types-plus\";\n\nimport { findDuplicates } from \"./findDuplicates\";\n\nimport { isNaN } from \"@/predicates/is/isNaN\";\nimport { isArray } from \"@/predicates/is/isArray\";\nimport { isUndefined } from \"@/predicates/is/isUndefined\";\nimport { isEmptyArray } from \"@/predicates/is/isEmptyArray\";\nimport { isPlainObject } from \"@/predicates/is/isPlainObject\";\nimport { isNonEmptyArray } from \"@/predicates/is/isNonEmptyArray\";\nimport { isObjectOrArray } from \"@/predicates/is/isObjectOrArray\";\n\nimport { assertIsArray } from \"@/assertions/objects/assertIsArray\";\n\nimport { safeJsonParse } from \"@/conversions/json/safeJsonParse\";\nimport { safeStableStringify } from \"@/conversions/stringify/safeStableStringify\";\n\ntype IndexArray = NumberRangeUnion<0, 30>;\ntype DotPath<T, Prev extends string = \"\"> =\n T extends Array<infer U>\n ? DotPath<U, `${Prev}${Prev extends \"\" ? \"\" : \".\"}${IndexArray}`>\n : T extends object\n ? {\n [K in keyof T & string]:\n | `${Prev}${Prev extends \"\" ? \"\" : \".\"}${K}`\n | DotPath<T[K], `${Prev}${Prev extends \"\" ? \"\" : \".\"}${K}`>;\n }[keyof T & string]\n : never;\n\n/** ------------------------------------------------------\n * * ***Utility: `omitKeysDeep`.***\n * ------------------------------------------------------\n * **Recursively omits properties from an object using dot notation paths.**\n * - **Behavior:**\n * - Removes resulting empty objects (`{}`) and arrays (`[]`), cascading upwards\n * to remove empty parents until root if needed.\n * - **⚠️ Be careful:**\n * - If after omission an object or array becomes empty, it will be removed entirely\n * including all the way up to the root if necessary, resulting in `{}`.\n * - **ℹ️ Note:**\n * - For array indices, TypeScript autocomplete only suggests `0`–`30`\n * (to prevent editor lag on large unions).\n * However, higher indices are still fully supported at runtime — you can\n * manually type `\"arr.99.key\"` and it will work the same.\n * @template I - Type of the input object\n * @param {I} object\n * The object to process, should be a plain nested object or array structure.\n * @param {DotPath<I>[]} keysToOmit\n * An array of string paths in dot notation indicating the properties to remove, paths\n * can include numeric indices to target array elements, e.g. `\"arr.0.x\"` to\n * remove `x` from the first object inside the `arr` array.\n * @returns {Partial<I>}\n * A new deeply cloned object with the specified keys omitted, with resulting\n * empty objects or arrays fully removed (even if it collapses to `{}`).\n * @throws **{@link TypeError | `TypeError`}** if `keysToOmit` is not an array.\n * @throws **{@link Error | `Error`}** if `keysToOmit` contains duplicate paths.\n * @example\n * omitKeysDeep({ arr: [{ a: 1 }] }, [\"arr.0.a\"]);\n * // ➔ {} (array becomes empty and removed)\n * omitKeysDeep({ a: { b: { c: 1 }, d: 2 }, e: 3 }, [\"a.b.c\"]);\n * // ➔ { a: { d: 2 }, e: 3 }\n * omitKeysDeep({ a: [{ b: 1 }, { c: 2 }] }, [\"a.0.b\"]);\n * // ➔ { a: [{ c: 2 }] }\n * omitKeysDeep({ a: [{ b: 1 }] }, [\"a.0.b\"]);\n * // ➔ {} (array becomes empty and removed)\n * omitKeysDeep({ complex: [{ deep: [{ x: 1, y: 2 }] }] }, [\"complex.0.deep.0.x\"]);\n * // ➔ { complex: [{ deep: [{ y: 2 }] }] }\n * omitKeysDeep({ complex: [{ deep: [{ x: 1 }] }] }, [\"complex.0.deep.0.x\"]);\n * // ➔ {} (deep chain emptied and collapsed)\n * omitKeysDeep({ data: [[{ foo: 1, bar: 2 }]] }, [\"data.0.0.foo\"]);\n * // ➔ { data: [[{ bar: 2 }]] }\n * omitKeysDeep({ data: [[{ foo: 1 }]] }, [\"data.0.0.foo\"]);\n * // ➔ {} (nested arrays emptied completely)\n * omitKeysDeep({ x: [{ y: [{ z: 1 }, { w: 2 }] }] }, [\"x.0.y.0.z\"]);\n * // ➔ { x: [{ y: [{ w: 2 }] }] }\n * omitKeysDeep({ x: [{ y: [{ z: 1 }] }] }, [\"x.0.y.0.z\"]);\n * // ➔ {} (entire nested arrays removed)\n * omitKeysDeep({ p: { q: { r: 5 } }, s: 6 }, [\"p.q.r\"]);\n * // ➔ { s: 6 } (`p` removed because it becomes empty)\n * omitKeysDeep({ arr: [{ a: 1, b: 2 }, { c: 3 }] }, [\"arr.0.a\"]);\n * // ➔ { arr: [{ b: 2 }, { c: 3 }] }\n * omitKeysDeep({ root: [{ sub: [{ leaf: 10 }] }] }, [\"root.0.sub.0.leaf\"]);\n * // ➔ {} (deep nested arrays emptied to root)\n * omitKeysDeep({ meta: { tags: [\"x\", \"y\"], count: 2 } }, [\"meta.count\"]);\n * // ➔ { meta: { tags: [\"x\", \"y\"] } }\n * omitKeysDeep({ arr: [[{ a: 1 }, { b: 2 }]] }, [\"arr.0.0.a\"]);\n * // ➔ { arr: [[{ b: 2 }]] }\n * omitKeysDeep({ arr: [[{ a: 1 }]] }, [\"arr.0.0.a\"]);\n * // ➔ {} (double nested emptied)\n * omitKeysDeep({ nested: [{ list: [{ id: 1, val: 2 }] }] }, [\"nested.0.list.0.val\"]);\n * // ➔ { nested: [{ list: [{ id: 1 }] }] }\n * omitKeysDeep({ nested: [{ list: [{ id: 1 }] }] }, [\"nested.0.list.0.id\"]);\n * // ➔ {} (full collapse to empty)\n * omitKeysDeep({ mixed: { a: [1, 2, 3], b: { c: 4 } } }, [\"mixed.b.c\"]);\n * // ➔ { mixed: { a: [1, 2, 3] } }\n */\nexport const omitKeysDeep = <I extends Record<string, unknown>>(\n object: I,\n keysToOmit: DotPath<I>[]\n): Partial<I> => {\n if (!isPlainObject(object)) return {} as Partial<I>;\n\n assertIsArray(keysToOmit, {\n message: ({ currentType, validType }) =>\n `Second parameter (\\`keysToOmit\\`) must be of type \\`${validType}\\` (array literal or instance), but received: \\`${currentType}\\`.`\n });\n\n const duplicates = findDuplicates(keysToOmit);\n if (isNonEmptyArray(duplicates)) {\n throw new Error(\n `Function \"omitKeysDeep\" Error: Duplicate keys detected - \\`${safeStableStringify(\n duplicates,\n {\n keepUndefined: true\n }\n )}\\`.`\n );\n }\n\n const omitAtPath = (obj: unknown, pathParts: string[]) => {\n if (!isObjectOrArray(obj)) return obj;\n\n const [current, ...rest] = pathParts;\n\n if (isEmptyArray(rest) && current) {\n if (isArray(obj)) {\n // Support numeric index\n const index = parseInt(current);\n if (!isNaN(index) && index in obj) {\n obj.splice(index, 1);\n }\n } else {\n delete obj[current];\n }\n } else {\n const next = current ? obj[current] : undefined;\n if (isObjectOrArray(next) && current) {\n obj[current] = omitAtPath(next, rest);\n }\n }\n return obj;\n };\n\n const deepRemoveEmptyObjects = (obj: unknown): unknown => {\n if (isArray(obj)) {\n return obj\n .map(deepRemoveEmptyObjects)\n .filter(\n (item) => !(isObjectOrArray(item) && Object.keys(item).length === 0)\n );\n }\n if (isObjectOrArray(obj)) {\n const cleaned = Object.fromEntries(\n Object.entries(obj)\n .map(([k, v]) => [k, deepRemoveEmptyObjects(v)])\n .filter(\n ([, v]) =>\n !isUndefined(v) &&\n !(isObjectOrArray(v) && Object.keys(v).length === 0)\n )\n );\n return cleaned;\n }\n return obj;\n };\n\n const result = safeJsonParse(safeStableStringify(object)); // clone deep to avoid mutating original\n for (const key of keysToOmit) {\n const parts = key.split(\".\");\n omitAtPath(result, parts);\n }\n\n return deepRemoveEmptyObjects(result) as Partial<I>;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCA,MAAa,kBAAqB,WAAqB;CACrD,cAAc,QAAQ,EACpB,UAAU,EAAE,aAAa,gBACvB,kDAAkD,UAAU,kDAAkD,YAAY,MAC7H,CAAC;CAEF,MAAM,aAAkB,EAAE;CAC1B,OAAO,SAAS,MAAM,UAAU;EAC9B,KAAK,IAAI,IAAI,QAAQ,GAAG,IAAI,OAAO,QAAQ,KACzC,IAAI,QAAQ,MAAM,OAAO,GAAG,EAAE;GAC5B,IAAI,CAAC,WAAW,MAAM,QAAQ,QAAQ,KAAK,KAAK,CAAC,EAC/C,WAAW,KAAK,KAAK;GAEvB;;GAGJ;CAEF,OAAO;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACpBT,MAAa,YACX,QACA,eACe;CACf,IAAI,CAAC,cAAc,OAAO,EAAE,OAAO,EAAE;CAErC,cAAc,YAAY,EACxB,UAAU,EAAE,aAAa,gBACvB,uDAAuD,UAAU,kDAAkD,YAAY,MAClI,CAAC;CAGF,MAAM,aAAa,eAAe,WAAW;CAC7C,IAAI,WAAW,SAAS,GACtB,MAAM,IAAI,MACR,0DAA0D,WAAW,IACtE;CAIH,OAAO,OAAO,YACZ,OAAO,QAAQ,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,WAAW,SAAS,IAAS,CAAC,CACzE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC4CH,MAAa,gBACX,QACA,eACe;CACf,IAAI,CAAC,cAAc,OAAO,EAAE,OAAO,EAAE;CAErC,cAAc,YAAY,EACxB,UAAU,EAAE,aAAa,gBACvB,uDAAuD,UAAU,kDAAkD,YAAY,MAClI,CAAC;CAEF,MAAM,aAAa,eAAe,WAAW;CAC7C,IAAI,gBAAgB,WAAW,EAC7B,MAAM,IAAI,MACR,8DAA8D,oBAC5D,YACA,EACE,eAAe,MAChB,CACF,CAAC,KACH;CAGH,MAAM,cAAc,KAAc,cAAwB;EACxD,IAAI,CAAC,gBAAgB,IAAI,EAAE,OAAO;EAElC,MAAM,CAAC,SAAS,GAAG,QAAQ;EAE3B,IAAI,aAAa,KAAK,IAAI,SACxB,IAAI,QAAQ,IAAI,EAAE;GAEhB,MAAM,QAAQ,SAAS,QAAQ;GAC/B,IAAI,CAAC,MAAM,MAAM,IAAI,SAAS,KAC5B,IAAI,OAAO,OAAO,EAAE;SAGtB,OAAO,IAAI;OAER;GACL,MAAM,OAAO,UAAU,IAAI,WAAW;GACtC,IAAI,gBAAgB,KAAK,IAAI,SAC3B,IAAI,WAAW,WAAW,MAAM,KAAK;;EAGzC,OAAO;;CAGT,MAAM,0BAA0B,QAA0B;EACxD,IAAI,QAAQ,IAAI,EACd,OAAO,IACJ,IAAI,uBAAuB,CAC3B,QACE,SAAS,EAAE,gBAAgB,KAAK,IAAI,OAAO,KAAK,KAAK,CAAC,WAAW,GACnE;EAEL,IAAI,gBAAgB,IAAI,EAUtB,OATgB,OAAO,YACrB,OAAO,QAAQ,IAAI,CAChB,KAAK,CAAC,GAAG,OAAO,CAAC,GAAG,uBAAuB,EAAE,CAAC,CAAC,CAC/C,QACE,GAAG,OACF,CAAC,YAAY,EAAE,IACf,EAAE,gBAAgB,EAAE,IAAI,OAAO,KAAK,EAAE,CAAC,WAAW,GACrD,CAES;EAEhB,OAAO;;CAGT,MAAM,SAAS,cAAc,oBAAoB,OAAO,CAAC;CACzD,KAAK,MAAM,OAAO,YAEhB,WAAW,QADG,IAAI,MAAM,IACA,CAAC;CAG3B,OAAO,uBAAuB,OAAO"}
1
+ {"version":3,"file":"index.js","names":[],"sources":["../../src/operations/findDuplicates.ts","../../src/operations/omitKeys.ts","../../src/operations/omitKeysDeep.ts"],"sourcesContent":["import { isEqual } from \"@/predicates/is/isEqual\";\nimport { assertIsArray } from \"@/assertions/objects/assertIsArray\";\n\n/** ----------------------------------------------------------------------\n * * ***Utility: `findDuplicates`.***\n * ----------------------------------------------------------------------\n * **Finds duplicate values in an array by deep equality comparison.**\n * - **Behavior:**\n * - Uses ***`isEqual` utility function*** to compare elements\n * (handles objects, arrays, dates, NaN, etc.).\n * - Returns a new array containing only the *first occurrences* of duplicated values.\n * - Does **not mutate** the original array.\n * - Throws ***{@link TypeError | `TypeError`}*** if input is not an array.\n * @template T Type of elements in the input array.\n * @param {T[]} values - The array to check for duplicates.\n * @returns {T[]} An array of the duplicate values found in the input,\n * preserving order of their first duplicate appearance.\n * @throws **{@link TypeError | `TypeError`}** if the provided `values` argument is not an array.\n * @example\n * findDuplicates([1, 2, 2, 3, 4, 4]);\n * // ➔ [2, 4]\n * findDuplicates([\"apple\", \"banana\", \"apple\", \"orange\"]);\n * // ➔ [\"apple\"]\n * findDuplicates([{ a: 1 }, { a: 1 }, { a: 2 }]);\n * // ➔ [{ a: 1 }]\n * findDuplicates([NaN, NaN, 1]);\n * // ➔ [NaN]\n * findDuplicates([true, false, true]);\n * // ➔ [true]\n * findDuplicates([1, 2, 3]);\n * // ➔ []\n */\nexport const findDuplicates = <T>(values: T[]): T[] => {\n assertIsArray(values, {\n message: ({ currentType, validType }) =>\n `First parameter (\\`values\\`) must be of type \\`${validType}\\` (array literal or instance), but received: \\`${currentType}\\`.`\n });\n\n const duplicates: T[] = [];\n values.forEach((item, index) => {\n for (let i = index + 1; i < values.length; i++) {\n if (isEqual(item, values[i])) {\n if (!duplicates.some((dup) => isEqual(dup, item))) {\n duplicates.push(item);\n }\n break;\n }\n }\n });\n\n return duplicates;\n};\n","import { findDuplicates } from \"./findDuplicates\";\nimport { isPlainObject } from \"@/predicates/is/isPlainObject\";\nimport { assertIsArray } from \"@/assertions/objects/assertIsArray\";\n\n/** --------------------------------\n * * ***Utility: `omitKeys`.***\n * --------------------------------\n * **This function creates a shallow copy of the given object omitting the\n * specified keys.**\n * - **Behavior:**\n * - It will return a new object without mutating the original.\n * - It also validates that ***`keysToOmit`*** does not contain duplicate keys.\n * - **ℹ️ Internally:**\n * - It uses ***`isEqual`*** to check for duplicates in\n * the ***`keysToOmit`*** array.\n * @template I The type of the input object.\n * @template K The keys to omit from the object.\n * @param {I} object - The source object to omit keys from.\n * @param {K[]} keysToOmit - An array of keys to exclude from the returned object.\n * @returns {Omit<I, K>} A new object without the specified keys.\n * @throws **{@link TypeError | `TypeError`}** if `keysToOmit` is not an array.\n * @throws **{@link Error | `Error`}** if duplicate keys are found in `keysToOmit`.\n * @example\n * omitKeys({ a: 1, b: 2, c: 3 }, [\"b\", \"c\"]);\n * //➔ { a: 1 }\n * omitKeys({ name: \"John\", age: 30 }, [\"age\"]);\n * //➔ { name: \"John\" }\n * omitKeys({ a: 1, b: 2 }, []);\n * //➔ { a: 1, b: 2 } (no changes)\n */\nexport const omitKeys = <I extends Record<string, unknown>, K extends keyof I>(\n object: I,\n keysToOmit: K[]\n): Omit<I, K> => {\n if (!isPlainObject(object)) return {} as Omit<I, K>;\n\n assertIsArray(keysToOmit, {\n message: ({ currentType, validType }) =>\n `Second parameter (\\`keysToOmit\\`) must be of type \\`${validType}\\` (array literal or instance), but received: \\`${currentType}\\`.`\n });\n\n // Check for duplicate keys\n const duplicates = findDuplicates(keysToOmit);\n if (duplicates.length > 0) {\n throw new Error(\n `Function \"omitKeys\" Error: Duplicate keys detected - \\`${duplicates}\\``\n );\n }\n\n // Remove specified keys\n return Object.fromEntries(\n Object.entries(object).filter(([key]) => !keysToOmit.includes(key as K))\n ) as Omit<I, K>;\n};\n","import type { NumberRangeUnion } from \"@rzl-zone/ts-types-plus\";\n\nimport { findDuplicates } from \"./findDuplicates\";\n\nimport { isNaN } from \"@/predicates/is/isNaN\";\nimport { isArray } from \"@/predicates/is/isArray\";\nimport { isUndefined } from \"@/predicates/is/isUndefined\";\nimport { isEmptyArray } from \"@/predicates/is/isEmptyArray\";\nimport { isPlainObject } from \"@/predicates/is/isPlainObject\";\nimport { isNonEmptyArray } from \"@/predicates/is/isNonEmptyArray\";\nimport { isObjectOrArray } from \"@/predicates/is/isObjectOrArray\";\n\nimport { assertIsArray } from \"@/assertions/objects/assertIsArray\";\n\nimport { safeJsonParse } from \"@/conversions/json/safeJsonParse\";\nimport { safeStableStringify } from \"@/conversions/stringify/safeStableStringify\";\n\ntype IndexArray = NumberRangeUnion<0, 30>;\ntype DotPath<T, Prev extends string = \"\"> =\n T extends Array<infer U>\n ? DotPath<U, `${Prev}${Prev extends \"\" ? \"\" : \".\"}${IndexArray}`>\n : T extends object\n ? {\n [K in keyof T & string]:\n | `${Prev}${Prev extends \"\" ? \"\" : \".\"}${K}`\n | DotPath<T[K], `${Prev}${Prev extends \"\" ? \"\" : \".\"}${K}`>;\n }[keyof T & string]\n : never;\n\n/** ------------------------------------------------------\n * * ***Utility: `omitKeysDeep`.***\n * ------------------------------------------------------\n * **Recursively omits properties from an object using dot notation paths.**\n * - **Behavior:**\n * - Removes resulting empty objects (`{}`) and arrays (`[]`), cascading upwards\n * to remove empty parents until root if needed.\n * - **⚠️ Be careful:**\n * - If after omission an object or array becomes empty, it will be removed entirely\n * including all the way up to the root if necessary, resulting in `{}`.\n * - **ℹ️ Note:**\n * - For array indices, TypeScript autocomplete only suggests `0`–`30`\n * (to prevent editor lag on large unions).\n * However, higher indices are still fully supported at runtime — you can\n * manually type `\"arr.99.key\"` and it will work the same.\n * @template I - Type of the input object\n * @param {I} object\n * The object to process, should be a plain nested object or array structure.\n * @param {DotPath<I>[]} keysToOmit\n * An array of string paths in dot notation indicating the properties to remove, paths\n * can include numeric indices to target array elements, e.g. `\"arr.0.x\"` to\n * remove `x` from the first object inside the `arr` array.\n * @returns {Partial<I>}\n * A new deeply cloned object with the specified keys omitted, with resulting\n * empty objects or arrays fully removed (even if it collapses to `{}`).\n * @throws **{@link TypeError | `TypeError`}** if `keysToOmit` is not an array.\n * @throws **{@link Error | `Error`}** if `keysToOmit` contains duplicate paths.\n * @example\n * omitKeysDeep({ arr: [{ a: 1 }] }, [\"arr.0.a\"]);\n * // ➔ {} (array becomes empty and removed)\n * omitKeysDeep({ a: { b: { c: 1 }, d: 2 }, e: 3 }, [\"a.b.c\"]);\n * // ➔ { a: { d: 2 }, e: 3 }\n * omitKeysDeep({ a: [{ b: 1 }, { c: 2 }] }, [\"a.0.b\"]);\n * // ➔ { a: [{ c: 2 }] }\n * omitKeysDeep({ a: [{ b: 1 }] }, [\"a.0.b\"]);\n * // ➔ {} (array becomes empty and removed)\n * omitKeysDeep({ complex: [{ deep: [{ x: 1, y: 2 }] }] }, [\"complex.0.deep.0.x\"]);\n * // ➔ { complex: [{ deep: [{ y: 2 }] }] }\n * omitKeysDeep({ complex: [{ deep: [{ x: 1 }] }] }, [\"complex.0.deep.0.x\"]);\n * // ➔ {} (deep chain emptied and collapsed)\n * omitKeysDeep({ data: [[{ foo: 1, bar: 2 }]] }, [\"data.0.0.foo\"]);\n * // ➔ { data: [[{ bar: 2 }]] }\n * omitKeysDeep({ data: [[{ foo: 1 }]] }, [\"data.0.0.foo\"]);\n * // ➔ {} (nested arrays emptied completely)\n * omitKeysDeep({ x: [{ y: [{ z: 1 }, { w: 2 }] }] }, [\"x.0.y.0.z\"]);\n * // ➔ { x: [{ y: [{ w: 2 }] }] }\n * omitKeysDeep({ x: [{ y: [{ z: 1 }] }] }, [\"x.0.y.0.z\"]);\n * // ➔ {} (entire nested arrays removed)\n * omitKeysDeep({ p: { q: { r: 5 } }, s: 6 }, [\"p.q.r\"]);\n * // ➔ { s: 6 } (`p` removed because it becomes empty)\n * omitKeysDeep({ arr: [{ a: 1, b: 2 }, { c: 3 }] }, [\"arr.0.a\"]);\n * // ➔ { arr: [{ b: 2 }, { c: 3 }] }\n * omitKeysDeep({ root: [{ sub: [{ leaf: 10 }] }] }, [\"root.0.sub.0.leaf\"]);\n * // ➔ {} (deep nested arrays emptied to root)\n * omitKeysDeep({ meta: { tags: [\"x\", \"y\"], count: 2 } }, [\"meta.count\"]);\n * // ➔ { meta: { tags: [\"x\", \"y\"] } }\n * omitKeysDeep({ arr: [[{ a: 1 }, { b: 2 }]] }, [\"arr.0.0.a\"]);\n * // ➔ { arr: [[{ b: 2 }]] }\n * omitKeysDeep({ arr: [[{ a: 1 }]] }, [\"arr.0.0.a\"]);\n * // ➔ {} (double nested emptied)\n * omitKeysDeep({ nested: [{ list: [{ id: 1, val: 2 }] }] }, [\"nested.0.list.0.val\"]);\n * // ➔ { nested: [{ list: [{ id: 1 }] }] }\n * omitKeysDeep({ nested: [{ list: [{ id: 1 }] }] }, [\"nested.0.list.0.id\"]);\n * // ➔ {} (full collapse to empty)\n * omitKeysDeep({ mixed: { a: [1, 2, 3], b: { c: 4 } } }, [\"mixed.b.c\"]);\n * // ➔ { mixed: { a: [1, 2, 3] } }\n */\nexport const omitKeysDeep = <I extends Record<string, unknown>>(\n object: I,\n keysToOmit: DotPath<I>[]\n): Partial<I> => {\n if (!isPlainObject(object)) return {} as Partial<I>;\n\n assertIsArray(keysToOmit, {\n message: ({ currentType, validType }) =>\n `Second parameter (\\`keysToOmit\\`) must be of type \\`${validType}\\` (array literal or instance), but received: \\`${currentType}\\`.`\n });\n\n const duplicates = findDuplicates(keysToOmit);\n if (isNonEmptyArray(duplicates)) {\n throw new Error(\n `Function \"omitKeysDeep\" Error: Duplicate keys detected - \\`${safeStableStringify(\n duplicates,\n {\n keepUndefined: true\n }\n )}\\`.`\n );\n }\n\n const omitAtPath = (obj: unknown, pathParts: string[]) => {\n if (!isObjectOrArray(obj)) return obj;\n\n const [current, ...rest] = pathParts;\n\n if (isEmptyArray(rest) && current) {\n if (isArray(obj)) {\n // Support numeric index\n const index = parseInt(current);\n if (!isNaN(index) && index in obj) {\n obj.splice(index, 1);\n }\n } else {\n delete obj[current];\n }\n } else {\n const next = current ? obj[current] : undefined;\n if (isObjectOrArray(next) && current) {\n obj[current] = omitAtPath(next, rest);\n }\n }\n return obj;\n };\n\n const deepRemoveEmptyObjects = (obj: unknown): unknown => {\n if (isArray(obj)) {\n return obj\n .map(deepRemoveEmptyObjects)\n .filter(\n (item) => !(isObjectOrArray(item) && Object.keys(item).length === 0)\n );\n }\n if (isObjectOrArray(obj)) {\n const cleaned = Object.fromEntries(\n Object.entries(obj)\n .map(([k, v]) => [k, deepRemoveEmptyObjects(v)])\n .filter(\n ([, v]) =>\n !isUndefined(v) &&\n !(isObjectOrArray(v) && Object.keys(v).length === 0)\n )\n );\n return cleaned;\n }\n return obj;\n };\n\n const result = safeJsonParse(safeStableStringify(object)); // clone deep to avoid mutating original\n for (const key of keysToOmit) {\n const parts = key.split(\".\");\n omitAtPath(result, parts);\n }\n\n return deepRemoveEmptyObjects(result) as Partial<I>;\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAgCA,MAAa,kBAAqB,WAAqB;CACrD,cAAc,QAAQ,EACpB,UAAU,EAAE,aAAa,gBACvB,kDAAkD,UAAU,kDAAkD,YAAY,KAC9H,CAAC;CAED,MAAM,aAAkB,CAAC;CACzB,OAAO,SAAS,MAAM,UAAU;EAC9B,KAAK,IAAI,IAAI,QAAQ,GAAG,IAAI,OAAO,QAAQ,KACzC,IAAI,QAAQ,MAAM,OAAO,EAAE,GAAG;GAC5B,IAAI,CAAC,WAAW,MAAM,QAAQ,QAAQ,KAAK,IAAI,CAAC,GAC9C,WAAW,KAAK,IAAI;GAEtB;EACF;CAEJ,CAAC;CAED,OAAO;AACT;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACrBA,MAAa,YACX,QACA,eACe;CACf,IAAI,CAAC,cAAc,MAAM,GAAG,OAAO,CAAC;CAEpC,cAAc,YAAY,EACxB,UAAU,EAAE,aAAa,gBACvB,uDAAuD,UAAU,kDAAkD,YAAY,KACnI,CAAC;CAGD,MAAM,aAAa,eAAe,UAAU;CAC5C,IAAI,WAAW,SAAS,GACtB,MAAM,IAAI,MACR,0DAA0D,WAAW,GACvE;CAIF,OAAO,OAAO,YACZ,OAAO,QAAQ,MAAM,EAAE,QAAQ,CAAC,SAAS,CAAC,WAAW,SAAS,GAAQ,CAAC,CACzE;AACF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AC2CA,MAAa,gBACX,QACA,eACe;CACf,IAAI,CAAC,cAAc,MAAM,GAAG,OAAO,CAAC;CAEpC,cAAc,YAAY,EACxB,UAAU,EAAE,aAAa,gBACvB,uDAAuD,UAAU,kDAAkD,YAAY,KACnI,CAAC;CAED,MAAM,aAAa,eAAe,UAAU;CAC5C,IAAI,gBAAgB,UAAU,GAC5B,MAAM,IAAI,MACR,8DAA8D,oBAC5D,YACA,EACE,eAAe,KACjB,CACF,EAAE,IACJ;CAGF,MAAM,cAAc,KAAc,cAAwB;EACxD,IAAI,CAAC,gBAAgB,GAAG,GAAG,OAAO;EAElC,MAAM,CAAC,SAAS,GAAG,QAAQ;EAE3B,IAAI,aAAa,IAAI,KAAK,SACxB,IAAI,QAAQ,GAAG,GAAG;GAEhB,MAAM,QAAQ,SAAS,OAAO;GAC9B,IAAI,CAAC,MAAM,KAAK,KAAK,SAAS,KAC5B,IAAI,OAAO,OAAO,CAAC;EAEvB,OACE,OAAO,IAAI;OAER;GACL,MAAM,OAAO,UAAU,IAAI,WAAW;GACtC,IAAI,gBAAgB,IAAI,KAAK,SAC3B,IAAI,WAAW,WAAW,MAAM,IAAI;EAExC;EACA,OAAO;CACT;CAEA,MAAM,0BAA0B,QAA0B;EACxD,IAAI,QAAQ,GAAG,GACb,OAAO,IACJ,IAAI,sBAAsB,EAC1B,QACE,SAAS,EAAE,gBAAgB,IAAI,KAAK,OAAO,KAAK,IAAI,EAAE,WAAW,EACpE;EAEJ,IAAI,gBAAgB,GAAG,GAUrB,OATgB,OAAO,YACrB,OAAO,QAAQ,GAAG,EACf,KAAK,CAAC,GAAG,OAAO,CAAC,GAAG,uBAAuB,CAAC,CAAC,CAAC,EAC9C,QACE,GAAG,OACF,CAAC,YAAY,CAAC,KACd,EAAE,gBAAgB,CAAC,KAAK,OAAO,KAAK,CAAC,EAAE,WAAW,EACtD,CAES;EAEf,OAAO;CACT;CAEA,MAAM,SAAS,cAAc,oBAAoB,MAAM,CAAC;CACxD,KAAK,MAAM,OAAO,YAEhB,WAAW,QADG,IAAI,MAAM,GACD,CAAC;CAG1B,OAAO,uBAAuB,MAAM;AACtC"}
@@ -2,12 +2,12 @@
2
2
  * ========================================================================
3
3
  * @rzl-zone/utils-js
4
4
  * ------------------------------------------------------------------------
5
- * Version: `3.13.0`
5
+ * Version: `3.13.1-beta.0`
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_parsers = require('../parsers-Bd-YRt6j.cjs');
12
+ const require_parsers = require('../parsers-xAQmKCgS.cjs');
13
13
  exports.extractFileName = require_parsers.extractFileName;
@@ -2,7 +2,7 @@
2
2
  * ========================================================================
3
3
  * @rzl-zone/utils-js
4
4
  * ------------------------------------------------------------------------
5
- * Version: `3.13.0`
5
+ * Version: `3.13.1-beta.0`
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
  * ========================================================================
@@ -2,7 +2,7 @@
2
2
  * ========================================================================
3
3
  * @rzl-zone/utils-js
4
4
  * ------------------------------------------------------------------------
5
- * Version: `3.13.0`
5
+ * Version: `3.13.1-beta.0`
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
  * ========================================================================
@@ -2,10 +2,10 @@
2
2
  * ========================================================================
3
3
  * @rzl-zone/utils-js
4
4
  * ------------------------------------------------------------------------
5
- * Version: `3.13.0`
5
+ * Version: `3.13.1-beta.0`
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 { t as extractFileName } from "../parsers-Dl9fFra4.js";
10
+ import { t as extractFileName } from "../parsers-BLHzVoh-.js";
11
11
  export { extractFileName };
@@ -2,13 +2,13 @@
2
2
  * ========================================================================
3
3
  * @rzl-zone/utils-js
4
4
  * ------------------------------------------------------------------------
5
- * Version: `3.13.0`
5
+ * Version: `3.13.1-beta.0`
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 { T as assertIsPlainObject, t as assertIsBoolean, y as isNonEmptyString } from "./assertIsBoolean-9-huIcIR.js";
11
- import { t as punycodeUtilsJS } from "./punyCode-C0ft9dER.js";
10
+ import { T as assertIsPlainObject, t as assertIsBoolean, y as isNonEmptyString } from "./assertIsBoolean-DDhQ2D-k.js";
11
+ import { t as punycodeUtilsJS } from "./punyCode-COTqgXMJ.js";
12
12
  const EXTENSIONS_FILE = new Set([
13
13
  "txt",
14
14
  "md",
@@ -640,4 +640,4 @@ const extractFileName = (input, options = {}) => {
640
640
  return filename || null;
641
641
  };
642
642
  export { extractFileName as t };
643
- //# sourceMappingURL=parsers-Dl9fFra4.js.map
643
+ //# sourceMappingURL=parsers-BLHzVoh-.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"parsers-Dl9fFra4.js","names":[],"sources":["../src/parsers/_private/extensions.ts","../src/parsers/extractFileName.ts"],"sourcesContent":["// ==========================\n// Single extensions\n// ==========================\nexport const EXTENSIONS_FILE = new Set([\n // 📄 Text & Document\n \"txt\",\n \"md\",\n \"rtf\",\n \"tex\",\n \"doc\",\n \"docx\",\n \"odt\",\n \"ott\",\n \"pdf\",\n \"djvu\",\n \"epub\",\n \"fb2\",\n \"lit\",\n \"lrf\",\n \"xls\",\n \"xlsx\",\n \"ods\",\n \"csv\",\n \"tsv\",\n \"ppt\",\n \"pptx\",\n \"pps\",\n \"bib\",\n \"cba\",\n \"cbt\",\n \"cbz\",\n \"cbr\",\n \"opds\",\n \"fodt\",\n \"pages\",\n \"rtfd\",\n \"sxc\",\n \"sxw\",\n \"wpd\",\n \"xps\",\n \"dotx\",\n \"dotm\",\n \"xltx\",\n \"xltm\",\n \"sldx\",\n \"sldm\",\n \"fods\",\n \"mdx\",\n \"markdown\",\n \"texi\",\n \"textile\",\n\n // 🖼️ Image\n \"jpg\",\n \"jpeg\",\n \"png\",\n \"gif\",\n \"bmp\",\n \"tif\",\n \"tiff\",\n \"webp\",\n \"svg\",\n \"ico\",\n \"heif\",\n \"heic\",\n \"raw\",\n \"cr2\",\n \"nef\",\n \"orf\",\n \"sr2\",\n \"dng\",\n \"dds\",\n \"psd\",\n \"exr\",\n \"xcf\",\n \"ai\",\n \"eps\",\n \"cdr\",\n \"indd\",\n \"pcx\",\n \"pgm\",\n \"ppm\",\n \"pbm\",\n \"pnm\",\n \"jfif\",\n \"ras\",\n \"tga\",\n \"j2k\",\n \"jp2\",\n \"emf\",\n \"wmf\",\n \"hdp\",\n \"mdi\",\n \"hevc\",\n\n // 🎵 Audio\n \"mp3\",\n \"wav\",\n \"ogg\",\n \"flac\",\n \"aac\",\n \"m4a\",\n \"wma\",\n \"alac\",\n \"aiff\",\n \"aif\",\n \"amr\",\n \"mid\",\n \"midi\",\n \"opus\",\n \"au\",\n \"caf\",\n \"ape\",\n \"mka\",\n \"spx\",\n \"ra\",\n \"ram\",\n \"mpc\",\n \"wv\",\n \"aifc\",\n \"mod\",\n \"it\",\n \"s3m\",\n \"xm\",\n \"kar\",\n \"m4b\",\n \"voc\",\n \"snd\",\n \"a52\",\n \"ac3\",\n \"dts\",\n\n // 🎥 Video\n \"mp4\",\n \"mkv\",\n \"avi\",\n \"mov\",\n \"wmv\",\n \"webm\",\n \"mpeg\",\n \"mpg\",\n \"3gp\",\n \"3g2\",\n \"m4v\",\n \"ts\",\n \"mts\",\n \"asf\",\n \"rm\",\n \"rmvb\",\n \"vob\",\n \"f4v\",\n \"ogv\",\n \"m2ts\",\n \"dav\",\n \"mxf\",\n \"mjpeg\",\n \"flv\",\n \"divx\",\n \"f4a\",\n \"f4p\",\n \"m2v\",\n \"ogm\",\n \"vp8\",\n \"vp9\",\n \"xvid\",\n \"yuv\",\n \"mng\",\n \"dv\",\n \"m1v\",\n \"roq\",\n \"m2t\",\n \"av1\",\n \"hevc\",\n \"m3u\",\n \"m3u8\",\n\n // 🗃️ Archive & Compression\n \"zip\",\n \"rar\",\n \"7z\",\n \"tar\",\n \"gz\",\n \"bz\",\n \"bz2\",\n \"xz\",\n \"tgz\",\n \"tbz2\",\n \"txz\",\n \"lz\",\n \"lzma\",\n \"z\",\n \"cab\",\n \"arj\",\n \"ace\",\n \"rpm\",\n \"deb\",\n \"pkg\",\n \"apk\",\n \"jar\",\n \"war\",\n \"ear\",\n \"sit\",\n \"sitx\",\n \"cpgz\",\n \"tlz\",\n \"tlzma\",\n \"tzo\",\n \"cpio\",\n \"shar\",\n \"bzip\",\n \"gzip\",\n \"7zip\",\n \"rar5\",\n \"tbz\",\n \"txz\",\n\n // 💾 Disk Image\n \"iso\",\n \"img\",\n \"vhd\",\n \"vmdk\",\n \"qcow2\",\n \"vhdx\",\n \"bin\",\n \"cue\",\n \"nrg\",\n \"daa\",\n \"sdi\",\n \"vfd\",\n \"ima\",\n \"dmg\",\n \"vdi\",\n \"toast\",\n \"ccd\",\n \"mdf\",\n \"cdi\",\n \"bif\",\n \"bifc\",\n \"bifd\",\n\n // 🗃️ Database & Data\n \"sql\",\n \"db\",\n \"dbf\",\n \"mdb\",\n \"accdb\",\n \"json\",\n \"toml\",\n \"ini\",\n \"log\",\n \"plist\",\n \"pkl\",\n \"msgpack\",\n \"h5\",\n \"hdf5\",\n \"parquet\",\n \"avro\",\n \"orc\",\n \"ndjson\",\n \"pdb\",\n \"sqlite\",\n \"sqlite3\",\n \"dbx\",\n \"sdf\",\n \"nc\",\n \"netcdf\",\n \"grib\",\n \"geojson\",\n \"gml\",\n \"hjson\",\n \"cdb\",\n \"db3\",\n \"dta\",\n \"sav\",\n \"sas7bdat\",\n \"ldif\",\n \"fdb\",\n \"gdb\",\n \"sqlite2\",\n \"h5ad\",\n \"nc4\",\n \"xmind\",\n \"drawio\",\n \"sdc\",\n \"jsonl\",\n \"yaml\",\n \"yml\",\n \"toml\",\n\n // 💻 Code & Script\n \"js\",\n \"jsx\",\n \"ts\",\n \"tsx\",\n \"c\",\n \"cpp\",\n \"net\",\n \"h\",\n \"hpp\",\n \"java\",\n \"py\",\n \"rb\",\n \"go\",\n \"rs\",\n \"php\",\n \"pl\",\n \"sh\",\n \"bat\",\n \"cmd\",\n \"ps1\",\n \"lua\",\n \"swift\",\n \"kt\",\n \"scala\",\n \"cs\",\n \"vb\",\n \"dart\",\n \"m\",\n \"r\",\n \"jl\",\n \"fs\",\n \"vbproj\",\n \"sln\",\n \"pri\",\n \"gemspec\",\n \"gradle\",\n \"coffee\",\n \"erl\",\n \"ex\",\n \"exs\",\n \"hs\",\n \"lisp\",\n \"clj\",\n \"groovy\",\n \"scm\",\n \"vbs\",\n \"nim\",\n \"rkt\",\n \"ml\",\n \"mli\",\n \"fsx\",\n \"psm1\",\n \"cbl\",\n \"for\",\n \"f90\",\n \"lock\",\n \"tsconfig\",\n \"vue\",\n \"svelte\",\n \"cjs\",\n \"mjs\",\n \"mts\",\n \"cts\",\n \"json5\",\n \"es6\",\n \"module\",\n \"systemjs\",\n\n // 🌐 Web & Config\n \"html\",\n \"htm\",\n \"xhtml\",\n \"css\",\n \"scss\",\n \"sass\",\n \"less\",\n \"xml\",\n \"xlf\",\n \"po\",\n \"pot\",\n \"jsp\",\n \"asp\",\n \"aspx\",\n \"jspf\",\n \"cgi\",\n \"cfm\",\n \"env\",\n \"babelrc\",\n \"cfg\",\n \"config\",\n \"conf\",\n \"editorconfig\",\n \"eslintrc\",\n \"gitconfig\",\n \"gitattributes\",\n \"gitignore\",\n \"prettierrc\",\n \"webmanifest\",\n \"dockerfile\",\n // \".dockerfile\",\n\n // 🔠 Font\n \"ttf\",\n \"otf\",\n \"woff\",\n \"woff2\",\n \"eot\",\n \"dfont\",\n \"pfa\",\n \"pfb\",\n \"fon\",\n \"fnt\",\n \"bdf\",\n \"ps\",\n\n // 🗺️ CAD & GIS\n \"dwg\",\n \"dxf\",\n \"shp\",\n \"kml\",\n \"kmz\",\n \"gpx\",\n \"stl\",\n \"step\",\n \"iges\",\n \"igs\",\n \"3ds\",\n \"3dm\",\n \"fbx\",\n \"obj\",\n \"dae\",\n \"ifc\",\n\n // 🔧 System / Binary / Execution\n \"exe\",\n \"msi\",\n \"run\",\n \"com\",\n \"app\",\n \"elf\",\n \"dll\",\n \"so\",\n \"dylib\",\n \"sys\",\n \"scr\",\n \"bin\",\n \"out\",\n\n // 🔐 Certificates / Crypto\n \"pem\",\n \"crt\",\n \"cer\",\n \"der\",\n \"csr\",\n \"p12\",\n \"pfx\",\n \"jks\",\n \"asc\",\n \"gpg\",\n \"pgp\",\n \"p7b\",\n \"p7c\",\n \"spc\",\n \"key\",\n \"pub\",\n \"cert\",\n \"p7m\",\n\n // 🎮 Games & Projects\n \"nes\",\n \"sfc\",\n \"gba\",\n \"nds\",\n \"rom\",\n \"pak\",\n \"vpk\",\n \"bik\",\n \"cso\",\n \"wad\",\n \"wadx\",\n \"smc\",\n \"gb\",\n \"gbc\",\n\n // 🔬 Bioinformatics\n \"fasta\",\n \"fa\",\n \"fas\",\n \"ffn\",\n \"faa\",\n \"fna\",\n \"frn\",\n \"fastq\",\n \"fq\",\n \"bam\",\n \"bed\",\n \"sam\",\n \"vcf\",\n \"gff\",\n \"gff3\",\n \"gtf\",\n \"fai\",\n \"tbi\",\n \"fast5\",\n \"fqz\",\n \"fq5\"\n]);\n\n// ==========================\n// Double extensions\n// ==========================\nexport const DOUBLE_EXTENSIONS_FILE = new Set([\n \"log.gz\",\n \"tar.gz\",\n \"tar.bz2\",\n \"tar.bz\",\n \"tar.xz\",\n \"tar.lz\",\n \"tar.lzma\",\n \"tar.Z\",\n \"tar.zst\",\n \"tar.lz4\",\n \"log.gz\",\n \"sql.gz\",\n \"csv.gz\",\n \"tsv.gz\",\n \"json.gz\",\n \"ndjson.gz\",\n \"fq.gz\",\n \"sam.gz\",\n \"fasta.gz\",\n \"fa.gz\",\n \"ffn.gz\",\n \"faa.gz\",\n \"fna.gz\",\n \"frn.gz\",\n \"fastq.gz\",\n \"js.map\",\n \"css.map\"\n]);\n\n// ==========================\n// Special filenames\n// ==========================\nexport const SPECIAL_FILENAMES = new Set([\n \"Makefile\",\n \"Dockerfile\",\n \".dockerignore\",\n \".npmrc\",\n \".envrc\",\n \".htgroup\",\n \".eslintignore\",\n \".env.test\",\n \".env.local\",\n \".env.production\",\n \".env.development\",\n \".env.example\",\n \".dockerfile\",\n \".htaccess\",\n \".htpasswd\",\n \".babelrc\",\n \".eslintrc\",\n \".editorconfig\",\n \".prettierignore\",\n \"docker-compose.override.yml\",\n \"docker-compose.yml\",\n \"Vagrantfile\",\n \"Procfile\",\n \"Gemfile\",\n \"Rakefile\",\n \"package.json\",\n \"package-lock.json\",\n \"yarn.lock\",\n \"pnpm-lock.yaml\",\n \"tsconfig.json\",\n \"webpack.config.js\",\n \"vite.config.js\",\n \"vite.config.ts\",\n \"Gruntfile.js\",\n \"gulpfile.js\",\n \"babel.config.js\",\n \"babel.js\",\n \"rollup.js\",\n\n // SPECIAL PRESERVE NAME\n \"CON\",\n \"NUL\",\n \"PRN\",\n \"AUX\",\n \"COM1\",\n \"COM2\",\n \"COM3\",\n \"COM4\",\n \"COM5\",\n \"COM6\",\n \"COM7\",\n \"COM8\",\n \"COM9\",\n \"LPT1\",\n \"LPT2\",\n \"LPT3\",\n \"LPT4\",\n \"LPT5\",\n \"LPT6\",\n \"LPT7\",\n \"LPT8\",\n \"LPT9\"\n]);\n","import { isNonEmptyString } from \"@/predicates/is/isNonEmptyString\";\nimport {\n DOUBLE_EXTENSIONS_FILE,\n EXTENSIONS_FILE,\n SPECIAL_FILENAMES\n} from \"./_private/extensions\";\n\nimport { punycodeUtilsJS } from \"@/urls/utils/punyCode\";\n\nimport { assertIsBoolean } from \"@/assertions/booleans/assertIsBoolean\";\nimport { assertIsPlainObject } from \"@/assertions/objects/assertIsPlainObject\";\n\nexport type ExtractFileNameOptions = {\n /** ----------------------------------------------------------\n * * ***Indicates whether the input should be treated as a potential domain string.***\n * ----------------------------------------------------------\n *\n * - Behavior when `true`:\n * - The `domainName` option is required and must be a string and non-empty string.\n * If `domainName` is `undefined`, `null`, or an empty string, a `TypeError` will be thrown.\n * - The `domainName` is used to determine if the input is a domain-only string.\n * - Returns `null` if the input exactly matches `domainName` or any of its subdomains **and** has no additional path or filename.\n * - If the input does not match `domainName` or its subdomains, it will be processed as a regular file-like name.\n * - Supports **Unicode/IDN domains** (e.g., `tést-ドメイン.com`) and **ASCII filenames**, mixed safely.\n *\n * @default false\n */\n domainAware?: boolean;\n\n /** ----------------------------------------------------------\n * * ***The base domain name used for comparison (e.g., `\"example.com\"`).***\n * ----------------------------------------------------------\n *\n * - Required when `domainAware` is `true`.\n * - Helps differentiate between a domain-only input (ignored) and a standalone file-like string (processed normally).\n * - Must be a string and non-empty string. Invalid values (`undefined`, `null`, or empty string) will trigger a `TypeError`.\n * - Works with both **ASCII domains** and **Unicode/IDN domains**.\n * - Example:\n * ```ts *\n * // ASCII domain + ASCII filename\n * extractFileName(\"resume.com\", {\n * domainAware: true,\n * domainName: \"example.com\"\n * });\n * // ➔ \"resume\"\n * extractFileName(\"example.com\", {\n * domainAware: true,\n * domainName: \"example.com\"\n * });\n * // ➔ null (because input is treated as domain-name)\n *\n * // Unicode domain + ASCII filename\n * extractFileName(\"tést-ドメイン.com/file.txt\", {\n * domainAware: true,\n * domainName: \"ドメイン.com\"\n * });\n * // ➔ \"file\"\n *\n * // Unicode domain + Unicode filename\n * extractFileName(\"tést-ドメイン.com/ファイル名.pdf\", {\n * domainAware: true,\n * domainName: \"ドメイン.com\"\n * });\n * // ➔ \"ファイル名\"\n *\n * // Invalid domainName, will throw TypeError\n * extractFileName(\"resume.com\", {\n * domainAware: true,\n * domainName: \"\"\n * });\n * // ➔ TypeError\n * ```\n *\n * @default undefined\n */\n domainName?: string;\n};\n\n/** ----------------------------------------------------------\n * * ***Utility: `extractFileName`.***\n * ----------------------------------------------------------\n *\n * **Extracts the **clean base filename** from nearly any input string, including URLs, local file paths,\n * UNC paths, and plain filenames.**\n *\n * - It automatically safely handles extracts the **base file name** (without extension) from:\n * - File system paths (Windows, Unix, UNC)\n * - Protocols like http, https, ftp, file, mailto, or custom schemes\n * - Percent-encoded, Unicode, and emoji characters\n * - Dotfiles, reserved OS names, multi-part extensions\n * - Data URIs\n * - Optional domain-aware mode to ignore domain-only inputs\n * - Plain filenames\n *\n * - Full support for:\n * - Unicode, emoji, percent-encoding\n * - Dotfiles (e.g., `.env`, `.gitignore`)\n * - Reserved/OS-protected filenames:\n * `CON`, `PRN`, `AUX`, `NUL`, `COM1`–`COM9`, `LPT1`–`LPT9`\n * - Known multi-part extensions:\n * `.tar.gz`, `.tar.bz2`, `.tar.xz`, `.tar.lz`, `.tar.zst`, `.min.js`, `.js.map`, `.log.gz`, `.sql.gz`,\n * `.backup.tar`, etc.\n * - Data URIs (`data:[mime];base64,...` ➔ payload string)\n * - Domain-aware mode (optional)\n *\n * ----------------------------------------------------------\n * - **Behavior / Features**\n * - Strips **known extensions**, including multi-part and common double/triple extensions.\n * - Leaves unknown/custom extensions intact.\n * - Preserves **dotfiles** as-is (leading dot preserved).\n * - Returns `null` if:\n * - input is `null`, `undefined`, or not a string\n * - input is empty, whitespace-only, or only slashes\n * - input represents a folder path (trailing slash/backslash, drive/folder only)\n * - input is a **domain-only string** in domain-aware mode\n * - Normalizes Windows-style backslashes (`\\`) internally as `/`.\n * - Supports UNC paths, mixed slashes, and Windows drive letters safely.\n * - Handles URLs:\n * - Ignores query strings (`?v=1.2.3`) and hash fragments (`#section`)\n * - Decodes percent-encoded filenames (`my%20file.txt` ➔ `my file.txt`)\n * - Supports protocol-relative URLs (`//cdn.example.com/file.jpg`)\n * - Supports uncommon/custom protocols (`ftp://`, `file://`, `mailto:`, etc.)\n * - Handles **multiple dots**, **trailing dots**, **triple or more extensions**\n * - Supports filenames on mixed Unicode/ASCII domains:\n * - Domain names can include Unicode characters (IDN / punycode)\n * - Filenames may contain ASCII, Unicode, and emoji characters\n * - Works correctly when domain is Unicode and filename is ASCII, or vice versa\n * - Supports extremely long filenames safely (up to OS limits)\n * - Domain-aware mode (`domainAware: true` + `domainName`):\n * - Parameter `domainName` must be a string and non-empty string; otherwise a TypeError is thrown.\n * - Returns `null` if input equals `domainName` or any subdomain with no file path\n * - Extracts filename normally if path/file exists on domain or other domain\n * - Safe in Node.js and browsers\n *\n * ----------------------------------------------------------\n * @param {string | null | undefined} input\n * URL, file path, or plain filename to extract from.\n *\n * @param {ExtractFileNameOptions} [options]\n * Optional configuration:\n * - `domainAware?: boolean` – treat input as a domain string. Requires `domainName` to be a string and non-empty string; otherwise, a TypeError is thrown.\n * - `domainName?: string` – base domain for comparison eg (`example.com`), required when `domainAware` is true.\n *\n * @returns {string | null}\n * - Base filename without known extensions\n * - Original filename if extension unknown\n * - `null` for invalid inputs, folder paths, or domain-only strings\n *\n * ----------------------------------------------------------\n * @example\n * ```ts\n * // Basic files\n * extractFileName(\"document.pdf\"); // ➔ \"document\"\n * extractFileName(\"/files/archive.tar.gz\"); // ➔ \"archive\"\n * extractFileName(\"C:\\\\path\\\\file.txt\"); // ➔ \"file\"\n * extractFileName(\".env\"); // ➔ \".env\"\n * extractFileName(\"folder/\"); // ➔ null\n *\n * // Not a file\n * extractFileName(\"not-file\"); // ➔ null\n * extractFileName(\"not-file/\"); // ➔ null\n * extractFileName(\"/not-file/\"); // ➔ null\n * extractFileName(\"/not-file\"); // ➔ null\n *\n * // URLs with queries, hashes, protocols\n * extractFileName(\"https://example.com/file.txt?ver=1\"); // ➔ \"file\"\n * extractFileName(\"https://example.com/archive.tar.gz#part\"); // ➔ \"archive\"\n * extractFileName(\"//cdn.example.com/image.png\"); // ➔ \"image\"\n *\n *\n * // Special protocol handling\n * extractFileName(\"tel:+6212345678\"); // ➔ \"+6212345678\"\n * extractFileName(\"sms:+6212345678\"); // ➔ \"+6212345678\"\n * extractFileName(\"mailto:user@domain.com\"); // ➔ \"user@domain\"\n * extractFileName(\"data:text/plain;base64,SGVsbG8=\"); // ➔ \"SGVsbG8=\"\n * extractFileName(\"mailto:resume.com\"); // ➔ \"resume\"\n * extractFileName(\"ftp://example.com/image.jpeg\"); // ➔ \"image\"\n * extractFileName(\"ftp://files.example.com/app.min.js\"); // ➔ \"app.min\"\n * extractFileName(\"file:///C:/path/to/document.pdf\"); // ➔ \"document\"\n * extractFileName(\"custom-scheme://example.com/video.mp4\"); // ➔ \"video\"\n *\n * // Unicode & emoji\n * extractFileName(\"emoji-😊.png\"); // ➔ \"emoji-😊\"\n * extractFileName(\"🔥project.tar.gz\"); // ➔ \"🔥project\"\n *\n * // Dotfiles\n * extractFileName(\".gitignore\"); // ➔ \".gitignore\"\n * extractFileName(\"/path/.bashrc\"); // ➔ \".bashrc\"\n *\n * // Mixed Unicode domain and ASCII filename\n * extractFileName(\"https://tést-ドメイン.com/file.txt\"); // ➔ \"file\"\n * extractFileName(\"https://example.com/ファイル名.pdf\"); // ➔ \"ファイル名\"\n * extractFileName(\"https://ドメイン例.com/emoji-🔥.png\"); // ➔ \"emoji-🔥\"\n *\n * // Reserved filenames\n * extractFileName(\"CON\"); // ➔ \"CON\"\n * extractFileName(\"NUL.txt\"); // ➔ \"NUL\"\n *\n * // Domain-aware mode\n * extractFileName(\"example.com\", {\n * domainAware: true,\n * domainName: \"example.com\"\n * });\n * // ➔ null\n * extractFileName(\"cdn.example.com\", {\n * domainAware: true,\n * domainName: \"example.com\"\n * });\n * // ➔ null\n * extractFileName(\"resume.com\", {\n * domainAware: true,\n * domainName: \"example.com\"\n * });\n * // ➔ \"resume\"\n * extractFileName(\"https://example.com/file.txt\", {\n * domainAware: true,\n * domainName: \"example.com\"\n * });\n * // ➔ \"file\"\n *\n * // Windows & UNC paths\n * extractFileName(\"C:\\\\Users\\\\rzl\\\\Documents\\\\file.txt\"); // ➔ \"file\"\n * extractFileName(\"\\\\\\\\SERVER\\\\share\\\\logs\\\\output.log\"); // ➔ \"output\"\n * extractFileName(\"C:/Users\\\\rzl/mix\\\\test.pdf\"); // ➔ \"test\"\n *\n * // Edge / extreme cases\n * extractFileName(\"https://example.com/my%20file%20name.txt\"); // ➔ \"my file name\"\n * extractFileName(\"app.min.js.map\"); // ➔ \"app.min\"\n * extractFileName(\"backup.tar.bak\"); // ➔ \"backup.tar.bak\" (unknown double extension)\n * extractFileName(\"filename.\"); // ➔ \"filename.\"\n * extractFileName(\"a\".repeat(255) + \".txt\"); // ➔ \"a\".repeat(255)\n * ```\n *\n * ----------------------------------------------------------\n * @note\n * - Robust: never throws, handles unusual inputs safely.\n * - Suitable for display, logging, or safe storage.\n * - Normalizes slashes consistently.\n * - Covers nearly all real-world filename, URL, path, data URI, and domain scenarios.\n * - Handles Windows UNC paths, mixed slashes, percent-encoded, Unicode/emoji filenames.\n * - Known multi-part extensions list can be extended without breaking functionality.\n */\nexport const extractFileName = (\n input?: string | null,\n options: ExtractFileNameOptions = {}\n): string | null => {\n if (!isNonEmptyString(input)) return null;\n\n assertIsPlainObject(options, {\n message: ({ currentType, validType }) =>\n `Second parameter (\\`options\\`) must be of type \\`${validType}\\`, but received: \\`${currentType}\\`.`\n });\n\n const { domainName, domainAware = false } = options;\n\n assertIsBoolean(domainAware, {\n message: ({ currentType, validType }) =>\n `Parameter \\`domainAware\\` property of the \\`options\\` (second parameter) must be of type \\`${validType}\\`, but received: \\`${currentType}\\`.`\n });\n\n let pathname = input.trim();\n\n // Normalize Windows backslashes\n pathname = pathname.replace(/\\\\/g, \"/\");\n\n // domain-aware mode\n if (domainAware) {\n if (!isNonEmptyString(domainName)) {\n throw new TypeError(\n \"If parameter `domainAware` is set to `true`, the option parameter `domainName` is required as string, and cant be an empty-string.\"\n );\n }\n\n const cleanDomain = punycodeUtilsJS\n .toASCII(domainName)\n .replace(/^https?:\\/\\//i, \"\")\n .replace(/^www\\./, \"\")\n .replace(/\\/.*$/, \"\")\n .toLowerCase();\n\n const inputDomain = punycodeUtilsJS\n .toASCII(input)\n .replace(/^https?:\\/\\//i, \"\")\n .replace(/^www\\./, \"\")\n .toLowerCase();\n\n const inputHost = inputDomain.split(\"/\")[0]?.split(/[?#]/)[0];\n const matchesDomain =\n inputHost === cleanDomain || inputHost?.endsWith(`.${cleanDomain}`);\n const hasPath = /\\/[^/]+$/.test(inputDomain);\n\n if (matchesDomain && !hasPath) return null;\n }\n\n // handle special protocol-like strings\n const protocolMatch = pathname.match(/^([a-zA-Z][a-zA-Z0-9+.-]*):(.+)$/);\n if (protocolMatch) {\n const scheme = protocolMatch[1]?.toLowerCase() || \"\";\n const rest = protocolMatch[2];\n\n if ([\"tel\", \"sms\"].some((sch) => sch.startsWith(scheme))) {\n const clean = rest?.split(\"?\")[0]?.split(\"#\")[0];\n return clean?.trim() || null;\n } else if (scheme === \"mailto\") {\n const parts = rest?.split(\"/\");\n let last = parts?.[parts.length - 1];\n last = last?.split(\"?\")[0]?.split(\"#\")[0]; // strip query/hash\n const dotIndex = last?.lastIndexOf(\".\");\n if (dotIndex && dotIndex > 0) last = last?.slice(0, dotIndex);\n return last || null;\n } else if (scheme === \"data\") {\n const commaIndex = rest?.indexOf(\",\") || -1;\n if (commaIndex === -1) return null;\n let payload = rest?.slice(commaIndex + 1);\n payload = payload?.split?.(\"?\")[0]?.split(\"#\")[0]; // strip query/hash\n return payload?.trim() || null;\n }\n }\n\n if (/^[a-z][a-z\\d+\\-.]*:\\/{3,}/i.test(pathname)) {\n // eg https:///file.txt (has more than 2 slash after : protocol)\n pathname = pathname.replace(/^[a-z][a-z\\d+\\-.]*:\\/{2,}/i, \"\");\n } else {\n try {\n const isProbablyUrl = /^[a-z][a-z\\d+\\-.]*:(\\/\\/)?/i.test(pathname);\n\n pathname = isProbablyUrl\n ? new URL(pathname).pathname\n : new URL(`http://localhost/${pathname}`).pathname;\n } catch {\n // Fallback for weird URLs like 'https:///file.txt'\n // Remove protocol + any number of slashes\n pathname = pathname.replace(/^[a-z][a-z\\d+\\-.]*:(\\/\\/)?/i, \"\");\n }\n }\n\n // split into non-empty segments\n const segments = pathname.split(\"/\").filter(Boolean);\n\n if (segments.length === 0) return null;\n\n // Take the last segment as candidate filename\n let lastSegment =\n segments[segments.length - 1]?.split(\"?\")[0]?.split(\"#\")[0] || \"\";\n // Strip trailing ? or # that is alone\n lastSegment = lastSegment?.replace(/[?#]+$/, \"\");\n if (!lastSegment) return null;\n\n // Replace encoded slashes and dots\n lastSegment = lastSegment\n .replace(/%2F/gi, \"/\")\n .replace(/%5C/gi, \"\\\\\")\n .replace(/%2E/gi, \".\");\n\n // If replacement introduces new slashes, take the new last segment\n if (lastSegment.includes(\"/\")) {\n const parts = lastSegment.split(\"/\").filter(Boolean);\n lastSegment = parts[parts.length - 1] || \"\";\n }\n\n let filename = decodeURIComponent(lastSegment);\n\n if (!filename) return null;\n\n // Special filenames always returned as-is (even if trailing slash)\n if (SPECIAL_FILENAMES.has(filename)) return filename;\n\n // Dotfiles like \".env\" should be returned as-is (single leading dot, no other dot)\n if (/^\\.[^.\\s][^/]*$/.test(filename)) return filename;\n\n // If the original pathname ends with \"/\" and the last segment doesn't look like a file\n // const originalEndsWithSlash = pathname.endsWith(\"/\");\n if (!filename.includes(\".\")) return null;\n\n // Strip double extensions first\n const sortedDouble = [...DOUBLE_EXTENSIONS_FILE].sort(\n (a, b) => b.length - a.length\n );\n for (const ext of sortedDouble) {\n const dotExt = `.${ext.toLowerCase()}`;\n if (filename.toLowerCase().endsWith(dotExt)) {\n filename = filename.slice(0, filename.length - dotExt.length);\n break;\n }\n }\n\n // Strip single extensions\n const sortedSingle = [...EXTENSIONS_FILE].sort((a, b) => b.length - a.length);\n for (const ext of sortedSingle) {\n const dotExt = `.${ext.toLowerCase()}`;\n if (filename.toLowerCase().endsWith(dotExt)) {\n filename = filename.slice(0, filename.length - dotExt.length);\n break;\n }\n }\n\n return filename || null;\n};\n"],"mappings":";;;;;;;;;;;;;;AAGA,MAAa,kBAAkB,IAAI,IAAI;CAErC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAIA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACD,CAAC;AAKF,MAAa,yBAAyB,IAAI,IAAI;CAC5C;CACA;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"}
1
+ {"version":3,"file":"parsers-BLHzVoh-.js","names":[],"sources":["../src/parsers/_private/extensions.ts","../src/parsers/extractFileName.ts"],"sourcesContent":["// ==========================\n// Single extensions\n// ==========================\nexport const EXTENSIONS_FILE = new Set([\n // 📄 Text & Document\n \"txt\",\n \"md\",\n \"rtf\",\n \"tex\",\n \"doc\",\n \"docx\",\n \"odt\",\n \"ott\",\n \"pdf\",\n \"djvu\",\n \"epub\",\n \"fb2\",\n \"lit\",\n \"lrf\",\n \"xls\",\n \"xlsx\",\n \"ods\",\n \"csv\",\n \"tsv\",\n \"ppt\",\n \"pptx\",\n \"pps\",\n \"bib\",\n \"cba\",\n \"cbt\",\n \"cbz\",\n \"cbr\",\n \"opds\",\n \"fodt\",\n \"pages\",\n \"rtfd\",\n \"sxc\",\n \"sxw\",\n \"wpd\",\n \"xps\",\n \"dotx\",\n \"dotm\",\n \"xltx\",\n \"xltm\",\n \"sldx\",\n \"sldm\",\n \"fods\",\n \"mdx\",\n \"markdown\",\n \"texi\",\n \"textile\",\n\n // 🖼️ Image\n \"jpg\",\n \"jpeg\",\n \"png\",\n \"gif\",\n \"bmp\",\n \"tif\",\n \"tiff\",\n \"webp\",\n \"svg\",\n \"ico\",\n \"heif\",\n \"heic\",\n \"raw\",\n \"cr2\",\n \"nef\",\n \"orf\",\n \"sr2\",\n \"dng\",\n \"dds\",\n \"psd\",\n \"exr\",\n \"xcf\",\n \"ai\",\n \"eps\",\n \"cdr\",\n \"indd\",\n \"pcx\",\n \"pgm\",\n \"ppm\",\n \"pbm\",\n \"pnm\",\n \"jfif\",\n \"ras\",\n \"tga\",\n \"j2k\",\n \"jp2\",\n \"emf\",\n \"wmf\",\n \"hdp\",\n \"mdi\",\n \"hevc\",\n\n // 🎵 Audio\n \"mp3\",\n \"wav\",\n \"ogg\",\n \"flac\",\n \"aac\",\n \"m4a\",\n \"wma\",\n \"alac\",\n \"aiff\",\n \"aif\",\n \"amr\",\n \"mid\",\n \"midi\",\n \"opus\",\n \"au\",\n \"caf\",\n \"ape\",\n \"mka\",\n \"spx\",\n \"ra\",\n \"ram\",\n \"mpc\",\n \"wv\",\n \"aifc\",\n \"mod\",\n \"it\",\n \"s3m\",\n \"xm\",\n \"kar\",\n \"m4b\",\n \"voc\",\n \"snd\",\n \"a52\",\n \"ac3\",\n \"dts\",\n\n // 🎥 Video\n \"mp4\",\n \"mkv\",\n \"avi\",\n \"mov\",\n \"wmv\",\n \"webm\",\n \"mpeg\",\n \"mpg\",\n \"3gp\",\n \"3g2\",\n \"m4v\",\n \"ts\",\n \"mts\",\n \"asf\",\n \"rm\",\n \"rmvb\",\n \"vob\",\n \"f4v\",\n \"ogv\",\n \"m2ts\",\n \"dav\",\n \"mxf\",\n \"mjpeg\",\n \"flv\",\n \"divx\",\n \"f4a\",\n \"f4p\",\n \"m2v\",\n \"ogm\",\n \"vp8\",\n \"vp9\",\n \"xvid\",\n \"yuv\",\n \"mng\",\n \"dv\",\n \"m1v\",\n \"roq\",\n \"m2t\",\n \"av1\",\n \"hevc\",\n \"m3u\",\n \"m3u8\",\n\n // 🗃️ Archive & Compression\n \"zip\",\n \"rar\",\n \"7z\",\n \"tar\",\n \"gz\",\n \"bz\",\n \"bz2\",\n \"xz\",\n \"tgz\",\n \"tbz2\",\n \"txz\",\n \"lz\",\n \"lzma\",\n \"z\",\n \"cab\",\n \"arj\",\n \"ace\",\n \"rpm\",\n \"deb\",\n \"pkg\",\n \"apk\",\n \"jar\",\n \"war\",\n \"ear\",\n \"sit\",\n \"sitx\",\n \"cpgz\",\n \"tlz\",\n \"tlzma\",\n \"tzo\",\n \"cpio\",\n \"shar\",\n \"bzip\",\n \"gzip\",\n \"7zip\",\n \"rar5\",\n \"tbz\",\n \"txz\",\n\n // 💾 Disk Image\n \"iso\",\n \"img\",\n \"vhd\",\n \"vmdk\",\n \"qcow2\",\n \"vhdx\",\n \"bin\",\n \"cue\",\n \"nrg\",\n \"daa\",\n \"sdi\",\n \"vfd\",\n \"ima\",\n \"dmg\",\n \"vdi\",\n \"toast\",\n \"ccd\",\n \"mdf\",\n \"cdi\",\n \"bif\",\n \"bifc\",\n \"bifd\",\n\n // 🗃️ Database & Data\n \"sql\",\n \"db\",\n \"dbf\",\n \"mdb\",\n \"accdb\",\n \"json\",\n \"toml\",\n \"ini\",\n \"log\",\n \"plist\",\n \"pkl\",\n \"msgpack\",\n \"h5\",\n \"hdf5\",\n \"parquet\",\n \"avro\",\n \"orc\",\n \"ndjson\",\n \"pdb\",\n \"sqlite\",\n \"sqlite3\",\n \"dbx\",\n \"sdf\",\n \"nc\",\n \"netcdf\",\n \"grib\",\n \"geojson\",\n \"gml\",\n \"hjson\",\n \"cdb\",\n \"db3\",\n \"dta\",\n \"sav\",\n \"sas7bdat\",\n \"ldif\",\n \"fdb\",\n \"gdb\",\n \"sqlite2\",\n \"h5ad\",\n \"nc4\",\n \"xmind\",\n \"drawio\",\n \"sdc\",\n \"jsonl\",\n \"yaml\",\n \"yml\",\n \"toml\",\n\n // 💻 Code & Script\n \"js\",\n \"jsx\",\n \"ts\",\n \"tsx\",\n \"c\",\n \"cpp\",\n \"net\",\n \"h\",\n \"hpp\",\n \"java\",\n \"py\",\n \"rb\",\n \"go\",\n \"rs\",\n \"php\",\n \"pl\",\n \"sh\",\n \"bat\",\n \"cmd\",\n \"ps1\",\n \"lua\",\n \"swift\",\n \"kt\",\n \"scala\",\n \"cs\",\n \"vb\",\n \"dart\",\n \"m\",\n \"r\",\n \"jl\",\n \"fs\",\n \"vbproj\",\n \"sln\",\n \"pri\",\n \"gemspec\",\n \"gradle\",\n \"coffee\",\n \"erl\",\n \"ex\",\n \"exs\",\n \"hs\",\n \"lisp\",\n \"clj\",\n \"groovy\",\n \"scm\",\n \"vbs\",\n \"nim\",\n \"rkt\",\n \"ml\",\n \"mli\",\n \"fsx\",\n \"psm1\",\n \"cbl\",\n \"for\",\n \"f90\",\n \"lock\",\n \"tsconfig\",\n \"vue\",\n \"svelte\",\n \"cjs\",\n \"mjs\",\n \"mts\",\n \"cts\",\n \"json5\",\n \"es6\",\n \"module\",\n \"systemjs\",\n\n // 🌐 Web & Config\n \"html\",\n \"htm\",\n \"xhtml\",\n \"css\",\n \"scss\",\n \"sass\",\n \"less\",\n \"xml\",\n \"xlf\",\n \"po\",\n \"pot\",\n \"jsp\",\n \"asp\",\n \"aspx\",\n \"jspf\",\n \"cgi\",\n \"cfm\",\n \"env\",\n \"babelrc\",\n \"cfg\",\n \"config\",\n \"conf\",\n \"editorconfig\",\n \"eslintrc\",\n \"gitconfig\",\n \"gitattributes\",\n \"gitignore\",\n \"prettierrc\",\n \"webmanifest\",\n \"dockerfile\",\n // \".dockerfile\",\n\n // 🔠 Font\n \"ttf\",\n \"otf\",\n \"woff\",\n \"woff2\",\n \"eot\",\n \"dfont\",\n \"pfa\",\n \"pfb\",\n \"fon\",\n \"fnt\",\n \"bdf\",\n \"ps\",\n\n // 🗺️ CAD & GIS\n \"dwg\",\n \"dxf\",\n \"shp\",\n \"kml\",\n \"kmz\",\n \"gpx\",\n \"stl\",\n \"step\",\n \"iges\",\n \"igs\",\n \"3ds\",\n \"3dm\",\n \"fbx\",\n \"obj\",\n \"dae\",\n \"ifc\",\n\n // 🔧 System / Binary / Execution\n \"exe\",\n \"msi\",\n \"run\",\n \"com\",\n \"app\",\n \"elf\",\n \"dll\",\n \"so\",\n \"dylib\",\n \"sys\",\n \"scr\",\n \"bin\",\n \"out\",\n\n // 🔐 Certificates / Crypto\n \"pem\",\n \"crt\",\n \"cer\",\n \"der\",\n \"csr\",\n \"p12\",\n \"pfx\",\n \"jks\",\n \"asc\",\n \"gpg\",\n \"pgp\",\n \"p7b\",\n \"p7c\",\n \"spc\",\n \"key\",\n \"pub\",\n \"cert\",\n \"p7m\",\n\n // 🎮 Games & Projects\n \"nes\",\n \"sfc\",\n \"gba\",\n \"nds\",\n \"rom\",\n \"pak\",\n \"vpk\",\n \"bik\",\n \"cso\",\n \"wad\",\n \"wadx\",\n \"smc\",\n \"gb\",\n \"gbc\",\n\n // 🔬 Bioinformatics\n \"fasta\",\n \"fa\",\n \"fas\",\n \"ffn\",\n \"faa\",\n \"fna\",\n \"frn\",\n \"fastq\",\n \"fq\",\n \"bam\",\n \"bed\",\n \"sam\",\n \"vcf\",\n \"gff\",\n \"gff3\",\n \"gtf\",\n \"fai\",\n \"tbi\",\n \"fast5\",\n \"fqz\",\n \"fq5\"\n]);\n\n// ==========================\n// Double extensions\n// ==========================\nexport const DOUBLE_EXTENSIONS_FILE = new Set([\n \"log.gz\",\n \"tar.gz\",\n \"tar.bz2\",\n \"tar.bz\",\n \"tar.xz\",\n \"tar.lz\",\n \"tar.lzma\",\n \"tar.Z\",\n \"tar.zst\",\n \"tar.lz4\",\n \"log.gz\",\n \"sql.gz\",\n \"csv.gz\",\n \"tsv.gz\",\n \"json.gz\",\n \"ndjson.gz\",\n \"fq.gz\",\n \"sam.gz\",\n \"fasta.gz\",\n \"fa.gz\",\n \"ffn.gz\",\n \"faa.gz\",\n \"fna.gz\",\n \"frn.gz\",\n \"fastq.gz\",\n \"js.map\",\n \"css.map\"\n]);\n\n// ==========================\n// Special filenames\n// ==========================\nexport const SPECIAL_FILENAMES = new Set([\n \"Makefile\",\n \"Dockerfile\",\n \".dockerignore\",\n \".npmrc\",\n \".envrc\",\n \".htgroup\",\n \".eslintignore\",\n \".env.test\",\n \".env.local\",\n \".env.production\",\n \".env.development\",\n \".env.example\",\n \".dockerfile\",\n \".htaccess\",\n \".htpasswd\",\n \".babelrc\",\n \".eslintrc\",\n \".editorconfig\",\n \".prettierignore\",\n \"docker-compose.override.yml\",\n \"docker-compose.yml\",\n \"Vagrantfile\",\n \"Procfile\",\n \"Gemfile\",\n \"Rakefile\",\n \"package.json\",\n \"package-lock.json\",\n \"yarn.lock\",\n \"pnpm-lock.yaml\",\n \"tsconfig.json\",\n \"webpack.config.js\",\n \"vite.config.js\",\n \"vite.config.ts\",\n \"Gruntfile.js\",\n \"gulpfile.js\",\n \"babel.config.js\",\n \"babel.js\",\n \"rollup.js\",\n\n // SPECIAL PRESERVE NAME\n \"CON\",\n \"NUL\",\n \"PRN\",\n \"AUX\",\n \"COM1\",\n \"COM2\",\n \"COM3\",\n \"COM4\",\n \"COM5\",\n \"COM6\",\n \"COM7\",\n \"COM8\",\n \"COM9\",\n \"LPT1\",\n \"LPT2\",\n \"LPT3\",\n \"LPT4\",\n \"LPT5\",\n \"LPT6\",\n \"LPT7\",\n \"LPT8\",\n \"LPT9\"\n]);\n","import { isNonEmptyString } from \"@/predicates/is/isNonEmptyString\";\nimport {\n DOUBLE_EXTENSIONS_FILE,\n EXTENSIONS_FILE,\n SPECIAL_FILENAMES\n} from \"./_private/extensions\";\n\nimport { punycodeUtilsJS } from \"@/urls/utils/punyCode\";\n\nimport { assertIsBoolean } from \"@/assertions/booleans/assertIsBoolean\";\nimport { assertIsPlainObject } from \"@/assertions/objects/assertIsPlainObject\";\n\nexport type ExtractFileNameOptions = {\n /** ----------------------------------------------------------\n * * ***Indicates whether the input should be treated as a potential domain string.***\n * ----------------------------------------------------------\n *\n * - Behavior when `true`:\n * - The `domainName` option is required and must be a string and non-empty string.\n * If `domainName` is `undefined`, `null`, or an empty string, a `TypeError` will be thrown.\n * - The `domainName` is used to determine if the input is a domain-only string.\n * - Returns `null` if the input exactly matches `domainName` or any of its subdomains **and** has no additional path or filename.\n * - If the input does not match `domainName` or its subdomains, it will be processed as a regular file-like name.\n * - Supports **Unicode/IDN domains** (e.g., `tést-ドメイン.com`) and **ASCII filenames**, mixed safely.\n *\n * @default false\n */\n domainAware?: boolean;\n\n /** ----------------------------------------------------------\n * * ***The base domain name used for comparison (e.g., `\"example.com\"`).***\n * ----------------------------------------------------------\n *\n * - Required when `domainAware` is `true`.\n * - Helps differentiate between a domain-only input (ignored) and a standalone file-like string (processed normally).\n * - Must be a string and non-empty string. Invalid values (`undefined`, `null`, or empty string) will trigger a `TypeError`.\n * - Works with both **ASCII domains** and **Unicode/IDN domains**.\n * - Example:\n * ```ts *\n * // ASCII domain + ASCII filename\n * extractFileName(\"resume.com\", {\n * domainAware: true,\n * domainName: \"example.com\"\n * });\n * // ➔ \"resume\"\n * extractFileName(\"example.com\", {\n * domainAware: true,\n * domainName: \"example.com\"\n * });\n * // ➔ null (because input is treated as domain-name)\n *\n * // Unicode domain + ASCII filename\n * extractFileName(\"tést-ドメイン.com/file.txt\", {\n * domainAware: true,\n * domainName: \"ドメイン.com\"\n * });\n * // ➔ \"file\"\n *\n * // Unicode domain + Unicode filename\n * extractFileName(\"tést-ドメイン.com/ファイル名.pdf\", {\n * domainAware: true,\n * domainName: \"ドメイン.com\"\n * });\n * // ➔ \"ファイル名\"\n *\n * // Invalid domainName, will throw TypeError\n * extractFileName(\"resume.com\", {\n * domainAware: true,\n * domainName: \"\"\n * });\n * // ➔ TypeError\n * ```\n *\n * @default undefined\n */\n domainName?: string;\n};\n\n/** ----------------------------------------------------------\n * * ***Utility: `extractFileName`.***\n * ----------------------------------------------------------\n *\n * **Extracts the **clean base filename** from nearly any input string, including URLs, local file paths,\n * UNC paths, and plain filenames.**\n *\n * - It automatically safely handles extracts the **base file name** (without extension) from:\n * - File system paths (Windows, Unix, UNC)\n * - Protocols like http, https, ftp, file, mailto, or custom schemes\n * - Percent-encoded, Unicode, and emoji characters\n * - Dotfiles, reserved OS names, multi-part extensions\n * - Data URIs\n * - Optional domain-aware mode to ignore domain-only inputs\n * - Plain filenames\n *\n * - Full support for:\n * - Unicode, emoji, percent-encoding\n * - Dotfiles (e.g., `.env`, `.gitignore`)\n * - Reserved/OS-protected filenames:\n * `CON`, `PRN`, `AUX`, `NUL`, `COM1`–`COM9`, `LPT1`–`LPT9`\n * - Known multi-part extensions:\n * `.tar.gz`, `.tar.bz2`, `.tar.xz`, `.tar.lz`, `.tar.zst`, `.min.js`, `.js.map`, `.log.gz`, `.sql.gz`,\n * `.backup.tar`, etc.\n * - Data URIs (`data:[mime];base64,...` ➔ payload string)\n * - Domain-aware mode (optional)\n *\n * ----------------------------------------------------------\n * - **Behavior / Features**\n * - Strips **known extensions**, including multi-part and common double/triple extensions.\n * - Leaves unknown/custom extensions intact.\n * - Preserves **dotfiles** as-is (leading dot preserved).\n * - Returns `null` if:\n * - input is `null`, `undefined`, or not a string\n * - input is empty, whitespace-only, or only slashes\n * - input represents a folder path (trailing slash/backslash, drive/folder only)\n * - input is a **domain-only string** in domain-aware mode\n * - Normalizes Windows-style backslashes (`\\`) internally as `/`.\n * - Supports UNC paths, mixed slashes, and Windows drive letters safely.\n * - Handles URLs:\n * - Ignores query strings (`?v=1.2.3`) and hash fragments (`#section`)\n * - Decodes percent-encoded filenames (`my%20file.txt` ➔ `my file.txt`)\n * - Supports protocol-relative URLs (`//cdn.example.com/file.jpg`)\n * - Supports uncommon/custom protocols (`ftp://`, `file://`, `mailto:`, etc.)\n * - Handles **multiple dots**, **trailing dots**, **triple or more extensions**\n * - Supports filenames on mixed Unicode/ASCII domains:\n * - Domain names can include Unicode characters (IDN / punycode)\n * - Filenames may contain ASCII, Unicode, and emoji characters\n * - Works correctly when domain is Unicode and filename is ASCII, or vice versa\n * - Supports extremely long filenames safely (up to OS limits)\n * - Domain-aware mode (`domainAware: true` + `domainName`):\n * - Parameter `domainName` must be a string and non-empty string; otherwise a TypeError is thrown.\n * - Returns `null` if input equals `domainName` or any subdomain with no file path\n * - Extracts filename normally if path/file exists on domain or other domain\n * - Safe in Node.js and browsers\n *\n * ----------------------------------------------------------\n * @param {string | null | undefined} input\n * URL, file path, or plain filename to extract from.\n *\n * @param {ExtractFileNameOptions} [options]\n * Optional configuration:\n * - `domainAware?: boolean` – treat input as a domain string. Requires `domainName` to be a string and non-empty string; otherwise, a TypeError is thrown.\n * - `domainName?: string` – base domain for comparison eg (`example.com`), required when `domainAware` is true.\n *\n * @returns {string | null}\n * - Base filename without known extensions\n * - Original filename if extension unknown\n * - `null` for invalid inputs, folder paths, or domain-only strings\n *\n * ----------------------------------------------------------\n * @example\n * ```ts\n * // Basic files\n * extractFileName(\"document.pdf\"); // ➔ \"document\"\n * extractFileName(\"/files/archive.tar.gz\"); // ➔ \"archive\"\n * extractFileName(\"C:\\\\path\\\\file.txt\"); // ➔ \"file\"\n * extractFileName(\".env\"); // ➔ \".env\"\n * extractFileName(\"folder/\"); // ➔ null\n *\n * // Not a file\n * extractFileName(\"not-file\"); // ➔ null\n * extractFileName(\"not-file/\"); // ➔ null\n * extractFileName(\"/not-file/\"); // ➔ null\n * extractFileName(\"/not-file\"); // ➔ null\n *\n * // URLs with queries, hashes, protocols\n * extractFileName(\"https://example.com/file.txt?ver=1\"); // ➔ \"file\"\n * extractFileName(\"https://example.com/archive.tar.gz#part\"); // ➔ \"archive\"\n * extractFileName(\"//cdn.example.com/image.png\"); // ➔ \"image\"\n *\n *\n * // Special protocol handling\n * extractFileName(\"tel:+6212345678\"); // ➔ \"+6212345678\"\n * extractFileName(\"sms:+6212345678\"); // ➔ \"+6212345678\"\n * extractFileName(\"mailto:user@domain.com\"); // ➔ \"user@domain\"\n * extractFileName(\"data:text/plain;base64,SGVsbG8=\"); // ➔ \"SGVsbG8=\"\n * extractFileName(\"mailto:resume.com\"); // ➔ \"resume\"\n * extractFileName(\"ftp://example.com/image.jpeg\"); // ➔ \"image\"\n * extractFileName(\"ftp://files.example.com/app.min.js\"); // ➔ \"app.min\"\n * extractFileName(\"file:///C:/path/to/document.pdf\"); // ➔ \"document\"\n * extractFileName(\"custom-scheme://example.com/video.mp4\"); // ➔ \"video\"\n *\n * // Unicode & emoji\n * extractFileName(\"emoji-😊.png\"); // ➔ \"emoji-😊\"\n * extractFileName(\"🔥project.tar.gz\"); // ➔ \"🔥project\"\n *\n * // Dotfiles\n * extractFileName(\".gitignore\"); // ➔ \".gitignore\"\n * extractFileName(\"/path/.bashrc\"); // ➔ \".bashrc\"\n *\n * // Mixed Unicode domain and ASCII filename\n * extractFileName(\"https://tést-ドメイン.com/file.txt\"); // ➔ \"file\"\n * extractFileName(\"https://example.com/ファイル名.pdf\"); // ➔ \"ファイル名\"\n * extractFileName(\"https://ドメイン例.com/emoji-🔥.png\"); // ➔ \"emoji-🔥\"\n *\n * // Reserved filenames\n * extractFileName(\"CON\"); // ➔ \"CON\"\n * extractFileName(\"NUL.txt\"); // ➔ \"NUL\"\n *\n * // Domain-aware mode\n * extractFileName(\"example.com\", {\n * domainAware: true,\n * domainName: \"example.com\"\n * });\n * // ➔ null\n * extractFileName(\"cdn.example.com\", {\n * domainAware: true,\n * domainName: \"example.com\"\n * });\n * // ➔ null\n * extractFileName(\"resume.com\", {\n * domainAware: true,\n * domainName: \"example.com\"\n * });\n * // ➔ \"resume\"\n * extractFileName(\"https://example.com/file.txt\", {\n * domainAware: true,\n * domainName: \"example.com\"\n * });\n * // ➔ \"file\"\n *\n * // Windows & UNC paths\n * extractFileName(\"C:\\\\Users\\\\rzl\\\\Documents\\\\file.txt\"); // ➔ \"file\"\n * extractFileName(\"\\\\\\\\SERVER\\\\share\\\\logs\\\\output.log\"); // ➔ \"output\"\n * extractFileName(\"C:/Users\\\\rzl/mix\\\\test.pdf\"); // ➔ \"test\"\n *\n * // Edge / extreme cases\n * extractFileName(\"https://example.com/my%20file%20name.txt\"); // ➔ \"my file name\"\n * extractFileName(\"app.min.js.map\"); // ➔ \"app.min\"\n * extractFileName(\"backup.tar.bak\"); // ➔ \"backup.tar.bak\" (unknown double extension)\n * extractFileName(\"filename.\"); // ➔ \"filename.\"\n * extractFileName(\"a\".repeat(255) + \".txt\"); // ➔ \"a\".repeat(255)\n * ```\n *\n * ----------------------------------------------------------\n * @note\n * - Robust: never throws, handles unusual inputs safely.\n * - Suitable for display, logging, or safe storage.\n * - Normalizes slashes consistently.\n * - Covers nearly all real-world filename, URL, path, data URI, and domain scenarios.\n * - Handles Windows UNC paths, mixed slashes, percent-encoded, Unicode/emoji filenames.\n * - Known multi-part extensions list can be extended without breaking functionality.\n */\nexport const extractFileName = (\n input?: string | null,\n options: ExtractFileNameOptions = {}\n): string | null => {\n if (!isNonEmptyString(input)) return null;\n\n assertIsPlainObject(options, {\n message: ({ currentType, validType }) =>\n `Second parameter (\\`options\\`) must be of type \\`${validType}\\`, but received: \\`${currentType}\\`.`\n });\n\n const { domainName, domainAware = false } = options;\n\n assertIsBoolean(domainAware, {\n message: ({ currentType, validType }) =>\n `Parameter \\`domainAware\\` property of the \\`options\\` (second parameter) must be of type \\`${validType}\\`, but received: \\`${currentType}\\`.`\n });\n\n let pathname = input.trim();\n\n // Normalize Windows backslashes\n pathname = pathname.replace(/\\\\/g, \"/\");\n\n // domain-aware mode\n if (domainAware) {\n if (!isNonEmptyString(domainName)) {\n throw new TypeError(\n \"If parameter `domainAware` is set to `true`, the option parameter `domainName` is required as string, and cant be an empty-string.\"\n );\n }\n\n const cleanDomain = punycodeUtilsJS\n .toASCII(domainName)\n .replace(/^https?:\\/\\//i, \"\")\n .replace(/^www\\./, \"\")\n .replace(/\\/.*$/, \"\")\n .toLowerCase();\n\n const inputDomain = punycodeUtilsJS\n .toASCII(input)\n .replace(/^https?:\\/\\//i, \"\")\n .replace(/^www\\./, \"\")\n .toLowerCase();\n\n const inputHost = inputDomain.split(\"/\")[0]?.split(/[?#]/)[0];\n const matchesDomain =\n inputHost === cleanDomain || inputHost?.endsWith(`.${cleanDomain}`);\n const hasPath = /\\/[^/]+$/.test(inputDomain);\n\n if (matchesDomain && !hasPath) return null;\n }\n\n // handle special protocol-like strings\n const protocolMatch = pathname.match(/^([a-zA-Z][a-zA-Z0-9+.-]*):(.+)$/);\n if (protocolMatch) {\n const scheme = protocolMatch[1]?.toLowerCase() || \"\";\n const rest = protocolMatch[2];\n\n if ([\"tel\", \"sms\"].some((sch) => sch.startsWith(scheme))) {\n const clean = rest?.split(\"?\")[0]?.split(\"#\")[0];\n return clean?.trim() || null;\n } else if (scheme === \"mailto\") {\n const parts = rest?.split(\"/\");\n let last = parts?.[parts.length - 1];\n last = last?.split(\"?\")[0]?.split(\"#\")[0]; // strip query/hash\n const dotIndex = last?.lastIndexOf(\".\");\n if (dotIndex && dotIndex > 0) last = last?.slice(0, dotIndex);\n return last || null;\n } else if (scheme === \"data\") {\n const commaIndex = rest?.indexOf(\",\") || -1;\n if (commaIndex === -1) return null;\n let payload = rest?.slice(commaIndex + 1);\n payload = payload?.split?.(\"?\")[0]?.split(\"#\")[0]; // strip query/hash\n return payload?.trim() || null;\n }\n }\n\n if (/^[a-z][a-z\\d+\\-.]*:\\/{3,}/i.test(pathname)) {\n // eg https:///file.txt (has more than 2 slash after : protocol)\n pathname = pathname.replace(/^[a-z][a-z\\d+\\-.]*:\\/{2,}/i, \"\");\n } else {\n try {\n const isProbablyUrl = /^[a-z][a-z\\d+\\-.]*:(\\/\\/)?/i.test(pathname);\n\n pathname = isProbablyUrl\n ? new URL(pathname).pathname\n : new URL(`http://localhost/${pathname}`).pathname;\n } catch {\n // Fallback for weird URLs like 'https:///file.txt'\n // Remove protocol + any number of slashes\n pathname = pathname.replace(/^[a-z][a-z\\d+\\-.]*:(\\/\\/)?/i, \"\");\n }\n }\n\n // split into non-empty segments\n const segments = pathname.split(\"/\").filter(Boolean);\n\n if (segments.length === 0) return null;\n\n // Take the last segment as candidate filename\n let lastSegment =\n segments[segments.length - 1]?.split(\"?\")[0]?.split(\"#\")[0] || \"\";\n // Strip trailing ? or # that is alone\n lastSegment = lastSegment?.replace(/[?#]+$/, \"\");\n if (!lastSegment) return null;\n\n // Replace encoded slashes and dots\n lastSegment = lastSegment\n .replace(/%2F/gi, \"/\")\n .replace(/%5C/gi, \"\\\\\")\n .replace(/%2E/gi, \".\");\n\n // If replacement introduces new slashes, take the new last segment\n if (lastSegment.includes(\"/\")) {\n const parts = lastSegment.split(\"/\").filter(Boolean);\n lastSegment = parts[parts.length - 1] || \"\";\n }\n\n let filename = decodeURIComponent(lastSegment);\n\n if (!filename) return null;\n\n // Special filenames always returned as-is (even if trailing slash)\n if (SPECIAL_FILENAMES.has(filename)) return filename;\n\n // Dotfiles like \".env\" should be returned as-is (single leading dot, no other dot)\n if (/^\\.[^.\\s][^/]*$/.test(filename)) return filename;\n\n // If the original pathname ends with \"/\" and the last segment doesn't look like a file\n // const originalEndsWithSlash = pathname.endsWith(\"/\");\n if (!filename.includes(\".\")) return null;\n\n // Strip double extensions first\n const sortedDouble = [...DOUBLE_EXTENSIONS_FILE].sort(\n (a, b) => b.length - a.length\n );\n for (const ext of sortedDouble) {\n const dotExt = `.${ext.toLowerCase()}`;\n if (filename.toLowerCase().endsWith(dotExt)) {\n filename = filename.slice(0, filename.length - dotExt.length);\n break;\n }\n }\n\n // Strip single extensions\n const sortedSingle = [...EXTENSIONS_FILE].sort((a, b) => b.length - a.length);\n for (const ext of sortedSingle) {\n const dotExt = `.${ext.toLowerCase()}`;\n if (filename.toLowerCase().endsWith(dotExt)) {\n filename = filename.slice(0, filename.length - dotExt.length);\n break;\n }\n }\n\n return filename || null;\n};\n"],"mappings":";;;;;;;;;;;;;;AAGA,MAAa,kBAAkB,IAAI,IAAI;CAErC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAIA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAKD,MAAa,yBAAyB,IAAI,IAAI;CAC5C;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;AAKD,MAAa,oBAAoB,IAAI,IAAI;CACvC;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CAGA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;CACA;AACF,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;ACnWD,MAAa,mBACX,OACA,UAAkC,CAAC,MACjB;CAClB,IAAI,CAAC,iBAAiB,KAAK,GAAG,OAAO;CAErC,oBAAoB,SAAS,EAC3B,UAAU,EAAE,aAAa,gBACvB,oDAAoD,UAAU,sBAAsB,YAAY,KACpG,CAAC;CAED,MAAM,EAAE,YAAY,cAAc,UAAU;CAE5C,gBAAgB,aAAa,EAC3B,UAAU,EAAE,aAAa,gBACvB,8FAA8F,UAAU,sBAAsB,YAAY,KAC9I,CAAC;CAED,IAAI,WAAW,MAAM,KAAK;CAG1B,WAAW,SAAS,QAAQ,OAAO,GAAG;CAGtC,IAAI,aAAa;EACf,IAAI,CAAC,iBAAiB,UAAU,GAC9B,MAAM,IAAI,UACR,oIACF;EAGF,MAAM,cAAc,gBACjB,QAAQ,UAAU,EAClB,QAAQ,iBAAiB,EAAE,EAC3B,QAAQ,UAAU,EAAE,EACpB,QAAQ,SAAS,EAAE,EACnB,YAAY;EAEf,MAAM,cAAc,gBACjB,QAAQ,KAAK,EACb,QAAQ,iBAAiB,EAAE,EAC3B,QAAQ,UAAU,EAAE,EACpB,YAAY;EAEf,MAAM,YAAY,YAAY,MAAM,GAAG,EAAE,IAAI,MAAM,MAAM,EAAE;EAC3D,MAAM,gBACJ,cAAc,eAAe,WAAW,SAAS,IAAI,aAAa;EACpE,MAAM,UAAU,WAAW,KAAK,WAAW;EAE3C,IAAI,iBAAiB,CAAC,SAAS,OAAO;CACxC;CAGA,MAAM,gBAAgB,SAAS,MAAM,kCAAkC;CACvE,IAAI,eAAe;EACjB,MAAM,SAAS,cAAc,IAAI,YAAY,KAAK;EAClD,MAAM,OAAO,cAAc;EAE3B,IAAI,CAAC,OAAO,KAAK,EAAE,MAAM,QAAQ,IAAI,WAAW,MAAM,CAAC,GAErD,QADc,MAAM,MAAM,GAAG,EAAE,IAAI,MAAM,GAAG,EAAE,KAChC,KAAK,KAAK;OACnB,IAAI,WAAW,UAAU;GAC9B,MAAM,QAAQ,MAAM,MAAM,GAAG;GAC7B,IAAI,OAAO,QAAQ,MAAM,SAAS;GAClC,OAAO,MAAM,MAAM,GAAG,EAAE,IAAI,MAAM,GAAG,EAAE;GACvC,MAAM,WAAW,MAAM,YAAY,GAAG;GACtC,IAAI,YAAY,WAAW,GAAG,OAAO,MAAM,MAAM,GAAG,QAAQ;GAC5D,OAAO,QAAQ;EACjB,OAAO,IAAI,WAAW,QAAQ;GAC5B,MAAM,aAAa,MAAM,QAAQ,GAAG,KAAK;GACzC,IAAI,eAAe,IAAI,OAAO;GAC9B,IAAI,UAAU,MAAM,MAAM,aAAa,CAAC;GACxC,UAAU,SAAS,QAAQ,GAAG,EAAE,IAAI,MAAM,GAAG,EAAE;GAC/C,OAAO,SAAS,KAAK,KAAK;EAC5B;CACF;CAEA,IAAI,6BAA6B,KAAK,QAAQ,GAE5C,WAAW,SAAS,QAAQ,8BAA8B,EAAE;MAE5D,IAAI;EAGF,WAFsB,8BAA8B,KAAK,QAElC,IACnB,IAAI,IAAI,QAAQ,EAAE,WAClB,IAAI,IAAI,oBAAoB,UAAU,EAAE;CAC9C,QAAQ;EAGN,WAAW,SAAS,QAAQ,+BAA+B,EAAE;CAC/D;CAIF,MAAM,WAAW,SAAS,MAAM,GAAG,EAAE,OAAO,OAAO;CAEnD,IAAI,SAAS,WAAW,GAAG,OAAO;CAGlC,IAAI,cACF,SAAS,SAAS,SAAS,IAAI,MAAM,GAAG,EAAE,IAAI,MAAM,GAAG,EAAE,MAAM;CAEjE,cAAc,aAAa,QAAQ,UAAU,EAAE;CAC/C,IAAI,CAAC,aAAa,OAAO;CAGzB,cAAc,YACX,QAAQ,SAAS,GAAG,EACpB,QAAQ,SAAS,IAAI,EACrB,QAAQ,SAAS,GAAG;CAGvB,IAAI,YAAY,SAAS,GAAG,GAAG;EAC7B,MAAM,QAAQ,YAAY,MAAM,GAAG,EAAE,OAAO,OAAO;EACnD,cAAc,MAAM,MAAM,SAAS,MAAM;CAC3C;CAEA,IAAI,WAAW,mBAAmB,WAAW;CAE7C,IAAI,CAAC,UAAU,OAAO;CAGtB,IAAI,kBAAkB,IAAI,QAAQ,GAAG,OAAO;CAG5C,IAAI,kBAAkB,KAAK,QAAQ,GAAG,OAAO;CAI7C,IAAI,CAAC,SAAS,SAAS,GAAG,GAAG,OAAO;CAGpC,MAAM,eAAe,CAAC,GAAG,sBAAsB,EAAE,MAC9C,GAAG,MAAM,EAAE,SAAS,EAAE,MACzB;CACA,KAAK,MAAM,OAAO,cAAc;EAC9B,MAAM,SAAS,IAAI,IAAI,YAAY;EACnC,IAAI,SAAS,YAAY,EAAE,SAAS,MAAM,GAAG;GAC3C,WAAW,SAAS,MAAM,GAAG,SAAS,SAAS,OAAO,MAAM;GAC5D;EACF;CACF;CAGA,MAAM,eAAe,CAAC,GAAG,eAAe,EAAE,MAAM,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM;CAC5E,KAAK,MAAM,OAAO,cAAc;EAC9B,MAAM,SAAS,IAAI,IAAI,YAAY;EACnC,IAAI,SAAS,YAAY,EAAE,SAAS,MAAM,GAAG;GAC3C,WAAW,SAAS,MAAM,GAAG,SAAS,SAAS,OAAO,MAAM;GAC5D;EACF;CACF;CAEA,OAAO,YAAY;AACrB"}