index.ts 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. import dayjs from 'dayjs'
  2. import relativeTime from 'dayjs/plugin/relativeTime'
  3. function bytesToSize(bytes: number) {
  4. if (bytes === 0)
  5. return '0 B'
  6. const k = 1024
  7. const sizes = ['B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']
  8. const i = Math.floor(Math.log(bytes) / Math.log(k))
  9. return `${(bytes / k ** i).toFixed(2)} ${sizes[i]}`
  10. }
  11. // eslint-disable-next-line ts/no-explicit-any
  12. function downloadCsv(header: any, data: any[], fileName: string) {
  13. if (!header || !Array.isArray(header) || !Array.isArray(data) || !header.length)
  14. return
  15. let csvContent = 'data:text/csv;charset=utf-8,\uFEFF'
  16. const _header = header.map(h => h.title).join(',')
  17. const keys = header.map(item => item.key)
  18. csvContent += `${_header}\n`
  19. data.forEach((item, index) => {
  20. let dataString = ''
  21. for (const element of keys)
  22. dataString += `${item[element]},`
  23. csvContent += index < data.length ? dataString.replace(/,$/, '\n') : dataString.replace(/,$/, '')
  24. })
  25. const a = document.createElement('a')
  26. a.href = encodeURI(csvContent)
  27. a.download = fileName
  28. a.click()
  29. window.URL.revokeObjectURL(csvContent)
  30. }
  31. function urlJoin(...args: string[]) {
  32. return args
  33. .join('/')
  34. .replace(/\/+/g, '/')
  35. .replace(/^(.+):\//, '$1://')
  36. .replace(/^file:/, 'file:/')
  37. .replace(/\/(\?|&|#[^!])/g, '$1')
  38. .replace(/\?/g, '&')
  39. .replaceAll('&', '?')
  40. }
  41. function fromNow(t: string) {
  42. dayjs.extend(relativeTime)
  43. return dayjs(t).fromNow()
  44. }
  45. function formatDate(t: string) {
  46. return dayjs(t).format('YYYY.MM.DD')
  47. }
  48. function formatDateTime(t: string) {
  49. return dayjs(t).format('YYYY-MM-DD HH:mm:ss')
  50. }
  51. export {
  52. bytesToSize,
  53. downloadCsv,
  54. formatDate,
  55. formatDateTime,
  56. fromNow,
  57. urlJoin,
  58. }