@tanwan/utils 1.0.0 → 1.2.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 (425) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/dist/addClass.cjs +19 -0
  3. package/dist/addClass.d.cts +16 -0
  4. package/dist/addClass.d.ts +17 -0
  5. package/dist/addClass.js +19 -0
  6. package/dist/{string/camelCase.cjs → camelCase.cjs} +0 -1
  7. package/dist/{string/camelCase.d.cts → camelCase.d.cts} +1 -2
  8. package/dist/{string/camelCase.d.ts → camelCase.d.ts} +1 -2
  9. package/dist/{string/camelCase.js → camelCase.js} +0 -3
  10. package/dist/{string/capitalize.cjs → capitalize.cjs} +1 -1
  11. package/dist/{string/capitalize.d.cts → capitalize.d.cts} +2 -3
  12. package/dist/{string/capitalize.d.ts → capitalize.d.ts} +2 -3
  13. package/dist/{string/capitalize.js → capitalize.js} +1 -3
  14. package/dist/{array/chunk.cjs → chunk.cjs} +1 -1
  15. package/dist/{array/chunk.d.cts → chunk.d.cts} +2 -3
  16. package/dist/{array/chunk.d.ts → chunk.d.ts} +2 -3
  17. package/dist/{array/chunk.js → chunk.js} +1 -3
  18. package/dist/{number/clamp.cjs → clamp.cjs} +1 -1
  19. package/dist/{number/clamp.d.cts → clamp.d.cts} +2 -3
  20. package/dist/{number/clamp.d.ts → clamp.d.ts} +2 -3
  21. package/dist/{number/clamp.js → clamp.js} +1 -3
  22. package/dist/convertCurrencyToChinese.cjs +56 -0
  23. package/dist/convertCurrencyToChinese.d.cts +18 -0
  24. package/dist/convertCurrencyToChinese.d.ts +19 -0
  25. package/dist/convertCurrencyToChinese.js +56 -0
  26. package/dist/copyToClipboard.cjs +38 -0
  27. package/dist/copyToClipboard.d.cts +17 -0
  28. package/dist/copyToClipboard.d.ts +18 -0
  29. package/dist/copyToClipboard.js +38 -0
  30. package/dist/createElement.cjs +27 -0
  31. package/dist/createElement.d.cts +21 -0
  32. package/dist/createElement.d.ts +22 -0
  33. package/dist/createElement.js +27 -0
  34. package/dist/{function/debounce.cjs → debounce.cjs} +1 -1
  35. package/dist/{function/debounce.d.cts → debounce.d.cts} +2 -3
  36. package/dist/{function/debounce.d.ts → debounce.d.ts} +2 -3
  37. package/dist/{function/debounce.js → debounce.js} +1 -3
  38. package/dist/debounceSubmit.cjs +34 -0
  39. package/dist/debounceSubmit.d.cts +22 -0
  40. package/dist/debounceSubmit.d.ts +23 -0
  41. package/dist/debounceSubmit.js +34 -0
  42. package/dist/decodeBase64.cjs +19 -0
  43. package/dist/decodeBase64.d.cts +16 -0
  44. package/dist/decodeBase64.d.ts +17 -0
  45. package/dist/decodeBase64.js +19 -0
  46. package/dist/{base/deepClone.cjs → deepClone.cjs} +3 -3
  47. package/dist/{base/deepClone.d.cts → deepClone.d.cts} +2 -3
  48. package/dist/{base/deepClone.d.ts → deepClone.d.ts} +2 -3
  49. package/dist/{base/deepClone.js → deepClone.js} +1 -3
  50. package/dist/deepMerge.cjs +39 -0
  51. package/dist/deepMerge.d.cts +25 -0
  52. package/dist/deepMerge.d.ts +26 -0
  53. package/dist/deepMerge.js +39 -0
  54. package/dist/delay.cjs +8 -0
  55. package/dist/delay.d.cts +18 -0
  56. package/dist/delay.d.ts +19 -0
  57. package/dist/delay.js +8 -0
  58. package/dist/difference.cjs +24 -0
  59. package/dist/difference.d.cts +20 -0
  60. package/dist/difference.d.ts +21 -0
  61. package/dist/difference.js +24 -0
  62. package/dist/downloadFile.cjs +31 -0
  63. package/dist/downloadFile.d.cts +20 -0
  64. package/dist/downloadFile.d.ts +21 -0
  65. package/dist/downloadFile.js +31 -0
  66. package/dist/encodeBase64.cjs +20 -0
  67. package/dist/encodeBase64.d.cts +17 -0
  68. package/dist/encodeBase64.d.ts +18 -0
  69. package/dist/encodeBase64.js +20 -0
  70. package/dist/{array/flatten.cjs → flatten.cjs} +1 -1
  71. package/dist/{array/flatten.d.cts → flatten.d.cts} +2 -3
  72. package/dist/{array/flatten.d.ts → flatten.d.ts} +2 -3
  73. package/dist/{array/flatten.js → flatten.js} +1 -3
  74. package/dist/formatBankCard.cjs +19 -0
  75. package/dist/formatBankCard.d.cts +16 -0
  76. package/dist/formatBankCard.d.ts +17 -0
  77. package/dist/formatBankCard.js +19 -0
  78. package/dist/formatCurrency.cjs +7 -0
  79. package/dist/formatCurrency.d.cts +27 -0
  80. package/dist/formatCurrency.d.ts +28 -0
  81. package/dist/formatCurrency.js +7 -0
  82. package/dist/{date/formatDate.cjs → formatDate.cjs} +1 -1
  83. package/dist/{date/formatDate.d.cts → formatDate.d.cts} +2 -3
  84. package/dist/{date/formatDate.d.ts → formatDate.d.ts} +2 -3
  85. package/dist/{date/formatDate.js → formatDate.js} +1 -3
  86. package/dist/formatFileSize.cjs +33 -0
  87. package/dist/formatFileSize.d.cts +19 -0
  88. package/dist/formatFileSize.d.ts +20 -0
  89. package/dist/formatFileSize.js +33 -0
  90. package/dist/formatIdCard.cjs +21 -0
  91. package/dist/formatIdCard.d.cts +17 -0
  92. package/dist/formatIdCard.d.ts +18 -0
  93. package/dist/formatIdCard.js +21 -0
  94. package/dist/formatPhone.cjs +21 -0
  95. package/dist/formatPhone.d.cts +17 -0
  96. package/dist/formatPhone.d.ts +18 -0
  97. package/dist/formatPhone.js +21 -0
  98. package/dist/{number/formatThousands.cjs → formatThousands.cjs} +1 -1
  99. package/dist/{number/formatThousands.d.cts → formatThousands.d.cts} +2 -3
  100. package/dist/{number/formatThousands.d.ts → formatThousands.d.ts} +2 -3
  101. package/dist/{number/formatThousands.js → formatThousands.js} +1 -3
  102. package/dist/generateCode.cjs +29 -0
  103. package/dist/generateCode.d.cts +19 -0
  104. package/dist/generateCode.d.ts +20 -0
  105. package/dist/generateCode.js +29 -0
  106. package/dist/getAge.cjs +30 -0
  107. package/dist/getAge.d.cts +18 -0
  108. package/dist/getAge.d.ts +19 -0
  109. package/dist/getAge.js +30 -0
  110. package/dist/getByPath.cjs +29 -0
  111. package/dist/getByPath.d.cts +20 -0
  112. package/dist/getByPath.d.ts +21 -0
  113. package/dist/getByPath.js +29 -0
  114. package/dist/getCssVar.cjs +22 -0
  115. package/dist/getCssVar.d.cts +18 -0
  116. package/dist/getCssVar.d.ts +19 -0
  117. package/dist/getCssVar.js +22 -0
  118. package/dist/{date/getRelativeTime.cjs → getRelativeTime.cjs} +1 -1
  119. package/dist/{date/getRelativeTime.d.cts → getRelativeTime.d.cts} +2 -3
  120. package/dist/{date/getRelativeTime.d.ts → getRelativeTime.d.ts} +2 -3
  121. package/dist/{date/getRelativeTime.js → getRelativeTime.js} +1 -3
  122. package/dist/getScrollTop.cjs +28 -0
  123. package/dist/getScrollTop.d.cts +18 -0
  124. package/dist/getScrollTop.d.ts +19 -0
  125. package/dist/getScrollTop.js +28 -0
  126. package/dist/getStorage.cjs +27 -0
  127. package/dist/getStorage.d.cts +18 -0
  128. package/dist/getStorage.d.ts +19 -0
  129. package/dist/getStorage.js +27 -0
  130. package/dist/getStyle.cjs +20 -0
  131. package/dist/getStyle.d.cts +17 -0
  132. package/dist/getStyle.d.ts +18 -0
  133. package/dist/getStyle.js +20 -0
  134. package/dist/getTextWidth.cjs +26 -0
  135. package/dist/getTextWidth.d.cts +16 -0
  136. package/dist/getTextWidth.d.ts +17 -0
  137. package/dist/getTextWidth.js +26 -0
  138. package/dist/groupBy.cjs +36 -0
  139. package/dist/groupBy.d.cts +26 -0
  140. package/dist/groupBy.d.ts +27 -0
  141. package/dist/groupBy.js +36 -0
  142. package/dist/hasClass.cjs +19 -0
  143. package/dist/hasClass.d.cts +16 -0
  144. package/dist/hasClass.d.ts +17 -0
  145. package/dist/hasClass.js +19 -0
  146. package/dist/index.cjs +180 -36
  147. package/dist/index.d.cts +91 -19
  148. package/dist/index.d.ts +91 -19
  149. package/dist/index.iife.js +1 -1
  150. package/dist/index.js +91 -19
  151. package/dist/insertAfter.cjs +19 -0
  152. package/dist/insertAfter.d.cts +15 -0
  153. package/dist/insertAfter.d.ts +16 -0
  154. package/dist/insertAfter.js +19 -0
  155. package/dist/intersection.cjs +24 -0
  156. package/dist/intersection.d.cts +20 -0
  157. package/dist/intersection.d.ts +21 -0
  158. package/dist/intersection.js +24 -0
  159. package/dist/invert.cjs +21 -0
  160. package/dist/invert.d.cts +16 -0
  161. package/dist/invert.d.ts +17 -0
  162. package/dist/invert.js +21 -0
  163. package/dist/{base/isArray.cjs → isArray.cjs} +1 -1
  164. package/dist/{base/isArray.d.cts → isArray.d.cts} +2 -3
  165. package/dist/{base/isArray.d.ts → isArray.d.ts} +2 -3
  166. package/dist/{base/isArray.js → isArray.js} +1 -3
  167. package/dist/isBrowser.cjs +17 -0
  168. package/dist/isBrowser.d.cts +14 -0
  169. package/dist/isBrowser.d.ts +15 -0
  170. package/dist/isBrowser.js +17 -0
  171. package/dist/isDate.cjs +18 -0
  172. package/dist/isDate.d.cts +15 -0
  173. package/dist/isDate.d.ts +16 -0
  174. package/dist/isDate.js +18 -0
  175. package/dist/isEmpty.cjs +42 -0
  176. package/dist/isEmpty.d.cts +33 -0
  177. package/dist/isEmpty.d.ts +34 -0
  178. package/dist/isEmpty.js +42 -0
  179. package/dist/isFunction.cjs +19 -0
  180. package/dist/isFunction.d.cts +16 -0
  181. package/dist/isFunction.d.ts +17 -0
  182. package/dist/isFunction.js +19 -0
  183. package/dist/isInViewport.cjs +22 -0
  184. package/dist/isInViewport.d.cts +17 -0
  185. package/dist/isInViewport.d.ts +18 -0
  186. package/dist/isInViewport.js +22 -0
  187. package/dist/isNil.cjs +19 -0
  188. package/dist/isNil.d.cts +16 -0
  189. package/dist/isNil.d.ts +17 -0
  190. package/dist/isNil.js +19 -0
  191. package/dist/isNumber.cjs +19 -0
  192. package/dist/isNumber.d.cts +16 -0
  193. package/dist/isNumber.d.ts +17 -0
  194. package/dist/isNumber.js +19 -0
  195. package/dist/{base/isObject.cjs → isObject.cjs} +1 -1
  196. package/dist/{base/isObject.d.cts → isObject.d.cts} +2 -3
  197. package/dist/{base/isObject.d.ts → isObject.d.ts} +2 -3
  198. package/dist/{base/isObject.js → isObject.js} +1 -3
  199. package/dist/isPrimitive.cjs +21 -0
  200. package/dist/isPrimitive.d.cts +18 -0
  201. package/dist/isPrimitive.d.ts +19 -0
  202. package/dist/isPrimitive.js +21 -0
  203. package/dist/isPromise.cjs +18 -0
  204. package/dist/isPromise.d.cts +15 -0
  205. package/dist/isPromise.d.ts +16 -0
  206. package/dist/isPromise.js +18 -0
  207. package/dist/{base/isString.cjs → isString.cjs} +1 -1
  208. package/dist/{base/isString.d.cts → isString.d.cts} +2 -3
  209. package/dist/{base/isString.d.ts → isString.d.ts} +2 -3
  210. package/dist/{base/isString.js → isString.js} +1 -3
  211. package/dist/joinUrl.cjs +25 -0
  212. package/dist/joinUrl.d.cts +19 -0
  213. package/dist/joinUrl.d.ts +20 -0
  214. package/dist/joinUrl.js +25 -0
  215. package/dist/{string/kebabCase.d.cts → kebabCase.d.cts} +1 -2
  216. package/dist/{string/kebabCase.d.ts → kebabCase.d.ts} +1 -2
  217. package/dist/{string/kebabCase.js → kebabCase.js} +0 -2
  218. package/dist/lazyLoadImages.cjs +36 -0
  219. package/dist/lazyLoadImages.d.cts +19 -0
  220. package/dist/lazyLoadImages.d.ts +20 -0
  221. package/dist/lazyLoadImages.js +36 -0
  222. package/dist/listToTree.cjs +25 -0
  223. package/dist/listToTree.d.cts +32 -0
  224. package/dist/listToTree.d.ts +33 -0
  225. package/dist/listToTree.js +25 -0
  226. package/dist/mapValues.cjs +25 -0
  227. package/dist/mapValues.d.cts +20 -0
  228. package/dist/mapValues.d.ts +21 -0
  229. package/dist/mapValues.js +25 -0
  230. package/dist/maskString.cjs +28 -0
  231. package/dist/maskString.d.cts +24 -0
  232. package/dist/maskString.d.ts +25 -0
  233. package/dist/maskString.js +28 -0
  234. package/dist/memoize.cjs +32 -0
  235. package/dist/memoize.d.cts +22 -0
  236. package/dist/memoize.d.ts +23 -0
  237. package/dist/memoize.js +32 -0
  238. package/dist/off.cjs +22 -0
  239. package/dist/off.d.cts +19 -0
  240. package/dist/off.d.ts +20 -0
  241. package/dist/off.js +22 -0
  242. package/dist/omit.cjs +23 -0
  243. package/dist/omit.d.cts +17 -0
  244. package/dist/omit.d.ts +18 -0
  245. package/dist/omit.js +23 -0
  246. package/dist/on.cjs +21 -0
  247. package/dist/on.d.cts +18 -0
  248. package/dist/on.d.ts +19 -0
  249. package/dist/on.js +21 -0
  250. package/dist/once.cjs +31 -0
  251. package/dist/once.d.cts +20 -0
  252. package/dist/once.d.ts +21 -0
  253. package/dist/once.js +31 -0
  254. package/dist/parseQueryString.cjs +48 -0
  255. package/dist/parseQueryString.d.cts +21 -0
  256. package/dist/parseQueryString.d.ts +22 -0
  257. package/dist/parseQueryString.js +48 -0
  258. package/dist/pascalCase.cjs +18 -0
  259. package/dist/pascalCase.d.cts +15 -0
  260. package/dist/pascalCase.d.ts +16 -0
  261. package/dist/pascalCase.js +18 -0
  262. package/dist/pick.cjs +22 -0
  263. package/dist/pick.d.cts +17 -0
  264. package/dist/pick.d.ts +18 -0
  265. package/dist/pick.js +22 -0
  266. package/dist/{number/randomInt.cjs → randomInt.cjs} +1 -1
  267. package/dist/{number/randomInt.d.cts → randomInt.d.cts} +2 -3
  268. package/dist/{number/randomInt.d.ts → randomInt.d.ts} +2 -3
  269. package/dist/{number/randomInt.js → randomInt.js} +1 -3
  270. package/dist/range.cjs +27 -0
  271. package/dist/range.d.cts +20 -0
  272. package/dist/range.d.ts +21 -0
  273. package/dist/range.js +27 -0
  274. package/dist/removeClass.cjs +19 -0
  275. package/dist/removeClass.d.cts +16 -0
  276. package/dist/removeClass.d.ts +17 -0
  277. package/dist/removeClass.js +19 -0
  278. package/dist/removeElement.cjs +17 -0
  279. package/dist/removeElement.d.cts +14 -0
  280. package/dist/removeElement.d.ts +15 -0
  281. package/dist/removeElement.js +17 -0
  282. package/dist/removeStorage.cjs +19 -0
  283. package/dist/removeStorage.d.cts +14 -0
  284. package/dist/removeStorage.d.ts +15 -0
  285. package/dist/removeStorage.js +19 -0
  286. package/dist/retry.cjs +27 -0
  287. package/dist/retry.d.cts +17 -0
  288. package/dist/retry.d.ts +18 -0
  289. package/dist/retry.js +27 -0
  290. package/dist/sample.cjs +20 -0
  291. package/dist/sample.d.cts +16 -0
  292. package/dist/sample.d.ts +17 -0
  293. package/dist/sample.js +20 -0
  294. package/dist/scrollToElement.cjs +23 -0
  295. package/dist/scrollToElement.d.cts +16 -0
  296. package/dist/scrollToElement.d.ts +17 -0
  297. package/dist/scrollToElement.js +23 -0
  298. package/dist/setCssVar.cjs +22 -0
  299. package/dist/setCssVar.d.cts +18 -0
  300. package/dist/setCssVar.d.ts +19 -0
  301. package/dist/setCssVar.js +22 -0
  302. package/dist/setStorage.cjs +25 -0
  303. package/dist/setStorage.d.cts +17 -0
  304. package/dist/setStorage.d.ts +18 -0
  305. package/dist/setStorage.js +25 -0
  306. package/dist/setStyle.cjs +22 -0
  307. package/dist/setStyle.d.cts +19 -0
  308. package/dist/setStyle.d.ts +20 -0
  309. package/dist/setStyle.js +22 -0
  310. package/dist/{array/shuffle.cjs → shuffle.cjs} +1 -1
  311. package/dist/{array/shuffle.d.cts → shuffle.d.cts} +2 -3
  312. package/dist/{array/shuffle.d.ts → shuffle.d.ts} +2 -3
  313. package/dist/{array/shuffle.js → shuffle.js} +1 -3
  314. package/dist/snakeCase.cjs +18 -0
  315. package/dist/snakeCase.d.cts +15 -0
  316. package/dist/snakeCase.d.ts +16 -0
  317. package/dist/snakeCase.js +18 -0
  318. package/dist/sortBy.cjs +30 -0
  319. package/dist/sortBy.d.cts +20 -0
  320. package/dist/sortBy.d.ts +21 -0
  321. package/dist/sortBy.js +30 -0
  322. package/dist/stringifyQueryString.cjs +38 -0
  323. package/dist/stringifyQueryString.d.cts +21 -0
  324. package/dist/stringifyQueryString.d.ts +22 -0
  325. package/dist/stringifyQueryString.js +38 -0
  326. package/dist/{function/throttle.cjs → throttle.cjs} +1 -1
  327. package/dist/{function/throttle.d.cts → throttle.d.cts} +2 -3
  328. package/dist/{function/throttle.d.ts → throttle.d.ts} +2 -3
  329. package/dist/{function/throttle.js → throttle.js} +1 -3
  330. package/dist/toggleClass.cjs +22 -0
  331. package/dist/toggleClass.d.cts +19 -0
  332. package/dist/toggleClass.d.ts +20 -0
  333. package/dist/toggleClass.js +22 -0
  334. package/dist/treeFind.cjs +34 -0
  335. package/dist/treeFind.d.cts +25 -0
  336. package/dist/treeFind.d.ts +26 -0
  337. package/dist/treeFind.js +34 -0
  338. package/dist/treeToList.cjs +33 -0
  339. package/dist/treeToList.d.cts +24 -0
  340. package/dist/treeToList.d.ts +25 -0
  341. package/dist/treeToList.js +33 -0
  342. package/dist/truncate.cjs +23 -0
  343. package/dist/truncate.d.cts +19 -0
  344. package/dist/truncate.d.ts +20 -0
  345. package/dist/truncate.js +23 -0
  346. package/dist/uniqBy.cjs +30 -0
  347. package/dist/uniqBy.d.cts +20 -0
  348. package/dist/uniqBy.d.ts +21 -0
  349. package/dist/uniqBy.js +30 -0
  350. package/dist/{array/unique.cjs → unique.cjs} +1 -1
  351. package/dist/{array/unique.d.cts → unique.d.cts} +2 -3
  352. package/dist/{array/unique.d.ts → unique.d.ts} +2 -3
  353. package/dist/{array/unique.js → unique.js} +1 -3
  354. package/dist/uuid.cjs +23 -0
  355. package/dist/uuid.d.cts +16 -0
  356. package/dist/uuid.d.ts +17 -0
  357. package/dist/uuid.js +23 -0
  358. package/dist/validateEmail.cjs +19 -0
  359. package/dist/validateEmail.d.cts +16 -0
  360. package/dist/validateEmail.d.ts +17 -0
  361. package/dist/validateEmail.js +19 -0
  362. package/dist/validateIdCard.cjs +62 -0
  363. package/dist/validateIdCard.d.cts +15 -0
  364. package/dist/validateIdCard.d.ts +16 -0
  365. package/dist/validateIdCard.js +62 -0
  366. package/dist/validatePhone.cjs +19 -0
  367. package/dist/validatePhone.d.cts +16 -0
  368. package/dist/validatePhone.d.ts +17 -0
  369. package/dist/validatePhone.js +19 -0
  370. package/package.json +351 -58
  371. package/dist/array/chunk.d.cts.map +0 -1
  372. package/dist/array/chunk.d.ts.map +0 -1
  373. package/dist/array/chunk.js.map +0 -1
  374. package/dist/array/flatten.d.cts.map +0 -1
  375. package/dist/array/flatten.d.ts.map +0 -1
  376. package/dist/array/flatten.js.map +0 -1
  377. package/dist/array/shuffle.d.cts.map +0 -1
  378. package/dist/array/shuffle.d.ts.map +0 -1
  379. package/dist/array/shuffle.js.map +0 -1
  380. package/dist/array/unique.d.cts.map +0 -1
  381. package/dist/array/unique.d.ts.map +0 -1
  382. package/dist/array/unique.js.map +0 -1
  383. package/dist/base/deepClone.d.cts.map +0 -1
  384. package/dist/base/deepClone.d.ts.map +0 -1
  385. package/dist/base/deepClone.js.map +0 -1
  386. package/dist/base/isArray.d.cts.map +0 -1
  387. package/dist/base/isArray.d.ts.map +0 -1
  388. package/dist/base/isArray.js.map +0 -1
  389. package/dist/base/isObject.d.cts.map +0 -1
  390. package/dist/base/isObject.d.ts.map +0 -1
  391. package/dist/base/isObject.js.map +0 -1
  392. package/dist/base/isString.d.cts.map +0 -1
  393. package/dist/base/isString.d.ts.map +0 -1
  394. package/dist/base/isString.js.map +0 -1
  395. package/dist/date/formatDate.d.cts.map +0 -1
  396. package/dist/date/formatDate.d.ts.map +0 -1
  397. package/dist/date/formatDate.js.map +0 -1
  398. package/dist/date/getRelativeTime.d.cts.map +0 -1
  399. package/dist/date/getRelativeTime.d.ts.map +0 -1
  400. package/dist/date/getRelativeTime.js.map +0 -1
  401. package/dist/function/debounce.d.cts.map +0 -1
  402. package/dist/function/debounce.d.ts.map +0 -1
  403. package/dist/function/debounce.js.map +0 -1
  404. package/dist/function/throttle.d.cts.map +0 -1
  405. package/dist/function/throttle.d.ts.map +0 -1
  406. package/dist/function/throttle.js.map +0 -1
  407. package/dist/number/clamp.d.cts.map +0 -1
  408. package/dist/number/clamp.d.ts.map +0 -1
  409. package/dist/number/clamp.js.map +0 -1
  410. package/dist/number/formatThousands.d.cts.map +0 -1
  411. package/dist/number/formatThousands.d.ts.map +0 -1
  412. package/dist/number/formatThousands.js.map +0 -1
  413. package/dist/number/randomInt.d.cts.map +0 -1
  414. package/dist/number/randomInt.d.ts.map +0 -1
  415. package/dist/number/randomInt.js.map +0 -1
  416. package/dist/string/camelCase.d.cts.map +0 -1
  417. package/dist/string/camelCase.d.ts.map +0 -1
  418. package/dist/string/camelCase.js.map +0 -1
  419. package/dist/string/capitalize.d.cts.map +0 -1
  420. package/dist/string/capitalize.d.ts.map +0 -1
  421. package/dist/string/capitalize.js.map +0 -1
  422. package/dist/string/kebabCase.d.cts.map +0 -1
  423. package/dist/string/kebabCase.d.ts.map +0 -1
  424. package/dist/string/kebabCase.js.map +0 -1
  425. /package/dist/{string/kebabCase.cjs → kebabCase.cjs} +0 -0
@@ -0,0 +1,27 @@
1
+ //#region src/dom/createElement/index.ts
2
+ /**
3
+ * 快捷创建元素并设置属性
4
+ *
5
+ * @param tag - HTML 标签名
6
+ * @param attrs - 属性对象,如 `{ id: 'box', class: 'card' }`
7
+ * @param children - 子节点(文本、元素或元素数组)
8
+ * @returns 创建的 DOM 元素
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * import createElement from '@tanwan/utils/createElement'
13
+ * createElement('div', { class: 'card' }, 'Hello')
14
+ * createElement('ul', { id: 'list' },
15
+ * createElement('li', {}, 'Item 1'),
16
+ * createElement('li', {}, 'Item 2'),
17
+ * )
18
+ * ```
19
+ */
20
+ function createElement(tag, attrs = {}, ...children) {
21
+ const el = document.createElement(tag);
22
+ for (const key of Object.keys(attrs)) el.setAttribute(key, attrs[key]);
23
+ for (const child of children) el.appendChild(typeof child === "string" ? document.createTextNode(child) : child);
24
+ return el;
25
+ }
26
+ //#endregion
27
+ export { createElement as default };
@@ -3,7 +3,7 @@
3
3
  * 防抖函数
4
4
  * @example
5
5
  * ```ts
6
- * import debounce from '@tw/utils/debounce'
6
+ * import debounce from '@tanwan/utils/debounce'
7
7
  * const search = debounce((keyword: string) => {
8
8
  * console.log('搜索:', keyword)
9
9
  * }, 300)
@@ -3,12 +3,11 @@
3
3
  * 防抖函数
4
4
  * @example
5
5
  * ```ts
6
- * import debounce from '@tw/utils/debounce'
6
+ * import debounce from '@tanwan/utils/debounce'
7
7
  * const search = debounce((keyword: string) => {
8
8
  * console.log('搜索:', keyword)
9
9
  * }, 300)
10
10
  * ```
11
11
  */
12
12
  declare function debounce<T extends (...args: any[]) => any>(func: T, wait: number, immediate?: boolean): (...args: Parameters<T>) => void;
13
- export = debounce;
14
- //# sourceMappingURL=debounce.d.cts.map
13
+ export = debounce;
@@ -3,7 +3,7 @@
3
3
  * 防抖函数
4
4
  * @example
5
5
  * ```ts
6
- * import debounce from '@tw/utils/debounce'
6
+ * import debounce from '@tanwan/utils/debounce'
7
7
  * const search = debounce((keyword: string) => {
8
8
  * console.log('搜索:', keyword)
9
9
  * }, 300)
@@ -11,5 +11,4 @@
11
11
  */
12
12
  declare function debounce<T extends (...args: any[]) => any>(func: T, wait: number, immediate?: boolean): (...args: Parameters<T>) => void;
13
13
  //#endregion
14
- export { debounce as default };
15
- //# sourceMappingURL=debounce.d.ts.map
14
+ export { debounce as default };
@@ -3,7 +3,7 @@
3
3
  * 防抖函数
4
4
  * @example
5
5
  * ```ts
6
- * import debounce from '@tw/utils/debounce'
6
+ * import debounce from '@tanwan/utils/debounce'
7
7
  * const search = debounce((keyword: string) => {
8
8
  * console.log('搜索:', keyword)
9
9
  * }, 300)
@@ -27,5 +27,3 @@ function debounce(func, wait, immediate = false) {
27
27
  }
28
28
  //#endregion
29
29
  export { debounce as default };
30
-
31
- //# sourceMappingURL=debounce.js.map
@@ -0,0 +1,34 @@
1
+ //#region src/business/debounceSubmit/index.ts
2
+ /**
3
+ * 包装异步函数,防止重复提交
4
+ *
5
+ * 在函数执行期间,后续调用会被忽略直到第一次调用完成
6
+ *
7
+ * @param fn - 异步提交函数
8
+ * @returns 包装后的函数
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * import debounceSubmit from '@tanwan/utils/debounceSubmit'
13
+ * const submit = debounceSubmit(async (data: FormData) => {
14
+ * await fetch('/api/submit', { method: 'POST', body: data })
15
+ * })
16
+ *
17
+ * await submit(formData) // 第一次执行
18
+ * await submit(formData) // 忽略(上一次还在执行中)
19
+ * ```
20
+ */
21
+ function debounceSubmit(fn) {
22
+ let pending = false;
23
+ return (async (...args) => {
24
+ if (pending) return;
25
+ pending = true;
26
+ try {
27
+ return await fn(...args);
28
+ } finally {
29
+ pending = false;
30
+ }
31
+ });
32
+ }
33
+ //#endregion
34
+ module.exports = debounceSubmit;
@@ -0,0 +1,22 @@
1
+ //#region src/business/debounceSubmit/index.d.ts
2
+ /**
3
+ * 包装异步函数,防止重复提交
4
+ *
5
+ * 在函数执行期间,后续调用会被忽略直到第一次调用完成
6
+ *
7
+ * @param fn - 异步提交函数
8
+ * @returns 包装后的函数
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * import debounceSubmit from '@tanwan/utils/debounceSubmit'
13
+ * const submit = debounceSubmit(async (data: FormData) => {
14
+ * await fetch('/api/submit', { method: 'POST', body: data })
15
+ * })
16
+ *
17
+ * await submit(formData) // 第一次执行
18
+ * await submit(formData) // 忽略(上一次还在执行中)
19
+ * ```
20
+ */
21
+ declare function debounceSubmit<T extends (...args: unknown[]) => Promise<unknown>>(fn: T): T;
22
+ export = debounceSubmit;
@@ -0,0 +1,23 @@
1
+ //#region src/business/debounceSubmit/index.d.ts
2
+ /**
3
+ * 包装异步函数,防止重复提交
4
+ *
5
+ * 在函数执行期间,后续调用会被忽略直到第一次调用完成
6
+ *
7
+ * @param fn - 异步提交函数
8
+ * @returns 包装后的函数
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * import debounceSubmit from '@tanwan/utils/debounceSubmit'
13
+ * const submit = debounceSubmit(async (data: FormData) => {
14
+ * await fetch('/api/submit', { method: 'POST', body: data })
15
+ * })
16
+ *
17
+ * await submit(formData) // 第一次执行
18
+ * await submit(formData) // 忽略(上一次还在执行中)
19
+ * ```
20
+ */
21
+ declare function debounceSubmit<T extends (...args: unknown[]) => Promise<unknown>>(fn: T): T;
22
+ //#endregion
23
+ export { debounceSubmit as default };
@@ -0,0 +1,34 @@
1
+ //#region src/business/debounceSubmit/index.ts
2
+ /**
3
+ * 包装异步函数,防止重复提交
4
+ *
5
+ * 在函数执行期间,后续调用会被忽略直到第一次调用完成
6
+ *
7
+ * @param fn - 异步提交函数
8
+ * @returns 包装后的函数
9
+ *
10
+ * @example
11
+ * ```ts
12
+ * import debounceSubmit from '@tanwan/utils/debounceSubmit'
13
+ * const submit = debounceSubmit(async (data: FormData) => {
14
+ * await fetch('/api/submit', { method: 'POST', body: data })
15
+ * })
16
+ *
17
+ * await submit(formData) // 第一次执行
18
+ * await submit(formData) // 忽略(上一次还在执行中)
19
+ * ```
20
+ */
21
+ function debounceSubmit(fn) {
22
+ let pending = false;
23
+ return (async (...args) => {
24
+ if (pending) return;
25
+ pending = true;
26
+ try {
27
+ return await fn(...args);
28
+ } finally {
29
+ pending = false;
30
+ }
31
+ });
32
+ }
33
+ //#endregion
34
+ export { debounceSubmit as default };
@@ -0,0 +1,19 @@
1
+ //#region src/business/decodeBase64/index.ts
2
+ /**
3
+ * Base64 解码(支持中文)
4
+ *
5
+ * @param str - Base64 编码的字符串
6
+ * @returns 解码结果
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import { encodeBase64, decodeBase64 } from '@tanwan/utils'
11
+ * decodeBase64('SGVsbG8=') // 'Hello'
12
+ * decodeBase64('5L2g5aW9') // '你好'
13
+ * ```
14
+ */
15
+ function decodeBase64(str) {
16
+ return decodeURIComponent(escape(atob(str)));
17
+ }
18
+ //#endregion
19
+ module.exports = decodeBase64;
@@ -0,0 +1,16 @@
1
+ //#region src/business/decodeBase64/index.d.ts
2
+ /**
3
+ * Base64 解码(支持中文)
4
+ *
5
+ * @param str - Base64 编码的字符串
6
+ * @returns 解码结果
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import { encodeBase64, decodeBase64 } from '@tanwan/utils'
11
+ * decodeBase64('SGVsbG8=') // 'Hello'
12
+ * decodeBase64('5L2g5aW9') // '你好'
13
+ * ```
14
+ */
15
+ declare function decodeBase64(str: string): string;
16
+ export = decodeBase64;
@@ -0,0 +1,17 @@
1
+ //#region src/business/decodeBase64/index.d.ts
2
+ /**
3
+ * Base64 解码(支持中文)
4
+ *
5
+ * @param str - Base64 编码的字符串
6
+ * @returns 解码结果
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import { encodeBase64, decodeBase64 } from '@tanwan/utils'
11
+ * decodeBase64('SGVsbG8=') // 'Hello'
12
+ * decodeBase64('5L2g5aW9') // '你好'
13
+ * ```
14
+ */
15
+ declare function decodeBase64(str: string): string;
16
+ //#endregion
17
+ export { decodeBase64 as default };
@@ -0,0 +1,19 @@
1
+ //#region src/business/decodeBase64/index.ts
2
+ /**
3
+ * Base64 解码(支持中文)
4
+ *
5
+ * @param str - Base64 编码的字符串
6
+ * @returns 解码结果
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import { encodeBase64, decodeBase64 } from '@tanwan/utils'
11
+ * decodeBase64('SGVsbG8=') // 'Hello'
12
+ * decodeBase64('5L2g5aW9') // '你好'
13
+ * ```
14
+ */
15
+ function decodeBase64(str) {
16
+ return decodeURIComponent(escape(atob(str)));
17
+ }
18
+ //#endregion
19
+ export { decodeBase64 as default };
@@ -1,10 +1,10 @@
1
- const require_base_isObject = require("./isObject.cjs");
1
+ const require_isObject = require("./isObject.cjs");
2
2
  //#region src/base/deepClone/index.ts
3
3
  /**
4
4
  * 深拷贝变量
5
5
  * @example
6
6
  * ```ts
7
- * import deepClone from '@tw/utils/deepClone'
7
+ * import deepClone from '@tanwan/utils/deepClone'
8
8
  * const obj = { a: 1, b: { c: 2 } }
9
9
  * const clone = deepClone(obj)
10
10
  * clone.b.c = 3
@@ -36,7 +36,7 @@ function deepClone(v, cache = /* @__PURE__ */ new WeakMap()) {
36
36
  }
37
37
  if (v instanceof WeakMap) throw new Error("Cannot clone WeakMap");
38
38
  if (v instanceof WeakSet) throw new Error("Cannot clone WeakSet");
39
- if (require_base_isObject(v)) {
39
+ if (require_isObject(v)) {
40
40
  const cloned = {};
41
41
  cache.set(v, cloned);
42
42
  for (const key in v) if (Object.prototype.hasOwnProperty.call(v, key)) cloned[key] = deepClone(v[key], cache);
@@ -3,7 +3,7 @@
3
3
  * 深拷贝变量
4
4
  * @example
5
5
  * ```ts
6
- * import deepClone from '@tw/utils/deepClone'
6
+ * import deepClone from '@tanwan/utils/deepClone'
7
7
  * const obj = { a: 1, b: { c: 2 } }
8
8
  * const clone = deepClone(obj)
9
9
  * clone.b.c = 3
@@ -11,5 +11,4 @@
11
11
  * ```
12
12
  */
13
13
  declare function deepClone<T>(v: T, cache?: WeakMap<object, unknown>): T;
14
- export = deepClone;
15
- //# sourceMappingURL=deepClone.d.cts.map
14
+ export = deepClone;
@@ -3,7 +3,7 @@
3
3
  * 深拷贝变量
4
4
  * @example
5
5
  * ```ts
6
- * import deepClone from '@tw/utils/deepClone'
6
+ * import deepClone from '@tanwan/utils/deepClone'
7
7
  * const obj = { a: 1, b: { c: 2 } }
8
8
  * const clone = deepClone(obj)
9
9
  * clone.b.c = 3
@@ -12,5 +12,4 @@
12
12
  */
13
13
  declare function deepClone<T>(v: T, cache?: WeakMap<object, unknown>): T;
14
14
  //#endregion
15
- export { deepClone as default };
16
- //# sourceMappingURL=deepClone.d.ts.map
15
+ export { deepClone as default };
@@ -4,7 +4,7 @@ import isObject from "./isObject.js";
4
4
  * 深拷贝变量
5
5
  * @example
6
6
  * ```ts
7
- * import deepClone from '@tw/utils/deepClone'
7
+ * import deepClone from '@tanwan/utils/deepClone'
8
8
  * const obj = { a: 1, b: { c: 2 } }
9
9
  * const clone = deepClone(obj)
10
10
  * clone.b.c = 3
@@ -46,5 +46,3 @@ function deepClone(v, cache = /* @__PURE__ */ new WeakMap()) {
46
46
  }
47
47
  //#endregion
48
48
  export { deepClone as default };
49
-
50
- //# sourceMappingURL=deepClone.js.map
@@ -0,0 +1,39 @@
1
+ const require_isObject = require("./isObject.cjs");
2
+ //#region src/object/deepMerge/index.ts
3
+ /**
4
+ * 深度合并多个对象,返回新对象
5
+ *
6
+ * - 后面的对象会覆盖前面对象的同名属性
7
+ * - 嵌套对象会递归合并,数组和基本类型直接覆盖
8
+ *
9
+ * @param sources - 要合并的源对象列表
10
+ * @returns 合并后的新对象
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * import deepMerge from '@tanwan/utils/deepMerge'
15
+ * deepMerge({ a: 1 }, { b: 2 })
16
+ * // { a: 1, b: 2 }
17
+ *
18
+ * deepMerge({ a: { x: 1 } }, { a: { y: 2 } })
19
+ * // { a: { x: 1, y: 2 } }
20
+ *
21
+ * deepMerge({ a: [1] }, { a: [2] })
22
+ * // { a: [2] }
23
+ * ```
24
+ */
25
+ function deepMerge(...sources) {
26
+ const result = {};
27
+ for (const source of sources) {
28
+ if (!source) continue;
29
+ for (const key of Object.keys(source)) {
30
+ const sv = source[key];
31
+ const rv = result[key];
32
+ if (require_isObject(sv) && require_isObject(rv) && !Array.isArray(sv) && !Array.isArray(rv)) result[key] = deepMerge(rv, sv);
33
+ else result[key] = sv;
34
+ }
35
+ }
36
+ return result;
37
+ }
38
+ //#endregion
39
+ module.exports = deepMerge;
@@ -0,0 +1,25 @@
1
+ //#region src/object/deepMerge/index.d.ts
2
+ /**
3
+ * 深度合并多个对象,返回新对象
4
+ *
5
+ * - 后面的对象会覆盖前面对象的同名属性
6
+ * - 嵌套对象会递归合并,数组和基本类型直接覆盖
7
+ *
8
+ * @param sources - 要合并的源对象列表
9
+ * @returns 合并后的新对象
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * import deepMerge from '@tanwan/utils/deepMerge'
14
+ * deepMerge({ a: 1 }, { b: 2 })
15
+ * // { a: 1, b: 2 }
16
+ *
17
+ * deepMerge({ a: { x: 1 } }, { a: { y: 2 } })
18
+ * // { a: { x: 1, y: 2 } }
19
+ *
20
+ * deepMerge({ a: [1] }, { a: [2] })
21
+ * // { a: [2] }
22
+ * ```
23
+ */
24
+ declare function deepMerge<T extends Record<string, unknown>>(...sources: T[]): T;
25
+ export = deepMerge;
@@ -0,0 +1,26 @@
1
+ //#region src/object/deepMerge/index.d.ts
2
+ /**
3
+ * 深度合并多个对象,返回新对象
4
+ *
5
+ * - 后面的对象会覆盖前面对象的同名属性
6
+ * - 嵌套对象会递归合并,数组和基本类型直接覆盖
7
+ *
8
+ * @param sources - 要合并的源对象列表
9
+ * @returns 合并后的新对象
10
+ *
11
+ * @example
12
+ * ```ts
13
+ * import deepMerge from '@tanwan/utils/deepMerge'
14
+ * deepMerge({ a: 1 }, { b: 2 })
15
+ * // { a: 1, b: 2 }
16
+ *
17
+ * deepMerge({ a: { x: 1 } }, { a: { y: 2 } })
18
+ * // { a: { x: 1, y: 2 } }
19
+ *
20
+ * deepMerge({ a: [1] }, { a: [2] })
21
+ * // { a: [2] }
22
+ * ```
23
+ */
24
+ declare function deepMerge<T extends Record<string, unknown>>(...sources: T[]): T;
25
+ //#endregion
26
+ export { deepMerge as default };
@@ -0,0 +1,39 @@
1
+ import isObject from "./isObject.js";
2
+ //#region src/object/deepMerge/index.ts
3
+ /**
4
+ * 深度合并多个对象,返回新对象
5
+ *
6
+ * - 后面的对象会覆盖前面对象的同名属性
7
+ * - 嵌套对象会递归合并,数组和基本类型直接覆盖
8
+ *
9
+ * @param sources - 要合并的源对象列表
10
+ * @returns 合并后的新对象
11
+ *
12
+ * @example
13
+ * ```ts
14
+ * import deepMerge from '@tanwan/utils/deepMerge'
15
+ * deepMerge({ a: 1 }, { b: 2 })
16
+ * // { a: 1, b: 2 }
17
+ *
18
+ * deepMerge({ a: { x: 1 } }, { a: { y: 2 } })
19
+ * // { a: { x: 1, y: 2 } }
20
+ *
21
+ * deepMerge({ a: [1] }, { a: [2] })
22
+ * // { a: [2] }
23
+ * ```
24
+ */
25
+ function deepMerge(...sources) {
26
+ const result = {};
27
+ for (const source of sources) {
28
+ if (!source) continue;
29
+ for (const key of Object.keys(source)) {
30
+ const sv = source[key];
31
+ const rv = result[key];
32
+ if (isObject(sv) && isObject(rv) && !Array.isArray(sv) && !Array.isArray(rv)) result[key] = deepMerge(rv, sv);
33
+ else result[key] = sv;
34
+ }
35
+ }
36
+ return result;
37
+ }
38
+ //#endregion
39
+ export { deepMerge as default };
package/dist/delay.cjs ADDED
@@ -0,0 +1,8 @@
1
+ //#region src/function/delay/index.ts
2
+ function delay(ms = 0, value) {
3
+ return new Promise((resolve) => {
4
+ setTimeout(() => resolve(value), ms);
5
+ });
6
+ }
7
+ //#endregion
8
+ module.exports = delay;
@@ -0,0 +1,18 @@
1
+ //#region src/function/delay/index.d.ts
2
+ /**
3
+ * 返回一个在指定毫秒后 resolve 的 Promise
4
+ *
5
+ * @param ms - 延迟毫秒数,默认为 0
6
+ * @param value - 可选,resolve 时传递的值
7
+ * @returns 在延迟后 resolve 的 Promise
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * import delay from '@tanwan/utils/delay'
12
+ * await delay(1000) // 等待 1 秒后 resolve
13
+ * const result = await delay(500, 'done') // 500ms 后 resolve 'done'
14
+ * ```
15
+ */
16
+ declare function delay(ms?: number): Promise<void>;
17
+ declare function delay<T>(ms: number, value: T): Promise<T>;
18
+ export = delay;
@@ -0,0 +1,19 @@
1
+ //#region src/function/delay/index.d.ts
2
+ /**
3
+ * 返回一个在指定毫秒后 resolve 的 Promise
4
+ *
5
+ * @param ms - 延迟毫秒数,默认为 0
6
+ * @param value - 可选,resolve 时传递的值
7
+ * @returns 在延迟后 resolve 的 Promise
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * import delay from '@tanwan/utils/delay'
12
+ * await delay(1000) // 等待 1 秒后 resolve
13
+ * const result = await delay(500, 'done') // 500ms 后 resolve 'done'
14
+ * ```
15
+ */
16
+ declare function delay(ms?: number): Promise<void>;
17
+ declare function delay<T>(ms: number, value: T): Promise<T>;
18
+ //#endregion
19
+ export { delay as default };
package/dist/delay.js ADDED
@@ -0,0 +1,8 @@
1
+ //#region src/function/delay/index.ts
2
+ function delay(ms = 0, value) {
3
+ return new Promise((resolve) => {
4
+ setTimeout(() => resolve(value), ms);
5
+ });
6
+ }
7
+ //#endregion
8
+ export { delay as default };
@@ -0,0 +1,24 @@
1
+ //#region src/array/difference/index.ts
2
+ /**
3
+ * 计算两个数组的差集 —— 返回在 `source` 中但不在 `target` 中的元素
4
+ *
5
+ * @param source - 被减数组
6
+ * @param target - 要排除的元素数组
7
+ * @returns 差集新数组
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * import difference from '@tanwan/utils/difference'
12
+ * difference([1, 2, 3], [2])
13
+ * // [1, 3]
14
+ *
15
+ * difference(['a', 'b', 'c'], ['b', 'd'])
16
+ * // ['a', 'c']
17
+ * ```
18
+ */
19
+ function difference(source, target) {
20
+ const targetSet = new Set(target);
21
+ return source.filter((item) => !targetSet.has(item));
22
+ }
23
+ //#endregion
24
+ module.exports = difference;
@@ -0,0 +1,20 @@
1
+ //#region src/array/difference/index.d.ts
2
+ /**
3
+ * 计算两个数组的差集 —— 返回在 `source` 中但不在 `target` 中的元素
4
+ *
5
+ * @param source - 被减数组
6
+ * @param target - 要排除的元素数组
7
+ * @returns 差集新数组
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * import difference from '@tanwan/utils/difference'
12
+ * difference([1, 2, 3], [2])
13
+ * // [1, 3]
14
+ *
15
+ * difference(['a', 'b', 'c'], ['b', 'd'])
16
+ * // ['a', 'c']
17
+ * ```
18
+ */
19
+ declare function difference<T>(source: T[], target: T[]): T[];
20
+ export = difference;
@@ -0,0 +1,21 @@
1
+ //#region src/array/difference/index.d.ts
2
+ /**
3
+ * 计算两个数组的差集 —— 返回在 `source` 中但不在 `target` 中的元素
4
+ *
5
+ * @param source - 被减数组
6
+ * @param target - 要排除的元素数组
7
+ * @returns 差集新数组
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * import difference from '@tanwan/utils/difference'
12
+ * difference([1, 2, 3], [2])
13
+ * // [1, 3]
14
+ *
15
+ * difference(['a', 'b', 'c'], ['b', 'd'])
16
+ * // ['a', 'c']
17
+ * ```
18
+ */
19
+ declare function difference<T>(source: T[], target: T[]): T[];
20
+ //#endregion
21
+ export { difference as default };
@@ -0,0 +1,24 @@
1
+ //#region src/array/difference/index.ts
2
+ /**
3
+ * 计算两个数组的差集 —— 返回在 `source` 中但不在 `target` 中的元素
4
+ *
5
+ * @param source - 被减数组
6
+ * @param target - 要排除的元素数组
7
+ * @returns 差集新数组
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * import difference from '@tanwan/utils/difference'
12
+ * difference([1, 2, 3], [2])
13
+ * // [1, 3]
14
+ *
15
+ * difference(['a', 'b', 'c'], ['b', 'd'])
16
+ * // ['a', 'c']
17
+ * ```
18
+ */
19
+ function difference(source, target) {
20
+ const targetSet = new Set(target);
21
+ return source.filter((item) => !targetSet.has(item));
22
+ }
23
+ //#endregion
24
+ export { difference as default };
@@ -0,0 +1,31 @@
1
+ //#region src/business/downloadFile/index.ts
2
+ /**
3
+ * 下载文件(支持 URL 或 Blob)
4
+ *
5
+ * @param source - 文件 URL 地址或 Blob 对象
6
+ * @param filename - 下载文件名
7
+ *
8
+ * @example
9
+ * ```ts
10
+ * import downloadFile from '@tanwan/utils/downloadFile'
11
+ * // 下载 URL
12
+ * downloadFile('https://example.com/file.pdf', 'document.pdf')
13
+ *
14
+ * // 下载 Blob
15
+ * const blob = new Blob(['hello'], { type: 'text/plain' })
16
+ * downloadFile(blob, 'hello.txt')
17
+ * ```
18
+ */
19
+ function downloadFile(source, filename) {
20
+ const url = typeof source === "string" ? source : URL.createObjectURL(source);
21
+ const a = document.createElement("a");
22
+ a.href = url;
23
+ a.download = filename;
24
+ a.style.display = "none";
25
+ document.body.appendChild(a);
26
+ a.click();
27
+ document.body.removeChild(a);
28
+ if (source instanceof Blob) URL.revokeObjectURL(url);
29
+ }
30
+ //#endregion
31
+ module.exports = downloadFile;