|
|
import _ from 'lodash'; import makeStreamConfig from './makeStreamConfig'; import drawRow from './drawRow'; import { drawBorderBottom, drawBorderJoin, drawBorderTop } from './drawBorder'; import stringifyTableData from './stringifyTableData'; import truncateTableData from './truncateTableData'; import mapDataUsingRowHeightIndex from './mapDataUsingRowHeightIndex'; import alignTableData from './alignTableData'; import padTableData from './padTableData'; import calculateRowHeightIndex from './calculateRowHeightIndex';
/** * @param {Array} data * @param {Object} config * @returns {Array} */ const prepareData = (data, config) => { let rows;
rows = stringifyTableData(data);
rows = truncateTableData(data, config);
const rowHeightIndex = calculateRowHeightIndex(rows, config);
rows = mapDataUsingRowHeightIndex(rows, rowHeightIndex, config); rows = alignTableData(rows, config); rows = padTableData(rows, config);
return rows; };
/** * @param {string[]} row * @param {number[]} columnWidthIndex * @param {Object} config * @returns {undefined} */ const create = (row, columnWidthIndex, config) => { const rows = prepareData([row], config);
const body = rows.map((literalRow) => { return drawRow(literalRow, config.border); }).join('');
let output;
output = '';
output += drawBorderTop(columnWidthIndex, config.border); output += body; output += drawBorderBottom(columnWidthIndex, config.border);
output = _.trimEnd(output);
process.stdout.write(output); };
/** * @param {string[]} row * @param {number[]} columnWidthIndex * @param {Object} config * @returns {undefined} */ const append = (row, columnWidthIndex, config) => { const rows = prepareData([row], config);
const body = rows.map((literalRow) => { return drawRow(literalRow, config.border); }).join('');
let output = ''; const bottom = drawBorderBottom(columnWidthIndex, config.border);
if (bottom !== '\n') { output = '\r\u001B[K'; }
output += drawBorderJoin(columnWidthIndex, config.border); output += body; output += bottom;
output = _.trimEnd(output);
process.stdout.write(output); };
/** * @param {Object} userConfig * @returns {Object} */ export default (userConfig = {}) => { const config = makeStreamConfig(userConfig);
// @todo Use 'Object.values' when Node.js v6 support is dropped. const columnWidthIndex = _.values(_.mapValues(config.columns, (column) => { return column.width + column.paddingLeft + column.paddingRight; }));
let empty;
empty = true;
return { /** * @param {string[]} row * @returns {undefined} */ write: (row) => { if (row.length !== config.columnCount) { throw new Error('Row cell count does not match the config.columnCount.'); }
if (empty) { empty = false;
return create(row, columnWidthIndex, config); } else { return append(row, columnWidthIndex, config); } } }; };
|