type LocaleOptions = { minimumFractionDigits?: number; maximumFractionDigits?: number;};
type PrettyBytesOptions = { bits?: boolean; binary?: boolean; locale?: boolean | string | string[]; minimumFractionDigits?: number; maximumFractionDigits?: number; signed?: boolean;};
export function prettyBytes( num: number, options: PrettyBytesOptions = {},): string { if (!Number.isFinite(num)) { throw new TypeError(`Expected a finite number, got ${typeof num}: ${num}`); }
const UNITS = options.bits ? (options.binary ? BIBIT_UNITS : BIT_UNITS) : (options.binary ? BIBYTE_UNITS : BYTE_UNITS);
if (options.signed && num === 0) { return ` 0 ${UNITS[0]}`; }
const isNegative = num < 0; const prefix = isNegative ? "-" : (options.signed ? "+" : "");
if (isNegative) { num = -num; }
const localeOptions = getLocaleOptions(options);
if (num < 1) { const numberString = toLocaleString(num, options.locale, localeOptions); return prefix + numberString + " " + UNITS[0]; }
const exponent = Math.min( Math.floor( options.binary ? Math.log(num) / Math.log(1024) : Math.log10(num) / 3, ), UNITS.length - 1, ); num /= Math.pow(options.binary ? 1024 : 1000, exponent);
if (!localeOptions) { num = Number(num.toPrecision(3)); }
const numberString = toLocaleString( num, options.locale, localeOptions, );
const unit = UNITS[exponent]; return prefix + numberString + " " + unit;}
function getLocaleOptions( { maximumFractionDigits, minimumFractionDigits }: PrettyBytesOptions,): LocaleOptions | undefined { if (maximumFractionDigits || minimumFractionDigits) { return { maximumFractionDigits, minimumFractionDigits, }; }}
function toLocaleString( num: number, locale: boolean | string | string[] | undefined, options: LocaleOptions | undefined,): string { if (typeof locale === "string" || Array.isArray(locale)) { return num.toLocaleString(locale, options); } else if (locale === true || options !== undefined) { return num.toLocaleString(undefined, options); }
return num.toString();}
const BYTE_UNITS = [ "B", "kB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB",];
const BIBYTE_UNITS = [ "B", "kiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB",];
const BIT_UNITS = [ "b", "kbit", "Mbit", "Gbit", "Tbit", "Pbit", "Ebit", "Zbit", "Ybit",];
const BIBIT_UNITS = [ "b", "kibit", "Mibit", "Gibit", "Tibit", "Pibit", "Eibit", "Zibit", "Yibit",];