Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/npm/cli.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKat Marchán <kzm@zkat.tech>2018-07-11 01:02:38 +0300
committerKat Marchán <kzm@zkat.tech>2018-07-11 01:02:38 +0300
commit8dc6d76408f83ba35bda77a2ac1bdbde01937349 (patch)
tree840b3695b2670744155018886d2306c0b9b918ec /node_modules/cli-table3
parent2ac48f863f90166b2bbf2021ed4cc04343d2503c (diff)
cli-table3@0.5.0
replaces cli-table2
Diffstat (limited to 'node_modules/cli-table3')
-rw-r--r--node_modules/cli-table3/CHANGELOG.md48
-rw-r--r--node_modules/cli-table3/LICENSE21
-rw-r--r--node_modules/cli-table3/README.md218
-rw-r--r--node_modules/cli-table3/index.js1
-rw-r--r--node_modules/cli-table3/package.json128
-rw-r--r--node_modules/cli-table3/src/cell.js371
-rw-r--r--node_modules/cli-table3/src/layout-manager.js232
-rw-r--r--node_modules/cli-table3/src/table.js77
-rw-r--r--node_modules/cli-table3/src/utils.js303
9 files changed, 1399 insertions, 0 deletions
diff --git a/node_modules/cli-table3/CHANGELOG.md b/node_modules/cli-table3/CHANGELOG.md
new file mode 100644
index 000000000..62eb485bd
--- /dev/null
+++ b/node_modules/cli-table3/CHANGELOG.md
@@ -0,0 +1,48 @@
+# Changelog
+
+## v0.5.0 (2018-06-11)
+
+#### :boom: Breaking Change
+* [#2](https://github.com/cli-table/cli-table3/pull/2) Update Node version requirements. ([@Turbo87](https://github.com/Turbo87))
+
+#### :memo: Documentation
+* [#11](https://github.com/cli-table/cli-table3/pull/11) Update Documentation. ([@Turbo87](https://github.com/Turbo87))
+
+#### :house: Internal
+* [#16](https://github.com/cli-table/cli-table3/pull/16) Replace `kind-of` dependency with `typeof` and `Array.isArray()`. ([@Turbo87](https://github.com/Turbo87))
+* [#15](https://github.com/cli-table/cli-table3/pull/15) Remove Gulp. ([@Turbo87](https://github.com/Turbo87))
+* [#13](https://github.com/cli-table/cli-table3/pull/13) Use ES6 class syntax and `let/const`. ([@Turbo87](https://github.com/Turbo87))
+* [#12](https://github.com/cli-table/cli-table3/pull/12) Add ESLint and Prettier. ([@Turbo87](https://github.com/Turbo87))
+* [#10](https://github.com/cli-table/cli-table3/pull/10) chore: use yarn cache. ([@DanielRuf](https://github.com/DanielRuf))
+* [#9](https://github.com/cli-table/cli-table3/pull/9) Use Jest for testing. ([@Turbo87](https://github.com/Turbo87))
+* [#3](https://github.com/cli-table/cli-table3/pull/3) Add `yarn.lock` file. ([@Turbo87](https://github.com/Turbo87))
+* [#1](https://github.com/cli-table/cli-table3/pull/1) Skip broken test. ([@Turbo87](https://github.com/Turbo87))
+
+#### Committers: 3
+- Daniel Ruf ([DanielRuf](https://github.com/DanielRuf))
+- Tobias Bieniek ([Turbo87](https://github.com/Turbo87))
+- [dependabot[bot]](https://github.com/apps/dependabot)
+
+
+## v0.4.0 (2018-06-10)
+
+First official release as `cli-table3`. Changes compares to `cli-table2` v0.2.0:
+
+#### :rocket: Enhancement
+* [#27](https://github.com/jamestalmage/cli-table2/pull/27) Remove "lodash" dependency. ([@Turbo87](https://github.com/Turbo87))
+
+#### :bug: Bug Fix
+* [#29](https://github.com/jamestalmage/cli-table2/pull/29) Fix wordWrap with colSpan. ([@mmurphy](https://github.com/mmurphy))
+* [#24](https://github.com/jamestalmage/cli-table2/pull/24) Fixing the runtime error when content is truncated. ([@sthadeshwar](https://github.com/sthadeshwar))
+
+#### :memo: Documentation
+* [#41](https://github.com/jamestalmage/cli-table2/pull/41) Create LICENSE. ([@GantMan](https://github.com/GantMan))
+
+#### :house: Internal
+* [#26](https://github.com/jamestalmage/cli-table2/pull/26) package.json: Whitelist JS files ([@Turbo87](https://github.com/Turbo87))
+
+#### Committers: 4
+- Gant Laborde ([GantMan](https://github.com/GantMan))
+- Martin Murphy ([mmurphy](https://github.com/mmurphy))
+- Satyajit Thadeshwar ([sthadeshwar](https://github.com/sthadeshwar))
+- Tobias Bieniek ([Turbo87](https://github.com/Turbo87))
diff --git a/node_modules/cli-table3/LICENSE b/node_modules/cli-table3/LICENSE
new file mode 100644
index 000000000..a09b7de01
--- /dev/null
+++ b/node_modules/cli-table3/LICENSE
@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2014 James Talmage <james.talmage@jrtechnical.com>
+
+Permission is hereby granted, free of charge, to any person obtaining a copy
+of this software and associated documentation files (the "Software"), to deal
+in the Software without restriction, including without limitation the rights
+to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the Software is
+furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all
+copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
+SOFTWARE.
diff --git a/node_modules/cli-table3/README.md b/node_modules/cli-table3/README.md
new file mode 100644
index 000000000..693b54482
--- /dev/null
+++ b/node_modules/cli-table3/README.md
@@ -0,0 +1,218 @@
+cli-table3
+===============================================================================
+
+[![npm version](https://img.shields.io/npm/v/cli-table3.svg)](https://www.npmjs.com/package/cli-table3)
+[![Build Status](https://travis-ci.com/cli-table/cli-table3.svg?branch=master)](https://travis-ci.com/cli-table/cli-table3)
+
+This utility allows you to render unicode-aided tables on the command line from
+your node.js scripts.
+
+`cli-table3` is based on (and api compatible with) the original [cli-table](https://github.com/Automattic/cli-table),
+and [cli-table2](https://github.com/jamestalmage/cli-table2), which are both
+unmaintained. `cli-table3` includes all the additional features from
+`cli-table2`.
+
+![Screenshot](http://i.imgur.com/sYq4T.png)
+
+## Features not in the original cli-table
+
+- Ability to make cells span columns and/or rows.
+- Ability to set custom styles per cell (border characters/colors, padding, etc).
+- Vertical alignment (top, bottom, center).
+- Automatic word wrapping.
+- More robust truncation of cell text that contains ansi color characters.
+- Better handling of text color that spans multiple lines.
+- API compatible with the original cli-table.
+- Exhaustive test suite including the entire original cli-table test suite.
+- Lots of examples auto-generated from the tests ([basic](https://github.com/cli-table/cli-table3/blob/master/basic-usage.md), [advanced](https://github.com/cli-table/cli-table3/blob/master/advanced-usage.md)).
+
+## Features
+
+- Customizable characters that constitute the table.
+- Color/background styling in the header through
+ [colors.js](http://github.com/marak/colors.js)
+- Column width customization
+- Text truncation based on predefined widths
+- Text alignment (left, right, center)
+- Padding (left, right)
+- Easy-to-use API
+
+## Installation
+
+```bash
+npm install cli-table3
+```
+
+## How to use
+
+A portion of the unit test suite is used to generate examples:
+- [basic-usage](https://github.com/cli-table/cli-table3/blob/master/basic-usage.md) - covers basic uses.
+- [advanced](https://github.com/cli-table/cli-table3/blob/master/advanced-usage.md) - covers using the new column and row span features.
+
+This package is api compatible with the original [cli-table](https://github.com/Automattic/cli-table).
+So all the original documentation still applies (copied below).
+
+### Horizontal Tables
+```javascript
+var Table = require('cli-table3');
+
+// instantiate
+var table = new Table({
+ head: ['TH 1 label', 'TH 2 label']
+ , colWidths: [100, 200]
+});
+
+// table is an Array, so you can `push`, `unshift`, `splice` and friends
+table.push(
+ ['First value', 'Second value']
+ , ['First value', 'Second value']
+);
+
+console.log(table.toString());
+```
+
+### Vertical Tables
+```javascript
+var Table = require('cli-table3');
+var table = new Table();
+
+table.push(
+ { 'Some key': 'Some value' }
+ , { 'Another key': 'Another value' }
+);
+
+console.log(table.toString());
+```
+### Cross Tables
+Cross tables are very similar to vertical tables, with two key differences:
+
+1. They require a `head` setting when instantiated that has an empty string as the first header
+2. The individual rows take the general form of { "Header": ["Row", "Values"] }
+
+```javascript
+var Table = require('cli-table3');
+var table = new Table({ head: ["", "Top Header 1", "Top Header 2"] });
+
+table.push(
+ { 'Left Header 1': ['Value Row 1 Col 1', 'Value Row 1 Col 2'] }
+ , { 'Left Header 2': ['Value Row 2 Col 1', 'Value Row 2 Col 2'] }
+);
+
+console.log(table.toString());
+```
+
+### Custom styles
+The ```chars``` property controls how the table is drawn:
+```javascript
+var table = new Table({
+ chars: { 'top': '═' , 'top-mid': '╤' , 'top-left': '╔' , 'top-right': '╗'
+ , 'bottom': '═' , 'bottom-mid': '╧' , 'bottom-left': '╚' , 'bottom-right': '╝'
+ , 'left': '║' , 'left-mid': '╟' , 'mid': '─' , 'mid-mid': '┼'
+ , 'right': '║' , 'right-mid': '╢' , 'middle': '│' }
+});
+
+table.push(
+ ['foo', 'bar', 'baz']
+ , ['frob', 'bar', 'quuz']
+);
+
+console.log(table.toString());
+// Outputs:
+//
+//╔══════╤═════╤══════╗
+//║ foo │ bar │ baz ║
+//╟──────┼─────┼──────╢
+//║ frob │ bar │ quuz ║
+//╚══════╧═════╧══════╝
+```
+
+Empty decoration lines will be skipped, to avoid vertical separator rows just
+set the 'mid', 'left-mid', 'mid-mid', 'right-mid' to the empty string:
+```javascript
+var table = new Table({ chars: {'mid': '', 'left-mid': '', 'mid-mid': '', 'right-mid': ''} });
+table.push(
+ ['foo', 'bar', 'baz']
+ , ['frobnicate', 'bar', 'quuz']
+);
+
+console.log(table.toString());
+// Outputs: (note the lack of the horizontal line between rows)
+//┌────────────┬─────┬──────┐
+//│ foo │ bar │ baz │
+//│ frobnicate │ bar │ quuz │
+//└────────────┴─────┴──────┘
+```
+
+By setting all chars to empty with the exception of 'middle' being set to a
+single space and by setting padding to zero, it's possible to get the most
+compact layout with no decorations:
+```javascript
+var table = new Table({
+ chars: { 'top': '' , 'top-mid': '' , 'top-left': '' , 'top-right': ''
+ , 'bottom': '' , 'bottom-mid': '' , 'bottom-left': '' , 'bottom-right': ''
+ , 'left': '' , 'left-mid': '' , 'mid': '' , 'mid-mid': ''
+ , 'right': '' , 'right-mid': '' , 'middle': ' ' },
+ style: { 'padding-left': 0, 'padding-right': 0 }
+});
+
+table.push(
+ ['foo', 'bar', 'baz']
+ , ['frobnicate', 'bar', 'quuz']
+);
+
+console.log(table.toString());
+// Outputs:
+//foo bar baz
+//frobnicate bar quuz
+```
+
+## Build Targets
+
+Clone the repository and run `yarn install` to install all its submodules, then run one of the following commands:
+
+###### Run the tests with coverage reports.
+```bash
+$ yarn test:coverage
+```
+
+###### Run the tests every time a file changes.
+```bash
+$ yarn test:watch
+```
+
+###### Update the documentation.
+```bash
+$ yarn docs
+```
+
+## Credits
+
+- James Talmage - author &lt;james.talmage@jrtechnical.com&gt; ([jamestalmage](http://github.com/jamestalmage))
+- Guillermo Rauch - author of the original cli-table &lt;guillermo@learnboost.com&gt; ([Guille](http://github.com/guille))
+
+## License
+
+(The MIT License)
+
+Copyright (c) 2014 James Talmage &lt;james.talmage@jrtechnical.com&gt;
+
+Original cli-table code/documentation: Copyright (c) 2010 LearnBoost &lt;dev@learnboost.com&gt;
+
+Permission is hereby granted, free of charge, to any person obtaining
+a copy of this software and associated documentation files (the
+'Software'), to deal in the Software without restriction, including
+without limitation the rights to use, copy, modify, merge, publish,
+distribute, sublicense, and/or sell copies of the Software, and to
+permit persons to whom the Software is furnished to do so, subject to
+the following conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
+CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
+TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
+SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/cli-table3/index.js b/node_modules/cli-table3/index.js
new file mode 100644
index 000000000..b49d920dd
--- /dev/null
+++ b/node_modules/cli-table3/index.js
@@ -0,0 +1 @@
+module.exports = require('./src/table'); \ No newline at end of file
diff --git a/node_modules/cli-table3/package.json b/node_modules/cli-table3/package.json
new file mode 100644
index 000000000..d0545c93f
--- /dev/null
+++ b/node_modules/cli-table3/package.json
@@ -0,0 +1,128 @@
+{
+ "_from": "cli-table3",
+ "_id": "cli-table3@0.5.0",
+ "_inBundle": false,
+ "_integrity": "sha512-c7YHpUyO1SaKaO7kYtxd5NZ8FjAmSK3LpKkuzdwn+2CwpFxBpdoQLm+OAnnCfoEl7onKhN9PKQi1lsHuAIUqGQ==",
+ "_location": "/cli-table3",
+ "_phantomChildren": {},
+ "_requested": {
+ "type": "tag",
+ "registry": true,
+ "raw": "cli-table3",
+ "name": "cli-table3",
+ "escapedName": "cli-table3",
+ "rawSpec": "",
+ "saveSpec": null,
+ "fetchSpec": "latest"
+ },
+ "_requiredBy": [
+ "#USER",
+ "/"
+ ],
+ "_resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.5.0.tgz",
+ "_shasum": "adb2f025715f4466e67629783c8d73e9030eb4bd",
+ "_spec": "cli-table3",
+ "_where": "/Users/zkat/Documents/code/work/npm",
+ "author": {
+ "name": "James Talmage"
+ },
+ "bugs": {
+ "url": "https://github.com/cli-table/cli-table3/issues"
+ },
+ "bundleDependencies": false,
+ "changelog": {
+ "repo": "cli-table/cli-table3",
+ "labels": {
+ "breaking": ":boom: Breaking Change",
+ "enhancement": ":rocket: Enhancement",
+ "bug": ":bug: Bug Fix",
+ "documentation": ":memo: Documentation",
+ "internal": ":house: Internal"
+ }
+ },
+ "dependencies": {
+ "colors": "^1.1.2",
+ "object-assign": "^4.1.0",
+ "string-width": "^2.1.1"
+ },
+ "deprecated": false,
+ "description": "Pretty unicode tables for the command line. Based on the original cli-table.",
+ "devDependencies": {
+ "ansi-256-colors": "^1.1.0",
+ "cli-table": "^0.3.1",
+ "eslint-config-prettier": "^2.9.0",
+ "eslint-plugin-prettier": "^2.6.0",
+ "jest": "^23.1.0",
+ "jest-runner-eslint": "^0.6.0",
+ "lerna-changelog": "^0.7.0",
+ "prettier": "1.13.5"
+ },
+ "directories": {
+ "test": "test"
+ },
+ "engines": {
+ "node": ">=6"
+ },
+ "files": [
+ "src/",
+ "index.js"
+ ],
+ "homepage": "https://github.com/cli-table/cli-table3",
+ "jest": {
+ "projects": [
+ {
+ "displayName": "test",
+ "testMatch": [
+ "**/test/**/*-test(s)?.js"
+ ]
+ },
+ {
+ "runner": "jest-runner-eslint",
+ "displayName": "lint",
+ "testMatch": [
+ "<rootDir>/examples/**/*.js",
+ "<rootDir>/lib/**/*.js",
+ "<rootDir>/scripts/**/*.js",
+ "<rootDir>/src/**/*.js",
+ "<rootDir>/test/**/*.js"
+ ]
+ }
+ ]
+ },
+ "keywords": [
+ "node",
+ "command",
+ "line",
+ "cli",
+ "table",
+ "tables",
+ "tabular",
+ "unicode",
+ "colors",
+ "grid"
+ ],
+ "license": "MIT",
+ "main": "index.js",
+ "name": "cli-table3",
+ "optionalDependencies": {
+ "colors": "^1.1.2"
+ },
+ "prettier": {
+ "printWidth": 120,
+ "tabWidth": 2,
+ "singleQuote": true,
+ "trailingComma": "es5"
+ },
+ "repository": {
+ "type": "git",
+ "url": "git+https://github.com/cli-table/cli-table3.git"
+ },
+ "scripts": {
+ "changelog": "lerna-changelog",
+ "docs": "node ./scripts/update-docs.js",
+ "prettier": "prettier --write '{examples,lib,scripts,src,test}/**/*.js'",
+ "test": "jest --color",
+ "test:watch": "jest --color --watchAll --notify"
+ },
+ "version": "0.5.0"
+}
diff --git a/node_modules/cli-table3/src/cell.js b/node_modules/cli-table3/src/cell.js
new file mode 100644
index 000000000..2db7f74d7
--- /dev/null
+++ b/node_modules/cli-table3/src/cell.js
@@ -0,0 +1,371 @@
+const utils = require('./utils');
+
+class Cell {
+ /**
+ * A representation of a cell within the table.
+ * Implementations must have `init` and `draw` methods,
+ * as well as `colSpan`, `rowSpan`, `desiredHeight` and `desiredWidth` properties.
+ * @param options
+ * @constructor
+ */
+ constructor(options) {
+ this.setOptions(options);
+
+ /**
+ * Each cell will have it's `x` and `y` values set by the `layout-manager` prior to
+ * `init` being called;
+ * @type {Number}
+ */
+ this.x = null;
+ this.y = null;
+ }
+
+ setOptions(options) {
+ if (['boolean', 'number', 'string'].indexOf(typeof options) !== -1) {
+ options = { content: '' + options };
+ }
+ options = options || {};
+ this.options = options;
+ let content = options.content;
+ if (['boolean', 'number', 'string'].indexOf(typeof content) !== -1) {
+ this.content = String(content);
+ } else if (!content) {
+ this.content = '';
+ } else {
+ throw new Error('Content needs to be a primitive, got: ' + typeof content);
+ }
+ this.colSpan = options.colSpan || 1;
+ this.rowSpan = options.rowSpan || 1;
+ }
+
+ mergeTableOptions(tableOptions, cells) {
+ this.cells = cells;
+
+ let optionsChars = this.options.chars || {};
+ let tableChars = tableOptions.chars;
+ let chars = (this.chars = {});
+ CHAR_NAMES.forEach(function(name) {
+ setOption(optionsChars, tableChars, name, chars);
+ });
+
+ this.truncate = this.options.truncate || tableOptions.truncate;
+
+ let style = (this.options.style = this.options.style || {});
+ let tableStyle = tableOptions.style;
+ setOption(style, tableStyle, 'padding-left', this);
+ setOption(style, tableStyle, 'padding-right', this);
+ this.head = style.head || tableStyle.head;
+ this.border = style.border || tableStyle.border;
+
+ let fixedWidth = tableOptions.colWidths[this.x];
+ if (tableOptions.wordWrap && fixedWidth) {
+ fixedWidth -= this.paddingLeft + this.paddingRight;
+ if (this.colSpan) {
+ let i = 1;
+ while (i < this.colSpan) {
+ fixedWidth += tableOptions.colWidths[this.x + i];
+ i++;
+ }
+ }
+ this.lines = utils.colorizeLines(utils.wordWrap(fixedWidth, this.content));
+ } else {
+ this.lines = utils.colorizeLines(this.content.split('\n'));
+ }
+
+ this.desiredWidth = utils.strlen(this.content) + this.paddingLeft + this.paddingRight;
+ this.desiredHeight = this.lines.length;
+ }
+
+ /**
+ * Initializes the Cells data structure.
+ *
+ * @param tableOptions - A fully populated set of tableOptions.
+ * In addition to the standard default values, tableOptions must have fully populated the
+ * `colWidths` and `rowWidths` arrays. Those arrays must have lengths equal to the number
+ * of columns or rows (respectively) in this table, and each array item must be a Number.
+ *
+ */
+ init(tableOptions) {
+ let x = this.x;
+ let y = this.y;
+ this.widths = tableOptions.colWidths.slice(x, x + this.colSpan);
+ this.heights = tableOptions.rowHeights.slice(y, y + this.rowSpan);
+ this.width = this.widths.reduce(sumPlusOne, -1);
+ this.height = this.heights.reduce(sumPlusOne, -1);
+
+ this.hAlign = this.options.hAlign || tableOptions.colAligns[x];
+ this.vAlign = this.options.vAlign || tableOptions.rowAligns[y];
+
+ this.drawRight = x + this.colSpan == tableOptions.colWidths.length;
+ }
+
+ /**
+ * Draws the given line of the cell.
+ * This default implementation defers to methods `drawTop`, `drawBottom`, `drawLine` and `drawEmpty`.
+ * @param lineNum - can be `top`, `bottom` or a numerical line number.
+ * @param spanningCell - will be a number if being called from a RowSpanCell, and will represent how
+ * many rows below it's being called from. Otherwise it's undefined.
+ * @returns {String} The representation of this line.
+ */
+ draw(lineNum, spanningCell) {
+ if (lineNum == 'top') return this.drawTop(this.drawRight);
+ if (lineNum == 'bottom') return this.drawBottom(this.drawRight);
+ let padLen = Math.max(this.height - this.lines.length, 0);
+ let padTop;
+ switch (this.vAlign) {
+ case 'center':
+ padTop = Math.ceil(padLen / 2);
+ break;
+ case 'bottom':
+ padTop = padLen;
+ break;
+ default:
+ padTop = 0;
+ }
+ if (lineNum < padTop || lineNum >= padTop + this.lines.length) {
+ return this.drawEmpty(this.drawRight, spanningCell);
+ }
+ let forceTruncation = this.lines.length > this.height && lineNum + 1 >= this.height;
+ return this.drawLine(lineNum - padTop, this.drawRight, forceTruncation, spanningCell);
+ }
+
+ /**
+ * Renders the top line of the cell.
+ * @param drawRight - true if this method should render the right edge of the cell.
+ * @returns {String}
+ */
+ drawTop(drawRight) {
+ let content = [];
+ if (this.cells) {
+ //TODO: cells should always exist - some tests don't fill it in though
+ this.widths.forEach(function(width, index) {
+ content.push(this._topLeftChar(index));
+ content.push(utils.repeat(this.chars[this.y == 0 ? 'top' : 'mid'], width));
+ }, this);
+ } else {
+ content.push(this._topLeftChar(0));
+ content.push(utils.repeat(this.chars[this.y == 0 ? 'top' : 'mid'], this.width));
+ }
+ if (drawRight) {
+ content.push(this.chars[this.y == 0 ? 'topRight' : 'rightMid']);
+ }
+ return this.wrapWithStyleColors('border', content.join(''));
+ }
+
+ _topLeftChar(offset) {
+ let x = this.x + offset;
+ let leftChar;
+ if (this.y == 0) {
+ leftChar = x == 0 ? 'topLeft' : offset == 0 ? 'topMid' : 'top';
+ } else {
+ if (x == 0) {
+ leftChar = 'leftMid';
+ } else {
+ leftChar = offset == 0 ? 'midMid' : 'bottomMid';
+ if (this.cells) {
+ //TODO: cells should always exist - some tests don't fill it in though
+ let spanAbove = this.cells[this.y - 1][x] instanceof Cell.ColSpanCell;
+ if (spanAbove) {
+ leftChar = offset == 0 ? 'topMid' : 'mid';
+ }
+ if (offset == 0) {
+ let i = 1;
+ while (this.cells[this.y][x - i] instanceof Cell.ColSpanCell) {
+ i++;
+ }
+ if (this.cells[this.y][x - i] instanceof Cell.RowSpanCell) {
+ leftChar = 'leftMid';
+ }
+ }
+ }
+ }
+ }
+ return this.chars[leftChar];
+ }
+
+ wrapWithStyleColors(styleProperty, content) {
+ if (this[styleProperty] && this[styleProperty].length) {
+ try {
+ let colors = require('colors/safe');
+ for (let i = this[styleProperty].length - 1; i >= 0; i--) {
+ colors = colors[this[styleProperty][i]];
+ }
+ return colors(content);
+ } catch (e) {
+ return content;
+ }
+ } else {
+ return content;
+ }
+ }
+
+ /**
+ * Renders a line of text.
+ * @param lineNum - Which line of text to render. This is not necessarily the line within the cell.
+ * There may be top-padding above the first line of text.
+ * @param drawRight - true if this method should render the right edge of the cell.
+ * @param forceTruncationSymbol - `true` if the rendered text should end with the truncation symbol even
+ * if the text fits. This is used when the cell is vertically truncated. If `false` the text should
+ * only include the truncation symbol if the text will not fit horizontally within the cell width.
+ * @param spanningCell - a number of if being called from a RowSpanCell. (how many rows below). otherwise undefined.
+ * @returns {String}
+ */
+ drawLine(lineNum, drawRight, forceTruncationSymbol, spanningCell) {
+ let left = this.chars[this.x == 0 ? 'left' : 'middle'];
+ if (this.x && spanningCell && this.cells) {
+ let cellLeft = this.cells[this.y + spanningCell][this.x - 1];
+ while (cellLeft instanceof ColSpanCell) {
+ cellLeft = this.cells[cellLeft.y][cellLeft.x - 1];
+ }
+ if (!(cellLeft instanceof RowSpanCell)) {
+ left = this.chars['rightMid'];
+ }
+ }
+ let leftPadding = utils.repeat(' ', this.paddingLeft);
+ let right = drawRight ? this.chars['right'] : '';
+ let rightPadding = utils.repeat(' ', this.paddingRight);
+ let line = this.lines[lineNum];
+ let len = this.width - (this.paddingLeft + this.paddingRight);
+ if (forceTruncationSymbol) line += this.truncate || '…';
+ let content = utils.truncate(line, len, this.truncate);
+ content = utils.pad(content, len, ' ', this.hAlign);
+ content = leftPadding + content + rightPadding;
+ return this.stylizeLine(left, content, right);
+ }
+
+ stylizeLine(left, content, right) {
+ left = this.wrapWithStyleColors('border', left);
+ right = this.wrapWithStyleColors('border', right);
+ if (this.y === 0) {
+ content = this.wrapWithStyleColors('head', content);
+ }
+ return left + content + right;
+ }
+
+ /**
+ * Renders the bottom line of the cell.
+ * @param drawRight - true if this method should render the right edge of the cell.
+ * @returns {String}
+ */
+ drawBottom(drawRight) {
+ let left = this.chars[this.x == 0 ? 'bottomLeft' : 'bottomMid'];
+ let content = utils.repeat(this.chars.bottom, this.width);
+ let right = drawRight ? this.chars['bottomRight'] : '';
+ return this.wrapWithStyleColors('border', left + content + right);
+ }
+
+ /**
+ * Renders a blank line of text within the cell. Used for top and/or bottom padding.
+ * @param drawRight - true if this method should render the right edge of the cell.
+ * @param spanningCell - a number of if being called from a RowSpanCell. (how many rows below). otherwise undefined.
+ * @returns {String}
+ */
+ drawEmpty(drawRight, spanningCell) {
+ let left = this.chars[this.x == 0 ? 'left' : 'middle'];
+ if (this.x && spanningCell && this.cells) {
+ let cellLeft = this.cells[this.y + spanningCell][this.x - 1];
+ while (cellLeft instanceof ColSpanCell) {
+ cellLeft = this.cells[cellLeft.y][cellLeft.x - 1];
+ }
+ if (!(cellLeft instanceof RowSpanCell)) {
+ left = this.chars['rightMid'];
+ }
+ }
+ let right = drawRight ? this.chars['right'] : '';
+ let content = utils.repeat(' ', this.width);
+ return this.stylizeLine(left, content, right);
+ }
+}
+
+class ColSpanCell {
+ /**
+ * A Cell that doesn't do anything. It just draws empty lines.
+ * Used as a placeholder in column spanning.
+ * @constructor
+ */
+ constructor() {}
+
+ draw() {
+ return '';
+ }
+
+ init() {}
+
+ mergeTableOptions() {}
+}
+
+class RowSpanCell {
+ /**
+ * A placeholder Cell for a Cell that spans multiple rows.
+ * It delegates rendering to the original cell, but adds the appropriate offset.
+ * @param originalCell
+ * @constructor
+ */
+ constructor(originalCell) {
+ this.originalCell = originalCell;
+ }
+
+ init(tableOptions) {
+ let y = this.y;
+ let originalY = this.originalCell.y;
+ this.cellOffset = y - originalY;
+ this.offset = findDimension(tableOptions.rowHeights, originalY, this.cellOffset);
+ }
+
+ draw(lineNum) {
+ if (lineNum == 'top') {
+ return this.originalCell.draw(this.offset, this.cellOffset);
+ }
+ if (lineNum == 'bottom') {
+ return this.originalCell.draw('bottom');
+ }
+ return this.originalCell.draw(this.offset + 1 + lineNum);
+ }
+
+ mergeTableOptions() {}
+}
+
+// HELPER FUNCTIONS
+function setOption(objA, objB, nameB, targetObj) {
+ let nameA = nameB.split('-');
+ if (nameA.length > 1) {
+ nameA[1] = nameA[1].charAt(0).toUpperCase() + nameA[1].substr(1);
+ nameA = nameA.join('');
+ targetObj[nameA] = objA[nameA] || objA[nameB] || objB[nameA] || objB[nameB];
+ } else {
+ targetObj[nameB] = objA[nameB] || objB[nameB];
+ }
+}
+
+function findDimension(dimensionTable, startingIndex, span) {
+ let ret = dimensionTable[startingIndex];
+ for (let i = 1; i < span; i++) {
+ ret += 1 + dimensionTable[startingIndex + i];
+ }
+ return ret;
+}
+
+function sumPlusOne(a, b) {
+ return a + b + 1;
+}
+
+let CHAR_NAMES = [
+ 'top',
+ 'top-mid',
+ 'top-left',
+ 'top-right',
+ 'bottom',
+ 'bottom-mid',
+ 'bottom-left',
+ 'bottom-right',
+ 'left',
+ 'left-mid',
+ 'mid',
+ 'mid-mid',
+ 'right',
+ 'right-mid',
+ 'middle',
+];
+module.exports = Cell;
+module.exports.ColSpanCell = ColSpanCell;
+module.exports.RowSpanCell = RowSpanCell;
diff --git a/node_modules/cli-table3/src/layout-manager.js b/node_modules/cli-table3/src/layout-manager.js
new file mode 100644
index 000000000..908040e7e
--- /dev/null
+++ b/node_modules/cli-table3/src/layout-manager.js
@@ -0,0 +1,232 @@
+const objectAssign = require('object-assign');
+const Cell = require('./cell');
+const { ColSpanCell, RowSpanCell } = Cell;
+
+(function() {
+ function layoutTable(table) {
+ table.forEach(function(row, rowIndex) {
+ row.forEach(function(cell, columnIndex) {
+ cell.y = rowIndex;
+ cell.x = columnIndex;
+ for (let y = rowIndex; y >= 0; y--) {
+ let row2 = table[y];
+ let xMax = y === rowIndex ? columnIndex : row2.length;
+ for (let x = 0; x < xMax; x++) {
+ let cell2 = row2[x];
+ while (cellsConflict(cell, cell2)) {
+ cell.x++;
+ }
+ }
+ }
+ });
+ });
+ }
+
+ function maxWidth(table) {
+ let mw = 0;
+ table.forEach(function(row) {
+ row.forEach(function(cell) {
+ mw = Math.max(mw, cell.x + (cell.colSpan || 1));
+ });
+ });
+ return mw;
+ }
+
+ function maxHeight(table) {
+ return table.length;
+ }
+
+ function cellsConflict(cell1, cell2) {
+ let yMin1 = cell1.y;
+ let yMax1 = cell1.y - 1 + (cell1.rowSpan || 1);
+ let yMin2 = cell2.y;
+ let yMax2 = cell2.y - 1 + (cell2.rowSpan || 1);
+ let yConflict = !(yMin1 > yMax2 || yMin2 > yMax1);
+
+ let xMin1 = cell1.x;
+ let xMax1 = cell1.x - 1 + (cell1.colSpan || 1);
+ let xMin2 = cell2.x;
+ let xMax2 = cell2.x - 1 + (cell2.colSpan || 1);
+ let xConflict = !(xMin1 > xMax2 || xMin2 > xMax1);
+
+ return yConflict && xConflict;
+ }
+
+ function conflictExists(rows, x, y) {
+ let i_max = Math.min(rows.length - 1, y);
+ let cell = { x: x, y: y };
+ for (let i = 0; i <= i_max; i++) {
+ let row = rows[i];
+ for (let j = 0; j < row.length; j++) {
+ if (cellsConflict(cell, row[j])) {
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+ function allBlank(rows, y, xMin, xMax) {
+ for (let x = xMin; x < xMax; x++) {
+ if (conflictExists(rows, x, y)) {
+ return false;
+ }
+ }
+ return true;
+ }
+
+ function addRowSpanCells(table) {
+ table.forEach(function(row, rowIndex) {
+ row.forEach(function(cell) {
+ for (let i = 1; i < cell.rowSpan; i++) {
+ let rowSpanCell = new RowSpanCell(cell);
+ rowSpanCell.x = cell.x;
+ rowSpanCell.y = cell.y + i;
+ rowSpanCell.colSpan = cell.colSpan;
+ insertCell(rowSpanCell, table[rowIndex + i]);
+ }
+ });
+ });
+ }
+
+ function addColSpanCells(cellRows) {
+ for (let rowIndex = cellRows.length - 1; rowIndex >= 0; rowIndex--) {
+ let cellColumns = cellRows[rowIndex];
+ for (let columnIndex = 0; columnIndex < cellColumns.length; columnIndex++) {
+ let cell = cellColumns[columnIndex];
+ for (let k = 1; k < cell.colSpan; k++) {
+ let colSpanCell = new ColSpanCell();
+ colSpanCell.x = cell.x + k;
+ colSpanCell.y = cell.y;
+ cellColumns.splice(columnIndex + 1, 0, colSpanCell);
+ }
+ }
+ }
+ }
+
+ function insertCell(cell, row) {
+ let x = 0;
+ while (x < row.length && row[x].x < cell.x) {
+ x++;
+ }
+ row.splice(x, 0, cell);
+ }
+
+ function fillInTable(table) {
+ let h_max = maxHeight(table);
+ let w_max = maxWidth(table);
+ for (let y = 0; y < h_max; y++) {
+ for (let x = 0; x < w_max; x++) {
+ if (!conflictExists(table, x, y)) {
+ let opts = { x: x, y: y, colSpan: 1, rowSpan: 1 };
+ x++;
+ while (x < w_max && !conflictExists(table, x, y)) {
+ opts.colSpan++;
+ x++;
+ }
+ let y2 = y + 1;
+ while (y2 < h_max && allBlank(table, y2, opts.x, opts.x + opts.colSpan)) {
+ opts.rowSpan++;
+ y2++;
+ }
+
+ let cell = new Cell(opts);
+ cell.x = opts.x;
+ cell.y = opts.y;
+ insertCell(cell, table[y]);
+ }
+ }
+ }
+ }
+
+ function generateCells(rows) {
+ return rows.map(function(row) {
+ if (!Array.isArray(row)) {
+ let key = Object.keys(row)[0];
+ row = row[key];
+ if (Array.isArray(row)) {
+ row = row.slice();
+ row.unshift(key);
+ } else {
+ row = [key, row];
+ }
+ }
+ return row.map(function(cell) {
+ return new Cell(cell);
+ });
+ });
+ }
+
+ function makeTableLayout(rows) {
+ let cellRows = generateCells(rows);
+ layoutTable(cellRows);
+ fillInTable(cellRows);
+ addRowSpanCells(cellRows);
+ addColSpanCells(cellRows);
+ return cellRows;
+ }
+
+ module.exports = {
+ makeTableLayout: makeTableLayout,
+ layoutTable: layoutTable,
+ addRowSpanCells: addRowSpanCells,
+ maxWidth: maxWidth,
+ fillInTable: fillInTable,
+ computeWidths: makeComputeWidths('colSpan', 'desiredWidth', 'x', 1),
+ computeHeights: makeComputeWidths('rowSpan', 'desiredHeight', 'y', 1),
+ };
+})();
+
+function makeComputeWidths(colSpan, desiredWidth, x, forcedMin) {
+ return function(vals, table) {
+ let result = [];
+ let spanners = [];
+ table.forEach(function(row) {
+ row.forEach(function(cell) {
+ if ((cell[colSpan] || 1) > 1) {
+ spanners.push(cell);
+ } else {
+ result[cell[x]] = Math.max(result[cell[x]] || 0, cell[desiredWidth] || 0, forcedMin);
+ }
+ });
+ });
+
+ vals.forEach(function(val, index) {
+ if (typeof val === 'number') {
+ result[index] = val;
+ }
+ });
+
+ //spanners.forEach(function(cell){
+ for (let k = spanners.length - 1; k >= 0; k--) {
+ let cell = spanners[k];
+ let span = cell[colSpan];
+ let col = cell[x];
+ let existingWidth = result[col];
+ let editableCols = typeof vals[col] === 'number' ? 0 : 1;
+ for (let i = 1; i < span; i++) {
+ existingWidth += 1 + result[col + i];
+ if (typeof vals[col + i] !== 'number') {
+ editableCols++;
+ }
+ }
+ if (cell[desiredWidth] > existingWidth) {
+ let i = 0;
+ while (editableCols > 0 && cell[desiredWidth] > existingWidth) {
+ if (typeof vals[col + i] !== 'number') {
+ let dif = Math.round((cell[desiredWidth] - existingWidth) / editableCols);
+ existingWidth += dif;
+ result[col + i] += dif;
+ editableCols--;
+ }
+ i++;
+ }
+ }
+ }
+
+ objectAssign(vals, result);
+ for (let j = 0; j < vals.length; j++) {
+ vals[j] = Math.max(forcedMin, vals[j] || 0);
+ }
+ };
+}
diff --git a/node_modules/cli-table3/src/table.js b/node_modules/cli-table3/src/table.js
new file mode 100644
index 000000000..af4f14646
--- /dev/null
+++ b/node_modules/cli-table3/src/table.js
@@ -0,0 +1,77 @@
+const utils = require('./utils');
+const tableLayout = require('./layout-manager');
+
+class Table extends Array {
+ constructor(options) {
+ super();
+
+ this.options = utils.mergeOptions(options);
+ }
+
+ toString() {
+ let array = this;
+ let headersPresent = this.options.head && this.options.head.length;
+ if (headersPresent) {
+ array = [this.options.head];
+ if (this.length) {
+ array.push.apply(array, this);
+ }
+ } else {
+ this.options.style.head = [];
+ }
+
+ let cells = tableLayout.makeTableLayout(array);
+
+ cells.forEach(function(row) {
+ row.forEach(function(cell) {
+ cell.mergeTableOptions(this.options, cells);
+ }, this);
+ }, this);
+
+ tableLayout.computeWidths(this.options.colWidths, cells);
+ tableLayout.computeHeights(this.options.rowHeights, cells);
+
+ cells.forEach(function(row) {
+ row.forEach(function(cell) {
+ cell.init(this.options);
+ }, this);
+ }, this);
+
+ let result = [];
+
+ for (let rowIndex = 0; rowIndex < cells.length; rowIndex++) {
+ let row = cells[rowIndex];
+ let heightOfRow = this.options.rowHeights[rowIndex];
+
+ if (rowIndex === 0 || !this.options.style.compact || (rowIndex == 1 && headersPresent)) {
+ doDraw(row, 'top', result);
+ }
+
+ for (let lineNum = 0; lineNum < heightOfRow; lineNum++) {
+ doDraw(row, lineNum, result);
+ }
+
+ if (rowIndex + 1 == cells.length) {
+ doDraw(row, 'bottom', result);
+ }
+ }
+
+ return result.join('\n');
+ }
+
+ get width() {
+ let str = this.toString().split('\n');
+ return str[0].length;
+ }
+}
+
+function doDraw(row, lineNum, result) {
+ let line = [];
+ row.forEach(function(cell) {
+ line.push(cell.draw(lineNum));
+ });
+ let str = line.join('');
+ if (str.length) result.push(str);
+}
+
+module.exports = Table;
diff --git a/node_modules/cli-table3/src/utils.js b/node_modules/cli-table3/src/utils.js
new file mode 100644
index 000000000..c9149558e
--- /dev/null
+++ b/node_modules/cli-table3/src/utils.js
@@ -0,0 +1,303 @@
+const objectAssign = require('object-assign');
+const stringWidth = require('string-width');
+
+function codeRegex(capture) {
+ return capture ? /\u001b\[((?:\d*;){0,5}\d*)m/g : /\u001b\[(?:\d*;){0,5}\d*m/g;
+}
+
+function strlen(str) {
+ let code = codeRegex();
+ let stripped = ('' + str).replace(code, '');
+ let split = stripped.split('\n');
+ return split.reduce(function(memo, s) {
+ return stringWidth(s) > memo ? stringWidth(s) : memo;
+ }, 0);
+}
+
+function repeat(str, times) {
+ return Array(times + 1).join(str);
+}
+
+function pad(str, len, pad, dir) {
+ let length = strlen(str);
+ if (len + 1 >= length) {
+ let padlen = len - length;
+ switch (dir) {
+ case 'right': {
+ str = repeat(pad, padlen) + str;
+ break;
+ }
+ case 'center': {
+ let right = Math.ceil(padlen / 2);
+ let left = padlen - right;
+ str = repeat(pad, left) + str + repeat(pad, right);
+ break;
+ }
+ default: {
+ str = str + repeat(pad, padlen);
+ break;
+ }
+ }
+ }
+ return str;
+}
+
+let codeCache = {};
+
+function addToCodeCache(name, on, off) {
+ on = '\u001b[' + on + 'm';
+ off = '\u001b[' + off + 'm';
+ codeCache[on] = { set: name, to: true };
+ codeCache[off] = { set: name, to: false };
+ codeCache[name] = { on: on, off: off };
+}
+
+//https://github.com/Marak/colors.js/blob/master/lib/styles.js
+addToCodeCache('bold', 1, 22);
+addToCodeCache('italics', 3, 23);
+addToCodeCache('underline', 4, 24);
+addToCodeCache('inverse', 7, 27);
+addToCodeCache('strikethrough', 9, 29);
+
+function updateState(state, controlChars) {
+ let controlCode = controlChars[1] ? parseInt(controlChars[1].split(';')[0]) : 0;
+ if ((controlCode >= 30 && controlCode <= 39) || (controlCode >= 90 && controlCode <= 97)) {
+ state.lastForegroundAdded = controlChars[0];
+ return;
+ }
+ if ((controlCode >= 40 && controlCode <= 49) || (controlCode >= 100 && controlCode <= 107)) {
+ state.lastBackgroundAdded = controlChars[0];
+ return;
+ }
+ if (controlCode === 0) {
+ for (let i in state) {
+ /* istanbul ignore else */
+ if (state.hasOwnProperty(i)) {
+ delete state[i];
+ }
+ }
+ return;
+ }
+ let info = codeCache[controlChars[0]];
+ if (info) {
+ state[info.set] = info.to;
+ }
+}
+
+function readState(line) {
+ let code = codeRegex(true);
+ let controlChars = code.exec(line);
+ let state = {};
+ while (controlChars !== null) {
+ updateState(state, controlChars);
+ controlChars = code.exec(line);
+ }
+ return state;
+}
+
+function unwindState(state, ret) {
+ let lastBackgroundAdded = state.lastBackgroundAdded;
+ let lastForegroundAdded = state.lastForegroundAdded;
+
+ delete state.lastBackgroundAdded;
+ delete state.lastForegroundAdded;
+
+ Object.keys(state).forEach(function(key) {
+ if (state[key]) {
+ ret += codeCache[key].off;
+ }
+ });
+
+ if (lastBackgroundAdded && lastBackgroundAdded != '\u001b[49m') {
+ ret += '\u001b[49m';
+ }
+ if (lastForegroundAdded && lastForegroundAdded != '\u001b[39m') {
+ ret += '\u001b[39m';
+ }
+
+ return ret;
+}
+
+function rewindState(state, ret) {
+ let lastBackgroundAdded = state.lastBackgroundAdded;
+ let lastForegroundAdded = state.lastForegroundAdded;
+
+ delete state.lastBackgroundAdded;
+ delete state.lastForegroundAdded;
+
+ Object.keys(state).forEach(function(key) {
+ if (state[key]) {
+ ret = codeCache[key].on + ret;
+ }
+ });
+
+ if (lastBackgroundAdded && lastBackgroundAdded != '\u001b[49m') {
+ ret = lastBackgroundAdded + ret;
+ }
+ if (lastForegroundAdded && lastForegroundAdded != '\u001b[39m') {
+ ret = lastForegroundAdded + ret;
+ }
+
+ return ret;
+}
+
+function truncateWidth(str, desiredLength) {
+ if (str.length === strlen(str)) {
+ return str.substr(0, desiredLength);
+ }
+
+ while (strlen(str) > desiredLength) {
+ str = str.slice(0, -1);
+ }
+
+ return str;
+}
+
+function truncateWidthWithAnsi(str, desiredLength) {
+ let code = codeRegex(true);
+ let split = str.split(codeRegex());
+ let splitIndex = 0;
+ let retLen = 0;
+ let ret = '';
+ let myArray;
+ let state = {};
+
+ while (retLen < desiredLength) {
+ myArray = code.exec(str);
+ let toAdd = split[splitIndex];
+ splitIndex++;
+ if (retLen + strlen(toAdd) > desiredLength) {
+ toAdd = truncateWidth(toAdd, desiredLength - retLen);
+ }
+ ret += toAdd;
+ retLen += strlen(toAdd);
+
+ if (retLen < desiredLength) {
+ if (!myArray) {
+ break;
+ } // full-width chars may cause a whitespace which cannot be filled
+ ret += myArray[0];
+ updateState(state, myArray);
+ }
+ }
+
+ return unwindState(state, ret);
+}
+
+function truncate(str, desiredLength, truncateChar) {
+ truncateChar = truncateChar || '…';
+ let lengthOfStr = strlen(str);
+ if (lengthOfStr <= desiredLength) {
+ return str;
+ }
+ desiredLength -= strlen(truncateChar);
+
+ let ret = truncateWidthWithAnsi(str, desiredLength);
+
+ return ret + truncateChar;
+}
+
+function defaultOptions() {
+ return {
+ chars: {
+ top: '─',
+ 'top-mid': '┬',
+ 'top-left': '┌',
+ 'top-right': '┐',
+ bottom: '─',
+ 'bottom-mid': '┴',
+ 'bottom-left': '└',
+ 'bottom-right': '┘',
+ left: '│',
+ 'left-mid': '├',
+ mid: '─',
+ 'mid-mid': '┼',
+ right: '│',
+ 'right-mid': '┤',
+ middle: '│',
+ },
+ truncate: '…',
+ colWidths: [],
+ rowHeights: [],
+ colAligns: [],
+ rowAligns: [],
+ style: {
+ 'padding-left': 1,
+ 'padding-right': 1,
+ head: ['red'],
+ border: ['grey'],
+ compact: false,
+ },
+ head: [],
+ };
+}
+
+function mergeOptions(options, defaults) {
+ options = options || {};
+ defaults = defaults || defaultOptions();
+ let ret = objectAssign({}, defaults, options);
+ ret.chars = objectAssign({}, defaults.chars, options.chars);
+ ret.style = objectAssign({}, defaults.style, options.style);
+ return ret;
+}
+
+function wordWrap(maxLength, input) {
+ let lines = [];
+ let split = input.split(/(\s+)/g);
+ let line = [];
+ let lineLength = 0;
+ let whitespace;
+ for (let i = 0; i < split.length; i += 2) {
+ let word = split[i];
+ let newLength = lineLength + strlen(word);
+ if (lineLength > 0 && whitespace) {
+ newLength += whitespace.length;
+ }
+ if (newLength > maxLength) {
+ if (lineLength !== 0) {
+ lines.push(line.join(''));
+ }
+ line = [word];
+ lineLength = strlen(word);
+ } else {
+ line.push(whitespace || '', word);
+ lineLength = newLength;
+ }
+ whitespace = split[i + 1];
+ }
+ if (lineLength) {
+ lines.push(line.join(''));
+ }
+ return lines;
+}
+
+function multiLineWordWrap(maxLength, input) {
+ let output = [];
+ input = input.split('\n');
+ for (let i = 0; i < input.length; i++) {
+ output.push.apply(output, wordWrap(maxLength, input[i]));
+ }
+ return output;
+}
+
+function colorizeLines(input) {
+ let state = {};
+ let output = [];
+ for (let i = 0; i < input.length; i++) {
+ let line = rewindState(state, input[i]);
+ state = readState(line);
+ let temp = objectAssign({}, state);
+ output.push(unwindState(temp, line));
+ }
+ return output;
+}
+
+module.exports = {
+ strlen: strlen,
+ repeat: repeat,
+ pad: pad,
+ truncate: truncate,
+ mergeOptions: mergeOptions,
+ wordWrap: multiLineWordWrap,
+ colorizeLines: colorizeLines,
+};