🌳
pt0/sharedF/strF/humanBytesF.mts
1import * as _ from 'lodash-es'
3export const kb = 1024
4export const mb = kb * 1024
5export const gb = mb * 1024
6export const tb = gb * 1024
8export const mbit = 1_000_000
9export const gbit = mbit * 1000
11const bytesUnits: Record<string, number> = {
12 bytes: 1,
13 kb,
14 mb,
15 gb,
16 tb,
17 pb: tb * 1024 // one size larger than largest needed for logic below
20export const humanBytes = (bytes: number | string | null | undefined): string | number | null | undefined => {
21 if (!bytes) return bytes
23 const isEq = _.toInteger(bytes).toString() == bytes.toString()
24 if (isEq) {
25 bytes = _.toInteger(bytes)
26 }
28 if (!_.isInteger(bytes)) return bytes
30 return _.compact(_.map(_.keys(bytesUnits), (unit, i) => {
31 const unitInBytes = bytesUnits[unit]
32 if ((bytes as number) < unitInBytes) {
33 const prevUnit = _.keys(bytesUnits)[i - 1]
34 const prevUnitInBytes = bytesUnits[prevUnit]
36 return `${_.round((bytes as number) / prevUnitInBytes, 2)}${prevUnit}`
37 }
38 }))[0]