@rzl-zone/utils-js 3.12.0 โ†’ 3.12.1-beta.1

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 (286) hide show
  1. package/{LICENSE.md โ†’ LICENSE} +3 -3
  2. package/README.md +69 -96
  3. package/dist/.references/index.d.cts +25 -0
  4. package/dist/.references/index.d.ts +25 -0
  5. package/dist/assertIsArray-DJXkjHZs.cjs +26 -0
  6. package/dist/assertIsArray-DJXkjHZs.cjs.map +1 -0
  7. package/dist/assertIsArray-bTA3XLjq.js +20 -0
  8. package/dist/assertIsArray-bTA3XLjq.js.map +1 -0
  9. package/dist/assertIsBoolean-C8WEXVr2.cjs +1283 -0
  10. package/dist/assertIsBoolean-C8WEXVr2.cjs.map +1 -0
  11. package/dist/assertIsBoolean-DR1SaXPD.js +1073 -0
  12. package/dist/assertIsBoolean-DR1SaXPD.js.map +1 -0
  13. package/dist/assertIsString-BiHQSrB2.cjs +26 -0
  14. package/dist/assertIsString-BiHQSrB2.cjs.map +1 -0
  15. package/dist/assertIsString-CEB07_83.js +20 -0
  16. package/dist/assertIsString-CEB07_83.js.map +1 -0
  17. package/dist/assertions/index.cjs +37 -40
  18. package/dist/assertions/index.cjs.map +1 -0
  19. package/dist/assertions/index.d.cts +12 -0
  20. package/dist/assertions/index.d.ts +10 -824
  21. package/dist/assertions/index.js +30 -13
  22. package/dist/assertions/index.js.map +1 -0
  23. package/dist/conversions/index.cjs +34 -103
  24. package/dist/conversions/index.d.cts +12 -0
  25. package/dist/conversions/index.d.ts +10 -1791
  26. package/dist/conversions/index.js +14 -24
  27. package/dist/conversions-BNIh_tCH.js +380 -0
  28. package/dist/conversions-BNIh_tCH.js.map +1 -0
  29. package/dist/conversions-D_Kh0a_C.cjs +446 -0
  30. package/dist/conversions-D_Kh0a_C.cjs.map +1 -0
  31. package/dist/events/index.cjs +55 -31
  32. package/dist/events/index.cjs.map +1 -0
  33. package/dist/events/index.d.cts +176 -0
  34. package/dist/events/index.d.ts +164 -166
  35. package/dist/events/index.js +50 -12
  36. package/dist/events/index.js.map +1 -0
  37. package/dist/formatEnvPort-B3OLxQk9.cjs +171 -0
  38. package/dist/formatEnvPort-B3OLxQk9.cjs.map +1 -0
  39. package/dist/formatEnvPort-ByFVLjSV.js +159 -0
  40. package/dist/formatEnvPort-ByFVLjSV.js.map +1 -0
  41. package/dist/formatters/index.cjs +21 -61
  42. package/dist/formatters/index.d.cts +12 -0
  43. package/dist/formatters/index.d.ts +10 -2152
  44. package/dist/formatters/index.js +10 -18
  45. package/dist/formatters--1m_vpE8.js +369 -0
  46. package/dist/formatters--1m_vpE8.js.map +1 -0
  47. package/dist/formatters-Cbij0XLU.cjs +429 -0
  48. package/dist/formatters-Cbij0XLU.cjs.map +1 -0
  49. package/dist/generators/index.cjs +165 -41
  50. package/dist/generators/index.cjs.map +1 -0
  51. package/dist/generators/index.d.cts +12 -0
  52. package/dist/generators/index.d.ts +10 -338
  53. package/dist/generators/index.js +158 -14
  54. package/dist/generators/index.js.map +1 -0
  55. package/dist/index-59zbLcPr.d.ts +340 -0
  56. package/dist/index-B6tawc8L.d.cts +1716 -0
  57. package/dist/index-C267akkJ.d.ts +2158 -0
  58. package/dist/index-CeBC2Vvl.d.cts +2361 -0
  59. package/dist/index-CgRDTI6f.d.ts +822 -0
  60. package/dist/index-CoiUBVmr.d.ts +720 -0
  61. package/dist/index-D4fcasfZ.d.cts +720 -0
  62. package/dist/index-DDrSQKIc.d.ts +1716 -0
  63. package/dist/index-DsGxO31H.d.cts +765 -0
  64. package/dist/index-Hg1qJkjl.d.ts +765 -0
  65. package/dist/index-Qm3iFwd0.d.cts +2158 -0
  66. package/dist/index-UPp94Agr.d.ts +2361 -0
  67. package/dist/index-gBA_8SuF.d.cts +340 -0
  68. package/dist/index-jyDqzicx.d.cts +822 -0
  69. package/dist/isBigInt-C4krUeAw.cjs +20 -0
  70. package/dist/isBigInt-C4krUeAw.cjs.map +1 -0
  71. package/dist/isBigInt-DKe0M6hp.js +14 -0
  72. package/dist/isBigInt-DKe0M6hp.js.map +1 -0
  73. package/dist/isEmptyObject-DCipFwxJ.js +25 -0
  74. package/dist/isEmptyObject-DCipFwxJ.js.map +1 -0
  75. package/dist/isEmptyObject-ZkSwRC_D.cjs +37 -0
  76. package/dist/isEmptyObject-ZkSwRC_D.cjs.map +1 -0
  77. package/dist/isEmptyString-BXzKAC2j.js +15 -0
  78. package/dist/isEmptyString-BXzKAC2j.js.map +1 -0
  79. package/dist/isEmptyString-UiiUsSQj.cjs +21 -0
  80. package/dist/isEmptyString-UiiUsSQj.cjs.map +1 -0
  81. package/dist/isEmptyValue-BQzcjVaL.cjs +30 -0
  82. package/dist/isEmptyValue-BQzcjVaL.cjs.map +1 -0
  83. package/dist/isEmptyValue-jqOr7OHD.js +24 -0
  84. package/dist/isEmptyValue-jqOr7OHD.js.map +1 -0
  85. package/dist/isEqual-BX49cF9m.js +87 -0
  86. package/dist/isEqual-BX49cF9m.js.map +1 -0
  87. package/dist/isEqual-BvumA3RA.cjs +111 -0
  88. package/dist/isEqual-BvumA3RA.cjs.map +1 -0
  89. package/dist/isFinite-BCnaDpod.js +15 -0
  90. package/dist/isFinite-BCnaDpod.js.map +1 -0
  91. package/dist/isFinite-D24ZaE6c.cjs +21 -0
  92. package/dist/isFinite-D24ZaE6c.cjs.map +1 -0
  93. package/dist/isInteger-Caeuz0rB.cjs +20 -0
  94. package/dist/isInteger-Caeuz0rB.cjs.map +1 -0
  95. package/dist/isInteger-naMbJsxJ.js +14 -0
  96. package/dist/isInteger-naMbJsxJ.js.map +1 -0
  97. package/dist/isPlainObject-BF-2-phb.d.cts +339 -0
  98. package/dist/isPlainObject-DxNDL8XU.d.ts +339 -0
  99. package/dist/isServer-BJHVnixd.cjs +20 -0
  100. package/dist/isServer-BJHVnixd.cjs.map +1 -0
  101. package/dist/isServer-Da3o3XSs.js +14 -0
  102. package/dist/isServer-Da3o3XSs.js.map +1 -0
  103. package/dist/isTypedArray-DuNA8tK6.js +31 -0
  104. package/dist/isTypedArray-DuNA8tK6.js.map +1 -0
  105. package/dist/isTypedArray-TJptiw2b.cjs +43 -0
  106. package/dist/isTypedArray-TJptiw2b.cjs.map +1 -0
  107. package/dist/isURL-C-kSk6KJ.js +14 -0
  108. package/dist/isURL-C-kSk6KJ.js.map +1 -0
  109. package/dist/isURL-DeUPO_oR.cjs +20 -0
  110. package/dist/isURL-DeUPO_oR.cjs.map +1 -0
  111. package/dist/isValidDomain-BB9IGhJs.cjs +1845 -0
  112. package/dist/isValidDomain-BB9IGhJs.cjs.map +1 -0
  113. package/dist/isValidDomain-DoE98yhJ.js +1827 -0
  114. package/dist/isValidDomain-DoE98yhJ.js.map +1 -0
  115. package/dist/next/index.cjs +119 -214
  116. package/dist/next/index.cjs.map +1 -0
  117. package/dist/next/index.d.cts +220 -0
  118. package/dist/next/index.d.ts +203 -214
  119. package/dist/next/index.js +117 -212
  120. package/dist/next/index.js.map +1 -0
  121. package/dist/next/server/index.cjs +25 -40
  122. package/dist/next/server/index.cjs.map +1 -0
  123. package/dist/next/server/index.d.cts +39 -0
  124. package/dist/next/server/index.d.ts +34 -35
  125. package/dist/next/server/index.js +23 -38
  126. package/dist/next/server/index.js.map +1 -0
  127. package/dist/noop-B13_ii35.cjs +18 -0
  128. package/dist/noop-B13_ii35.cjs.map +1 -0
  129. package/dist/noop-ubqAIbHD.js +12 -0
  130. package/dist/noop-ubqAIbHD.js.map +1 -0
  131. package/dist/normalizeSpaces-Bg2IZW7W.js +23 -0
  132. package/dist/normalizeSpaces-Bg2IZW7W.js.map +1 -0
  133. package/dist/normalizeSpaces-ZXnR4Qzp.cjs +29 -0
  134. package/dist/normalizeSpaces-ZXnR4Qzp.cjs.map +1 -0
  135. package/dist/normalizeString-BDdkaXui.js +15 -0
  136. package/dist/normalizeString-BDdkaXui.js.map +1 -0
  137. package/dist/normalizeString-BE6ELqEb.cjs +21 -0
  138. package/dist/normalizeString-BE6ELqEb.cjs.map +1 -0
  139. package/dist/operations/index.cjs +65 -32
  140. package/dist/operations/index.cjs.map +1 -0
  141. package/dist/operations/index.d.cts +139 -0
  142. package/dist/operations/index.d.ts +129 -134
  143. package/dist/operations/index.js +61 -17
  144. package/dist/operations/index.js.map +1 -0
  145. package/dist/parsers/index.cjs +12 -19
  146. package/dist/parsers/index.d.cts +239 -0
  147. package/dist/parsers/index.d.ts +234 -235
  148. package/dist/parsers/index.js +10 -12
  149. package/dist/parsers-BSBPgvsq.js +643 -0
  150. package/dist/parsers-BSBPgvsq.js.map +1 -0
  151. package/dist/parsers-OqDeffqc.cjs +649 -0
  152. package/dist/parsers-OqDeffqc.cjs.map +1 -0
  153. package/dist/parsing-Cao8b358.js +50 -0
  154. package/dist/parsing-Cao8b358.js.map +1 -0
  155. package/dist/parsing-DOGSCH6N.cjs +56 -0
  156. package/dist/parsing-DOGSCH6N.cjs.map +1 -0
  157. package/dist/predicates/index.cjs +91 -296
  158. package/dist/predicates/index.d.cts +13 -0
  159. package/dist/predicates/index.d.ts +12 -2482
  160. package/dist/predicates/index.js +23 -25
  161. package/dist/predicates-Bj6meyXV.js +256 -0
  162. package/dist/predicates-Bj6meyXV.js.map +1 -0
  163. package/dist/predicates-D0ubqgqy.cjs +412 -0
  164. package/dist/predicates-D0ubqgqy.cjs.map +1 -0
  165. package/dist/promises/index.cjs +76 -24
  166. package/dist/promises/index.cjs.map +1 -0
  167. package/dist/promises/index.d.cts +123 -0
  168. package/dist/promises/index.d.ts +116 -119
  169. package/dist/promises/index.js +73 -13
  170. package/dist/promises/index.js.map +1 -0
  171. package/dist/punyCode-8SrbMWfM.js +179 -0
  172. package/dist/punyCode-8SrbMWfM.js.map +1 -0
  173. package/dist/punyCode-D-Qu6nj6.cjs +185 -0
  174. package/dist/punyCode-D-Qu6nj6.cjs.map +1 -0
  175. package/dist/removeSpaces-Bmc5DX4F.js +19 -0
  176. package/dist/removeSpaces-Bmc5DX4F.js.map +1 -0
  177. package/dist/removeSpaces-CWIvhZHg.cjs +25 -0
  178. package/dist/removeSpaces-CWIvhZHg.cjs.map +1 -0
  179. package/dist/rzl-utils.global.js +20 -9
  180. package/dist/safeJsonParse-BP38mwlj.js +184 -0
  181. package/dist/safeJsonParse-BP38mwlj.js.map +1 -0
  182. package/dist/safeJsonParse-Sms2CJf4.cjs +208 -0
  183. package/dist/safeJsonParse-Sms2CJf4.cjs.map +1 -0
  184. package/dist/safeStableStringify-CJtP89qn.cjs +106 -0
  185. package/dist/safeStableStringify-CJtP89qn.cjs.map +1 -0
  186. package/dist/safeStableStringify-CXOZ9Ub8.js +88 -0
  187. package/dist/safeStableStringify-CXOZ9Ub8.js.map +1 -0
  188. package/dist/strings/index.cjs +79 -81
  189. package/dist/strings/index.cjs.map +1 -0
  190. package/dist/strings/index.d.cts +12 -0
  191. package/dist/strings/index.d.ts +10 -775
  192. package/dist/strings/index.js +62 -14
  193. package/dist/strings/index.js.map +1 -0
  194. package/dist/tailwind/index.cjs +19 -47
  195. package/dist/tailwind/index.d.cts +12 -0
  196. package/dist/tailwind/index.d.ts +11 -712
  197. package/dist/tailwind/index.js +10 -12
  198. package/dist/tailwind-B2ssevxq.js +199 -0
  199. package/dist/tailwind-B2ssevxq.js.map +1 -0
  200. package/dist/tailwind-CHIx9uxu.cjs +247 -0
  201. package/dist/tailwind-CHIx9uxu.cjs.map +1 -0
  202. package/dist/toStringArrayUnRecursive-C4zYCja7.cjs +51 -0
  203. package/dist/toStringArrayUnRecursive-C4zYCja7.cjs.map +1 -0
  204. package/dist/toStringArrayUnRecursive-DJGtPsFb.js +39 -0
  205. package/dist/toStringArrayUnRecursive-DJGtPsFb.js.map +1 -0
  206. package/dist/urls/index.cjs +130 -57
  207. package/dist/urls/index.cjs.map +1 -0
  208. package/dist/urls/index.d.cts +737 -0
  209. package/dist/urls/index.d.ts +699 -708
  210. package/dist/urls/index.js +122 -26
  211. package/dist/urls/index.js.map +1 -0
  212. package/package.json +203 -194
  213. package/dist/chunk-2AFQ33D3.cjs +0 -64
  214. package/dist/chunk-2CYDJVGM.js +0 -246
  215. package/dist/chunk-2MW4JDQ2.cjs +0 -598
  216. package/dist/chunk-2VTDXC3N.cjs +0 -1825
  217. package/dist/chunk-44XX2P34.js +0 -209
  218. package/dist/chunk-4YLBKLGS.cjs +0 -18
  219. package/dist/chunk-566CXQW7.cjs +0 -560
  220. package/dist/chunk-57EPKYID.cjs +0 -397
  221. package/dist/chunk-5MGEC3YG.js +0 -63
  222. package/dist/chunk-6EF52423.cjs +0 -249
  223. package/dist/chunk-6SCOKU3S.js +0 -109
  224. package/dist/chunk-6VUXD3CF.js +0 -119
  225. package/dist/chunk-7B76BSNK.cjs +0 -118
  226. package/dist/chunk-7Y6I2DSU.cjs +0 -101
  227. package/dist/chunk-A7S7E2EE.cjs +0 -308
  228. package/dist/chunk-AJZ6PMMZ.js +0 -16
  229. package/dist/chunk-AXGBL2IO.cjs +0 -251
  230. package/dist/chunk-B4TC6FBV.cjs +0 -678
  231. package/dist/chunk-BAV5T2E3.cjs +0 -15
  232. package/dist/chunk-BKIJBNIE.js +0 -21
  233. package/dist/chunk-BNIMTFK5.js +0 -59
  234. package/dist/chunk-BXW7YXB7.js +0 -1823
  235. package/dist/chunk-CFYZC4S6.js +0 -53
  236. package/dist/chunk-CSG4SCL3.js +0 -1587
  237. package/dist/chunk-CWQW7AKK.js +0 -676
  238. package/dist/chunk-DVMHRLKP.cjs +0 -16
  239. package/dist/chunk-EN7LVZBZ.js +0 -548
  240. package/dist/chunk-EV4Y7HCY.cjs +0 -26
  241. package/dist/chunk-F66VDYIZ.cjs +0 -18
  242. package/dist/chunk-FLJX37EL.cjs +0 -30
  243. package/dist/chunk-GKC3UDMC.cjs +0 -1623
  244. package/dist/chunk-H65I3GRZ.cjs +0 -106
  245. package/dist/chunk-HHYWB7VZ.js +0 -24
  246. package/dist/chunk-HNGGISFL.cjs +0 -65
  247. package/dist/chunk-HNSQAVSZ.cjs +0 -35
  248. package/dist/chunk-HSP6IWZK.js +0 -17
  249. package/dist/chunk-IDZS7J6T.js +0 -242
  250. package/dist/chunk-JS6R55VL.js +0 -302
  251. package/dist/chunk-JZVT5FK7.js +0 -232
  252. package/dist/chunk-KHO2SBNA.cjs +0 -16
  253. package/dist/chunk-KIDJCMNJ.js +0 -33
  254. package/dist/chunk-KOLEURVT.cjs +0 -38
  255. package/dist/chunk-L4V53MQK.cjs +0 -269
  256. package/dist/chunk-L5RDAVVH.js +0 -14
  257. package/dist/chunk-NODTV4F3.js +0 -16
  258. package/dist/chunk-NYK5K3V2.cjs +0 -211
  259. package/dist/chunk-ODUO3RTL.cjs +0 -113
  260. package/dist/chunk-ONZFBJVW.js +0 -14
  261. package/dist/chunk-PFXCTE37.js +0 -28
  262. package/dist/chunk-PPST7QAQ.js +0 -587
  263. package/dist/chunk-Q5IMYDFL.cjs +0 -33
  264. package/dist/chunk-QFFBIOJ4.js +0 -31
  265. package/dist/chunk-QNKGP5DY.js +0 -14
  266. package/dist/chunk-RRQHMOPE.cjs +0 -19
  267. package/dist/chunk-RU5OSRBU.js +0 -95
  268. package/dist/chunk-SDMPEJ4F.js +0 -35
  269. package/dist/chunk-SYNL5IKP.js +0 -115
  270. package/dist/chunk-TCDOWZQE.js +0 -16
  271. package/dist/chunk-TQPGXGKB.cjs +0 -123
  272. package/dist/chunk-TULOI4GL.js +0 -370
  273. package/dist/chunk-UBHCP4N5.cjs +0 -36
  274. package/dist/chunk-UCHF3M34.cjs +0 -56
  275. package/dist/chunk-UDA26MCU.cjs +0 -16
  276. package/dist/chunk-V3C4FYZL.cjs +0 -18
  277. package/dist/chunk-VAAHZFBF.js +0 -32
  278. package/dist/chunk-VJDDGRIK.cjs +0 -16
  279. package/dist/chunk-WVSPXFTY.js +0 -14
  280. package/dist/chunk-WYP76WXB.js +0 -101
  281. package/dist/chunk-YDE4ZBB7.cjs +0 -237
  282. package/dist/chunk-YKQEOO7C.cjs +0 -23
  283. package/dist/chunk-YSZC56SZ.js +0 -264
  284. package/dist/chunk-YWHHVDT4.js +0 -13
  285. package/dist/index.d.ts +0 -24
  286. package/dist/isPlainObject-DTJVV2Kf.d.ts +0 -536
@@ -1,746 +1,737 @@
1
1
  /*!
2
- * ====================================================
3
- * Rzl Utils-JS.
4
- * ----------------------------------------------------
5
- * Version: 3.12.0.
6
- * Author: Rizalvin Dwiky.
7
- * Repository: https://github.com/rzl-zone/utils-js.
8
- * ====================================================
9
- */
2
+ * ========================================================================
3
+ * @rzl-zone/utils-js
4
+ * ------------------------------------------------------------------------
5
+ * Version: `3.12.1-beta.1`
6
+ * Author: `Rizalvin Dwiky <rizalvindwiky@gmail.com>`
7
+ * Repository: `https://github.com/rzl-zone/rzl-zone/tree/main/packages/utils-js`
8
+ * ========================================================================
9
+ */
10
10
  /** ----------------------------------------------------------
11
- * * ***Type-Utility: `QueryParamPairs`.***
12
- * ----------------------------------------------------------
13
- * **Represents a non-empty array of keyโ€“value pairs.**
14
- * @description
15
- * Type for `queryParams` parameter, the second parameter of ***`constructURL` utility function***.
16
- * - **Behavior:**
17
- * - Each inner tuple strictly follows the `[string, string | number]` shape.
18
- * - Ensures the outer array contains **at least one pair** (non-empty).
19
- * - Commonly used for URL construction parameters,
20
- * query string segments, or other keyโ€“value structured data.
21
- * @example
22
- * // โœ… valid usage
23
- * const params: QueryParamPairs = [
24
- * ["foo", 1],
25
- * ["bar", "baz"]
26
- * ];
27
- * constructURL("https://example.com", params);
28
- *
29
- * // โŒ invalid: must contain at least one item
30
- * const empty: QueryParamPairs = [];
31
- *
32
- * // โŒ invalid: key without value pairs.
33
- * const empty2: QueryParamPairs = [["key"]];
34
- */
11
+ * * ***Type-Utility: `QueryParamPairs`.***
12
+ * ----------------------------------------------------------
13
+ * **Represents a non-empty array of keyโ€“value pairs.**
14
+ * @description
15
+ * Type for `queryParams` parameter, the second parameter of ***`constructURL` utility function***.
16
+ * - **Behavior:**
17
+ * - Each inner tuple strictly follows the `[string, string | number]` shape.
18
+ * - Ensures the outer array contains **at least one pair** (non-empty).
19
+ * - Commonly used for URL construction parameters,
20
+ * query string segments, or other keyโ€“value structured data.
21
+ * @example
22
+ * // โœ… valid usage
23
+ * const params: QueryParamPairs = [
24
+ * ["foo", 1],
25
+ * ["bar", "baz"]
26
+ * ];
27
+ * constructURL("https://example.com", params);
28
+ *
29
+ * // โŒ invalid: must contain at least one item
30
+ * const empty: QueryParamPairs = [];
31
+ *
32
+ * // โŒ invalid: key without value pairs.
33
+ * const empty2: QueryParamPairs = [["key"]];
34
+ */
35
35
  type QueryParamPairs = [[string, string | number], ...[string, string | number][]];
36
36
  /** ---------------------------------
37
- * * ***Utility: `constructURL`.***
38
- * ---------------------------------
39
- * **Constructs a valid URL with optional query parameters and allows selective removal of duplicate parameters.**
40
- * @param {string | URL} baseUrl The base URL to build upon. Must include protocol (e.g., `"https://"`), `domain`, and may include port and existing query parameters.
41
- * @param {Iterable<[string, string]> | URLSearchParamsIterator<[string, string]> | QueryParamPairs} [queryParams]
42
- * Additional query parameters to append or overwrite on the URL.
43
- * - Accepts any iterable of key-value pairs (like `new URLSearchParams().entries()` and `[[string, string | number]...]`).
44
- * @param {string[]} [removeParams]
45
- * A list of query parameter keys to remove from the final URL, whether they were in the base URL or provided queryParams.
46
- * @returns {URL} A new URL object representing the constructed URL with merged and cleaned query parameters.
47
- * @throws **{@link TypeError | `TypeError`}** if `baseUrl` is not a valid non-empty string or URL object, or if `queryParams` is not iterable, or if `removeParams` is not an array of strings.
48
- * @example
49
- * 1. #### Basic Usage:
50
- * ```ts
51
- * constructURL(
52
- * "https://example.com/path",
53
- * new URLSearchParams({ a: "1", b: "2" }).entries()
54
- * );
55
- * // โž” URL { href: "https://example.com/path?a=1&b=2", ... }
56
- * ```
57
- * 2. #### Remove parameters from Base and Added:
58
- * ```ts
59
- * // with new URLSearchParams({ ... }).entries();
60
- * constructURL(
61
- * "https://example.com/path?foo=1&bar=2",
62
- * new URLSearchParams({ bar: "ignored", baz: "3" }).entries(),
63
- * ["bar"]
64
- * );
65
- * // โž” URL { href: "https://example.com/path?foo=1&baz=3", ... }
66
- *
67
- * // with [[string, string | number]...]
68
- * constructURL(
69
- * "https://example.com/path?foo=1&bar=2",
70
- * [["bar", "ignored"],["baz", 3]],
71
- * ["bar"]
72
- * );
73
- * // โž” URL { href: "https://example.com/path?foo=1&baz=3", ... }
74
- *
75
- * const params: QueryParamPairs = [
76
- * ["foo", 1],
77
- * ["bar", 2],
78
- * ["baz", 3]
79
- * ];
80
- *
81
- * constructURL("https://example.com", params, ["bar"]);
82
- * // โž” URL { href: "https://example.com/?foo=1&baz=3", ... }
83
- * ```
84
- */
37
+ * * ***Utility: `constructURL`.***
38
+ * ---------------------------------
39
+ * **Constructs a valid URL with optional query parameters and allows selective removal of duplicate parameters.**
40
+ * @param {string | URL} baseUrl The base URL to build upon. Must include protocol (e.g., `"https://"`), `domain`, and may include port and existing query parameters.
41
+ * @param {Iterable<[string, string]> | URLSearchParamsIterator<[string, string]> | QueryParamPairs} [queryParams]
42
+ * Additional query parameters to append or overwrite on the URL.
43
+ * - Accepts any iterable of key-value pairs (like `new URLSearchParams().entries()` and `[[string, string | number]...]`).
44
+ * @param {string[]} [removeParams]
45
+ * A list of query parameter keys to remove from the final URL, whether they were in the base URL or provided queryParams.
46
+ * @returns {URL} A new URL object representing the constructed URL with merged and cleaned query parameters.
47
+ * @throws **{@link TypeError | `TypeError`}** if `baseUrl` is not a valid non-empty string or URL object, or if `queryParams` is not iterable, or if `removeParams` is not an array of strings.
48
+ * @example
49
+ * 1. #### Basic Usage:
50
+ * ```ts
51
+ * constructURL(
52
+ * "https://example.com/path",
53
+ * new URLSearchParams({ a: "1", b: "2" }).entries()
54
+ * );
55
+ * // โž” URL { href: "https://example.com/path?a=1&b=2", ... }
56
+ * ```
57
+ * 2. #### Remove parameters from Base and Added:
58
+ * ```ts
59
+ * // with new URLSearchParams({ ... }).entries();
60
+ * constructURL(
61
+ * "https://example.com/path?foo=1&bar=2",
62
+ * new URLSearchParams({ bar: "ignored", baz: "3" }).entries(),
63
+ * ["bar"]
64
+ * );
65
+ * // โž” URL { href: "https://example.com/path?foo=1&baz=3", ... }
66
+ *
67
+ * // with [[string, string | number]...]
68
+ * constructURL(
69
+ * "https://example.com/path?foo=1&bar=2",
70
+ * [["bar", "ignored"],["baz", 3]],
71
+ * ["bar"]
72
+ * );
73
+ * // โž” URL { href: "https://example.com/path?foo=1&baz=3", ... }
74
+ *
75
+ * const params: QueryParamPairs = [
76
+ * ["foo", 1],
77
+ * ["bar", 2],
78
+ * ["baz", 3]
79
+ * ];
80
+ *
81
+ * constructURL("https://example.com", params, ["bar"]);
82
+ * // โž” URL { href: "https://example.com/?foo=1&baz=3", ... }
83
+ * ```
84
+ */
85
85
  declare const constructURL: (baseUrl: string | URL, queryParams?: URLSearchParamsIterator<[string, string | number]> | QueryParamPairs, removeParams?: string[]) => URL;
86
-
87
86
  /** ---------------------------------
88
- * * ***Utility: `extractURLs`.***
89
- * ---------------------------------
90
- * **Extracts all valid URLs from a given string.**
91
- * @description
92
- * This function scans the input url and returns an array of URLs
93
- * that match a valid `http` or `https` format.
94
- * - **Supports:**
95
- * - Internationalized domain names (IDN), e.g. `https://mรผnich.de`
96
- * - Unicode & emoji paths, e.g. `https://example.com/๐ŸŽ‰/page`
97
- * - Long URLs with multiple queries & fragments, e.g. `https://example.com/path?foo=1#hash`
98
- * - **Ignores:**
99
- * - Non-string inputs
100
- * - Empty or whitespace-only strings
101
- * - Non-HTTP(S) protocols (ftp, mailto, etc)
102
- * @param {string | null | undefined} url - The input string containing potential URLs.
103
- * @returns {string[] | null} An array of extracted URLs or `null` if no URLs are found.
104
- * @example
105
- * extractURLs("Visit https://example.com and https://ไพ‹ๅญ.ๅ…ฌๅธ");
106
- * // โž” ["https://example.com", "https://ไพ‹ๅญ.ๅ…ฌๅธ"]
107
- * extractURLs("Here: https://example.com/๐ŸŽ‰/page");
108
- * // โž” ["https://example.com/๐ŸŽ‰/page"]
109
- * extractURLs("ftp://example.com http://example.com");
110
- * // โž” ["http://example.com"]
111
- */
87
+ * * ***Utility: `extractURLs`.***
88
+ * ---------------------------------
89
+ * **Extracts all valid URLs from a given string.**
90
+ * @description
91
+ * This function scans the input url and returns an array of URLs
92
+ * that match a valid `http` or `https` format.
93
+ * - **Supports:**
94
+ * - Internationalized domain names (IDN), e.g. `https://mรผnich.de`
95
+ * - Unicode & emoji paths, e.g. `https://example.com/๐ŸŽ‰/page`
96
+ * - Long URLs with multiple queries & fragments, e.g. `https://example.com/path?foo=1#hash`
97
+ * - **Ignores:**
98
+ * - Non-string inputs
99
+ * - Empty or whitespace-only strings
100
+ * - Non-HTTP(S) protocols (ftp, mailto, etc)
101
+ * @param {string | null | undefined} url - The input string containing potential URLs.
102
+ * @returns {string[] | null} An array of extracted URLs or `null` if no URLs are found.
103
+ * @example
104
+ * extractURLs("Visit https://example.com and https://ไพ‹ๅญ.ๅ…ฌๅธ");
105
+ * // โž” ["https://example.com", "https://ไพ‹ๅญ.ๅ…ฌๅธ"]
106
+ * extractURLs("Here: https://example.com/๐ŸŽ‰/page");
107
+ * // โž” ["https://example.com/๐ŸŽ‰/page"]
108
+ * extractURLs("ftp://example.com http://example.com");
109
+ * // โž” ["http://example.com"]
110
+ */
112
111
  declare const extractURLs: (url: string | null | undefined) => string[] | null;
113
-
114
112
  /** --------------------------------------------------------
115
- * * ***Utility: `getFirstPrefixPathname`.***
116
- * --------------------------------------------------------
117
- * **Extract First Valid Prefix from Path Array or String.**
118
- * - **Main Purpose:**
119
- * - This function helps extract the first valid URL prefix from various possible inputs.
120
- * - It is especially useful in routing systems, middleware, or frontend apps that need to
121
- * decide layout, active navigation, or permissions based on the first segment (or prefix) of a pathname.
122
- * - **Typical uses include:**
123
- * - Determining which layout to render (e.g., `/admin` vs `/dashboard` vs `/`).
124
- * - Highlighting the active menu item in a sidebar based on the current URL.
125
- * - Enforcing route guards or access controls depending on the URL prefix.
126
- * - Parsing multi-level route prefixes and selecting the most relevant one.
127
- * - **Behavior:**
128
- * - It works as follows:
129
- * - If `result` is an array of strings, it normalizes each element and returns
130
- * the first non-root path (i.e., not just `"/"`).
131
- * - If all items normalize to `"/"`,
132
- * it returns the `defaultValue` (normalized).
133
- * - If `result` is a single string, it normalizes it and returns it if valid,
134
- * otherwise falls back to the normalized `defaultValue`.
135
- * - If `result` is `null` or `undefined`, it returns the normalized `defaultValue`.
136
- * - **Validation & Errors:**
137
- * - Throws a `TypeError` if:
138
- * - `defaultValue` is not a string or empty-string.
139
- * - `result` is an array that contains non-string elements.
140
- * - `result` is a value that is neither `string`, `string[]`, nor `null`.
141
- * @example
142
- * 1. #### For React (*Determining layout*):
143
- * ```ts
144
- * const prefix = getFirstPrefixPathname(
145
- * getPrefixPathname(
146
- * "/admin/settings",
147
- * ["/admin", "/dashboard"]
148
- * )
149
- * );
150
- *
151
- * if (prefix === "/admin") {
152
- * renderAdminLayout();
153
- * }
154
- * ```
155
- *
156
- * 2. #### Setting active menu state:
157
- * ```ts
158
- * const activeSection = getFirstPrefixPathname(["", "/dashboard", "/profile"]);
159
- * // โž” "/dashboard"
160
- * ```
161
- *
162
- * 3. #### Providing graceful fallback:
163
- * ```ts
164
- * const section = getFirstPrefixPathname([], "/home");
165
- * // โž” "/home"
166
- * ```
167
- * 4. #### โœ… Using with an Array of Pathnames:
168
- * ```ts
169
- * const result = getPrefixPathname([" ", "/dashboard", "/settings"]);
170
- * console.log(getFirstPrefixPathname(result));
171
- * // โž” "/dashboard"
172
- * ```
173
- *
174
- * 5. #### โœ… Using with Single String:
175
- * ```ts
176
- * console.log(getFirstPrefixPathname("/profile/settings"));
177
- * // โž” "/profile/settings"
178
- * console.log(getFirstPrefixPathname(" "));
179
- * // โž” "/"
180
- * ```
181
- *
182
- * 6. #### โœ… Fallback to Custom Default:
183
- * ```ts
184
- * console.log(getFirstPrefixPathname([" ", ""], "/home"));
185
- * // โž” "/home"
186
- * console.log(getFirstPrefixPathname(null, "/dashboard"));
187
- * // โž” "/dashboard"
188
- * ```
189
- *
190
- * 7. #### โœ… Throws on Invalid Input:
191
- * ```ts
192
- * getFirstPrefixPathname([1, 2] as any); // โž” โŒ throws TypeError
193
- * getFirstPrefixPathname({} as any); // โž” โŒ throws TypeError
194
- * getFirstPrefixPathname(null, " "); // โž” โŒ throws TypeError
195
- * ```
196
- * @param {string | string[] | null | undefined} result
197
- * ***The pathname(s) to process, can be:***
198
- * - A string path (e.g. `"/profile"`),
199
- * - An array of string paths (e.g. `[" ", "/dashboard"]`),
200
- * - Or `null`.
201
- * @param {string} [defaultValue="/"]
202
- * ***A custom default path to use if `result` is null or no valid prefix is found, behavior:***
203
- * - Must be a string and non-empty string.
204
- * - Defaults to `"/"`.
205
- * @returns {string}
206
- * ***The first valid normalized pathname, or the normalized default.***
207
- * @throws **{@link TypeError | `TypeError`}** ***if `result` is not a valid type, or `defaultValue` is not a string or empty-string.***
208
- */
113
+ * * ***Utility: `getFirstPrefixPathname`.***
114
+ * --------------------------------------------------------
115
+ * **Extract First Valid Prefix from Path Array or String.**
116
+ * - **Main Purpose:**
117
+ * - This function helps extract the first valid URL prefix from various possible inputs.
118
+ * - It is especially useful in routing systems, middleware, or frontend apps that need to
119
+ * decide layout, active navigation, or permissions based on the first segment (or prefix) of a pathname.
120
+ * - **Typical uses include:**
121
+ * - Determining which layout to render (e.g., `/admin` vs `/dashboard` vs `/`).
122
+ * - Highlighting the active menu item in a sidebar based on the current URL.
123
+ * - Enforcing route guards or access controls depending on the URL prefix.
124
+ * - Parsing multi-level route prefixes and selecting the most relevant one.
125
+ * - **Behavior:**
126
+ * - It works as follows:
127
+ * - If `result` is an array of strings, it normalizes each element and returns
128
+ * the first non-root path (i.e., not just `"/"`).
129
+ * - If all items normalize to `"/"`,
130
+ * it returns the `defaultValue` (normalized).
131
+ * - If `result` is a single string, it normalizes it and returns it if valid,
132
+ * otherwise falls back to the normalized `defaultValue`.
133
+ * - If `result` is `null` or `undefined`, it returns the normalized `defaultValue`.
134
+ * - **Validation & Errors:**
135
+ * - Throws a `TypeError` if:
136
+ * - `defaultValue` is not a string or empty-string.
137
+ * - `result` is an array that contains non-string elements.
138
+ * - `result` is a value that is neither `string`, `string[]`, nor `null`.
139
+ * @example
140
+ * 1. #### For React (*Determining layout*):
141
+ * ```ts
142
+ * const prefix = getFirstPrefixPathname(
143
+ * getPrefixPathname(
144
+ * "/admin/settings",
145
+ * ["/admin", "/dashboard"]
146
+ * )
147
+ * );
148
+ *
149
+ * if (prefix === "/admin") {
150
+ * renderAdminLayout();
151
+ * }
152
+ * ```
153
+ *
154
+ * 2. #### Setting active menu state:
155
+ * ```ts
156
+ * const activeSection = getFirstPrefixPathname(["", "/dashboard", "/profile"]);
157
+ * // โž” "/dashboard"
158
+ * ```
159
+ *
160
+ * 3. #### Providing graceful fallback:
161
+ * ```ts
162
+ * const section = getFirstPrefixPathname([], "/home");
163
+ * // โž” "/home"
164
+ * ```
165
+ * 4. #### โœ… Using with an Array of Pathnames:
166
+ * ```ts
167
+ * const result = getPrefixPathname([" ", "/dashboard", "/settings"]);
168
+ * console.log(getFirstPrefixPathname(result));
169
+ * // โž” "/dashboard"
170
+ * ```
171
+ *
172
+ * 5. #### โœ… Using with Single String:
173
+ * ```ts
174
+ * console.log(getFirstPrefixPathname("/profile/settings"));
175
+ * // โž” "/profile/settings"
176
+ * console.log(getFirstPrefixPathname(" "));
177
+ * // โž” "/"
178
+ * ```
179
+ *
180
+ * 6. #### โœ… Fallback to Custom Default:
181
+ * ```ts
182
+ * console.log(getFirstPrefixPathname([" ", ""], "/home"));
183
+ * // โž” "/home"
184
+ * console.log(getFirstPrefixPathname(null, "/dashboard"));
185
+ * // โž” "/dashboard"
186
+ * ```
187
+ *
188
+ * 7. #### โœ… Throws on Invalid Input:
189
+ * ```ts
190
+ * getFirstPrefixPathname([1, 2] as any); // โž” โŒ throws TypeError
191
+ * getFirstPrefixPathname({} as any); // โž” โŒ throws TypeError
192
+ * getFirstPrefixPathname(null, " "); // โž” โŒ throws TypeError
193
+ * ```
194
+ * @param {string | string[] | null | undefined} result
195
+ * ***The pathname(s) to process, can be:***
196
+ * - A string path (e.g. `"/profile"`),
197
+ * - An array of string paths (e.g. `[" ", "/dashboard"]`),
198
+ * - Or `null`.
199
+ * @param {string} [defaultValue="/"]
200
+ * ***A custom default path to use if `result` is null or no valid prefix is found, behavior:***
201
+ * - Must be a string and non-empty string.
202
+ * - Defaults to `"/"`.
203
+ * @returns {string}
204
+ * ***The first valid normalized pathname, or the normalized default.***
205
+ * @throws **{@link TypeError | `TypeError`}** ***if `result` is not a valid type, or `defaultValue` is not a string or empty-string.***
206
+ */
209
207
  declare const getFirstPrefixPathname: (result: string | string[] | null | undefined, defaultValue?: string) => string;
210
-
211
208
  type GetPrefixPathnameOptions = {
212
- /** The number of levels to include in the prefix (default is `1`).
213
- *
214
- * - For example, with `levels = 2`, the function will return the first two parts of the URL.
215
- *
216
- * @default 1
217
- */
218
- levels?: number;
219
- /** Whether to remove duplicates from the result if multiple URLs are passed (default is `true`).
220
- *
221
- * @default true
222
- */
223
- removeDuplicates?: boolean;
209
+ /** The number of levels to include in the prefix (default is `1`).
210
+ *
211
+ * - For example, with `levels = 2`, the function will return the first two parts of the URL.
212
+ *
213
+ * @default 1
214
+ */
215
+ levels?: number;
216
+ /** Whether to remove duplicates from the result if multiple URLs are passed (default is `true`).
217
+ *
218
+ * @default true
219
+ */
220
+ removeDuplicates?: boolean;
224
221
  };
225
222
  /** --------------------------------------------------------
226
- * * ***Utility: `getPrefixPathname`.***
227
- * --------------------------------------------------------
228
- * **Get Prefix from URL with Optional Base or Auto-detection (Supports String or Array of URLs).**
229
- * - **This function extracts the prefix from one or more URLs. It can either:**
230
- * - Use a provided `base` string or an array of strings to check and return the matching prefix.
231
- * - Automatically detect the prefix if no `base` is provided by analyzing the first part of the URL.
232
- * - **The function is flexible and can handle both scenarios:**
233
- * 1. **When the base is provided as a single string or an array of strings**:
234
- * - The function will check if the URL starts with one of the provided base(s) and return the matching base.
235
- * 2. **When the base is not provided**:
236
- * - The function will automatically detect the prefix by splitting the URL or using a regex.
237
- * - **Important Notes**:
238
- * - If a base (or an array of bases) is provided, the URL must start with one of the given base(s).
239
- * - If no base is provided, the function will attempt to detect the prefix automatically.
240
- * - The `url` parameter can be either a string or an array of strings.
241
- * - Supports deduplication of results (enabled by default).
242
- * - Automatically returns a single string if only one unique result exists after processing.
243
- * @param {string|string[]} url
244
- * ***The full URL(s) from which the prefix should be extracted, can be a `string` or an `array of strings`.***
245
- * @param {string|string[]|null} [base=null]
246
- * ***The base URL(s) (e.g., `"/settings"`), behavior:***
247
- * - It can be a `string`, an `array of strings`, or `null`.
248
- * - If `provided`, it will be used to check the URL(s).
249
- * - If `not provided`, the prefix will be auto-detected.
250
- * @param {GetPrefixPathnameOptions} [options]
251
- * ***Additional options object:***
252
- * - `levels` (default `1`): The number of segments to include when auto-detecting the prefix (e.g. `/foo/bar` for `levels: 2`).
253
- * - `removeDuplicates` (default `true`): Whether to remove duplicate prefixes from the final array result.
254
- * @returns {string|string[]|null}
255
- * ***Returns one of:***
256
- * - A single string if only one unique prefix/base is found.
257
- * - An array of strings if multiple different prefixes/bases are found.
258
- * - `null` if no matching base is found when using `base`.
259
- * @throws **{@link TypeError | `TypeError`}**
260
- * ***if:***
261
- * - `url` is `not a string` or `not an array of strings`.
262
- * - `base` is `not a string`, `array of strings`, or `null`.
263
- * - `options` is `not an object`.
264
- * - `levels` is `not a number`.
265
- * - `removeDuplicates` is `not a boolean`.
266
- * @example
267
- * - #### โœ… **Correct Usage (With an Array of URLs and Base):**
268
- * ```ts
269
- * const routes = [
270
- * "/settings/profile",
271
- * "/settings/password",
272
- * "/settings/other-path",
273
- * "/other-path/xyz",
274
- * ];
275
- *
276
- * // With base provided as a string
277
- * routes.forEach(route => {
278
- * console.log(getPrefixPathname(route, '/settings'));
279
- * // โž” "/settings"
280
- * });
281
- *
282
- * // With base provided as an array
283
- * routes.forEach(route => {
284
- * console.log(getPrefixPathname(route, ['/settings', '/admin']));
285
- * // โž” "/settings" or "/admin" depending on the current URL.
286
- * });
287
- * ```
288
- * - #### โœ… **Correct Usage (With Single URL and Single Base):**
289
- * ```ts
290
- * const result = getPrefixPathname("/settings/profile", "/settings");
291
- * console.log(result); // โž” "/settings"
292
- * ```
293
- * - #### โœ… **Correct Usage (With Multiple URLs and Single Base):**
294
- * ```ts
295
- * const result = getPrefixPathname(
296
- * ["/settings/profile", "/settings/password"],
297
- * "/settings"
298
- * );
299
- * console.log(result); // โž” "/settings"
300
- *
301
- * const result2 = getPrefixPathname(
302
- * ["/settings/profile", "/other/password"],
303
- * "/other"
304
- * );
305
- * console.log(result2); // โž” "/other"
306
- * ```
307
- * - #### โœ… **Correct Usage (With Multiple URLs and Multiple Bases)**
308
- * ```ts
309
- * const result = getPrefixPathname(
310
- * ["/settings/profile", "/admin/password"],
311
- * ["/settings", "/admin"]
312
- * );
313
- * console.log(result); // โž” ["/settings", "/admin"]
314
- * ```
315
- * - #### โœ… **Auto-detection of Prefix**
316
- * ```ts
317
- * const result = getPrefixPathname("/settings/profile");
318
- * console.log(result); // โž” "/settings"
319
- *
320
- * const result2 = getPrefixPathname(
321
- * "/settings/profile/info",
322
- * null,
323
- * { levels: 2 }
324
- * );
325
- * console.log(result2); // โž” "/settings/profile"
326
- * ```
327
- * - #### โœ… **Multiple URLs with Auto-detection**
328
- * ```ts
329
- * const result = getPrefixPathname(["/admin/profile", "/settings/password"]);
330
- * console.log(result); // โž” ["/admin", "/settings"]
331
- * ```
332
- * - #### โœ… **Handling Duplicates**
333
- * ```ts
334
- * const result = getPrefixPathname(
335
- * ["/settings/profile", "/settings/password"],
336
- * "/settings"
337
- * );
338
- * console.log(result); // โž” "/settings" (deduped to single string)
339
- *
340
- * const result2 = getPrefixPathname(
341
- * ["/settings/profile", "/settings/profile"],
342
- * "/settings",
343
- * { removeDuplicates: false }
344
- * );
345
- * console.log(result2); // โž” ["/settings", "/settings"]
346
- * ```
347
- * - #### โŒ **Incorrect Usage (URL Does Not Match Base)**
348
- * ```ts
349
- * const result = getPrefixPathname("/other-path/profile", "/settings");
350
- * console.log(result); // โž” null
351
- * ```
352
- */
223
+ * * ***Utility: `getPrefixPathname`.***
224
+ * --------------------------------------------------------
225
+ * **Get Prefix from URL with Optional Base or Auto-detection (Supports String or Array of URLs).**
226
+ * - **This function extracts the prefix from one or more URLs. It can either:**
227
+ * - Use a provided `base` string or an array of strings to check and return the matching prefix.
228
+ * - Automatically detect the prefix if no `base` is provided by analyzing the first part of the URL.
229
+ * - **The function is flexible and can handle both scenarios:**
230
+ * 1. **When the base is provided as a single string or an array of strings**:
231
+ * - The function will check if the URL starts with one of the provided base(s) and return the matching base.
232
+ * 2. **When the base is not provided**:
233
+ * - The function will automatically detect the prefix by splitting the URL or using a regex.
234
+ * - **Important Notes**:
235
+ * - If a base (or an array of bases) is provided, the URL must start with one of the given base(s).
236
+ * - If no base is provided, the function will attempt to detect the prefix automatically.
237
+ * - The `url` parameter can be either a string or an array of strings.
238
+ * - Supports deduplication of results (enabled by default).
239
+ * - Automatically returns a single string if only one unique result exists after processing.
240
+ * @param {string|string[]} url
241
+ * ***The full URL(s) from which the prefix should be extracted, can be a `string` or an `array of strings`.***
242
+ * @param {string|string[]|null} [base=null]
243
+ * ***The base URL(s) (e.g., `"/settings"`), behavior:***
244
+ * - It can be a `string`, an `array of strings`, or `null`.
245
+ * - If `provided`, it will be used to check the URL(s).
246
+ * - If `not provided`, the prefix will be auto-detected.
247
+ * @param {GetPrefixPathnameOptions} [options]
248
+ * ***Additional options object:***
249
+ * - `levels` (default `1`): The number of segments to include when auto-detecting the prefix (e.g. `/foo/bar` for `levels: 2`).
250
+ * - `removeDuplicates` (default `true`): Whether to remove duplicate prefixes from the final array result.
251
+ * @returns {string|string[]|null}
252
+ * ***Returns one of:***
253
+ * - A single string if only one unique prefix/base is found.
254
+ * - An array of strings if multiple different prefixes/bases are found.
255
+ * - `null` if no matching base is found when using `base`.
256
+ * @throws **{@link TypeError | `TypeError`}**
257
+ * ***if:***
258
+ * - `url` is `not a string` or `not an array of strings`.
259
+ * - `base` is `not a string`, `array of strings`, or `null`.
260
+ * - `options` is `not an object`.
261
+ * - `levels` is `not a number`.
262
+ * - `removeDuplicates` is `not a boolean`.
263
+ * @example
264
+ * - #### โœ… **Correct Usage (With an Array of URLs and Base):**
265
+ * ```ts
266
+ * const routes = [
267
+ * "/settings/profile",
268
+ * "/settings/password",
269
+ * "/settings/other-path",
270
+ * "/other-path/xyz",
271
+ * ];
272
+ *
273
+ * // With base provided as a string
274
+ * routes.forEach(route => {
275
+ * console.log(getPrefixPathname(route, '/settings'));
276
+ * // โž” "/settings"
277
+ * });
278
+ *
279
+ * // With base provided as an array
280
+ * routes.forEach(route => {
281
+ * console.log(getPrefixPathname(route, ['/settings', '/admin']));
282
+ * // โž” "/settings" or "/admin" depending on the current URL.
283
+ * });
284
+ * ```
285
+ * - #### โœ… **Correct Usage (With Single URL and Single Base):**
286
+ * ```ts
287
+ * const result = getPrefixPathname("/settings/profile", "/settings");
288
+ * console.log(result); // โž” "/settings"
289
+ * ```
290
+ * - #### โœ… **Correct Usage (With Multiple URLs and Single Base):**
291
+ * ```ts
292
+ * const result = getPrefixPathname(
293
+ * ["/settings/profile", "/settings/password"],
294
+ * "/settings"
295
+ * );
296
+ * console.log(result); // โž” "/settings"
297
+ *
298
+ * const result2 = getPrefixPathname(
299
+ * ["/settings/profile", "/other/password"],
300
+ * "/other"
301
+ * );
302
+ * console.log(result2); // โž” "/other"
303
+ * ```
304
+ * - #### โœ… **Correct Usage (With Multiple URLs and Multiple Bases)**
305
+ * ```ts
306
+ * const result = getPrefixPathname(
307
+ * ["/settings/profile", "/admin/password"],
308
+ * ["/settings", "/admin"]
309
+ * );
310
+ * console.log(result); // โž” ["/settings", "/admin"]
311
+ * ```
312
+ * - #### โœ… **Auto-detection of Prefix**
313
+ * ```ts
314
+ * const result = getPrefixPathname("/settings/profile");
315
+ * console.log(result); // โž” "/settings"
316
+ *
317
+ * const result2 = getPrefixPathname(
318
+ * "/settings/profile/info",
319
+ * null,
320
+ * { levels: 2 }
321
+ * );
322
+ * console.log(result2); // โž” "/settings/profile"
323
+ * ```
324
+ * - #### โœ… **Multiple URLs with Auto-detection**
325
+ * ```ts
326
+ * const result = getPrefixPathname(["/admin/profile", "/settings/password"]);
327
+ * console.log(result); // โž” ["/admin", "/settings"]
328
+ * ```
329
+ * - #### โœ… **Handling Duplicates**
330
+ * ```ts
331
+ * const result = getPrefixPathname(
332
+ * ["/settings/profile", "/settings/password"],
333
+ * "/settings"
334
+ * );
335
+ * console.log(result); // โž” "/settings" (deduped to single string)
336
+ *
337
+ * const result2 = getPrefixPathname(
338
+ * ["/settings/profile", "/settings/profile"],
339
+ * "/settings",
340
+ * { removeDuplicates: false }
341
+ * );
342
+ * console.log(result2); // โž” ["/settings", "/settings"]
343
+ * ```
344
+ * - #### โŒ **Incorrect Usage (URL Does Not Match Base)**
345
+ * ```ts
346
+ * const result = getPrefixPathname("/other-path/profile", "/settings");
347
+ * console.log(result); // โž” null
348
+ * ```
349
+ */
353
350
  declare const getPrefixPathname: (url: string | string[], base?: string | string[] | null, options?: GetPrefixPathnameOptions) => string | string[] | null;
354
-
355
351
  /** Options when `keepNullable` is false (default).
356
- *
357
- * Returns `defaultPath` if `pathname` is empty or invalid.
358
- */
352
+ *
353
+ * Returns `defaultPath` if `pathname` is empty or invalid.
354
+ */
359
355
  type UnKeepNullableOptions = {
360
- /** * ***Fallback value returned if `pathname` is empty-string or invalid.***
361
- *
362
- * Must be a **`non-empty string`**, defaultValue: `"/"`.
363
- *
364
- * @defaultValue `"/"`.
365
- */
366
- defaultPath?: string;
367
- /** * ***Whether to preserve `null` or `undefined`, defaultValue: `false`.***
368
- *
369
- * @defaultValue `false`.
370
- */
371
- keepNullable?: false;
356
+ /** * ***Fallback value returned if `pathname` is empty-string or invalid.***
357
+ *
358
+ * Must be a **`non-empty string`**, defaultValue: `"/"`.
359
+ *
360
+ * @default "/"
361
+ */
362
+ defaultPath?: string;
363
+ /** * ***Whether to preserve `null` or `undefined`, defaultValue: `false`.***
364
+ *
365
+ * @default false
366
+ */
367
+ keepNullable?: false;
372
368
  };
373
369
  /** Options when `keepNullable` is true.
374
- *
375
- * Preserves `null` or `undefined` instead of returning `defaultPath`.
376
- */
370
+ *
371
+ * Preserves `null` or `undefined` instead of returning `defaultPath`.
372
+ */
377
373
  type KeepNullableOptions = {
378
- /** * ***Fallback path is ignored when `keepNullable` is true **(except if
379
- * `pathname` is empty-string or invalid, even this `true`)**,
380
- * defaultValue: `"/"`.***
381
- *
382
- * @defaultValue `"/"`.
383
- */
384
- defaultPath?: string;
385
- /** * ***Preserve `null` or `undefined` as-is if `true` (defaultValue: `false`).***
386
- *
387
- * - ***โš ๏ธ Notes:***
388
- * - Keep returning `defaultPath` if `pathname` is empty-string, even this `true`.
389
- *
390
- * **Must be `true` in this type.**
391
- */
392
- keepNullable?: true;
374
+ /** * ***Fallback path is ignored when `keepNullable` is true **(except if
375
+ * `pathname` is empty-string or invalid, even this `true`)**,
376
+ * defaultValue: `"/"`.***
377
+ *
378
+ * @default "/"
379
+ */
380
+ defaultPath?: string;
381
+ /** * ***Preserve `null` or `undefined` as-is if `true` (defaultValue: `false`).***
382
+ *
383
+ * - ***โš ๏ธ Notes:***
384
+ * - Keep returning `defaultPath` if `pathname` is empty-string, even this `true`.
385
+ *
386
+ * **Must be `true` in this type.**
387
+ *
388
+ * @default false
389
+ */
390
+ keepNullable?: true;
393
391
  };
394
392
  type MainNormalizePathnameOptions = {
395
- /** --------------------------------------------------------
396
- * * ***Preserve trailing slash at the end of the normalized pathname, defaultValue: `false`.***
397
- * --------------------------------------------------------
398
- *
399
- * @defaultValue `false`
400
- */
401
- keepTrailingSlash?: boolean;
402
- /** --------------------------------------------------------
403
- * * ***Allow special localhost domain at the beginning of the pathname.***
404
- * --------------------------------------------------------
405
- * @description
406
- * If `true`, the first segment of the pathname that is `/localhost` or `localhost`
407
- * (with or without a port, e.g., `localhost:3000`) will be treated as a special domain
408
- * and **removed** from the normalized pathname.
409
- *
410
- * - **Examples (`localhostDomain: true`)**:
411
- * - `"/localhost/path"` โž” `"/path"`
412
- * - `"localhost:3000/path"` โž” `"/path"`
413
- * - `"localhost"` โž” `"/"` (entire path removed)
414
- *
415
- * - Only the **first path segment** is affected. Any subsequent occurrences of `"localhost"`
416
- * will remain intact.
417
- *
418
- * @defaultValue `false`
419
- */
420
- localhostDomain?: boolean;
421
- /**
422
- * --------------------------------------------------------
423
- * * ***Custom list of file extensions that prevent the first path segment from being treated as a domain.***
424
- * --------------------------------------------------------
425
- *
426
- * **Description:**
427
- * - The first segment of a pathname is often interpreted as a domain (e.g., `example.com`).
428
- * - If this first segment ends with any of the extensions listed here, it will **not** be considered a domain,
429
- * and will instead be preserved as part of the relative path.
430
- * - This is useful for cases where filenames appear at the start of a path and you want them treated as relative paths,
431
- * such as `"image.png?version=2"` or `"archive.tar.gz#download"`.
432
- * - Only the **first path segment** is affected; all other segments are processed normally.
433
- * - **Ignored** if:
434
- * 1. The pathname starts with a full URL protocol (`http://` or `https://`), e.g., `"https://example.com/file.png"`.
435
- * 2. The first path segment is already a valid domain, e.g., `"example.com/image.png"`.
436
- *
437
- * **Type & Validation:**
438
- * - Must be a `Set<string>` or `string[]`.
439
- * - Each string **must include the leading dot**, e.g., `.png`, `.tar.gz`.
440
- * - Multi-part extensions (like `.tar.gz`, `.tar.bz`) are supported.
441
- * - Throws a **TypeError** if:
442
- * 1. The type is not a `Set<string>` or `string[]`.
443
- * 2. Any string in the array/set is empty.
444
- * 3. Any string does not start with a dot (`.`).
445
- *
446
- * **Usage Notes:**
447
- * - Only applied when the first segment is otherwise domain-like **and** pathname is relative or domain-like without protocol.
448
- * - Query strings (`?x=1`) and hash fragments (`#section`) are preserved.
449
- *
450
- * **Examples (relative paths, option active):**
451
- * ```ts
452
- * normalizePathname("image.png?version=2", {
453
- * ignoreDomainExtensions: [".png", ".jpg"]
454
- * });
455
- * // โž” "/image.png?version=2"
456
- *
457
- * normalizePathname("archive.tar.gz#download", {
458
- * ignoreDomainExtensions: new Set([".tar.gz"])
459
- * });
460
- * // โž” "/archive.tar.gz#download"
461
- *
462
- * normalizePathname("script.js?module=true#top", {
463
- * ignoreDomainExtensions: [".js"]
464
- * });
465
- * // โž” "/script.js?module=true#top"
466
- * ```
467
- *
468
- * **Examples (full URL or explicit domain - option ignored):**
469
- * ```ts
470
- * normalizePathname("https://example.com/image.png?version=2", {
471
- * ignoreDomainExtensions: [".png"]
472
- * });
473
- * // โž” "/image.png?version=2" // URL is parsed normally; ignoreDomainExtensions has no effect
474
- *
475
- * normalizePathname("example.com/script.js?module=true#top", {
476
- * ignoreDomainExtensions: [".js"]
477
- * });
478
- * // โž” "/script.js?module=true#top" // domain recognized; option ignored
479
- * ```
480
- *
481
- * **Notes:**
482
- * - Only the **first path segment** is checked.
483
- * - Prevents false-positive domain stripping for filenames that look like domains.
484
- * - Throws **TypeError** if invalid type or invalid string is provided.
485
- *
486
- * @defaultValue `undefined` (feature inactive if not provided)
487
- */
488
- ignoreDomainExtensions?: Set<string> | string[];
393
+ /** --------------------------------------------------------
394
+ * * ***Preserve trailing slash at the end of the normalized pathname, defaultValue: `false`.***
395
+ * --------------------------------------------------------
396
+ *
397
+ * @default `false`
398
+ */
399
+ keepTrailingSlash?: boolean;
400
+ /** --------------------------------------------------------
401
+ * * ***Allow special localhost domain at the beginning of the pathname.***
402
+ * --------------------------------------------------------
403
+ * @description
404
+ * If `true`, the first segment of the pathname that is `/localhost` or `localhost`
405
+ * (with or without a port, e.g., `localhost:3000`) will be treated as a special domain
406
+ * and **removed** from the normalized pathname.
407
+ *
408
+ * - **Examples (`localhostDomain: true`)**:
409
+ * - `"/localhost/path"` โž” `"/path"`
410
+ * - `"localhost:3000/path"` โž” `"/path"`
411
+ * - `"localhost"` โž” `"/"` (entire path removed)
412
+ *
413
+ * - Only the **first path segment** is affected. Any subsequent occurrences of `"localhost"`
414
+ * will remain intact.
415
+ *
416
+ * @default false
417
+ */
418
+ localhostDomain?: boolean;
419
+ /**
420
+ * --------------------------------------------------------
421
+ * * ***Custom list of file extensions that prevent the first path segment from being treated as a domain.***
422
+ * --------------------------------------------------------
423
+ *
424
+ * **Description:**
425
+ * - The first segment of a pathname is often interpreted as a domain (e.g., `example.com`).
426
+ * - If this first segment ends with any of the extensions listed here, it will **not** be considered a domain,
427
+ * and will instead be preserved as part of the relative path.
428
+ * - This is useful for cases where filenames appear at the start of a path and you want them treated as relative paths,
429
+ * such as `"image.png?version=2"` or `"archive.tar.gz#download"`.
430
+ * - Only the **first path segment** is affected; all other segments are processed normally.
431
+ * - **Ignored** if:
432
+ * 1. The pathname starts with a full URL protocol (`http://` or `https://`), e.g., `"https://example.com/file.png"`.
433
+ * 2. The first path segment is already a valid domain, e.g., `"example.com/image.png"`.
434
+ *
435
+ * **Type & Validation:**
436
+ * - Must be a `Set<string>` or `string[]`.
437
+ * - Each string **must include the leading dot**, e.g., `.png`, `.tar.gz`.
438
+ * - Multi-part extensions (like `.tar.gz`, `.tar.bz`) are supported.
439
+ * - Throws a **TypeError** if:
440
+ * 1. The type is not a `Set<string>` or `string[]`.
441
+ * 2. Any string in the array/set is empty.
442
+ * 3. Any string does not start with a dot (`.`).
443
+ *
444
+ * **Usage Notes:**
445
+ * - Only applied when the first segment is otherwise domain-like **and** pathname is relative or domain-like without protocol.
446
+ * - Query strings (`?x=1`) and hash fragments (`#section`) are preserved.
447
+ *
448
+ * **Examples (relative paths, option active):**
449
+ * ```ts
450
+ * normalizePathname("image.png?version=2", {
451
+ * ignoreDomainExtensions: [".png", ".jpg"]
452
+ * });
453
+ * // โž” "/image.png?version=2"
454
+ *
455
+ * normalizePathname("archive.tar.gz#download", {
456
+ * ignoreDomainExtensions: new Set([".tar.gz"])
457
+ * });
458
+ * // โž” "/archive.tar.gz#download"
459
+ *
460
+ * normalizePathname("script.js?module=true#top", {
461
+ * ignoreDomainExtensions: [".js"]
462
+ * });
463
+ * // โž” "/script.js?module=true#top"
464
+ * ```
465
+ *
466
+ * **Examples (full URL or explicit domain - option ignored):**
467
+ * ```ts
468
+ * normalizePathname("https://example.com/image.png?version=2", {
469
+ * ignoreDomainExtensions: [".png"]
470
+ * });
471
+ * // โž” "/image.png?version=2" // URL is parsed normally; ignoreDomainExtensions has no effect
472
+ *
473
+ * normalizePathname("example.com/script.js?module=true#top", {
474
+ * ignoreDomainExtensions: [".js"]
475
+ * });
476
+ * // โž” "/script.js?module=true#top" // domain recognized; option ignored
477
+ * ```
478
+ *
479
+ * **Notes:**
480
+ * - Only the **first path segment** is checked.
481
+ * - Prevents false-positive domain stripping for filenames that look like domains.
482
+ * - Throws **TypeError** if invalid type or invalid string is provided.
483
+ *
484
+ * @default undefined (feature inactive if not provided)
485
+ */
486
+ ignoreDomainExtensions?: Set<string> | string[];
489
487
  };
490
488
  type NormalizePathnameOptionsKeepNullableTrue = MainNormalizePathnameOptions & KeepNullableOptions;
491
489
  type NormalizePathnameOptionsKeepNullableFalse = MainNormalizePathnameOptions & UnKeepNullableOptions;
492
490
  type ResUnKeepNullable<T> = T extends undefined ? string : T extends null ? string : T extends null | undefined ? string : string;
493
491
  type ResKeepNullable<T> = T extends string ? string : T extends undefined ? undefined : T extends null ? null : T extends null | undefined ? null | undefined : string | null | undefined;
494
492
  /** --------------------------------------------------------
495
- * * ***Utility: `normalizePathname`.***
496
- * --------------------------------------------------------
497
- *
498
- * - **Description:**
499
- * Normalizes any pathname or URL string to a clean, predictable format.
500
- * Useful for routing, file paths, and URL handling.
501
- * - Handles:
502
- * - Leading/trailing spaces
503
- * - Internal spaces in path segments
504
- * - Redundant slashes (`//`)
505
- * - Full URLs vs relative paths
506
- * - Query (`?`) and hash (`#`) preservation
507
- * - Unicode & emoji characters
508
- * - Optional nullable preservation (`keepNullable`)
509
- * - Optional trailing slash preservation (`keepTrailingSlash`)
510
- * - Optional removal of localhost first segment (`localhostDomain`)
511
- * - Prevention of false-positive domain stripping (`ignoreDomainExtensions`)
512
- *
513
- * - **Key Steps Internally:**
514
- * 1. Validate `options` (plain object, correct types)
515
- * 2. Validate `defaultPath` (non-empty string if `keepNullable` is false)
516
- * 3. Validate `ignoreDomainExtensions` (Set<string> | string[], each starts with `.`)
517
- * 4. Handle nullable:
518
- * - Returns `null` / `undefined` if `keepNullable: true`
519
- * - Otherwise uses `defaultPath`
520
- * 5. Trim spaces, remove internal spaces
521
- * 6. If full URL: parse using `URL` constructor
522
- * 7. If relative path or domain-like:
523
- * - Remove `localhost`/`localhost:port` if `localhostDomain`
524
- * - Remove first segment if domain-like and **not** in `ignoreDomainExtensions`
525
- * 8. Normalize slashes
526
- * 9. Ensure leading slash
527
- * 10. Handle trailing slash
528
- * 11. Decode Unicode safely
529
- * 12. Return normalized pathname + search + hash
530
- *
531
- * - **Error Handling:**
532
- * - **TypeError**:
533
- * - `defaultPath` invalid (non-string or empty) when `keepNullable: false`
534
- * - `keepNullable`, `keepTrailingSlash`, `localhostDomain` not boolean
535
- * - `ignoreDomainExtensions` invalid
536
- * - **NormalizePathnameError** (extends ***Error***):
537
- * - Invalid URL parsing
538
- * - Unexpected normalization errors
539
- *
540
- * - **Options:**
541
- * ```ts
542
- * {
543
- * // fallback if invalid path, default: "/"
544
- * defaultPath?: string;
545
- * // preserve null/undefined, default: false
546
- * keepNullable?: boolean;
547
- * // preserve trailing slash, default: false
548
- * keepTrailingSlash?: boolean;
549
- * // remove localhost:port first segment, default: false
550
- * localhostDomain?: boolean;
551
- * // prevent domain stripping, default: undefined
552
- * ignoreDomainExtensions?: Set<string> | string[];
553
- * }
554
- * ```
555
- *
556
- * @example
557
- * // Basic path cleaning
558
- * normalizePathname(" /foo//bar ");
559
- * // โž” "/foo/bar"
560
- *
561
- * // Trailing slash control
562
- * normalizePathname("/api//v1//user//", { keepTrailingSlash: true });
563
- * // โž” "/api/v1/user/"
564
- * normalizePathname("/api//v1//user//", { keepTrailingSlash: false });
565
- * // โž” "/api/v1/user"
566
- *
567
- * // Full URL normalization
568
- * normalizePathname("https://example.com//path///to/resource?x=1#hash");
569
- * // โž” "/path/to/resource?x=1#hash"
570
- *
571
- * // Null/undefined preservation
572
- * normalizePathname(null, { keepNullable: true });
573
- * // โž” null
574
- * normalizePathname(undefined, { keepNullable: true });
575
- * // โž” undefined
576
- *
577
- * // Default fallback
578
- * normalizePathname("", { defaultPath: "/home" });
579
- * // โž” "/home"
580
- *
581
- * // Localhost removal
582
- * normalizePathname("localhost:3000/path/to/resource", { localhostDomain: true });
583
- * // โž” "/path/to/resource"
584
- *
585
- * // Prevent false-positive domain stripping
586
- * normalizePathname("archive.tar.gz#download", { ignoreDomainExtensions: [".tar.gz"] });
587
- * // โž” "/archive.tar.gz#download"
588
- * normalizePathname("image.png?version=2", { ignoreDomainExtensions: [".png"] });
589
- * // โž” "/image.png?version=2"
590
- *
591
- * // Emojis and Unicode
592
- * normalizePathname("๐Ÿ”ฅ//deep//path///๐Ÿš€");
593
- * // โž” "/๐Ÿ”ฅ/deep/path/๐Ÿš€"
594
- *
595
- * // Query-only or hash-only
596
- * normalizePathname("?page=2");
597
- * // โž” "/?page=2"
598
- * normalizePathname("#section3");
599
- * // โž” "/#section3"
600
- *
601
- * // Complex nested paths
602
- * normalizePathname(" //nested///folder//file.txt ");
603
- * // โž” "/nested/folder/file.txt"
604
- *
605
- * // Invalid URL triggers error
606
- * try {
607
- * normalizePathname("http://");
608
- * } catch (e) {
609
- * // console.log(e);
610
- * }
611
- *
612
- * // First segment is domain but ignored due to extension
613
- * normalizePathname("example.tar.bz/file", { ignoreDomainExtensions: [".tar.bz"] });
614
- * // โž” "/example.tar.bz/file"
615
- */
493
+ * * ***Utility: `normalizePathname`.***
494
+ * --------------------------------------------------------
495
+ *
496
+ * - **Description:**
497
+ * Normalizes any pathname or URL string to a clean, predictable format.
498
+ * Useful for routing, file paths, and URL handling.
499
+ * - Handles:
500
+ * - Leading/trailing spaces
501
+ * - Internal spaces in path segments
502
+ * - Redundant slashes (`//`)
503
+ * - Full URLs vs relative paths
504
+ * - Query (`?`) and hash (`#`) preservation
505
+ * - Unicode & emoji characters
506
+ * - Optional nullable preservation (`keepNullable`)
507
+ * - Optional trailing slash preservation (`keepTrailingSlash`)
508
+ * - Optional removal of localhost first segment (`localhostDomain`)
509
+ * - Prevention of false-positive domain stripping (`ignoreDomainExtensions`)
510
+ *
511
+ * - **Key Steps Internally:**
512
+ * 1. Validate `options` (plain object, correct types)
513
+ * 2. Validate `defaultPath` (non-empty string if `keepNullable` is false)
514
+ * 3. Validate `ignoreDomainExtensions` (Set<string> | string[], each starts with `.`)
515
+ * 4. Handle nullable:
516
+ * - Returns `null` / `undefined` if `keepNullable: true`
517
+ * - Otherwise uses `defaultPath`
518
+ * 5. Trim spaces, remove internal spaces
519
+ * 6. If full URL: parse using `URL` constructor
520
+ * 7. If relative path or domain-like:
521
+ * - Remove `localhost`/`localhost:port` if `localhostDomain`
522
+ * - Remove first segment if domain-like and **not** in `ignoreDomainExtensions`
523
+ * 8. Normalize slashes
524
+ * 9. Ensure leading slash
525
+ * 10. Handle trailing slash
526
+ * 11. Decode Unicode safely
527
+ * 12. Return normalized pathname + search + hash
528
+ *
529
+ * - **Error Handling:**
530
+ * - **TypeError**:
531
+ * - `defaultPath` invalid (non-string or empty) when `keepNullable: false`
532
+ * - `keepNullable`, `keepTrailingSlash`, `localhostDomain` not boolean
533
+ * - `ignoreDomainExtensions` invalid
534
+ * - **NormalizePathnameError** (extends ***Error***):
535
+ * - Invalid URL parsing
536
+ * - Unexpected normalization errors
537
+ *
538
+ * - **Options:**
539
+ * ```ts
540
+ * {
541
+ * // fallback if invalid path, default: "/"
542
+ * defaultPath?: string;
543
+ * // preserve null/undefined, default: false
544
+ * keepNullable?: boolean;
545
+ * // preserve trailing slash, default: false
546
+ * keepTrailingSlash?: boolean;
547
+ * // remove localhost:port first segment, default: false
548
+ * localhostDomain?: boolean;
549
+ * // prevent domain stripping, default: undefined
550
+ * ignoreDomainExtensions?: Set<string> | string[];
551
+ * }
552
+ * ```
553
+ *
554
+ * @example
555
+ * // Basic path cleaning
556
+ * normalizePathname(" /foo//bar ");
557
+ * // โž” "/foo/bar"
558
+ *
559
+ * // Trailing slash control
560
+ * normalizePathname("/api//v1//user//", { keepTrailingSlash: true });
561
+ * // โž” "/api/v1/user/"
562
+ * normalizePathname("/api//v1//user//", { keepTrailingSlash: false });
563
+ * // โž” "/api/v1/user"
564
+ *
565
+ * // Full URL normalization
566
+ * normalizePathname("https://example.com//path///to/resource?x=1#hash");
567
+ * // โž” "/path/to/resource?x=1#hash"
568
+ *
569
+ * // Null/undefined preservation
570
+ * normalizePathname(null, { keepNullable: true });
571
+ * // โž” null
572
+ * normalizePathname(undefined, { keepNullable: true });
573
+ * // โž” undefined
574
+ *
575
+ * // Default fallback
576
+ * normalizePathname("", { defaultPath: "/home" });
577
+ * // โž” "/home"
578
+ *
579
+ * // Localhost removal
580
+ * normalizePathname("localhost:3000/path/to/resource", { localhostDomain: true });
581
+ * // โž” "/path/to/resource"
582
+ *
583
+ * // Prevent false-positive domain stripping
584
+ * normalizePathname("archive.tar.gz#download", { ignoreDomainExtensions: [".tar.gz"] });
585
+ * // โž” "/archive.tar.gz#download"
586
+ * normalizePathname("image.png?version=2", { ignoreDomainExtensions: [".png"] });
587
+ * // โž” "/image.png?version=2"
588
+ *
589
+ * // Emojis and Unicode
590
+ * normalizePathname("๐Ÿ”ฅ//deep//path///๐Ÿš€");
591
+ * // โž” "/๐Ÿ”ฅ/deep/path/๐Ÿš€"
592
+ *
593
+ * // Query-only or hash-only
594
+ * normalizePathname("?page=2");
595
+ * // โž” "/?page=2"
596
+ * normalizePathname("#section3");
597
+ * // โž” "/#section3"
598
+ *
599
+ * // Complex nested paths
600
+ * normalizePathname(" //nested///folder//file.txt ");
601
+ * // โž” "/nested/folder/file.txt"
602
+ *
603
+ * // Invalid URL triggers error
604
+ * try {
605
+ * normalizePathname("http://");
606
+ * } catch (e) {
607
+ * // console.log(e);
608
+ * }
609
+ *
610
+ * // First segment is domain but ignored due to extension
611
+ * normalizePathname("example.tar.bz/file", { ignoreDomainExtensions: [".tar.bz"] });
612
+ * // โž” "/example.tar.bz/file"
613
+ */
616
614
  declare function normalizePathname<T>(pathname: T, options?: NormalizePathnameOptionsKeepNullableFalse): ResUnKeepNullable<T>;
617
615
  declare function normalizePathname<T>(pathname: T, options?: NormalizePathnameOptionsKeepNullableTrue): ResKeepNullable<T>;
618
-
619
616
  type FormatEnvPortOptions = {
620
- /** Add prefix with a colon, defaultValue: `false`.
621
- *
622
- * @default false
623
- */
624
- prefixColon?: boolean;
617
+ /** Add prefix with a colon, defaultValue: `false`.
618
+ *
619
+ * @default false
620
+ */
621
+ prefixColon?: boolean;
625
622
  };
626
623
  /** -----------------------------------------------
627
- * * ***Utility: `formatEnvPort`.***
628
- * -----------------------------------------------
629
- * **Retrieves and formats an environment port variable.**
630
- * - **Behavior:**
631
- * - Extracts only digits from the input.
632
- * - If no digits found, returns an empty string.
633
- * - By default does NOT prefix with a colon.
634
- * - Use `{ prefixColon: true }` to prefix with a colon.
635
- * @param {string | null | undefined} envVar The environment variable string.
636
- * @param {FormatEnvPortOptions} [options] Optional object: `{ prefixColon?: boolean }`.
637
- * @returns {string} A string like `":8080"` or `"8080"`, or `""` if no digits.
638
- * @throws **{@link TypeError | `TypeError`}** if `options` is not an object or `prefixColon` is not boolean.
639
- * @example
640
- * formatEnvPort("port:8080");
641
- * // โž” "8080"
642
- * formatEnvPort("port:8080", { prefixColon: true });
643
- * // โž” ":8080"
644
- */
624
+ * * ***Utility: `formatEnvPort`.***
625
+ * -----------------------------------------------
626
+ * **Retrieves and formats an environment port variable.**
627
+ * - **Behavior:**
628
+ * - Extracts only digits from the input.
629
+ * - If no digits found, returns an empty string.
630
+ * - By default does NOT prefix with a colon.
631
+ * - Use `{ prefixColon: true }` to prefix with a colon.
632
+ * @param {string | null | undefined} envVar The environment variable string.
633
+ * @param {FormatEnvPortOptions} [options] Optional object: `{ prefixColon?: boolean }`.
634
+ * @returns {string} A string like `":8080"` or `"8080"`, or `""` if no digits.
635
+ * @throws **{@link TypeError | `TypeError`}** if `options` is not an object or `prefixColon` is not boolean.
636
+ * @example
637
+ * formatEnvPort("port:8080");
638
+ * // โž” "8080"
639
+ * formatEnvPort("port:8080", { prefixColon: true });
640
+ * // โž” ":8080"
641
+ */
645
642
  declare const formatEnvPort: (envVar: string | null | undefined, options?: FormatEnvPortOptions) => string;
646
-
647
- /** ---------------------------------------------------------
648
- * * ***Constants for `Punycode-UtilsJS` algorithm.***
649
- * ---------------------------------------------------------
650
- * These constants are used internally for encoding and decoding.
651
- *
652
- * Unicode domain names to ASCII (`Punycode-UtilsJS`) and vice versa.
653
- */
654
643
  type PunycodeUtilsJS = {
644
+ /** ---------------------------------------------------------
645
+ * * ***Version of the `Punycode-UtilsJS` implementation.***
646
+ * ---------------------------------------------------------
647
+ *
648
+ * @example
649
+ * console.log(punycodeUtilsJS.version); // "1.0.0"
650
+ */
651
+ version: string;
652
+ /** ---------------------------------------------------------
653
+ * * ***UCS-2 utility functions.***
654
+ * ---------------------------------------------------------
655
+ */
656
+ ucs2: {
655
657
  /** ---------------------------------------------------------
656
- * * ***Version of the `Punycode-UtilsJS` implementation.***
657
- * ---------------------------------------------------------
658
- *
659
- * @example
660
- * console.log(punycodeUtilsJS.version); // "1.0.0"
661
- */
662
- version: string;
663
- /** ---------------------------------------------------------
664
- * * ***UCS-2 utility functions.***
665
- * ---------------------------------------------------------
666
- */
667
- ucs2: {
668
- /** ---------------------------------------------------------
669
- * * ***Decodes a UCS-2 encoded string to an array of Unicode code points.***
670
- * ---------------------------------------------------------
671
- *
672
- * @param input - The UCS-2 string to decode.
673
- * @returns Array of Unicode code points.
674
- * @example
675
- * punycodeUtilsJS.ucs2.decode("๐ˆ");
676
- * // โž” [66376]
677
- */
678
- decode: (input: string) => number[];
679
- /** ---------------------------------------------------------
680
- * * ***Encodes an array of Unicode code points to a UCS-2 string.***
681
- * ---------------------------------------------------------
682
- *
683
- * @param points - Array of Unicode code points.
684
- * @returns Encoded string.
685
- * @example
686
- * punycodeUtilsJS.ucs2.encode([66376]);
687
- * // โž” "๐ˆ"
688
- */
689
- encode: (points: number[]) => string;
690
- };
691
- /** ---------------------------------------------------------
692
- * * ***Decodes a `Punycode-UtilsJS` string to a Unicode string.***
693
- * ---------------------------------------------------------
694
- *
695
- * @param input - The `Punycode-UtilsJS` string to decode.
696
- * @returns Decoded Unicode string.
697
- * @example
698
- * punycodeUtilsJS.decode("xn--fsq");
699
- * // โž” "รผ"
700
- */
701
- decode: (input: string) => string;
702
- /** ---------------------------------------------------------
703
- * * ***Encodes a Unicode string to `Punycode-UtilsJS`.***
704
- * ---------------------------------------------------------
705
- *
706
- * @param input - Unicode string to encode.
707
- * @returns `Punycode-UtilsJS` string.
708
- * @example
709
- * punycodeUtilsJS.encode("รผ");
710
- * // โž” "xn--fsq"
711
- */
712
- encode: (input: string) => string;
713
- /** ---------------------------------------------------------
714
- * * ***Converts a Unicode domain or label to ASCII (`Punycode-UtilsJS`).***
715
- * ---------------------------------------------------------
716
- *
717
- * @param input - Domain or label string.
718
- * @returns ASCII string suitable for DNS.
719
- * @example
720
- * punycodeUtilsJS.toASCII("ะฟั€ะธะผะตั€.ั€ั„");
721
- * // โž” "xn--e1afmkfd.xn--p1ai"
722
- */
723
- toASCII: (input: string) => string;
658
+ * * ***Decodes a UCS-2 encoded string to an array of Unicode code points.***
659
+ * ---------------------------------------------------------
660
+ *
661
+ * @param input - The UCS-2 string to decode.
662
+ * @returns Array of Unicode code points.
663
+ * @example
664
+ * punycodeUtilsJS.ucs2.decode("๐ˆ");
665
+ * // โž” [66376]
666
+ */
667
+ decode: (input: string) => number[];
724
668
  /** ---------------------------------------------------------
725
- * * ***Converts an ASCII (`Punycode-UtilsJS`) domain or label to Unicode.***
726
- * ---------------------------------------------------------
727
- *
728
- * @param input - ASCII string (with xn-- prefix if needed).
729
- * @returns Unicode string.
730
- * @example
731
- * punycodeUtilsJS.toUnicode("xn--e1afmkfd.xn--p1ai");
732
- * // โž” "ะฟั€ะธะผะตั€.ั€ั„"
733
- */
734
- toUnicode: (input: string) => string;
669
+ * * ***Encodes an array of Unicode code points to a UCS-2 string.***
670
+ * ---------------------------------------------------------
671
+ *
672
+ * @param points - Array of Unicode code points.
673
+ * @returns Encoded string.
674
+ * @example
675
+ * punycodeUtilsJS.ucs2.encode([66376]);
676
+ * // โž” "๐ˆ"
677
+ */
678
+ encode: (points: number[]) => string;
679
+ };
680
+ /** ---------------------------------------------------------
681
+ * * ***Decodes a `Punycode-UtilsJS` string to a Unicode string.***
682
+ * ---------------------------------------------------------
683
+ *
684
+ * @param input - The `Punycode-UtilsJS` string to decode.
685
+ * @returns Decoded Unicode string.
686
+ * @example
687
+ * punycodeUtilsJS.decode("xn--fsq");
688
+ * // โž” "รผ"
689
+ */
690
+ decode: (input: string) => string;
691
+ /** ---------------------------------------------------------
692
+ * * ***Encodes a Unicode string to `Punycode-UtilsJS`.***
693
+ * ---------------------------------------------------------
694
+ *
695
+ * @param input - Unicode string to encode.
696
+ * @returns `Punycode-UtilsJS` string.
697
+ * @example
698
+ * punycodeUtilsJS.encode("รผ");
699
+ * // โž” "xn--fsq"
700
+ */
701
+ encode: (input: string) => string;
702
+ /** ---------------------------------------------------------
703
+ * * ***Converts a Unicode domain or label to ASCII (`Punycode-UtilsJS`).***
704
+ * ---------------------------------------------------------
705
+ *
706
+ * @param input - Domain or label string.
707
+ * @returns ASCII string suitable for DNS.
708
+ * @example
709
+ * punycodeUtilsJS.toASCII("ะฟั€ะธะผะตั€.ั€ั„");
710
+ * // โž” "xn--e1afmkfd.xn--p1ai"
711
+ */
712
+ toASCII: (input: string) => string;
713
+ /** ---------------------------------------------------------
714
+ * * ***Converts an ASCII (`Punycode-UtilsJS`) domain or label to Unicode.***
715
+ * ---------------------------------------------------------
716
+ *
717
+ * @param input - ASCII string (with xn-- prefix if needed).
718
+ * @returns Unicode string.
719
+ * @example
720
+ * punycodeUtilsJS.toUnicode("xn--e1afmkfd.xn--p1ai");
721
+ * // โž” "ะฟั€ะธะผะตั€.ั€ั„"
722
+ */
723
+ toUnicode: (input: string) => string;
735
724
  };
736
725
  /** ---------------------------------------------------------
737
- * * ***`Punycode-UtilsJS` object exposing all API functions and version.***
738
- * ---------------------------------------------------------
739
- * Provides encoding and decoding of Unicode domain names to ASCII (`Punycode-UtilsJS`)
740
- * and vice versa.
741
- *
742
- * - Useful for IDN (Internationalized Domain Names) support.
743
- */
726
+ * * ***`Punycode-UtilsJS` object exposing all API functions and version.***
727
+ * ---------------------------------------------------------
728
+ * Provides encoding and decoding of Unicode domain names to ASCII (`Punycode-UtilsJS`)
729
+ * and vice versa.
730
+ *
731
+ * - Useful for IDN (Internationalized Domain Names) support.
732
+ */
744
733
  declare const punycodeUtilsJS: PunycodeUtilsJS;
745
-
746
- export { type QueryParamPairs, constructURL, extractURLs, formatEnvPort, getFirstPrefixPathname, getPrefixPathname, normalizePathname, punycodeUtilsJS };
734
+ /**
735
+ * Export individual functions.
736
+ */
737
+ export { QueryParamPairs, constructURL, extractURLs, formatEnvPort, getFirstPrefixPathname, getPrefixPathname, normalizePathname, punycodeUtilsJS };