|
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124 |
- 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;
-
- output = '\r\u001B[K';
-
- output += drawBorderJoin(columnWidthIndex, config.border);
- output += body;
- output += drawBorderBottom(columnWidthIndex, config.border);
-
- 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);
- }
- }
- };
- };
|