Dia antes primera install
This commit is contained in:
21
node_modules/table-layout/LICENSE
generated
vendored
Normal file
21
node_modules/table-layout/LICENSE
generated
vendored
Normal file
@@ -0,0 +1,21 @@
|
||||
The MIT License (MIT)
|
||||
|
||||
Copyright (c) 2015-19 Lloyd Brookes <75pound@gmail.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.
|
||||
117
node_modules/table-layout/README.md
generated
vendored
Normal file
117
node_modules/table-layout/README.md
generated
vendored
Normal file
@@ -0,0 +1,117 @@
|
||||
[](https://www.npmjs.org/package/table-layout)
|
||||
[](https://www.npmjs.org/package/table-layout)
|
||||
[](https://travis-ci.org/75lb/table-layout)
|
||||
[](https://david-dm.org/75lb/table-layout)
|
||||
[](https://github.com/feross/standard)
|
||||
|
||||
# table-layout
|
||||
|
||||
Generates plain-text tables from JSON recordset input (array of objects). Useful for presenting text in column layout or data in table layout in text-based user interfaces. Also [available as a command-line tool](https://github.com/75lb/table-layout-cli).
|
||||
|
||||
## Synopsis
|
||||
|
||||
```
|
||||
> const Table = require('table-layout')
|
||||
> const issues = require('./example/issues')
|
||||
|
||||
> const table = new Table(issues, { maxWidth: 60 })
|
||||
> console.log(table.toString())
|
||||
|
||||
15134 Coveralls has no source available ndelangen 0
|
||||
15133 Fixing --preserve-symlinks. phestermcs 0
|
||||
Enhancing node to exploit.
|
||||
15131 Question - Confused about NPM's the1mills 0
|
||||
local installation philosophy
|
||||
15130 Question - global npm cache ORESoftware 0
|
||||
directory if user is root?
|
||||
15127 how to installa gulp fontfacegen aramgreat 0
|
||||
on Windows 10
|
||||
15097 Cannot install package from mastertinner 3
|
||||
tarball out of package.json entry
|
||||
generated by npm
|
||||
15067 npm "SELF_SIGNED_CERT_IN_CHAIN" LegendsLyfe 3
|
||||
error when installing discord.js
|
||||
with .log
|
||||
|
||||
```
|
||||
|
||||
## API Reference
|
||||
|
||||
* [table-layout](#module_table-layout)
|
||||
* [Table](#exp_module_table-layout--Table) ⏏
|
||||
* [new Table(data, [options])](#new_module_table-layout--Table_new)
|
||||
* [table.renderLines()](#module_table-layout--Table+renderLines) ⇒ <code>Array.<string></code>
|
||||
* [table.toString()](#module_table-layout--Table+toString) ⇒ <code>string</code>
|
||||
* [Table~columnOption](#module_table-layout--Table..columnOption)
|
||||
|
||||
<a name="exp_module_table-layout--Table"></a>
|
||||
|
||||
### Table ⏏
|
||||
Recordset data in (array of objects), text table out.
|
||||
|
||||
**Kind**: Exported class
|
||||
<a name="new_module_table-layout--Table_new"></a>
|
||||
|
||||
#### new Table(data, [options])
|
||||
**Params**
|
||||
|
||||
- data <code>Array.<object></code> - input data
|
||||
- [options] <code>object</code> - optional settings
|
||||
- [.maxWidth] <code>number</code> - maximum width of layout
|
||||
- [.noWrap] <code>boolean</code> - disable wrapping on all columns
|
||||
- [.noTrim] <code>boolean</code> - disable line-trimming
|
||||
- [.break] <code>boolean</code> - enable word-breaking on all columns
|
||||
- [.columns] [<code>columnOption</code>](#module_table-layout--Table..columnOption) - array of column-specific options
|
||||
- [.ignoreEmptyColumns] <code>boolean</code> - if set, empty columns or columns containing only whitespace are not rendered.
|
||||
- [.padding] <code>object</code> - Padding values to set on each column. Per-column overrides can be set in the `options.columns` array.
|
||||
- [.left] <code>string</code> - Defaults to a single space.
|
||||
- [.right] <code>string</code> - Defaults to a single space.
|
||||
|
||||
**Example**
|
||||
```js
|
||||
> Table = require('table-layout')
|
||||
> jsonData = [{
|
||||
col1: 'Some text you wish to read in table layout',
|
||||
col2: 'And some more text in column two. '
|
||||
}]
|
||||
> table = new Table(jsonData, { maxWidth: 30 })
|
||||
> console.log(table.toString())
|
||||
Some text you And some more
|
||||
wish to read text in
|
||||
in table column two.
|
||||
layout
|
||||
```
|
||||
<a name="module_table-layout--Table+renderLines"></a>
|
||||
|
||||
#### table.renderLines() ⇒ <code>Array.<string></code>
|
||||
Identical to `.toString()` with the exception that the result will be an array of lines, rather than a single, multi-line string.
|
||||
|
||||
**Kind**: instance method of [<code>Table</code>](#exp_module_table-layout--Table)
|
||||
<a name="module_table-layout--Table+toString"></a>
|
||||
|
||||
#### table.toString() ⇒ <code>string</code>
|
||||
Returns the input data as a text table.
|
||||
|
||||
**Kind**: instance method of [<code>Table</code>](#exp_module_table-layout--Table)
|
||||
<a name="module_table-layout--Table..columnOption"></a>
|
||||
|
||||
#### Table~columnOption
|
||||
**Kind**: inner typedef of [<code>Table</code>](#exp_module_table-layout--Table)
|
||||
**Properties**
|
||||
|
||||
| Name | Type | Description |
|
||||
| --- | --- | --- |
|
||||
| name | <code>string</code> | column name, must match a property name in the input |
|
||||
| [width] | <code>number</code> | A specific column width. Supply either this or a min and/or max width. |
|
||||
| [minWidth] | <code>number</code> | column min width |
|
||||
| [maxWidth] | <code>number</code> | column max width |
|
||||
| [nowrap] | <code>boolean</code> | disable wrapping for this column |
|
||||
| [break] | <code>boolean</code> | enable word-breaking for this columns |
|
||||
| [padding] | <code>object</code> | padding options |
|
||||
| [padding.left] | <code>string</code> | a string to pad the left of each cell (default: `' '`) |
|
||||
| [padding.right] | <code>string</code> | a string to pad the right of each cell (default: `' '`) |
|
||||
|
||||
|
||||
* * *
|
||||
|
||||
© 2015-19 Lloyd Brookes \<75pound@gmail.com\>. Documented by [jsdoc-to-markdown](https://github.com/jsdoc2md/jsdoc-to-markdown).
|
||||
201
node_modules/table-layout/index.js
generated
vendored
Normal file
201
node_modules/table-layout/index.js
generated
vendored
Normal file
@@ -0,0 +1,201 @@
|
||||
'use strict'
|
||||
const os = require('os')
|
||||
|
||||
/**
|
||||
* @module table-layout
|
||||
*/
|
||||
|
||||
/**
|
||||
* Recordset data in (array of objects), text table out.
|
||||
* @alias module:table-layout
|
||||
* @example
|
||||
* > Table = require('table-layout')
|
||||
* > jsonData = [{
|
||||
* col1: 'Some text you wish to read in table layout',
|
||||
* col2: 'And some more text in column two. '
|
||||
* }]
|
||||
* > table = new Table(jsonData, { maxWidth: 30 })
|
||||
* > console.log(table.toString())
|
||||
* Some text you And some more
|
||||
* wish to read text in
|
||||
* in table column two.
|
||||
* layout
|
||||
*/
|
||||
class Table {
|
||||
|
||||
/**
|
||||
* @param {object[]} - input data
|
||||
* @param [options] {object} - optional settings
|
||||
* @param [options.maxWidth] {number} - maximum width of layout
|
||||
* @param [options.noWrap] {boolean} - disable wrapping on all columns
|
||||
* @param [options.noTrim] {boolean} - disable line-trimming
|
||||
* @param [options.break] {boolean} - enable word-breaking on all columns
|
||||
* @param [options.columns] {module:table-layout~columnOption} - array of column-specific options
|
||||
* @param [options.ignoreEmptyColumns] {boolean} - if set, empty columns or columns containing only whitespace are not rendered.
|
||||
* @param [options.padding] {object} - Padding values to set on each column. Per-column overrides can be set in the `options.columns` array.
|
||||
* @param [options.padding.left] {string} - Defaults to a single space.
|
||||
* @param [options.padding.right] {string} - Defaults to a single space.
|
||||
* @alias module:table-layout
|
||||
*/
|
||||
constructor (data, options) {
|
||||
let ttyWidth = (process && (process.stdout.columns || process.stderr.columns)) || 0
|
||||
|
||||
/* Windows quirk workaround */
|
||||
if (ttyWidth && os.platform() === 'win32') ttyWidth--
|
||||
|
||||
let defaults = {
|
||||
padding: {
|
||||
left: ' ',
|
||||
right: ' '
|
||||
},
|
||||
maxWidth: ttyWidth || 80,
|
||||
columns: []
|
||||
}
|
||||
|
||||
const extend = require('deep-extend')
|
||||
this.options = extend(defaults, options)
|
||||
this.load(data)
|
||||
}
|
||||
|
||||
load (data) {
|
||||
const Rows = require('./lib/rows')
|
||||
const Columns = require('./lib/columns')
|
||||
|
||||
let options = this.options
|
||||
|
||||
/* remove empty columns */
|
||||
if (options.ignoreEmptyColumns) {
|
||||
data = Rows.removeEmptyColumns(data)
|
||||
}
|
||||
|
||||
this.columns = Columns.getColumns(data)
|
||||
this.rows = new Rows(data, this.columns)
|
||||
|
||||
/* load default column properties from options */
|
||||
this.columns.maxWidth = options.maxWidth
|
||||
this.columns.list.forEach(column => {
|
||||
if (options.padding) column.padding = options.padding
|
||||
if (options.noWrap) column.noWrap = options.noWrap
|
||||
if (options.break) {
|
||||
column.break = options.break
|
||||
column.contentWrappable = true
|
||||
}
|
||||
})
|
||||
|
||||
/* load column properties from options.columns */
|
||||
options.columns.forEach(optionColumn => {
|
||||
let column = this.columns.get(optionColumn.name)
|
||||
if (column) {
|
||||
if (optionColumn.padding) {
|
||||
column.padding.left = optionColumn.padding.left
|
||||
column.padding.right = optionColumn.padding.right
|
||||
}
|
||||
if (optionColumn.width) column.width = optionColumn.width
|
||||
if (optionColumn.maxWidth) column.maxWidth = optionColumn.maxWidth
|
||||
if (optionColumn.minWidth) column.minWidth = optionColumn.minWidth
|
||||
if (optionColumn.noWrap) column.noWrap = optionColumn.noWrap
|
||||
if (optionColumn.break) {
|
||||
column.break = optionColumn.break
|
||||
column.contentWrappable = true
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
this.columns.autoSize()
|
||||
return this
|
||||
}
|
||||
|
||||
getWrapped () {
|
||||
const wrap = require('wordwrapjs')
|
||||
|
||||
this.columns.autoSize()
|
||||
return this.rows.list.map(row => {
|
||||
let line = []
|
||||
row.forEach((cell, column) => {
|
||||
if (column.noWrap) {
|
||||
line.push(cell.value.split(/\r\n?|\n/))
|
||||
} else {
|
||||
line.push(wrap.lines(cell.value, {
|
||||
width: column.wrappedContentWidth,
|
||||
break: column.break,
|
||||
noTrim: this.options.noTrim
|
||||
}))
|
||||
}
|
||||
})
|
||||
return line
|
||||
})
|
||||
}
|
||||
|
||||
getLines () {
|
||||
var wrappedLines = this.getWrapped()
|
||||
var lines = []
|
||||
wrappedLines.forEach(wrapped => {
|
||||
let mostLines = getLongestArray(wrapped)
|
||||
for (let i = 0; i < mostLines; i++) {
|
||||
let line = []
|
||||
wrapped.forEach(cell => {
|
||||
line.push(cell[i] || '')
|
||||
})
|
||||
lines.push(line)
|
||||
}
|
||||
})
|
||||
return lines
|
||||
}
|
||||
|
||||
/**
|
||||
* Identical to `.toString()` with the exception that the result will be an array of lines, rather than a single, multi-line string.
|
||||
* @returns {string[]}
|
||||
*/
|
||||
renderLines () {
|
||||
var lines = this.getLines()
|
||||
return lines.map(line => {
|
||||
return line.reduce((prev, cell, index) => {
|
||||
let column = this.columns.list[index]
|
||||
return prev + padCell(cell, column.padding, column.generatedWidth)
|
||||
}, '')
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the input data as a text table.
|
||||
* @returns {string}
|
||||
*/
|
||||
toString () {
|
||||
return this.renderLines().join(os.EOL) + os.EOL
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Array of arrays in.. Returns the length of the longest one
|
||||
* @returns {number}
|
||||
* @private
|
||||
*/
|
||||
function getLongestArray (arrays) {
|
||||
var lengths = arrays.map(array => array.length)
|
||||
return Math.max.apply(null, lengths)
|
||||
}
|
||||
|
||||
function padCell (cellValue, padding, width) {
|
||||
const ansi = require('./lib/ansi')
|
||||
const padEnd = require('lodash.padend')
|
||||
var ansiLength = cellValue.length - ansi.remove(cellValue).length
|
||||
cellValue = cellValue || ''
|
||||
return (padding.left || '') +
|
||||
padEnd(cellValue, width - padding.length() + ansiLength) +
|
||||
(padding.right || '')
|
||||
}
|
||||
|
||||
/**
|
||||
* @typedef module:table-layout~columnOption
|
||||
* @property name {string} - column name, must match a property name in the input
|
||||
* @property [width] {number} - A specific column width. Supply either this or a min and/or max width.
|
||||
* @property [minWidth] {number} - column min width
|
||||
* @property [maxWidth] {number} - column max width
|
||||
* @property [nowrap] {boolean} - disable wrapping for this column
|
||||
* @property [break] {boolean} - enable word-breaking for this columns
|
||||
* @property [padding] {object} - padding options
|
||||
* @property [padding.left] {string} - a string to pad the left of each cell (default: `' '`)
|
||||
* @property [padding.right] {string} - a string to pad the right of each cell (default: `' '`)
|
||||
*/
|
||||
|
||||
module.exports = Table
|
||||
17
node_modules/table-layout/lib/ansi.js
generated
vendored
Normal file
17
node_modules/table-layout/lib/ansi.js
generated
vendored
Normal file
@@ -0,0 +1,17 @@
|
||||
'use strict'
|
||||
|
||||
const ansiEscapeSequence = /\u001b.*?m/g
|
||||
|
||||
/**
|
||||
* @module ansi
|
||||
*/
|
||||
exports.remove = remove
|
||||
exports.has = has
|
||||
|
||||
function remove (input) {
|
||||
return input.replace(ansiEscapeSequence, '')
|
||||
}
|
||||
|
||||
function has (input) {
|
||||
return ansiEscapeSequence.test(input)
|
||||
}
|
||||
29
node_modules/table-layout/lib/cell.js
generated
vendored
Normal file
29
node_modules/table-layout/lib/cell.js
generated
vendored
Normal file
@@ -0,0 +1,29 @@
|
||||
'use strict'
|
||||
const t = require('typical')
|
||||
|
||||
const _value = new WeakMap()
|
||||
const _column = new WeakMap()
|
||||
|
||||
class Cell {
|
||||
constructor (value, column) {
|
||||
this.value = value
|
||||
_column.set(this, column)
|
||||
}
|
||||
|
||||
set value (val) {
|
||||
_value.set(this, val)
|
||||
}
|
||||
|
||||
get value () {
|
||||
let cellValue = _value.get(this)
|
||||
if (t.isFunction(cellValue)) cellValue = cellValue.call(_column.get(this))
|
||||
if (cellValue === undefined) {
|
||||
cellValue = ''
|
||||
} else {
|
||||
cellValue = String(cellValue)
|
||||
}
|
||||
return cellValue
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = Cell
|
||||
68
node_modules/table-layout/lib/column.js
generated
vendored
Normal file
68
node_modules/table-layout/lib/column.js
generated
vendored
Normal file
@@ -0,0 +1,68 @@
|
||||
'use strict'
|
||||
const t = require('typical')
|
||||
const Padding = require('./padding')
|
||||
|
||||
/**
|
||||
* @module column
|
||||
*/
|
||||
|
||||
const _padding = new WeakMap()
|
||||
|
||||
// setting any column property which is a factor of the width should trigger autoSize()
|
||||
|
||||
/**
|
||||
* Represents a table column
|
||||
*/
|
||||
class Column {
|
||||
constructor (column) {
|
||||
/**
|
||||
* @type {string}
|
||||
*/
|
||||
if (t.isDefined(column.name)) this.name = column.name
|
||||
/**
|
||||
* @type {number}
|
||||
*/
|
||||
if (t.isDefined(column.width)) this.width = column.width
|
||||
if (t.isDefined(column.maxWidth)) this.maxWidth = column.maxWidth
|
||||
if (t.isDefined(column.minWidth)) this.minWidth = column.minWidth
|
||||
if (t.isDefined(column.noWrap)) this.noWrap = column.noWrap
|
||||
if (t.isDefined(column.break)) this.break = column.break
|
||||
if (t.isDefined(column.contentWrappable)) this.contentWrappable = column.contentWrappable
|
||||
if (t.isDefined(column.contentWidth)) this.contentWidth = column.contentWidth
|
||||
if (t.isDefined(column.minContentWidth)) this.minContentWidth = column.minContentWidth
|
||||
this.padding = column.padding || { left: ' ', right: ' ' }
|
||||
this.generatedWidth = null
|
||||
}
|
||||
|
||||
set padding (padding) {
|
||||
_padding.set(this, new Padding(padding))
|
||||
}
|
||||
get padding () {
|
||||
return _padding.get(this)
|
||||
}
|
||||
|
||||
/**
|
||||
* the width of the content (excluding padding) after being wrapped
|
||||
*/
|
||||
get wrappedContentWidth () {
|
||||
return Math.max(this.generatedWidth - this.padding.length(), 0)
|
||||
}
|
||||
|
||||
isResizable () {
|
||||
return !this.isFixed()
|
||||
}
|
||||
|
||||
isFixed () {
|
||||
return t.isDefined(this.width) || this.noWrap || !this.contentWrappable
|
||||
}
|
||||
|
||||
generateWidth () {
|
||||
this.generatedWidth = this.width || (this.contentWidth + this.padding.length())
|
||||
}
|
||||
|
||||
generateMinWidth () {
|
||||
this.minWidth = this.minContentWidth + this.padding.length()
|
||||
}
|
||||
}
|
||||
|
||||
module.exports = Column
|
||||
157
node_modules/table-layout/lib/columns.js
generated
vendored
Normal file
157
node_modules/table-layout/lib/columns.js
generated
vendored
Normal file
@@ -0,0 +1,157 @@
|
||||
'use strict'
|
||||
const t = require('typical')
|
||||
const arrayify = require('array-back')
|
||||
const Column = require('./column')
|
||||
const wrap = require('wordwrapjs')
|
||||
const Cell = require('./cell')
|
||||
const ansi = require('./ansi')
|
||||
|
||||
const _maxWidth = new WeakMap()
|
||||
|
||||
/**
|
||||
* @module columns
|
||||
*/
|
||||
|
||||
class Columns {
|
||||
constructor (columns) {
|
||||
this.list = []
|
||||
arrayify(columns).forEach(this.add.bind(this))
|
||||
}
|
||||
|
||||
/**
|
||||
* sum of all generatedWidth fields
|
||||
* @return {number}
|
||||
*/
|
||||
totalWidth () {
|
||||
return this.list.length
|
||||
? this.list.map(col => col.generatedWidth).reduce((a, b) => a + b)
|
||||
: 0
|
||||
}
|
||||
|
||||
totalFixedWidth () {
|
||||
return this.getFixed()
|
||||
.map(col => col.generatedWidth)
|
||||
.reduce((a, b) => a + b, 0)
|
||||
}
|
||||
|
||||
get (columnName) {
|
||||
return this.list.find(column => column.name === columnName)
|
||||
}
|
||||
|
||||
getResizable () {
|
||||
return this.list.filter(column => column.isResizable())
|
||||
}
|
||||
|
||||
getFixed () {
|
||||
return this.list.filter(column => column.isFixed())
|
||||
}
|
||||
|
||||
add (column) {
|
||||
const col = column instanceof Column ? column : new Column(column)
|
||||
this.list.push(col)
|
||||
return col
|
||||
}
|
||||
|
||||
set maxWidth (val) {
|
||||
_maxWidth.set(this, val)
|
||||
}
|
||||
|
||||
/**
|
||||
* sets `generatedWidth` for each column
|
||||
* @chainable
|
||||
*/
|
||||
autoSize () {
|
||||
const maxWidth = _maxWidth.get(this)
|
||||
|
||||
/* size */
|
||||
this.list.forEach(column => {
|
||||
column.generateWidth()
|
||||
column.generateMinWidth()
|
||||
})
|
||||
|
||||
/* adjust if user set a min or maxWidth */
|
||||
this.list.forEach(column => {
|
||||
if (t.isDefined(column.maxWidth) && column.generatedWidth > column.maxWidth) {
|
||||
column.generatedWidth = column.maxWidth
|
||||
}
|
||||
|
||||
if (t.isDefined(column.minWidth) && column.generatedWidth < column.minWidth) {
|
||||
column.generatedWidth = column.minWidth
|
||||
}
|
||||
})
|
||||
|
||||
const width = {
|
||||
total: this.totalWidth(),
|
||||
view: maxWidth,
|
||||
diff: this.totalWidth() - maxWidth,
|
||||
totalFixed: this.totalFixedWidth(),
|
||||
totalResizable: Math.max(maxWidth - this.totalFixedWidth(), 0)
|
||||
}
|
||||
|
||||
/* adjust if short of space */
|
||||
if (width.diff > 0) {
|
||||
/* share the available space between resizeable columns */
|
||||
let resizableColumns = this.getResizable()
|
||||
resizableColumns.forEach(column => {
|
||||
column.generatedWidth = Math.floor(width.totalResizable / resizableColumns.length)
|
||||
})
|
||||
|
||||
/* at this point, the generatedWidth should never end up bigger than the contentWidth */
|
||||
const grownColumns = this.list.filter(column => column.generatedWidth > column.contentWidth)
|
||||
const shrunkenColumns = this.list.filter(column => column.generatedWidth < column.contentWidth)
|
||||
let salvagedSpace = 0
|
||||
grownColumns.forEach(column => {
|
||||
const currentGeneratedWidth = column.generatedWidth
|
||||
column.generateWidth()
|
||||
salvagedSpace += currentGeneratedWidth - column.generatedWidth
|
||||
})
|
||||
shrunkenColumns.forEach(column => {
|
||||
column.generatedWidth += Math.floor(salvagedSpace / shrunkenColumns.length)
|
||||
})
|
||||
|
||||
/* if, after autosizing, we still don't fit within maxWidth then give up */
|
||||
}
|
||||
|
||||
return this
|
||||
}
|
||||
|
||||
/**
|
||||
* Factory method returning all distinct columns from input
|
||||
* @param {object[]} - input recordset
|
||||
* @return {module:columns}
|
||||
*/
|
||||
static getColumns (rows) {
|
||||
var columns = new Columns()
|
||||
arrayify(rows).forEach(row => {
|
||||
for (let columnName in row) {
|
||||
let column = columns.get(columnName)
|
||||
if (!column) {
|
||||
column = columns.add({ name: columnName, contentWidth: 0, minContentWidth: 0 })
|
||||
}
|
||||
let cell = new Cell(row[columnName], column)
|
||||
let cellValue = cell.value
|
||||
if (ansi.has(cellValue)) {
|
||||
cellValue = ansi.remove(cellValue)
|
||||
}
|
||||
|
||||
if (cellValue.length > column.contentWidth) column.contentWidth = cellValue.length
|
||||
|
||||
let longestWord = getLongestWord(cellValue)
|
||||
if (longestWord > column.minContentWidth) {
|
||||
column.minContentWidth = longestWord
|
||||
}
|
||||
if (!column.contentWrappable) column.contentWrappable = wrap.isWrappable(cellValue)
|
||||
}
|
||||
})
|
||||
return columns
|
||||
}
|
||||
}
|
||||
|
||||
function getLongestWord (line) {
|
||||
const words = wrap.getChunks(line)
|
||||
return words.reduce((max, word) => {
|
||||
return Math.max(word.length, max)
|
||||
}, 0)
|
||||
}
|
||||
|
||||
module.exports = Columns
|
||||
16
node_modules/table-layout/lib/padding.js
generated
vendored
Normal file
16
node_modules/table-layout/lib/padding.js
generated
vendored
Normal file
@@ -0,0 +1,16 @@
|
||||
'use strict'
|
||||
|
||||
class Padding {
|
||||
constructor (padding) {
|
||||
this.left = padding.left
|
||||
this.right = padding.right
|
||||
}
|
||||
length () {
|
||||
return this.left.length + this.right.length
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@module padding
|
||||
*/
|
||||
module.exports = Padding
|
||||
53
node_modules/table-layout/lib/rows.js
generated
vendored
Normal file
53
node_modules/table-layout/lib/rows.js
generated
vendored
Normal file
@@ -0,0 +1,53 @@
|
||||
'use strict'
|
||||
const arrayify = require('array-back')
|
||||
const Cell = require('./cell')
|
||||
const t = require('typical')
|
||||
|
||||
/**
|
||||
*
|
||||
*/
|
||||
class Rows {
|
||||
constructor (rows, columns) {
|
||||
this.list = []
|
||||
this.load(rows, columns)
|
||||
}
|
||||
|
||||
load (rows, columns) {
|
||||
arrayify(rows).forEach(row => {
|
||||
this.list.push(new Map(objectToIterable(row, columns)))
|
||||
})
|
||||
}
|
||||
|
||||
static removeEmptyColumns (data) {
|
||||
const distinctColumnNames = data.reduce((columnNames, row) => {
|
||||
Object.keys(row).forEach(key => {
|
||||
if (columnNames.indexOf(key) === -1) columnNames.push(key)
|
||||
})
|
||||
return columnNames
|
||||
}, [])
|
||||
|
||||
const emptyColumns = distinctColumnNames.filter(columnName => {
|
||||
const hasValue = data.some(row => {
|
||||
const value = row[columnName]
|
||||
return (t.isDefined(value) && !t.isString(value)) || (t.isString(value) && /\S+/.test(value))
|
||||
})
|
||||
return !hasValue
|
||||
})
|
||||
|
||||
return data.map(row => {
|
||||
emptyColumns.forEach(emptyCol => delete row[emptyCol])
|
||||
return row
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
function objectToIterable (row, columns) {
|
||||
return columns.list.map(column => {
|
||||
return [ column, new Cell(row[column.name], column) ]
|
||||
})
|
||||
}
|
||||
|
||||
/**
|
||||
* @module rows
|
||||
*/
|
||||
module.exports = Rows
|
||||
41
node_modules/table-layout/package.json
generated
vendored
Normal file
41
node_modules/table-layout/package.json
generated
vendored
Normal file
@@ -0,0 +1,41 @@
|
||||
{
|
||||
"name": "table-layout",
|
||||
"author": "Lloyd Brookes <75pound@gmail.com>",
|
||||
"version": "0.4.5",
|
||||
"description": "Stylable text tables, handling ansi colour. Useful for console output.",
|
||||
"repository": "https://github.com/75lb/table-layout.git",
|
||||
"license": "MIT",
|
||||
"keywords": [
|
||||
"wrap",
|
||||
"terminal",
|
||||
"data",
|
||||
"columns",
|
||||
"format",
|
||||
"json",
|
||||
"command line"
|
||||
],
|
||||
"engines": {
|
||||
"node": ">=4.0.0"
|
||||
},
|
||||
"scripts": {
|
||||
"test": "test-runner test/*.js",
|
||||
"docs": "jsdoc2md -t jsdoc2md/README.hbs index.js -p list --member-index-format list > README.md; echo",
|
||||
"cover": "istanbul cover test-runner -- test/*.js && cat coverage/lcov.info | ./node_modules/.bin/coveralls && rm -rf coverage; echo"
|
||||
},
|
||||
"dependencies": {
|
||||
"array-back": "^2.0.0",
|
||||
"deep-extend": "~0.6.0",
|
||||
"lodash.padend": "^4.6.1",
|
||||
"typical": "^2.6.1",
|
||||
"wordwrapjs": "^3.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"coveralls": "^3.0.4",
|
||||
"jsdoc-to-markdown": "^4.0.1",
|
||||
"test-runner": "~0.5.0"
|
||||
},
|
||||
"files": [
|
||||
"index.js",
|
||||
"lib/*.js"
|
||||
]
|
||||
}
|
||||
Reference in New Issue
Block a user