@zuplo/cli 6.69.0 → 6.69.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/common/api/lib.d.ts +6 -1
- package/dist/common/api/lib.d.ts.map +1 -1
- package/dist/common/api/lib.js.map +1 -1
- package/dist/common/utils/pretty-print-environment-prompt.d.ts.map +1 -1
- package/dist/common/utils/pretty-print-environment-prompt.js +9 -15
- package/dist/common/utils/pretty-print-environment-prompt.js.map +1 -1
- package/dist/common/utils/pretty-print-environment-prompt.test.d.ts +2 -0
- package/dist/common/utils/pretty-print-environment-prompt.test.d.ts.map +1 -0
- package/dist/common/utils/pretty-print-environment-prompt.test.js +44 -0
- package/dist/common/utils/pretty-print-environment-prompt.test.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/node_modules/@zuplo/core/package.json +1 -1
- package/node_modules/@zuplo/graphql/package.json +1 -1
- package/node_modules/@zuplo/openapi-tools/package.json +1 -1
- package/node_modules/@zuplo/otel/package.json +1 -1
- package/node_modules/@zuplo/runtime/package.json +1 -1
- package/package.json +6 -10
- package/node_modules/as-table/.babelrc +0 -3
- package/node_modules/as-table/.eslintrc +0 -6
- package/node_modules/as-table/.travis.yml +0 -24
- package/node_modules/as-table/CHANGELOG.md +0 -3
- package/node_modules/as-table/LICENSE +0 -21
- package/node_modules/as-table/README.md +0 -113
- package/node_modules/as-table/as-table.d.ts +0 -32
- package/node_modules/as-table/as-table.js +0 -89
- package/node_modules/as-table/build/as-table.js +0 -86
- package/node_modules/as-table/package.json +0 -67
- package/node_modules/as-table/test.js +0 -223
- package/node_modules/printable-characters/.babelrc +0 -3
- package/node_modules/printable-characters/.eslintrc +0 -6
- package/node_modules/printable-characters/.gitattributes +0 -2
- package/node_modules/printable-characters/.npmignore +0 -8
- package/node_modules/printable-characters/.travis.yml +0 -24
- package/node_modules/printable-characters/CHANGELOG.md +0 -1
- package/node_modules/printable-characters/LICENSE +0 -24
- package/node_modules/printable-characters/README.md +0 -88
- package/node_modules/printable-characters/build/printable-characters.js +0 -53
- package/node_modules/printable-characters/package.json +0 -72
- package/node_modules/printable-characters/printable-characters.js +0 -44
- package/node_modules/printable-characters/test.js +0 -77
|
@@ -1,86 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
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); } }
|
|
4
|
-
|
|
5
|
-
const O = Object;
|
|
6
|
-
|
|
7
|
-
var _require = require('printable-characters');
|
|
8
|
-
|
|
9
|
-
const first = _require.first,
|
|
10
|
-
strlen = _require.strlen,
|
|
11
|
-
limit = (s, n) => first(s, n - 1) + '…';
|
|
12
|
-
|
|
13
|
-
const asColumns = (rows, cfg_) => {
|
|
14
|
-
|
|
15
|
-
const zip = (arrs, f) => arrs.reduce((a, b) => b.map((b, i) => [].concat(_toConsumableArray(a[i] || []), [b])), []).map(args => f.apply(undefined, _toConsumableArray(args))),
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
/* Convert cell data to string (converting multiline text to singleline) */
|
|
19
|
-
|
|
20
|
-
cells = rows.map(r => r.map(c => c.replace(/\n/g, '\\n'))),
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
/* Compute column widths (per row) and max widths (per column) */
|
|
24
|
-
|
|
25
|
-
cellWidths = cells.map(r => r.map(strlen)),
|
|
26
|
-
maxWidths = zip(cellWidths, Math.max),
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
/* Default config */
|
|
30
|
-
|
|
31
|
-
cfg = O.assign({
|
|
32
|
-
delimiter: ' ',
|
|
33
|
-
minColumnWidths: maxWidths.map(x => 0),
|
|
34
|
-
maxTotalWidth: 0 }, cfg_),
|
|
35
|
-
delimiterLength = strlen(cfg.delimiter),
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
/* Project desired column widths, taking maxTotalWidth and minColumnWidths in account. */
|
|
39
|
-
|
|
40
|
-
totalWidth = maxWidths.reduce((a, b) => a + b, 0),
|
|
41
|
-
relativeWidths = maxWidths.map(w => w / totalWidth),
|
|
42
|
-
maxTotalWidth = cfg.maxTotalWidth - delimiterLength * (maxWidths.length - 1),
|
|
43
|
-
excessWidth = Math.max(0, totalWidth - maxTotalWidth),
|
|
44
|
-
computedWidths = zip([cfg.minColumnWidths, maxWidths, relativeWidths], (min, max, relative) => Math.max(min, Math.floor(max - excessWidth * relative))),
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
/* This is how many symbols we should pad or cut (per column). */
|
|
48
|
-
|
|
49
|
-
restCellWidths = cellWidths.map(widths => zip([computedWidths, widths], (a, b) => a - b));
|
|
50
|
-
|
|
51
|
-
/* Perform final composition. */
|
|
52
|
-
|
|
53
|
-
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));
|
|
54
|
-
};
|
|
55
|
-
|
|
56
|
-
const asTable = cfg => O.assign(arr => {
|
|
57
|
-
var _ref;
|
|
58
|
-
|
|
59
|
-
/* Print arrays */
|
|
60
|
-
|
|
61
|
-
if (arr[0] && Array.isArray(arr[0])) {
|
|
62
|
-
return asColumns(arr.map(r => r.map((c, i) => c === undefined ? '' : cfg.print(c, i))), cfg).join('\n');
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/* Print objects */
|
|
66
|
-
|
|
67
|
-
const colNames = [].concat(_toConsumableArray(new Set((_ref = []).concat.apply(_ref, _toConsumableArray(arr.map(O.keys)))))),
|
|
68
|
-
columns = [colNames.map(cfg.title)].concat(_toConsumableArray(arr.map(o => colNames.map(key => o[key] === undefined ? '' : cfg.print(o[key], key))))),
|
|
69
|
-
lines = asColumns(columns, cfg);
|
|
70
|
-
|
|
71
|
-
return (cfg.dash ? [lines[0], cfg.dash.repeat(strlen(lines[0]))].concat(_toConsumableArray(lines.slice(1))) : lines).join('\n');
|
|
72
|
-
}, cfg, {
|
|
73
|
-
|
|
74
|
-
configure: newConfig => asTable(O.assign({}, cfg, newConfig))
|
|
75
|
-
});
|
|
76
|
-
|
|
77
|
-
module.exports = asTable({
|
|
78
|
-
|
|
79
|
-
maxTotalWidth: Number.MAX_SAFE_INTEGER,
|
|
80
|
-
print: String,
|
|
81
|
-
title: String,
|
|
82
|
-
dash: '-',
|
|
83
|
-
right: false
|
|
84
|
-
});
|
|
85
|
-
|
|
86
|
-
//# 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
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "as-table",
|
|
3
|
-
"version": "1.0.55",
|
|
4
|
-
"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.",
|
|
5
|
-
"main": "build/as-table.js",
|
|
6
|
-
"typings": "./as-table.d.ts",
|
|
7
|
-
"scripts": {
|
|
8
|
-
"lint": "eslint as-table.js",
|
|
9
|
-
"lint-test": "eslint test.js",
|
|
10
|
-
"babel": "babel as-table.js --source-maps inline --out-file ./build/as-table.js",
|
|
11
|
-
"build": "npm run lint && npm run lint-test && npm run babel",
|
|
12
|
-
"coveralls": "nyc report --reporter=text-lcov | coveralls",
|
|
13
|
-
"test": "npm run build && env AS_TABLE_TEST_FILE='./build/as-table' nyc --reporter=html --reporter=text mocha --reporter spec",
|
|
14
|
-
"autotest": "env AS_TABLE_TEST_FILE='./as-table' mocha --reporter spec --watch"
|
|
15
|
-
},
|
|
16
|
-
"repository": {
|
|
17
|
-
"type": "git",
|
|
18
|
-
"url": "https://github.com/xpl/as-table.git"
|
|
19
|
-
},
|
|
20
|
-
"keywords": [
|
|
21
|
-
"ASCII",
|
|
22
|
-
"table",
|
|
23
|
-
"sheet",
|
|
24
|
-
"grid",
|
|
25
|
-
"print",
|
|
26
|
-
"log",
|
|
27
|
-
"print table",
|
|
28
|
-
"object as table",
|
|
29
|
-
"array as table",
|
|
30
|
-
"text table",
|
|
31
|
-
"array table",
|
|
32
|
-
"object table",
|
|
33
|
-
"array format",
|
|
34
|
-
"columns",
|
|
35
|
-
"as table",
|
|
36
|
-
"tablefy",
|
|
37
|
-
"columns",
|
|
38
|
-
"stringify",
|
|
39
|
-
"print object",
|
|
40
|
-
"grid",
|
|
41
|
-
"tty",
|
|
42
|
-
"terminal",
|
|
43
|
-
"console",
|
|
44
|
-
"text",
|
|
45
|
-
"layout"
|
|
46
|
-
],
|
|
47
|
-
"author": "Vitaly Gordon <rocket.mind@gmail.com>",
|
|
48
|
-
"license": "MIT",
|
|
49
|
-
"bugs": {
|
|
50
|
-
"url": "https://github.com/xpl/as-table/issues"
|
|
51
|
-
},
|
|
52
|
-
"homepage": "https://github.com/xpl/as-table",
|
|
53
|
-
"devDependencies": {
|
|
54
|
-
"ansicolor": "^1.1.81",
|
|
55
|
-
"babel-cli": "^6.26.0",
|
|
56
|
-
"babel-plugin-transform-es2015-destructuring": "^6.23.0",
|
|
57
|
-
"babel-plugin-transform-es2015-spread": "^6.22.0",
|
|
58
|
-
"coveralls": "^3.0.3",
|
|
59
|
-
"eslint": "^4.19.1",
|
|
60
|
-
"istanbul": "^0.4.5",
|
|
61
|
-
"mocha": "^6.0.2",
|
|
62
|
-
"nyc": "^13.3.0"
|
|
63
|
-
},
|
|
64
|
-
"dependencies": {
|
|
65
|
-
"printable-characters": "^1.0.42"
|
|
66
|
-
}
|
|
67
|
-
}
|
|
@@ -1,223 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
const assert = require ('assert'),
|
|
4
|
-
asTable = require (process.env.AS_TABLE_TEST_FILE),
|
|
5
|
-
ansi = require ('ansicolor').nice
|
|
6
|
-
|
|
7
|
-
describe ('as-table', () => {
|
|
8
|
-
|
|
9
|
-
it ('array printing works', () => {
|
|
10
|
-
|
|
11
|
-
var testData = [['qwe', '123456789', 'zxcvbnm'],
|
|
12
|
-
['qwerty', '12', 'zxcvb'],
|
|
13
|
-
['💩wertyiop', '1234567', 'z']]
|
|
14
|
-
|
|
15
|
-
assert.equal (asTable (testData),
|
|
16
|
-
|
|
17
|
-
'qwe 123456789 zxcvbnm\n' +
|
|
18
|
-
'qwerty 12 zxcvb \n' +
|
|
19
|
-
'💩wertyiop 1234567 z ')
|
|
20
|
-
|
|
21
|
-
assert.equal (asTable.configure ({ maxTotalWidth: 22, delimiter: ' | ' }) (testData),
|
|
22
|
-
|
|
23
|
-
'qwe | 1234… | zxc…\n' +
|
|
24
|
-
'qwer… | 12 | zxc…\n' +
|
|
25
|
-
'💩wer… | 1234… | z ')
|
|
26
|
-
|
|
27
|
-
console.log (asTable.configure ({ maxTotalWidth: 22, delimiter: ' | ' }) (testData))
|
|
28
|
-
})
|
|
29
|
-
|
|
30
|
-
it ('object printing works', () => {
|
|
31
|
-
|
|
32
|
-
var testData =
|
|
33
|
-
[ { foo: true, string: 'abcde', num: 42 },
|
|
34
|
-
{ foo: false, string: 'qwertyuiop', num: 43 },
|
|
35
|
-
{ string: null, num: 44 } ]
|
|
36
|
-
|
|
37
|
-
assert.equal (asTable (testData),
|
|
38
|
-
|
|
39
|
-
'foo string num\n' +
|
|
40
|
-
'----------------------\n' +
|
|
41
|
-
'true abcde 42 \n' +
|
|
42
|
-
'false qwertyuiop 43 \n' +
|
|
43
|
-
' null 44 ')
|
|
44
|
-
})
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
it ('object printing works (with ANSI styling)', () => {
|
|
48
|
-
|
|
49
|
-
var testData =
|
|
50
|
-
[ { foo: true, string: 'abcde'.cyan.bgYellow, num: 42 },
|
|
51
|
-
{ foo: false, string: 'qwertyuiop', num: 43 },
|
|
52
|
-
{ string: null, num: 44 } ]
|
|
53
|
-
|
|
54
|
-
assert.equal (asTable (testData),
|
|
55
|
-
|
|
56
|
-
'foo string num\n' +
|
|
57
|
-
'----------------------\n' +
|
|
58
|
-
'true \u001b[43m\u001b[36mabcde\u001b[39m\u001b[49m 42 \n' +
|
|
59
|
-
'false qwertyuiop 43 \n' +
|
|
60
|
-
' null 44 ')
|
|
61
|
-
})
|
|
62
|
-
|
|
63
|
-
it ('maxTotalWidth correctly handles object field names', () => {
|
|
64
|
-
|
|
65
|
-
assert.equal (
|
|
66
|
-
|
|
67
|
-
asTable.configure ({ maxTotalWidth: 15 }) ([{
|
|
68
|
-
|
|
69
|
-
'0123456789': '0123456789',
|
|
70
|
-
'abcdefxyzw': 'abcdefxyzw' }]),
|
|
71
|
-
|
|
72
|
-
'01234… abcde…\n' +
|
|
73
|
-
'--------------\n' +
|
|
74
|
-
'01234… abcde…'
|
|
75
|
-
)
|
|
76
|
-
})
|
|
77
|
-
|
|
78
|
-
it ('maxTotalWidth correctly handles object field names (with ANSI styling)', () => {
|
|
79
|
-
|
|
80
|
-
assert.equal (
|
|
81
|
-
|
|
82
|
-
asTable.configure ({ maxTotalWidth: 15 }) ([{
|
|
83
|
-
|
|
84
|
-
'0123456789': '0123456789',
|
|
85
|
-
'abcdefxyzw': 'abcdefxyzw'.cyan.bgYellow.italic.inverse.bright }]),
|
|
86
|
-
|
|
87
|
-
'01234… abcde…\n' +
|
|
88
|
-
'--------------\n' +
|
|
89
|
-
'01234… ' + 'abcde'.cyan.bgYellow.italic.inverse.bright + '…'
|
|
90
|
-
)
|
|
91
|
-
})
|
|
92
|
-
|
|
93
|
-
it ('everything renders as singleline', () => {
|
|
94
|
-
|
|
95
|
-
assert.equal (asTable ([['fooo\n\nbar']]), 'fooo\\n\\nbar')
|
|
96
|
-
})
|
|
97
|
-
|
|
98
|
-
it ('configuring works', () => {
|
|
99
|
-
|
|
100
|
-
const asTable25 = asTable.configure ({ maxTotalWidth: 25 }),
|
|
101
|
-
asTable25Delim = asTable25.configure ({ delimiter: ' | ' })
|
|
102
|
-
|
|
103
|
-
assert.notEqual (asTable25, asTable25Delim)
|
|
104
|
-
assert.equal (asTable25.maxTotalWidth, 25)
|
|
105
|
-
assert.equal (asTable25Delim.delimiter, ' | ')
|
|
106
|
-
})
|
|
107
|
-
|
|
108
|
-
it ('degenerate case works', () => {
|
|
109
|
-
|
|
110
|
-
assert.equal (asTable ([]), '\n')
|
|
111
|
-
assert.equal (asTable ([{}]), '\n\n')
|
|
112
|
-
})
|
|
113
|
-
|
|
114
|
-
it ('null/undefined prints correctly', () => {
|
|
115
|
-
|
|
116
|
-
assert.equal (asTable.configure ({ delimiter: '|' }) ([[null, undefined, 1, 2, 3]]), 'null||1|2|3')
|
|
117
|
-
})
|
|
118
|
-
|
|
119
|
-
it ('custom printer works', () => {
|
|
120
|
-
|
|
121
|
-
var testData =
|
|
122
|
-
[ { foo: true, string: 'abcde', num: 42 },
|
|
123
|
-
{ foo: false, string: 'qwertyuiop', num: 43 },
|
|
124
|
-
{ string: null, num: 44 } ]
|
|
125
|
-
|
|
126
|
-
const formatsBooleansAsYesNo = asTable.configure ({ print: obj => (typeof obj === 'boolean') ? (obj ? 'yes' : 'no') : String (obj) })
|
|
127
|
-
|
|
128
|
-
assert.equal (formatsBooleansAsYesNo (testData),
|
|
129
|
-
|
|
130
|
-
'foo string num\n' +
|
|
131
|
-
'--------------------\n' +
|
|
132
|
-
'yes abcde 42 \n' +
|
|
133
|
-
'no qwertyuiop 43 \n' +
|
|
134
|
-
' null 44 ')
|
|
135
|
-
})
|
|
136
|
-
|
|
137
|
-
it ('custom printer works with object titles', () => {
|
|
138
|
-
|
|
139
|
-
var testData =
|
|
140
|
-
[ { foo: true, string: 'abcde', num: 42, timestamp: 1561202591572 },
|
|
141
|
-
{ foo: false, string: 'qwertyuiop', num: 43, timestamp: 1558524240034 },
|
|
142
|
-
{ string: null, num: 44, timestamp: 1555932240034 } ]
|
|
143
|
-
|
|
144
|
-
const formats = asTable.configure ({
|
|
145
|
-
print: (obj, title) => {
|
|
146
|
-
if (title === 'foo') {
|
|
147
|
-
return obj ? 'yes' : 'no';
|
|
148
|
-
}
|
|
149
|
-
if (title === 'timestamp') {
|
|
150
|
-
return new Date(obj).toGMTString();
|
|
151
|
-
}
|
|
152
|
-
return String(obj);
|
|
153
|
-
}
|
|
154
|
-
})
|
|
155
|
-
|
|
156
|
-
assert.equal (formats (testData),
|
|
157
|
-
|
|
158
|
-
'foo string num timestamp \n' +
|
|
159
|
-
'---------------------------------------------------\n' +
|
|
160
|
-
'yes abcde 42 Sat, 22 Jun 2019 11:23:11 GMT\n' +
|
|
161
|
-
'no qwertyuiop 43 Wed, 22 May 2019 11:24:00 GMT\n' +
|
|
162
|
-
' null 44 Mon, 22 Apr 2019 11:24:00 GMT')
|
|
163
|
-
})
|
|
164
|
-
|
|
165
|
-
it ('custom printer works with array keys', () => {
|
|
166
|
-
|
|
167
|
-
var testData =
|
|
168
|
-
[ [ true, 'abcde', 42, 1561202591572 ],
|
|
169
|
-
[ false, 'qwertyuiop', 43, 1558524240034 ] ]
|
|
170
|
-
|
|
171
|
-
const formats = asTable.configure ({
|
|
172
|
-
print: (obj, index) => {
|
|
173
|
-
if (index === 0) {
|
|
174
|
-
return obj ? 'yes' : 'no';
|
|
175
|
-
}
|
|
176
|
-
if (index === 3) {
|
|
177
|
-
return new Date(obj).toGMTString();
|
|
178
|
-
}
|
|
179
|
-
return String(obj);
|
|
180
|
-
}
|
|
181
|
-
})
|
|
182
|
-
|
|
183
|
-
assert.equal (formats (testData),
|
|
184
|
-
|
|
185
|
-
'yes abcde 42 Sat, 22 Jun 2019 11:23:11 GMT\n' +
|
|
186
|
-
'no qwertyuiop 43 Wed, 22 May 2019 11:24:00 GMT')
|
|
187
|
-
})
|
|
188
|
-
|
|
189
|
-
|
|
190
|
-
it ('right align works', () => {
|
|
191
|
-
|
|
192
|
-
var testData =
|
|
193
|
-
[ { foo: 1234.567, bar: 12 },
|
|
194
|
-
{ foo: '4.567'.bgMagenta.green, bar: 1234.456890 } ]
|
|
195
|
-
|
|
196
|
-
assert.equal (asTable.configure ({ right: true }) (testData),
|
|
197
|
-
' foo bar\n' +
|
|
198
|
-
'--------------------\n' +
|
|
199
|
-
'1234.567 12\n' +
|
|
200
|
-
' ' + '4.567'.bgMagenta.green + ' 1234.45689')
|
|
201
|
-
})
|
|
202
|
-
|
|
203
|
-
it ('ANSI coloring works', () => {
|
|
204
|
-
|
|
205
|
-
const testData =
|
|
206
|
-
[ { foo: true, string: 'abcde', num: 42 },
|
|
207
|
-
{ foo: false, string: '💩wertyuiop'.bgMagenta.green.bright, num: 43 } ]
|
|
208
|
-
|
|
209
|
-
const d = ' | '.dim.cyan
|
|
210
|
-
const _ = '-'.bright.cyan
|
|
211
|
-
|
|
212
|
-
const result = asTable.configure ({ title: x => x.bright, delimiter: d, dash: _ }) (testData)
|
|
213
|
-
|
|
214
|
-
console.log (result)
|
|
215
|
-
|
|
216
|
-
assert.equal (result,
|
|
217
|
-
|
|
218
|
-
['foo'.bright + ' ', 'string'.bright + ' ', 'num'.bright].join (d) + '\n' +
|
|
219
|
-
_.repeat (24) + '\n' +
|
|
220
|
-
['true ', 'abcde ', '42 '].join (d) + '\n' +
|
|
221
|
-
['false', '💩wertyuiop'.bgMagenta.green.bright, '43 '].join (d))
|
|
222
|
-
})
|
|
223
|
-
})
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
language: node_js
|
|
2
|
-
node_js:
|
|
3
|
-
- '4'
|
|
4
|
-
script:
|
|
5
|
-
- set -e
|
|
6
|
-
- npm run test
|
|
7
|
-
- npm run coveralls
|
|
8
|
-
after_success:
|
|
9
|
-
- git config --global user.email "travis@travis-ci.org"
|
|
10
|
-
- git config --global user.name "Travis CI"
|
|
11
|
-
- npm config set git-tag-version=false
|
|
12
|
-
- NPM_VERSION=$(npm version patch)
|
|
13
|
-
- git commit -a -m "${NPM_VERSION:1}" -m "[ci skip]"
|
|
14
|
-
- git remote remove origin
|
|
15
|
-
- git remote add origin https://${GITHUB_TOKEN}@github.com/xpl/printable-characters.git
|
|
16
|
-
- git push origin HEAD:master
|
|
17
|
-
deploy:
|
|
18
|
-
provider: npm
|
|
19
|
-
email: rocket.mind@gmail.com
|
|
20
|
-
api_key:
|
|
21
|
-
secure: EOHJmUzqz4QzNyQtRbomfi+dw0WMqw8EvT9hOzaTkw4W35fGyDLUblFFv5Md34h9+0oNNeGvj8/tnnYV0JF+vpH7sPW7jhObT03RvIOfglofIGPzF0OuH0PsWMowhjZwqCqpDDbLDA4sT7pcsjoE7uxIX2K/ekN4E44i8et64mpeHViQbowsbfTqhmsjo7oOmeH28J4dqeWrfyrTS+Ru17mmlyLOr+LTEBiQQYt4oKC+zKeyc5zcF73HAmt5pPDf4ZmXPD6sv6btpYFYYbRp6IBwEkw96MGfu6qD7HB1viIWr/n+le01T8gp2MS857AXERoByTCPWpU9zZ+f9UJOMhpRJjMorbMfolACR/f41ftPqF3dWuVAqzujmgeUEoiG1Gp9VtJqAAEeMSAzbL2dhlRbzPHnSV8ymqhiX6mAeCUXVHFzG/nY+CW2V4XfursD3ZDbgyD/otCKZbkBDmTxG0JdtA7HgMxh9eXRfIqw6LQNL+X1Mhr5nhgrG6u052dm79Is7EBihb5YS48Nl7IqQLijtb2x62YGspVmRI05W4cE7Hr+MHYBTrUSakyva3yKZXcMaLv0x/Wsos6h22qDYJUbv1Fiq1aWog5YvW/bq63PuU0A0AYhffliRkxqhH9s81ECYYVc+1ddtRJLnRGZEQ866mNl/O7C4hztXrbYTyE=
|
|
22
|
-
env:
|
|
23
|
-
global:
|
|
24
|
-
secure: hJDQGV8hM1zxL77khxhtXPbb1lBF9dPmUytcMA3mt6BDyz9+U3fQcpn5CMnwG+Vu03mjSOuY5BfprG2tp+MLmjVnK5ej/Wl/nfFeUAeSshnoWZwTq+vbvURsGBeGKWqnrYK6fZfprcysIEF40gh2RsOfu/pLeZCzgFmRhgyONrBUfIIMH6iordj986S4xWR0bETFlUZ3tSAG9JTADXK1CMIC5fn+UE8vOVC00BR6GDwdsU/cA1J6+HCD1wq6fvEi5gVlzHyiprmYiIgXwK/k6eaGCZhk5jDZ6fL5fW07pGdQRAGb0SqTeyzjy36w1xu7bH3G/ABQPMCg2tzfD2jCKgcja5Dbe7YpZOcx7ArBp8yke0rSuoH0rHK8i4/Ngxsx7xJr4wxfMxpXM82jIi3bZV/ZIDNIE3oLfO/FPvgI+zjckXoKJO7esM09fhaXLqCak6ls3NUy86pXWCn8jiL09kaFl5A5O23BI67zmLtsKejdS+5jU3W/LkW07UM17SiU9CkgEPQi07uW9rJ9dEhhsCRCvH5xxYLf+I/0zMJNGsYOEvo0P7FjI6FAz0E1h7Ktctr0D9GYqpvWggugxoc2G7s1SwrJZmqR3uWMRC8t/4Pd6fyk7C5SjbNGCdCuSayKXlLiNSNVeaGhrzFsoOkDh/QuVb4y++uF91i1bZ60Tn8=
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
# Recent updates
|
|
@@ -1,24 +0,0 @@
|
|
|
1
|
-
This is free and unencumbered software released into the public domain.
|
|
2
|
-
|
|
3
|
-
Anyone is free to copy, modify, publish, use, compile, sell, or
|
|
4
|
-
distribute this software, either in source code form or as a compiled
|
|
5
|
-
binary, for any purpose, commercial or non-commercial, and by any
|
|
6
|
-
means.
|
|
7
|
-
|
|
8
|
-
In jurisdictions that recognize copyright laws, the author or authors
|
|
9
|
-
of this software dedicate any and all copyright interest in the
|
|
10
|
-
software to the public domain. We make this dedication for the benefit
|
|
11
|
-
of the public at large and to the detriment of our heirs and
|
|
12
|
-
successors. We intend this dedication to be an overt act of
|
|
13
|
-
relinquishment in perpetuity of all present and future rights to this
|
|
14
|
-
software under copyright law.
|
|
15
|
-
|
|
16
|
-
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
17
|
-
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
18
|
-
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
|
|
19
|
-
IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR
|
|
20
|
-
OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
|
|
21
|
-
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
|
22
|
-
OTHER DEALINGS IN THE SOFTWARE.
|
|
23
|
-
|
|
24
|
-
For more information, please refer to <http://unlicense.org>
|
|
@@ -1,88 +0,0 @@
|
|
|
1
|
-
# printable-characters
|
|
2
|
-
|
|
3
|
-
[](https://travis-ci.org/xpl/printable-characters) [](https://coveralls.io/github/xpl/printable-characters) [](https://npmjs.com/package/printable-characters) [](https://scrutinizer-ci.com/g/xpl/printable-characters/?branch=master) [](https://david-dm.org/xpl/printable-characters)
|
|
4
|
-
|
|
5
|
-
A little helper for handling strings containing zero width characters, ANSI styling, whitespaces, newlines, [weird Unicode 💩 symbols](http://blog.jonnew.com/posts/poo-dot-length-equals-two), etc.
|
|
6
|
-
|
|
7
|
-
## Determining the real (visible) length of a string
|
|
8
|
-
|
|
9
|
-
```javascript
|
|
10
|
-
const { strlen } = require ('printable-characters')
|
|
11
|
-
|
|
12
|
-
strlen ('foo bar') // === 7
|
|
13
|
-
strlen ('\u001b[106mfoo bar\u001b[49m') // === 7
|
|
14
|
-
```
|
|
15
|
-
|
|
16
|
-
## Detecting blank text
|
|
17
|
-
|
|
18
|
-
```javascript
|
|
19
|
-
const { isBlank } = require ('printable-characters')
|
|
20
|
-
|
|
21
|
-
isBlank ('foobar') // === false
|
|
22
|
-
isBlank ('\u001b[106m \t \t \n \u001b[49m') // === true
|
|
23
|
-
```
|
|
24
|
-
|
|
25
|
-
## Obtaining a blank string of the same width
|
|
26
|
-
|
|
27
|
-
```javascript
|
|
28
|
-
const { blank } = require ('printable-characters')
|
|
29
|
-
|
|
30
|
-
blank ('💩') // === ' '
|
|
31
|
-
blank ('foo') // === ' '
|
|
32
|
-
blank ('\tfoo \nfoo') // === '\t \n '
|
|
33
|
-
blank ('\u001b[22m\u001b[1mfoo \t\u001b[39m\u001b[22m')) // === ' \t'
|
|
34
|
-
```
|
|
35
|
-
|
|
36
|
-
## Matching invisible characters
|
|
37
|
-
|
|
38
|
-
```javascript
|
|
39
|
-
const { ansiEscapeCodes, zeroWidthCharacters } = require ('printable-characters')
|
|
40
|
-
|
|
41
|
-
const s = '\u001b[106m' + 'foo' + '\n' + 'bar' + '\u001b[49m'
|
|
42
|
-
|
|
43
|
-
s.replace (ansiEscapeCodes, '') // === 'foo\nbar'
|
|
44
|
-
.replace (zeroWidthCharacters, '') // === 'foobar'
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
## Getting the first N visible symbols, preserving the invisible parts
|
|
48
|
-
|
|
49
|
-
Use for safely truncating strings to maximum width without breaking ANSI codes:
|
|
50
|
-
|
|
51
|
-
```javascript
|
|
52
|
-
const { first } = require ('printable-characters')
|
|
53
|
-
|
|
54
|
-
const s = '\u001b[22mfoobar\u001b[22m'
|
|
55
|
-
|
|
56
|
-
first (s, 0) // === '\u001b[22m\u001b[22m'
|
|
57
|
-
first (s, 1) // === '\u001b[22mf\u001b[22m'
|
|
58
|
-
first (s, 3) // === '\u001b[22mfoo\u001b[22m'
|
|
59
|
-
first (s, 6) // === '\u001b[22mfoobar\u001b[22m'
|
|
60
|
-
```
|
|
61
|
-
|
|
62
|
-
## Extracting the invisible parts followed by the visible ones (parsing)
|
|
63
|
-
|
|
64
|
-
```javascript
|
|
65
|
-
const { partition } = require ('printable-characters')
|
|
66
|
-
|
|
67
|
-
partition ('') // [ ])
|
|
68
|
-
partition ('foo') // [['', 'foo'] ])
|
|
69
|
-
partition ('\u001b[1mfoo') // [['\u001b[1m', 'foo'] ])
|
|
70
|
-
partition ('\u001b[1mfoo\u0000bar') // [['\u001b[1m', 'foo'], ['\u0000', 'bar'] ])
|
|
71
|
-
partition ('\u001b[1mfoo\u0000bar\n') // [['\u001b[1m', 'foo'], ['\u0000', 'bar'], ['\n', '']])
|
|
72
|
-
```
|
|
73
|
-
|
|
74
|
-
## Applications
|
|
75
|
-
|
|
76
|
-
- [as-table](https://github.com/xpl/as-table) — a simple function that prints objects as ASCII tables
|
|
77
|
-
- [string.bullet](https://github.com/xpl/string.bullet) — ASCII-mode bulleting for the list-style data
|
|
78
|
-
- [string.ify](https://github.com/xpl/string.ify) — a fancy pretty printer for the JavaScript entities
|
|
79
|
-
- [Ololog!](https://github.com/xpl/ololog) — a better `console.log` for the log-driven debugging junkies!
|
|
80
|
-
|
|
81
|
-
## TODO
|
|
82
|
-
|
|
83
|
-
Handle multi-component emojis, as in [this article](http://blog.jonnew.com/posts/poo-dot-length-equals-two):
|
|
84
|
-
|
|
85
|
-
```javascript
|
|
86
|
-
assert.equal (strlen ('👩❤️💋👩'), 1) // FAILING, see http://blog.jonnew.com/posts/poo-dot-length-equals-two for possible solution
|
|
87
|
-
assert.equal (blank ('👩❤️💋👩'), ' ') // FAILING, see http://blog.jonnew.com/posts/poo-dot-length-equals-two for possible solution
|
|
88
|
-
```
|
|
@@ -1,53 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
|
|
3
|
-
var _slicedToArray = function () { function sliceIterator(arr, i) { var _arr = []; var _n = true; var _d = false; var _e = undefined; try { for (var _i = arr[Symbol.iterator](), _s; !(_n = (_s = _i.next()).done); _n = true) { _arr.push(_s.value); if (i && _arr.length === i) break; } } catch (err) { _d = true; _e = err; } finally { try { if (!_n && _i["return"]) _i["return"](); } finally { if (_d) throw _e; } } return _arr; } return function (arr, i) { if (Array.isArray(arr)) { return arr; } else if (Symbol.iterator in Object(arr)) { return sliceIterator(arr, i); } else { throw new TypeError("Invalid attempt to destructure non-iterable instance"); } }; }();
|
|
4
|
-
|
|
5
|
-
const ansiEscapeCode = '[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-PRZcf-nqry=><]',
|
|
6
|
-
zeroWidthCharacterExceptNewline = '\u0000-\u0008\u000B-\u0019\u001b\u009b\u00ad\u200b\u2028\u2029\ufeff\ufe00-\ufe0f',
|
|
7
|
-
zeroWidthCharacter = '\n' + zeroWidthCharacterExceptNewline,
|
|
8
|
-
zeroWidthCharactersExceptNewline = new RegExp('(?:' + ansiEscapeCode + ')|[' + zeroWidthCharacterExceptNewline + ']', 'g'),
|
|
9
|
-
zeroWidthCharacters = new RegExp('(?:' + ansiEscapeCode + ')|[' + zeroWidthCharacter + ']', 'g'),
|
|
10
|
-
partition = new RegExp('((?:' + ansiEscapeCode + ')|[\t' + zeroWidthCharacter + '])?([^\t' + zeroWidthCharacter + ']*)', 'g');
|
|
11
|
-
|
|
12
|
-
module.exports = {
|
|
13
|
-
|
|
14
|
-
zeroWidthCharacters,
|
|
15
|
-
|
|
16
|
-
ansiEscapeCodes: new RegExp(ansiEscapeCode, 'g'),
|
|
17
|
-
|
|
18
|
-
strlen: s => Array.from(s.replace(zeroWidthCharacters, '')).length, // Array.from solves the emoji problem as described here: http://blog.jonnew.com/posts/poo-dot-length-equals-two
|
|
19
|
-
|
|
20
|
-
isBlank: s => s.replace(zeroWidthCharacters, '').replace(/\s/g, '').length === 0,
|
|
21
|
-
|
|
22
|
-
blank: s => Array.from(s.replace(zeroWidthCharactersExceptNewline, '')) // Array.from solves the emoji problem as described here: http://blog.jonnew.com/posts/poo-dot-length-equals-two
|
|
23
|
-
.map(x => x === '\t' || x === '\n' ? x : ' ').join(''),
|
|
24
|
-
|
|
25
|
-
partition(s) {
|
|
26
|
-
for (var m, spans = []; partition.lastIndex !== s.length && (m = partition.exec(s));) {
|
|
27
|
-
spans.push([m[1] || '', m[2]]);
|
|
28
|
-
}
|
|
29
|
-
partition.lastIndex = 0; // reset
|
|
30
|
-
return spans;
|
|
31
|
-
},
|
|
32
|
-
|
|
33
|
-
first(s, n) {
|
|
34
|
-
|
|
35
|
-
let result = '',
|
|
36
|
-
length = 0;
|
|
37
|
-
|
|
38
|
-
for (const _ref of module.exports.partition(s)) {
|
|
39
|
-
var _ref2 = _slicedToArray(_ref, 2);
|
|
40
|
-
|
|
41
|
-
const nonPrintable = _ref2[0];
|
|
42
|
-
const printable = _ref2[1];
|
|
43
|
-
|
|
44
|
-
const text = Array.from(printable).slice(0, n - length); // Array.from solves the emoji problem as described here: http://blog.jonnew.com/posts/poo-dot-length-equals-two
|
|
45
|
-
result += nonPrintable + text.join('');
|
|
46
|
-
length += text.length;
|
|
47
|
-
}
|
|
48
|
-
|
|
49
|
-
return result;
|
|
50
|
-
}
|
|
51
|
-
};
|
|
52
|
-
|
|
53
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIi4uL3ByaW50YWJsZS1jaGFyYWN0ZXJzLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBOzs7O0FBRUEsTUFBTSxpQkFBbUMsNEVBQXpDO0FBQUEsTUFDTSxrQ0FBbUMsbUZBRHpDO0FBQUEsTUFFTSxxQkFBbUMsT0FBTywrQkFGaEQ7QUFBQSxNQUdNLG1DQUFtQyxJQUFJLE1BQUosQ0FBWSxRQUFRLGNBQVIsR0FBeUIsS0FBekIsR0FBaUMsK0JBQWpDLEdBQW1FLEdBQS9FLEVBQW9GLEdBQXBGLENBSHpDO0FBQUEsTUFJTSxzQkFBbUMsSUFBSSxNQUFKLENBQVksUUFBUSxjQUFSLEdBQXlCLEtBQXpCLEdBQWlDLGtCQUFqQyxHQUFzRCxHQUFsRSxFQUF1RSxHQUF2RSxDQUp6QztBQUFBLE1BS00sWUFBbUMsSUFBSSxNQUFKLENBQVksU0FBUyxjQUFULEdBQTBCLE9BQTFCLEdBQW9DLGtCQUFwQyxHQUF5RCxVQUF6RCxHQUFzRSxrQkFBdEUsR0FBMkYsS0FBdkcsRUFBOEcsR0FBOUcsQ0FMekM7O0FBT0EsT0FBTyxPQUFQLEdBQWlCOztBQUViLHVCQUZhOztBQUliLHFCQUFpQixJQUFJLE1BQUosQ0FBWSxjQUFaLEVBQTRCLEdBQTVCLENBSko7O0FBTWIsWUFBUSxLQUFLLE1BQU0sSUFBTixDQUFZLEVBQUUsT0FBRixDQUFXLG1CQUFYLEVBQWdDLEVBQWhDLENBQVosRUFBaUQsTUFOakQsRUFNeUQ7O0FBRXRFLGFBQVMsS0FBSyxFQUFFLE9BQUYsQ0FBVyxtQkFBWCxFQUFnQyxFQUFoQyxFQUNFLE9BREYsQ0FDVyxLQURYLEVBQ2tCLEVBRGxCLEVBRUUsTUFGRixLQUVhLENBVmQ7O0FBWWIsV0FBTyxLQUFLLE1BQU0sSUFBTixDQUFZLEVBQUUsT0FBRixDQUFXLGdDQUFYLEVBQTZDLEVBQTdDLENBQVosRUFBOEQ7QUFBOUQsS0FDTSxHQUROLENBQ1csS0FBTyxNQUFNLElBQVAsSUFBaUIsTUFBTSxJQUF4QixHQUFpQyxDQUFqQyxHQUFxQyxHQURyRCxFQUVNLElBRk4sQ0FFWSxFQUZaLENBWkM7O0FBZ0JiLGNBQVcsQ0FBWCxFQUFjO0FBQ1YsYUFBSyxJQUFJLENBQUosRUFBTyxRQUFRLEVBQXBCLEVBQXlCLFVBQVUsU0FBVixLQUF3QixFQUFFLE1BQTNCLEtBQXVDLElBQUksVUFBVSxJQUFWLENBQWdCLENBQWhCLENBQTNDLENBQXhCLEdBQXlGO0FBQUUsa0JBQU0sSUFBTixDQUFZLENBQUMsRUFBRSxDQUFGLEtBQVEsRUFBVCxFQUFhLEVBQUUsQ0FBRixDQUFiLENBQVo7QUFBaUM7QUFDNUgsa0JBQVUsU0FBVixHQUFzQixDQUF0QixDQUZVLENBRWM7QUFDeEIsZUFBTyxLQUFQO0FBQ0gsS0FwQlk7O0FBc0JiLFVBQU8sQ0FBUCxFQUFVLENBQVYsRUFBYTs7QUFFVCxZQUFJLFNBQVMsRUFBYjtBQUFBLFlBQWlCLFNBQVMsQ0FBMUI7O0FBRUEsMkJBQXdDLE9BQU8sT0FBUCxDQUFlLFNBQWYsQ0FBMEIsQ0FBMUIsQ0FBeEMsRUFBc0U7QUFBQTs7QUFBQSxrQkFBMUQsWUFBMEQ7QUFBQSxrQkFBNUMsU0FBNEM7O0FBQ2xFLGtCQUFNLE9BQU8sTUFBTSxJQUFOLENBQVksU0FBWixFQUF1QixLQUF2QixDQUE4QixDQUE5QixFQUFpQyxJQUFJLE1BQXJDLENBQWIsQ0FEa0UsQ0FDUjtBQUMxRCxzQkFBVSxlQUFlLEtBQUssSUFBTCxDQUFXLEVBQVgsQ0FBekI7QUFDQSxzQkFBVSxLQUFLLE1BQWY7QUFDSDs7QUFFRCxlQUFPLE1BQVA7QUFDSDtBQWpDWSxDQUFqQiIsImZpbGUiOiJwcmludGFibGUtY2hhcmFjdGVycy5qcyIsInNvdXJjZXNDb250ZW50IjpbIlwidXNlIHN0cmljdFwiO1xuXG5jb25zdCBhbnNpRXNjYXBlQ29kZSAgICAgICAgICAgICAgICAgICA9ICdbXFx1MDAxYlxcdTAwOWJdW1soKSM7P10qKD86WzAtOV17MSw0fSg/OjtbMC05XXswLDR9KSopP1swLTlBLVBSWmNmLW5xcnk9PjxdJ1xuICAgICwgemVyb1dpZHRoQ2hhcmFjdGVyRXhjZXB0TmV3bGluZSAgPSAnXFx1MDAwMC1cXHUwMDA4XFx1MDAwQi1cXHUwMDE5XFx1MDAxYlxcdTAwOWJcXHUwMGFkXFx1MjAwYlxcdTIwMjhcXHUyMDI5XFx1ZmVmZlxcdWZlMDAtXFx1ZmUwZidcbiAgICAsIHplcm9XaWR0aENoYXJhY3RlciAgICAgICAgICAgICAgID0gJ1xcbicgKyB6ZXJvV2lkdGhDaGFyYWN0ZXJFeGNlcHROZXdsaW5lXG4gICAgLCB6ZXJvV2lkdGhDaGFyYWN0ZXJzRXhjZXB0TmV3bGluZSA9IG5ldyBSZWdFeHAgKCcoPzonICsgYW5zaUVzY2FwZUNvZGUgKyAnKXxbJyArIHplcm9XaWR0aENoYXJhY3RlckV4Y2VwdE5ld2xpbmUgKyAnXScsICdnJylcbiAgICAsIHplcm9XaWR0aENoYXJhY3RlcnMgICAgICAgICAgICAgID0gbmV3IFJlZ0V4cCAoJyg/OicgKyBhbnNpRXNjYXBlQ29kZSArICcpfFsnICsgemVyb1dpZHRoQ2hhcmFjdGVyICsgJ10nLCAnZycpXG4gICAgLCBwYXJ0aXRpb24gICAgICAgICAgICAgICAgICAgICAgICA9IG5ldyBSZWdFeHAgKCcoKD86JyArIGFuc2lFc2NhcGVDb2RlICsgJyl8W1xcdCcgKyB6ZXJvV2lkdGhDaGFyYWN0ZXIgKyAnXSk/KFteXFx0JyArIHplcm9XaWR0aENoYXJhY3RlciArICddKiknLCAnZycpXG5cbm1vZHVsZS5leHBvcnRzID0ge1xuXG4gICAgemVyb1dpZHRoQ2hhcmFjdGVycyxcblxuICAgIGFuc2lFc2NhcGVDb2RlczogbmV3IFJlZ0V4cCAoYW5zaUVzY2FwZUNvZGUsICdnJyksXG5cbiAgICBzdHJsZW46IHMgPT4gQXJyYXkuZnJvbSAocy5yZXBsYWNlICh6ZXJvV2lkdGhDaGFyYWN0ZXJzLCAnJykpLmxlbmd0aCwgLy8gQXJyYXkuZnJvbSBzb2x2ZXMgdGhlIGVtb2ppIHByb2JsZW0gYXMgZGVzY3JpYmVkIGhlcmU6IGh0dHA6Ly9ibG9nLmpvbm5ldy5jb20vcG9zdHMvcG9vLWRvdC1sZW5ndGgtZXF1YWxzLXR3b1xuXG4gICAgaXNCbGFuazogcyA9PiBzLnJlcGxhY2UgKHplcm9XaWR0aENoYXJhY3RlcnMsICcnKVxuICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlICgvXFxzL2csICcnKVxuICAgICAgICAgICAgICAgICAgIC5sZW5ndGggPT09IDAsXG5cbiAgICBibGFuazogcyA9PiBBcnJheS5mcm9tIChzLnJlcGxhY2UgKHplcm9XaWR0aENoYXJhY3RlcnNFeGNlcHROZXdsaW5lLCAnJykpIC8vIEFycmF5LmZyb20gc29sdmVzIHRoZSBlbW9qaSBwcm9ibGVtIGFzIGRlc2NyaWJlZCBoZXJlOiBodHRwOi8vYmxvZy5qb25uZXcuY29tL3Bvc3RzL3Bvby1kb3QtbGVuZ3RoLWVxdWFscy10d29cbiAgICAgICAgICAgICAgICAgICAgIC5tYXAgKHggPT4gKCh4ID09PSAnXFx0JykgfHwgKHggPT09ICdcXG4nKSkgPyB4IDogJyAnKVxuICAgICAgICAgICAgICAgICAgICAgLmpvaW4gKCcnKSxcblxuICAgIHBhcnRpdGlvbiAocykge1xuICAgICAgICBmb3IgKHZhciBtLCBzcGFucyA9IFtdOyAocGFydGl0aW9uLmxhc3RJbmRleCAhPT0gcy5sZW5ndGgpICYmIChtID0gcGFydGl0aW9uLmV4ZWMgKHMpKTspIHsgc3BhbnMucHVzaCAoW21bMV0gfHwgJycsIG1bMl1dKSB9XG4gICAgICAgIHBhcnRpdGlvbi5sYXN0SW5kZXggPSAwIC8vIHJlc2V0XG4gICAgICAgIHJldHVybiBzcGFuc1xuICAgIH0sXG5cbiAgICBmaXJzdCAocywgbikge1xuXG4gICAgICAgIGxldCByZXN1bHQgPSAnJywgbGVuZ3RoID0gMFxuXG4gICAgICAgIGZvciAoY29uc3QgW25vblByaW50YWJsZSwgcHJpbnRhYmxlXSBvZiBtb2R1bGUuZXhwb3J0cy5wYXJ0aXRpb24gKHMpKSB7XG4gICAgICAgICAgICBjb25zdCB0ZXh0ID0gQXJyYXkuZnJvbSAocHJpbnRhYmxlKS5zbGljZSAoMCwgbiAtIGxlbmd0aCkgLy8gQXJyYXkuZnJvbSBzb2x2ZXMgdGhlIGVtb2ppIHByb2JsZW0gYXMgZGVzY3JpYmVkIGhlcmU6IGh0dHA6Ly9ibG9nLmpvbm5ldy5jb20vcG9zdHMvcG9vLWRvdC1sZW5ndGgtZXF1YWxzLXR3b1xuICAgICAgICAgICAgcmVzdWx0ICs9IG5vblByaW50YWJsZSArIHRleHQuam9pbiAoJycpXG4gICAgICAgICAgICBsZW5ndGggKz0gdGV4dC5sZW5ndGhcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiByZXN1bHRcbiAgICB9XG59Il19
|