@herowcode/utils 1.3.5 → 1.5.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 (462) 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/nextjs/index.browser.cjs +110 -0
  108. package/dist/nextjs/index.browser.cjs.map +1 -0
  109. package/dist/nextjs/index.browser.d.mts +10 -0
  110. package/dist/nextjs/index.browser.d.ts +10 -0
  111. package/dist/nextjs/index.browser.js +103 -0
  112. package/dist/nextjs/index.browser.js.map +1 -0
  113. package/dist/string/index.cjs +60 -0
  114. package/dist/string/index.cjs.map +1 -0
  115. package/dist/string/index.d.mts +28 -0
  116. package/dist/string/index.d.ts +28 -14
  117. package/dist/string/index.js +3 -0
  118. package/dist/string/index.js.map +1 -0
  119. package/dist/{cjs/function/try-catch.d.ts → try-catch-B7WzqcPU.d.mts} +4 -4
  120. package/dist/{function/try-catch.d.ts → try-catch-B7WzqcPU.d.ts} +4 -4
  121. package/dist/youtube/index.browser.cjs +35 -0
  122. package/dist/youtube/index.browser.cjs.map +1 -0
  123. package/dist/youtube/index.browser.d.mts +2 -0
  124. package/dist/youtube/index.browser.d.ts +2 -0
  125. package/dist/youtube/index.browser.js +6 -0
  126. package/dist/youtube/index.browser.js.map +1 -0
  127. package/dist/youtube/index.cjs +36 -0
  128. package/dist/youtube/index.cjs.map +1 -0
  129. package/dist/youtube/index.d.mts +12 -0
  130. package/dist/youtube/index.d.ts +12 -7
  131. package/dist/youtube/index.js +7 -0
  132. package/dist/youtube/index.js.map +1 -0
  133. package/dist/youtube/index.node.cjs +26 -0
  134. package/dist/youtube/index.node.cjs.map +1 -0
  135. package/dist/youtube/index.node.d.mts +49 -0
  136. package/dist/youtube/index.node.d.ts +49 -0
  137. package/dist/youtube/index.node.js +5 -0
  138. package/dist/youtube/index.node.js.map +1 -0
  139. package/package.json +164 -49
  140. package/dist/api/client.d.ts.map +0 -1
  141. package/dist/api/index.d.ts.map +0 -1
  142. package/dist/api/wrapper.d.ts +0 -27
  143. package/dist/api/wrapper.d.ts.map +0 -1
  144. package/dist/array/index.d.ts.map +0 -1
  145. package/dist/array/shuffle.d.ts +0 -2
  146. package/dist/array/shuffle.d.ts.map +0 -1
  147. package/dist/array/unique.d.ts +0 -2
  148. package/dist/array/unique.d.ts.map +0 -1
  149. package/dist/cjs/api/client.d.ts +0 -25
  150. package/dist/cjs/api/client.d.ts.map +0 -1
  151. package/dist/cjs/api/client.js +0 -148
  152. package/dist/cjs/api/client.js.map +0 -1
  153. package/dist/cjs/api/index.d.ts +0 -3
  154. package/dist/cjs/api/index.d.ts.map +0 -1
  155. package/dist/cjs/api/index.js +0 -6
  156. package/dist/cjs/api/index.js.map +0 -1
  157. package/dist/cjs/api/wrapper.d.ts +0 -27
  158. package/dist/cjs/api/wrapper.d.ts.map +0 -1
  159. package/dist/cjs/api/wrapper.js +0 -152
  160. package/dist/cjs/api/wrapper.js.map +0 -1
  161. package/dist/cjs/array/index.d.ts +0 -3
  162. package/dist/cjs/array/index.d.ts.map +0 -1
  163. package/dist/cjs/array/index.js +0 -19
  164. package/dist/cjs/array/index.js.map +0 -1
  165. package/dist/cjs/array/shuffle.d.ts +0 -2
  166. package/dist/cjs/array/shuffle.d.ts.map +0 -1
  167. package/dist/cjs/array/shuffle.js +0 -16
  168. package/dist/cjs/array/shuffle.js.map +0 -1
  169. package/dist/cjs/array/unique.d.ts +0 -2
  170. package/dist/cjs/array/unique.d.ts.map +0 -1
  171. package/dist/cjs/array/unique.js +0 -7
  172. package/dist/cjs/array/unique.js.map +0 -1
  173. package/dist/cjs/array.js +0 -1
  174. package/dist/cjs/date/dayjs.d.ts +0 -20
  175. package/dist/cjs/date/dayjs.d.ts.map +0 -1
  176. package/dist/cjs/date/dayjs.js +0 -123
  177. package/dist/cjs/date/dayjs.js.map +0 -1
  178. package/dist/cjs/date/fix-timezone-offset.d.ts +0 -3
  179. package/dist/cjs/date/fix-timezone-offset.d.ts.map +0 -1
  180. package/dist/cjs/date/fix-timezone-offset.js +0 -9
  181. package/dist/cjs/date/fix-timezone-offset.js.map +0 -1
  182. package/dist/cjs/date/format-date.d.ts +0 -23
  183. package/dist/cjs/date/format-date.d.ts.map +0 -1
  184. package/dist/cjs/date/format-date.js +0 -71
  185. package/dist/cjs/date/format-date.js.map +0 -1
  186. package/dist/cjs/date/get-current-date-in-utc.d.ts +0 -3
  187. package/dist/cjs/date/get-current-date-in-utc.d.ts.map +0 -1
  188. package/dist/cjs/date/get-current-date-in-utc.js +0 -8
  189. package/dist/cjs/date/get-current-date-in-utc.js.map +0 -1
  190. package/dist/cjs/date/get-date-in-utc.d.ts +0 -3
  191. package/dist/cjs/date/get-date-in-utc.d.ts.map +0 -1
  192. package/dist/cjs/date/get-date-in-utc.js +0 -8
  193. package/dist/cjs/date/get-date-in-utc.js.map +0 -1
  194. package/dist/cjs/date/get-relative-time.d.ts +0 -3
  195. package/dist/cjs/date/get-relative-time.d.ts.map +0 -1
  196. package/dist/cjs/date/get-relative-time.js +0 -8
  197. package/dist/cjs/date/get-relative-time.js.map +0 -1
  198. package/dist/cjs/date/index.d.ts +0 -8
  199. package/dist/cjs/date/index.d.ts.map +0 -1
  200. package/dist/cjs/date/index.js +0 -24
  201. package/dist/cjs/date/index.js.map +0 -1
  202. package/dist/cjs/date/parse-time-spent.d.ts +0 -15
  203. package/dist/cjs/date/parse-time-spent.d.ts.map +0 -1
  204. package/dist/cjs/date/parse-time-spent.js +0 -207
  205. package/dist/cjs/date/parse-time-spent.js.map +0 -1
  206. package/dist/cjs/date.js +0 -1
  207. package/dist/cjs/files/compress-image.d.ts +0 -10
  208. package/dist/cjs/files/compress-image.d.ts.map +0 -1
  209. package/dist/cjs/files/compress-image.js +0 -61
  210. package/dist/cjs/files/compress-image.js.map +0 -1
  211. package/dist/cjs/files/download-url.d.ts +0 -2
  212. package/dist/cjs/files/download-url.d.ts.map +0 -1
  213. package/dist/cjs/files/download-url.js +0 -29
  214. package/dist/cjs/files/download-url.js.map +0 -1
  215. package/dist/cjs/files/file-delete.d.ts +0 -2
  216. package/dist/cjs/files/file-delete.d.ts.map +0 -1
  217. package/dist/cjs/files/file-delete.js +0 -20
  218. package/dist/cjs/files/file-delete.js.map +0 -1
  219. package/dist/cjs/files/file-exists.d.ts +0 -2
  220. package/dist/cjs/files/file-exists.d.ts.map +0 -1
  221. package/dist/cjs/files/file-exists.js +0 -18
  222. package/dist/cjs/files/file-exists.js.map +0 -1
  223. package/dist/cjs/files/format-bytes.d.ts +0 -2
  224. package/dist/cjs/files/format-bytes.d.ts.map +0 -1
  225. package/dist/cjs/files/format-bytes.js +0 -17
  226. package/dist/cjs/files/format-bytes.js.map +0 -1
  227. package/dist/cjs/files/index.d.ts +0 -6
  228. package/dist/cjs/files/index.d.ts.map +0 -1
  229. package/dist/cjs/files/index.js +0 -22
  230. package/dist/cjs/files/index.js.map +0 -1
  231. package/dist/cjs/files.js +0 -1
  232. package/dist/cjs/function/debounce.d.ts +0 -11
  233. package/dist/cjs/function/debounce.d.ts.map +0 -1
  234. package/dist/cjs/function/debounce.js +0 -26
  235. package/dist/cjs/function/debounce.js.map +0 -1
  236. package/dist/cjs/function/index.d.ts +0 -4
  237. package/dist/cjs/function/index.d.ts.map +0 -1
  238. package/dist/cjs/function/index.js +0 -20
  239. package/dist/cjs/function/index.js.map +0 -1
  240. package/dist/cjs/function/throttle.d.ts +0 -10
  241. package/dist/cjs/function/throttle.d.ts.map +0 -1
  242. package/dist/cjs/function/throttle.js +0 -36
  243. package/dist/cjs/function/throttle.js.map +0 -1
  244. package/dist/cjs/function/try-catch.d.ts.map +0 -1
  245. package/dist/cjs/function/try-catch.js +0 -39
  246. package/dist/cjs/function/try-catch.js.map +0 -1
  247. package/dist/cjs/function.js +0 -1
  248. package/dist/cjs/index.d.ts +0 -8
  249. package/dist/cjs/index.d.ts.map +0 -1
  250. package/dist/cjs/index.js +0 -24
  251. package/dist/cjs/index.js.map +0 -1
  252. package/dist/cjs/string/camel-case.d.ts +0 -2
  253. package/dist/cjs/string/camel-case.d.ts.map +0 -1
  254. package/dist/cjs/string/camel-case.js +0 -25
  255. package/dist/cjs/string/camel-case.js.map +0 -1
  256. package/dist/cjs/string/capitalize.d.ts +0 -2
  257. package/dist/cjs/string/capitalize.d.ts.map +0 -1
  258. package/dist/cjs/string/capitalize.js +0 -13
  259. package/dist/cjs/string/capitalize.js.map +0 -1
  260. package/dist/cjs/string/format-hms-to-seconds.d.ts +0 -2
  261. package/dist/cjs/string/format-hms-to-seconds.d.ts.map +0 -1
  262. package/dist/cjs/string/format-hms-to-seconds.js +0 -30
  263. package/dist/cjs/string/format-hms-to-seconds.js.map +0 -1
  264. package/dist/cjs/string/format-seconds-to-fragment.d.ts +0 -3
  265. package/dist/cjs/string/format-seconds-to-fragment.d.ts.map +0 -1
  266. package/dist/cjs/string/format-seconds-to-fragment.js +0 -20
  267. package/dist/cjs/string/format-seconds-to-fragment.js.map +0 -1
  268. package/dist/cjs/string/format-seconds-to-hms.d.ts +0 -2
  269. package/dist/cjs/string/format-seconds-to-hms.d.ts.map +0 -1
  270. package/dist/cjs/string/format-seconds-to-hms.js +0 -17
  271. package/dist/cjs/string/format-seconds-to-hms.js.map +0 -1
  272. package/dist/cjs/string/format-string-to-time.d.ts +0 -2
  273. package/dist/cjs/string/format-string-to-time.d.ts.map +0 -1
  274. package/dist/cjs/string/format-string-to-time.js +0 -15
  275. package/dist/cjs/string/format-string-to-time.js.map +0 -1
  276. package/dist/cjs/string/index.d.ts +0 -14
  277. package/dist/cjs/string/index.d.ts.map +0 -1
  278. package/dist/cjs/string/index.js +0 -30
  279. package/dist/cjs/string/index.js.map +0 -1
  280. package/dist/cjs/string/kebab-case.d.ts +0 -2
  281. package/dist/cjs/string/kebab-case.d.ts.map +0 -1
  282. package/dist/cjs/string/kebab-case.js +0 -15
  283. package/dist/cjs/string/kebab-case.js.map +0 -1
  284. package/dist/cjs/string/markdown-to-text.d.ts +0 -2
  285. package/dist/cjs/string/markdown-to-text.d.ts.map +0 -1
  286. package/dist/cjs/string/markdown-to-text.js +0 -70
  287. package/dist/cjs/string/markdown-to-text.js.map +0 -1
  288. package/dist/cjs/string/remove-html-tags.d.ts +0 -2
  289. package/dist/cjs/string/remove-html-tags.d.ts.map +0 -1
  290. package/dist/cjs/string/remove-html-tags.js +0 -18
  291. package/dist/cjs/string/remove-html-tags.js.map +0 -1
  292. package/dist/cjs/string/slugify.d.ts +0 -2
  293. package/dist/cjs/string/slugify.d.ts.map +0 -1
  294. package/dist/cjs/string/slugify.js +0 -13
  295. package/dist/cjs/string/slugify.js.map +0 -1
  296. package/dist/cjs/string/snake-case.d.ts +0 -2
  297. package/dist/cjs/string/snake-case.d.ts.map +0 -1
  298. package/dist/cjs/string/snake-case.js +0 -15
  299. package/dist/cjs/string/snake-case.js.map +0 -1
  300. package/dist/cjs/string/to-sentence-case.d.ts +0 -2
  301. package/dist/cjs/string/to-sentence-case.d.ts.map +0 -1
  302. package/dist/cjs/string/to-sentence-case.js +0 -13
  303. package/dist/cjs/string/to-sentence-case.js.map +0 -1
  304. package/dist/cjs/string/truncate.d.ts +0 -2
  305. package/dist/cjs/string/truncate.d.ts.map +0 -1
  306. package/dist/cjs/string/truncate.js +0 -19
  307. package/dist/cjs/string/truncate.js.map +0 -1
  308. package/dist/cjs/string.js +0 -1
  309. package/dist/cjs/youtube/extract-youtube-video-id.d.ts +0 -2
  310. package/dist/cjs/youtube/extract-youtube-video-id.d.ts.map +0 -1
  311. package/dist/cjs/youtube/extract-youtube-video-id.js +0 -30
  312. package/dist/cjs/youtube/extract-youtube-video-id.js.map +0 -1
  313. package/dist/cjs/youtube/generate-youtube-url.d.ts +0 -20
  314. package/dist/cjs/youtube/generate-youtube-url.d.ts.map +0 -1
  315. package/dist/cjs/youtube/generate-youtube-url.js +0 -86
  316. package/dist/cjs/youtube/generate-youtube-url.js.map +0 -1
  317. package/dist/cjs/youtube/get-video-duration.d.ts +0 -7
  318. package/dist/cjs/youtube/get-video-duration.d.ts.map +0 -1
  319. package/dist/cjs/youtube/get-video-duration.js +0 -150
  320. package/dist/cjs/youtube/get-video-duration.js.map +0 -1
  321. package/dist/cjs/youtube/get-youtube-thumbnail.d.ts +0 -2
  322. package/dist/cjs/youtube/get-youtube-thumbnail.d.ts.map +0 -1
  323. package/dist/cjs/youtube/get-youtube-thumbnail.js +0 -68
  324. package/dist/cjs/youtube/get-youtube-thumbnail.js.map +0 -1
  325. package/dist/cjs/youtube/get-youtube-video-info.d.ts +0 -26
  326. package/dist/cjs/youtube/get-youtube-video-info.d.ts.map +0 -1
  327. package/dist/cjs/youtube/get-youtube-video-info.js +0 -244
  328. package/dist/cjs/youtube/get-youtube-video-info.js.map +0 -1
  329. package/dist/cjs/youtube/index.d.ts +0 -7
  330. package/dist/cjs/youtube/index.d.ts.map +0 -1
  331. package/dist/cjs/youtube/index.js +0 -23
  332. package/dist/cjs/youtube/index.js.map +0 -1
  333. package/dist/cjs/youtube/validate-youtube-link.d.ts +0 -2
  334. package/dist/cjs/youtube/validate-youtube-link.d.ts.map +0 -1
  335. package/dist/cjs/youtube/validate-youtube-link.js +0 -77
  336. package/dist/cjs/youtube/validate-youtube-link.js.map +0 -1
  337. package/dist/cjs/youtube.js +0 -1
  338. package/dist/date/dayjs.d.ts +0 -20
  339. package/dist/date/dayjs.d.ts.map +0 -1
  340. package/dist/date/fix-timezone-offset.d.ts +0 -3
  341. package/dist/date/fix-timezone-offset.d.ts.map +0 -1
  342. package/dist/date/format-date.d.ts +0 -23
  343. package/dist/date/format-date.d.ts.map +0 -1
  344. package/dist/date/get-current-date-in-utc.d.ts +0 -3
  345. package/dist/date/get-current-date-in-utc.d.ts.map +0 -1
  346. package/dist/date/get-date-in-utc.d.ts +0 -3
  347. package/dist/date/get-date-in-utc.d.ts.map +0 -1
  348. package/dist/date/get-relative-time.d.ts +0 -3
  349. package/dist/date/get-relative-time.d.ts.map +0 -1
  350. package/dist/date/index.d.ts.map +0 -1
  351. package/dist/date/parse-time-spent.d.ts +0 -15
  352. package/dist/date/parse-time-spent.d.ts.map +0 -1
  353. package/dist/esm/api/client.js +0 -143
  354. package/dist/esm/api/index.js +0 -1
  355. package/dist/esm/api/wrapper.js +0 -148
  356. package/dist/esm/array/index.js +0 -2
  357. package/dist/esm/array/shuffle.js +0 -12
  358. package/dist/esm/array/unique.js +0 -3
  359. package/dist/esm/array.js +0 -1
  360. package/dist/esm/date/dayjs.js +0 -111
  361. package/dist/esm/date/fix-timezone-offset.js +0 -5
  362. package/dist/esm/date/format-date.js +0 -67
  363. package/dist/esm/date/get-current-date-in-utc.js +0 -4
  364. package/dist/esm/date/get-date-in-utc.js +0 -4
  365. package/dist/esm/date/get-relative-time.js +0 -4
  366. package/dist/esm/date/index.js +0 -7
  367. package/dist/esm/date/parse-time-spent.js +0 -203
  368. package/dist/esm/date.js +0 -1
  369. package/dist/esm/files/compress-image.js +0 -57
  370. package/dist/esm/files/download-url.js +0 -24
  371. package/dist/esm/files/file-delete.js +0 -12
  372. package/dist/esm/files/file-exists.js +0 -10
  373. package/dist/esm/files/format-bytes.js +0 -13
  374. package/dist/esm/files/index.js +0 -5
  375. package/dist/esm/files.js +0 -1
  376. package/dist/esm/function/debounce.js +0 -22
  377. package/dist/esm/function/index.js +0 -3
  378. package/dist/esm/function/throttle.js +0 -32
  379. package/dist/esm/function/try-catch.js +0 -35
  380. package/dist/esm/function.js +0 -1
  381. package/dist/esm/index.js +0 -7
  382. package/dist/esm/string/camel-case.js +0 -21
  383. package/dist/esm/string/capitalize.js +0 -9
  384. package/dist/esm/string/format-hms-to-seconds.js +0 -25
  385. package/dist/esm/string/format-seconds-to-fragment.js +0 -15
  386. package/dist/esm/string/format-seconds-to-hms.js +0 -13
  387. package/dist/esm/string/format-string-to-time.js +0 -10
  388. package/dist/esm/string/index.js +0 -13
  389. package/dist/esm/string/kebab-case.js +0 -11
  390. package/dist/esm/string/markdown-to-text.js +0 -66
  391. package/dist/esm/string/remove-html-tags.js +0 -14
  392. package/dist/esm/string/slugify.js +0 -9
  393. package/dist/esm/string/snake-case.js +0 -11
  394. package/dist/esm/string/to-sentence-case.js +0 -9
  395. package/dist/esm/string/truncate.js +0 -15
  396. package/dist/esm/string.js +0 -1
  397. package/dist/esm/youtube/extract-youtube-video-id.js +0 -26
  398. package/dist/esm/youtube/generate-youtube-url.js +0 -81
  399. package/dist/esm/youtube/get-video-duration.js +0 -146
  400. package/dist/esm/youtube/get-youtube-thumbnail.js +0 -31
  401. package/dist/esm/youtube/get-youtube-video-info.js +0 -207
  402. package/dist/esm/youtube/index.js +0 -6
  403. package/dist/esm/youtube/validate-youtube-link.js +0 -40
  404. package/dist/esm/youtube.js +0 -1
  405. package/dist/files/compress-image.d.ts +0 -10
  406. package/dist/files/compress-image.d.ts.map +0 -1
  407. package/dist/files/download-url.d.ts +0 -2
  408. package/dist/files/download-url.d.ts.map +0 -1
  409. package/dist/files/file-delete.d.ts +0 -2
  410. package/dist/files/file-delete.d.ts.map +0 -1
  411. package/dist/files/file-exists.d.ts +0 -2
  412. package/dist/files/file-exists.d.ts.map +0 -1
  413. package/dist/files/format-bytes.d.ts +0 -2
  414. package/dist/files/format-bytes.d.ts.map +0 -1
  415. package/dist/files/index.d.ts.map +0 -1
  416. package/dist/function/debounce.d.ts +0 -11
  417. package/dist/function/debounce.d.ts.map +0 -1
  418. package/dist/function/index.d.ts.map +0 -1
  419. package/dist/function/throttle.d.ts +0 -10
  420. package/dist/function/throttle.d.ts.map +0 -1
  421. package/dist/function/try-catch.d.ts.map +0 -1
  422. package/dist/index.d.ts.map +0 -1
  423. package/dist/string/camel-case.d.ts +0 -2
  424. package/dist/string/camel-case.d.ts.map +0 -1
  425. package/dist/string/capitalize.d.ts +0 -2
  426. package/dist/string/capitalize.d.ts.map +0 -1
  427. package/dist/string/format-hms-to-seconds.d.ts +0 -2
  428. package/dist/string/format-hms-to-seconds.d.ts.map +0 -1
  429. package/dist/string/format-seconds-to-fragment.d.ts +0 -3
  430. package/dist/string/format-seconds-to-fragment.d.ts.map +0 -1
  431. package/dist/string/format-seconds-to-hms.d.ts +0 -2
  432. package/dist/string/format-seconds-to-hms.d.ts.map +0 -1
  433. package/dist/string/format-string-to-time.d.ts +0 -2
  434. package/dist/string/format-string-to-time.d.ts.map +0 -1
  435. package/dist/string/index.d.ts.map +0 -1
  436. package/dist/string/kebab-case.d.ts +0 -2
  437. package/dist/string/kebab-case.d.ts.map +0 -1
  438. package/dist/string/markdown-to-text.d.ts +0 -2
  439. package/dist/string/markdown-to-text.d.ts.map +0 -1
  440. package/dist/string/remove-html-tags.d.ts +0 -2
  441. package/dist/string/remove-html-tags.d.ts.map +0 -1
  442. package/dist/string/slugify.d.ts +0 -2
  443. package/dist/string/slugify.d.ts.map +0 -1
  444. package/dist/string/snake-case.d.ts +0 -2
  445. package/dist/string/snake-case.d.ts.map +0 -1
  446. package/dist/string/to-sentence-case.d.ts +0 -2
  447. package/dist/string/to-sentence-case.d.ts.map +0 -1
  448. package/dist/string/truncate.d.ts +0 -2
  449. package/dist/string/truncate.d.ts.map +0 -1
  450. package/dist/youtube/extract-youtube-video-id.d.ts +0 -2
  451. package/dist/youtube/extract-youtube-video-id.d.ts.map +0 -1
  452. package/dist/youtube/generate-youtube-url.d.ts +0 -20
  453. package/dist/youtube/generate-youtube-url.d.ts.map +0 -1
  454. package/dist/youtube/get-video-duration.d.ts +0 -7
  455. package/dist/youtube/get-video-duration.d.ts.map +0 -1
  456. package/dist/youtube/get-youtube-thumbnail.d.ts +0 -2
  457. package/dist/youtube/get-youtube-thumbnail.d.ts.map +0 -1
  458. package/dist/youtube/get-youtube-video-info.d.ts +0 -26
  459. package/dist/youtube/get-youtube-video-info.d.ts.map +0 -1
  460. package/dist/youtube/index.d.ts.map +0 -1
  461. package/dist/youtube/validate-youtube-link.d.ts +0 -2
  462. package/dist/youtube/validate-youtube-link.d.ts.map +0 -1
@@ -0,0 +1,321 @@
1
+ 'use strict';
2
+
3
+ var chunkHK727IAV_cjs = require('./chunk-HK727IAV.cjs');
4
+ var chunkVAZJXZU5_cjs = require('./chunk-VAZJXZU5.cjs');
5
+
6
+ // src/youtube/generate-youtube-url.ts
7
+ var generateYoutubeURL = (opts) => {
8
+ const {
9
+ videoURL,
10
+ start,
11
+ end,
12
+ embed = false,
13
+ short = false,
14
+ useFragment = false,
15
+ autoplay,
16
+ controls,
17
+ rel,
18
+ loop,
19
+ mute,
20
+ modestbranding,
21
+ origin,
22
+ playlist,
23
+ params = {}
24
+ } = opts;
25
+ const videoId = chunkVAZJXZU5_cjs.extractYouTubeId(videoURL);
26
+ if (!videoId) return null;
27
+ const startSec = chunkHK727IAV_cjs.formatHMSToSeconds(start);
28
+ const endSec = chunkHK727IAV_cjs.formatHMSToSeconds(end);
29
+ const base = embed ? `https://www.youtube.com/embed/${videoId}` : short ? `https://youtu.be/${videoId}` : "https://www.youtube.com/watch";
30
+ const search = new URLSearchParams();
31
+ if (!embed && !short) {
32
+ search.set("v", videoId);
33
+ }
34
+ if (!useFragment) {
35
+ if (startSec != null) {
36
+ search.set(short ? "t" : "start", String(startSec));
37
+ }
38
+ if (endSec != null) {
39
+ search.set("end", String(endSec));
40
+ }
41
+ }
42
+ if (typeof autoplay !== "undefined")
43
+ search.set("autoplay", autoplay ? "1" : "0");
44
+ if (typeof controls !== "undefined") search.set("controls", String(controls));
45
+ if (typeof rel !== "undefined") search.set("rel", String(rel));
46
+ if (typeof modestbranding !== "undefined")
47
+ search.set("modestbranding", String(modestbranding));
48
+ if (typeof origin !== "undefined") search.set("origin", origin);
49
+ if (typeof mute !== "undefined") search.set("mute", mute ? "1" : "0");
50
+ if (loop) {
51
+ search.set("loop", "1");
52
+ if (playlist) {
53
+ search.set("playlist", playlist);
54
+ } else if (embed) {
55
+ search.set("playlist", videoId);
56
+ }
57
+ } else if (playlist) {
58
+ search.set("playlist", playlist);
59
+ }
60
+ Object.entries(params).forEach(([k, v]) => {
61
+ if (v === false) search.set(k, "0");
62
+ else if (v === true) search.set(k, "1");
63
+ else search.set(k, String(v));
64
+ });
65
+ const qs = search.toString() ? `?${search.toString()}` : "";
66
+ let fragment = "";
67
+ if (useFragment && startSec != null) {
68
+ fragment = `#t=${chunkHK727IAV_cjs.formatSecondsToFragment(startSec)}`;
69
+ }
70
+ if (short) {
71
+ return `${base}${qs}${fragment}`;
72
+ }
73
+ return `${base}${qs}${fragment}`;
74
+ };
75
+
76
+ // src/youtube/validate-youtube-link.ts
77
+ async function validateYoutubeLink(videoUrl) {
78
+ const { extractYouTubeId: extractYouTubeId2 } = await import('./extract-youtube-video-id-XVGNPUDX.cjs');
79
+ const videoId = extractYouTubeId2(videoUrl);
80
+ if (!videoId) return false;
81
+ const thumbs = [
82
+ `https://img.youtube.com/vi/${videoId}/maxresdefault.jpg`,
83
+ `https://img.youtube.com/vi/${videoId}/hqdefault.jpg`,
84
+ `https://img.youtube.com/vi/${videoId}/mqdefault.jpg`,
85
+ `https://img.youtube.com/vi/${videoId}/default.jpg`
86
+ ];
87
+ const loadImage = (src) => new Promise((resolve) => {
88
+ const img = new Image();
89
+ img.onload = () => resolve(true);
90
+ img.onerror = () => resolve(false);
91
+ img.src = src;
92
+ });
93
+ for (const url of thumbs) {
94
+ try {
95
+ const ok = await loadImage(url);
96
+ if (ok) return true;
97
+ } catch (e) {
98
+ }
99
+ }
100
+ try {
101
+ const watchUrl = `https://www.youtube.com/watch?v=${encodeURIComponent(videoId)}`;
102
+ const oembedUrl = `https://www.youtube.com/oembed?url=${encodeURIComponent(
103
+ watchUrl
104
+ )}&format=json`;
105
+ const res = await fetch(oembedUrl, { method: "GET" });
106
+ return res.ok;
107
+ } catch (e) {
108
+ return false;
109
+ }
110
+ }
111
+
112
+ // src/youtube/get-youtube-video-info.ts
113
+ var videoInfoCache = /* @__PURE__ */ new Map();
114
+ async function getYoutubeVideoInfo(videoUrl) {
115
+ const { extractYouTubeId: extractYouTubeId2 } = await import('./extract-youtube-video-id-XVGNPUDX.cjs');
116
+ const videoId = extractYouTubeId2(videoUrl);
117
+ if (!videoId) return null;
118
+ const cached = videoInfoCache.get(videoId);
119
+ if (cached) return cached;
120
+ const fetchPromise = fetchYoutubeVideoInfo(videoId);
121
+ videoInfoCache.set(videoId, fetchPromise);
122
+ const info = await fetchPromise;
123
+ if (!info) {
124
+ videoInfoCache.delete(videoId);
125
+ }
126
+ return info;
127
+ }
128
+ async function fetchYoutubeVideoInfo(videoId) {
129
+ const watchUrl = `https://www.youtube.com/watch?v=${encodeURIComponent(videoId)}`;
130
+ const htmlInfo = await fetchFromWatchPage(videoId, watchUrl);
131
+ if (htmlInfo) return htmlInfo;
132
+ const oEmbedInfo = await fetchFromOEmbed(videoId, watchUrl);
133
+ if (oEmbedInfo) return oEmbedInfo;
134
+ const noEmbedInfo = await fetchFromNoEmbed(videoId, watchUrl);
135
+ if (noEmbedInfo) return noEmbedInfo;
136
+ return null;
137
+ }
138
+ async function fetchFromWatchPage(videoId, watchUrl) {
139
+ var _a, _b, _c, _d, _e, _f, _g, _h, _i, _j, _k;
140
+ try {
141
+ const response = await fetch(watchUrl);
142
+ if (!response.ok) {
143
+ return null;
144
+ }
145
+ const html = await response.text();
146
+ const rawJson = extractJsonBlock(html, "ytInitialPlayerResponse");
147
+ if (!rawJson) {
148
+ return null;
149
+ }
150
+ const data = JSON.parse(rawJson);
151
+ const details = data.videoDetails;
152
+ const microformat = (_a = data.microformat) == null ? void 0 : _a.playerMicroformatRenderer;
153
+ if (!details && !microformat) {
154
+ return null;
155
+ }
156
+ const thumbnails = getThumbnails(details, microformat);
157
+ const bestThumbnail = selectBestThumbnail(thumbnails);
158
+ return {
159
+ id: (_b = details == null ? void 0 : details.videoId) != null ? _b : videoId,
160
+ url: watchUrl,
161
+ title: (_d = (_c = details == null ? void 0 : details.title) != null ? _c : extractText(microformat == null ? void 0 : microformat.title)) != null ? _d : "",
162
+ channelTitle: (_f = (_e = details == null ? void 0 : details.author) != null ? _e : microformat == null ? void 0 : microformat.ownerChannelName) != null ? _f : "",
163
+ channelId: (_g = details == null ? void 0 : details.channelId) != null ? _g : microformat == null ? void 0 : microformat.externalChannelId,
164
+ channelUrl: microformat == null ? void 0 : microformat.ownerProfileUrl,
165
+ description: (_h = extractText(microformat == null ? void 0 : microformat.description)) != null ? _h : details == null ? void 0 : details.shortDescription,
166
+ shortDescription: details == null ? void 0 : details.shortDescription,
167
+ thumbnails,
168
+ thumbnail: bestThumbnail == null ? void 0 : bestThumbnail.url,
169
+ publishedAt: (_i = microformat == null ? void 0 : microformat.publishDate) != null ? _i : microformat == null ? void 0 : microformat.uploadDate,
170
+ uploadedAt: microformat == null ? void 0 : microformat.uploadDate,
171
+ keywords: details == null ? void 0 : details.keywords,
172
+ viewCount: parseNumber(details == null ? void 0 : details.viewCount),
173
+ lengthSeconds: parseNumber(details == null ? void 0 : details.lengthSeconds),
174
+ isLive: (_k = details == null ? void 0 : details.isLiveContent) != null ? _k : (_j = microformat == null ? void 0 : microformat.liveBroadcastDetails) == null ? void 0 : _j.isLiveNow
175
+ };
176
+ } catch (e) {
177
+ return null;
178
+ }
179
+ }
180
+ async function fetchFromOEmbed(videoId, watchUrl) {
181
+ var _a;
182
+ try {
183
+ const oEmbedUrl = `https://www.youtube.com/oembed?url=${encodeURIComponent(
184
+ watchUrl
185
+ )}&format=json`;
186
+ const response = await fetch(oEmbedUrl);
187
+ if (!response.ok) {
188
+ return null;
189
+ }
190
+ const data = await response.json();
191
+ if (!(data == null ? void 0 : data.title) || !(data == null ? void 0 : data.author_name)) {
192
+ return null;
193
+ }
194
+ const thumbnails = createThumbnailList(
195
+ data.thumbnail_url,
196
+ data.thumbnail_width,
197
+ data.thumbnail_height
198
+ );
199
+ return {
200
+ id: videoId,
201
+ url: watchUrl,
202
+ title: data.title,
203
+ channelTitle: data.author_name,
204
+ channelUrl: data.author_url,
205
+ thumbnails,
206
+ thumbnail: (_a = thumbnails[0]) == null ? void 0 : _a.url,
207
+ description: void 0,
208
+ shortDescription: void 0,
209
+ publishedAt: void 0,
210
+ uploadedAt: void 0,
211
+ keywords: void 0,
212
+ viewCount: void 0,
213
+ lengthSeconds: void 0,
214
+ isLive: void 0
215
+ };
216
+ } catch (e) {
217
+ return null;
218
+ }
219
+ }
220
+ async function fetchFromNoEmbed(videoId, watchUrl) {
221
+ var _a;
222
+ try {
223
+ const noEmbedUrl = `https://noembed.com/embed?url=${encodeURIComponent(
224
+ watchUrl
225
+ )}`;
226
+ const response = await fetch(noEmbedUrl);
227
+ if (!response.ok) {
228
+ return null;
229
+ }
230
+ const data = await response.json();
231
+ if (!(data == null ? void 0 : data.title) || !(data == null ? void 0 : data.author_name)) {
232
+ return null;
233
+ }
234
+ const thumbnails = createThumbnailList(
235
+ data.thumbnail_url,
236
+ data.thumbnail_width,
237
+ data.thumbnail_height
238
+ );
239
+ return {
240
+ id: videoId,
241
+ url: watchUrl,
242
+ title: data.title,
243
+ channelTitle: data.author_name,
244
+ channelUrl: data.author_url,
245
+ description: data.description,
246
+ shortDescription: data.description,
247
+ thumbnails,
248
+ thumbnail: (_a = thumbnails[0]) == null ? void 0 : _a.url,
249
+ publishedAt: data.upload_date,
250
+ uploadedAt: data.upload_date,
251
+ keywords: void 0,
252
+ viewCount: void 0,
253
+ lengthSeconds: void 0,
254
+ isLive: void 0
255
+ };
256
+ } catch (e) {
257
+ return null;
258
+ }
259
+ }
260
+ function extractJsonBlock(html, marker) {
261
+ const markerIndex = html.indexOf(marker);
262
+ if (markerIndex === -1) return null;
263
+ const jsonStart = html.indexOf("{", markerIndex);
264
+ if (jsonStart === -1) return null;
265
+ let depth = 0;
266
+ for (let i = jsonStart; i < html.length; i++) {
267
+ const char = html[i];
268
+ if (char === "{") {
269
+ depth += 1;
270
+ } else if (char === "}") {
271
+ depth -= 1;
272
+ }
273
+ if (depth === 0) {
274
+ return html.slice(jsonStart, i + 1);
275
+ }
276
+ }
277
+ return null;
278
+ }
279
+ function getThumbnails(details, microformat) {
280
+ var _a, _b, _c, _d;
281
+ if ((_b = (_a = details == null ? void 0 : details.thumbnail) == null ? void 0 : _a.thumbnails) == null ? void 0 : _b.length) {
282
+ return details.thumbnail.thumbnails;
283
+ }
284
+ return (_d = (_c = microformat == null ? void 0 : microformat.thumbnail) == null ? void 0 : _c.thumbnails) != null ? _d : [];
285
+ }
286
+ function selectBestThumbnail(thumbnails) {
287
+ if (!thumbnails.length) return void 0;
288
+ return thumbnails.reduce((best, current) => {
289
+ if (!best) return current;
290
+ if (!best.width) return current;
291
+ if (!current.width) return best;
292
+ return current.width > best.width ? current : best;
293
+ });
294
+ }
295
+ function extractText(field) {
296
+ var _a;
297
+ if (!field) return void 0;
298
+ if (field.simpleText) return field.simpleText;
299
+ if ((_a = field.runs) == null ? void 0 : _a.length) {
300
+ return field.runs.map((run) => {
301
+ var _a2;
302
+ return (_a2 = run.text) != null ? _a2 : "";
303
+ }).join("");
304
+ }
305
+ return void 0;
306
+ }
307
+ function parseNumber(value) {
308
+ if (value === void 0) return void 0;
309
+ const parsed = Number(value);
310
+ return Number.isNaN(parsed) ? void 0 : parsed;
311
+ }
312
+ function createThumbnailList(url, width, height) {
313
+ if (!url) return [];
314
+ return [{ url, width, height }];
315
+ }
316
+
317
+ exports.generateYoutubeURL = generateYoutubeURL;
318
+ exports.getYoutubeVideoInfo = getYoutubeVideoInfo;
319
+ exports.validateYoutubeLink = validateYoutubeLink;
320
+ //# sourceMappingURL=chunk-5YOEKMTJ.cjs.map
321
+ //# sourceMappingURL=chunk-5YOEKMTJ.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/youtube/generate-youtube-url.ts","../src/youtube/validate-youtube-link.ts","../src/youtube/get-youtube-video-info.ts"],"names":["extractYouTubeId","formatHMSToSeconds","formatSecondsToFragment","_a"],"mappings":"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","file":"chunk-5YOEKMTJ.cjs","sourcesContent":["import { formatHMSToSeconds, formatSecondsToFragment } from \"../string\"\nimport { extractYouTubeId } from \"./extract-youtube-video-id\"\n\ntype TCreateYoutubeLinkOptions = {\n videoURL: string\n // start / end can be seconds (number) or strings like \"90\", \"01:30\", \"1:02:03\"\n start?: number | string\n end?: number | string\n // choose output form\n embed?: boolean\n short?: boolean // youtu.be\n useFragment?: boolean // use #t=1m2s style fragment for timestamps\n // common embed/watch params\n autoplay?: boolean\n controls?: 0 | 1\n rel?: 0 | 1\n loop?: boolean\n mute?: boolean\n modestbranding?: 0 | 1\n origin?: string\n playlist?: string\n // allow arbitrary extra params (string/number/boolean)\n params?: Record<string, string | number | boolean>\n}\n\nexport const generateYoutubeURL = (\n opts: TCreateYoutubeLinkOptions,\n): string | null => {\n const {\n videoURL,\n start,\n end,\n embed = false,\n short = false,\n useFragment = false,\n autoplay,\n controls,\n rel,\n loop,\n mute,\n modestbranding,\n origin,\n playlist,\n params = {},\n } = opts\n\n const videoId = extractYouTubeId(videoURL)\n if (!videoId) return null\n\n const startSec = formatHMSToSeconds(start)\n const endSec = formatHMSToSeconds(end)\n\n // base url\n const base = embed\n ? `https://www.youtube.com/embed/${videoId}`\n : short\n ? `https://youtu.be/${videoId}`\n : \"https://www.youtube.com/watch\"\n\n const search = new URLSearchParams()\n\n // Add video ID for watch URLs\n if (!embed && !short) {\n search.set(\"v\", videoId)\n }\n\n // Standard param names for watch/embed\n if (!useFragment) {\n if (startSec != null) {\n // youtu.be historically uses \"t\" as a query param, but \"start\" is widely supported.\n // Use \"t\" for short links, otherwise \"start\".\n search.set(short ? \"t\" : \"start\", String(startSec))\n }\n if (endSec != null) {\n search.set(\"end\", String(endSec))\n }\n }\n\n // embed / player related params\n if (typeof autoplay !== \"undefined\")\n search.set(\"autoplay\", autoplay ? \"1\" : \"0\")\n if (typeof controls !== \"undefined\") search.set(\"controls\", String(controls))\n if (typeof rel !== \"undefined\") search.set(\"rel\", String(rel))\n if (typeof modestbranding !== \"undefined\")\n search.set(\"modestbranding\", String(modestbranding))\n if (typeof origin !== \"undefined\") search.set(\"origin\", origin)\n if (typeof mute !== \"undefined\") search.set(\"mute\", mute ? \"1\" : \"0\")\n\n // loop requires playlist param when embedding a single video\n if (loop) {\n search.set(\"loop\", \"1\")\n if (playlist) {\n search.set(\"playlist\", playlist)\n } else if (embed) {\n // for embed+loop, YouTube expects &playlist=VIDEO_ID\n search.set(\"playlist\", videoId)\n }\n } else if (playlist) {\n search.set(\"playlist\", playlist)\n }\n\n // merge custom params (allow overriding)\n Object.entries(params).forEach(([k, v]) => {\n if (v === false) search.set(k, \"0\")\n else if (v === true) search.set(k, \"1\")\n else search.set(k, String(v))\n })\n\n const qs = search.toString() ? `?${search.toString()}` : \"\"\n\n // fragment handling (e.g. #t=1m2s)\n let fragment = \"\"\n if (useFragment && startSec != null) {\n fragment = `#t=${formatSecondsToFragment(startSec)}`\n }\n\n // For short links, people often prefer the short host and start as query or fragment.\n if (short) {\n // prefer fragment if requested, otherwise use search params (t)\n return `${base}${qs}${fragment}`\n }\n\n // watch/embed links\n return `${base}${qs}${fragment}`\n}\n","export async function validateYoutubeLink(videoUrl: string): Promise<boolean> {\n const { extractYouTubeId } = await import(\"./extract-youtube-video-id\")\n const videoId = extractYouTubeId(videoUrl)\n if (!videoId) return false\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 true\n } catch {\n // ignore and try next thumbnail\n }\n }\n\n // Fallback: try oEmbed endpoint (may be subject to CORS in some environments)\n try {\n const watchUrl = `https://www.youtube.com/watch?v=${encodeURIComponent(videoId)}`\n const oembedUrl = `https://www.youtube.com/oembed?url=${encodeURIComponent(\n watchUrl,\n )}&format=json`\n const res = await fetch(oembedUrl, { method: \"GET\" })\n return res.ok\n } catch {\n return false\n }\n}\n","type TYtThumbnail = {\n url: string\n width?: number\n height?: number\n}\n\ntype TYtTextField = {\n simpleText?: string\n runs?: { text?: string }[]\n}\n\ntype TYtPlayerResponse = {\n videoDetails?: {\n videoId?: string\n title?: string\n author?: string\n channelId?: string\n shortDescription?: string\n lengthSeconds?: string\n viewCount?: string\n keywords?: string[]\n isLiveContent?: boolean\n thumbnail?: { thumbnails?: TYtThumbnail[] }\n }\n microformat?: {\n playerMicroformatRenderer?: {\n title?: TYtTextField\n description?: TYtTextField\n ownerChannelName?: string\n ownerProfileUrl?: string\n externalChannelId?: string\n publishDate?: string\n uploadDate?: string\n thumbnail?: { thumbnails?: TYtThumbnail[] }\n liveBroadcastDetails?: {\n isLiveNow?: boolean\n }\n }\n }\n}\n\ntype TYtPlayerMicroformat = TYtPlayerResponse[\"microformat\"] extends infer M\n ? M extends { playerMicroformatRenderer?: infer R }\n ? R\n : never\n : never\n\ntype TYtOEmbedResponse = {\n title?: string\n} & Partial<Record<\"author_name\" | \"author_url\" | \"thumbnail_url\", string>> &\n Partial<Record<\"thumbnail_width\" | \"thumbnail_height\", number>>\n\ntype TNoEmbedResponse = TYtOEmbedResponse & {\n description?: string\n} & Partial<Record<\"upload_date\", string>>\n\nexport type TYouTubeVideoInfo = {\n id: string\n url: string\n title: string\n channelTitle: string\n channelId?: string\n channelUrl?: string\n description?: string\n shortDescription?: string\n thumbnails: TYtThumbnail[]\n thumbnail?: string\n publishedAt?: string\n uploadedAt?: string\n keywords?: string[]\n viewCount?: number\n lengthSeconds?: number\n isLive?: boolean\n}\n\nconst videoInfoCache = new Map<string, Promise<TYouTubeVideoInfo | null>>()\n\nexport async function getYoutubeVideoInfo(\n videoUrl: string,\n): Promise<TYouTubeVideoInfo | null> {\n const { extractYouTubeId } = await import(\"./extract-youtube-video-id\")\n const videoId = extractYouTubeId(videoUrl)\n if (!videoId) return null\n\n const cached = videoInfoCache.get(videoId)\n if (cached) return cached\n\n const fetchPromise = fetchYoutubeVideoInfo(videoId)\n videoInfoCache.set(videoId, fetchPromise)\n\n const info = await fetchPromise\n if (!info) {\n videoInfoCache.delete(videoId)\n }\n\n return info\n}\n\nasync function fetchYoutubeVideoInfo(\n videoId: string,\n): Promise<TYouTubeVideoInfo | null> {\n const watchUrl = `https://www.youtube.com/watch?v=${encodeURIComponent(videoId)}`\n\n const htmlInfo = await fetchFromWatchPage(videoId, watchUrl)\n if (htmlInfo) return htmlInfo\n\n const oEmbedInfo = await fetchFromOEmbed(videoId, watchUrl)\n if (oEmbedInfo) return oEmbedInfo\n\n const noEmbedInfo = await fetchFromNoEmbed(videoId, watchUrl)\n if (noEmbedInfo) return noEmbedInfo\n\n return null\n}\n\nasync function fetchFromWatchPage(\n videoId: string,\n watchUrl: string,\n): Promise<TYouTubeVideoInfo | null> {\n try {\n const response = await fetch(watchUrl)\n if (!response.ok) {\n return null\n }\n\n const html = await response.text()\n const rawJson = extractJsonBlock(html, \"ytInitialPlayerResponse\")\n if (!rawJson) {\n return null\n }\n\n const data = JSON.parse(rawJson) as TYtPlayerResponse\n const details = data.videoDetails\n const microformat = data.microformat?.playerMicroformatRenderer\n\n if (!details && !microformat) {\n return null\n }\n\n const thumbnails = getThumbnails(details, microformat)\n const bestThumbnail = selectBestThumbnail(thumbnails)\n\n return {\n id: details?.videoId ?? videoId,\n url: watchUrl,\n title: details?.title ?? extractText(microformat?.title) ?? \"\",\n channelTitle: details?.author ?? microformat?.ownerChannelName ?? \"\",\n channelId: details?.channelId ?? microformat?.externalChannelId,\n channelUrl: microformat?.ownerProfileUrl,\n description:\n extractText(microformat?.description) ?? details?.shortDescription,\n shortDescription: details?.shortDescription,\n thumbnails,\n thumbnail: bestThumbnail?.url,\n publishedAt: microformat?.publishDate ?? microformat?.uploadDate,\n uploadedAt: microformat?.uploadDate,\n keywords: details?.keywords,\n viewCount: parseNumber(details?.viewCount),\n lengthSeconds: parseNumber(details?.lengthSeconds),\n isLive:\n details?.isLiveContent ?? microformat?.liveBroadcastDetails?.isLiveNow,\n }\n } catch {\n return null\n }\n}\n\nasync function fetchFromOEmbed(\n videoId: string,\n watchUrl: string,\n): Promise<TYouTubeVideoInfo | null> {\n try {\n const oEmbedUrl = `https://www.youtube.com/oembed?url=${encodeURIComponent(\n watchUrl,\n )}&format=json`\n const response = await fetch(oEmbedUrl)\n if (!response.ok) {\n return null\n }\n\n const data = (await response.json()) as TYtOEmbedResponse\n if (!data?.title || !data?.author_name) {\n return null\n }\n\n const thumbnails = createThumbnailList(\n data.thumbnail_url,\n data.thumbnail_width,\n data.thumbnail_height,\n )\n\n return {\n id: videoId,\n url: watchUrl,\n title: data.title,\n channelTitle: data.author_name,\n channelUrl: data.author_url,\n thumbnails,\n thumbnail: thumbnails[0]?.url,\n description: undefined,\n shortDescription: undefined,\n publishedAt: undefined,\n uploadedAt: undefined,\n keywords: undefined,\n viewCount: undefined,\n lengthSeconds: undefined,\n isLive: undefined,\n }\n } catch {\n return null\n }\n}\n\nasync function fetchFromNoEmbed(\n videoId: string,\n watchUrl: string,\n): Promise<TYouTubeVideoInfo | null> {\n try {\n const noEmbedUrl = `https://noembed.com/embed?url=${encodeURIComponent(\n watchUrl,\n )}`\n const response = await fetch(noEmbedUrl)\n if (!response.ok) {\n return null\n }\n\n const data = (await response.json()) as TNoEmbedResponse\n if (!data?.title || !data?.author_name) {\n return null\n }\n\n const thumbnails = createThumbnailList(\n data.thumbnail_url,\n data.thumbnail_width,\n data.thumbnail_height,\n )\n\n return {\n id: videoId,\n url: watchUrl,\n title: data.title,\n channelTitle: data.author_name,\n channelUrl: data.author_url,\n description: data.description,\n shortDescription: data.description,\n thumbnails,\n thumbnail: thumbnails[0]?.url,\n publishedAt: data.upload_date,\n uploadedAt: data.upload_date,\n keywords: undefined,\n viewCount: undefined,\n lengthSeconds: undefined,\n isLive: undefined,\n }\n } catch {\n return null\n }\n}\n\nfunction extractJsonBlock(html: string, marker: string): string | null {\n const markerIndex = html.indexOf(marker)\n if (markerIndex === -1) return null\n\n const jsonStart = html.indexOf(\"{\", markerIndex)\n if (jsonStart === -1) return null\n\n let depth = 0\n for (let i = jsonStart; i < html.length; i++) {\n const char = html[i]\n if (char === \"{\") {\n depth += 1\n } else if (char === \"}\") {\n depth -= 1\n }\n\n if (depth === 0) {\n return html.slice(jsonStart, i + 1)\n }\n }\n\n return null\n}\n\nfunction getThumbnails(\n details: TYtPlayerResponse[\"videoDetails\"] | undefined,\n microformat: TYtPlayerMicroformat | undefined,\n): TYtThumbnail[] {\n if (details?.thumbnail?.thumbnails?.length) {\n return details.thumbnail.thumbnails\n }\n\n return microformat?.thumbnail?.thumbnails ?? []\n}\n\nfunction selectBestThumbnail(\n thumbnails: TYtThumbnail[],\n): TYtThumbnail | undefined {\n if (!thumbnails.length) return undefined\n\n return thumbnails.reduce((best, current) => {\n if (!best) return current\n if (!best.width) return current\n if (!current.width) return best\n return current.width > best.width ? current : best\n })\n}\n\nfunction extractText(field?: TYtTextField): string | undefined {\n if (!field) return undefined\n if (field.simpleText) return field.simpleText\n if (field.runs?.length) {\n return field.runs.map((run) => run.text ?? \"\").join(\"\")\n }\n\n return undefined\n}\n\nfunction parseNumber(value?: string): number | undefined {\n if (value === undefined) return undefined\n const parsed = Number(value)\n return Number.isNaN(parsed) ? undefined : parsed\n}\n\nfunction createThumbnailList(\n url?: string,\n width?: number,\n height?: number,\n): TYtThumbnail[] {\n if (!url) return []\n return [{ url, width, height }]\n}\n"]}
@@ -0,0 +1,4 @@
1
+ 'use strict';
2
+
3
+ //# sourceMappingURL=chunk-6TWPZ6LL.cjs.map
4
+ //# sourceMappingURL=chunk-6TWPZ6LL.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-6TWPZ6LL.cjs"}
@@ -0,0 +1,96 @@
1
+ // src/files/compress-image.ts
2
+ function convertToWebp(filename) {
3
+ const lastDotIndex = filename.lastIndexOf(".");
4
+ if (lastDotIndex === -1) {
5
+ return `${filename}.webp`;
6
+ }
7
+ return `${filename.substring(0, lastDotIndex)}.webp`;
8
+ }
9
+ function compressImage({
10
+ file,
11
+ maxWidth = Number.POSITIVE_INFINITY,
12
+ maxHeight = Number.POSITIVE_INFINITY,
13
+ quality = 1,
14
+ allowedFileTypes = ["image/jpg", "image/jpeg", "image/png", "image/webp"]
15
+ }) {
16
+ if (!allowedFileTypes.includes(file.type)) {
17
+ throw new Error("Image format not supported");
18
+ }
19
+ return new Promise((resolve, reject) => {
20
+ const reader = new FileReader();
21
+ reader.onload = (event) => {
22
+ var _a;
23
+ const compressed = new Image();
24
+ compressed.onload = () => {
25
+ const canvas = document.createElement("canvas");
26
+ let width = compressed.width;
27
+ let height = compressed.height;
28
+ if (width > height) {
29
+ if (width > maxWidth) {
30
+ height *= maxWidth / width;
31
+ width = maxWidth;
32
+ }
33
+ } else {
34
+ if (height > maxHeight) {
35
+ width *= maxHeight / height;
36
+ height = maxHeight;
37
+ }
38
+ }
39
+ canvas.width = width;
40
+ canvas.height = height;
41
+ const context = canvas.getContext("2d");
42
+ if (!context) {
43
+ reject(new Error("Failed to get canvas context"));
44
+ return;
45
+ }
46
+ context.drawImage(compressed, 0, 0, width, height);
47
+ canvas.toBlob(
48
+ (blob) => {
49
+ if (!blob) {
50
+ reject(new Error("Failed to compress image."));
51
+ return;
52
+ }
53
+ const compressedFile = new File([blob], convertToWebp(file.name), {
54
+ type: "image/webp",
55
+ lastModified: Date.now()
56
+ });
57
+ resolve(compressedFile);
58
+ },
59
+ "image/webp",
60
+ quality
61
+ );
62
+ };
63
+ compressed.src = (_a = event.target) == null ? void 0 : _a.result;
64
+ };
65
+ reader.readAsDataURL(file);
66
+ });
67
+ }
68
+
69
+ // src/files/download-url.ts
70
+ var downloadUrl = async (url) => {
71
+ try {
72
+ const urlObj = new URL(url);
73
+ const pathname = urlObj.pathname;
74
+ const segments = pathname.split("/").filter((segment) => segment.length > 0);
75
+ const filename = segments.length > 0 ? segments[segments.length - 1] : null;
76
+ if (!filename || !filename.includes(".")) {
77
+ throw new Error("URL does not contain a valid filename");
78
+ }
79
+ const response = await fetch(url, { mode: "cors" });
80
+ const blob = await response.blob();
81
+ const link = document.createElement("a");
82
+ link.href = window.URL.createObjectURL(blob);
83
+ link.download = filename;
84
+ document.body.appendChild(link);
85
+ link.click();
86
+ document.body.removeChild(link);
87
+ return true;
88
+ } catch (error) {
89
+ console.error("Error downloading the file", error);
90
+ return false;
91
+ }
92
+ };
93
+
94
+ export { compressImage, downloadUrl };
95
+ //# sourceMappingURL=chunk-AQZBHMTO.js.map
96
+ //# sourceMappingURL=chunk-AQZBHMTO.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/files/compress-image.ts","../src/files/download-url.ts"],"names":[],"mappings":"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","file":"chunk-AQZBHMTO.js","sourcesContent":["interface ICompressImageParams {\n file: File\n maxWidth?: number\n maxHeight?: number\n quality?: number\n allowedFileTypes?: string[]\n}\n\nfunction convertToWebp(filename: string): string {\n const lastDotIndex = filename.lastIndexOf(\".\")\n\n if (lastDotIndex === -1) {\n return `${filename}.webp`\n }\n\n return `${filename.substring(0, lastDotIndex)}.webp`\n}\n\nexport function compressImage({\n file,\n maxWidth = Number.POSITIVE_INFINITY,\n maxHeight = Number.POSITIVE_INFINITY,\n quality = 1,\n allowedFileTypes = [\"image/jpg\", \"image/jpeg\", \"image/png\", \"image/webp\"],\n}: ICompressImageParams) {\n if (!allowedFileTypes.includes(file.type)) {\n throw new Error(\"Image format not supported\")\n }\n\n return new Promise<File>((resolve, reject) => {\n const reader = new FileReader()\n\n reader.onload = (event) => {\n const compressed = new Image()\n\n compressed.onload = () => {\n const canvas = document.createElement(\"canvas\")\n\n let width = compressed.width\n let height = compressed.height\n\n if (width > height) {\n if (width > maxWidth) {\n height *= maxWidth / width\n width = maxWidth\n }\n } else {\n if (height > maxHeight) {\n width *= maxHeight / height\n height = maxHeight\n }\n }\n\n canvas.width = width\n canvas.height = height\n\n const context = canvas.getContext(\"2d\")\n\n if (!context) {\n reject(new Error(\"Failed to get canvas context\"))\n return\n }\n\n context.drawImage(compressed, 0, 0, width, height)\n\n canvas.toBlob(\n (blob) => {\n if (!blob) {\n reject(new Error(\"Failed to compress image.\"))\n return\n }\n\n const compressedFile = new File([blob], convertToWebp(file.name), {\n type: \"image/webp\",\n lastModified: Date.now(),\n })\n\n resolve(compressedFile)\n },\n \"image/webp\",\n quality,\n )\n }\n\n compressed.src = event.target?.result as string\n }\n\n reader.readAsDataURL(file)\n })\n}\n","export const downloadUrl = async (url: string): Promise<boolean> => {\n try {\n const urlObj = new URL(url)\n const pathname = urlObj.pathname\n const segments = pathname.split(\"/\").filter((segment) => segment.length > 0)\n const filename = segments.length > 0 ? segments[segments.length - 1] : null\n\n if (!filename || !filename.includes(\".\")) {\n throw new Error(\"URL does not contain a valid filename\")\n }\n\n const response = await fetch(url, { mode: \"cors\" })\n const blob = await response.blob()\n\n const link = document.createElement(\"a\")\n link.href = window.URL.createObjectURL(blob)\n link.download = filename\n document.body.appendChild(link)\n link.click()\n document.body.removeChild(link)\n return true\n } catch (error) {\n console.error(\"Error downloading the file\", error)\n return false\n }\n}\n"]}
@@ -0,0 +1,29 @@
1
+ // src/youtube/extract-youtube-video-id.ts
2
+ function extractYouTubeId(urlString) {
3
+ if (!urlString) return null;
4
+ try {
5
+ const url = new URL(urlString);
6
+ const hostname = url.hostname.toLowerCase();
7
+ const pathname = url.pathname;
8
+ if (hostname.includes("youtu.be")) {
9
+ const id = pathname.replace(/^\/+/, "").split(/[?&#]/)[0];
10
+ return id || null;
11
+ }
12
+ if (hostname.includes("youtube.com")) {
13
+ if (url.searchParams.has("v")) {
14
+ return url.searchParams.get("v");
15
+ }
16
+ const parts = pathname.split("/").filter(Boolean);
17
+ const last = parts[parts.length - 1];
18
+ if (last) return last.split(/[?&#]/)[0] || null;
19
+ }
20
+ } catch (e) {
21
+ }
22
+ const regex = /(?:v=|\/embed\/|\/shorts\/|youtu\.be\/)([0-9A-Za-z_-]{6,})/i;
23
+ const match = urlString.match(regex);
24
+ return match ? match[1] : null;
25
+ }
26
+
27
+ export { extractYouTubeId };
28
+ //# sourceMappingURL=chunk-ATWN4SRX.js.map
29
+ //# sourceMappingURL=chunk-ATWN4SRX.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/youtube/extract-youtube-video-id.ts"],"names":[],"mappings":";AAAO,SAAS,iBAAiB,SAAA,EAAyC;AACxE,EAAA,IAAI,CAAC,WAAW,OAAO,IAAA;AAEvB,EAAA,IAAI;AACF,IAAA,MAAM,GAAA,GAAM,IAAI,GAAA,CAAI,SAAS,CAAA;AAE7B,IAAA,MAAM,QAAA,GAAW,GAAA,CAAI,QAAA,CAAS,WAAA,EAAY;AAC1C,IAAA,MAAM,WAAW,GAAA,CAAI,QAAA;AAErB,IAAA,IAAI,QAAA,CAAS,QAAA,CAAS,UAAU,CAAA,EAAG;AACjC,MAAA,MAAM,EAAA,GAAK,SAAS,OAAA,CAAQ,MAAA,EAAQ,EAAE,CAAA,CAAE,KAAA,CAAM,OAAO,CAAA,CAAE,CAAC,CAAA;AACxD,MAAA,OAAO,EAAA,IAAM,IAAA;AAAA,IACf;AAEA,IAAA,IAAI,QAAA,CAAS,QAAA,CAAS,aAAa,CAAA,EAAG;AACpC,MAAA,IAAI,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA,EAAG;AAC7B,QAAA,OAAO,GAAA,CAAI,YAAA,CAAa,GAAA,CAAI,GAAG,CAAA;AAAA,MACjC;AAEA,MAAA,MAAM,QAAQ,QAAA,CAAS,KAAA,CAAM,GAAG,CAAA,CAAE,OAAO,OAAO,CAAA;AAChD,MAAA,MAAM,IAAA,GAAO,KAAA,CAAM,KAAA,CAAM,MAAA,GAAS,CAAC,CAAA;AACnC,MAAA,IAAI,MAAM,OAAO,IAAA,CAAK,MAAM,OAAO,CAAA,CAAE,CAAC,CAAA,IAAK,IAAA;AAAA,IAC7C;AAAA,EACF,CAAA,CAAA,OAAQ,CAAA,EAAA;AAAA,EAAC;AAET,EAAA,MAAM,KAAA,GAAQ,6DAAA;AACd,EAAA,MAAM,KAAA,GAAQ,SAAA,CAAU,KAAA,CAAM,KAAK,CAAA;AACnC,EAAA,OAAO,KAAA,GAAQ,KAAA,CAAM,CAAC,CAAA,GAAI,IAAA;AAC5B","file":"chunk-ATWN4SRX.js","sourcesContent":["export function extractYouTubeId(urlString: string | null): string | null {\n if (!urlString) return null\n\n try {\n const url = new URL(urlString)\n\n const hostname = url.hostname.toLowerCase()\n const pathname = url.pathname\n\n if (hostname.includes(\"youtu.be\")) {\n const id = pathname.replace(/^\\/+/, \"\").split(/[?&#]/)[0]\n return id || null\n }\n\n if (hostname.includes(\"youtube.com\")) {\n if (url.searchParams.has(\"v\")) {\n return url.searchParams.get(\"v\")\n }\n\n const parts = pathname.split(\"/\").filter(Boolean)\n const last = parts[parts.length - 1]\n if (last) return last.split(/[?&#]/)[0] || null\n }\n } catch {}\n\n const regex = /(?:v=|\\/embed\\/|\\/shorts\\/|youtu\\.be\\/)([0-9A-Za-z_-]{6,})/i\n const match = urlString.match(regex)\n return match ? match[1] : null\n}\n"]}
@@ -0,0 +1,20 @@
1
+ 'use strict';
2
+
3
+ // src/files/format-bytes.ts
4
+ function formatBytes(bytes) {
5
+ if (bytes < 0) {
6
+ throw new Error("Size in bytes cannot be negative");
7
+ }
8
+ const units = ["B", "KB", "MB", "GB", "TB", "PB"];
9
+ let size = bytes;
10
+ let index = 0;
11
+ while (size >= 1024 && index < units.length - 1) {
12
+ size /= 1024;
13
+ index++;
14
+ }
15
+ return `${size.toFixed(2)} ${units[index]}`;
16
+ }
17
+
18
+ exports.formatBytes = formatBytes;
19
+ //# sourceMappingURL=chunk-GRSF4RY2.cjs.map
20
+ //# sourceMappingURL=chunk-GRSF4RY2.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/files/format-bytes.ts"],"names":[],"mappings":";;;AAAO,SAAS,YAAY,KAAA,EAAuB;AACjD,EAAA,IAAI,QAAQ,CAAA,EAAG;AACb,IAAA,MAAM,IAAI,MAAM,kCAAkC,CAAA;AAAA,EACpD;AAEA,EAAA,MAAM,QAAQ,CAAC,GAAA,EAAK,MAAM,IAAA,EAAM,IAAA,EAAM,MAAM,IAAI,CAAA;AAChD,EAAA,IAAI,IAAA,GAAO,KAAA;AACX,EAAA,IAAI,KAAA,GAAQ,CAAA;AAEZ,EAAA,OAAO,IAAA,IAAQ,IAAA,IAAQ,KAAA,GAAQ,KAAA,CAAM,SAAS,CAAA,EAAG;AAC/C,IAAA,IAAA,IAAQ,IAAA;AACR,IAAA,KAAA,EAAA;AAAA,EACF;AAEA,EAAA,OAAO,CAAA,EAAG,KAAK,OAAA,CAAQ,CAAC,CAAC,CAAA,CAAA,EAAI,KAAA,CAAM,KAAK,CAAC,CAAA,CAAA;AAC3C","file":"chunk-GRSF4RY2.cjs","sourcesContent":["export function formatBytes(bytes: number): string {\n if (bytes < 0) {\n throw new Error(\"Size in bytes cannot be negative\")\n }\n\n const units = [\"B\", \"KB\", \"MB\", \"GB\", \"TB\", \"PB\"]\n let size = bytes\n let index = 0\n\n while (size >= 1024 && index < units.length - 1) {\n size /= 1024\n index++\n }\n\n return `${size.toFixed(2)} ${units[index]}`\n}\n"]}
@@ -0,0 +1,70 @@
1
+ 'use strict';
2
+
3
+ // src/function/debounce.ts
4
+ function debounce(fn, delay) {
5
+ if (typeof fn !== "function") {
6
+ throw new Error("First argument must be a function");
7
+ }
8
+ if (typeof delay !== "number" || delay < 0) {
9
+ throw new Error("Delay must be a non-negative number");
10
+ }
11
+ let timeoutId;
12
+ return function(...args) {
13
+ if (timeoutId) {
14
+ clearTimeout(timeoutId);
15
+ }
16
+ timeoutId = setTimeout(() => fn.apply(this, args), delay);
17
+ };
18
+ }
19
+
20
+ // src/function/throttle.ts
21
+ function throttle(fn, delay) {
22
+ if (typeof fn !== "function") {
23
+ throw new Error("First argument must be a function");
24
+ }
25
+ if (typeof delay !== "number" || delay < 0) {
26
+ throw new Error("Delay must be a non-negative number");
27
+ }
28
+ let lastCall = 0;
29
+ let timeoutId;
30
+ return function(...args) {
31
+ const now = Date.now();
32
+ if (now - lastCall >= delay) {
33
+ lastCall = now;
34
+ fn.apply(this, args);
35
+ } else {
36
+ if (timeoutId) {
37
+ clearTimeout(timeoutId);
38
+ }
39
+ timeoutId = setTimeout(
40
+ () => {
41
+ lastCall = Date.now();
42
+ fn.apply(this, args);
43
+ },
44
+ delay - (now - lastCall)
45
+ );
46
+ }
47
+ };
48
+ }
49
+
50
+ // src/function/try-catch.ts
51
+ async function tryCatch(fn, defaultData) {
52
+ try {
53
+ const data = await (typeof fn === "function" ? fn() : fn);
54
+ return {
55
+ data,
56
+ error: null
57
+ };
58
+ } catch (error) {
59
+ return {
60
+ data: defaultData != null ? defaultData : null,
61
+ error
62
+ };
63
+ }
64
+ }
65
+
66
+ exports.debounce = debounce;
67
+ exports.throttle = throttle;
68
+ exports.tryCatch = tryCatch;
69
+ //# sourceMappingURL=chunk-GX5E5B4L.cjs.map
70
+ //# sourceMappingURL=chunk-GX5E5B4L.cjs.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-GX5E5B4L.cjs","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"]}