massive update, probably broken
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / table / README.md
1 <a name="table"></a>
2 # Table
3
4 > Produces a string that represents array data in a text table.
5
6 [![Travis build status](http://img.shields.io/travis/gajus/table/master.svg?style=flat-square)](https://travis-ci.org/gajus/table)
7 [![Coveralls](https://img.shields.io/coveralls/gajus/table.svg?style=flat-square)](https://coveralls.io/github/gajus/table)
8 [![NPM version](http://img.shields.io/npm/v/table.svg?style=flat-square)](https://www.npmjs.org/package/table)
9 [![Canonical Code Style](https://img.shields.io/badge/code%20style-canonical-blue.svg?style=flat-square)](https://github.com/gajus/canonical)
10 [![Twitter Follow](https://img.shields.io/twitter/follow/kuizinas.svg?style=social&label=Follow)](https://twitter.com/kuizinas)
11
12 * [Table](#table)
13     * [Features](#table-features)
14     * [Install](#table-install)
15     * [Usage](#table-usage)
16     * [API](#table-api)
17         * [table](#table-api-table-1)
18         * [createStream](#table-api-createstream)
19         * [getBorderCharacters](#table-api-getbordercharacters)
20
21
22 ![Demo of table displaying a list of missions to the Moon.](./.README/demo.png)
23
24 <a name="table-features"></a>
25 ## Features
26
27 * Works with strings containing [fullwidth](https://en.wikipedia.org/wiki/Halfwidth_and_fullwidth_forms) characters.
28 * Works with strings containing [ANSI escape codes](https://en.wikipedia.org/wiki/ANSI_escape_code).
29 * Configurable border characters.
30 * Configurable content alignment per column.
31 * Configurable content padding per column.
32 * Configurable column width.
33 * Text wrapping.
34
35 <a name="table-install"></a>
36 ## Install
37
38 ```bash
39 npm install table
40 ```
41
42 [![Buy Me A Coffee](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://www.buymeacoffee.com/gajus)
43 [![Become a Patron](https://c5.patreon.com/external/logo/become_a_patron_button.png)](https://www.patreon.com/gajus)
44
45
46 <a name="table-usage"></a>
47 ## Usage
48
49 ```js
50 import { table } from 'table';
51
52 // Using commonjs?
53 // const { table } = require('table');
54
55 const data = [
56     ['0A', '0B', '0C'],
57     ['1A', '1B', '1C'],
58     ['2A', '2B', '2C']
59 ];
60
61 console.log(table(data));
62 ```
63
64 ```
65 ╔════╤════╤════╗
66 ║ 0A │ 0B │ 0C ║
67 ╟────┼────┼────╢
68 ║ 1A │ 1B │ 1C ║
69 ╟────┼────┼────╢
70 ║ 2A │ 2B │ 2C ║
71 ╚════╧════╧════╝
72
73 ```
74
75
76 <a name="table-api"></a>
77 ## API
78
79 <a name="table-api-table-1"></a>
80 ### table
81
82 Returns the string in the table format
83
84 **Parameters:**
85 - **_data_:** The data to display
86   - Type: `any[][]`
87   - Required: `true`
88
89 - **_config_:** Table configuration
90   - Type: `object`
91   - Required: `false`
92
93 <a name="table-api-table-1-config-border"></a>
94 ##### config.border
95
96 Type: `{ [type: string]: string }`\
97 Default: `honeywell` [template](#getbordercharacters)
98
99 Custom borders. The keys are any of:
100 - `topLeft`, `topRight`, `topBody`,`topJoin`
101 - `bottomLeft`, `bottomRight`, `bottomBody`, `bottomJoin`
102 - `joinLeft`, `joinRight`, `joinBody`, `joinJoin`
103 - `bodyLeft`, `bodyRight`, `bodyJoin`
104 - `headerJoin`
105
106 ```js
107 const data = [
108   ['0A', '0B', '0C'],
109   ['1A', '1B', '1C'],
110   ['2A', '2B', '2C']
111 ];
112
113 const config = {
114   border: {
115     topBody: `─`,
116     topJoin: `┬`,
117     topLeft: `┌`,
118     topRight: `┐`,
119
120     bottomBody: `─`,
121     bottomJoin: `┴`,
122     bottomLeft: `└`,
123     bottomRight: `┘`,
124
125     bodyLeft: `│`,
126     bodyRight: `│`,
127     bodyJoin: `│`,
128
129     joinBody: `─`,
130     joinLeft: `├`,
131     joinRight: `┤`,
132     joinJoin: `┼`
133   }
134 };
135
136 console.log(table(data, config));
137 ```
138
139 ```
140 ┌────┬────┬────┐
141 │ 0A │ 0B │ 0C │
142 ├────┼────┼────┤
143 │ 1A │ 1B │ 1C │
144 ├────┼────┼────┤
145 │ 2A │ 2B │ 2C │
146 └────┴────┴────┘
147 ```
148
149 <a name="table-api-table-1-config-drawverticalline"></a>
150 ##### config.drawVerticalLine
151
152 Type: `(lineIndex: number, columnCount: number) => boolean`\
153 Default: `() => true`
154
155 It is used to tell whether to draw a vertical line. This callback is called for each vertical border of the table.
156 If the table has `n` columns, then the `index` parameter is alternatively received all numbers in range `[0, n]` inclusively.
157
158 ```js
159 const data = [
160   ['0A', '0B', '0C'],
161   ['1A', '1B', '1C'],
162   ['2A', '2B', '2C'],
163   ['3A', '3B', '3C'],
164   ['4A', '4B', '4C']
165 ];
166
167 const config = {
168   drawVerticalLine: (lineIndex, columnCount) => {
169     return lineIndex === 0 || lineIndex === columnCount;
170   }
171 };
172
173 console.log(table(data, config));
174
175 ```
176
177 ```
178 ╔════════════╗
179 ║ 0A  0B  0C ║
180 ╟────────────╢
181 ║ 1A  1B  1C ║
182 ╟────────────╢
183 ║ 2A  2B  2C ║
184 ╟────────────╢
185 ║ 3A  3B  3C ║
186 ╟────────────╢
187 ║ 4A  4B  4C ║
188 ╚════════════╝
189
190 ```
191
192 <a name="table-api-table-1-config-drawhorizontalline"></a>
193 ##### config.drawHorizontalLine
194
195 Type: `(lineIndex: number, rowCount: number) => boolean`\
196 Default: `() => true`
197
198 It is used to tell whether to draw a horizontal line. This callback is called for each horizontal border of the table.
199 If the table has `n` rows, then the `index` parameter is alternatively received all numbers in range `[0, n]` inclusively.
200 If the table has `n` rows and contains the header, then the range will be `[0, n+1]` inclusively.
201
202 ```js
203 const data = [
204   ['0A', '0B', '0C'],
205   ['1A', '1B', '1C'],
206   ['2A', '2B', '2C'],
207   ['3A', '3B', '3C'],
208   ['4A', '4B', '4C']
209 ];
210
211 const config = {
212   drawHorizontalLine: (lineIndex, rowCount) => {
213     return lineIndex === 0 || lineIndex === 1 || lineIndex === rowCount - 1 || lineIndex === rowCount;
214   }
215 };
216
217 console.log(table(data, config));
218
219 ```
220
221 ```
222 ╔════╤════╤════╗
223 ║ 0A │ 0B │ 0C ║
224 ╟────┼────┼────╢
225 ║ 1A │ 1B │ 1C ║
226 ║ 2A │ 2B │ 2C ║
227 ║ 3A │ 3B │ 3C ║
228 ╟────┼────┼────╢
229 ║ 4A │ 4B │ 4C ║
230 ╚════╧════╧════╝
231
232 ```
233
234 <a name="table-api-table-1-config-singleline"></a>
235 ##### config.singleLine
236
237 Type: `boolean`\
238 Default: `false`
239
240 If `true`, horizontal lines inside the table are not drawn. This option also overrides the `config.drawHorizontalLine` if specified.
241
242 ```js
243 const data = [
244   ['-rw-r--r--', '1', 'pandorym', 'staff', '1529', 'May 23 11:25', 'LICENSE'],
245   ['-rw-r--r--', '1', 'pandorym', 'staff', '16327', 'May 23 11:58', 'README.md'],
246   ['drwxr-xr-x', '76', 'pandorym', 'staff', '2432', 'May 23 12:02', 'dist'],
247   ['drwxr-xr-x', '634', 'pandorym', 'staff', '20288', 'May 23 11:54', 'node_modules'],
248   ['-rw-r--r--', '1,', 'pandorym', 'staff', '525688', 'May 23 11:52', 'package-lock.json'],
249   ['-rw-r--r--@', '1', 'pandorym', 'staff', '2440', 'May 23 11:25', 'package.json'],
250   ['drwxr-xr-x', '27', 'pandorym', 'staff', '864', 'May 23 11:25', 'src'],
251   ['drwxr-xr-x', '20', 'pandorym', 'staff', '640', 'May 23 11:25', 'test'],
252 ];
253
254 const config = {
255   singleLine: true
256 };
257
258 console.log(table(data, config));
259 ```
260
261 ```
262 ╔═════════════╤═════╤══════════╤═══════╤════════╤══════════════╤═══════════════════╗
263 ║ -rw-r--r--  │ 1   │ pandorym │ staff │ 1529   │ May 23 11:25 │ LICENSE           ║
264 ║ -rw-r--r--  │ 1   │ pandorym │ staff │ 16327  │ May 23 11:58 │ README.md         ║
265 ║ drwxr-xr-x  │ 76  │ pandorym │ staff │ 2432   │ May 23 12:02 │ dist              ║
266 ║ drwxr-xr-x  │ 634 │ pandorym │ staff │ 20288  │ May 23 11:54 │ node_modules      ║
267 ║ -rw-r--r--  │ 1,  │ pandorym │ staff │ 525688 │ May 23 11:52 │ package-lock.json ║
268 ║ -rw-r--r--@ │ 1   │ pandorym │ staff │ 2440   │ May 23 11:25 │ package.json      ║
269 ║ drwxr-xr-x  │ 27  │ pandorym │ staff │ 864    │ May 23 11:25 │ src               ║
270 ║ drwxr-xr-x  │ 20  │ pandorym │ staff │ 640    │ May 23 11:25 │ test              ║
271 ╚═════════════╧═════╧══════════╧═══════╧════════╧══════════════╧═══════════════════╝
272 ```
273
274
275 <a name="table-api-table-1-config-columns"></a>
276 ##### config.columns
277
278 Type: `Column[] | { [columnIndex: number]: Column }`
279
280 Column specific configurations.
281
282 <a name="table-api-table-1-config-columns-config-columns-width"></a>
283 ###### config.columns[*].width
284
285 Type: `number`\
286 Default: the maximum cell widths of the column
287
288 Column width (excluding the paddings).
289
290 ```js
291
292 const data = [
293   ['0A', '0B', '0C'],
294   ['1A', '1B', '1C'],
295   ['2A', '2B', '2C']
296 ];
297
298 const config = {
299   columns: {
300     1: { width: 10 }
301   }
302 };
303
304 console.log(table(data, config));
305 ```
306
307 ```
308 ╔════╤════════════╤════╗
309 ║ 0A │ 0B         │ 0C ║
310 ╟────┼────────────┼────╢
311 ║ 1A │ 1B         │ 1C ║
312 ╟────┼────────────┼────╢
313 ║ 2A │ 2B         │ 2C ║
314 ╚════╧════════════╧════╝
315 ```
316
317 <a name="table-api-table-1-config-columns-config-columns-alignment"></a>
318 ###### config.columns[*].alignment
319
320 Type: `'center' | 'justify' | 'left' | 'right'`\
321 Default: `'left'`
322
323 Cell content horizontal alignment
324
325 ```js
326 const data = [
327   ['0A', '0B', '0C', '0D 0E 0F'],
328   ['1A', '1B', '1C', '1D 1E 1F'],
329   ['2A', '2B', '2C', '2D 2E 2F'],
330 ];
331
332 const config = {
333   columnDefault: {
334     width: 10,
335   },
336   columns: [
337     { alignment: 'left' },
338     { alignment: 'center' },
339     { alignment: 'right' },
340     { alignment: 'justify' }
341   ],
342 };
343
344 console.log(table(data, config));
345 ```
346
347 ```
348 ╔════════════╤════════════╤════════════╤════════════╗
349 ║ 0A         │     0B     │         0C │ 0D  0E  0F ║
350 ╟────────────┼────────────┼────────────┼────────────╢
351 ║ 1A         │     1B     │         1C │ 1D  1E  1F ║
352 ╟────────────┼────────────┼────────────┼────────────╢
353 ║ 2A         │     2B     │         2C │ 2D  2E  2F ║
354 ╚════════════╧════════════╧════════════╧════════════╝
355 ```
356
357 <a name="table-api-table-1-config-columns-config-columns-verticalalignment"></a>
358 ###### config.columns[*].verticalAlignment
359
360 Type: `'top' | 'middle' | 'bottom'`\
361 Default: `'top'`
362
363 Cell content vertical alignment
364
365 ```js
366 const data = [
367   ['A', 'B', 'C', 'DEF'],
368 ];
369
370 const config = {
371   columnDefault: {
372     width: 1,
373   },
374   columns: [
375     { verticalAlignment: 'top' },
376     { verticalAlignment: 'middle' },
377     { verticalAlignment: 'bottom' },
378   ],
379 };
380
381 console.log(table(data, config));
382 ```
383
384 ```
385 ╔═══╤═══╤═══╤═══╗
386 ║ A │   │   │ D ║
387 ║   │ B │   │ E ║
388 ║   │   │ C │ F ║
389 ╚═══╧═══╧═══╧═══╝
390 ```
391
392 <a name="table-api-table-1-config-columns-config-columns-paddingleft"></a>
393 ###### config.columns[*].paddingLeft
394
395 Type: `number`\
396 Default: `1`
397
398 The number of whitespaces used to pad the content on the left.
399
400 <a name="table-api-table-1-config-columns-config-columns-paddingright"></a>
401 ###### config.columns[*].paddingRight
402
403 Type: `number`\
404 Default: `1`
405
406 The number of whitespaces used to pad the content on the right.
407
408 The `paddingLeft` and `paddingRight` options do not count on the column width. So the column has `width = 5`, `paddingLeft = 2` and `paddingRight = 2` will have the total width is `9`.
409
410
411 ```js
412 const data = [
413   ['0A', 'AABBCC', '0C'],
414   ['1A', '1B', '1C'],
415   ['2A', '2B', '2C']
416 ];
417
418 const config = {
419   columns: [
420     {
421       paddingLeft: 3
422     },
423     {
424       width: 2,
425       paddingRight: 3
426     }
427   ]
428 };
429
430 console.log(table(data, config));
431 ```
432
433 ```
434 ╔══════╤══════╤════╗
435 ║   0A │ AA   │ 0C ║
436 ║      │ BB   │    ║
437 ║      │ CC   │    ║
438 ╟──────┼──────┼────╢
439 ║   1A │ 1B   │ 1C ║
440 ╟──────┼──────┼────╢
441 ║   2A │ 2B   │ 2C ║
442 ╚══════╧══════╧════╝
443 ```
444
445 <a name="table-api-table-1-config-columns-config-columns-truncate"></a>
446 ###### config.columns[*].truncate
447
448 Type: `number`\
449 Default: `Infinity`
450
451 The number of characters is which the content will be truncated.
452 To handle a content that overflows the container width, `table` package implements [text wrapping](#config.columns[*].wrapWord). However, sometimes you may want to truncate content that is too long to be displayed in the table.
453
454 ```js
455 const data = [
456   ['Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus pulvinar nibh sed mauris convallis dapibus. Nunc venenatis tempus nulla sit amet viverra.']
457 ];
458
459 const config = {
460   columns: [
461     {
462       width: 20,
463       truncate: 100
464     }
465   ]
466 };
467
468 console.log(table(data, config));
469 ```
470
471 ```
472 ╔══════════════════════╗
473 ║ Lorem ipsum dolor si ║
474 ║ t amet, consectetur  ║
475 ║ adipiscing elit. Pha ║
476 ║ sellus pulvinar nibh ║
477 ║ sed mauris convall…  ║
478 ╚══════════════════════╝
479 ```
480
481 <a name="table-api-table-1-config-columns-config-columns-wrapword"></a>
482 ###### config.columns[*].wrapWord
483
484 Type: `boolean`\
485 Default: `false`
486
487 The `table` package implements auto text wrapping, i.e., text that has the width greater than the container width will be separated into multiple lines at the nearest space or one of the special characters: `\|/_.,;-`.
488
489 When `wrapWord` is `false`:
490
491 ```js
492 const data = [
493     ['Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus pulvinar nibh sed mauris convallis dapibus. Nunc venenatis tempus nulla sit amet viverra.']
494 ];
495
496 const config = {
497   columns: [ { width: 20 } ]
498 };
499
500 console.log(table(data, config));
501 ```
502
503 ```
504 ╔══════════════════════╗
505 ║ Lorem ipsum dolor si ║
506 ║ t amet, consectetur  ║
507 ║ adipiscing elit. Pha ║
508 ║ sellus pulvinar nibh ║
509 ║ sed mauris convallis ║
510 ║ dapibus. Nunc venena ║
511 ║ tis tempus nulla sit ║
512 ║ amet viverra.        ║
513 ╚══════════════════════╝
514 ```
515
516 When `wrapWord` is `true`:
517
518 ```
519 ╔══════════════════════╗
520 ║ Lorem ipsum dolor    ║
521 ║ sit amet,            ║
522 ║ consectetur          ║
523 ║ adipiscing elit.     ║
524 ║ Phasellus pulvinar   ║
525 ║ nibh sed mauris      ║
526 ║ convallis dapibus.   ║
527 ║ Nunc venenatis       ║
528 ║ tempus nulla sit     ║
529 ║ amet viverra.        ║
530 ╚══════════════════════╝
531
532 ```
533
534
535 <a name="table-api-table-1-config-columndefault"></a>
536 ##### config.columnDefault
537
538 Type: `Column`\
539 Default: `{}`
540
541 The default configuration for all columns. Column-specific settings will overwrite the default values.
542
543
544 <a name="table-api-table-1-config-header"></a>
545 ##### config.header
546
547 Type: `object`
548
549 Header configuration.
550
551 The header configuration inherits the most of the column's, except:
552 - `content` **{string}**: the header content.
553 - `width:` calculate based on the content width automatically.
554 - `alignment:` `center` be default.
555 - `verticalAlignment:` is not supported.
556 - `config.border.topJoin` will be `config.border.topBody` for prettier.
557
558 ```js
559 const data = [
560       ['0A', '0B', '0C'],
561       ['1A', '1B', '1C'],
562       ['2A', '2B', '2C'],
563     ];
564
565 const config = {
566   columnDefault: {
567     width: 10,
568   },
569   header: {
570     alignment: 'center',
571     content: 'THE HEADER\nThis is the table about something',
572   },
573 }
574
575 console.log(table(data, config));
576 ```
577
578 ```
579 ╔══════════════════════════════════════╗
580 ║              THE HEADER              ║
581 ║  This is the table about something   ║
582 ╟────────────┬────────────┬────────────╢
583 ║ 0A         │ 0B         │ 0C         ║
584 ╟────────────┼────────────┼────────────╢
585 ║ 1A         │ 1B         │ 1C         ║
586 ╟────────────┼────────────┼────────────╢
587 ║ 2A         │ 2B         │ 2C         ║
588 ╚════════════╧════════════╧════════════╝
589 ```
590
591
592 <a name="table-api-createstream"></a>
593 ### createStream
594
595 `table` package exports `createStream` function used to draw a table and append rows.
596
597 **Parameter:**
598  - _**config:**_ the same as `table`'s, except `config.columnDefault.width` and `config.columnCount` must be provided.
599
600
601 ```js
602 import { createStream } from 'table';
603
604 const config = {
605   columnDefault: {
606     width: 50
607   },
608   columnCount: 1
609 };
610
611 const stream = createStream(config);
612
613 setInterval(() => {
614   stream.write([new Date()]);
615 }, 500);
616 ```
617
618 ![Streaming current date.](./.README/api/stream/streaming.gif)
619
620 `table` package uses ANSI escape codes to overwrite the output of the last line when a new row is printed.
621
622 The underlying implementation is explained in this [Stack Overflow answer](http://stackoverflow.com/a/32938658/368691).
623
624 Streaming supports all of the configuration properties and functionality of a static table (such as auto text wrapping, alignment and padding), e.g.
625
626 ```js
627 import { createStream } from 'table';
628
629 import _ from 'lodash';
630
631 const config = {
632   columnDefault: {
633     width: 50
634   },
635   columnCount: 3,
636   columns: [
637     {
638       width: 10,
639       alignment: 'right'
640     },
641     { alignment: 'center' },
642     { width: 10 }
643
644   ]
645 };
646
647 const stream = createStream(config);
648
649 let i = 0;
650
651 setInterval(() => {
652   let random;
653
654   random = _.sample('abcdefghijklmnopqrstuvwxyz', _.random(1, 30)).join('');
655
656   stream.write([i++, new Date(), random]);
657 }, 500);
658 ```
659
660 ![Streaming random data.](./.README/api/stream/streaming-random.gif)
661
662
663 <a name="table-api-getbordercharacters"></a>
664 ### getBorderCharacters
665
666 **Parameter:**
667  - **_template_**
668    - Type: `'honeywell' | 'norc' | 'ramac' | 'void'`
669    - Required: `true`
670
671 You can load one of the predefined border templates using `getBorderCharacters` function.
672
673 ```js
674 import { table, getBorderCharacters } from 'table';
675
676 const data = [
677   ['0A', '0B', '0C'],
678   ['1A', '1B', '1C'],
679   ['2A', '2B', '2C']
680 ];
681
682 const config = {
683   border: getBorderCharacters(`name of the template`)
684 };
685
686 console.log(table(data, config));
687 ```
688
689 ```
690 # honeywell
691
692 ╔════╤════╤════╗
693 ║ 0A │ 0B │ 0C ║
694 ╟────┼────┼────╢
695 ║ 1A │ 1B │ 1C ║
696 ╟────┼────┼────╢
697 ║ 2A │ 2B │ 2C ║
698 ╚════╧════╧════╝
699
700 # norc
701
702 ┌────┬────┬────┐
703 │ 0A │ 0B │ 0C │
704 ├────┼────┼────┤
705 │ 1A │ 1B │ 1C │
706 ├────┼────┼────┤
707 │ 2A │ 2B │ 2C │
708 └────┴────┴────┘
709
710 # ramac (ASCII; for use in terminals that do not support Unicode characters)
711
712 +----+----+----+
713 | 0A | 0B | 0C |
714 |----|----|----|
715 | 1A | 1B | 1C |
716 |----|----|----|
717 | 2A | 2B | 2C |
718 +----+----+----+
719
720 # void (no borders; see "borderless table" section of the documentation)
721
722  0A  0B  0C
723
724  1A  1B  1C
725
726  2A  2B  2C
727
728 ```
729
730 Raise [an issue](https://github.com/gajus/table/issues) if you'd like to contribute a new border template.
731
732 <a name="table-api-getbordercharacters-borderless-table"></a>
733 #### Borderless Table
734
735 Simply using `void` border character template creates a table with a lot of unnecessary spacing.
736
737 To create a more pleasant to the eye table, reset the padding and remove the joining rows, e.g.
738
739 ```js
740
741 const output = table(data, {
742     border: getBorderCharacters('void'),
743     columnDefault: {
744         paddingLeft: 0,
745         paddingRight: 1
746     },
747     drawHorizontalLine: () => false
748     }
749 );
750
751 console.log(output);
752 ```
753
754 ```
755 0A 0B 0C
756 1A 1B 1C
757 2A 2B 2C
758 ```
759