All files formatDuration.ts

86.81% Statements 79/91
75.86% Branches 22/29
100% Functions 3/3
86.81% Lines 79/91

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 921x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 14x 14x 14x 14x 14x   14x 4x 4x 10x 10x 10x 14x 1x 1x 1x 14x 1x     1x 1x 1x 8x 8x 8x 14x 1x 1x 1x 14x 2x 2x 2x     2x 5x 5x 5x 14x 1x 1x 1x 1x 1x     1x 4x 4x 14x 1x 1x 1x     14x 1x 1x 1x 1x 1x 1x 2x 2x 2x 2x       1x 4x 4x 4x 4x 4x 4x 4x  
/**
 * Copyright (c) OpenLens Authors. All rights reserved.
 * Licensed under MIT License. See LICENSE in root directory for more information.
 */
 
import moment from "moment";
 
/**
 * This function formats durations in a more human readable form.
 * @param timeValue the duration in milliseconds to format
 */
export function formatDuration(timeValue: number, compact = true) {
  const duration = moment.duration(timeValue, "milliseconds");
  const seconds = Math.floor(duration.asSeconds());
  const separator = compact ? "": " ";
 
  if (seconds < 0) {
    return "0s";
  } else if (seconds < 60*2 ) {
    return `${seconds}s`;
  }
 
  const minutes = Math.floor(duration.asMinutes());
 
  if (minutes < 10) {
    const seconds = duration.seconds();
 
    return getMeaningfulValues([minutes, seconds], ["m", "s"], separator);
  } else if (minutes < 60 * 3) {
    if (!compact) {
      return getMeaningfulValues([minutes, duration.seconds()], ["m", "s"]);
    }
 
    return `${minutes}m`;
  }
 
  const hours = Math.floor(duration.asHours());
 
  if(hours < 8) {
    const minutes = duration.minutes();
 
    return getMeaningfulValues([hours, minutes], ["h", "m"], separator);
  } else if (hours < 48) {
    if (compact) {
      return `${hours}h`;
    } else {
      return getMeaningfulValues([hours, duration.minutes()], ["h", "m"]);
    }
  }
 
  const days = Math.floor(duration.asDays());
 
  if (days < 8) {
    const hours = duration.hours();
 
    if (compact) {
      return getMeaningfulValues([days, hours], ["d", "h"], separator);
    } else {
      return getMeaningfulValues([days, hours, duration.minutes()], ["d", "h", "m"]);
    }
  }
  const years = Math.floor(duration.asYears());
 
  if (years < 2) {
    if (compact) {
      return `${days}d`;
    } else {
      return getMeaningfulValues([days, duration.hours(), duration.minutes()], ["d", "h", "m"]);
    }
  } else if (years < 8) {
    const days = duration.days();
 
    if (compact) {
      return getMeaningfulValues([years, days], ["y", "d"], separator);
    }
  }
 
  if (compact) {
    return `${years}y`;
  }

  return getMeaningfulValues([years, duration.days(), duration.hours(), duration.minutes()], ["y", "d", "h", "m"]);
}
 
function getMeaningfulValues(values: number[], suffixes: string[], separator = " ") {
  return values
    .map((a, i): [number, string] => [a, suffixes[i]])
    .filter(([dur]) => dur > 0)
    .map(([dur, suf]) => dur + suf)
    .join(separator);
}