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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (286) hide show
  1. package/{LICENSE.md → LICENSE} +3 -3
  2. package/README.md +62 -89
  3. package/dist/.references/index.d.cts +25 -0
  4. package/dist/.references/index.d.ts +25 -0
  5. package/dist/assertIsArray-BChqwPiP.cjs +26 -0
  6. package/dist/assertIsArray-BChqwPiP.cjs.map +1 -0
  7. package/dist/assertIsArray-BfAbIUfa.js +20 -0
  8. package/dist/assertIsArray-BfAbIUfa.js.map +1 -0
  9. package/dist/assertIsBoolean-BlBct0Fc.js +1073 -0
  10. package/dist/assertIsBoolean-BlBct0Fc.js.map +1 -0
  11. package/dist/assertIsBoolean-DozdtbNi.cjs +1283 -0
  12. package/dist/assertIsBoolean-DozdtbNi.cjs.map +1 -0
  13. package/dist/assertIsString-Bvk7bUL7.cjs +26 -0
  14. package/dist/assertIsString-Bvk7bUL7.cjs.map +1 -0
  15. package/dist/assertIsString-DqV9NwbI.js +20 -0
  16. package/dist/assertIsString-DqV9NwbI.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-CBs8-REq.cjs +448 -0
  28. package/dist/conversions-CBs8-REq.cjs.map +1 -0
  29. package/dist/conversions-EMJa3g-D.js +382 -0
  30. package/dist/conversions-EMJa3g-D.js.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 +174 -0
  34. package/dist/events/index.d.ts +31 -35
  35. package/dist/events/index.js +50 -12
  36. package/dist/events/index.js.map +1 -0
  37. package/dist/formatEnvPort-DpIXzPAZ.js +159 -0
  38. package/dist/formatEnvPort-DpIXzPAZ.js.map +1 -0
  39. package/dist/formatEnvPort-hHNvOim-.cjs +171 -0
  40. package/dist/formatEnvPort-hHNvOim-.cjs.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-QcZO_Cpx.js +367 -0
  46. package/dist/formatters-QcZO_Cpx.js.map +1 -0
  47. package/dist/formatters-lAYgA11L.cjs +427 -0
  48. package/dist/formatters-lAYgA11L.cjs.map +1 -0
  49. package/dist/generators/index.cjs +161 -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 +154 -14
  54. package/dist/generators/index.js.map +1 -0
  55. package/dist/index-26W7ItWx.d.ts +760 -0
  56. package/dist/index-BPPQjAfs.d.cts +2359 -0
  57. package/dist/index-BXjlgBLz.d.cts +2139 -0
  58. package/dist/index-B_Wwo91H.d.ts +2359 -0
  59. package/dist/index-CpufydcI.d.cts +704 -0
  60. package/dist/index-Czc4O526.d.ts +333 -0
  61. package/dist/index-DPs1_p5G.d.cts +760 -0
  62. package/dist/index-DRpOyBSC.d.ts +1703 -0
  63. package/dist/index-DWWvtHUn.d.cts +822 -0
  64. package/dist/index-DnM0LD0n.d.cts +333 -0
  65. package/dist/index-GUZ9fK6T.d.ts +2139 -0
  66. package/dist/index-I4fAzwXV.d.ts +704 -0
  67. package/dist/index-JDrOl_19.d.ts +822 -0
  68. package/dist/index-b66P49Qe.d.cts +1703 -0
  69. package/dist/isBigInt-B1cijjqm.cjs +20 -0
  70. package/dist/isBigInt-B1cijjqm.cjs.map +1 -0
  71. package/dist/isBigInt-C0bN0Rhu.js +14 -0
  72. package/dist/isBigInt-C0bN0Rhu.js.map +1 -0
  73. package/dist/isEmptyObject-DI42NEo0.cjs +37 -0
  74. package/dist/isEmptyObject-DI42NEo0.cjs.map +1 -0
  75. package/dist/isEmptyObject-DeLVIJpl.js +25 -0
  76. package/dist/isEmptyObject-DeLVIJpl.js.map +1 -0
  77. package/dist/isEmptyString-BTUWYTbw.js +15 -0
  78. package/dist/isEmptyString-BTUWYTbw.js.map +1 -0
  79. package/dist/isEmptyString-CCK3bP74.cjs +21 -0
  80. package/dist/isEmptyString-CCK3bP74.cjs.map +1 -0
  81. package/dist/isEmptyValue-DMSMFTU8.cjs +30 -0
  82. package/dist/isEmptyValue-DMSMFTU8.cjs.map +1 -0
  83. package/dist/isEmptyValue-fjnfQnt5.js +24 -0
  84. package/dist/isEmptyValue-fjnfQnt5.js.map +1 -0
  85. package/dist/isEqual-B1fRgEuU.cjs +111 -0
  86. package/dist/isEqual-B1fRgEuU.cjs.map +1 -0
  87. package/dist/isEqual-DhyP8fB_.js +87 -0
  88. package/dist/isEqual-DhyP8fB_.js.map +1 -0
  89. package/dist/isFinite-BYMOo0os.js +15 -0
  90. package/dist/isFinite-BYMOo0os.js.map +1 -0
  91. package/dist/isFinite-sFkps2TY.cjs +21 -0
  92. package/dist/isFinite-sFkps2TY.cjs.map +1 -0
  93. package/dist/isInteger-DS9V7l_f.js +14 -0
  94. package/dist/isInteger-DS9V7l_f.js.map +1 -0
  95. package/dist/isInteger-FTCthMre.cjs +20 -0
  96. package/dist/isInteger-FTCthMre.cjs.map +1 -0
  97. package/dist/isPlainObject-DcFGh3_5.d.ts +530 -0
  98. package/dist/isPlainObject-doTI11Ib.d.cts +530 -0
  99. package/dist/isServer-D1TXfOs3.js +14 -0
  100. package/dist/isServer-D1TXfOs3.js.map +1 -0
  101. package/dist/isServer-q-QLFCqE.cjs +20 -0
  102. package/dist/isServer-q-QLFCqE.cjs.map +1 -0
  103. package/dist/isTypedArray-47R0wdrc.js +31 -0
  104. package/dist/isTypedArray-47R0wdrc.js.map +1 -0
  105. package/dist/isTypedArray-DiCoqffZ.cjs +43 -0
  106. package/dist/isTypedArray-DiCoqffZ.cjs.map +1 -0
  107. package/dist/isURL-CQiowFq2.js +14 -0
  108. package/dist/isURL-CQiowFq2.js.map +1 -0
  109. package/dist/isURL-WZypXsax.cjs +20 -0
  110. package/dist/isURL-WZypXsax.cjs.map +1 -0
  111. package/dist/isValidDomain-BSXshgkC.cjs +1788 -0
  112. package/dist/isValidDomain-BSXshgkC.cjs.map +1 -0
  113. package/dist/isValidDomain-DwA2EN79.js +1782 -0
  114. package/dist/isValidDomain-DwA2EN79.js.map +1 -0
  115. package/dist/next/index.cjs +119 -212
  116. package/dist/next/index.cjs.map +1 -0
  117. package/dist/next/index.d.cts +226 -0
  118. package/dist/next/index.d.ts +26 -31
  119. package/dist/next/index.js +117 -210
  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 +9 -10
  125. package/dist/next/server/index.js +23 -38
  126. package/dist/next/server/index.js.map +1 -0
  127. package/dist/noop-B2mTBhW-.cjs +18 -0
  128. package/dist/noop-B2mTBhW-.cjs.map +1 -0
  129. package/dist/noop-BzktGBVz.js +12 -0
  130. package/dist/noop-BzktGBVz.js.map +1 -0
  131. package/dist/normalizeSpaces-DQHR3Tlr.cjs +29 -0
  132. package/dist/normalizeSpaces-DQHR3Tlr.cjs.map +1 -0
  133. package/dist/normalizeSpaces-WS_iERJk.js +23 -0
  134. package/dist/normalizeSpaces-WS_iERJk.js.map +1 -0
  135. package/dist/normalizeString-2WLth_Gj.js +15 -0
  136. package/dist/normalizeString-2WLth_Gj.js.map +1 -0
  137. package/dist/normalizeString-D8euBcRD.cjs +21 -0
  138. package/dist/normalizeString-D8euBcRD.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 +10 -15
  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 +71 -72
  148. package/dist/parsers/index.js +10 -12
  149. package/dist/parsers-DXtpsDyj.cjs +649 -0
  150. package/dist/parsers-DXtpsDyj.cjs.map +1 -0
  151. package/dist/parsers-Dpuq-V4u.js +643 -0
  152. package/dist/parsers-Dpuq-V4u.js.map +1 -0
  153. package/dist/parsing-B43x1sxn.js +50 -0
  154. package/dist/parsing-B43x1sxn.js.map +1 -0
  155. package/dist/parsing-lRoxn1Nz.cjs +56 -0
  156. package/dist/parsing-lRoxn1Nz.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-DiaYA7Ps.cjs +413 -0
  162. package/dist/predicates-DiaYA7Ps.cjs.map +1 -0
  163. package/dist/predicates-gNepszvo.js +257 -0
  164. package/dist/predicates-gNepszvo.js.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 +28 -31
  169. package/dist/promises/index.js +73 -13
  170. package/dist/promises/index.js.map +1 -0
  171. package/dist/punyCode-CTWXVVFo.cjs +185 -0
  172. package/dist/punyCode-CTWXVVFo.cjs.map +1 -0
  173. package/dist/punyCode-hmiFzLWT.js +179 -0
  174. package/dist/punyCode-hmiFzLWT.js.map +1 -0
  175. package/dist/removeSpaces-BE8lfh-4.js +19 -0
  176. package/dist/removeSpaces-BE8lfh-4.js.map +1 -0
  177. package/dist/removeSpaces-DRRxNWlb.cjs +25 -0
  178. package/dist/removeSpaces-DRRxNWlb.cjs.map +1 -0
  179. package/dist/safeJsonParse-BBnQElk8.cjs +208 -0
  180. package/dist/safeJsonParse-BBnQElk8.cjs.map +1 -0
  181. package/dist/safeJsonParse-CXruaP0p.js +184 -0
  182. package/dist/safeJsonParse-CXruaP0p.js.map +1 -0
  183. package/dist/safeStableStringify-BNh3D0K0.js +88 -0
  184. package/dist/safeStableStringify-BNh3D0K0.js.map +1 -0
  185. package/dist/safeStableStringify-Cc62pfRp.cjs +106 -0
  186. package/dist/safeStableStringify-Cc62pfRp.cjs.map +1 -0
  187. package/dist/strings/index.cjs +76 -81
  188. package/dist/strings/index.cjs.map +1 -0
  189. package/dist/strings/index.d.cts +12 -0
  190. package/dist/strings/index.d.ts +10 -775
  191. package/dist/strings/index.js +59 -14
  192. package/dist/strings/index.js.map +1 -0
  193. package/dist/tailwind/index.cjs +19 -47
  194. package/dist/tailwind/index.d.cts +12 -0
  195. package/dist/tailwind/index.d.ts +11 -712
  196. package/dist/tailwind/index.js +10 -12
  197. package/dist/tailwind-DJ4cmLUw.cjs +247 -0
  198. package/dist/tailwind-DJ4cmLUw.cjs.map +1 -0
  199. package/dist/tailwind-IJvOdkZp.js +199 -0
  200. package/dist/tailwind-IJvOdkZp.js.map +1 -0
  201. package/dist/toStringArrayUnRecursive-CFs0jTEg.js +39 -0
  202. package/dist/toStringArrayUnRecursive-CFs0jTEg.js.map +1 -0
  203. package/dist/toStringArrayUnRecursive-xUaU8Ot9.cjs +51 -0
  204. package/dist/toStringArrayUnRecursive-xUaU8Ot9.cjs.map +1 -0
  205. package/dist/urls/index.cjs +129 -57
  206. package/dist/urls/index.cjs.map +1 -0
  207. package/dist/urls/index.d.cts +740 -0
  208. package/dist/urls/index.d.ts +218 -224
  209. package/dist/urls/index.js +121 -26
  210. package/dist/urls/index.js.map +1 -0
  211. package/package.json +203 -194
  212. package/dist/chunk-22V4WP3H.js +0 -53
  213. package/dist/chunk-2XSZ2ANI.js +0 -63
  214. package/dist/chunk-3T6VSWYX.js +0 -21
  215. package/dist/chunk-5WIEDF2J.js +0 -1823
  216. package/dist/chunk-6EDFZJZ5.cjs +0 -598
  217. package/dist/chunk-6LXWT2I5.js +0 -32
  218. package/dist/chunk-6YGBRENU.js +0 -209
  219. package/dist/chunk-7FGNVDEV.cjs +0 -38
  220. package/dist/chunk-AXDYWO67.js +0 -119
  221. package/dist/chunk-B6PMNZ4M.cjs +0 -35
  222. package/dist/chunk-BAV5T2E3.cjs +0 -15
  223. package/dist/chunk-BLF7SD66.js +0 -95
  224. package/dist/chunk-BMZZXZJ2.cjs +0 -30
  225. package/dist/chunk-BOYP3ARU.js +0 -264
  226. package/dist/chunk-BPYW5YL7.js +0 -16
  227. package/dist/chunk-C2PV3VWC.cjs +0 -118
  228. package/dist/chunk-CCJ2MSN7.js +0 -16
  229. package/dist/chunk-DAPAK2W3.cjs +0 -123
  230. package/dist/chunk-DLS3G6WQ.cjs +0 -23
  231. package/dist/chunk-DNMCR5JH.js +0 -370
  232. package/dist/chunk-DVMHRLKP.cjs +0 -16
  233. package/dist/chunk-EBYFYZW4.cjs +0 -26
  234. package/dist/chunk-ENMRZ4BE.js +0 -302
  235. package/dist/chunk-FJ4BQFVO.js +0 -587
  236. package/dist/chunk-GIKL4PUF.cjs +0 -106
  237. package/dist/chunk-GOFINGT6.js +0 -35
  238. package/dist/chunk-GXKQ3LHF.js +0 -101
  239. package/dist/chunk-HNBRGN4R.js +0 -24
  240. package/dist/chunk-HYN6FC5A.cjs +0 -249
  241. package/dist/chunk-IZGVBYFN.js +0 -242
  242. package/dist/chunk-JIE447J5.js +0 -676
  243. package/dist/chunk-JXEIJM5M.cjs +0 -237
  244. package/dist/chunk-K47GZDBH.js +0 -115
  245. package/dist/chunk-K5536YHG.cjs +0 -269
  246. package/dist/chunk-KHO2SBNA.cjs +0 -16
  247. package/dist/chunk-KXJ7X325.cjs +0 -308
  248. package/dist/chunk-L5RDAVVH.js +0 -14
  249. package/dist/chunk-LJHPTLWB.js +0 -109
  250. package/dist/chunk-M7ELWZXM.cjs +0 -1825
  251. package/dist/chunk-MSUW5VHZ.js +0 -1590
  252. package/dist/chunk-MUHRPRR7.cjs +0 -65
  253. package/dist/chunk-MV3TSQSH.cjs +0 -397
  254. package/dist/chunk-NLZLXWAU.cjs +0 -678
  255. package/dist/chunk-NVRZPF5M.cjs +0 -18
  256. package/dist/chunk-ONZFBJVW.js +0 -14
  257. package/dist/chunk-PGNL7JXO.cjs +0 -251
  258. package/dist/chunk-Q4GEQS7X.cjs +0 -564
  259. package/dist/chunk-QNKGP5DY.js +0 -14
  260. package/dist/chunk-QYI2VJLS.cjs +0 -211
  261. package/dist/chunk-RBWZII5I.js +0 -59
  262. package/dist/chunk-RMP7VMPB.cjs +0 -33
  263. package/dist/chunk-RZOGBYIS.js +0 -21
  264. package/dist/chunk-SU3UELUB.cjs +0 -36
  265. package/dist/chunk-SYHPSOUU.cjs +0 -1626
  266. package/dist/chunk-SZUNAEMR.js +0 -246
  267. package/dist/chunk-TER22LO4.cjs +0 -64
  268. package/dist/chunk-TJHGRQ4P.js +0 -33
  269. package/dist/chunk-U23I7JPB.cjs +0 -56
  270. package/dist/chunk-U7HHN47R.js +0 -552
  271. package/dist/chunk-UDA26MCU.cjs +0 -16
  272. package/dist/chunk-UIAWUZ4H.js +0 -31
  273. package/dist/chunk-ULQPCIA2.js +0 -16
  274. package/dist/chunk-VJDDGRIK.cjs +0 -16
  275. package/dist/chunk-WETQI6HM.js +0 -232
  276. package/dist/chunk-WLOQQFDS.cjs +0 -18
  277. package/dist/chunk-WVSPXFTY.js +0 -14
  278. package/dist/chunk-WXFTVXBF.cjs +0 -23
  279. package/dist/chunk-XPVTIGU2.cjs +0 -113
  280. package/dist/chunk-XX6RUGTM.cjs +0 -18
  281. package/dist/chunk-YWHHVDT4.js +0 -13
  282. package/dist/chunk-ZPDMWDGZ.cjs +0 -101
  283. package/dist/chunk-ZVWZEGQP.js +0 -28
  284. package/dist/index.d.ts +0 -24
  285. package/dist/isPlainObject-0p3VveWr.d.ts +0 -534
  286. package/dist/rzl-utils.global.js +0 -10
@@ -0,0 +1,226 @@
1
+ /*!
2
+ * ========================================================================
3
+ * @rzl-zone/utils-js
4
+ * ------------------------------------------------------------------------
5
+ * Version: `3.12.1-beta.0`
6
+ * Author: `Rizalvin Dwiky <rizalvindwiky@gmail.com>`
7
+ * Repository: `https://github.com/rzl-zone/rzl-zone/tree/main/packages/utils-js`
8
+ * ========================================================================
9
+ */
10
+
11
+ import { IsAny } from "@rzl-zone/ts-types-plus";
12
+ /** ---------------------------------------------------------
13
+ * * ***Extracts dynamic route parameters from a given route string.***
14
+ * ---------------------------------------------------------
15
+ * **This utility type recursively searches for dynamic segments within a route,
16
+ * extracting each parameter and constructing an object where each key represents
17
+ * a dynamic segment and its value is of type `string`.**
18
+ * - ***⚠️ Warning:***
19
+ * - ***This types only support when using ***[`NextJS`](https://nextjs.org/)***.***
20
+ * @template T - The route string containing potential dynamic segments.
21
+ * @example
22
+ * ```ts
23
+ * type Params1 = ExtractRouteParams<"/user/[id]">;
24
+ * // ➔ { id: string }
25
+ * type Params2 = ExtractRouteParams<"/post/[slug]/comment/[commentId]">;
26
+ * // ➔ { slug: string; commentId: string }
27
+ * type Params3 = ExtractRouteParams<"/dashboard">;
28
+ * // ➔ {} (no dynamic parameters)
29
+ * ```
30
+ */
31
+ type ExtractRouteParams<T> = T extends string ? HasDynamicSegments<T> extends true ? T extends `${infer _Start}[${infer Param}]${infer Rest}` ? { [K in Param | keyof ExtractRouteParams<Rest>]: string } : unknown : unknown : unknown;
32
+ /** ---------------------------------------------------------
33
+ * * ***Determines whether a given route contains dynamic segments.***
34
+ * ---------------------------------------------------------
35
+ * **This type checks if the route includes at least one `[param]` pattern.
36
+ * If it does, the result is `true`, otherwise `false`.**
37
+ * - ***⚠️ Warning:***
38
+ * - ***This types only support when using ***[`NextJS`](https://nextjs.org/)***.***
39
+ * @template T - The route string to be evaluated.
40
+ * @example
41
+ * ```ts
42
+ * type HasParams1 = HasDynamicSegments<"/user/[id]">;
43
+ * // ➔ true
44
+ * type HasParams2 = HasDynamicSegments<"/settings/profile">;
45
+ * // ➔ false
46
+ * type HasParams3 = HasDynamicSegments<"/blog/[category]/[slug]">;
47
+ * // ➔ true
48
+ * ```
49
+ */
50
+ type HasDynamicSegments<T> = T extends `${string}[${string}]${string}` ? true : false;
51
+ type GenerateRouteResult<T> = true extends IsAny<T> ? unknown : T extends string ? string : unknown;
52
+ /** ---------------------------------
53
+ * * ***Utility for NextJS: `generateRoute`.***
54
+ * ---------------------------------
55
+ * **Generates a URL by replacing dynamic route parameters with provided values.**
56
+ * - ***⚠️ Warning:***
57
+ * - ***This function only support when using ***[`NextJS`](https://nextjs.org/)***.***
58
+ * @template T - The route string containing dynamic segments in the format `[param]`.
59
+ * @param {T} route - The route string containing dynamic segments.
60
+ * @param {ExtractRouteParams<T>} [params] - An object containing key-value pairs that match the dynamic segments in the route.
61
+ * @returns {string} The formatted URL with all dynamic segments replaced.
62
+ * @throws **{@link Error | `Error`}** if the route contains dynamic segments but no parameters object is provided.
63
+ * @throws **{@link Error | `Error`}** if a required parameter is missing from the `params` object.
64
+ * @throws **{@link Error | `Error`}** if a parameter value is an empty string.
65
+ * @throws **{@link Error | `Error`}** if any parameter contains invalid characters like `?`, `&`, `=`, `#`, `/`, spaces, `'`, `"`, `(`, `)`, `+`, `;`, `%`, `@`, or `:`, which can cause URL issues.
66
+ * @example
67
+ * // Basic usage
68
+ * generateRoute("/user/[id]", { id: "123" });
69
+ * // ➔ "/user/123"
70
+ *
71
+ * // No dynamic segments, returns as-is
72
+ * generateRoute("/dashboard");
73
+ * // ➔ "/dashboard"
74
+ *
75
+ * // Throws an error due to missing parameters object
76
+ * generateRoute("/profile/[username]");
77
+ * // ➔ ❌ Error: ❌ Missing parameters object for route: "/profile/[username]"
78
+ *
79
+ * // Throws an error due to an empty parameter value
80
+ * generateRoute("/post/[category]/[slug]", { category: "tech", slug: "" });
81
+ * // ➔ ❌ Error: ❌ Parameter "slug" cannot be empty in route: "/post/[category]/[slug]"
82
+ *
83
+ * // Throws an error due to parameter containing invalid characters
84
+ * generateRoute("/search/[query]", { query: "how to?learn" });
85
+ * // ➔ ❌ Error: ❌ Parameter "query" contains invalid character "?" in route: "/search/[query]"
86
+ *
87
+ * // Handles leading/trailing slashes correctly
88
+ * generateRoute("/blog/[category]/[slug]", { category: "/news/", slug: "/latest-update/" });
89
+ * // ➔ ❌ Error: ❌ Parameter "category" and "slug" contains slashes "/" which is not allowed.
90
+ */
91
+ declare function generateRoute<T extends string>(route: T extends string ? HasDynamicSegments<T> extends true ? T : never : never, params: T extends string ? ExtractRouteParams<T> : undefined): GenerateRouteResult<T>;
92
+ declare function generateRoute<T extends string>(route: T extends string ? T : never, params?: Extract<ExtractRouteParams<T>, Record<string, unknown>>): GenerateRouteResult<T>;
93
+ declare function generateRoute<T = unknown>(route: T extends string ? HasDynamicSegments<T> extends true ? T : unknown : unknown, params?: T extends string ? ExtractRouteParams<T> : undefined): unknown;
94
+ type OptionsCreateBeApiUrl = {
95
+ /** * The prefix pathname api url, e.g:`"http://localhost.com/your-target-prefix-entri-point-api-is-here"`, default: `"/api"`.
96
+ *
97
+ * @default "/api" */
98
+ prefix?: string;
99
+ /** * Option to getting `prefix` and `pathname` of api url only `(removing origin base api url)`, default: `true`.
100
+ *
101
+ * @default true */
102
+ withOrigin?: boolean;
103
+ };
104
+ /** ---------------------------------
105
+ * * ***Utility for NextJS: `createBeApiUrl`.***
106
+ * ---------------------------------
107
+ * **Constructs a backend API URL by appending a given pathname to the base API URL.**
108
+ * - **ℹ️ Note:**
109
+ * - This function builds on top of `getBeApiUrl()`.
110
+ * - **Determines the base API URL from:**
111
+ * - `NEXT_PUBLIC_BACKEND_API_URL` environment variable (or defaults to `"http://localhost:8000"`).
112
+ * - Automatically appends `NEXT_PUBLIC_PORT_BE` if the base URL does not already include a port.
113
+ * - **Features of this function:**
114
+ * - Allows customizing the API path with an optional `prefix` (defaults to `"/api"`).
115
+ * - Can include or exclude the origin (protocol + host) via `withOrigin`.
116
+ * - Normalizes paths to avoid duplicate slashes.
117
+ * - ***⚠️ Warning:***
118
+ * - ***This function only support when using ***[`NextJS`](https://nextjs.org/)***.***
119
+ * @param {string|null|undefined} pathname - The API endpoint path (e.g., `/users` or `/v1/posts`), defaultValue: `""`.
120
+ * @param {OptionsCreateBeApiUrl} [options] - Configuration options.
121
+ * @param {OptionsCreateBeApiUrl["prefix"]} [options.prefix="/api"] - The prefix for the API path (default is `"/api"`).
122
+ * @param {OptionsCreateBeApiUrl["withOrigin"]} [options.withOrigin=true] - Whether to include the full base URL or return only the API path.
123
+ * @returns {string} The formatted API URL.
124
+ * @throws **{@link TypeError | `TypeError`}** if `withOrigin` is not a boolean.
125
+ * @throws **{@link TypeError | `TypeError`}** if `prefix` and `pathname` is not a string.
126
+ * @throws **{@link Error | `Error`}** if constructing the API URL fails due to an invalid base URL.
127
+ * @example
128
+ * createBeApiUrl("/users")
129
+ * // ➔ "http://localhost:8000/api/users"
130
+ * createBeApiUrl("/api/users")
131
+ * // ➔ "http://localhost:8000/api/users"
132
+ * createBeApiUrl("/v1", { prefix: "/v1" })
133
+ * // ➔ "http://localhost:8000/v1"
134
+ * createBeApiUrl("/v1/users")
135
+ * // ➔ "http://localhost:8000/api/v1/users"
136
+ * createBeApiUrl("/v1/users", { prefix: "/v1" })
137
+ * // ➔ "http://localhost:8000/v1/users"
138
+ * createBeApiUrl("/users", { withOrigin: false })
139
+ * // ➔ "/api/users"
140
+ * createBeApiUrl(null, { withOrigin: false })
141
+ * // ➔ "/api"
142
+ * createBeApiUrl(undefined, { withOrigin: false })
143
+ * // ➔ "/api"
144
+ */
145
+ declare const createBeApiUrl: (
146
+ /** * The pathname api url, e.g:`"http://localhost.com/your-target-prefix-entri-point-api-is-here/your-target-pathname-is-here"`.
147
+ *
148
+ * @default ""
149
+ */
150
+
151
+ pathname: string | null | undefined, options?: OptionsCreateBeApiUrl) => string;
152
+ type OptionsGetBeApiUrl = {
153
+ /** * ***The Suffix origin base api url, e.g:`http://localhost.com/api`, default: `"/"`.***
154
+ *
155
+ * @default "/" */
156
+ suffix?: string;
157
+ };
158
+ /** ---------------------------------------------------
159
+ * * ***Utility for NextJS: `getBeApiUrl`.***
160
+ * ---------------------------------------------------
161
+ * **This function determines the backend API base URL from the `NEXT_PUBLIC_BACKEND_API_URL` environment variable (retrieves the base API URL of the backend).**
162
+ * - **Behavior:**
163
+ * - If the variable is not set, it defaults to `"http://localhost:8000"`.
164
+ * - It also allows adding an optional suffix to the returned URL.
165
+ * - ***⚠️ Warning:***
166
+ * - ***This function only support when using ***[`NextJS`](https://nextjs.org/)***.***
167
+ * @description
168
+ * This function determines the backend API base URL from the `NEXT_PUBLIC_BACKEND_API_URL` environment variable.
169
+ * - If `NEXT_PUBLIC_BACKEND_API_URL` is not set, it defaults to `"http://localhost:8000"`.
170
+ * - If `NEXT_PUBLIC_BACKEND_API_URL` does **not** contain a port, it appends one from `NEXT_PUBLIC_PORT_BE` if available.
171
+ * - Supports appending optional suffix (like `"/api"`).
172
+ * @param {OptionsGetBeApiUrl|undefined} options - Configuration options.
173
+ * @param {OptionsGetBeApiUrl["suffix"]} [options.suffix="/"] - The suffix to append to the base API URL.
174
+ * @returns {string} The formatted backend API base URL.
175
+ * @throws **{@link TypeError | `TypeError`}** if `suffix` is not a `string`.
176
+ * @throws **{@link Error | `Error`}** if `NEXT_PUBLIC_BACKEND_API_URL` is invalid.
177
+ * @example
178
+ * // With NEXT_PUBLIC_BACKEND_API_URL set at `*.env` file
179
+ * NEXT_PUBLIC_BACKEND_API_URL = "https://api.example.com";
180
+ * getBeApiUrl();
181
+ * // ➔ "https://api.example.com/"
182
+ *
183
+ * // With NEXT_PUBLIC_BACKEND_API_URL but no port, using NEXT_PUBLIC_PORT_BE at `*.env` file
184
+ * NEXT_PUBLIC_BACKEND_API_URL = "http://localhost";
185
+ * NEXT_PUBLIC_PORT_BE = "5000";
186
+ * getBeApiUrl({ suffix: "/api" });
187
+ * // ➔ "http://localhost:5000/api"
188
+ *
189
+ * // Without NEXT_PUBLIC_BACKEND_API_URL at `*.env` file (defaults to localhost:8000)
190
+ * delete NEXT_PUBLIC_BACKEND_API_URL;
191
+ * getBeApiUrl({ suffix: "/v1" });
192
+ * // ➔ "http://localhost:8000/v1"
193
+ */
194
+ declare const getBeApiUrl: (options?: OptionsGetBeApiUrl) => string;
195
+ /** ---------------------------------------------------
196
+ * * ***Utility for NextJS: `getBaseUrl`.***
197
+ * ---------------------------------------------------
198
+ * **Retrieves the base URL of the application.**
199
+ * - **Behavior:**
200
+ * - It determines the base URL from the `NEXT_PUBLIC_BASE_URL` environment variable.
201
+ * - If `NEXT_PUBLIC_BASE_URL` is not set, it defaults to `"http://localhost:3000"`.
202
+ * - If `NEXT_PUBLIC_BASE_URL` does **not** contain a port, it appends one from `NEXT_PUBLIC_PORT_FE` if available.
203
+ * - Ensures the final URL is valid and normalized (no trailing slashes).
204
+ * - ***⚠️ Warning:***
205
+ * - ***This function only support when using ***[`NextJS`](https://nextjs.org/)***.***
206
+ * @returns {string} The resolved base URL of the application.
207
+ * @throws **{@link Error | `Error`}** if the constructed URL is invalid or malformed.
208
+ * @example
209
+ * // With environment variable set at `*.env` file
210
+ * NEXT_PUBLIC_BASE_URL = "https://example.com";
211
+ * getBaseUrl();
212
+ * // ➔ "https://example.com"
213
+ *
214
+ * // With custom port via NEXT_PUBLIC_PORT_FE at `*.env` file
215
+ * NEXT_PUBLIC_BASE_URL = "http://localhost";
216
+ * NEXT_PUBLIC_PORT_FE = "4000";
217
+ * getBaseUrl();
218
+ * // ➔ "http://localhost:4000"
219
+ *
220
+ * // Without environment variable at `*.env` file
221
+ * delete NEXT_PUBLIC_BASE_URL;
222
+ * getBaseUrl();
223
+ * // ➔ "http://localhost:3000"
224
+ */
225
+ declare const getBaseUrl: () => string;
226
+ export { ExtractRouteParams, HasDynamicSegments, createBeApiUrl, generateRoute, getBaseUrl, getBeApiUrl };
@@ -1,14 +1,14 @@
1
1
  /*!
2
- * ====================================================
3
- * Rzl Utils-JS.
4
- * ----------------------------------------------------
5
- * Version: 3.11.1.
6
- * Author: Rizalvin Dwiky.
7
- * Repository: https://github.com/rzl-zone/utils-js.
8
- * ====================================================
9
- */
10
- import { IsAny } from '@rzl-zone/ts-types-plus';
2
+ * ========================================================================
3
+ * @rzl-zone/utils-js
4
+ * ------------------------------------------------------------------------
5
+ * Version: `3.12.1-beta.0`
6
+ * Author: `Rizalvin Dwiky <rizalvindwiky@gmail.com>`
7
+ * Repository: `https://github.com/rzl-zone/rzl-zone/tree/main/packages/utils-js`
8
+ * ========================================================================
9
+ */
11
10
 
11
+ import { IsAny } from "@rzl-zone/ts-types-plus";
12
12
  /** ---------------------------------------------------------
13
13
  * * ***Extracts dynamic route parameters from a given route string.***
14
14
  * ---------------------------------------------------------
@@ -28,9 +28,7 @@ import { IsAny } from '@rzl-zone/ts-types-plus';
28
28
  * // ➔ {} (no dynamic parameters)
29
29
  * ```
30
30
  */
31
- type ExtractRouteParams<T> = T extends string ? HasDynamicSegments<T> extends true ? T extends `${infer _Start}[${infer Param}]${infer Rest}` ? {
32
- [K in Param | keyof ExtractRouteParams<Rest>]: string;
33
- } : unknown : unknown : unknown;
31
+ type ExtractRouteParams<T> = T extends string ? HasDynamicSegments<T> extends true ? T extends `${infer _Start}[${infer Param}]${infer Rest}` ? { [K in Param | keyof ExtractRouteParams<Rest>]: string } : unknown : unknown : unknown;
34
32
  /** ---------------------------------------------------------
35
33
  * * ***Determines whether a given route contains dynamic segments.***
36
34
  * ---------------------------------------------------------
@@ -90,19 +88,18 @@ type GenerateRouteResult<T> = true extends IsAny<T> ? unknown : T extends string
90
88
  * generateRoute("/blog/[category]/[slug]", { category: "/news/", slug: "/latest-update/" });
91
89
  * // ➔ ❌ Error: ❌ Parameter "category" and "slug" contains slashes "/" which is not allowed.
92
90
  */
93
- declare function generateRoute<T extends string>(route: T extends string ? (HasDynamicSegments<T> extends true ? T : never) : never, params: T extends string ? ExtractRouteParams<T> : undefined): GenerateRouteResult<T>;
91
+ declare function generateRoute<T extends string>(route: T extends string ? HasDynamicSegments<T> extends true ? T : never : never, params: T extends string ? ExtractRouteParams<T> : undefined): GenerateRouteResult<T>;
94
92
  declare function generateRoute<T extends string>(route: T extends string ? T : never, params?: Extract<ExtractRouteParams<T>, Record<string, unknown>>): GenerateRouteResult<T>;
95
- declare function generateRoute<T = unknown>(route: T extends string ? (HasDynamicSegments<T> extends true ? T : unknown) : unknown, params?: T extends string ? ExtractRouteParams<T> : undefined): unknown;
96
-
93
+ declare function generateRoute<T = unknown>(route: T extends string ? HasDynamicSegments<T> extends true ? T : unknown : unknown, params?: T extends string ? ExtractRouteParams<T> : undefined): unknown;
97
94
  type OptionsCreateBeApiUrl = {
98
- /** * The prefix pathname api url, e.g:`"http://localhost.com/your-target-prefix-entri-point-api-is-here"`, default: `"/api"`.
99
- *
100
- * @default "/api" */
101
- prefix?: string;
102
- /** * Option to getting `prefix` and `pathname` of api url only `(removing origin base api url)`, default: `true`.
103
- *
104
- * @default true */
105
- withOrigin?: boolean;
95
+ /** * The prefix pathname api url, e.g:`"http://localhost.com/your-target-prefix-entri-point-api-is-here"`, default: `"/api"`.
96
+ *
97
+ * @default "/api" */
98
+ prefix?: string;
99
+ /** * Option to getting `prefix` and `pathname` of api url only `(removing origin base api url)`, default: `true`.
100
+ *
101
+ * @default true */
102
+ withOrigin?: boolean;
106
103
  };
107
104
  /** ---------------------------------
108
105
  * * ***Utility for NextJS: `createBeApiUrl`.***
@@ -150,13 +147,13 @@ declare const createBeApiUrl: (
150
147
  *
151
148
  * @default ""
152
149
  */
153
- pathname: string | null | undefined, options?: OptionsCreateBeApiUrl) => string;
154
150
 
151
+ pathname: string | null | undefined, options?: OptionsCreateBeApiUrl) => string;
155
152
  type OptionsGetBeApiUrl = {
156
- /** * ***The Suffix origin base api url, e.g:`http://localhost.com/api`, default: `"/"`.***
157
- *
158
- * @default "/" */
159
- suffix?: string;
153
+ /** * ***The Suffix origin base api url, e.g:`http://localhost.com/api`, default: `"/"`.***
154
+ *
155
+ * @default "/" */
156
+ suffix?: string;
160
157
  };
161
158
  /** ---------------------------------------------------
162
159
  * * ***Utility for NextJS: `getBeApiUrl`.***
@@ -195,7 +192,6 @@ type OptionsGetBeApiUrl = {
195
192
  * // ➔ "http://localhost:8000/v1"
196
193
  */
197
194
  declare const getBeApiUrl: (options?: OptionsGetBeApiUrl) => string;
198
-
199
195
  /** ---------------------------------------------------
200
196
  * * ***Utility for NextJS: `getBaseUrl`.***
201
197
  * ---------------------------------------------------
@@ -227,5 +223,4 @@ declare const getBeApiUrl: (options?: OptionsGetBeApiUrl) => string;
227
223
  * // ➔ "http://localhost:3000"
228
224
  */
229
225
  declare const getBaseUrl: () => string;
230
-
231
- export { type ExtractRouteParams, type HasDynamicSegments, createBeApiUrl, generateRoute, getBaseUrl, getBeApiUrl };
226
+ export { ExtractRouteParams, HasDynamicSegments, createBeApiUrl, generateRoute, getBaseUrl, getBeApiUrl };