src/formatLine.ts   A
last analyzed

Complexity

Total Complexity 19
Complexity/F 1.73

Size

Lines of Code 98
Function Count 11

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
eloc 80
dl 0
loc 98
rs 10
c 0
b 0
f 0
wmc 19
mnd 8
bc 8
fnc 11
bpm 0.7272
cpm 1.7272
noi 0

10 Functions

Rating   Name   Duplication   Size   Complexity  
A formatLine.ts ➔ formatTimeWithIcon 0 3 1
A formatLine.ts ➔ formatOldLine 0 8 1
A formatLine.ts ➔ formatNewLine 0 7 1
A formatLine.ts ➔ formatTime 0 10 4
A formatLine.ts ➔ buildTimeString 0 5 2
A formatLine.ts ➔ generateBarChart 0 9 2
A formatLine.ts ➔ formatLine 0 8 2
A formatLine.ts ➔ formatNewTimeDisplay 0 3 1
A formatLine.ts ➔ truncateString 0 4 2
A formatLine.ts ➔ formatPercent 0 3 1
1
const CONSTANTS = {
2
  ICONS: {
3
    TIME: '🕓',
4
  },
5
  NAME_LENGTHS: {
6
    OLD: 12,
7
    NEW: 15,
8
  },
9
  PADDING_LENGTHS: {
10
    NEW_1: 8,
11
    NEW_2: 28,
12
  },
13
  SYMBOLS: {
14
    PERCENT: '%',
15
    DOT: '.',
16
    ELLIPSIS: '...',
17
    BAR: '░▏▎▍▌▋▊▉█',
18
  },
19
  BAR_CHART_SIZE: 23,
20
  FRACTION_UNIT: 8,
21
  SECONDS_IN: {
22
    DAY: 24 * 60 * 60,
23
    HOUR: 60 * 60,
24
    MINUTE: 60,
25
  },
26
};
27
28
export default function formatLine(name: string, totalSeconds: number, percent: number, useOldFormat: boolean) {
29
  const displayName = truncateString(name, 10);
30
  const formattedSeconds = formatTime(totalSeconds);
31
  const formattedPercent = percent.toFixed(1).toString();
32
  return useOldFormat
33
    ? formatOldLine(displayName, formattedSeconds, formattedPercent, percent)
34
    : formatNewLine(displayName, formattedSeconds, formattedPercent);
35
}
36
37
function buildTimeString(majorUnit: number, majorLabel: string, seconds: number, majorUnitSeconds: number, minorLabel: string, minorUnitSeconds?: number): string {
38
  return minorUnitSeconds !== undefined
39
    ? `${majorUnit}${majorLabel} ${Math.floor((seconds % majorUnitSeconds) / minorUnitSeconds)}${minorLabel}`
40
    : `${majorUnit}${majorLabel}`;
41
}
42
43
function formatTime(seconds: number): string {
44
  const {DAY, HOUR, MINUTE} = CONSTANTS.SECONDS_IN;
45
  const days = Math.floor(seconds / DAY);
46
  if (days > 0) return buildTimeString(days, 'd', seconds, DAY, 'h', HOUR);
47
  const hours = Math.floor(seconds / HOUR);
48
  if (hours > 0) return buildTimeString(hours, 'h', seconds, HOUR, 'm', MINUTE);
49
  const minutes = Math.floor(seconds / MINUTE);
50
  if (minutes > 0) return buildTimeString(minutes, 'm', seconds, MINUTE, 's');
51
  return `${Math.round(seconds)}s`;
52
}
53
54
function truncateString(str: string, len: number): string {
55
  const {ELLIPSIS} = CONSTANTS.SYMBOLS;
56
  return str.length > len ? str.substring(0, len - ELLIPSIS.length) + ELLIPSIS : str;
57
}
58
59
function generateBarChart(percent: number): string {
60
  const {BAR_CHART_SIZE, FRACTION_UNIT, SYMBOLS: {BAR}} = CONSTANTS;
61
  const frac = Math.floor((BAR_CHART_SIZE * FRACTION_UNIT * percent) / 100);
62
  const barsFull = Math.floor(frac / FRACTION_UNIT);
63
  const semiBarIndex = frac % FRACTION_UNIT;
64
  return barsFull >= BAR_CHART_SIZE
65
    ? BAR[8].repeat(BAR_CHART_SIZE)
66
    : BAR[8].repeat(barsFull) + BAR[semiBarIndex].padEnd(BAR_CHART_SIZE, BAR[0]);
67
}
68
69
function formatPercent(percent: string): string {
70
  return percent.padStart(5) + CONSTANTS.SYMBOLS.PERCENT;
71
}
72
73
function formatTimeWithIcon(seconds: string): string {
74
  return `${CONSTANTS.ICONS.TIME} ${seconds.padEnd(9)}`;
75
}
76
77
function formatNewTimeDisplay(seconds: string): string {
78
  return (seconds + ' ').padEnd(CONSTANTS.PADDING_LENGTHS.NEW_1, CONSTANTS.SYMBOLS.DOT);
79
}
80
81
function formatOldLine(name: string, seconds: string, percent: string, percentValue: number) {
82
  return [
83
    name.padEnd(CONSTANTS.NAME_LENGTHS.OLD),
84
    formatTimeWithIcon(seconds),
85
    generateBarChart(percentValue),
86
    formatPercent(percent),
87
  ].join(' ');
88
}
89
90
function formatNewLine(name: string, seconds: string, percent: string) {
91
  return (
92
    [
93
      name.padEnd(CONSTANTS.NAME_LENGTHS.NEW, CONSTANTS.SYMBOLS.DOT),
94
      formatNewTimeDisplay(seconds),
95
    ].join(' ') + percent.padStart(CONSTANTS.PADDING_LENGTHS.NEW_2, CONSTANTS.SYMBOLS.DOT) + CONSTANTS.SYMBOLS.PERCENT
96
  );
97
}
98