@rzl-zone/utils-js 3.12.1-beta.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.
- package/README.md +7 -7
- package/dist/.references/index.d.cts +1 -1
- package/dist/.references/index.d.ts +1 -1
- package/dist/{assertIsArray-BChqwPiP.cjs → assertIsArray-DJXkjHZs.cjs} +3 -3
- package/dist/{assertIsArray-BChqwPiP.cjs.map → assertIsArray-DJXkjHZs.cjs.map} +1 -1
- package/dist/{assertIsArray-BfAbIUfa.js → assertIsArray-bTA3XLjq.js} +3 -3
- package/dist/{assertIsArray-BfAbIUfa.js.map → assertIsArray-bTA3XLjq.js.map} +1 -1
- package/dist/{assertIsBoolean-DozdtbNi.cjs → assertIsBoolean-C8WEXVr2.cjs} +8 -8
- package/dist/assertIsBoolean-C8WEXVr2.cjs.map +1 -0
- package/dist/{assertIsBoolean-BlBct0Fc.js → assertIsBoolean-DR1SaXPD.js} +8 -8
- package/dist/assertIsBoolean-DR1SaXPD.js.map +1 -0
- package/dist/{assertIsString-Bvk7bUL7.cjs → assertIsString-BiHQSrB2.cjs} +3 -3
- package/dist/{assertIsString-Bvk7bUL7.cjs.map → assertIsString-BiHQSrB2.cjs.map} +1 -1
- package/dist/{assertIsString-DqV9NwbI.js → assertIsString-CEB07_83.js} +3 -3
- package/dist/{assertIsString-DqV9NwbI.js.map → assertIsString-CEB07_83.js.map} +1 -1
- package/dist/assertions/index.cjs +5 -5
- package/dist/assertions/index.d.cts +2 -2
- package/dist/assertions/index.d.ts +2 -2
- package/dist/assertions/index.js +5 -5
- package/dist/conversions/index.cjs +6 -6
- package/dist/conversions/index.d.cts +2 -2
- package/dist/conversions/index.d.ts +2 -2
- package/dist/conversions/index.js +6 -6
- package/dist/{conversions-EMJa3g-D.js → conversions-BNIh_tCH.js} +16 -18
- package/dist/conversions-BNIh_tCH.js.map +1 -0
- package/dist/{conversions-CBs8-REq.cjs → conversions-D_Kh0a_C.cjs} +16 -18
- package/dist/conversions-D_Kh0a_C.cjs.map +1 -0
- package/dist/events/index.cjs +4 -4
- package/dist/events/index.cjs.map +1 -1
- package/dist/events/index.d.cts +153 -151
- package/dist/events/index.d.ts +153 -151
- package/dist/events/index.js +4 -4
- package/dist/events/index.js.map +1 -1
- package/dist/{formatEnvPort-hHNvOim-.cjs → formatEnvPort-B3OLxQk9.cjs} +9 -9
- package/dist/formatEnvPort-B3OLxQk9.cjs.map +1 -0
- package/dist/{formatEnvPort-DpIXzPAZ.js → formatEnvPort-ByFVLjSV.js} +9 -9
- package/dist/formatEnvPort-ByFVLjSV.js.map +1 -0
- package/dist/formatters/index.cjs +2 -2
- package/dist/formatters/index.d.cts +2 -2
- package/dist/formatters/index.d.ts +2 -2
- package/dist/formatters/index.js +2 -2
- package/dist/{formatters-QcZO_Cpx.js → formatters--1m_vpE8.js} +17 -15
- package/dist/formatters--1m_vpE8.js.map +1 -0
- package/dist/{formatters-lAYgA11L.cjs → formatters-Cbij0XLU.cjs} +17 -15
- package/dist/formatters-Cbij0XLU.cjs.map +1 -0
- package/dist/generators/index.cjs +12 -8
- package/dist/generators/index.cjs.map +1 -1
- package/dist/generators/index.d.cts +2 -2
- package/dist/generators/index.d.ts +2 -2
- package/dist/generators/index.js +12 -8
- package/dist/generators/index.js.map +1 -1
- package/dist/index-59zbLcPr.d.ts +340 -0
- package/dist/index-B6tawc8L.d.cts +1716 -0
- package/dist/index-C267akkJ.d.ts +2158 -0
- package/dist/index-CeBC2Vvl.d.cts +2361 -0
- package/dist/index-CgRDTI6f.d.ts +822 -0
- package/dist/index-CoiUBVmr.d.ts +720 -0
- package/dist/index-D4fcasfZ.d.cts +720 -0
- package/dist/index-DDrSQKIc.d.ts +1716 -0
- package/dist/index-DsGxO31H.d.cts +765 -0
- package/dist/index-Hg1qJkjl.d.ts +765 -0
- package/dist/index-Qm3iFwd0.d.cts +2158 -0
- package/dist/index-UPp94Agr.d.ts +2361 -0
- package/dist/index-gBA_8SuF.d.cts +340 -0
- package/dist/index-jyDqzicx.d.cts +822 -0
- package/dist/{isBigInt-B1cijjqm.cjs → isBigInt-C4krUeAw.cjs} +2 -2
- package/dist/{isBigInt-B1cijjqm.cjs.map → isBigInt-C4krUeAw.cjs.map} +1 -1
- package/dist/{isBigInt-C0bN0Rhu.js → isBigInt-DKe0M6hp.js} +2 -2
- package/dist/{isBigInt-C0bN0Rhu.js.map → isBigInt-DKe0M6hp.js.map} +1 -1
- package/dist/{isEmptyObject-DeLVIJpl.js → isEmptyObject-DCipFwxJ.js} +3 -3
- package/dist/{isEmptyObject-DeLVIJpl.js.map → isEmptyObject-DCipFwxJ.js.map} +1 -1
- package/dist/{isEmptyObject-DI42NEo0.cjs → isEmptyObject-ZkSwRC_D.cjs} +3 -3
- package/dist/{isEmptyObject-DI42NEo0.cjs.map → isEmptyObject-ZkSwRC_D.cjs.map} +1 -1
- package/dist/{isEmptyString-BTUWYTbw.js → isEmptyString-BXzKAC2j.js} +3 -3
- package/dist/{isEmptyString-BTUWYTbw.js.map → isEmptyString-BXzKAC2j.js.map} +1 -1
- package/dist/{isEmptyString-CCK3bP74.cjs → isEmptyString-UiiUsSQj.cjs} +3 -3
- package/dist/{isEmptyString-CCK3bP74.cjs.map → isEmptyString-UiiUsSQj.cjs.map} +1 -1
- package/dist/{isEmptyValue-DMSMFTU8.cjs → isEmptyValue-BQzcjVaL.cjs} +5 -5
- package/dist/{isEmptyValue-DMSMFTU8.cjs.map → isEmptyValue-BQzcjVaL.cjs.map} +1 -1
- package/dist/{isEmptyValue-fjnfQnt5.js → isEmptyValue-jqOr7OHD.js} +5 -5
- package/dist/{isEmptyValue-fjnfQnt5.js.map → isEmptyValue-jqOr7OHD.js.map} +1 -1
- package/dist/{isEqual-DhyP8fB_.js → isEqual-BX49cF9m.js} +4 -4
- package/dist/{isEqual-DhyP8fB_.js.map → isEqual-BX49cF9m.js.map} +1 -1
- package/dist/{isEqual-B1fRgEuU.cjs → isEqual-BvumA3RA.cjs} +4 -4
- package/dist/{isEqual-B1fRgEuU.cjs.map → isEqual-BvumA3RA.cjs.map} +1 -1
- package/dist/{isFinite-BYMOo0os.js → isFinite-BCnaDpod.js} +3 -3
- package/dist/{isFinite-BYMOo0os.js.map → isFinite-BCnaDpod.js.map} +1 -1
- package/dist/{isFinite-sFkps2TY.cjs → isFinite-D24ZaE6c.cjs} +3 -3
- package/dist/{isFinite-sFkps2TY.cjs.map → isFinite-D24ZaE6c.cjs.map} +1 -1
- package/dist/{isInteger-FTCthMre.cjs → isInteger-Caeuz0rB.cjs} +2 -2
- package/dist/{isInteger-FTCthMre.cjs.map → isInteger-Caeuz0rB.cjs.map} +1 -1
- package/dist/{isInteger-DS9V7l_f.js → isInteger-naMbJsxJ.js} +2 -2
- package/dist/{isInteger-DS9V7l_f.js.map → isInteger-naMbJsxJ.js.map} +1 -1
- package/dist/isPlainObject-BF-2-phb.d.cts +339 -0
- package/dist/isPlainObject-DxNDL8XU.d.ts +339 -0
- package/dist/{isServer-q-QLFCqE.cjs → isServer-BJHVnixd.cjs} +2 -2
- package/dist/{isServer-q-QLFCqE.cjs.map → isServer-BJHVnixd.cjs.map} +1 -1
- package/dist/{isServer-D1TXfOs3.js → isServer-Da3o3XSs.js} +2 -2
- package/dist/{isServer-D1TXfOs3.js.map → isServer-Da3o3XSs.js.map} +1 -1
- package/dist/{isTypedArray-47R0wdrc.js → isTypedArray-DuNA8tK6.js} +3 -3
- package/dist/{isTypedArray-47R0wdrc.js.map → isTypedArray-DuNA8tK6.js.map} +1 -1
- package/dist/{isTypedArray-DiCoqffZ.cjs → isTypedArray-TJptiw2b.cjs} +3 -3
- package/dist/{isTypedArray-DiCoqffZ.cjs.map → isTypedArray-TJptiw2b.cjs.map} +1 -1
- package/dist/{isURL-CQiowFq2.js → isURL-C-kSk6KJ.js} +2 -2
- package/dist/{isURL-CQiowFq2.js.map → isURL-C-kSk6KJ.js.map} +1 -1
- package/dist/{isURL-WZypXsax.cjs → isURL-DeUPO_oR.cjs} +2 -2
- package/dist/{isURL-WZypXsax.cjs.map → isURL-DeUPO_oR.cjs.map} +1 -1
- package/dist/{isValidDomain-BSXshgkC.cjs → isValidDomain-BB9IGhJs.cjs} +65 -8
- package/dist/isValidDomain-BB9IGhJs.cjs.map +1 -0
- package/dist/{isValidDomain-DwA2EN79.js → isValidDomain-DoE98yhJ.js} +54 -9
- package/dist/isValidDomain-DoE98yhJ.js.map +1 -0
- package/dist/next/index.cjs +7 -7
- package/dist/next/index.cjs.map +1 -1
- package/dist/next/index.d.cts +185 -191
- package/dist/next/index.d.ts +185 -191
- package/dist/next/index.js +7 -7
- package/dist/next/index.js.map +1 -1
- package/dist/next/server/index.cjs +2 -2
- package/dist/next/server/index.d.cts +26 -26
- package/dist/next/server/index.d.ts +26 -26
- package/dist/next/server/index.js +2 -2
- package/dist/{noop-B2mTBhW-.cjs → noop-B13_ii35.cjs} +2 -2
- package/dist/{noop-B2mTBhW-.cjs.map → noop-B13_ii35.cjs.map} +1 -1
- package/dist/{noop-BzktGBVz.js → noop-ubqAIbHD.js} +2 -2
- package/dist/{noop-BzktGBVz.js.map → noop-ubqAIbHD.js.map} +1 -1
- package/dist/{normalizeSpaces-WS_iERJk.js → normalizeSpaces-Bg2IZW7W.js} +3 -3
- package/dist/{normalizeSpaces-WS_iERJk.js.map → normalizeSpaces-Bg2IZW7W.js.map} +1 -1
- package/dist/{normalizeSpaces-DQHR3Tlr.cjs → normalizeSpaces-ZXnR4Qzp.cjs} +3 -3
- package/dist/{normalizeSpaces-DQHR3Tlr.cjs.map → normalizeSpaces-ZXnR4Qzp.cjs.map} +1 -1
- package/dist/{normalizeString-2WLth_Gj.js → normalizeString-BDdkaXui.js} +3 -3
- package/dist/{normalizeString-2WLth_Gj.js.map → normalizeString-BDdkaXui.js.map} +1 -1
- package/dist/{normalizeString-D8euBcRD.cjs → normalizeString-BE6ELqEb.cjs} +3 -3
- package/dist/{normalizeString-D8euBcRD.cjs.map → normalizeString-BE6ELqEb.cjs.map} +1 -1
- package/dist/operations/index.cjs +10 -10
- package/dist/operations/index.cjs.map +1 -1
- package/dist/operations/index.d.cts +120 -120
- package/dist/operations/index.d.ts +120 -120
- package/dist/operations/index.js +10 -10
- package/dist/operations/index.js.map +1 -1
- package/dist/parsers/index.cjs +2 -2
- package/dist/parsers/index.d.cts +222 -222
- package/dist/parsers/index.d.ts +222 -222
- package/dist/parsers/index.js +2 -2
- package/dist/{parsers-Dpuq-V4u.js → parsers-BSBPgvsq.js} +4 -4
- package/dist/{parsers-Dpuq-V4u.js.map → parsers-BSBPgvsq.js.map} +1 -1
- package/dist/{parsers-DXtpsDyj.cjs → parsers-OqDeffqc.cjs} +4 -4
- package/dist/{parsers-DXtpsDyj.cjs.map → parsers-OqDeffqc.cjs.map} +1 -1
- package/dist/{parsing-B43x1sxn.js → parsing-Cao8b358.js} +3 -3
- package/dist/{parsing-B43x1sxn.js.map → parsing-Cao8b358.js.map} +1 -1
- package/dist/{parsing-lRoxn1Nz.cjs → parsing-DOGSCH6N.cjs} +3 -3
- package/dist/{parsing-lRoxn1Nz.cjs.map → parsing-DOGSCH6N.cjs.map} +1 -1
- package/dist/predicates/index.cjs +15 -15
- package/dist/predicates/index.d.cts +3 -3
- package/dist/predicates/index.d.ts +3 -3
- package/dist/predicates/index.js +15 -15
- package/dist/{predicates-gNepszvo.js → predicates-Bj6meyXV.js} +13 -14
- package/dist/{predicates-gNepszvo.js.map → predicates-Bj6meyXV.js.map} +1 -1
- package/dist/{predicates-DiaYA7Ps.cjs → predicates-D0ubqgqy.cjs} +13 -14
- package/dist/{predicates-DiaYA7Ps.cjs.map → predicates-D0ubqgqy.cjs.map} +1 -1
- package/dist/promises/index.cjs +4 -4
- package/dist/promises/index.d.cts +101 -101
- package/dist/promises/index.d.ts +101 -101
- package/dist/promises/index.js +4 -4
- package/dist/{punyCode-hmiFzLWT.js → punyCode-8SrbMWfM.js} +6 -6
- package/dist/punyCode-8SrbMWfM.js.map +1 -0
- package/dist/{punyCode-CTWXVVFo.cjs → punyCode-D-Qu6nj6.cjs} +6 -6
- package/dist/punyCode-D-Qu6nj6.cjs.map +1 -0
- package/dist/{removeSpaces-BE8lfh-4.js → removeSpaces-Bmc5DX4F.js} +3 -3
- package/dist/removeSpaces-Bmc5DX4F.js.map +1 -0
- package/dist/{removeSpaces-DRRxNWlb.cjs → removeSpaces-CWIvhZHg.cjs} +3 -3
- package/dist/removeSpaces-CWIvhZHg.cjs.map +1 -0
- package/dist/rzl-utils.global.js +21 -0
- package/dist/{safeJsonParse-CXruaP0p.js → safeJsonParse-BP38mwlj.js} +9 -9
- package/dist/safeJsonParse-BP38mwlj.js.map +1 -0
- package/dist/{safeJsonParse-BBnQElk8.cjs → safeJsonParse-Sms2CJf4.cjs} +9 -9
- package/dist/safeJsonParse-Sms2CJf4.cjs.map +1 -0
- package/dist/{safeStableStringify-Cc62pfRp.cjs → safeStableStringify-CJtP89qn.cjs} +4 -4
- package/dist/{safeStableStringify-Cc62pfRp.cjs.map → safeStableStringify-CJtP89qn.cjs.map} +1 -1
- package/dist/{safeStableStringify-BNh3D0K0.js → safeStableStringify-CXOZ9Ub8.js} +4 -4
- package/dist/{safeStableStringify-BNh3D0K0.js.map → safeStableStringify-CXOZ9Ub8.js.map} +1 -1
- package/dist/strings/index.cjs +12 -9
- package/dist/strings/index.cjs.map +1 -1
- package/dist/strings/index.d.cts +2 -2
- package/dist/strings/index.d.ts +2 -2
- package/dist/strings/index.js +12 -9
- package/dist/strings/index.js.map +1 -1
- package/dist/tailwind/index.cjs +2 -2
- package/dist/tailwind/index.d.cts +2 -2
- package/dist/tailwind/index.d.ts +2 -2
- package/dist/tailwind/index.js +2 -2
- package/dist/{tailwind-IJvOdkZp.js → tailwind-B2ssevxq.js} +5 -5
- package/dist/tailwind-B2ssevxq.js.map +1 -0
- package/dist/{tailwind-DJ4cmLUw.cjs → tailwind-CHIx9uxu.cjs} +5 -5
- package/dist/tailwind-CHIx9uxu.cjs.map +1 -0
- package/dist/{toStringArrayUnRecursive-xUaU8Ot9.cjs → toStringArrayUnRecursive-C4zYCja7.cjs} +6 -6
- package/dist/{toStringArrayUnRecursive-xUaU8Ot9.cjs.map → toStringArrayUnRecursive-C4zYCja7.cjs.map} +1 -1
- package/dist/{toStringArrayUnRecursive-CFs0jTEg.js → toStringArrayUnRecursive-DJGtPsFb.js} +6 -6
- package/dist/{toStringArrayUnRecursive-CFs0jTEg.js.map → toStringArrayUnRecursive-DJGtPsFb.js.map} +1 -1
- package/dist/urls/index.cjs +15 -14
- package/dist/urls/index.cjs.map +1 -1
- package/dist/urls/index.d.cts +656 -659
- package/dist/urls/index.d.ts +656 -659
- package/dist/urls/index.js +15 -14
- package/dist/urls/index.js.map +1 -1
- package/package.json +2 -2
- package/dist/assertIsBoolean-BlBct0Fc.js.map +0 -1
- package/dist/assertIsBoolean-DozdtbNi.cjs.map +0 -1
- package/dist/conversions-CBs8-REq.cjs.map +0 -1
- package/dist/conversions-EMJa3g-D.js.map +0 -1
- package/dist/formatEnvPort-DpIXzPAZ.js.map +0 -1
- package/dist/formatEnvPort-hHNvOim-.cjs.map +0 -1
- package/dist/formatters-QcZO_Cpx.js.map +0 -1
- package/dist/formatters-lAYgA11L.cjs.map +0 -1
- package/dist/index-26W7ItWx.d.ts +0 -760
- package/dist/index-BPPQjAfs.d.cts +0 -2359
- package/dist/index-BXjlgBLz.d.cts +0 -2139
- package/dist/index-B_Wwo91H.d.ts +0 -2359
- package/dist/index-CpufydcI.d.cts +0 -704
- package/dist/index-Czc4O526.d.ts +0 -333
- package/dist/index-DPs1_p5G.d.cts +0 -760
- package/dist/index-DRpOyBSC.d.ts +0 -1703
- package/dist/index-DWWvtHUn.d.cts +0 -822
- package/dist/index-DnM0LD0n.d.cts +0 -333
- package/dist/index-GUZ9fK6T.d.ts +0 -2139
- package/dist/index-I4fAzwXV.d.ts +0 -704
- package/dist/index-JDrOl_19.d.ts +0 -822
- package/dist/index-b66P49Qe.d.cts +0 -1703
- package/dist/isPlainObject-DcFGh3_5.d.ts +0 -530
- package/dist/isPlainObject-doTI11Ib.d.cts +0 -530
- package/dist/isValidDomain-BSXshgkC.cjs.map +0 -1
- package/dist/isValidDomain-DwA2EN79.js.map +0 -1
- package/dist/punyCode-CTWXVVFo.cjs.map +0 -1
- package/dist/punyCode-hmiFzLWT.js.map +0 -1
- package/dist/removeSpaces-BE8lfh-4.js.map +0 -1
- package/dist/removeSpaces-DRRxNWlb.cjs.map +0 -1
- package/dist/safeJsonParse-BBnQElk8.cjs.map +0 -1
- package/dist/safeJsonParse-CXruaP0p.js.map +0 -1
- package/dist/tailwind-DJ4cmLUw.cjs.map +0 -1
- package/dist/tailwind-IJvOdkZp.js.map +0 -1
package/dist/urls/index.d.ts
CHANGED
|
@@ -2,485 +2,487 @@
|
|
|
2
2
|
* ========================================================================
|
|
3
3
|
* @rzl-zone/utils-js
|
|
4
4
|
* ------------------------------------------------------------------------
|
|
5
|
-
* Version: `3.12.1-beta.
|
|
5
|
+
* Version: `3.12.1-beta.1`
|
|
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
|
/** ----------------------------------------------------------
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
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
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
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
86
|
/** ---------------------------------
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
|
|
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
|
+
*/
|
|
111
111
|
declare const extractURLs: (url: string | null | undefined) => string[] | null;
|
|
112
112
|
/** --------------------------------------------------------
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
124
|
-
|
|
125
|
-
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
180
|
-
|
|
181
|
-
|
|
182
|
-
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
|
|
192
|
-
|
|
193
|
-
|
|
194
|
-
|
|
195
|
-
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
200
|
-
|
|
201
|
-
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
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
|
+
*/
|
|
207
207
|
declare const getFirstPrefixPathname: (result: string | string[] | null | undefined, defaultValue?: string) => string;
|
|
208
208
|
type GetPrefixPathnameOptions = {
|
|
209
209
|
/** The number of levels to include in the prefix (default is `1`).
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
210
|
+
*
|
|
211
|
+
* - For example, with `levels = 2`, the function will return the first two parts of the URL.
|
|
212
|
+
*
|
|
213
|
+
* @default 1
|
|
214
|
+
*/
|
|
215
215
|
levels?: number;
|
|
216
216
|
/** Whether to remove duplicates from the result if multiple URLs are passed (default is `true`).
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
217
|
+
*
|
|
218
|
+
* @default true
|
|
219
|
+
*/
|
|
220
220
|
removeDuplicates?: boolean;
|
|
221
221
|
};
|
|
222
222
|
/** --------------------------------------------------------
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
|
|
233
|
-
|
|
234
|
-
|
|
235
|
-
|
|
236
|
-
|
|
237
|
-
|
|
238
|
-
|
|
239
|
-
|
|
240
|
-
|
|
241
|
-
|
|
242
|
-
|
|
243
|
-
|
|
244
|
-
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
248
|
-
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
|
|
255
|
-
|
|
256
|
-
|
|
257
|
-
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
-
|
|
271
|
-
|
|
272
|
-
|
|
273
|
-
|
|
274
|
-
|
|
275
|
-
|
|
276
|
-
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
|
|
283
|
-
|
|
284
|
-
|
|
285
|
-
|
|
286
|
-
|
|
287
|
-
|
|
288
|
-
|
|
289
|
-
|
|
290
|
-
|
|
291
|
-
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
|
|
296
|
-
|
|
297
|
-
|
|
298
|
-
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
|
|
308
|
-
|
|
309
|
-
|
|
310
|
-
|
|
311
|
-
|
|
312
|
-
|
|
313
|
-
|
|
314
|
-
|
|
315
|
-
|
|
316
|
-
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
|
|
320
|
-
|
|
321
|
-
|
|
322
|
-
|
|
323
|
-
|
|
324
|
-
|
|
325
|
-
|
|
326
|
-
|
|
327
|
-
|
|
328
|
-
|
|
329
|
-
|
|
330
|
-
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
|
|
334
|
-
|
|
335
|
-
|
|
336
|
-
|
|
337
|
-
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
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
|
+
*/
|
|
350
350
|
declare const getPrefixPathname: (url: string | string[], base?: string | string[] | null, options?: GetPrefixPathnameOptions) => string | string[] | null;
|
|
351
351
|
/** Options when `keepNullable` is false (default).
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
352
|
+
*
|
|
353
|
+
* Returns `defaultPath` if `pathname` is empty or invalid.
|
|
354
|
+
*/
|
|
355
355
|
type UnKeepNullableOptions = {
|
|
356
356
|
/** * ***Fallback value returned if `pathname` is empty-string or invalid.***
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
357
|
+
*
|
|
358
|
+
* Must be a **`non-empty string`**, defaultValue: `"/"`.
|
|
359
|
+
*
|
|
360
|
+
* @default "/"
|
|
361
|
+
*/
|
|
362
362
|
defaultPath?: string;
|
|
363
363
|
/** * ***Whether to preserve `null` or `undefined`, defaultValue: `false`.***
|
|
364
|
-
|
|
365
|
-
|
|
366
|
-
|
|
364
|
+
*
|
|
365
|
+
* @default false
|
|
366
|
+
*/
|
|
367
367
|
keepNullable?: false;
|
|
368
368
|
};
|
|
369
369
|
/** Options when `keepNullable` is true.
|
|
370
|
-
|
|
371
|
-
|
|
372
|
-
|
|
370
|
+
*
|
|
371
|
+
* Preserves `null` or `undefined` instead of returning `defaultPath`.
|
|
372
|
+
*/
|
|
373
373
|
type KeepNullableOptions = {
|
|
374
374
|
/** * ***Fallback path is ignored when `keepNullable` is true **(except if
|
|
375
|
-
|
|
376
|
-
|
|
377
|
-
|
|
378
|
-
|
|
379
|
-
|
|
375
|
+
* `pathname` is empty-string or invalid, even this `true`)**,
|
|
376
|
+
* defaultValue: `"/"`.***
|
|
377
|
+
*
|
|
378
|
+
* @default "/"
|
|
379
|
+
*/
|
|
380
380
|
defaultPath?: string;
|
|
381
381
|
/** * ***Preserve `null` or `undefined` as-is if `true` (defaultValue: `false`).***
|
|
382
|
-
|
|
383
|
-
|
|
384
|
-
|
|
385
|
-
|
|
386
|
-
|
|
387
|
-
|
|
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
|
+
*/
|
|
388
390
|
keepNullable?: true;
|
|
389
391
|
};
|
|
390
392
|
type MainNormalizePathnameOptions = {
|
|
391
393
|
/** --------------------------------------------------------
|
|
392
|
-
|
|
393
|
-
|
|
394
|
-
|
|
395
|
-
|
|
396
|
-
|
|
394
|
+
* * ***Preserve trailing slash at the end of the normalized pathname, defaultValue: `false`.***
|
|
395
|
+
* --------------------------------------------------------
|
|
396
|
+
*
|
|
397
|
+
* @default `false`
|
|
398
|
+
*/
|
|
397
399
|
keepTrailingSlash?: boolean;
|
|
398
400
|
/** --------------------------------------------------------
|
|
399
|
-
|
|
400
|
-
|
|
401
|
-
|
|
402
|
-
|
|
403
|
-
|
|
404
|
-
|
|
405
|
-
|
|
406
|
-
|
|
407
|
-
|
|
408
|
-
|
|
409
|
-
|
|
410
|
-
|
|
411
|
-
|
|
412
|
-
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
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
|
+
*/
|
|
416
418
|
localhostDomain?: boolean;
|
|
417
419
|
/**
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
421
|
-
|
|
422
|
-
|
|
423
|
-
|
|
424
|
-
|
|
425
|
-
|
|
426
|
-
|
|
427
|
-
|
|
428
|
-
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
|
|
434
|
-
|
|
435
|
-
|
|
436
|
-
|
|
437
|
-
|
|
438
|
-
|
|
439
|
-
|
|
440
|
-
|
|
441
|
-
|
|
442
|
-
|
|
443
|
-
|
|
444
|
-
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
|
|
458
|
-
|
|
459
|
-
|
|
460
|
-
|
|
461
|
-
|
|
462
|
-
|
|
463
|
-
|
|
464
|
-
|
|
465
|
-
|
|
466
|
-
|
|
467
|
-
|
|
468
|
-
|
|
469
|
-
|
|
470
|
-
|
|
471
|
-
|
|
472
|
-
|
|
473
|
-
|
|
474
|
-
|
|
475
|
-
|
|
476
|
-
|
|
477
|
-
|
|
478
|
-
|
|
479
|
-
|
|
480
|
-
|
|
481
|
-
|
|
482
|
-
|
|
483
|
-
|
|
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
|
+
*/
|
|
484
486
|
ignoreDomainExtensions?: Set<string> | string[];
|
|
485
487
|
};
|
|
486
488
|
type NormalizePathnameOptionsKeepNullableTrue = MainNormalizePathnameOptions & KeepNullableOptions;
|
|
@@ -488,253 +490,248 @@ type NormalizePathnameOptionsKeepNullableFalse = MainNormalizePathnameOptions &
|
|
|
488
490
|
type ResUnKeepNullable<T> = T extends undefined ? string : T extends null ? string : T extends null | undefined ? string : string;
|
|
489
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;
|
|
490
492
|
/** --------------------------------------------------------
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
499
|
-
|
|
500
|
-
|
|
501
|
-
|
|
502
|
-
|
|
503
|
-
|
|
504
|
-
|
|
505
|
-
|
|
506
|
-
|
|
507
|
-
|
|
508
|
-
|
|
509
|
-
|
|
510
|
-
|
|
511
|
-
|
|
512
|
-
|
|
513
|
-
|
|
514
|
-
|
|
515
|
-
|
|
516
|
-
|
|
517
|
-
|
|
518
|
-
|
|
519
|
-
|
|
520
|
-
|
|
521
|
-
|
|
522
|
-
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
526
|
-
|
|
527
|
-
|
|
528
|
-
|
|
529
|
-
|
|
530
|
-
|
|
531
|
-
|
|
532
|
-
|
|
533
|
-
|
|
534
|
-
|
|
535
|
-
|
|
536
|
-
|
|
537
|
-
|
|
538
|
-
|
|
539
|
-
|
|
540
|
-
|
|
541
|
-
|
|
542
|
-
|
|
543
|
-
|
|
544
|
-
|
|
545
|
-
|
|
546
|
-
|
|
547
|
-
|
|
548
|
-
|
|
549
|
-
|
|
550
|
-
|
|
551
|
-
|
|
552
|
-
|
|
553
|
-
|
|
554
|
-
|
|
555
|
-
|
|
556
|
-
|
|
557
|
-
|
|
558
|
-
|
|
559
|
-
|
|
560
|
-
|
|
561
|
-
|
|
562
|
-
|
|
563
|
-
|
|
564
|
-
|
|
565
|
-
|
|
566
|
-
|
|
567
|
-
|
|
568
|
-
|
|
569
|
-
|
|
570
|
-
|
|
571
|
-
|
|
572
|
-
|
|
573
|
-
|
|
574
|
-
|
|
575
|
-
|
|
576
|
-
|
|
577
|
-
|
|
578
|
-
|
|
579
|
-
|
|
580
|
-
|
|
581
|
-
|
|
582
|
-
|
|
583
|
-
|
|
584
|
-
|
|
585
|
-
|
|
586
|
-
|
|
587
|
-
|
|
588
|
-
|
|
589
|
-
|
|
590
|
-
|
|
591
|
-
|
|
592
|
-
|
|
593
|
-
|
|
594
|
-
|
|
595
|
-
|
|
596
|
-
|
|
597
|
-
|
|
598
|
-
|
|
599
|
-
|
|
600
|
-
|
|
601
|
-
|
|
602
|
-
|
|
603
|
-
|
|
604
|
-
|
|
605
|
-
|
|
606
|
-
|
|
607
|
-
|
|
608
|
-
|
|
609
|
-
|
|
610
|
-
|
|
611
|
-
|
|
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
|
+
*/
|
|
612
614
|
declare function normalizePathname<T>(pathname: T, options?: NormalizePathnameOptionsKeepNullableFalse): ResUnKeepNullable<T>;
|
|
613
615
|
declare function normalizePathname<T>(pathname: T, options?: NormalizePathnameOptionsKeepNullableTrue): ResKeepNullable<T>;
|
|
614
616
|
type FormatEnvPortOptions = {
|
|
615
617
|
/** Add prefix with a colon, defaultValue: `false`.
|
|
616
|
-
|
|
617
|
-
|
|
618
|
-
|
|
618
|
+
*
|
|
619
|
+
* @default false
|
|
620
|
+
*/
|
|
619
621
|
prefixColon?: boolean;
|
|
620
622
|
};
|
|
621
623
|
/** -----------------------------------------------
|
|
622
|
-
|
|
623
|
-
|
|
624
|
-
|
|
625
|
-
|
|
626
|
-
|
|
627
|
-
|
|
628
|
-
|
|
629
|
-
|
|
630
|
-
|
|
631
|
-
|
|
632
|
-
|
|
633
|
-
|
|
634
|
-
|
|
635
|
-
|
|
636
|
-
|
|
637
|
-
|
|
638
|
-
|
|
639
|
-
|
|
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
|
+
*/
|
|
640
642
|
declare const formatEnvPort: (envVar: string | null | undefined, options?: FormatEnvPortOptions) => string;
|
|
641
|
-
/** ---------------------------------------------------------
|
|
642
|
-
* * ***Constants for `Punycode-UtilsJS` algorithm.***
|
|
643
|
-
* ---------------------------------------------------------
|
|
644
|
-
* These constants are used internally for encoding and decoding.
|
|
645
|
-
*
|
|
646
|
-
* Unicode domain names to ASCII (`Punycode-UtilsJS`) and vice versa.
|
|
647
|
-
*/
|
|
648
643
|
type PunycodeUtilsJS = {
|
|
649
644
|
/** ---------------------------------------------------------
|
|
650
|
-
|
|
651
|
-
|
|
652
|
-
|
|
653
|
-
|
|
654
|
-
|
|
655
|
-
|
|
645
|
+
* * ***Version of the `Punycode-UtilsJS` implementation.***
|
|
646
|
+
* ---------------------------------------------------------
|
|
647
|
+
*
|
|
648
|
+
* @example
|
|
649
|
+
* console.log(punycodeUtilsJS.version); // "1.0.0"
|
|
650
|
+
*/
|
|
656
651
|
version: string;
|
|
657
652
|
/** ---------------------------------------------------------
|
|
658
|
-
|
|
659
|
-
|
|
660
|
-
|
|
653
|
+
* * ***UCS-2 utility functions.***
|
|
654
|
+
* ---------------------------------------------------------
|
|
655
|
+
*/
|
|
661
656
|
ucs2: {
|
|
662
657
|
/** ---------------------------------------------------------
|
|
663
|
-
|
|
664
|
-
|
|
665
|
-
|
|
666
|
-
|
|
667
|
-
|
|
668
|
-
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
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
|
+
*/
|
|
672
667
|
decode: (input: string) => number[];
|
|
673
668
|
/** ---------------------------------------------------------
|
|
674
|
-
|
|
675
|
-
|
|
676
|
-
|
|
677
|
-
|
|
678
|
-
|
|
679
|
-
|
|
680
|
-
|
|
681
|
-
|
|
682
|
-
|
|
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
|
+
*/
|
|
683
678
|
encode: (points: number[]) => string;
|
|
684
679
|
};
|
|
685
680
|
/** ---------------------------------------------------------
|
|
686
|
-
|
|
687
|
-
|
|
688
|
-
|
|
689
|
-
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
|
|
693
|
-
|
|
694
|
-
|
|
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
|
+
*/
|
|
695
690
|
decode: (input: string) => string;
|
|
696
691
|
/** ---------------------------------------------------------
|
|
697
|
-
|
|
698
|
-
|
|
699
|
-
|
|
700
|
-
|
|
701
|
-
|
|
702
|
-
|
|
703
|
-
|
|
704
|
-
|
|
705
|
-
|
|
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
|
+
*/
|
|
706
701
|
encode: (input: string) => string;
|
|
707
702
|
/** ---------------------------------------------------------
|
|
708
|
-
|
|
709
|
-
|
|
710
|
-
|
|
711
|
-
|
|
712
|
-
|
|
713
|
-
|
|
714
|
-
|
|
715
|
-
|
|
716
|
-
|
|
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
|
+
*/
|
|
717
712
|
toASCII: (input: string) => string;
|
|
718
713
|
/** ---------------------------------------------------------
|
|
719
|
-
|
|
720
|
-
|
|
721
|
-
|
|
722
|
-
|
|
723
|
-
|
|
724
|
-
|
|
725
|
-
|
|
726
|
-
|
|
727
|
-
|
|
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
|
+
*/
|
|
728
723
|
toUnicode: (input: string) => string;
|
|
729
724
|
};
|
|
730
725
|
/** ---------------------------------------------------------
|
|
731
|
-
|
|
732
|
-
|
|
733
|
-
|
|
734
|
-
|
|
735
|
-
|
|
736
|
-
|
|
737
|
-
|
|
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
|
+
*/
|
|
738
733
|
declare const punycodeUtilsJS: PunycodeUtilsJS;
|
|
739
|
-
/**
|
|
734
|
+
/**
|
|
735
|
+
* Export individual functions.
|
|
736
|
+
*/
|
|
740
737
|
export { QueryParamPairs, constructURL, extractURLs, formatEnvPort, getFirstPrefixPathname, getPrefixPathname, normalizePathname, punycodeUtilsJS };
|