format-byte-size
Version:
[DEPRECATED] A TypeScript library to format byte values into human-readable strings and parse them back.
1 lines • 6.65 kB
Source Map (JSON)
{"version":3,"sources":["../src/constants.ts","../src/index.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["export const DECIMAL_UNITS = [\n 'B',\n 'KB',\n 'MB',\n 'GB',\n 'TB',\n 'PB',\n 'EB',\n 'ZB',\n 'YB',\n] as const;\nexport const BINARY_UNITS = [\n 'B',\n 'KiB',\n 'MiB',\n 'GiB',\n 'TiB',\n 'PiB',\n 'EiB',\n 'ZiB',\n 'YiB',\n] as const;\n\nexport const DECIMAL_BASE = 1000;\nexport const BINARY_BASE = 1024;\n\nexport const UNIT_MAP: Record<string, number> = {\n // Decimal units (base 1000)\n b: 1,\n byte: 1,\n bytes: 1,\n kb: 1000,\n mb: 1000 ** 2,\n gb: 1000 ** 3,\n tb: 1000 ** 4,\n pb: 1000 ** 5,\n eb: 1000 ** 6,\n zb: 1000 ** 7,\n yb: 1000 ** 8,\n // Binary units (base 1024)\n kib: 1024,\n mib: 1024 ** 2,\n gib: 1024 ** 3,\n tib: 1024 ** 4,\n pib: 1024 ** 5,\n eib: 1024 ** 6,\n zib: 1024 ** 7,\n yib: 1024 ** 8,\n};\n","import type { FormatBytesOptions } from './types';\nimport {\n DECIMAL_UNITS,\n BINARY_UNITS,\n DECIMAL_BASE,\n BINARY_BASE,\n UNIT_MAP,\n} from './constants';\n\nexport type { FormatBytesOptions };\n\n/**\n * Formats a number of bytes into a human-readable string.\n * @param bytes The number of bytes to format.\n * @param options Optional formatting configuration.\n * @returns A human-readable string representation of the byte size.\n * @throws {TypeError} If input `bytes` is not a number.\n */\nexport function formatBytes(\n bytes: number,\n options?: FormatBytesOptions\n): string {\n if (typeof bytes !== 'number') {\n throw new TypeError('Input bytes must be a number');\n }\n\n const {\n decimalPlaces = 2,\n useBinary = false,\n fixedDecimals = false,\n includeUnitSpace = true,\n } = options || {};\n\n const units = useBinary ? BINARY_UNITS : DECIMAL_UNITS;\n const base = useBinary ? BINARY_BASE : DECIMAL_BASE;\n const space = includeUnitSpace ? ' ' : '';\n\n if (bytes === 0) {\n return `0${space}Bytes`;\n }\n\n const isNegative = bytes < 0;\n const absoluteBytes = Math.abs(bytes);\n\n const unitIndex =\n absoluteBytes < 1\n ? 0\n : Math.min(\n Math.floor(Math.log(absoluteBytes) / Math.log(base)),\n units.length - 1\n );\n\n const value = absoluteBytes / Math.pow(base, unitIndex);\n const formattedValue = fixedDecimals\n ? value.toFixed(decimalPlaces)\n : parseFloat(value.toFixed(decimalPlaces)).toString();\n\n const sign = isNegative ? '-' : '';\n const unit = units[unitIndex];\n\n return `${sign}${formattedValue}${space}${unit}`;\n}\n\n/**\n * Parses a human-readable byte string (e.g., \"512KB\", \"1.5 GiB\") into a number of bytes.\n * Supports both decimal (KB, MB) and binary (KiB, MiB) units case-insensitively.\n * @param sizeString The human-readable byte string to parse.\n * @returns The number of bytes, or null if the string is unparseable.\n * @throws {TypeError} If input `sizeString` is not a string.\n */\nexport function parseBytes(sizeString: string): number | null {\n if (typeof sizeString !== 'string') {\n throw new TypeError('Input sizeString must be a string');\n }\n\n const trimmed = sizeString.trim();\n if (!trimmed) {\n return null;\n }\n\n // Regex to match number (with optional decimal) followed by optional space and unit\n const match = trimmed.match(/^(-?\\d+(?:\\.\\d+)?)\\s*([a-z]+)?$/i);\n if (!match) {\n return null;\n }\n\n const [, valueStr, unit] = match;\n const value = parseFloat(valueStr!);\n\n if (isNaN(value)) {\n return null;\n }\n\n // If no unit provided, assume bytes\n if (!unit) {\n return value;\n }\n\n // Look up the unit in our map (case-insensitive)\n const unitLower = unit.toLowerCase();\n const multiplier = UNIT_MAP[unitLower];\n\n if (multiplier === undefined) {\n return null;\n }\n\n return value * multiplier;\n}\n"]}