diff options
Diffstat (limited to 'node_modules/as-table')
| -rw-r--r-- | node_modules/as-table/.babelrc | 3 | ||||
| -rw-r--r-- | node_modules/as-table/.eslintrc | 6 | ||||
| -rw-r--r-- | node_modules/as-table/.travis.yml | 24 | ||||
| -rw-r--r-- | node_modules/as-table/CHANGELOG.md | 3 | ||||
| -rw-r--r-- | node_modules/as-table/LICENSE | 21 | ||||
| -rw-r--r-- | node_modules/as-table/README.md | 113 | ||||
| -rw-r--r-- | node_modules/as-table/as-table.d.ts | 32 | ||||
| -rw-r--r-- | node_modules/as-table/as-table.js | 89 | ||||
| -rw-r--r-- | node_modules/as-table/build/as-table.js | 86 | ||||
| -rw-r--r-- | node_modules/as-table/package.json | 67 | ||||
| -rw-r--r-- | node_modules/as-table/test.js | 223 |
11 files changed, 667 insertions, 0 deletions
diff --git a/node_modules/as-table/.babelrc b/node_modules/as-table/.babelrc new file mode 100644 index 0000000..c8e246a --- /dev/null +++ b/node_modules/as-table/.babelrc @@ -0,0 +1,3 @@ +{ + "plugins": ["transform-es2015-destructuring", "transform-es2015-spread"] +}
\ No newline at end of file diff --git a/node_modules/as-table/.eslintrc b/node_modules/as-table/.eslintrc new file mode 100644 index 0000000..955b07d --- /dev/null +++ b/node_modules/as-table/.eslintrc @@ -0,0 +1,6 @@ +{ + "parserOptions": { + "ecmaVersion": 6, + "sourceType": "script" + } +}
\ No newline at end of file diff --git a/node_modules/as-table/.travis.yml b/node_modules/as-table/.travis.yml new file mode 100644 index 0000000..c3b62f5 --- /dev/null +++ b/node_modules/as-table/.travis.yml @@ -0,0 +1,24 @@ +language: node_js +node_js: +- '8' +script: +- set -e +- npm run test +- npm run coveralls +after_success: +- git config --global user.email "travis@travis-ci.org" +- git config --global user.name "Travis CI" +- npm config set git-tag-version=false +- NPM_VERSION=$(npm version patch) +- git commit -a -m "${NPM_VERSION:1}" -m "[ci skip]" +- git remote remove origin +- git remote add origin https://${GITHUB_TOKEN}@github.com/xpl/as-table.git +- git push origin HEAD:master +deploy: + provider: npm + email: rocket.mind@gmail.com + api_key: + secure: AVxwMF+0BKyQqTvA/9Va+G+1kgsVUKQ08LgzVhqfUv2yGgh5jWY0P5/IFLQocTuC+uef066KqTlvnWR3SWqB+am5EsqiZeFPzOHmtCgxrML2aZK8crjPoY4W/3ZfPy9H00nU9YPNVguXJY7K7MwEFXZ/SVOM1aQvr+omeqMpbnP6Cl4nQ6Hzbc/uAdUHIQG1qzoEbsnkT1EuQ39v1IQLBEoiBDkUj45bmEdETZXd9Nr42BOviFMYjba0vAn8gsuUgMj+bYXeb0XXedmRwBGjtgcNx76RwwmOXPtiC2IQs6FiDmCzZtCcoYuvrWSOFYhfEgptDeeZ080x38uhBxusYq3p0iRF+XyjWlr3w1A5JaHL8FkUfmdBxKAzKhiPTS5yDqteWL8znqGKSPjR+FJNQo5pbS5+C8I67xkcDHvigMWy30lnnjvCV7tPW4FdJ85kx+F1qNmHU0vYqVfDNet4KZofgWoS0cHMYskzl1BwWC+vofwI9/sKatDtFR25ffFg8f17nW+6vTX/n9uSqIFURUI8DhfFlxqG2giDd73KCB0uZ4Fqd0dqnmcp5qg2hQt0sIftDBOmOaX7xKbVdLbGBTAQ82KZmbQCnj0In10gJQf5O/mKD7rr2dMLHi6fvbBE/cEsWy4u/o50UQ7bDzGfXT3tJ+tktxmx1HfSf6eXilA= +env: + global: + secure: KbUFKSmSkbuRb0mQ1kcKL5dA8TdI2SlnZAzyXwRXF/RpK5LDGI31gmPODl7DOKHPzEUTQaIeA/8dI0p8DKM9eTfHyM+pl0kZE+e6wSTdawVlI9FoxLgyBi8hz3UWnA39/YN65uFNvFX+kSYPPeOeV5zJNUaC8CT7Y3HYKR3tGrBaKrQbCnOlXIBsmyFryUHqdapBDmrqrU69Ab1uQca/djS2ztsjYvaP61aEIAKAsUZQRtDk8mP8sUQ5o15CwcpaWp/K1efeb3AuxHjcYOHH0Ci0SZmWpO9ky+wLCPeDqEeV4ZDN4Wfp9yx5dNkV0+ifevSRR5FNS9LHREPML8jz53KzOQQOXK5Fup/SsHPHU0XT6vB2TlG0YwatMSVGY4QIRCMftMkokjFwWsP8oPbuTuVCWhHQouMxRQDPQ/z3Dn/+blASG1lw16S92ksRLc8CCGA8gUZ6CrKh82gFAfyzwAUgLhoFIPEEu2e49W/VdAzeQ1VfAb/TbjwdgX9OR8F8TR48jM3Xpk8BdPANso7t9Rk9vvIw0JxR0Ir+7ufHV1dqCPsGa5KdZjaKrHHs6P/JI+Xl+w4o/6wmn3FhORSKqGuxDJqoQ8cw49Hh5OM0uf9tKfiyUyuFdsApom4vwrOTL+ZRbbD037JH/fzp24C33oaGwOCdyY0Eb/n0LI5ufRg= diff --git a/node_modules/as-table/CHANGELOG.md b/node_modules/as-table/CHANGELOG.md new file mode 100644 index 0000000..1e3289c --- /dev/null +++ b/node_modules/as-table/CHANGELOG.md @@ -0,0 +1,3 @@ +# Recent Updates + +- Now layouts ANSI-colored strings correctly, thanks to the [`printable-characters`](https://github.com/xpl/printable-characters) module.
\ No newline at end of file diff --git a/node_modules/as-table/LICENSE b/node_modules/as-table/LICENSE new file mode 100644 index 0000000..49dbbe1 --- /dev/null +++ b/node_modules/as-table/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2016 Vitaly Gordon (https://github.com/xpl) + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/node_modules/as-table/README.md b/node_modules/as-table/README.md new file mode 100644 index 0000000..a6cc5cd --- /dev/null +++ b/node_modules/as-table/README.md @@ -0,0 +1,113 @@ +# as-table + +[](https://travis-ci.org/xpl/as-table) [](https://coveralls.io/github/xpl/as-table) [](https://npmjs.com/package/as-table) [](https://david-dm.org/xpl/as-table) [](https://scrutinizer-ci.com/g/xpl/as-table/?branch=master) + +A simple function that print objects and arrays as ASCII tables. Supports ANSI styling and weird 💩 Unicode emoji symbols (they won't break the layout), thanks to [`printable-characters`](https://github.com/xpl/printable-characters). + +```bash +npm install as-table +``` + +## Printing objects + +```javascript +asTable = require ('as-table') + +asTable ([ { foo: true, string: 'abcde', num: 42 }, + { foo: false, string: 'qwertyuiop', num: 43 }, + { string: null, num: 44 } ]) +``` +``` +foo string num +---------------------- +true abcde 42 +false qwertyuiop 43 + null 44 +``` + +## Printing arrays + +```javascript +asTable ([['qwe', '123456789', 'zxcvbnm'], + ['qwerty', '12', 'zxcvb'], + ['qwertyiop', '1234567', 'z']]) +``` +``` +qwe 123456789 zxcvbnm +qwerty 12 zxcvb +qwertyiop 1234567 z +``` + +## Limiting total width by proportionally trimming cells + setting columns delimiter + +```javascript +asTable.configure ({ maxTotalWidth: 22, delimiter: ' | ' }) (data) +``` +``` +qwe | 1234… | zxc… +qwer… | 12 | zxc… +qwer… | 1234… | z +``` + +## Right align + +```javascript +asTable.configure ({ right: true }) (data) +``` +``` + foo bar baz +----------------------------- + qwe 123456789 zxcvbnm + qwerty 12 zxcvb +qwertyiop 1234567 z +``` + +## Providing a custom object printer + +```javascript +asTable.configure ({ print: x => (typeof x === 'boolean') ? (x ? 'yes' : 'no') : String (x) }) (data) +``` +``` +foo string num +-------------------- +yes abcde 42 +no qwertyuiop 43 + null 44 +``` + +The callback also receives a field name (in case of objects) or a column index (in case of arrays): + +```javascript +asTable = require ('as-table').configure ({ + print (x, k) { + if (k === 'timestamp') return new Date (x).toGMTString() + return String (x) + } +}) + +asTable ([ { name: 'A', timestamp: 1561202591572 }, + { name: 'B', timestamp: 1558524240034 } ]) +``` + +## Obtaining a pre-configured function + +```javascript +asTable = require ('as-table').configure ({ maxTotalWidth: 25, delimiter: ' | ' }) + +asTable (data) +``` + +## Customizing the title rendering and the header separator + +With string coloring by [`ansicolor`](https://github.com/xpl/ansicolor) (just for the demo purposes, any library will fit): + +```javascript +asTable = require ('as-table').configure ({ title: x => x.bright, delimiter: ' | '.dim.cyan, dash: '-'.bright.cyan }) + +console.log ( + asTable ([ { foo: true, string: 'abcde', num: 42 }, + { foo: false, string: 'qwertyuiop'.bgMagenta.green.bright, num: 43 } ]) +``` + +<img width="179" alt="screen shot 2017-07-21 at 23 46 14" src="https://user-images.githubusercontent.com/1707/28481945-dcb0f8d6-6e6e-11e7-896e-dfad40662daf.png"> + diff --git a/node_modules/as-table/as-table.d.ts b/node_modules/as-table/as-table.d.ts new file mode 100644 index 0000000..5e31996 --- /dev/null +++ b/node_modules/as-table/as-table.d.ts @@ -0,0 +1,32 @@ + +declare function asTable(rows: any[][]): string +declare function asTable(objects: {[column: string]: any}[]): string +declare namespace asTable { + interface Config<T> { + maxTotalWidth: number + minColumnWidths?: number[] + delimiter?: string + dash: string + right: boolean + print(value: T, key?: string | number): string + title(value: string): string + } + type OmitPrint<T> = Pick<T, Exclude<keyof T, 'print'>> & {print: undefined} + type ValidValueType<O, T> = { + [P in keyof O]: T; + } + interface Formatter<T> extends Readonly<Config<T>> { + (rows: T[][]): string + <O extends ValidValueType<O, T>>(objects: O[]): string + configure(cfg: Partial<OmitPrint<Config<any>>>): Formatter<T> + configure<T>(cfg: Partial<Config<T>>): Formatter<T> + } + function configure<T = any>(cfg: Partial<Config<T>>): Formatter<T> + const maxTotalWidth: number + const print: StringConstructor + const title: StringConstructor + const dash: '-' + const right: false +} + +export = asTable diff --git a/node_modules/as-table/as-table.js b/node_modules/as-table/as-table.js new file mode 100644 index 0000000..e529987 --- /dev/null +++ b/node_modules/as-table/as-table.js @@ -0,0 +1,89 @@ +"use strict"; + +const O = Object + , { first, strlen } = require ('printable-characters') // handles ANSI codes and invisible characters + , limit = (s, n) => (first (s, n - 1) + '…') + +const asColumns = (rows, cfg_) => { + + const + + zip = (arrs, f) => arrs.reduce ((a, b) => b.map ((b, i) => [...a[i] || [], b]), []).map (args => f (...args)), + + /* Convert cell data to string (converting multiline text to singleline) */ + + cells = rows.map (r => r.map (c => c.replace (/\n/g, '\\n'))), + + /* Compute column widths (per row) and max widths (per column) */ + + cellWidths = cells.map (r => r.map (strlen)), + maxWidths = zip (cellWidths, Math.max), + + /* Default config */ + + cfg = O.assign ({ + delimiter: ' ', + minColumnWidths: maxWidths.map (x => 0), + maxTotalWidth: 0 }, cfg_), + + delimiterLength = strlen (cfg.delimiter), + + /* Project desired column widths, taking maxTotalWidth and minColumnWidths in account. */ + + totalWidth = maxWidths.reduce ((a, b) => a + b, 0), + relativeWidths = maxWidths.map (w => w / totalWidth), + maxTotalWidth = cfg.maxTotalWidth - (delimiterLength * (maxWidths.length - 1)), + excessWidth = Math.max (0, totalWidth - maxTotalWidth), + computedWidths = zip ([cfg.minColumnWidths, maxWidths, relativeWidths], + (min, max, relative) => Math.max (min, Math.floor (max - excessWidth * relative))), + + /* This is how many symbols we should pad or cut (per column). */ + + restCellWidths = cellWidths.map (widths => zip ([computedWidths, widths], (a, b) => a - b)) + + /* Perform final composition. */ + + return zip ([cells, restCellWidths], (a, b) => + zip ([a, b], (str, w) => (w >= 0) + ? (cfg.right ? (' '.repeat (w) + str) : (str + ' '.repeat (w))) + : (limit (str, strlen (str) + w))).join (cfg.delimiter)) +} + +const asTable = cfg => O.assign (arr => { + +/* Print arrays */ + + if (arr[0] && Array.isArray (arr[0])) { + return asColumns (arr.map (r => r.map ( + (c, i) => (c === undefined) ? '' : cfg.print (c, i) + ) + ), + cfg).join ('\n') + } + +/* Print objects */ + + const colNames = [...new Set ([].concat (...arr.map (O.keys)))], + columns = [colNames.map (cfg.title), + ...arr.map (o => colNames.map ( + key => (o[key] === undefined) ? '' : cfg.print (o[key], key) + ) + ) + ], + lines = asColumns (columns, cfg) + + return (cfg.dash ? [lines[0], cfg.dash.repeat (strlen (lines[0])), ...lines.slice (1)] : lines).join ('\n') + +}, cfg, { + + configure: newConfig => asTable (O.assign ({}, cfg, newConfig)), +}) + +module.exports = asTable ({ + + maxTotalWidth: Number.MAX_SAFE_INTEGER, + print: String, + title: String, + dash: '-', + right: false +}) diff --git a/node_modules/as-table/build/as-table.js b/node_modules/as-table/build/as-table.js new file mode 100644 index 0000000..66be06a --- /dev/null +++ b/node_modules/as-table/build/as-table.js @@ -0,0 +1,86 @@ +"use strict"; + +function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) arr2[i] = arr[i]; return arr2; } else { return Array.from(arr); } } + +const O = Object; + +var _require = require('printable-characters'); + +const first = _require.first, + strlen = _require.strlen, + limit = (s, n) => first(s, n - 1) + '…'; + +const asColumns = (rows, cfg_) => { + + const zip = (arrs, f) => arrs.reduce((a, b) => b.map((b, i) => [].concat(_toConsumableArray(a[i] || []), [b])), []).map(args => f.apply(undefined, _toConsumableArray(args))), + + + /* Convert cell data to string (converting multiline text to singleline) */ + + cells = rows.map(r => r.map(c => c.replace(/\n/g, '\\n'))), + + + /* Compute column widths (per row) and max widths (per column) */ + + cellWidths = cells.map(r => r.map(strlen)), + maxWidths = zip(cellWidths, Math.max), + + + /* Default config */ + + cfg = O.assign({ + delimiter: ' ', + minColumnWidths: maxWidths.map(x => 0), + maxTotalWidth: 0 }, cfg_), + delimiterLength = strlen(cfg.delimiter), + + + /* Project desired column widths, taking maxTotalWidth and minColumnWidths in account. */ + + totalWidth = maxWidths.reduce((a, b) => a + b, 0), + relativeWidths = maxWidths.map(w => w / totalWidth), + maxTotalWidth = cfg.maxTotalWidth - delimiterLength * (maxWidths.length - 1), + excessWidth = Math.max(0, totalWidth - maxTotalWidth), + computedWidths = zip([cfg.minColumnWidths, maxWidths, relativeWidths], (min, max, relative) => Math.max(min, Math.floor(max - excessWidth * relative))), + + + /* This is how many symbols we should pad or cut (per column). */ + + restCellWidths = cellWidths.map(widths => zip([computedWidths, widths], (a, b) => a - b)); + + /* Perform final composition. */ + + return zip([cells, restCellWidths], (a, b) => zip([a, b], (str, w) => w >= 0 ? cfg.right ? ' '.repeat(w) + str : str + ' '.repeat(w) : limit(str, strlen(str) + w)).join(cfg.delimiter)); +}; + +const asTable = cfg => O.assign(arr => { + var _ref; + + /* Print arrays */ + + if (arr[0] && Array.isArray(arr[0])) { + return asColumns(arr.map(r => r.map((c, i) => c === undefined ? '' : cfg.print(c, i))), cfg).join('\n'); + } + + /* Print objects */ + + const colNames = [].concat(_toConsumableArray(new Set((_ref = []).concat.apply(_ref, _toConsumableArray(arr.map(O.keys)))))), + columns = [colNames.map(cfg.title)].concat(_toConsumableArray(arr.map(o => colNames.map(key => o[key] === undefined ? '' : cfg.print(o[key], key))))), + lines = asColumns(columns, cfg); + + return (cfg.dash ? [lines[0], cfg.dash.repeat(strlen(lines[0]))].concat(_toConsumableArray(lines.slice(1))) : lines).join('\n'); +}, cfg, { + + configure: newConfig => asTable(O.assign({}, cfg, newConfig)) +}); + +module.exports = asTable({ + + maxTotalWidth: Number.MAX_SAFE_INTEGER, + print: String, + title: String, + dash: '-', + right: false +}); + +//# sourceMappingURL=data:application/json;charset=utf-8;base64,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QVUsRUFBVixFQUFjLEdBQWQsRUFBbUIsU0FBbkIsQ0FBVDtBQUZwQixDQXpCZSxDQUF2Qjs7QUE4QkEsT0FBTyxPQUFQLEdBQWlCLFFBQVM7O0FBRXRCLG1CQUFlLE9BQU8sZ0JBRkE7QUFHdEIsV0FBTyxNQUhlO0FBSXRCLFdBQU8sTUFKZTtBQUt0QixVQUFNLEdBTGdCO0FBTXRCLFdBQU87QUFOZSxDQUFULENBQWpCIiwiZmlsZSI6ImFzLXRhYmxlLmpzIiwic291cmNlc0NvbnRlbnQiOlsiXCJ1c2Ugc3RyaWN0XCI7XG5cbmNvbnN0IE8gPSBPYmplY3RcbiAgICAsIHsgZmlyc3QsIHN0cmxlbiB9ID0gcmVxdWlyZSAoJ3ByaW50YWJsZS1jaGFyYWN0ZXJzJykgLy8gaGFuZGxlcyBBTlNJIGNvZGVzIGFuZCBpbnZpc2libGUgY2hhcmFjdGVyc1xuICAgICwgbGltaXQgPSAocywgbikgPT4gKGZpcnN0IChzLCBuIC0gMSkgKyAn4oCmJylcblxuY29uc3QgYXNDb2x1bW5zID0gKHJvd3MsIGNmZ18pID0+IHtcbiAgICBcbiAgICBjb25zdFxuXG4gICAgICAgIHppcCA9IChhcnJzLCBmKSA9PiBhcnJzLnJlZHVjZSAoKGEsIGIpID0+IGIubWFwICgoYiwgaSkgPT4gWy4uLmFbaV0gfHwgW10sIGJdKSwgW10pLm1hcCAoYXJncyA9PiBmICguLi5hcmdzKSksXG5cbiAgICAvKiAgQ29udmVydCBjZWxsIGRhdGEgdG8gc3RyaW5nIChjb252ZXJ0aW5nIG11bHRpbGluZSB0ZXh0IHRvIHNpbmdsZWxpbmUpICovXG5cbiAgICAgICAgY2VsbHMgICAgICAgICAgID0gcm93cy5tYXAgKHIgPT4gci5tYXAgKGMgPT4gYy5yZXBsYWNlICgvXFxuL2csICdcXFxcbicpKSksXG5cbiAgICAvKiAgQ29tcHV0ZSBjb2x1bW4gd2lkdGhzIChwZXIgcm93KSBhbmQgbWF4IHdpZHRocyAocGVyIGNvbHVtbikgICAgICovXG5cbiAgICAgICAgY2VsbFdpZHRocyAgICAgID0gY2VsbHMubWFwIChyID0+IHIubWFwIChzdHJsZW4pKSxcbiAgICAgICAgbWF4V2lkdGhzICAgICAgID0gemlwIChjZWxsV2lkdGhzLCBNYXRoLm1heCksXG5cbiAgICAvKiAgRGVmYXVsdCBjb25maWcgICAgICovXG5cbiAgICAgICAgY2ZnICAgICAgICAgICAgID0gTy5hc3NpZ24gKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxpbWl0ZXI6ICcgICcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWluQ29sdW1uV2lkdGhzOiBtYXhXaWR0aHMubWFwICh4ID0+IDApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heFRvdGFsV2lkdGg6IDAgfSwgY2ZnXyksXG5cbiAgICAgICAgZGVsaW1pdGVyTGVuZ3RoID0gc3RybGVuIChjZmcuZGVsaW1pdGVyKSxcblxuICAgIC8qICBQcm9qZWN0IGRlc2lyZWQgY29sdW1uIHdpZHRocywgdGFraW5nIG1heFRvdGFsV2lkdGggYW5kIG1pbkNvbHVtbldpZHRocyBpbiBhY2NvdW50LiAgICAgKi9cblxuICAgICAgICB0b3RhbFdpZHRoICAgICAgPSBtYXhXaWR0aHMucmVkdWNlICgoYSwgYikgPT4gYSArIGIsIDApLFxuICAgICAgICByZWxhdGl2ZVdpZHRocyAgPSBtYXhXaWR0aHMubWFwICh3ID0+IHcgLyB0b3RhbFdpZHRoKSxcbiAgICAgICAgbWF4VG90YWxXaWR0aCAgID0gY2ZnLm1heFRvdGFsV2lkdGggLSAoZGVsaW1pdGVyTGVuZ3RoICogKG1heFdpZHRocy5sZW5ndGggLSAxKSksXG4gICAgICAgIGV4Y2Vzc1dpZHRoICAgICA9IE1hdGgubWF4ICgwLCB0b3RhbFdpZHRoIC0gbWF4VG90YWxXaWR0aCksXG4gICAgICAgIGNvbXB1dGVkV2lkdGhzICA9IHppcCAoW2NmZy5taW5Db2x1bW5XaWR0aHMsIG1heFdpZHRocywgcmVsYXRpdmVXaWR0aHNdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtaW4sIG1heCwgcmVsYXRpdmUpID0+IE1hdGgubWF4IChtaW4sIE1hdGguZmxvb3IgKG1heCAtIGV4Y2Vzc1dpZHRoICogcmVsYXRpdmUpKSksXG5cbiAgICAvKiAgVGhpcyBpcyBob3cgbWFueSBzeW1ib2xzIHdlIHNob3VsZCBwYWQgb3IgY3V0IChwZXIgY29sdW1uKS4gICovXG5cbiAgICAgICAgcmVzdENlbGxXaWR0aHMgID0gY2VsbFdpZHRocy5tYXAgKHdpZHRocyA9PiB6aXAgKFtjb21wdXRlZFdpZHRocywgd2lkdGhzXSwgKGEsIGIpID0+IGEgLSBiKSlcblxuICAgIC8qICBQZXJmb3JtIGZpbmFsIGNvbXBvc2l0aW9uLiAgICovXG5cbiAgICAgICAgcmV0dXJuIHppcCAoW2NlbGxzLCByZXN0Q2VsbFdpZHRoc10sIChhLCBiKSA9PlxuICAgICAgICAgICAgICAgIHppcCAoW2EsIGJdLCAoc3RyLCB3KSA9PiAodyA+PSAwKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IChjZmcucmlnaHQgPyAoJyAnLnJlcGVhdCAodykgKyBzdHIpIDogKHN0ciArICcgJy5yZXBlYXQgKHcpKSlcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAobGltaXQgKHN0ciwgc3RybGVuIChzdHIpICsgdykpKS5qb2luIChjZmcuZGVsaW1pdGVyKSlcbn1cblxuY29uc3QgYXNUYWJsZSA9IGNmZyA9PiBPLmFzc2lnbiAoYXJyID0+IHtcblxuLyogIFByaW50IGFycmF5cyAgKi9cblxuICAgIGlmIChhcnJbMF0gJiYgQXJyYXkuaXNBcnJheSAoYXJyWzBdKSkge1xuICAgICAgICByZXR1cm4gYXNDb2x1bW5zIChhcnIubWFwIChyID0+IHIubWFwIChcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjLCBpKSA9PiAoYyA9PT0gdW5kZWZpbmVkKSA/ICcnIDogY2ZnLnByaW50IChjLCBpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApLFxuICAgICAgICAgICAgICAgICAgICAgICAgICBjZmcpLmpvaW4gKCdcXG4nKVxuICAgIH1cblxuLyogIFByaW50IG9iamVjdHMgICAqL1xuXG4gICAgY29uc3QgY29sTmFtZXMgPSBbLi4ubmV3IFNldCAoW10uY29uY2F0ICguLi5hcnIubWFwIChPLmtleXMpKSldLFxuICAgICAgICAgIGNvbHVtbnMgID0gW2NvbE5hbWVzLm1hcCAoY2ZnLnRpdGxlKSxcbiAgICAgICAgICAgICAgICAgICAgICAuLi5hcnIubWFwIChvID0+IGNvbE5hbWVzLm1hcCAoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5ID0+IChvW2tleV0gPT09IHVuZGVmaW5lZCkgPyAnJyA6IGNmZy5wcmludCAob1trZXldLCBrZXkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApXG4gICAgICAgICAgICAgICAgICAgICBdLFxuICAgICAgICAgIGxpbmVzICAgID0gYXNDb2x1bW5zIChjb2x1bW5zLCBjZmcpXG5cbiAgICByZXR1cm4gKGNmZy5kYXNoID8gW2xpbmVzWzBdLCBjZmcuZGFzaC5yZXBlYXQgKHN0cmxlbiAobGluZXNbMF0pKSwgLi4ubGluZXMuc2xpY2UgKDEpXSA6IGxpbmVzKS5qb2luICgnXFxuJylcblxufSwgY2ZnLCB7XG5cbiAgICBjb25maWd1cmU6IG5ld0NvbmZpZyA9PiBhc1RhYmxlIChPLmFzc2lnbiAoe30sIGNmZywgbmV3Q29uZmlnKSksXG59KVxuXG5tb2R1bGUuZXhwb3J0cyA9IGFzVGFibGUgKHtcblxuICAgIG1heFRvdGFsV2lkdGg6IE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLFxuICAgIHByaW50OiBTdHJpbmcsXG4gICAgdGl0bGU6IFN0cmluZyxcbiAgICBkYXNoOiAnLScsXG4gICAgcmlnaHQ6IGZhbHNlXG59KVxuIl19
\ No newline at end of file diff --git a/node_modules/as-table/package.json b/node_modules/as-table/package.json new file mode 100644 index 0000000..51b7d80 --- /dev/null +++ b/node_modules/as-table/package.json @@ -0,0 +1,67 @@ +{ + "name": "as-table", + "version": "1.0.55", + "description": "A simple function that print objects / arrays as ASCII tables. Handles ANSI styling and weird 💩 Unicode emoji symbols – they won't break the layout.", + "main": "build/as-table.js", + "typings": "./as-table.d.ts", + "scripts": { + "lint": "eslint as-table.js", + "lint-test": "eslint test.js", + "babel": "babel as-table.js --source-maps inline --out-file ./build/as-table.js", + "build": "npm run lint && npm run lint-test && npm run babel", + "coveralls": "nyc report --reporter=text-lcov | coveralls", + "test": "npm run build && env AS_TABLE_TEST_FILE='./build/as-table' nyc --reporter=html --reporter=text mocha --reporter spec", + "autotest": "env AS_TABLE_TEST_FILE='./as-table' mocha --reporter spec --watch" + }, + "repository": { + "type": "git", + "url": "https://github.com/xpl/as-table.git" + }, + "keywords": [ + "ASCII", + "table", + "sheet", + "grid", + "print", + "log", + "print table", + "object as table", + "array as table", + "text table", + "array table", + "object table", + "array format", + "columns", + "as table", + "tablefy", + "columns", + "stringify", + "print object", + "grid", + "tty", + "terminal", + "console", + "text", + "layout" + ], + "author": "Vitaly Gordon <rocket.mind@gmail.com>", + "license": "MIT", + "bugs": { + "url": "https://github.com/xpl/as-table/issues" + }, + "homepage": "https://github.com/xpl/as-table", + "devDependencies": { + "ansicolor": "^1.1.81", + "babel-cli": "^6.26.0", + "babel-plugin-transform-es2015-destructuring": "^6.23.0", + "babel-plugin-transform-es2015-spread": "^6.22.0", + "coveralls": "^3.0.3", + "eslint": "^4.19.1", + "istanbul": "^0.4.5", + "mocha": "^6.0.2", + "nyc": "^13.3.0" + }, + "dependencies": { + "printable-characters": "^1.0.42" + } +} diff --git a/node_modules/as-table/test.js b/node_modules/as-table/test.js new file mode 100644 index 0000000..abd7f94 --- /dev/null +++ b/node_modules/as-table/test.js @@ -0,0 +1,223 @@ +"use strict"; + +const assert = require ('assert'), + asTable = require (process.env.AS_TABLE_TEST_FILE), + ansi = require ('ansicolor').nice + +describe ('as-table', () => { + + it ('array printing works', () => { + + var testData = [['qwe', '123456789', 'zxcvbnm'], + ['qwerty', '12', 'zxcvb'], + ['💩wertyiop', '1234567', 'z']] + + assert.equal (asTable (testData), + + 'qwe 123456789 zxcvbnm\n' + + 'qwerty 12 zxcvb \n' + + '💩wertyiop 1234567 z ') + + assert.equal (asTable.configure ({ maxTotalWidth: 22, delimiter: ' | ' }) (testData), + + 'qwe | 1234… | zxc…\n' + + 'qwer… | 12 | zxc…\n' + + '💩wer… | 1234… | z ') + + console.log (asTable.configure ({ maxTotalWidth: 22, delimiter: ' | ' }) (testData)) + }) + + it ('object printing works', () => { + + var testData = + [ { foo: true, string: 'abcde', num: 42 }, + { foo: false, string: 'qwertyuiop', num: 43 }, + { string: null, num: 44 } ] + + assert.equal (asTable (testData), + + 'foo string num\n' + + '----------------------\n' + + 'true abcde 42 \n' + + 'false qwertyuiop 43 \n' + + ' null 44 ') + }) + + + it ('object printing works (with ANSI styling)', () => { + + var testData = + [ { foo: true, string: 'abcde'.cyan.bgYellow, num: 42 }, + { foo: false, string: 'qwertyuiop', num: 43 }, + { string: null, num: 44 } ] + + assert.equal (asTable (testData), + + 'foo string num\n' + + '----------------------\n' + + 'true \u001b[43m\u001b[36mabcde\u001b[39m\u001b[49m 42 \n' + + 'false qwertyuiop 43 \n' + + ' null 44 ') + }) + + it ('maxTotalWidth correctly handles object field names', () => { + + assert.equal ( + + asTable.configure ({ maxTotalWidth: 15 }) ([{ + + '0123456789': '0123456789', + 'abcdefxyzw': 'abcdefxyzw' }]), + + '01234… abcde…\n' + + '--------------\n' + + '01234… abcde…' + ) + }) + + it ('maxTotalWidth correctly handles object field names (with ANSI styling)', () => { + + assert.equal ( + + asTable.configure ({ maxTotalWidth: 15 }) ([{ + + '0123456789': '0123456789', + 'abcdefxyzw': 'abcdefxyzw'.cyan.bgYellow.italic.inverse.bright }]), + + '01234… abcde…\n' + + '--------------\n' + + '01234… ' + 'abcde'.cyan.bgYellow.italic.inverse.bright + '…' + ) + }) + + it ('everything renders as singleline', () => { + + assert.equal (asTable ([['fooo\n\nbar']]), 'fooo\\n\\nbar') + }) + + it ('configuring works', () => { + + const asTable25 = asTable.configure ({ maxTotalWidth: 25 }), + asTable25Delim = asTable25.configure ({ delimiter: ' | ' }) + + assert.notEqual (asTable25, asTable25Delim) + assert.equal (asTable25.maxTotalWidth, 25) + assert.equal (asTable25Delim.delimiter, ' | ') + }) + + it ('degenerate case works', () => { + + assert.equal (asTable ([]), '\n') + assert.equal (asTable ([{}]), '\n\n') + }) + + it ('null/undefined prints correctly', () => { + + assert.equal (asTable.configure ({ delimiter: '|' }) ([[null, undefined, 1, 2, 3]]), 'null||1|2|3') + }) + + it ('custom printer works', () => { + + var testData = + [ { foo: true, string: 'abcde', num: 42 }, + { foo: false, string: 'qwertyuiop', num: 43 }, + { string: null, num: 44 } ] + + const formatsBooleansAsYesNo = asTable.configure ({ print: obj => (typeof obj === 'boolean') ? (obj ? 'yes' : 'no') : String (obj) }) + + assert.equal (formatsBooleansAsYesNo (testData), + + 'foo string num\n' + + '--------------------\n' + + 'yes abcde 42 \n' + + 'no qwertyuiop 43 \n' + + ' null 44 ') + }) + + it ('custom printer works with object titles', () => { + + var testData = + [ { foo: true, string: 'abcde', num: 42, timestamp: 1561202591572 }, + { foo: false, string: 'qwertyuiop', num: 43, timestamp: 1558524240034 }, + { string: null, num: 44, timestamp: 1555932240034 } ] + + const formats = asTable.configure ({ + print: (obj, title) => { + if (title === 'foo') { + return obj ? 'yes' : 'no'; + } + if (title === 'timestamp') { + return new Date(obj).toGMTString(); + } + return String(obj); + } + }) + + assert.equal (formats (testData), + + 'foo string num timestamp \n' + + '---------------------------------------------------\n' + + 'yes abcde 42 Sat, 22 Jun 2019 11:23:11 GMT\n' + + 'no qwertyuiop 43 Wed, 22 May 2019 11:24:00 GMT\n' + + ' null 44 Mon, 22 Apr 2019 11:24:00 GMT') + }) + + it ('custom printer works with array keys', () => { + + var testData = + [ [ true, 'abcde', 42, 1561202591572 ], + [ false, 'qwertyuiop', 43, 1558524240034 ] ] + + const formats = asTable.configure ({ + print: (obj, index) => { + if (index === 0) { + return obj ? 'yes' : 'no'; + } + if (index === 3) { + return new Date(obj).toGMTString(); + } + return String(obj); + } + }) + + assert.equal (formats (testData), + + 'yes abcde 42 Sat, 22 Jun 2019 11:23:11 GMT\n' + + 'no qwertyuiop 43 Wed, 22 May 2019 11:24:00 GMT') + }) + + + it ('right align works', () => { + + var testData = + [ { foo: 1234.567, bar: 12 }, + { foo: '4.567'.bgMagenta.green, bar: 1234.456890 } ] + + assert.equal (asTable.configure ({ right: true }) (testData), + ' foo bar\n' + + '--------------------\n' + + '1234.567 12\n' + + ' ' + '4.567'.bgMagenta.green + ' 1234.45689') + }) + + it ('ANSI coloring works', () => { + + const testData = + [ { foo: true, string: 'abcde', num: 42 }, + { foo: false, string: '💩wertyuiop'.bgMagenta.green.bright, num: 43 } ] + + const d = ' | '.dim.cyan + const _ = '-'.bright.cyan + + const result = asTable.configure ({ title: x => x.bright, delimiter: d, dash: _ }) (testData) + + console.log (result) + + assert.equal (result, + + ['foo'.bright + ' ', 'string'.bright + ' ', 'num'.bright].join (d) + '\n' + + _.repeat (24) + '\n' + + ['true ', 'abcde ', '42 '].join (d) + '\n' + + ['false', '💩wertyuiop'.bgMagenta.green.bright, '43 '].join (d)) + }) +}) |
