@herowcode/utils 1.3.5 → 1.4.8

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 (456) hide show
  1. package/dist/api/index.cjs +12 -0
  2. package/dist/api/index.cjs.map +1 -0
  3. package/dist/api/{client.d.ts → index.d.mts} +19 -8
  4. package/dist/api/index.d.ts +36 -3
  5. package/dist/api/index.js +3 -0
  6. package/dist/api/index.js.map +1 -0
  7. package/dist/array/index.cjs +16 -0
  8. package/dist/array/index.cjs.map +1 -0
  9. package/dist/array/index.d.mts +5 -0
  10. package/dist/array/index.d.ts +5 -3
  11. package/dist/array/index.js +3 -0
  12. package/dist/array/index.js.map +1 -0
  13. package/dist/chunk-2MANLCNG.cjs +23 -0
  14. package/dist/chunk-2MANLCNG.cjs.map +1 -0
  15. package/dist/chunk-2RTW37WD.js +20 -0
  16. package/dist/chunk-2RTW37WD.js.map +1 -0
  17. package/dist/chunk-2Y6M7IOG.js +250 -0
  18. package/dist/chunk-2Y6M7IOG.js.map +1 -0
  19. package/dist/chunk-3JUB2OJL.js +3 -0
  20. package/dist/chunk-3JUB2OJL.js.map +1 -0
  21. package/dist/chunk-53JMVGIG.js +187 -0
  22. package/dist/chunk-53JMVGIG.js.map +1 -0
  23. package/dist/chunk-56NHIM5J.js +151 -0
  24. package/dist/chunk-56NHIM5J.js.map +1 -0
  25. package/dist/chunk-5OLQJUNS.js +66 -0
  26. package/dist/chunk-5OLQJUNS.js.map +1 -0
  27. package/dist/chunk-5YOEKMTJ.cjs +321 -0
  28. package/dist/chunk-5YOEKMTJ.cjs.map +1 -0
  29. package/dist/chunk-6TWPZ6LL.cjs +4 -0
  30. package/dist/chunk-6TWPZ6LL.cjs.map +1 -0
  31. package/dist/chunk-AQZBHMTO.js +96 -0
  32. package/dist/chunk-AQZBHMTO.js.map +1 -0
  33. package/dist/chunk-ATWN4SRX.js +29 -0
  34. package/dist/chunk-ATWN4SRX.js.map +1 -0
  35. package/dist/chunk-GRSF4RY2.cjs +20 -0
  36. package/dist/chunk-GRSF4RY2.cjs.map +1 -0
  37. package/dist/chunk-GX5E5B4L.cjs +70 -0
  38. package/dist/chunk-GX5E5B4L.cjs.map +1 -0
  39. package/dist/chunk-HK727IAV.cjs +201 -0
  40. package/dist/chunk-HK727IAV.cjs.map +1 -0
  41. package/dist/chunk-LJ6KOZD4.cjs +154 -0
  42. package/dist/chunk-LJ6KOZD4.cjs.map +1 -0
  43. package/dist/chunk-N2DRAZ3A.cjs +29 -0
  44. package/dist/chunk-N2DRAZ3A.cjs.map +1 -0
  45. package/dist/chunk-O7SH3E3T.js +18 -0
  46. package/dist/chunk-O7SH3E3T.js.map +1 -0
  47. package/dist/chunk-P5YNRND6.cjs +4 -0
  48. package/dist/chunk-P5YNRND6.cjs.map +1 -0
  49. package/dist/chunk-QAE6Q2SA.js +317 -0
  50. package/dist/chunk-QAE6Q2SA.js.map +1 -0
  51. package/dist/chunk-QRXVUXGJ.js +378 -0
  52. package/dist/chunk-QRXVUXGJ.js.map +1 -0
  53. package/dist/chunk-SLYUARZG.cjs +99 -0
  54. package/dist/chunk-SLYUARZG.cjs.map +1 -0
  55. package/dist/chunk-SWRIT7EE.js +3 -0
  56. package/dist/chunk-SWRIT7EE.js.map +1 -0
  57. package/dist/chunk-UXEUYHBD.cjs +401 -0
  58. package/dist/chunk-UXEUYHBD.cjs.map +1 -0
  59. package/dist/chunk-V6OKXUBQ.js +22 -0
  60. package/dist/chunk-V6OKXUBQ.js.map +1 -0
  61. package/dist/chunk-VAZJXZU5.cjs +31 -0
  62. package/dist/chunk-VAZJXZU5.cjs.map +1 -0
  63. package/dist/chunk-WGSFRFRO.cjs +252 -0
  64. package/dist/chunk-WGSFRFRO.cjs.map +1 -0
  65. package/dist/date/index.cjs +56 -0
  66. package/dist/date/index.cjs.map +1 -0
  67. package/dist/date/index.d.mts +63 -0
  68. package/dist/date/index.d.ts +63 -8
  69. package/dist/date/index.js +3 -0
  70. package/dist/date/index.js.map +1 -0
  71. package/dist/extract-youtube-video-id-HSYMYXIZ.js +3 -0
  72. package/dist/extract-youtube-video-id-HSYMYXIZ.js.map +1 -0
  73. package/dist/extract-youtube-video-id-XVGNPUDX.cjs +12 -0
  74. package/dist/extract-youtube-video-id-XVGNPUDX.cjs.map +1 -0
  75. package/dist/files/index.browser.cjs +21 -0
  76. package/dist/files/index.browser.cjs.map +1 -0
  77. package/dist/files/index.browser.d.mts +14 -0
  78. package/dist/files/index.browser.d.ts +14 -0
  79. package/dist/files/index.browser.js +4 -0
  80. package/dist/files/index.browser.js.map +1 -0
  81. package/dist/files/index.cjs +31 -0
  82. package/dist/files/index.cjs.map +1 -0
  83. package/dist/files/index.d.mts +3 -0
  84. package/dist/files/index.d.ts +3 -6
  85. package/dist/files/index.js +6 -0
  86. package/dist/files/index.js.map +1 -0
  87. package/dist/files/index.node.cjs +21 -0
  88. package/dist/files/index.node.cjs.map +1 -0
  89. package/dist/files/index.node.d.mts +7 -0
  90. package/dist/files/index.node.d.ts +7 -0
  91. package/dist/files/index.node.js +4 -0
  92. package/dist/files/index.node.js.map +1 -0
  93. package/dist/format-bytes-BGjeDnvM.d.mts +3 -0
  94. package/dist/format-bytes-BGjeDnvM.d.ts +3 -0
  95. package/dist/function/index.cjs +20 -0
  96. package/dist/function/index.cjs.map +1 -0
  97. package/dist/function/index.d.mts +22 -0
  98. package/dist/function/index.d.ts +22 -4
  99. package/dist/function/index.js +3 -0
  100. package/dist/function/index.js.map +1 -0
  101. package/dist/index.cjs +188 -0
  102. package/dist/index.cjs.map +1 -0
  103. package/dist/index.d.mts +12 -0
  104. package/dist/index.d.ts +12 -8
  105. package/dist/index.js +15 -0
  106. package/dist/index.js.map +1 -0
  107. package/dist/string/index.cjs +60 -0
  108. package/dist/string/index.cjs.map +1 -0
  109. package/dist/string/index.d.mts +28 -0
  110. package/dist/string/index.d.ts +28 -14
  111. package/dist/string/index.js +3 -0
  112. package/dist/string/index.js.map +1 -0
  113. package/dist/{cjs/function/try-catch.d.ts → try-catch-B7WzqcPU.d.mts} +4 -4
  114. package/dist/{function/try-catch.d.ts → try-catch-B7WzqcPU.d.ts} +4 -4
  115. package/dist/youtube/index.browser.cjs +35 -0
  116. package/dist/youtube/index.browser.cjs.map +1 -0
  117. package/dist/youtube/index.browser.d.mts +2 -0
  118. package/dist/youtube/index.browser.d.ts +2 -0
  119. package/dist/youtube/index.browser.js +6 -0
  120. package/dist/youtube/index.browser.js.map +1 -0
  121. package/dist/youtube/index.cjs +36 -0
  122. package/dist/youtube/index.cjs.map +1 -0
  123. package/dist/youtube/index.d.mts +12 -0
  124. package/dist/youtube/index.d.ts +12 -7
  125. package/dist/youtube/index.js +7 -0
  126. package/dist/youtube/index.js.map +1 -0
  127. package/dist/youtube/index.node.cjs +26 -0
  128. package/dist/youtube/index.node.cjs.map +1 -0
  129. package/dist/youtube/index.node.d.mts +49 -0
  130. package/dist/youtube/index.node.d.ts +49 -0
  131. package/dist/youtube/index.node.js +5 -0
  132. package/dist/youtube/index.node.js.map +1 -0
  133. package/package.json +134 -47
  134. package/dist/api/client.d.ts.map +0 -1
  135. package/dist/api/index.d.ts.map +0 -1
  136. package/dist/api/wrapper.d.ts +0 -27
  137. package/dist/api/wrapper.d.ts.map +0 -1
  138. package/dist/array/index.d.ts.map +0 -1
  139. package/dist/array/shuffle.d.ts +0 -2
  140. package/dist/array/shuffle.d.ts.map +0 -1
  141. package/dist/array/unique.d.ts +0 -2
  142. package/dist/array/unique.d.ts.map +0 -1
  143. package/dist/cjs/api/client.d.ts +0 -25
  144. package/dist/cjs/api/client.d.ts.map +0 -1
  145. package/dist/cjs/api/client.js +0 -148
  146. package/dist/cjs/api/client.js.map +0 -1
  147. package/dist/cjs/api/index.d.ts +0 -3
  148. package/dist/cjs/api/index.d.ts.map +0 -1
  149. package/dist/cjs/api/index.js +0 -6
  150. package/dist/cjs/api/index.js.map +0 -1
  151. package/dist/cjs/api/wrapper.d.ts +0 -27
  152. package/dist/cjs/api/wrapper.d.ts.map +0 -1
  153. package/dist/cjs/api/wrapper.js +0 -152
  154. package/dist/cjs/api/wrapper.js.map +0 -1
  155. package/dist/cjs/array/index.d.ts +0 -3
  156. package/dist/cjs/array/index.d.ts.map +0 -1
  157. package/dist/cjs/array/index.js +0 -19
  158. package/dist/cjs/array/index.js.map +0 -1
  159. package/dist/cjs/array/shuffle.d.ts +0 -2
  160. package/dist/cjs/array/shuffle.d.ts.map +0 -1
  161. package/dist/cjs/array/shuffle.js +0 -16
  162. package/dist/cjs/array/shuffle.js.map +0 -1
  163. package/dist/cjs/array/unique.d.ts +0 -2
  164. package/dist/cjs/array/unique.d.ts.map +0 -1
  165. package/dist/cjs/array/unique.js +0 -7
  166. package/dist/cjs/array/unique.js.map +0 -1
  167. package/dist/cjs/array.js +0 -1
  168. package/dist/cjs/date/dayjs.d.ts +0 -20
  169. package/dist/cjs/date/dayjs.d.ts.map +0 -1
  170. package/dist/cjs/date/dayjs.js +0 -123
  171. package/dist/cjs/date/dayjs.js.map +0 -1
  172. package/dist/cjs/date/fix-timezone-offset.d.ts +0 -3
  173. package/dist/cjs/date/fix-timezone-offset.d.ts.map +0 -1
  174. package/dist/cjs/date/fix-timezone-offset.js +0 -9
  175. package/dist/cjs/date/fix-timezone-offset.js.map +0 -1
  176. package/dist/cjs/date/format-date.d.ts +0 -23
  177. package/dist/cjs/date/format-date.d.ts.map +0 -1
  178. package/dist/cjs/date/format-date.js +0 -71
  179. package/dist/cjs/date/format-date.js.map +0 -1
  180. package/dist/cjs/date/get-current-date-in-utc.d.ts +0 -3
  181. package/dist/cjs/date/get-current-date-in-utc.d.ts.map +0 -1
  182. package/dist/cjs/date/get-current-date-in-utc.js +0 -8
  183. package/dist/cjs/date/get-current-date-in-utc.js.map +0 -1
  184. package/dist/cjs/date/get-date-in-utc.d.ts +0 -3
  185. package/dist/cjs/date/get-date-in-utc.d.ts.map +0 -1
  186. package/dist/cjs/date/get-date-in-utc.js +0 -8
  187. package/dist/cjs/date/get-date-in-utc.js.map +0 -1
  188. package/dist/cjs/date/get-relative-time.d.ts +0 -3
  189. package/dist/cjs/date/get-relative-time.d.ts.map +0 -1
  190. package/dist/cjs/date/get-relative-time.js +0 -8
  191. package/dist/cjs/date/get-relative-time.js.map +0 -1
  192. package/dist/cjs/date/index.d.ts +0 -8
  193. package/dist/cjs/date/index.d.ts.map +0 -1
  194. package/dist/cjs/date/index.js +0 -24
  195. package/dist/cjs/date/index.js.map +0 -1
  196. package/dist/cjs/date/parse-time-spent.d.ts +0 -15
  197. package/dist/cjs/date/parse-time-spent.d.ts.map +0 -1
  198. package/dist/cjs/date/parse-time-spent.js +0 -207
  199. package/dist/cjs/date/parse-time-spent.js.map +0 -1
  200. package/dist/cjs/date.js +0 -1
  201. package/dist/cjs/files/compress-image.d.ts +0 -10
  202. package/dist/cjs/files/compress-image.d.ts.map +0 -1
  203. package/dist/cjs/files/compress-image.js +0 -61
  204. package/dist/cjs/files/compress-image.js.map +0 -1
  205. package/dist/cjs/files/download-url.d.ts +0 -2
  206. package/dist/cjs/files/download-url.d.ts.map +0 -1
  207. package/dist/cjs/files/download-url.js +0 -29
  208. package/dist/cjs/files/download-url.js.map +0 -1
  209. package/dist/cjs/files/file-delete.d.ts +0 -2
  210. package/dist/cjs/files/file-delete.d.ts.map +0 -1
  211. package/dist/cjs/files/file-delete.js +0 -20
  212. package/dist/cjs/files/file-delete.js.map +0 -1
  213. package/dist/cjs/files/file-exists.d.ts +0 -2
  214. package/dist/cjs/files/file-exists.d.ts.map +0 -1
  215. package/dist/cjs/files/file-exists.js +0 -18
  216. package/dist/cjs/files/file-exists.js.map +0 -1
  217. package/dist/cjs/files/format-bytes.d.ts +0 -2
  218. package/dist/cjs/files/format-bytes.d.ts.map +0 -1
  219. package/dist/cjs/files/format-bytes.js +0 -17
  220. package/dist/cjs/files/format-bytes.js.map +0 -1
  221. package/dist/cjs/files/index.d.ts +0 -6
  222. package/dist/cjs/files/index.d.ts.map +0 -1
  223. package/dist/cjs/files/index.js +0 -22
  224. package/dist/cjs/files/index.js.map +0 -1
  225. package/dist/cjs/files.js +0 -1
  226. package/dist/cjs/function/debounce.d.ts +0 -11
  227. package/dist/cjs/function/debounce.d.ts.map +0 -1
  228. package/dist/cjs/function/debounce.js +0 -26
  229. package/dist/cjs/function/debounce.js.map +0 -1
  230. package/dist/cjs/function/index.d.ts +0 -4
  231. package/dist/cjs/function/index.d.ts.map +0 -1
  232. package/dist/cjs/function/index.js +0 -20
  233. package/dist/cjs/function/index.js.map +0 -1
  234. package/dist/cjs/function/throttle.d.ts +0 -10
  235. package/dist/cjs/function/throttle.d.ts.map +0 -1
  236. package/dist/cjs/function/throttle.js +0 -36
  237. package/dist/cjs/function/throttle.js.map +0 -1
  238. package/dist/cjs/function/try-catch.d.ts.map +0 -1
  239. package/dist/cjs/function/try-catch.js +0 -39
  240. package/dist/cjs/function/try-catch.js.map +0 -1
  241. package/dist/cjs/function.js +0 -1
  242. package/dist/cjs/index.d.ts +0 -8
  243. package/dist/cjs/index.d.ts.map +0 -1
  244. package/dist/cjs/index.js +0 -24
  245. package/dist/cjs/index.js.map +0 -1
  246. package/dist/cjs/string/camel-case.d.ts +0 -2
  247. package/dist/cjs/string/camel-case.d.ts.map +0 -1
  248. package/dist/cjs/string/camel-case.js +0 -25
  249. package/dist/cjs/string/camel-case.js.map +0 -1
  250. package/dist/cjs/string/capitalize.d.ts +0 -2
  251. package/dist/cjs/string/capitalize.d.ts.map +0 -1
  252. package/dist/cjs/string/capitalize.js +0 -13
  253. package/dist/cjs/string/capitalize.js.map +0 -1
  254. package/dist/cjs/string/format-hms-to-seconds.d.ts +0 -2
  255. package/dist/cjs/string/format-hms-to-seconds.d.ts.map +0 -1
  256. package/dist/cjs/string/format-hms-to-seconds.js +0 -30
  257. package/dist/cjs/string/format-hms-to-seconds.js.map +0 -1
  258. package/dist/cjs/string/format-seconds-to-fragment.d.ts +0 -3
  259. package/dist/cjs/string/format-seconds-to-fragment.d.ts.map +0 -1
  260. package/dist/cjs/string/format-seconds-to-fragment.js +0 -20
  261. package/dist/cjs/string/format-seconds-to-fragment.js.map +0 -1
  262. package/dist/cjs/string/format-seconds-to-hms.d.ts +0 -2
  263. package/dist/cjs/string/format-seconds-to-hms.d.ts.map +0 -1
  264. package/dist/cjs/string/format-seconds-to-hms.js +0 -17
  265. package/dist/cjs/string/format-seconds-to-hms.js.map +0 -1
  266. package/dist/cjs/string/format-string-to-time.d.ts +0 -2
  267. package/dist/cjs/string/format-string-to-time.d.ts.map +0 -1
  268. package/dist/cjs/string/format-string-to-time.js +0 -15
  269. package/dist/cjs/string/format-string-to-time.js.map +0 -1
  270. package/dist/cjs/string/index.d.ts +0 -14
  271. package/dist/cjs/string/index.d.ts.map +0 -1
  272. package/dist/cjs/string/index.js +0 -30
  273. package/dist/cjs/string/index.js.map +0 -1
  274. package/dist/cjs/string/kebab-case.d.ts +0 -2
  275. package/dist/cjs/string/kebab-case.d.ts.map +0 -1
  276. package/dist/cjs/string/kebab-case.js +0 -15
  277. package/dist/cjs/string/kebab-case.js.map +0 -1
  278. package/dist/cjs/string/markdown-to-text.d.ts +0 -2
  279. package/dist/cjs/string/markdown-to-text.d.ts.map +0 -1
  280. package/dist/cjs/string/markdown-to-text.js +0 -70
  281. package/dist/cjs/string/markdown-to-text.js.map +0 -1
  282. package/dist/cjs/string/remove-html-tags.d.ts +0 -2
  283. package/dist/cjs/string/remove-html-tags.d.ts.map +0 -1
  284. package/dist/cjs/string/remove-html-tags.js +0 -18
  285. package/dist/cjs/string/remove-html-tags.js.map +0 -1
  286. package/dist/cjs/string/slugify.d.ts +0 -2
  287. package/dist/cjs/string/slugify.d.ts.map +0 -1
  288. package/dist/cjs/string/slugify.js +0 -13
  289. package/dist/cjs/string/slugify.js.map +0 -1
  290. package/dist/cjs/string/snake-case.d.ts +0 -2
  291. package/dist/cjs/string/snake-case.d.ts.map +0 -1
  292. package/dist/cjs/string/snake-case.js +0 -15
  293. package/dist/cjs/string/snake-case.js.map +0 -1
  294. package/dist/cjs/string/to-sentence-case.d.ts +0 -2
  295. package/dist/cjs/string/to-sentence-case.d.ts.map +0 -1
  296. package/dist/cjs/string/to-sentence-case.js +0 -13
  297. package/dist/cjs/string/to-sentence-case.js.map +0 -1
  298. package/dist/cjs/string/truncate.d.ts +0 -2
  299. package/dist/cjs/string/truncate.d.ts.map +0 -1
  300. package/dist/cjs/string/truncate.js +0 -19
  301. package/dist/cjs/string/truncate.js.map +0 -1
  302. package/dist/cjs/string.js +0 -1
  303. package/dist/cjs/youtube/extract-youtube-video-id.d.ts +0 -2
  304. package/dist/cjs/youtube/extract-youtube-video-id.d.ts.map +0 -1
  305. package/dist/cjs/youtube/extract-youtube-video-id.js +0 -30
  306. package/dist/cjs/youtube/extract-youtube-video-id.js.map +0 -1
  307. package/dist/cjs/youtube/generate-youtube-url.d.ts +0 -20
  308. package/dist/cjs/youtube/generate-youtube-url.d.ts.map +0 -1
  309. package/dist/cjs/youtube/generate-youtube-url.js +0 -86
  310. package/dist/cjs/youtube/generate-youtube-url.js.map +0 -1
  311. package/dist/cjs/youtube/get-video-duration.d.ts +0 -7
  312. package/dist/cjs/youtube/get-video-duration.d.ts.map +0 -1
  313. package/dist/cjs/youtube/get-video-duration.js +0 -150
  314. package/dist/cjs/youtube/get-video-duration.js.map +0 -1
  315. package/dist/cjs/youtube/get-youtube-thumbnail.d.ts +0 -2
  316. package/dist/cjs/youtube/get-youtube-thumbnail.d.ts.map +0 -1
  317. package/dist/cjs/youtube/get-youtube-thumbnail.js +0 -68
  318. package/dist/cjs/youtube/get-youtube-thumbnail.js.map +0 -1
  319. package/dist/cjs/youtube/get-youtube-video-info.d.ts +0 -26
  320. package/dist/cjs/youtube/get-youtube-video-info.d.ts.map +0 -1
  321. package/dist/cjs/youtube/get-youtube-video-info.js +0 -244
  322. package/dist/cjs/youtube/get-youtube-video-info.js.map +0 -1
  323. package/dist/cjs/youtube/index.d.ts +0 -7
  324. package/dist/cjs/youtube/index.d.ts.map +0 -1
  325. package/dist/cjs/youtube/index.js +0 -23
  326. package/dist/cjs/youtube/index.js.map +0 -1
  327. package/dist/cjs/youtube/validate-youtube-link.d.ts +0 -2
  328. package/dist/cjs/youtube/validate-youtube-link.d.ts.map +0 -1
  329. package/dist/cjs/youtube/validate-youtube-link.js +0 -77
  330. package/dist/cjs/youtube/validate-youtube-link.js.map +0 -1
  331. package/dist/cjs/youtube.js +0 -1
  332. package/dist/date/dayjs.d.ts +0 -20
  333. package/dist/date/dayjs.d.ts.map +0 -1
  334. package/dist/date/fix-timezone-offset.d.ts +0 -3
  335. package/dist/date/fix-timezone-offset.d.ts.map +0 -1
  336. package/dist/date/format-date.d.ts +0 -23
  337. package/dist/date/format-date.d.ts.map +0 -1
  338. package/dist/date/get-current-date-in-utc.d.ts +0 -3
  339. package/dist/date/get-current-date-in-utc.d.ts.map +0 -1
  340. package/dist/date/get-date-in-utc.d.ts +0 -3
  341. package/dist/date/get-date-in-utc.d.ts.map +0 -1
  342. package/dist/date/get-relative-time.d.ts +0 -3
  343. package/dist/date/get-relative-time.d.ts.map +0 -1
  344. package/dist/date/index.d.ts.map +0 -1
  345. package/dist/date/parse-time-spent.d.ts +0 -15
  346. package/dist/date/parse-time-spent.d.ts.map +0 -1
  347. package/dist/esm/api/client.js +0 -143
  348. package/dist/esm/api/index.js +0 -1
  349. package/dist/esm/api/wrapper.js +0 -148
  350. package/dist/esm/array/index.js +0 -2
  351. package/dist/esm/array/shuffle.js +0 -12
  352. package/dist/esm/array/unique.js +0 -3
  353. package/dist/esm/array.js +0 -1
  354. package/dist/esm/date/dayjs.js +0 -111
  355. package/dist/esm/date/fix-timezone-offset.js +0 -5
  356. package/dist/esm/date/format-date.js +0 -67
  357. package/dist/esm/date/get-current-date-in-utc.js +0 -4
  358. package/dist/esm/date/get-date-in-utc.js +0 -4
  359. package/dist/esm/date/get-relative-time.js +0 -4
  360. package/dist/esm/date/index.js +0 -7
  361. package/dist/esm/date/parse-time-spent.js +0 -203
  362. package/dist/esm/date.js +0 -1
  363. package/dist/esm/files/compress-image.js +0 -57
  364. package/dist/esm/files/download-url.js +0 -24
  365. package/dist/esm/files/file-delete.js +0 -12
  366. package/dist/esm/files/file-exists.js +0 -10
  367. package/dist/esm/files/format-bytes.js +0 -13
  368. package/dist/esm/files/index.js +0 -5
  369. package/dist/esm/files.js +0 -1
  370. package/dist/esm/function/debounce.js +0 -22
  371. package/dist/esm/function/index.js +0 -3
  372. package/dist/esm/function/throttle.js +0 -32
  373. package/dist/esm/function/try-catch.js +0 -35
  374. package/dist/esm/function.js +0 -1
  375. package/dist/esm/index.js +0 -7
  376. package/dist/esm/string/camel-case.js +0 -21
  377. package/dist/esm/string/capitalize.js +0 -9
  378. package/dist/esm/string/format-hms-to-seconds.js +0 -25
  379. package/dist/esm/string/format-seconds-to-fragment.js +0 -15
  380. package/dist/esm/string/format-seconds-to-hms.js +0 -13
  381. package/dist/esm/string/format-string-to-time.js +0 -10
  382. package/dist/esm/string/index.js +0 -13
  383. package/dist/esm/string/kebab-case.js +0 -11
  384. package/dist/esm/string/markdown-to-text.js +0 -66
  385. package/dist/esm/string/remove-html-tags.js +0 -14
  386. package/dist/esm/string/slugify.js +0 -9
  387. package/dist/esm/string/snake-case.js +0 -11
  388. package/dist/esm/string/to-sentence-case.js +0 -9
  389. package/dist/esm/string/truncate.js +0 -15
  390. package/dist/esm/string.js +0 -1
  391. package/dist/esm/youtube/extract-youtube-video-id.js +0 -26
  392. package/dist/esm/youtube/generate-youtube-url.js +0 -81
  393. package/dist/esm/youtube/get-video-duration.js +0 -146
  394. package/dist/esm/youtube/get-youtube-thumbnail.js +0 -31
  395. package/dist/esm/youtube/get-youtube-video-info.js +0 -207
  396. package/dist/esm/youtube/index.js +0 -6
  397. package/dist/esm/youtube/validate-youtube-link.js +0 -40
  398. package/dist/esm/youtube.js +0 -1
  399. package/dist/files/compress-image.d.ts +0 -10
  400. package/dist/files/compress-image.d.ts.map +0 -1
  401. package/dist/files/download-url.d.ts +0 -2
  402. package/dist/files/download-url.d.ts.map +0 -1
  403. package/dist/files/file-delete.d.ts +0 -2
  404. package/dist/files/file-delete.d.ts.map +0 -1
  405. package/dist/files/file-exists.d.ts +0 -2
  406. package/dist/files/file-exists.d.ts.map +0 -1
  407. package/dist/files/format-bytes.d.ts +0 -2
  408. package/dist/files/format-bytes.d.ts.map +0 -1
  409. package/dist/files/index.d.ts.map +0 -1
  410. package/dist/function/debounce.d.ts +0 -11
  411. package/dist/function/debounce.d.ts.map +0 -1
  412. package/dist/function/index.d.ts.map +0 -1
  413. package/dist/function/throttle.d.ts +0 -10
  414. package/dist/function/throttle.d.ts.map +0 -1
  415. package/dist/function/try-catch.d.ts.map +0 -1
  416. package/dist/index.d.ts.map +0 -1
  417. package/dist/string/camel-case.d.ts +0 -2
  418. package/dist/string/camel-case.d.ts.map +0 -1
  419. package/dist/string/capitalize.d.ts +0 -2
  420. package/dist/string/capitalize.d.ts.map +0 -1
  421. package/dist/string/format-hms-to-seconds.d.ts +0 -2
  422. package/dist/string/format-hms-to-seconds.d.ts.map +0 -1
  423. package/dist/string/format-seconds-to-fragment.d.ts +0 -3
  424. package/dist/string/format-seconds-to-fragment.d.ts.map +0 -1
  425. package/dist/string/format-seconds-to-hms.d.ts +0 -2
  426. package/dist/string/format-seconds-to-hms.d.ts.map +0 -1
  427. package/dist/string/format-string-to-time.d.ts +0 -2
  428. package/dist/string/format-string-to-time.d.ts.map +0 -1
  429. package/dist/string/index.d.ts.map +0 -1
  430. package/dist/string/kebab-case.d.ts +0 -2
  431. package/dist/string/kebab-case.d.ts.map +0 -1
  432. package/dist/string/markdown-to-text.d.ts +0 -2
  433. package/dist/string/markdown-to-text.d.ts.map +0 -1
  434. package/dist/string/remove-html-tags.d.ts +0 -2
  435. package/dist/string/remove-html-tags.d.ts.map +0 -1
  436. package/dist/string/slugify.d.ts +0 -2
  437. package/dist/string/slugify.d.ts.map +0 -1
  438. package/dist/string/snake-case.d.ts +0 -2
  439. package/dist/string/snake-case.d.ts.map +0 -1
  440. package/dist/string/to-sentence-case.d.ts +0 -2
  441. package/dist/string/to-sentence-case.d.ts.map +0 -1
  442. package/dist/string/truncate.d.ts +0 -2
  443. package/dist/string/truncate.d.ts.map +0 -1
  444. package/dist/youtube/extract-youtube-video-id.d.ts +0 -2
  445. package/dist/youtube/extract-youtube-video-id.d.ts.map +0 -1
  446. package/dist/youtube/generate-youtube-url.d.ts +0 -20
  447. package/dist/youtube/generate-youtube-url.d.ts.map +0 -1
  448. package/dist/youtube/get-video-duration.d.ts +0 -7
  449. package/dist/youtube/get-video-duration.d.ts.map +0 -1
  450. package/dist/youtube/get-youtube-thumbnail.d.ts +0 -2
  451. package/dist/youtube/get-youtube-thumbnail.d.ts.map +0 -1
  452. package/dist/youtube/get-youtube-video-info.d.ts +0 -26
  453. package/dist/youtube/get-youtube-video-info.d.ts.map +0 -1
  454. package/dist/youtube/index.d.ts.map +0 -1
  455. package/dist/youtube/validate-youtube-link.d.ts +0 -2
  456. package/dist/youtube/validate-youtube-link.d.ts.map +0 -1
@@ -0,0 +1,187 @@
1
+ // src/string/camel-case.ts
2
+ function camelCase(str) {
3
+ if (typeof str !== "string") {
4
+ throw new Error("Input must be a string");
5
+ }
6
+ if (str.length === 0) {
7
+ return str;
8
+ }
9
+ const words = str.toLowerCase().replace(/[^a-zA-Z0-9\s\-_]/g, "").split(/[\s\-_]+/).filter((word) => word.length > 0);
10
+ if (words.length === 0) {
11
+ return "";
12
+ }
13
+ return words[0] + words.slice(1).map((word) => word.charAt(0).toUpperCase() + word.slice(1)).join("");
14
+ }
15
+
16
+ // src/string/capitalize.ts
17
+ function capitalize(str) {
18
+ if (typeof str !== "string") {
19
+ throw new Error("Input must be a string");
20
+ }
21
+ if (str.length === 0) {
22
+ return str;
23
+ }
24
+ return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase();
25
+ }
26
+
27
+ // src/string/format-hms-to-seconds.ts
28
+ var formatHMSToSeconds = (val) => {
29
+ if (val == null || val === "") return null;
30
+ if (typeof val === "number")
31
+ return Number.isFinite(val) ? Math.max(0, Math.floor(val)) : null;
32
+ const s = String(val).trim();
33
+ if (/^\d+$/.test(s)) return Math.max(0, Number.parseInt(s, 10));
34
+ if (/^\d{1,2}(:\d{1,2}){1,2}$/.test(s)) {
35
+ const parts = s.split(":").map((p) => Number.parseInt(p, 10));
36
+ if (parts.some((n) => Number.isNaN(n))) return null;
37
+ let seconds = 0;
38
+ if (parts.length === 3) {
39
+ seconds = parts[0] * 3600 + parts[1] * 60 + parts[2];
40
+ } else {
41
+ seconds = parts[0] * 60 + parts[1];
42
+ }
43
+ return Math.max(0, seconds);
44
+ }
45
+ return null;
46
+ };
47
+
48
+ // src/string/format-seconds-to-fragment.ts
49
+ var formatSecondsToFragment = (secs) => {
50
+ const parsedSecs = Math.max(0, Math.floor(secs));
51
+ const h = Math.floor(parsedSecs / 3600);
52
+ const m = Math.floor(parsedSecs % 3600 / 60);
53
+ const s = parsedSecs % 60;
54
+ let out = "";
55
+ if (h > 0) out += `${h}h`;
56
+ if (m > 0) out += `${m}m`;
57
+ if (s > 0 || out === "") out += `${s}s`;
58
+ return out;
59
+ };
60
+
61
+ // src/string/format-seconds-to-hms.ts
62
+ function formatSecondsToHMS(totalSeconds) {
63
+ const rounded = Math.max(0, Math.round(totalSeconds));
64
+ const hours = Math.floor(rounded / 3600);
65
+ const minutes = Math.floor(rounded % 3600 / 60);
66
+ const seconds = rounded % 60;
67
+ const hh = String(hours).padStart(2, "0");
68
+ const mm = String(minutes).padStart(2, "0");
69
+ const ss = String(seconds).padStart(2, "0");
70
+ if (hours === 0) {
71
+ return `${mm}:${ss}`;
72
+ }
73
+ return `${hh}:${mm}:${ss}`;
74
+ }
75
+
76
+ // src/string/format-string-to-time.ts
77
+ var formatStringToTime = (str) => {
78
+ const stringCleaned = Number(str.replace(/\D/g, "")).toString();
79
+ if (stringCleaned.length > 4) {
80
+ return stringCleaned.padStart(6, "0").slice(0, 6).replace(/(\d{2})(\d{2})(\d{2})/, "$1:$2:$3");
81
+ }
82
+ return stringCleaned.padStart(4, "0").replace(/(\d{2})(\d{2})/, "$1:$2");
83
+ };
84
+
85
+ // src/string/kebab-case.ts
86
+ function kebabCase(str) {
87
+ if (typeof str !== "string") {
88
+ throw new Error("Input must be a string");
89
+ }
90
+ return str.replace(/([a-z])([A-Z])/g, "$1-$2").replace(/[\s_]+/g, "-").replace(/[^a-zA-Z0-9-]/g, "").toLowerCase().replace(/^-+|-+$/g, "");
91
+ }
92
+
93
+ // src/string/markdown-to-text.ts
94
+ function markdownToText(markdown) {
95
+ if (!markdown) return "";
96
+ let text = markdown.replace(/\r\n?/g, "\n");
97
+ text = text.replace(/```[\s\S]*?```/g, (m) => {
98
+ const inner = m.replace(/^```.*\n?/, "").replace(/```$/, "");
99
+ return inner.replace(/^\n+|\n+$/g, "");
100
+ });
101
+ text = text.replace(/`([^`]+)`/g, "$1");
102
+ text = text.replace(/!\[([^\]]*)\]\((?:[^)]+)\)/g, "$1");
103
+ text = text.replace(/\[([^\]]+)\]\((?:[^)]+)\)/g, "$1");
104
+ text = text.replace(/\[([^\]]+)\]\s*\[[^\]]*\]/g, "$1");
105
+ text = text.replace(/\[\^[^\]]+\]/g, "");
106
+ text = text.replace(/^\s*\[[^\]]+\]:\s*.*(?:\r\n?|\n)?/gm, "");
107
+ text = text.replace(/^\s*\[\^[^\]]+\]:\s*.*(?:\r\n?|\n)?/gm, "");
108
+ text = text.replace(/<\/?[^>]+>/g, "");
109
+ text = text.replace(/(\*\*|__)(.*?)\1/g, "$2");
110
+ text = text.replace(/(\*|_)(.*?)\1/g, "$2");
111
+ text = text.replace(/~~(.*?)~~/g, "$1");
112
+ text = text.replace(/^\s{0,3}#{1,6}\s*/gm, "");
113
+ text = text.replace(/^\s{0,3}>\s?/gm, "");
114
+ text = text.replace(/^\s{0,3}([-+*]|\d+\.)\s+/gm, "");
115
+ text = text.replace(/^\s*\|?(?:\s*:?-+:?\s*\|)+\s*(?:\r\n?|\n)?/gm, "");
116
+ text = text.replace(/\|/g, " | ");
117
+ text = text.replace(/^[ \t]+/gm, "");
118
+ text = text.replace(/\|\s{2}(?=\d)/g, "| ");
119
+ text = text.replace(/\[\^[^\]]+\]/g, "");
120
+ text = text.replace(/\^[0-9]+:\s*.*(?:\r\n?|\n)?/g, "");
121
+ const entities = {
122
+ "&amp;": "&",
123
+ "&lt;": "<",
124
+ "&gt;": ">",
125
+ "&quot;": '"',
126
+ "&#39;": "'"
127
+ };
128
+ text = text.replace(/&[a-zA-Z0-9#]+;/g, (e) => {
129
+ var _a;
130
+ return (_a = entities[e]) != null ? _a : e;
131
+ });
132
+ text = text.replace(/[ \t]+$/gm, "");
133
+ text = text.replace(/\n{3,}/g, "\n\n");
134
+ return text.trim();
135
+ }
136
+
137
+ // src/string/remove-html-tags.ts
138
+ function removeHtmlTags(input) {
139
+ if (!input || typeof input !== "string") {
140
+ return "";
141
+ }
142
+ const maxLength = 1e5;
143
+ let updatedInput = input;
144
+ if (updatedInput.length > maxLength) {
145
+ updatedInput = updatedInput.slice(0, maxLength);
146
+ }
147
+ return updatedInput.replace(/<(?:[^>"']|"[^"]*"|'[^']*')*>/g, "");
148
+ }
149
+
150
+ // src/string/slugify.ts
151
+ function slugify(text) {
152
+ return text.normalize("NFD").replace(/[\u0300-\u036f]/g, "").replace(/[^\w\s]/gi, "").trim().replace(/\s+/g, "-").toLowerCase();
153
+ }
154
+
155
+ // src/string/snake-case.ts
156
+ function snakeCase(str) {
157
+ if (typeof str !== "string") {
158
+ throw new Error("Input must be a string");
159
+ }
160
+ return str.replace(/([a-z])([A-Z])/g, "$1_$2").replace(/[\s-]+/g, "_").replace(/[^a-zA-Z0-9_]/g, "").toLowerCase().replace(/^_+|_+$/g, "");
161
+ }
162
+
163
+ // src/string/to-sentence-case.ts
164
+ function toSentenceCase(str) {
165
+ return str.replace(/_/g, " ").replace(/([A-Z])/g, " $1").toLowerCase().replace(/^\w/, (c) => c.toUpperCase()).replace(/\s+/g, " ").trim();
166
+ }
167
+
168
+ // src/string/truncate.ts
169
+ function truncate(str, length, suffix = "...") {
170
+ if (typeof str !== "string") {
171
+ throw new Error("Input must be a string");
172
+ }
173
+ if (typeof length !== "number" || length < 0) {
174
+ throw new Error("Length must be a non-negative number");
175
+ }
176
+ if (str.length <= length) {
177
+ return str;
178
+ }
179
+ if (length === 0) {
180
+ return suffix;
181
+ }
182
+ return str.slice(0, Math.max(0, length - suffix.length)) + suffix;
183
+ }
184
+
185
+ export { camelCase, capitalize, formatHMSToSeconds, formatSecondsToFragment, formatSecondsToHMS, formatStringToTime, kebabCase, markdownToText, removeHtmlTags, slugify, snakeCase, toSentenceCase, truncate };
186
+ //# sourceMappingURL=chunk-53JMVGIG.js.map
187
+ //# sourceMappingURL=chunk-53JMVGIG.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/string/camel-case.ts","../src/string/capitalize.ts","../src/string/format-hms-to-seconds.ts","../src/string/format-seconds-to-fragment.ts","../src/string/format-seconds-to-hms.ts","../src/string/format-string-to-time.ts","../src/string/kebab-case.ts","../src/string/markdown-to-text.ts","../src/string/remove-html-tags.ts","../src/string/slugify.ts","../src/string/snake-case.ts","../src/string/to-sentence-case.ts","../src/string/truncate.ts"],"names":[],"mappings":"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","file":"chunk-53JMVGIG.js","sourcesContent":["export function camelCase(str: string): string {\n if (typeof str !== \"string\") {\n throw new Error(\"Input must be a string\")\n }\n\n if (str.length === 0) {\n return str\n }\n\n const words = str\n .toLowerCase()\n .replace(/[^a-zA-Z0-9\\s\\-_]/g, \"\")\n .split(/[\\s\\-_]+/)\n .filter((word) => word.length > 0)\n\n if (words.length === 0) {\n return \"\"\n }\n\n return (\n words[0] +\n words\n .slice(1)\n .map((word) => word.charAt(0).toUpperCase() + word.slice(1))\n .join(\"\")\n )\n}\n","export function capitalize(str: string): string {\n if (typeof str !== \"string\") {\n throw new Error(\"Input must be a string\")\n }\n\n if (str.length === 0) {\n return str\n }\n\n return str.charAt(0).toUpperCase() + str.slice(1).toLowerCase()\n}\n","export const formatHMSToSeconds = (val?: number | string): number | null => {\n if (val == null || val === \"\") return null\n if (typeof val === \"number\")\n return Number.isFinite(val) ? Math.max(0, Math.floor(val)) : null\n const s = String(val).trim()\n // purely numeric string\n if (/^\\d+$/.test(s)) return Math.max(0, Number.parseInt(s, 10))\n // hh:mm:ss or mm:ss\n if (/^\\d{1,2}(:\\d{1,2}){1,2}$/.test(s)) {\n const parts = s.split(\":\").map((p) => Number.parseInt(p, 10))\n if (parts.some((n) => Number.isNaN(n))) return null\n let seconds = 0\n if (parts.length === 3) {\n seconds = parts[0] * 3600 + parts[1] * 60 + parts[2]\n } else {\n seconds = parts[0] * 60 + parts[1]\n }\n return Math.max(0, seconds)\n }\n return null\n}\n","/** convert seconds to \"1h2m3s\" or \"42s\" style for fragment */\nexport const formatSecondsToFragment = (secs: number): string => {\n const parsedSecs = Math.max(0, Math.floor(secs))\n const h = Math.floor(parsedSecs / 3600)\n const m = Math.floor((parsedSecs % 3600) / 60)\n const s = parsedSecs % 60\n let out = \"\"\n if (h > 0) out += `${h}h`\n if (m > 0) out += `${m}m`\n if (s > 0 || out === \"\") out += `${s}s`\n return out\n}\n","export function formatSecondsToHMS(totalSeconds: number): string {\n const rounded = Math.max(0, Math.round(totalSeconds))\n const hours = Math.floor(rounded / 3600)\n const minutes = Math.floor((rounded % 3600) / 60)\n const seconds = rounded % 60\n const hh = String(hours).padStart(2, \"0\")\n const mm = String(minutes).padStart(2, \"0\")\n const ss = String(seconds).padStart(2, \"0\")\n\n if (hours === 0) {\n return `${mm}:${ss}`\n }\n\n return `${hh}:${mm}:${ss}`\n}\n","export const formatStringToTime = (str: string) => {\n const stringCleaned = Number(str.replace(/\\D/g, \"\")).toString()\n if (stringCleaned.length > 4) {\n return stringCleaned\n .padStart(6, \"0\")\n .slice(0, 6)\n .replace(/(\\d{2})(\\d{2})(\\d{2})/, \"$1:$2:$3\")\n }\n\n return stringCleaned.padStart(4, \"0\").replace(/(\\d{2})(\\d{2})/, \"$1:$2\")\n}\n","export function kebabCase(str: string): string {\n if (typeof str !== \"string\") {\n throw new Error(\"Input must be a string\")\n }\n\n return str\n .replace(/([a-z])([A-Z])/g, \"$1-$2\")\n .replace(/[\\s_]+/g, \"-\")\n .replace(/[^a-zA-Z0-9-]/g, \"\")\n .toLowerCase()\n .replace(/^-+|-+$/g, \"\")\n}\n","export function markdownToText(markdown: string): string {\n if (!markdown) return \"\"\n\n // normalize newlines\n let text = markdown.replace(/\\r\\n?/g, \"\\n\")\n\n // Remove code fences but keep inner content (trim surrounding newlines to avoid extra blank lines)\n text = text.replace(/```[\\s\\S]*?```/g, (m) => {\n const inner = m.replace(/^```.*\\n?/, \"\").replace(/```$/, \"\")\n return inner.replace(/^\\n+|\\n+$/g, \"\")\n })\n\n // Remove inline code backticks\n text = text.replace(/`([^`]+)`/g, \"$1\")\n\n // Images: keep alt text if present\n text = text.replace(/!\\[([^\\]]*)\\]\\((?:[^)]+)\\)/g, \"$1\")\n\n // Links: keep link text\n text = text.replace(/\\[([^\\]]+)\\]\\((?:[^)]+)\\)/g, \"$1\")\n\n // Reference-style links: [text][id] -> text\n text = text.replace(/\\[([^\\]]+)\\]\\s*\\[[^\\]]*\\]/g, \"$1\")\n\n // Remove footnote markers like [^1] (do this before we mutate surrounding lines)\n text = text.replace(/\\[\\^[^\\]]+\\]/g, \"\")\n\n // Remove reference definitions like: [id]: url (and footnote defs like [^1]: note)\n // Remove the entire definition line including its trailing newline to avoid leaving blank lines\n text = text.replace(/^\\s*\\[[^\\]]+\\]:\\s*.*(?:\\r\\n?|\\n)?/gm, \"\")\n text = text.replace(/^\\s*\\[\\^[^\\]]+\\]:\\s*.*(?:\\r\\n?|\\n)?/gm, \"\")\n\n // Remove HTML tags but keep inner text\n text = text.replace(/<\\/?[^>]+>/g, \"\")\n\n // Remove emphasis markers (bold/italic/strikethrough), preserve text\n text = text.replace(/(\\*\\*|__)(.*?)\\1/g, \"$2\")\n text = text.replace(/(\\*|_)(.*?)\\1/g, \"$2\")\n text = text.replace(/~~(.*?)~~/g, \"$1\")\n\n // Remove headings (#, ##, etc.)\n text = text.replace(/^\\s{0,3}#{1,6}\\s*/gm, \"\")\n\n // Remove blockquote markers\n text = text.replace(/^\\s{0,3}>\\s?/gm, \"\")\n\n // Remove list markers (ordered and unordered)\n text = text.replace(/^\\s{0,3}([-+*]|\\d+\\.)\\s+/gm, \"\")\n\n // Remove table separator lines and keep table cell content by replacing pipes with spaced pipes\n // Match the separator line and any trailing newline so we don't leave an empty line behind\n // Remove separator lines entirely (don't insert an extra newline)\n text = text.replace(/^\\s*\\|?(?:\\s*:?-+:?\\s*\\|)+\\s*(?:\\r\\n?|\\n)?/gm, \"\")\n text = text.replace(/\\|/g, \" | \")\n\n // Trim leading whitespace on each line (fixes leading space introduced by replacing pipes)\n text = text.replace(/^[ \\t]+/gm, \"\")\n\n // Fix table spacing edge-case: when a cell starts with two spaces before a digit (caused by adding spaces around pipes), collapse to a single space\n text = text.replace(/\\|\\s{2}(?=\\d)/g, \"| \")\n\n // Remove footnote markers like [^1]\n text = text.replace(/\\[\\^[^\\]]+\\]/g, \"\")\n\n // Remove any leftover footnote-definition fragments that may have been concatenated to the previous line\n // e.g. \"Text^1: note\" -> \"Text\"\n text = text.replace(/\\^[0-9]+:\\s*.*(?:\\r\\n?|\\n)?/g, \"\")\n\n // Decode a few common HTML entities\n const entities: Record<string, string> = {\n \"&amp;\": \"&\",\n \"&lt;\": \"<\",\n \"&gt;\": \">\",\n \"&quot;\": '\"',\n \"&#39;\": \"'\",\n }\n text = text.replace(/&[a-zA-Z0-9#]+;/g, (e) => entities[e] ?? e)\n\n // Trim trailing whitespace on each line\n text = text.replace(/[ \\t]+$/gm, \"\")\n\n // Collapse excessive blank lines to at most two (preserve paragraph breaks)\n text = text.replace(/\\n{3,}/g, \"\\n\\n\")\n\n // Final trim but preserve leading/trailing single newlines inside content as needed\n return text.trim()\n}\n","export function removeHtmlTags(input: string): string {\n // Input validation\n if (!input || typeof input !== \"string\") {\n return \"\"\n }\n\n // Apply reasonable input length limit for safety\n const maxLength = 100000 // Adjust based on your requirements\n let updatedInput = input\n if (updatedInput.length > maxLength) {\n updatedInput = updatedInput.slice(0, maxLength)\n }\n\n // Use a non-backtracking approach to prevent ReDoS vulnerabilities\n return updatedInput.replace(/<(?:[^>\"']|\"[^\"]*\"|'[^']*')*>/g, \"\")\n}\n","export function slugify(text: string): string {\n return text\n .normalize(\"NFD\")\n .replace(/[\\u0300-\\u036f]/g, \"\")\n .replace(/[^\\w\\s]/gi, \"\")\n .trim()\n .replace(/\\s+/g, \"-\")\n .toLowerCase()\n}\n","export function snakeCase(str: string): string {\n if (typeof str !== \"string\") {\n throw new Error(\"Input must be a string\")\n }\n\n return str\n .replace(/([a-z])([A-Z])/g, \"$1_$2\")\n .replace(/[\\s-]+/g, \"_\")\n .replace(/[^a-zA-Z0-9_]/g, \"\")\n .toLowerCase()\n .replace(/^_+|_+$/g, \"\")\n}\n","export function toSentenceCase(str: string) {\n return str\n .replace(/_/g, \" \")\n .replace(/([A-Z])/g, \" $1\")\n .toLowerCase()\n .replace(/^\\w/, (c) => c.toUpperCase())\n .replace(/\\s+/g, \" \")\n .trim()\n}\n","export function truncate(str: string, length: number, suffix = \"...\"): string {\n if (typeof str !== \"string\") {\n throw new Error(\"Input must be a string\")\n }\n\n if (typeof length !== \"number\" || length < 0) {\n throw new Error(\"Length must be a non-negative number\")\n }\n\n if (str.length <= length) {\n return str\n }\n\n if (length === 0) {\n return suffix\n }\n\n return str.slice(0, Math.max(0, length - suffix.length)) + suffix\n}\n"]}
@@ -0,0 +1,151 @@
1
+ import { validateYoutubeLink } from './chunk-QAE6Q2SA.js';
2
+ import { formatSecondsToHMS } from './chunk-53JMVGIG.js';
3
+ import { extractYouTubeId } from './chunk-ATWN4SRX.js';
4
+
5
+ // src/youtube/get-video-duration.ts
6
+ var YtApiLoading = null;
7
+ function loadYouTubeIFrameAPI() {
8
+ var _a;
9
+ if ((_a = window.YT) == null ? void 0 : _a.Player) return Promise.resolve();
10
+ if (YtApiLoading) return YtApiLoading;
11
+ YtApiLoading = new Promise((resolve) => {
12
+ const existing = document.querySelector(
13
+ 'script[src="https://www.youtube.com/iframe_api"]'
14
+ );
15
+ if (existing) {
16
+ const poll = setInterval(() => {
17
+ var _a2;
18
+ if ((_a2 = window.YT) == null ? void 0 : _a2.Player) {
19
+ clearInterval(poll);
20
+ resolve();
21
+ }
22
+ }, 50);
23
+ return;
24
+ }
25
+ const tag = document.createElement("script");
26
+ tag.src = "https://www.youtube.com/iframe_api";
27
+ tag.async = true;
28
+ document.body.appendChild(tag);
29
+ window.onYouTubeIframeAPIReady = () => {
30
+ resolve();
31
+ };
32
+ });
33
+ return YtApiLoading;
34
+ }
35
+ async function getYoutubeVideoDuration(videoUrl) {
36
+ const videoId = extractYouTubeId(videoUrl);
37
+ if (!videoId) return null;
38
+ const videoIsValid = await validateYoutubeLink(videoUrl);
39
+ if (!videoIsValid) return null;
40
+ try {
41
+ await loadYouTubeIFrameAPI();
42
+ } catch (e) {
43
+ return null;
44
+ }
45
+ return await new Promise((resolve) => {
46
+ const iframeId = `yt-duration-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`;
47
+ const iframe = document.createElement("iframe");
48
+ iframe.id = iframeId;
49
+ iframe.style.position = "fixed";
50
+ iframe.style.left = "-9999px";
51
+ iframe.style.width = "1px";
52
+ iframe.style.height = "1px";
53
+ iframe.style.opacity = "0";
54
+ iframe.style.pointerEvents = "none";
55
+ const origin = window.location.origin;
56
+ iframe.src = `https://www.youtube.com/embed/${encodeURIComponent(videoId)}?enablejsapi=1&origin=${encodeURIComponent(origin)}`;
57
+ let resolved = false;
58
+ let player = null;
59
+ let cleanupTimeout = null;
60
+ function cleanupAndResolve(result) {
61
+ if (resolved) return;
62
+ resolved = true;
63
+ try {
64
+ if (player && typeof player.destroy === "function") player.destroy();
65
+ } catch (e) {
66
+ }
67
+ try {
68
+ if (iframe.parentNode) iframe.parentNode.removeChild(iframe);
69
+ } catch (e) {
70
+ }
71
+ if (cleanupTimeout) window.clearTimeout(cleanupTimeout);
72
+ resolve(result);
73
+ }
74
+ cleanupTimeout = window.setTimeout(() => {
75
+ cleanupAndResolve(null);
76
+ }, 1e4);
77
+ document.body.appendChild(iframe);
78
+ try {
79
+ player = new window.YT.Player(iframeId, {
80
+ events: {
81
+ onReady: (e) => {
82
+ try {
83
+ let duration = e.target.getDuration();
84
+ if (!duration || duration === 0) {
85
+ let attempts = 0;
86
+ const tryInterval = setInterval(() => {
87
+ attempts += 1;
88
+ try {
89
+ duration = e.target.getDuration();
90
+ if (duration && duration > 0) {
91
+ clearInterval(tryInterval);
92
+ cleanupAndResolve(formatSecondsToHMS(duration));
93
+ } else if (attempts >= 8) {
94
+ clearInterval(tryInterval);
95
+ cleanupAndResolve(null);
96
+ }
97
+ } catch (e2) {
98
+ if (attempts >= 8) {
99
+ clearInterval(tryInterval);
100
+ cleanupAndResolve(null);
101
+ }
102
+ }
103
+ }, 300);
104
+ } else {
105
+ cleanupAndResolve(formatSecondsToHMS(duration));
106
+ }
107
+ } catch (e2) {
108
+ cleanupAndResolve(null);
109
+ }
110
+ },
111
+ onError: () => {
112
+ cleanupAndResolve(null);
113
+ }
114
+ }
115
+ });
116
+ } catch (e) {
117
+ cleanupAndResolve(null);
118
+ }
119
+ });
120
+ }
121
+
122
+ // src/youtube/get-youtube-thumbnail.ts
123
+ async function getYoutubeThumbnail(videoUrl) {
124
+ const { extractYouTubeId: extractYouTubeId2 } = await import('./extract-youtube-video-id-HSYMYXIZ.js');
125
+ const videoId = extractYouTubeId2(videoUrl);
126
+ if (!videoId) return null;
127
+ const thumbs = [
128
+ `https://img.youtube.com/vi/${videoId}/maxresdefault.jpg`,
129
+ `https://img.youtube.com/vi/${videoId}/hqdefault.jpg`,
130
+ `https://img.youtube.com/vi/${videoId}/mqdefault.jpg`,
131
+ `https://img.youtube.com/vi/${videoId}/default.jpg`
132
+ ];
133
+ const loadImage = (src) => new Promise((resolve) => {
134
+ const img = new Image();
135
+ img.onload = () => resolve(true);
136
+ img.onerror = () => resolve(false);
137
+ img.src = src;
138
+ });
139
+ for (const url of thumbs) {
140
+ try {
141
+ const ok = await loadImage(url);
142
+ if (ok) return url;
143
+ } catch (e) {
144
+ }
145
+ }
146
+ return null;
147
+ }
148
+
149
+ export { getYoutubeThumbnail, getYoutubeVideoDuration };
150
+ //# sourceMappingURL=chunk-56NHIM5J.js.map
151
+ //# sourceMappingURL=chunk-56NHIM5J.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/youtube/get-video-duration.ts","../src/youtube/get-youtube-thumbnail.ts"],"names":["_a","e","extractYouTubeId"],"mappings":"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","file":"chunk-56NHIM5J.js","sourcesContent":["/** biome-ignore-all lint/suspicious/noExplicitAny: Window is any */\nimport { formatSecondsToHMS } from \"../string\"\nimport { extractYouTubeId } from \"./extract-youtube-video-id\"\nimport { validateYoutubeLink } from \"./validate-youtube-link\"\n\nlet YtApiLoading: Promise<void> | null = null\n\nfunction loadYouTubeIFrameAPI(): Promise<void> {\n if ((window as any).YT?.Player) return Promise.resolve()\n if (YtApiLoading) return YtApiLoading\n\n YtApiLoading = new Promise((resolve) => {\n const existing = document.querySelector<HTMLScriptElement>(\n 'script[src=\"https://www.youtube.com/iframe_api\"]',\n )\n if (existing) {\n // Poll until the API is ready\n const poll = setInterval(() => {\n if ((window as any).YT?.Player) {\n clearInterval(poll)\n resolve()\n }\n }, 50)\n return\n }\n\n const tag = document.createElement(\"script\")\n tag.src = \"https://www.youtube.com/iframe_api\"\n tag.async = true\n document.body.appendChild(tag)\n\n ;(window as any).onYouTubeIframeAPIReady = () => {\n resolve()\n }\n })\n\n return YtApiLoading\n}\n\n/**\n * getYoutubeVideoDuration\n * Returns a function that accepts a YouTube URL (full or short) and returns a Promise\n * resolving to the video duration formatted as \"HH:MM:SS\" or null on failure.\n */\nexport async function getYoutubeVideoDuration(\n videoUrl: string,\n): Promise<string | null> {\n const videoId = extractYouTubeId(videoUrl)\n if (!videoId) return null\n\n const videoIsValid = await validateYoutubeLink(videoUrl)\n if (!videoIsValid) return null\n\n try {\n await loadYouTubeIFrameAPI()\n } catch {\n return null\n }\n\n return await new Promise<string | null>((resolve) => {\n const iframeId = `yt-duration-${Date.now()}-${Math.random().toString(36).slice(2, 9)}`\n const iframe = document.createElement(\"iframe\")\n // create a minimal offscreen iframe for the player\n iframe.id = iframeId\n iframe.style.position = \"fixed\"\n iframe.style.left = \"-9999px\"\n iframe.style.width = \"1px\"\n iframe.style.height = \"1px\"\n iframe.style.opacity = \"0\"\n iframe.style.pointerEvents = \"none\"\n\n // embed URL with enablejsapi so we can construct YT.Player\n const origin = window.location.origin\n iframe.src = `https://www.youtube.com/embed/${encodeURIComponent(videoId)}?enablejsapi=1&origin=${encodeURIComponent(origin)}`\n\n let resolved = false\n let player: any = null\n let cleanupTimeout: number | null = null\n\n function cleanupAndResolve(result: string | null) {\n if (resolved) return\n resolved = true\n try {\n if (player && typeof player.destroy === \"function\") player.destroy()\n } catch {\n /* ignore */\n }\n try {\n if (iframe.parentNode) iframe.parentNode.removeChild(iframe)\n } catch {\n /* ignore */\n }\n if (cleanupTimeout) window.clearTimeout(cleanupTimeout)\n resolve(result)\n }\n\n // timeout fallback\n cleanupTimeout = window.setTimeout(() => {\n cleanupAndResolve(null)\n }, 10000) // 10s timeout\n\n document.body.appendChild(iframe)\n\n // Construct player\n try {\n player = new (window as any).YT.Player(iframeId, {\n events: {\n onReady: (e: any) => {\n try {\n let duration = e.target.getDuration()\n if (!duration || duration === 0) {\n // Sometimes duration is 0 immediately; try a few short retries\n let attempts = 0\n const tryInterval = setInterval(() => {\n attempts += 1\n try {\n duration = e.target.getDuration()\n if (duration && duration > 0) {\n clearInterval(tryInterval)\n cleanupAndResolve(formatSecondsToHMS(duration))\n } else if (attempts >= 8) {\n clearInterval(tryInterval)\n cleanupAndResolve(null)\n }\n } catch {\n if (attempts >= 8) {\n clearInterval(tryInterval)\n cleanupAndResolve(null)\n }\n }\n }, 300)\n } else {\n cleanupAndResolve(formatSecondsToHMS(duration))\n }\n } catch {\n cleanupAndResolve(null)\n }\n },\n onError: () => {\n cleanupAndResolve(null)\n },\n },\n })\n } catch {\n cleanupAndResolve(null)\n }\n })\n}\n","export async function getYoutubeThumbnail(\n videoUrl: string,\n): Promise<string | null> {\n const { extractYouTubeId } = await import(\"./extract-youtube-video-id\")\n const videoId = extractYouTubeId(videoUrl)\n if (!videoId) return null\n\n // Try loading YouTube thumbnail images — avoids CORS problems because\n // creating an Image and listening for load/error is not blocked by CORS.\n const thumbs = [\n `https://img.youtube.com/vi/${videoId}/maxresdefault.jpg`,\n `https://img.youtube.com/vi/${videoId}/hqdefault.jpg`,\n `https://img.youtube.com/vi/${videoId}/mqdefault.jpg`,\n `https://img.youtube.com/vi/${videoId}/default.jpg`,\n ]\n\n const loadImage = (src: string) =>\n new Promise<boolean>((resolve) => {\n const img = new Image()\n img.onload = () => resolve(true)\n img.onerror = () => resolve(false)\n img.src = src\n })\n\n for (const url of thumbs) {\n try {\n const ok = await loadImage(url)\n if (ok) return url\n } catch {\n // ignore and try next thumbnail\n }\n }\n\n return null\n}\n"]}
@@ -0,0 +1,66 @@
1
+ // src/function/debounce.ts
2
+ function debounce(fn, delay) {
3
+ if (typeof fn !== "function") {
4
+ throw new Error("First argument must be a function");
5
+ }
6
+ if (typeof delay !== "number" || delay < 0) {
7
+ throw new Error("Delay must be a non-negative number");
8
+ }
9
+ let timeoutId;
10
+ return function(...args) {
11
+ if (timeoutId) {
12
+ clearTimeout(timeoutId);
13
+ }
14
+ timeoutId = setTimeout(() => fn.apply(this, args), delay);
15
+ };
16
+ }
17
+
18
+ // src/function/throttle.ts
19
+ function throttle(fn, delay) {
20
+ if (typeof fn !== "function") {
21
+ throw new Error("First argument must be a function");
22
+ }
23
+ if (typeof delay !== "number" || delay < 0) {
24
+ throw new Error("Delay must be a non-negative number");
25
+ }
26
+ let lastCall = 0;
27
+ let timeoutId;
28
+ return function(...args) {
29
+ const now = Date.now();
30
+ if (now - lastCall >= delay) {
31
+ lastCall = now;
32
+ fn.apply(this, args);
33
+ } else {
34
+ if (timeoutId) {
35
+ clearTimeout(timeoutId);
36
+ }
37
+ timeoutId = setTimeout(
38
+ () => {
39
+ lastCall = Date.now();
40
+ fn.apply(this, args);
41
+ },
42
+ delay - (now - lastCall)
43
+ );
44
+ }
45
+ };
46
+ }
47
+
48
+ // src/function/try-catch.ts
49
+ async function tryCatch(fn, defaultData) {
50
+ try {
51
+ const data = await (typeof fn === "function" ? fn() : fn);
52
+ return {
53
+ data,
54
+ error: null
55
+ };
56
+ } catch (error) {
57
+ return {
58
+ data: defaultData != null ? defaultData : null,
59
+ error
60
+ };
61
+ }
62
+ }
63
+
64
+ export { debounce, throttle, tryCatch };
65
+ //# sourceMappingURL=chunk-5OLQJUNS.js.map
66
+ //# sourceMappingURL=chunk-5OLQJUNS.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/function/debounce.ts","../src/function/throttle.ts","../src/function/try-catch.ts"],"names":[],"mappings":";AASO,SAAS,QAAA,CACd,IACA,KAAA,EACkC;AAClC,EAAA,IAAI,OAAO,OAAO,UAAA,EAAY;AAC5B,IAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,EACrD;AAEA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,GAAQ,CAAA,EAAG;AAC1C,IAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AAAA,EACvD;AAEA,EAAA,IAAI,SAAA;AAEJ,EAAA,OAAO,YAA4B,IAAA,EAAqB;AACtD,IAAA,IAAI,SAAA,EAAW;AACb,MAAA,YAAA,CAAa,SAAS,CAAA;AAAA,IACxB;AACA,IAAA,SAAA,GAAY,WAAW,MAAM,EAAA,CAAG,MAAM,IAAA,EAAM,IAAI,GAAG,KAAK,CAAA;AAAA,EAC1D,CAAA;AACF;;;ACrBO,SAAS,QAAA,CACd,IACA,KAAA,EACkC;AAClC,EAAA,IAAI,OAAO,OAAO,UAAA,EAAY;AAC5B,IAAA,MAAM,IAAI,MAAM,mCAAmC,CAAA;AAAA,EACrD;AAEA,EAAA,IAAI,OAAO,KAAA,KAAU,QAAA,IAAY,KAAA,GAAQ,CAAA,EAAG;AAC1C,IAAA,MAAM,IAAI,MAAM,qCAAqC,CAAA;AAAA,EACvD;AAEA,EAAA,IAAI,QAAA,GAAW,CAAA;AACf,EAAA,IAAI,SAAA;AAEJ,EAAA,OAAO,YAA4B,IAAA,EAAqB;AACtD,IAAA,MAAM,GAAA,GAAM,KAAK,GAAA,EAAI;AAErB,IAAA,IAAI,GAAA,GAAM,YAAY,KAAA,EAAO;AAC3B,MAAA,QAAA,GAAW,GAAA;AACX,MAAA,EAAA,CAAG,KAAA,CAAM,MAAM,IAAI,CAAA;AAAA,IACrB,CAAA,MAAO;AACL,MAAA,IAAI,SAAA,EAAW;AACb,QAAA,YAAA,CAAa,SAAS,CAAA;AAAA,MACxB;AACA,MAAA,SAAA,GAAY,UAAA;AAAA,QACV,MAAM;AACJ,UAAA,QAAA,GAAW,KAAK,GAAA,EAAI;AACpB,UAAA,EAAA,CAAG,KAAA,CAAM,MAAM,IAAI,CAAA;AAAA,QACrB,CAAA;AAAA,QACA,SAAS,GAAA,GAAM,QAAA;AAAA,OACjB;AAAA,IACF;AAAA,EACF,CAAA;AACF;;;ACfA,eAAsB,QAAA,CACpB,IACA,WAAA,EAC2D;AAC3D,EAAA,IAAI;AACF,IAAA,MAAM,OAAO,OAAO,OAAO,EAAA,KAAO,UAAA,GAAa,IAAG,GAAI,EAAA,CAAA;AACtD,IAAA,OAAO;AAAA,MACL,IAAA;AAAA,MACA,KAAA,EAAO;AAAA,KACT;AAAA,EACF,SAAS,KAAA,EAAO;AACd,IAAA,OAAO;AAAA,MACL,MAAO,WAAA,IAAA,IAAA,GAAA,WAAA,GAAe,IAAA;AAAA,MACtB;AAAA,KACF;AAAA,EACF;AACF","file":"chunk-5OLQJUNS.js","sourcesContent":["type TAnyFunction = (...args: unknown[]) => unknown\n\n/**\n * Creates a debounced function that delays invoking func until after delay milliseconds\n * have elapsed since the last time the debounced function was invoked\n * @param fn - The function to debounce\n * @param delay - The number of milliseconds to delay\n * @returns The debounced function\n */\nexport function debounce<T extends TAnyFunction>(\n fn: T,\n delay: number,\n): (...args: Parameters<T>) => void {\n if (typeof fn !== \"function\") {\n throw new Error(\"First argument must be a function\")\n }\n\n if (typeof delay !== \"number\" || delay < 0) {\n throw new Error(\"Delay must be a non-negative number\")\n }\n\n let timeoutId: ReturnType<typeof setTimeout> | undefined\n\n return function (this: unknown, ...args: Parameters<T>) {\n if (timeoutId) {\n clearTimeout(timeoutId)\n }\n timeoutId = setTimeout(() => fn.apply(this, args), delay)\n }\n}\n","type TAnyFunction = (...args: unknown[]) => unknown\n\n/**\n * Creates a throttled function that only invokes func at most once per every delay milliseconds\n * @param fn - The function to throttle\n * @param delay - The number of milliseconds to throttle invocations to\n * @returns The throttled function\n */\nexport function throttle<T extends TAnyFunction>(\n fn: T,\n delay: number,\n): (...args: Parameters<T>) => void {\n if (typeof fn !== \"function\") {\n throw new Error(\"First argument must be a function\")\n }\n\n if (typeof delay !== \"number\" || delay < 0) {\n throw new Error(\"Delay must be a non-negative number\")\n }\n\n let lastCall = 0\n let timeoutId: ReturnType<typeof setTimeout> | undefined\n\n return function (this: unknown, ...args: Parameters<T>) {\n const now = Date.now()\n\n if (now - lastCall >= delay) {\n lastCall = now\n fn.apply(this, args)\n } else {\n if (timeoutId) {\n clearTimeout(timeoutId)\n }\n timeoutId = setTimeout(\n () => {\n lastCall = Date.now()\n fn.apply(this, args)\n },\n delay - (now - lastCall),\n )\n }\n }\n}\n","type TSuccess<T> = { data: T; error: null }\ntype TFailure<E, D = null> = { data: D; error: E }\n\nexport type TTryCatchResult<T, E = Error, D = null> =\n | TSuccess<T>\n | TFailure<E, D>\n\n/**\n * Enhanced try-catch utility that handles async operations and provides typed results\n *\n * @param fn - The promise or function returning a promise to execute\n * @param defaultData - Optional default value to use for data when an error occurs (instead of null)\n * @returns A consistent result object containing either data or error\n *\n * @example\n * // With a promise\n * const result = await tryCatch(fetchUserData(userId));\n *\n * @example\n * // With a function that returns a promise\n * const result = await tryCatch(() => fetchUserData(userId));\n *\n * @example\n * // With custom default data\n * const result = await tryCatch(fetchItems(), []);\n * // result.data will be an empty array instead of null when error occurs\n */\nexport async function tryCatch<T, E = Error, D = null>(\n fn: Promise<T> | (() => Promise<T> | T),\n defaultData?: D,\n): Promise<TTryCatchResult<T, E, D extends null ? null : D>> {\n try {\n const data = await (typeof fn === \"function\" ? fn() : fn)\n return {\n data,\n error: null,\n } as TSuccess<T>\n } catch (error) {\n return {\n data: (defaultData ?? null) as D extends null ? null : D,\n error: error as E,\n } as TFailure<E, D extends null ? null : D>\n }\n}\n"]}