export function calculateColWidths (head: string[], rows: string[][], maxWidth: number): number[] { const MIN_NEEDED_WIDTH = 40 const BORDER_WITH_PADDING_LENGTH = 3 const colWidths = rows.concat([head]).map(getItemLengths).reduce(getMaxColumnLengths) const tableContentWidth = colWidths.reduce(sum) const tablePaddingWidth = colWidths.length * BORDER_WITH_PADDING_LENGTH + 1 const neededWidth = Math.max(maxWidth, MIN_NEEDED_WIDTH) - tablePaddingWidth if (tableContentWidth > neededWidth) { return reduceWidths(colWidths, tableContentWidth, neededWidth) } return [] } function getItemLengths (row: string[]): number[] { return row.map((item: string): number => item.length) } function getMaxColumnLengths (previousRow: number[], currentRow: number[]): number[] { return currentRow.map((item: number, index: number): number => Math.max(previousRow[index], item)) } function sum (previousValue: number, currentValue: number): number { return previousValue + currentValue } function reduceWidths (colWidths: number[], width: number, neededWidth: number): number[] { const factor = width / neededWidth return colWidths.map((item: number) => Math.ceil(item / factor)) }