aboutsummaryrefslogtreecommitdiff
path: root/node_modules/boxen
diff options
context:
space:
mode:
authorMinteck <contact@minteck.org>2022-06-04 08:51:01 +0200
committerMinteck <contact@minteck.org>2022-06-04 08:51:01 +0200
commit383285ecd5292bf9a825e05904955b937de84cc9 (patch)
tree0a53b6f02c1604b078044567c03dc1b6c944c8c2 /node_modules/boxen
downloadequestriadb-383285ecd5292bf9a825e05904955b937de84cc9.tar.gz
equestriadb-383285ecd5292bf9a825e05904955b937de84cc9.tar.bz2
equestriadb-383285ecd5292bf9a825e05904955b937de84cc9.zip
Initial commit
Diffstat (limited to 'node_modules/boxen')
-rw-r--r--node_modules/boxen/index.d.ts200
-rw-r--r--node_modules/boxen/index.js279
-rw-r--r--node_modules/boxen/license9
-rw-r--r--node_modules/boxen/package.json51
-rw-r--r--node_modules/boxen/readme.md244
5 files changed, 783 insertions, 0 deletions
diff --git a/node_modules/boxen/index.d.ts b/node_modules/boxen/index.d.ts
new file mode 100644
index 0000000..69ebd42
--- /dev/null
+++ b/node_modules/boxen/index.d.ts
@@ -0,0 +1,200 @@
+import {LiteralUnion} from 'type-fest';
+import {BoxStyle, Boxes} from 'cli-boxes';
+
+declare namespace boxen {
+ /**
+ Characters used for custom border.
+
+ @example
+ ```
+ // affffb
+ // e e
+ // dffffc
+
+ const border: CustomBorderStyle = {
+ topLeft: 'a',
+ topRight: 'b',
+ bottomRight: 'c',
+ bottomLeft: 'd',
+ vertical: 'e',
+ horizontal: 'f'
+ };
+ ```
+ */
+ interface CustomBorderStyle extends BoxStyle {}
+
+ /**
+ Spacing used for `padding` and `margin`.
+ */
+ interface Spacing {
+ readonly top: number;
+ readonly right: number;
+ readonly bottom: number;
+ readonly left: number;
+ }
+
+ interface Options {
+ /**
+ Color of the box border.
+ */
+ readonly borderColor?: LiteralUnion<
+ | 'black'
+ | 'red'
+ | 'green'
+ | 'yellow'
+ | 'blue'
+ | 'magenta'
+ | 'cyan'
+ | 'white'
+ | 'gray'
+ | 'grey'
+ | 'blackBright'
+ | 'redBright'
+ | 'greenBright'
+ | 'yellowBright'
+ | 'blueBright'
+ | 'magentaBright'
+ | 'cyanBright'
+ | 'whiteBright',
+ string
+ >;
+
+ /**
+ Style of the box border.
+
+ @default 'single'
+ */
+ readonly borderStyle?: keyof Boxes | CustomBorderStyle;
+
+ /**
+ Reduce opacity of the border.
+
+ @default false
+ */
+ readonly dimBorder?: boolean;
+
+ /**
+ Space between the text and box border.
+
+ @default 0
+ */
+ readonly padding?: number | Spacing;
+
+ /**
+ Space around the box.
+
+ @default 0
+ */
+ readonly margin?: number | Spacing;
+
+ /**
+ Float the box on the available terminal screen space.
+
+ @default 'left'
+ */
+ readonly float?: 'left' | 'right' | 'center';
+
+ /**
+ Color of the background.
+ */
+ readonly backgroundColor?: LiteralUnion<
+ | 'black'
+ | 'red'
+ | 'green'
+ | 'yellow'
+ | 'blue'
+ | 'magenta'
+ | 'cyan'
+ | 'white'
+ | 'blackBright'
+ | 'redBright'
+ | 'greenBright'
+ | 'yellowBright'
+ | 'blueBright'
+ | 'magentaBright'
+ | 'cyanBright'
+ | 'whiteBright',
+ string
+ >;
+
+ /**
+ Align the text in the box based on the widest line.
+
+ @default 'left'
+ @deprecated Use `textAlignment` instead.
+ */
+ readonly align?: 'left' | 'right' | 'center';
+
+ /**
+ Align the text in the box based on the widest line.
+
+ @default 'left'
+ */
+ readonly textAlignment?: 'left' | 'right' | 'center';
+
+ /**
+ Display a title at the top of the box.
+ If needed, the box will horizontally expand to fit the title.
+
+ @example
+ ```
+ console.log(boxen('foo bar', {title: 'example'}));
+ // ┌ example ┐
+ // │foo bar │
+ // └─────────┘
+ ```
+ */
+ readonly title?: string;
+
+ /**
+ Align the title in the top bar.
+
+ @default 'left'
+
+ @example
+ ```
+ console.log(boxen('foo bar foo bar', {title: 'example', titleAlignment: 'center'}));
+ // ┌─── example ───┐
+ // │foo bar foo bar│
+ // └───────────────┘
+
+ console.log(boxen('foo bar foo bar', {title: 'example', titleAlignment: 'right'}));
+ // ┌────── example ┐
+ // │foo bar foo bar│
+ // └───────────────┘
+ ```
+ */
+ readonly titleAlignment?: 'left' | 'right' | 'center';
+ }
+}
+
+/**
+Creates a box in the terminal.
+
+@param text - The text inside the box.
+@returns The box.
+
+@example
+```
+import boxen = require('boxen');
+
+console.log(boxen('unicorn', {padding: 1}));
+// ┌─────────────┐
+// │ │
+// │ unicorn │
+// │ │
+// └─────────────┘
+
+console.log(boxen('unicorn', {padding: 1, margin: 1, borderStyle: 'double'}));
+//
+// ╔═════════════╗
+// ║ ║
+// ║ unicorn ║
+// ║ ║
+// ╚═════════════╝
+//
+```
+*/
+declare const boxen: (text: string, options?: boxen.Options) => string;
+
+export = boxen;
diff --git a/node_modules/boxen/index.js b/node_modules/boxen/index.js
new file mode 100644
index 0000000..d6bc693
--- /dev/null
+++ b/node_modules/boxen/index.js
@@ -0,0 +1,279 @@
+'use strict';
+const stringWidth = require('string-width');
+const chalk = require('chalk');
+const widestLine = require('widest-line');
+const cliBoxes = require('cli-boxes');
+const camelCase = require('camelcase');
+const ansiAlign = require('ansi-align');
+const wrapAnsi = require('wrap-ansi');
+
+const NL = '\n';
+const PAD = ' ';
+
+const terminalColumns = () => {
+ const {env, stdout, stderr} = process;
+
+ if (stdout && stdout.columns) {
+ return stdout.columns;
+ }
+
+ if (stderr && stderr.columns) {
+ return stderr.columns;
+ }
+
+ if (env.COLUMNS) {
+ return Number.parseInt(env.COLUMNS, 10);
+ }
+
+ return 80;
+};
+
+const getObject = detail => {
+ return typeof detail === 'number' ? {
+ top: detail,
+ right: detail * 3,
+ bottom: detail,
+ left: detail * 3
+ } : {
+ top: 0,
+ right: 0,
+ bottom: 0,
+ left: 0,
+ ...detail
+ };
+};
+
+const getBorderChars = borderStyle => {
+ const sides = [
+ 'topLeft',
+ 'topRight',
+ 'bottomRight',
+ 'bottomLeft',
+ 'vertical',
+ 'horizontal'
+ ];
+
+ let chararacters;
+
+ if (typeof borderStyle === 'string') {
+ chararacters = cliBoxes[borderStyle];
+
+ if (!chararacters) {
+ throw new TypeError(`Invalid border style: ${borderStyle}`);
+ }
+ } else {
+ for (const side of sides) {
+ if (!borderStyle[side] || typeof borderStyle[side] !== 'string') {
+ throw new TypeError(`Invalid border style: ${side}`);
+ }
+ }
+
+ chararacters = borderStyle;
+ }
+
+ return chararacters;
+};
+
+const makeTitle = (text, horizontal, alignement) => {
+ let title = '';
+
+ const textWidth = stringWidth(text);
+
+ switch (alignement) {
+ case 'left':
+ title = text + horizontal.slice(textWidth);
+ break;
+ case 'right':
+ title = horizontal.slice(textWidth) + text;
+ break;
+ default:
+ horizontal = horizontal.slice(textWidth);
+
+ if (horizontal.length % 2 === 1) { // This is needed in case the length is odd
+ horizontal = horizontal.slice(Math.floor(horizontal.length / 2));
+ title = horizontal.slice(1) + text + horizontal; // We reduce the left part of one character to avoid the bar to go beyond its limit
+ } else {
+ horizontal = horizontal.slice(horizontal.length / 2);
+ title = horizontal + text + horizontal;
+ }
+
+ break;
+ }
+
+ return title;
+};
+
+const makeContentText = (text, padding, columns, align) => {
+ text = ansiAlign(text, {align});
+ let lines = text.split(NL);
+ const textWidth = widestLine(text);
+
+ const max = columns - padding.left - padding.right;
+
+ if (textWidth > max) {
+ const newLines = [];
+ for (const line of lines) {
+ const createdLines = wrapAnsi(line, max, {hard: true});
+ const alignedLines = ansiAlign(createdLines, {align});
+ const alignedLinesArray = alignedLines.split('\n');
+ const longestLength = Math.max(...alignedLinesArray.map(s => stringWidth(s)));
+
+ for (const alignedLine of alignedLinesArray) {
+ let paddedLine;
+ switch (align) {
+ case 'center':
+ paddedLine = PAD.repeat((max - longestLength) / 2) + alignedLine;
+ break;
+ case 'right':
+ paddedLine = PAD.repeat(max - longestLength) + alignedLine;
+ break;
+ default:
+ paddedLine = alignedLine;
+ break;
+ }
+
+ newLines.push(paddedLine);
+ }
+ }
+
+ lines = newLines;
+ }
+
+ if (align === 'center' && textWidth < max) {
+ lines = lines.map(line => PAD.repeat((max - textWidth) / 2) + line);
+ } else if (align === 'right' && textWidth < max) {
+ lines = lines.map(line => PAD.repeat(max - textWidth) + line);
+ }
+
+ const paddingLeft = PAD.repeat(padding.left);
+ const paddingRight = PAD.repeat(padding.right);
+
+ lines = lines.map(line => paddingLeft + line + paddingRight);
+
+ lines = lines.map(line => {
+ if (columns - stringWidth(line) > 0) {
+ switch (align) {
+ case 'center':
+ return line + PAD.repeat(columns - stringWidth(line));
+ case 'right':
+ return line + PAD.repeat(columns - stringWidth(line));
+ default:
+ return line + PAD.repeat(columns - stringWidth(line));
+ }
+ }
+
+ return line;
+ });
+
+ if (padding.top > 0) {
+ lines = new Array(padding.top).fill(PAD.repeat(columns)).concat(lines);
+ }
+
+ if (padding.bottom > 0) {
+ lines = lines.concat(new Array(padding.bottom).fill(PAD.repeat(columns)));
+ }
+
+ return lines.join(NL);
+};
+
+const isHex = color => color.match(/^#(?:[0-f]{3}){1,2}$/i);
+const isColorValid = color => typeof color === 'string' && ((chalk[color]) || isHex(color));
+const getColorFn = color => isHex(color) ? chalk.hex(color) : chalk[color];
+const getBGColorFn = color => isHex(color) ? chalk.bgHex(color) : chalk[camelCase(['bg', color])];
+
+module.exports = (text, options) => {
+ options = {
+ padding: 0,
+ borderStyle: 'single',
+ dimBorder: false,
+ textAlignment: 'left',
+ float: 'left',
+ titleAlignment: 'left',
+ ...options
+ };
+
+ // This option is deprecated
+ if (options.align) {
+ options.textAlignment = options.align;
+ }
+
+ const BORDERS_WIDTH = 2;
+
+ if (options.borderColor && !isColorValid(options.borderColor)) {
+ throw new Error(`${options.borderColor} is not a valid borderColor`);
+ }
+
+ if (options.backgroundColor && !isColorValid(options.backgroundColor)) {
+ throw new Error(`${options.backgroundColor} is not a valid backgroundColor`);
+ }
+
+ const chars = getBorderChars(options.borderStyle);
+ const padding = getObject(options.padding);
+ const margin = getObject(options.margin);
+
+ const colorizeBorder = border => {
+ const newBorder = options.borderColor ? getColorFn(options.borderColor)(border) : border;
+ return options.dimBorder ? chalk.dim(newBorder) : newBorder;
+ };
+
+ const colorizeContent = content => options.backgroundColor ? getBGColorFn(options.backgroundColor)(content) : content;
+
+ const columns = terminalColumns();
+
+ let contentWidth = widestLine(wrapAnsi(text, columns - BORDERS_WIDTH, {hard: true, trim: false})) + padding.left + padding.right;
+
+ // This prevents the title bar to exceed the console's width
+ let title = options.title && options.title.slice(0, columns - 4 - margin.left - margin.right);
+
+ if (title) {
+ title = ` ${title} `;
+ // Make the box larger to fit a larger title
+ if (stringWidth(title) > contentWidth) {
+ contentWidth = stringWidth(title);
+ }
+ }
+
+ if ((margin.left && margin.right) && contentWidth + BORDERS_WIDTH + margin.left + margin.right > columns) {
+ // Let's assume we have margins: left = 3, right = 5, in total = 8
+ const spaceForMargins = columns - contentWidth - BORDERS_WIDTH;
+ // Let's assume we have space = 4
+ const multiplier = spaceForMargins / (margin.left + margin.right);
+ // Here: multiplier = 4/8 = 0.5
+ margin.left = Math.max(0, Math.floor(margin.left * multiplier));
+ margin.right = Math.max(0, Math.floor(margin.right * multiplier));
+ // Left: 3 * 0.5 = 1.5 -> 1
+ // Right: 6 * 0.5 = 3
+ }
+
+ // Prevent content from exceeding the console's width
+ contentWidth = Math.min(contentWidth, columns - BORDERS_WIDTH - margin.left - margin.right);
+
+ text = makeContentText(text, padding, contentWidth, options.textAlignment);
+
+ let marginLeft = PAD.repeat(margin.left);
+
+ if (options.float === 'center') {
+ const marginWidth = Math.max((columns - contentWidth - BORDERS_WIDTH) / 2, 0);
+ marginLeft = PAD.repeat(marginWidth);
+ } else if (options.float === 'right') {
+ const marginWidth = Math.max(columns - contentWidth - margin.right - BORDERS_WIDTH, 0);
+ marginLeft = PAD.repeat(marginWidth);
+ }
+
+ const horizontal = chars.horizontal.repeat(contentWidth);
+ const top = colorizeBorder(NL.repeat(margin.top) + marginLeft + chars.topLeft + (title ? makeTitle(title, horizontal, options.titleAlignment) : horizontal) + chars.topRight);
+ const bottom = colorizeBorder(marginLeft + chars.bottomLeft + horizontal + chars.bottomRight + NL.repeat(margin.bottom));
+ const side = colorizeBorder(chars.vertical);
+
+ const LINE_SEPARATOR = (contentWidth + BORDERS_WIDTH + margin.left >= columns) ? '' : NL;
+
+ const lines = text.split(NL);
+
+ const middle = lines.map(line => {
+ return marginLeft + side + colorizeContent(line) + side;
+ }).join(LINE_SEPARATOR);
+
+ return top + LINE_SEPARATOR + middle + LINE_SEPARATOR + bottom;
+};
+
+module.exports._borderStyles = cliBoxes;
diff --git a/node_modules/boxen/license b/node_modules/boxen/license
new file mode 100644
index 0000000..fa7ceba
--- /dev/null
+++ b/node_modules/boxen/license
@@ -0,0 +1,9 @@
+MIT License
+
+Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (https://sindresorhus.com)
+
+Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
+
+The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/node_modules/boxen/package.json b/node_modules/boxen/package.json
new file mode 100644
index 0000000..53a6e40
--- /dev/null
+++ b/node_modules/boxen/package.json
@@ -0,0 +1,51 @@
+{
+ "name": "boxen",
+ "version": "5.1.2",
+ "description": "Create boxes in the terminal",
+ "license": "MIT",
+ "repository": "sindresorhus/boxen",
+ "funding": "https://github.com/sponsors/sindresorhus",
+ "author": {
+ "name": "Sindre Sorhus",
+ "email": "sindresorhus@gmail.com",
+ "url": "https://sindresorhus.com"
+ },
+ "engines": {
+ "node": ">=10"
+ },
+ "scripts": {
+ "test": "xo && nyc ava && tsd"
+ },
+ "files": [
+ "index.js",
+ "index.d.ts"
+ ],
+ "keywords": [
+ "cli",
+ "box",
+ "boxes",
+ "terminal",
+ "term",
+ "console",
+ "ascii",
+ "unicode",
+ "border",
+ "text"
+ ],
+ "dependencies": {
+ "ansi-align": "^3.0.0",
+ "camelcase": "^6.2.0",
+ "chalk": "^4.1.0",
+ "cli-boxes": "^2.2.1",
+ "string-width": "^4.2.2",
+ "type-fest": "^0.20.2",
+ "widest-line": "^3.1.0",
+ "wrap-ansi": "^7.0.0"
+ },
+ "devDependencies": {
+ "ava": "^2.4.0",
+ "nyc": "^15.1.0",
+ "tsd": "^0.14.0",
+ "xo": "^0.36.1"
+ }
+}
diff --git a/node_modules/boxen/readme.md b/node_modules/boxen/readme.md
new file mode 100644
index 0000000..c7ed496
--- /dev/null
+++ b/node_modules/boxen/readme.md
@@ -0,0 +1,244 @@
+# boxen
+
+> Create boxes in the terminal
+
+![](screenshot.png)
+
+## Install
+
+```
+$ npm install boxen
+```
+
+## Usage
+
+```js
+const boxen = require('boxen');
+
+console.log(boxen('unicorn', {padding: 1}));
+/*
+┌─────────────┐
+│ │
+│ unicorn │
+│ │
+└─────────────┘
+*/
+
+console.log(boxen('unicorn', {padding: 1, margin: 1, borderStyle: 'double'}));
+/*
+
+ ╔═════════════╗
+ ║ ║
+ ║ unicorn ║
+ ║ ║
+ ╚═════════════╝
+
+*/
+
+console.log(boxen('unicorns love rainbows', {title: 'magical', titleAlignment: 'center'}));
+/*
+┌────── magical ───────┐
+│unicorns love rainbows│
+└──────────────────────┘
+*/
+```
+
+## API
+
+### boxen(text, options?)
+
+#### text
+
+Type: `string`
+
+Text inside the box.
+
+#### options
+
+Type: `object`
+
+##### borderColor
+
+Type: `string`\
+Values: `'black'` `'red'` `'green'` `'yellow'` `'blue'` `'magenta'` `'cyan'` `'white'` `'gray'` or a hex value like `'#ff0000'`
+
+Color of the box border.
+
+##### borderStyle
+
+Type: `string | object`\
+Default: `'single'`\
+Values:
+- `'single'`
+```
+┌───┐
+│foo│
+└───┘
+```
+- `'double'`
+```
+╔═══╗
+║foo║
+╚═══╝
+```
+- `'round'` (`'single'` sides with round corners)
+```
+╭───╮
+│foo│
+╰───╯
+```
+- `'bold'`
+```
+┏━━━┓
+┃foo┃
+┗━━━┛
+```
+- `'singleDouble'` (`'single'` on top and bottom, `'double'` on right and left)
+```
+╓───╖
+║foo║
+╙───╜
+```
+- `'doubleSingle'` (`'double'` on top and bottom, `'single'` on right and left)
+```
+╒═══╕
+│foo│
+╘═══╛
+```
+- `'classic'`
+```
++---+
+|foo|
++---+
+```
+
+Style of the box border.
+
+Can be any of the above predefined styles or an object with the following keys:
+
+```js
+{
+ topLeft: '+',
+ topRight: '+',
+ bottomLeft: '+',
+ bottomRight: '+',
+ horizontal: '-',
+ vertical: '|'
+}
+```
+
+##### dimBorder
+
+Type: `boolean`\
+Default: `false`
+
+Reduce opacity of the border.
+
+##### title
+
+Type: `string`
+
+Display a title at the top of the box.
+If needed, the box will horizontally expand to fit the title.
+
+Example:
+```js
+console.log(boxen('foo bar', {title: 'example'}));
+/*
+┌ example ┐
+│foo bar │
+└─────────┘
+*/
+```
+
+##### titleAlignment
+
+Type: `string`\
+Default: `'left'`
+
+Align the title in the top bar.
+
+Values:
+- `'left'`
+```js
+/*
+┌ example ──────┐
+│foo bar foo bar│
+└───────────────┘
+*/
+```
+- `'center'`
+```js
+/*
+┌─── example ───┐
+│foo bar foo bar│
+└───────────────┘
+*/
+```
+- `'right'`
+```js
+/*
+┌────── example ┐
+│foo bar foo bar│
+└───────────────┘
+*/
+```
+
+##### padding
+
+Type: `number | object`\
+Default: `0`
+
+Space between the text and box border.
+
+Accepts a number or an object with any of the `top`, `right`, `bottom`, `left` properties. When a number is specified, the left/right padding is 3 times the top/bottom to make it look nice.
+
+##### margin
+
+Type: `number | object`\
+Default: `0`
+
+Space around the box.
+
+Accepts a number or an object with any of the `top`, `right`, `bottom`, `left` properties. When a number is specified, the left/right margin is 3 times the top/bottom to make it look nice.
+
+##### float
+
+Type: `string`\
+Default: `'left'`\
+Values: `'right'` `'center'` `'left'`
+
+Float the box on the available terminal screen space.
+
+##### backgroundColor
+
+Type: `string`\
+Values: `'black'` `'red'` `'green'` `'yellow'` `'blue'` `'magenta'` `'cyan'` `'white'` `'gray'` or a hex value like `'#ff0000'`
+
+Color of the background.
+
+##### textAlignment
+
+Type: `string`\
+Default: `'left'`\
+Values: `'left'` `'center'` `'right'`
+
+Align the text in the box based on the widest line.
+
+## Related
+
+- [boxen-cli](https://github.com/sindresorhus/boxen-cli) - CLI for this module
+- [cli-boxes](https://github.com/sindresorhus/cli-boxes) - Boxes for use in the terminal
+- [ink-box](https://github.com/sindresorhus/ink-box) - Box component for Ink that uses this package
+
+---
+
+<div align="center">
+ <b>
+ <a href="https://tidelift.com/subscription/pkg/npm-boxen?utm_source=npm-boxen&utm_medium=referral&utm_campaign=readme">Get professional support for this package with a Tidelift subscription</a>
+ </b>
+ <br>
+ <sub>
+ Tidelift helps make open source sustainable for maintainers while giving companies<br>assurances about security, maintenance, and licensing for their dependencies.
+ </sub>
+</div>