údržba
This commit is contained in:
		
							
								
								
									
										104
									
								
								CyLukTs/lukan/node_modules/cli-table3/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										104
									
								
								CyLukTs/lukan/node_modules/cli-table3/CHANGELOG.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,104 @@
 | 
			
		||||
# Changelog
 | 
			
		||||
 | 
			
		||||
## v0.6.2 (2022-04-11)
 | 
			
		||||
 | 
			
		||||
#### :rocket: Enhancement
 | 
			
		||||
* [#292](https://github.com/cli-table/cli-table3/pull/292) Hyperlink support for cells ([@speedytwenty](https://github.com/speedytwenty))
 | 
			
		||||
* [#288](https://github.com/cli-table/cli-table3/pull/288) Add debugging capabilities ([@speedytwenty](https://github.com/speedytwenty))
 | 
			
		||||
* [#217](https://github.com/cli-table/cli-table3/pull/217) Add wrapOnWordBoundary option for consistently readable word wrapping ([@speedytwenty](https://github.com/speedytwenty))
 | 
			
		||||
 | 
			
		||||
#### :bug: Bug Fix
 | 
			
		||||
* [#290](https://github.com/cli-table/cli-table3/pull/290) Fix to erroneous column truncation when using colSpan ([@speedytwenty](https://github.com/speedytwenty))
 | 
			
		||||
* [#287](https://github.com/cli-table/cli-table3/pull/287) Correctly set cell padding for zero values ([@speedytwenty](https://github.com/speedytwenty))
 | 
			
		||||
* [#278](https://github.com/cli-table/cli-table3/pull/278) Refactored table layouts + Layout fix for #269 ([@speedytwenty](https://github.com/speedytwenty))
 | 
			
		||||
 | 
			
		||||
#### :memo: Documentation
 | 
			
		||||
* [#286](https://github.com/cli-table/cli-table3/pull/286) Regenerate docs ([@speedytwenty](https://github.com/speedytwenty))
 | 
			
		||||
 | 
			
		||||
#### :house: Internal
 | 
			
		||||
* [#276](https://github.com/cli-table/cli-table3/pull/276) Move CI to Github Actions ([@speedytwenty](https://github.com/speedytwenty))
 | 
			
		||||
* [#283](https://github.com/cli-table/cli-table3/pull/283) #196 - Fix to failing unit tests ([@speedytwenty](https://github.com/speedytwenty))
 | 
			
		||||
 | 
			
		||||
## v0.6.1 (2022-01-09)
 | 
			
		||||
 | 
			
		||||
* [#251](https://github.com/cli-table/cli-table3/pull/251) Pin `colors` to 1.4.0 ([@JJ](https://github.com/JJ))
 | 
			
		||||
 | 
			
		||||
## v0.6.0 (2020-03-30)
 | 
			
		||||
 | 
			
		||||
#### :boom: Breaking Change
 | 
			
		||||
* [#156](https://github.com/cli-table/cli-table3/pull/156) Drop support for Node 6 and 8 ([@Turbo87](https://github.com/Turbo87))
 | 
			
		||||
 | 
			
		||||
#### :bug: Bug Fix
 | 
			
		||||
* [#92](https://github.com/cli-table/cli-table3/pull/92) Emoji Length Calculation Fix ([@acupoftee](https://github.com/acupoftee))
 | 
			
		||||
* [#53](https://github.com/cli-table/cli-table3/pull/53) "Table" union type definition fix ([@macieklad](https://github.com/macieklad))
 | 
			
		||||
 | 
			
		||||
#### :memo: Documentation
 | 
			
		||||
* [#135](https://github.com/cli-table/cli-table3/pull/135) docs: use https ([@DanielRuf](https://github.com/DanielRuf))
 | 
			
		||||
 | 
			
		||||
#### :house: Internal
 | 
			
		||||
* [#132](https://github.com/cli-table/cli-table3/pull/132) Update lockfile ([@DanielRuf](https://github.com/DanielRuf))
 | 
			
		||||
* [#134](https://github.com/cli-table/cli-table3/pull/134) Fix ESLint errors ([@DanielRuf](https://github.com/DanielRuf))
 | 
			
		||||
* [#103](https://github.com/cli-table/cli-table3/pull/103) Fix Jest configuration ([@boneskull](https://github.com/boneskull))
 | 
			
		||||
 | 
			
		||||
#### Committers: 5
 | 
			
		||||
- Christopher Hiller ([@boneskull](https://github.com/boneskull))
 | 
			
		||||
- Daniel Ruf ([@DanielRuf](https://github.com/DanielRuf))
 | 
			
		||||
- Maciej Ładoś ([@macieklad](https://github.com/macieklad))
 | 
			
		||||
- Tee ([@acupoftee](https://github.com/acupoftee))
 | 
			
		||||
- Tobias Bieniek ([@Turbo87](https://github.com/Turbo87))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## v0.5.1 (2018-07-19)
 | 
			
		||||
 | 
			
		||||
#### :rocket: Enhancement
 | 
			
		||||
* [#21](https://github.com/cli-table/cli-table3/pull/21) Import type definition from `@types/cli-table2` ([@Turbo87](https://github.com/Turbo87))
 | 
			
		||||
 | 
			
		||||
#### Committers: 1
 | 
			
		||||
- Tobias Bieniek ([Turbo87](https://github.com/Turbo87))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## 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: 2
 | 
			
		||||
- Daniel Ruf ([DanielRuf](https://github.com/DanielRuf))
 | 
			
		||||
- Tobias Bieniek ([Turbo87](https://github.com/Turbo87))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
## 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))
 | 
			
		||||
							
								
								
									
										21
									
								
								CyLukTs/lukan/node_modules/cli-table3/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										21
									
								
								CyLukTs/lukan/node_modules/cli-table3/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -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.
 | 
			
		||||
							
								
								
									
										236
									
								
								CyLukTs/lukan/node_modules/cli-table3/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										236
									
								
								CyLukTs/lukan/node_modules/cli-table3/README.md
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,236 @@
 | 
			
		||||
cli-table3 
 | 
			
		||||
===============================================================================
 | 
			
		||||
 | 
			
		||||
[](https://www.npmjs.com/package/cli-table3)
 | 
			
		||||
[](https://github.com/cli-table/cli-table3/actions/workflows/test.yml)
 | 
			
		||||
 | 
			
		||||
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`.
 | 
			
		||||
 | 
			
		||||

 | 
			
		||||
 | 
			
		||||
## 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).
 | 
			
		||||
- [Word wrapping options](./basic-usage.md#set-wordwrap-to-true-to-wrap-text-on-word-boundaries).
 | 
			
		||||
- 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
 | 
			
		||||
  [<s>colors.js</s>](https://github.com/marak/colors.js)
 | 
			
		||||
  [@colors/colors](https://github.com/DABH/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
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
## Debugging
 | 
			
		||||
 | 
			
		||||
Later versions of cli-table3 supporting debugging your table data.
 | 
			
		||||
 | 
			
		||||
Enable and use debugging:
 | 
			
		||||
 | 
			
		||||
```
 | 
			
		||||
var table = new Table({ debug: 1 });
 | 
			
		||||
table.push([{}, {},}); // etc.
 | 
			
		||||
 | 
			
		||||
console.log(table.toString());
 | 
			
		||||
table.messages.forEach((message) => console.log(message));
 | 
			
		||||
```
 | 
			
		||||
 | 
			
		||||
If you are rendering multiple tables with debugging on run `Table.reset()` after
 | 
			
		||||
rendering each table.
 | 
			
		||||
 | 
			
		||||
## 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 <james.talmage@jrtechnical.com> ([jamestalmage](https://github.com/jamestalmage))
 | 
			
		||||
- Guillermo Rauch - author of the original cli-table <guillermo@learnboost.com> ([Rauchg](https://github.com/rauchg))
 | 
			
		||||
 | 
			
		||||
## License
 | 
			
		||||
 | 
			
		||||
(The MIT License)
 | 
			
		||||
 | 
			
		||||
Copyright (c) 2014 James Talmage <james.talmage@jrtechnical.com>
 | 
			
		||||
 | 
			
		||||
Original cli-table code/documentation: Copyright (c) 2010 LearnBoost <dev@learnboost.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.
 | 
			
		||||
							
								
								
									
										93
									
								
								CyLukTs/lukan/node_modules/cli-table3/index.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										93
									
								
								CyLukTs/lukan/node_modules/cli-table3/index.d.ts
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,93 @@
 | 
			
		||||
declare namespace CliTable3 {
 | 
			
		||||
    type CharName =
 | 
			
		||||
        "top" |
 | 
			
		||||
        "top-mid" |
 | 
			
		||||
        "top-left" |
 | 
			
		||||
        "top-right" |
 | 
			
		||||
        "bottom" |
 | 
			
		||||
        "bottom-mid" |
 | 
			
		||||
        "bottom-left" |
 | 
			
		||||
        "bottom-right" |
 | 
			
		||||
        "left" |
 | 
			
		||||
        "left-mid" |
 | 
			
		||||
        "mid" |
 | 
			
		||||
        "mid-mid" |
 | 
			
		||||
        "right" |
 | 
			
		||||
        "right-mid" |
 | 
			
		||||
        "middle";
 | 
			
		||||
 | 
			
		||||
    type HorizontalAlignment = "left" | "center" | "right";
 | 
			
		||||
    type VerticalAlignment = "top" | "center" | "bottom";
 | 
			
		||||
 | 
			
		||||
    interface TableOptions {
 | 
			
		||||
        truncate: string;
 | 
			
		||||
        colWidths: Array<number | null>;
 | 
			
		||||
        rowHeights: Array<number | null>;
 | 
			
		||||
        colAligns: HorizontalAlignment[];
 | 
			
		||||
        rowAligns: VerticalAlignment[];
 | 
			
		||||
        head: string[];
 | 
			
		||||
        wordWrap: boolean;
 | 
			
		||||
        wrapOnWordBoundary: boolean;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    interface TableInstanceOptions extends TableOptions {
 | 
			
		||||
        chars: Record<CharName, string>;
 | 
			
		||||
        style: {
 | 
			
		||||
            "padding-left": number;
 | 
			
		||||
            "padding-right": number;
 | 
			
		||||
            head: string[];
 | 
			
		||||
            border: string[];
 | 
			
		||||
            compact: boolean;
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    interface TableConstructorOptions extends Partial<TableOptions> {
 | 
			
		||||
        chars?: Partial<Record<CharName, string>>;
 | 
			
		||||
        style?: Partial<TableInstanceOptions["style"]>;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    type CellValue = boolean | number | string | null | undefined;
 | 
			
		||||
 | 
			
		||||
    interface CellOptions {
 | 
			
		||||
        content: CellValue;
 | 
			
		||||
        chars?: Partial<Record<CharName, string>>;
 | 
			
		||||
        truncate?: string;
 | 
			
		||||
        colSpan?: number;
 | 
			
		||||
        rowSpan?: number;
 | 
			
		||||
        hAlign?: HorizontalAlignment;
 | 
			
		||||
        vAlign?: VerticalAlignment;
 | 
			
		||||
        style?: {
 | 
			
		||||
            "padding-left"?: number;
 | 
			
		||||
            "padding-right"?: number;
 | 
			
		||||
            head?: string[];
 | 
			
		||||
            border?: string[];
 | 
			
		||||
        };
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    interface GenericTable<T> extends Array<T> {
 | 
			
		||||
        options: TableInstanceOptions;
 | 
			
		||||
        readonly width: number;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    type Table = GenericTable<HorizontalTableRow|VerticalTableRow|CrossTableRow>;
 | 
			
		||||
    type Cell = CellValue | CellOptions;
 | 
			
		||||
 | 
			
		||||
    type HorizontalTableRow = Cell[];
 | 
			
		||||
 | 
			
		||||
    interface VerticalTableRow {
 | 
			
		||||
        [name: string]: Cell;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    interface CrossTableRow {
 | 
			
		||||
        [name: string]: Cell[];
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
interface CliTable3 {
 | 
			
		||||
    new (options?: CliTable3.TableConstructorOptions): CliTable3.Table;
 | 
			
		||||
    readonly prototype: CliTable3.Table;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
declare const CliTable3: CliTable3;
 | 
			
		||||
 | 
			
		||||
export = CliTable3;
 | 
			
		||||
							
								
								
									
										1
									
								
								CyLukTs/lukan/node_modules/cli-table3/index.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										1
									
								
								CyLukTs/lukan/node_modules/cli-table3/index.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1 @@
 | 
			
		||||
module.exports = require('./src/table');
 | 
			
		||||
							
								
								
									
										100
									
								
								CyLukTs/lukan/node_modules/cli-table3/package.json
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										100
									
								
								CyLukTs/lukan/node_modules/cli-table3/package.json
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,100 @@
 | 
			
		||||
{
 | 
			
		||||
  "name": "cli-table3",
 | 
			
		||||
  "version": "0.6.3",
 | 
			
		||||
  "description": "Pretty unicode tables for the command line. Based on the original cli-table.",
 | 
			
		||||
  "main": "index.js",
 | 
			
		||||
  "types": "index.d.ts",
 | 
			
		||||
  "files": [
 | 
			
		||||
    "src/",
 | 
			
		||||
    "index.d.ts",
 | 
			
		||||
    "index.js"
 | 
			
		||||
  ],
 | 
			
		||||
  "directories": {
 | 
			
		||||
    "test": "test"
 | 
			
		||||
  },
 | 
			
		||||
  "dependencies": {
 | 
			
		||||
    "string-width": "^4.2.0"
 | 
			
		||||
  },
 | 
			
		||||
  "devDependencies": {
 | 
			
		||||
    "cli-table": "^0.3.1",
 | 
			
		||||
    "eslint": "^6.0.0",
 | 
			
		||||
    "eslint-config-prettier": "^6.0.0",
 | 
			
		||||
    "eslint-plugin-prettier": "^3.0.0",
 | 
			
		||||
    "jest": "^25.2.4",
 | 
			
		||||
    "jest-runner-eslint": "^0.7.0",
 | 
			
		||||
    "lerna-changelog": "^1.0.1",
 | 
			
		||||
    "prettier": "2.3.2"
 | 
			
		||||
  },
 | 
			
		||||
  "optionalDependencies": {
 | 
			
		||||
    "@colors/colors": "1.5.0"
 | 
			
		||||
  },
 | 
			
		||||
  "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"
 | 
			
		||||
  },
 | 
			
		||||
  "repository": {
 | 
			
		||||
    "type": "git",
 | 
			
		||||
    "url": "https://github.com/cli-table/cli-table3.git"
 | 
			
		||||
  },
 | 
			
		||||
  "keywords": [
 | 
			
		||||
    "node",
 | 
			
		||||
    "command",
 | 
			
		||||
    "line",
 | 
			
		||||
    "cli",
 | 
			
		||||
    "table",
 | 
			
		||||
    "tables",
 | 
			
		||||
    "tabular",
 | 
			
		||||
    "unicode",
 | 
			
		||||
    "colors",
 | 
			
		||||
    "grid"
 | 
			
		||||
  ],
 | 
			
		||||
  "author": "James Talmage",
 | 
			
		||||
  "license": "MIT",
 | 
			
		||||
  "bugs": {
 | 
			
		||||
    "url": "https://github.com/cli-table/cli-table3/issues"
 | 
			
		||||
  },
 | 
			
		||||
  "homepage": "https://github.com/cli-table/cli-table3",
 | 
			
		||||
  "engines": {
 | 
			
		||||
    "node": "10.* || >= 12.*"
 | 
			
		||||
  },
 | 
			
		||||
  "changelog": {
 | 
			
		||||
    "repo": "cli-table/cli-table3",
 | 
			
		||||
    "labels": {
 | 
			
		||||
      "breaking": ":boom: Breaking Change",
 | 
			
		||||
      "enhancement": ":rocket: Enhancement",
 | 
			
		||||
      "bug": ":bug: Bug Fix",
 | 
			
		||||
      "documentation": ":memo: Documentation",
 | 
			
		||||
      "internal": ":house: Internal"
 | 
			
		||||
    }
 | 
			
		||||
  },
 | 
			
		||||
  "jest": {
 | 
			
		||||
    "projects": [
 | 
			
		||||
      {
 | 
			
		||||
        "displayName": "test",
 | 
			
		||||
        "testMatch": [
 | 
			
		||||
          "<rootDir>/test/**/*.js"
 | 
			
		||||
        ]
 | 
			
		||||
      },
 | 
			
		||||
      {
 | 
			
		||||
        "runner": "jest-runner-eslint",
 | 
			
		||||
        "displayName": "lint",
 | 
			
		||||
        "testMatch": [
 | 
			
		||||
          "<rootDir>/examples/**/*.js",
 | 
			
		||||
          "<rootDir>/lib/**/*.js",
 | 
			
		||||
          "<rootDir>/scripts/**/*.js",
 | 
			
		||||
          "<rootDir>/src/**/*.js",
 | 
			
		||||
          "<rootDir>/test/**/*.js"
 | 
			
		||||
        ]
 | 
			
		||||
      }
 | 
			
		||||
    ]
 | 
			
		||||
  },
 | 
			
		||||
  "prettier": {
 | 
			
		||||
    "printWidth": 120,
 | 
			
		||||
    "tabWidth": 2,
 | 
			
		||||
    "singleQuote": true,
 | 
			
		||||
    "trailingComma": "es5"
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										409
									
								
								CyLukTs/lukan/node_modules/cli-table3/src/cell.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										409
									
								
								CyLukTs/lukan/node_modules/cli-table3/src/cell.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,409 @@
 | 
			
		||||
const { info, debug } = require('./debug');
 | 
			
		||||
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 = this.options.href || '';
 | 
			
		||||
    } else {
 | 
			
		||||
      throw new Error('Content needs to be a primitive, got: ' + typeof content);
 | 
			
		||||
    }
 | 
			
		||||
    this.colSpan = options.colSpan || 1;
 | 
			
		||||
    this.rowSpan = options.rowSpan || 1;
 | 
			
		||||
    if (this.options.href) {
 | 
			
		||||
      Object.defineProperty(this, 'href', {
 | 
			
		||||
        get() {
 | 
			
		||||
          return this.options.href;
 | 
			
		||||
        },
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  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;
 | 
			
		||||
 | 
			
		||||
    this.fixedWidth = tableOptions.colWidths[this.x];
 | 
			
		||||
    this.lines = this.computeLines(tableOptions);
 | 
			
		||||
 | 
			
		||||
    this.desiredWidth = utils.strlen(this.content) + this.paddingLeft + this.paddingRight;
 | 
			
		||||
    this.desiredHeight = this.lines.length;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  computeLines(tableOptions) {
 | 
			
		||||
    const tableWordWrap = tableOptions.wordWrap || tableOptions.textWrap;
 | 
			
		||||
    const { wordWrap = tableWordWrap } = this.options;
 | 
			
		||||
    if (this.fixedWidth && wordWrap) {
 | 
			
		||||
      this.fixedWidth -= this.paddingLeft + this.paddingRight;
 | 
			
		||||
      if (this.colSpan) {
 | 
			
		||||
        let i = 1;
 | 
			
		||||
        while (i < this.colSpan) {
 | 
			
		||||
          this.fixedWidth += tableOptions.colWidths[this.x + i];
 | 
			
		||||
          i++;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
      const { wrapOnWordBoundary: tableWrapOnWordBoundary = true } = tableOptions;
 | 
			
		||||
      const { wrapOnWordBoundary = tableWrapOnWordBoundary } = this.options;
 | 
			
		||||
      return this.wrapLines(utils.wordWrap(this.fixedWidth, this.content, wrapOnWordBoundary));
 | 
			
		||||
    }
 | 
			
		||||
    return this.wrapLines(this.content.split('\n'));
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  wrapLines(computedLines) {
 | 
			
		||||
    const lines = utils.colorizeLines(computedLines);
 | 
			
		||||
    if (this.href) {
 | 
			
		||||
      return lines.map((line) => utils.hyperlink(this.href, line));
 | 
			
		||||
    }
 | 
			
		||||
    return lines;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  /**
 | 
			
		||||
   * 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 content = utils.truncate(this.content, 10, this.truncate);
 | 
			
		||||
    if (!lineNum) {
 | 
			
		||||
      info(`${this.y}-${this.x}: ${this.rowSpan - lineNum}x${this.colSpan} Cell ${content}`);
 | 
			
		||||
    } else {
 | 
			
		||||
      // debug(`${lineNum}-${this.x}: 1x${this.colSpan} RowSpanCell ${content}`);
 | 
			
		||||
    }
 | 
			
		||||
    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/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(lineNum) {
 | 
			
		||||
    if (typeof lineNum === 'number') {
 | 
			
		||||
      debug(`${this.y}-${this.x}: 1x1 ColSpanCell`);
 | 
			
		||||
    }
 | 
			
		||||
    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');
 | 
			
		||||
    }
 | 
			
		||||
    debug(`${this.y}-${this.x}: 1x${this.colSpan} RowSpanCell for ${this.originalCell.content}`);
 | 
			
		||||
    return this.originalCell.draw(this.offset + 1 + lineNum);
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  mergeTableOptions() {}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function firstDefined(...args) {
 | 
			
		||||
  return args.filter((v) => v !== undefined && v !== null).shift();
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// 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] = firstDefined(objA[nameA], objA[nameB], objB[nameA], objB[nameB]);
 | 
			
		||||
  } else {
 | 
			
		||||
    targetObj[nameB] = firstDefined(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;
 | 
			
		||||
							
								
								
									
										28
									
								
								CyLukTs/lukan/node_modules/cli-table3/src/debug.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								CyLukTs/lukan/node_modules/cli-table3/src/debug.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,28 @@
 | 
			
		||||
let messages = [];
 | 
			
		||||
let level = 0;
 | 
			
		||||
 | 
			
		||||
const debug = (msg, min) => {
 | 
			
		||||
  if (level >= min) {
 | 
			
		||||
    messages.push(msg);
 | 
			
		||||
  }
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
debug.WARN = 1;
 | 
			
		||||
debug.INFO = 2;
 | 
			
		||||
debug.DEBUG = 3;
 | 
			
		||||
 | 
			
		||||
debug.reset = () => {
 | 
			
		||||
  messages = [];
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
debug.setDebugLevel = (v) => {
 | 
			
		||||
  level = v;
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
debug.warn = (msg) => debug(msg, debug.WARN);
 | 
			
		||||
debug.info = (msg) => debug(msg, debug.INFO);
 | 
			
		||||
debug.debug = (msg) => debug(msg, debug.DEBUG);
 | 
			
		||||
 | 
			
		||||
debug.debugMessages = () => messages;
 | 
			
		||||
 | 
			
		||||
module.exports = debug;
 | 
			
		||||
							
								
								
									
										254
									
								
								CyLukTs/lukan/node_modules/cli-table3/src/layout-manager.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										254
									
								
								CyLukTs/lukan/node_modules/cli-table3/src/layout-manager.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,254 @@
 | 
			
		||||
const { warn, debug } = require('./debug');
 | 
			
		||||
const Cell = require('./cell');
 | 
			
		||||
const { ColSpanCell, RowSpanCell } = Cell;
 | 
			
		||||
 | 
			
		||||
(function () {
 | 
			
		||||
  function next(alloc, col) {
 | 
			
		||||
    if (alloc[col] > 0) {
 | 
			
		||||
      return next(alloc, col + 1);
 | 
			
		||||
    }
 | 
			
		||||
    return col;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  function layoutTable(table) {
 | 
			
		||||
    let alloc = {};
 | 
			
		||||
    table.forEach(function (row, rowIndex) {
 | 
			
		||||
      let col = 0;
 | 
			
		||||
      row.forEach(function (cell) {
 | 
			
		||||
        cell.y = rowIndex;
 | 
			
		||||
        // Avoid erroneous call to next() on first row
 | 
			
		||||
        cell.x = rowIndex ? next(alloc, col) : col;
 | 
			
		||||
        const rowSpan = cell.rowSpan || 1;
 | 
			
		||||
        const colSpan = cell.colSpan || 1;
 | 
			
		||||
        if (rowSpan > 1) {
 | 
			
		||||
          for (let cs = 0; cs < colSpan; cs++) {
 | 
			
		||||
            alloc[cell.x + cs] = rowSpan;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
        col = cell.x + colSpan;
 | 
			
		||||
      });
 | 
			
		||||
      Object.keys(alloc).forEach((idx) => {
 | 
			
		||||
        alloc[idx]--;
 | 
			
		||||
        if (alloc[idx] < 1) delete alloc[idx];
 | 
			
		||||
      });
 | 
			
		||||
    });
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  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);
 | 
			
		||||
    debug(`Max rows: ${h_max}; Max cols: ${w_max}`);
 | 
			
		||||
    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;
 | 
			
		||||
          warn(`Missing cell at ${cell.y}-${cell.x}.`);
 | 
			
		||||
          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 = [];
 | 
			
		||||
    let auto = {};
 | 
			
		||||
    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;
 | 
			
		||||
      if (typeof existingWidth === 'number') {
 | 
			
		||||
        for (let i = 1; i < span; i++) {
 | 
			
		||||
          existingWidth += 1 + result[col + i];
 | 
			
		||||
          if (typeof vals[col + i] !== 'number') {
 | 
			
		||||
            editableCols++;
 | 
			
		||||
          }
 | 
			
		||||
        }
 | 
			
		||||
      } else {
 | 
			
		||||
        existingWidth = desiredWidth === 'desiredWidth' ? cell.desiredWidth - 1 : 1;
 | 
			
		||||
        if (!auto[col] || auto[col] < existingWidth) {
 | 
			
		||||
          auto[col] = existingWidth;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
 | 
			
		||||
      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++;
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    Object.assign(vals, result, auto);
 | 
			
		||||
    for (let j = 0; j < vals.length; j++) {
 | 
			
		||||
      vals[j] = Math.max(forcedMin, vals[j] || 0);
 | 
			
		||||
    }
 | 
			
		||||
  };
 | 
			
		||||
}
 | 
			
		||||
							
								
								
									
										106
									
								
								CyLukTs/lukan/node_modules/cli-table3/src/table.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										106
									
								
								CyLukTs/lukan/node_modules/cli-table3/src/table.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,106 @@
 | 
			
		||||
const debug = require('./debug');
 | 
			
		||||
const utils = require('./utils');
 | 
			
		||||
const tableLayout = require('./layout-manager');
 | 
			
		||||
 | 
			
		||||
class Table extends Array {
 | 
			
		||||
  constructor(opts) {
 | 
			
		||||
    super();
 | 
			
		||||
 | 
			
		||||
    const options = utils.mergeOptions(opts);
 | 
			
		||||
    Object.defineProperty(this, 'options', {
 | 
			
		||||
      value: options,
 | 
			
		||||
      enumerable: options.debug,
 | 
			
		||||
    });
 | 
			
		||||
 | 
			
		||||
    if (options.debug) {
 | 
			
		||||
      switch (typeof options.debug) {
 | 
			
		||||
        case 'boolean':
 | 
			
		||||
          debug.setDebugLevel(debug.WARN);
 | 
			
		||||
          break;
 | 
			
		||||
        case 'number':
 | 
			
		||||
          debug.setDebugLevel(options.debug);
 | 
			
		||||
          break;
 | 
			
		||||
        case 'string':
 | 
			
		||||
          debug.setDebugLevel(parseInt(options.debug, 10));
 | 
			
		||||
          break;
 | 
			
		||||
        default:
 | 
			
		||||
          debug.setDebugLevel(debug.WARN);
 | 
			
		||||
          debug.warn(`Debug option is expected to be boolean, number, or string. Received a ${typeof options.debug}`);
 | 
			
		||||
      }
 | 
			
		||||
      Object.defineProperty(this, 'messages', {
 | 
			
		||||
        get() {
 | 
			
		||||
          return debug.debugMessages();
 | 
			
		||||
        },
 | 
			
		||||
      });
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  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;
 | 
			
		||||
  }
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
Table.reset = () => debug.reset();
 | 
			
		||||
 | 
			
		||||
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;
 | 
			
		||||
							
								
								
									
										336
									
								
								CyLukTs/lukan/node_modules/cli-table3/src/utils.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										336
									
								
								CyLukTs/lukan/node_modules/cli-table3/src/utils.js
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							@@ -0,0 +1,336 @@
 | 
			
		||||
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 (Object.prototype.hasOwnProperty.call(state, 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 = Object.assign({}, defaults, options);
 | 
			
		||||
  ret.chars = Object.assign({}, defaults.chars, options.chars);
 | 
			
		||||
  ret.style = Object.assign({}, defaults.style, options.style);
 | 
			
		||||
  return ret;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Wrap on word boundary
 | 
			
		||||
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;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Wrap text (ignoring word boundaries)
 | 
			
		||||
function textWrap(maxLength, input) {
 | 
			
		||||
  let lines = [];
 | 
			
		||||
  let line = '';
 | 
			
		||||
  function pushLine(str, ws) {
 | 
			
		||||
    if (line.length && ws) line += ws;
 | 
			
		||||
    line += str;
 | 
			
		||||
    while (line.length > maxLength) {
 | 
			
		||||
      lines.push(line.slice(0, maxLength));
 | 
			
		||||
      line = line.slice(maxLength);
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  let split = input.split(/(\s+)/g);
 | 
			
		||||
  for (let i = 0; i < split.length; i += 2) {
 | 
			
		||||
    pushLine(split[i], i && split[i - 1]);
 | 
			
		||||
  }
 | 
			
		||||
  if (line.length) lines.push(line);
 | 
			
		||||
  return lines;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
function multiLineWordWrap(maxLength, input, wrapOnWordBoundary = true) {
 | 
			
		||||
  let output = [];
 | 
			
		||||
  input = input.split('\n');
 | 
			
		||||
  const handler = wrapOnWordBoundary ? wordWrap : textWrap;
 | 
			
		||||
  for (let i = 0; i < input.length; i++) {
 | 
			
		||||
    output.push.apply(output, handler(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 = Object.assign({}, state);
 | 
			
		||||
    output.push(unwindState(temp, line));
 | 
			
		||||
  }
 | 
			
		||||
  return output;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**
 | 
			
		||||
 * Credit: Matheus Sampaio https://github.com/matheussampaio
 | 
			
		||||
 */
 | 
			
		||||
function hyperlink(url, text) {
 | 
			
		||||
  const OSC = '\u001B]';
 | 
			
		||||
  const BEL = '\u0007';
 | 
			
		||||
  const SEP = ';';
 | 
			
		||||
 | 
			
		||||
  return [OSC, '8', SEP, SEP, url || text, BEL, text, OSC, '8', SEP, SEP, BEL].join('');
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
  strlen: strlen,
 | 
			
		||||
  repeat: repeat,
 | 
			
		||||
  pad: pad,
 | 
			
		||||
  truncate: truncate,
 | 
			
		||||
  mergeOptions: mergeOptions,
 | 
			
		||||
  wordWrap: multiLineWordWrap,
 | 
			
		||||
  colorizeLines: colorizeLines,
 | 
			
		||||
  hyperlink,
 | 
			
		||||
};
 | 
			
		||||
		Reference in New Issue
	
	Block a user