@@ -168,6 +168,60 @@ export function renderTemporalTimestamp(timestamp: string, hideDate = false) {
168168 return `${ date . year } -${ months } -${ days } ${ time } ` ;
169169}
170170
171+ export const KIBIBYTE = 1024 ;
172+ export const MEBIBYTE = KIBIBYTE * 1024 ;
173+ export const GIBIBYTE = MEBIBYTE * 1024 ;
174+
175+ export const KILOBYTE = 1000 ;
176+ export const MEGABYTE = KILOBYTE * 1000 ;
177+ export const GIGABYTE = MEGABYTE * 1000 ;
178+
179+ export function formatSize ( bytes : number ) : string {
180+ if ( bytes === 0 ) return "0 Bytes" ;
181+
182+ if ( bytes >= GIBIBYTE ) {
183+ return `${ parseFloat ( ( bytes / GIBIBYTE ) . toFixed ( 2 ) ) } GiB` ;
184+ }
185+
186+ if ( bytes >= MEBIBYTE ) {
187+ return `${ parseFloat ( ( bytes / MEBIBYTE ) . toFixed ( 2 ) ) } MiB` ;
188+ }
189+
190+ if ( bytes >= KIBIBYTE ) {
191+ return `${ parseFloat ( ( bytes / KIBIBYTE ) . toFixed ( 2 ) ) } KiB` ;
192+ }
193+
194+ return `${ bytes } Bytes` ;
195+ }
196+
197+ export function parseSize ( size : string | undefined ) : number | undefined {
198+ if ( size === undefined ) return undefined ;
199+
200+ const match = size . match ( / ^ ( \d + ) ( G B | M B | K B | G i B | M i B | K i B ) $ / i) ;
201+ if ( ! match ) {
202+ error (
203+ false ,
204+ "Invalid size format. Examples of valid size: '2gb', '1024mb'" ,
205+ ) ;
206+ }
207+ const [ , numStr , unit ] = match ;
208+ const num = parseInt ( numStr , 10 ) ;
209+ switch ( unit . toLowerCase ( ) ) {
210+ case "gb" :
211+ return num * GIGABYTE ;
212+ case "mb" :
213+ return num * MEGABYTE ;
214+ case "kb" :
215+ return num * KILOBYTE ;
216+ case "gib" :
217+ return num * GIBIBYTE ;
218+ case "mib" :
219+ return num * MEBIBYTE ;
220+ case "kib" :
221+ return num * KIBIBYTE ;
222+ }
223+ }
224+
171225export function tablePrinter < T > (
172226 headers : string [ ] ,
173227 values : T [ ] ,
0 commit comments