table 5.2.3 → 5.3.0

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/README.md CHANGED
@@ -9,6 +9,7 @@
9
9
 
10
10
  * [Table](#table)
11
11
  * [Features](#table-features)
12
+ * [Install](#table-install)
12
13
  * [Usage](#table-usage)
13
14
  * [Cell Content Alignment](#table-usage-cell-content-alignment)
14
15
  * [Column Width](#table-usage-column-width)
@@ -36,6 +37,17 @@ Produces a string that represents array data in a text table.
36
37
  * Configurable column width.
37
38
  * Text wrapping.
38
39
 
40
+ <a name="table-install"></a>
41
+ ## Install
42
+
43
+ ```bash
44
+ npm install table
45
+
46
+ ```
47
+
48
+ [![Buy Me A Coffee](https://www.buymeacoffee.com/assets/img/custom_images/orange_img.png)](https://www.buymeacoffee.com/gajus)
49
+ [![Become a Patron](https://c5.patreon.com/external/logo/become_a_patron_button.png)](https://www.patreon.com/gajus)
50
+
39
51
  <a name="table-usage"></a>
40
52
  ## Usage
41
53
 
@@ -132,6 +144,7 @@ console.log(output);
132
144
  ╟────┼────┼────╢
133
145
  ║ 2A │ 2B │ 2C ║
134
146
  ╚════╧════╧════╝
147
+
135
148
  ```
136
149
 
137
150
 
@@ -144,30 +157,30 @@ Valid values are: "left", "right" and "center".
144
157
 
145
158
  ```js
146
159
  let config,
147
- data,
148
- output;
160
+ data,
161
+ output;
149
162
 
150
163
  data = [
151
- ['0A', '0B', '0C'],
152
- ['1A', '1B', '1C'],
153
- ['2A', '2B', '2C']
164
+ ['0A', '0B', '0C'],
165
+ ['1A', '1B', '1C'],
166
+ ['2A', '2B', '2C']
154
167
  ];
155
168
 
156
169
  config = {
157
- columns: {
158
- 0: {
159
- alignment: 'left',
160
- minWidth: 10
161
- },
162
- 1: {
163
- alignment: 'center',
164
- minWidth: 10
165
- },
166
- 2: {
167
- alignment: 'right',
168
- minWidth: 10
169
- }
170
+ columns: {
171
+ 0: {
172
+ alignment: 'left',
173
+ minWidth: 10
174
+ },
175
+ 1: {
176
+ alignment: 'center',
177
+ minWidth: 10
178
+ },
179
+ 2: {
180
+ alignment: 'right',
181
+ minWidth: 10
170
182
  }
183
+ }
171
184
  };
172
185
 
173
186
  output = table(data, config);
@@ -192,21 +205,21 @@ console.log(output);
192
205
 
193
206
  ```js
194
207
  let data,
195
- output,
196
- options;
208
+ output,
209
+ options;
197
210
 
198
211
  data = [
199
- ['0A', '0B', '0C'],
200
- ['1A', '1B', '1C'],
201
- ['2A', '2B', '2C']
212
+ ['0A', '0B', '0C'],
213
+ ['1A', '1B', '1C'],
214
+ ['2A', '2B', '2C']
202
215
  ];
203
216
 
204
217
  options = {
205
- columns: {
206
- 1: {
207
- width: 10
208
- }
218
+ columns: {
219
+ 1: {
220
+ width: 10
209
221
  }
222
+ }
210
223
  };
211
224
 
212
225
  output = table(data, options);
@@ -231,36 +244,36 @@ console.log(output);
231
244
 
232
245
  ```js
233
246
  let config,
234
- data,
235
- output;
247
+ data,
248
+ output;
236
249
 
237
250
  data = [
238
- ['0A', '0B', '0C'],
239
- ['1A', '1B', '1C'],
240
- ['2A', '2B', '2C']
251
+ ['0A', '0B', '0C'],
252
+ ['1A', '1B', '1C'],
253
+ ['2A', '2B', '2C']
241
254
  ];
242
255
 
243
256
  config = {
244
- border: {
245
- topBody: `─`,
246
- topJoin: `┬`,
247
- topLeft: `┌`,
248
- topRight: `┐`,
249
-
250
- bottomBody: `─`,
251
- bottomJoin: `┴`,
252
- bottomLeft: `└`,
253
- bottomRight: `┘`,
254
-
255
- bodyLeft: `│`,
256
- bodyRight: `│`,
257
- bodyJoin: `│`,
258
-
259
- joinBody: `─`,
260
- joinLeft: `├`,
261
- joinRight: `┤`,
262
- joinJoin: `┼`
263
- }
257
+ border: {
258
+ topBody: `─`,
259
+ topJoin: `┬`,
260
+ topLeft: `┌`,
261
+ topRight: `┐`,
262
+
263
+ bottomBody: `─`,
264
+ bottomJoin: `┴`,
265
+ bottomLeft: `└`,
266
+ bottomRight: `┘`,
267
+
268
+ bodyLeft: `│`,
269
+ bodyRight: `│`,
270
+ bodyJoin: `│`,
271
+
272
+ joinBody: `─`,
273
+ joinLeft: `├`,
274
+ joinRight: `┤`,
275
+ joinJoin: `┼`
276
+ }
264
277
  };
265
278
 
266
279
  output = table(data, config);
@@ -285,27 +298,27 @@ console.log(output);
285
298
 
286
299
  ```js
287
300
  let data,
288
- output,
289
- options;
301
+ output,
302
+ options;
290
303
 
291
304
  data = [
292
- ['0A', '0B', '0C'],
293
- ['1A', '1B', '1C'],
294
- ['2A', '2B', '2C'],
295
- ['3A', '3B', '3C'],
296
- ['4A', '4B', '4C']
305
+ ['0A', '0B', '0C'],
306
+ ['1A', '1B', '1C'],
307
+ ['2A', '2B', '2C'],
308
+ ['3A', '3B', '3C'],
309
+ ['4A', '4B', '4C']
297
310
  ];
298
311
 
299
312
  options = {
300
- /**
301
- * @typedef {function} drawHorizontalLine
302
- * @param {number} index
303
- * @param {number} size
304
- * @return {boolean}
305
- */
306
- drawHorizontalLine: (index, size) => {
307
- return index === 0 || index === 1 || index === size - 1 || index === size;
308
- }
313
+ /**
314
+ * @typedef {function} drawHorizontalLine
315
+ * @param {number} index
316
+ * @param {number} size
317
+ * @return {boolean}
318
+ */
319
+ drawHorizontalLine: (index, size) => {
320
+ return index === 0 || index === 1 || index === size - 1 || index === size;
321
+ }
309
322
  };
310
323
 
311
324
  output = table(data, options);
@@ -334,25 +347,25 @@ console.log(output);
334
347
 
335
348
  ```js
336
349
  let config,
337
- data,
338
- output;
350
+ data,
351
+ output;
339
352
 
340
353
  data = [
341
- ['0A', 'AABBCC', '0C'],
342
- ['1A', '1B', '1C'],
343
- ['2A', '2B', '2C']
354
+ ['0A', 'AABBCC', '0C'],
355
+ ['1A', '1B', '1C'],
356
+ ['2A', '2B', '2C']
344
357
  ];
345
358
 
346
359
  config = {
347
- columns: {
348
- 0: {
349
- paddingLeft: 3
350
- },
351
- 1: {
352
- width: 2,
353
- paddingRight: 3
354
- }
360
+ columns: {
361
+ 0: {
362
+ paddingLeft: 3
363
+ },
364
+ 1: {
365
+ width: 2,
366
+ paddingRight: 3
355
367
  }
368
+ }
356
369
  };
357
370
 
358
371
  output = table(data, config);
@@ -379,21 +392,21 @@ You can load one of the predefined border templates using `getBorderCharacters`
379
392
 
380
393
  ```js
381
394
  import {
382
- table,
383
- getBorderCharacters
395
+ table,
396
+ getBorderCharacters
384
397
  } from 'table';
385
398
 
386
399
  let config,
387
- data;
400
+ data;
388
401
 
389
402
  data = [
390
- ['0A', '0B', '0C'],
391
- ['1A', '1B', '1C'],
392
- ['2A', '2B', '2C']
403
+ ['0A', '0B', '0C'],
404
+ ['1A', '1B', '1C'],
405
+ ['2A', '2B', '2C']
393
406
  ];
394
407
 
395
408
  config = {
396
- border: getBorderCharacters(`name of the template`)
409
+ border: getBorderCharacters(`name of the template`)
397
410
  };
398
411
 
399
412
  table(data, config);
@@ -481,23 +494,23 @@ console.log(output);
481
494
 
482
495
  ```js
483
496
  import {
484
- createStream
497
+ createStream
485
498
  } from 'table';
486
499
 
487
500
  let config,
488
- stream;
501
+ stream;
489
502
 
490
503
  config = {
491
- columnDefault: {
492
- width: 50
493
- },
494
- columnCount: 1
504
+ columnDefault: {
505
+ width: 50
506
+ },
507
+ columnCount: 1
495
508
  };
496
509
 
497
510
  stream = createStream(config);
498
511
 
499
512
  setInterval(() => {
500
- stream.write([new Date()]);
513
+ stream.write([new Date()]);
501
514
  }, 500);
502
515
  ```
503
516
 
@@ -505,38 +518,38 @@ setInterval(() => {
505
518
 
506
519
  `table` package uses ANSI escape codes to overwrite the output of the last line when a new row is printed.
507
520
 
508
- The underlying implementation is explained in this [Stack Overflow answer](http://stackoverflow.com/a/32938658/368691).
521
+ The underlying implementation is explained in this [Stack Overflow answer](http://stackoverflow.com/a/32938658/368691).
509
522
 
510
523
  Streaming supports all of the configuration properties and functionality of a static table (such as auto text wrapping, alignment and padding), e.g.
511
524
 
512
525
  ```js
513
526
  import {
514
- createStream
527
+ createStream
515
528
  } from 'table';
516
529
 
517
530
  import _ from 'lodash';
518
531
 
519
532
  let config,
520
- stream,
521
- i;
533
+ stream,
534
+ i;
522
535
 
523
536
  config = {
524
- columnDefault: {
525
- width: 50
537
+ columnDefault: {
538
+ width: 50
539
+ },
540
+ columnCount: 3,
541
+ columns: {
542
+ 0: {
543
+ width: 10,
544
+ alignment: 'right'
545
+ },
546
+ 1: {
547
+ alignment: 'center',
526
548
  },
527
- columnCount: 3,
528
- columns: {
529
- 0: {
530
- width: 10,
531
- alignment: 'right'
532
- },
533
- 1: {
534
- alignment: 'center',
535
- },
536
- 2: {
537
- width: 10
538
- }
549
+ 2: {
550
+ width: 10
539
551
  }
552
+ }
540
553
  };
541
554
 
542
555
  stream = createStream(config);
@@ -544,15 +557,16 @@ stream = createStream(config);
544
557
  i = 0;
545
558
 
546
559
  setInterval(() => {
547
- let random;
560
+ let random;
548
561
 
549
- random = _.sample('abcdefghijklmnopqrstuvwxyz', _.random(1, 30)).join('');
562
+ random = _.sample('abcdefghijklmnopqrstuvwxyz', _.random(1, 30)).join('');
550
563
 
551
- stream.write([i++, new Date(), random]);
564
+ stream.write([i++, new Date(), random]);
552
565
  }, 500);
553
566
  ```
554
567
 
555
568
  ![Streaming random data.](./.README/streaming-random.gif)
569
+
556
570
  <a name="table-usage-text-truncation"></a>
557
571
  ### Text Truncation
558
572
 
@@ -562,20 +576,20 @@ To handle a content that overflows the container width, `table` package implemen
562
576
 
563
577
  ```js
564
578
  let config,
565
- data,
566
- output;
579
+ data,
580
+ output;
567
581
 
568
582
  data = [
569
- ['Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus pulvinar nibh sed mauris convallis dapibus. Nunc venenatis tempus nulla sit amet viverra.']
583
+ ['Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus pulvinar nibh sed mauris convallis dapibus. Nunc venenatis tempus nulla sit amet viverra.']
570
584
  ];
571
585
 
572
586
  config = {
573
- columns: {
574
- 0: {
575
- width: 20,
576
- truncate: 100
577
- }
587
+ columns: {
588
+ 0: {
589
+ width: 20,
590
+ truncate: 100
578
591
  }
592
+ }
579
593
  };
580
594
 
581
595
  output = table(data, config);
@@ -600,19 +614,19 @@ console.log(output);
600
614
 
601
615
  ```js
602
616
  let config,
603
- data,
604
- output;
617
+ data,
618
+ output;
605
619
 
606
620
  data = [
607
621
  ['Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus pulvinar nibh sed mauris convallis dapibus. Nunc venenatis tempus nulla sit amet viverra.']
608
622
  ];
609
623
 
610
624
  config = {
611
- columns: {
612
- 0: {
613
- width: 20
614
- }
625
+ columns: {
626
+ 0: {
627
+ width: 20
615
628
  }
629
+ }
616
630
  };
617
631
 
618
632
  output = table(data, config);
@@ -637,20 +651,20 @@ When `wrapWord` is `true` the text is broken at the nearest space or one of the
637
651
 
638
652
  ```js
639
653
  let config,
640
- data,
641
- output;
654
+ data,
655
+ output;
642
656
 
643
657
  data = [
644
- ['Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus pulvinar nibh sed mauris convallis dapibus. Nunc venenatis tempus nulla sit amet viverra.']
658
+ ['Lorem ipsum dolor sit amet, consectetur adipiscing elit. Phasellus pulvinar nibh sed mauris convallis dapibus. Nunc venenatis tempus nulla sit amet viverra.']
645
659
  ];
646
660
 
647
661
  config = {
648
- columns: {
649
- 0: {
650
- width: 20,
651
- wrapWord: true
652
- }
662
+ columns: {
663
+ 0: {
664
+ width: 20,
665
+ wrapWord: true
653
666
  }
667
+ }
654
668
  };
655
669
 
656
670
  output = table(data, config);
@@ -671,5 +685,6 @@ console.log(output);
671
685
  ║ tempus nulla sit ║
672
686
  ║ amet viverra. ║
673
687
  ╚══════════════════════╝
688
+
674
689
  ```
675
690
 
@@ -56,7 +56,7 @@ const validateTableData = rows => {
56
56
  const cell = _step2.value;
57
57
 
58
58
  // eslint-disable-next-line no-control-regex
59
- if (/[\u0001-\u0009\u000B-\u001A]/.test(cell)) {
59
+ if (/[\u0001-\u0006\u0008-\u0009\u000B-\u001A]/.test(cell)) {
60
60
  throw new Error('Table data must not contain control characters.');
61
61
  }
62
62
  }
@@ -36,7 +36,7 @@ export default (rows) => {
36
36
 
37
37
  for (const cell of cells) {
38
38
  // eslint-disable-next-line no-control-regex
39
- if (/[\u0001-\u0009\u000B-\u001A]/.test(cell)) {
39
+ if (/[\u0001-\u0006\u0008-\u0009\u000B-\u001A]/.test(cell)) {
40
40
  throw new Error('Table data must not contain control characters.');
41
41
  }
42
42
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/validateTableData.js"],"names":["rows","Array","isArray","TypeError","length","Error","columnNumber","cells","cell","test"],"mappings":";;;;;;;AAAA;;;;AAIA;;;;AAIA;;;;0BAIgBA,I,IAAS;AACvB,MAAI,CAACC,KAAK,CAACC,OAAN,CAAcF,IAAd,CAAL,EAA0B;AACxB,UAAM,IAAIG,SAAJ,CAAc,8BAAd,CAAN;AACD;;AAED,MAAIH,IAAI,CAACI,MAAL,KAAgB,CAApB,EAAuB;AACrB,UAAM,IAAIC,KAAJ,CAAU,qCAAV,CAAN;AACD;;AAED,MAAIL,IAAI,CAAC,CAAD,CAAJ,CAAQI,MAAR,KAAmB,CAAvB,EAA0B;AACxB,UAAM,IAAIC,KAAJ,CAAU,wCAAV,CAAN;AACD;;AAED,QAAMC,YAAY,GAAGN,IAAI,CAAC,CAAD,CAAJ,CAAQI,MAA7B;AAbuB;AAAA;AAAA;;AAAA;AAevB,yBAAoBJ,IAApB,8HAA0B;AAAA,YAAfO,KAAe;;AACxB,UAAI,CAACN,KAAK,CAACC,OAAN,CAAcK,KAAd,CAAL,EAA2B;AACzB,cAAM,IAAIJ,SAAJ,CAAc,kCAAd,CAAN;AACD;;AAED,UAAII,KAAK,CAACH,MAAN,KAAiBE,YAArB,EAAmC;AACjC,cAAM,IAAID,KAAJ,CAAU,+CAAV,CAAN;AACD;;AAPuB;AAAA;AAAA;;AAAA;AASxB,8BAAmBE,KAAnB,mIAA0B;AAAA,gBAAfC,IAAe;;AACxB;AACA,cAAI,+BAA+BC,IAA/B,CAAoCD,IAApC,CAAJ,EAA+C;AAC7C,kBAAM,IAAIH,KAAJ,CAAU,iDAAV,CAAN;AACD;AACF;AAduB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAezB;AA9BsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+BxB,C","sourcesContent":["/**\n * @typedef {string} cell\n */\n\n/**\n * @typedef {cell[]} validateData~column\n */\n\n/**\n * @param {column[]} rows\n * @returns {undefined}\n */\nexport default (rows) => {\n if (!Array.isArray(rows)) {\n throw new TypeError('Table data must be an array.');\n }\n\n if (rows.length === 0) {\n throw new Error('Table must define at least one row.');\n }\n\n if (rows[0].length === 0) {\n throw new Error('Table must define at least one column.');\n }\n\n const columnNumber = rows[0].length;\n\n for (const cells of rows) {\n if (!Array.isArray(cells)) {\n throw new TypeError('Table row data must be an array.');\n }\n\n if (cells.length !== columnNumber) {\n throw new Error('Table must have a consistent number of cells.');\n }\n\n for (const cell of cells) {\n // eslint-disable-next-line no-control-regex\n if (/[\\u0001-\\u0009\\u000B-\\u001A]/.test(cell)) {\n throw new Error('Table data must not contain control characters.');\n }\n }\n }\n};\n"],"file":"validateTableData.js"}
1
+ {"version":3,"sources":["../src/validateTableData.js"],"names":["rows","Array","isArray","TypeError","length","Error","columnNumber","cells","cell","test"],"mappings":";;;;;;;AAAA;;;;AAIA;;;;AAIA;;;;0BAIgBA,I,IAAS;AACvB,MAAI,CAACC,KAAK,CAACC,OAAN,CAAcF,IAAd,CAAL,EAA0B;AACxB,UAAM,IAAIG,SAAJ,CAAc,8BAAd,CAAN;AACD;;AAED,MAAIH,IAAI,CAACI,MAAL,KAAgB,CAApB,EAAuB;AACrB,UAAM,IAAIC,KAAJ,CAAU,qCAAV,CAAN;AACD;;AAED,MAAIL,IAAI,CAAC,CAAD,CAAJ,CAAQI,MAAR,KAAmB,CAAvB,EAA0B;AACxB,UAAM,IAAIC,KAAJ,CAAU,wCAAV,CAAN;AACD;;AAED,QAAMC,YAAY,GAAGN,IAAI,CAAC,CAAD,CAAJ,CAAQI,MAA7B;AAbuB;AAAA;AAAA;;AAAA;AAevB,yBAAoBJ,IAApB,8HAA0B;AAAA,YAAfO,KAAe;;AACxB,UAAI,CAACN,KAAK,CAACC,OAAN,CAAcK,KAAd,CAAL,EAA2B;AACzB,cAAM,IAAIJ,SAAJ,CAAc,kCAAd,CAAN;AACD;;AAED,UAAII,KAAK,CAACH,MAAN,KAAiBE,YAArB,EAAmC;AACjC,cAAM,IAAID,KAAJ,CAAU,+CAAV,CAAN;AACD;;AAPuB;AAAA;AAAA;;AAAA;AASxB,8BAAmBE,KAAnB,mIAA0B;AAAA,gBAAfC,IAAe;;AACxB;AACA,cAAI,4CAA4CC,IAA5C,CAAiDD,IAAjD,CAAJ,EAA4D;AAC1D,kBAAM,IAAIH,KAAJ,CAAU,iDAAV,CAAN;AACD;AACF;AAduB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAezB;AA9BsB;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AA+BxB,C","sourcesContent":["/**\n * @typedef {string} cell\n */\n\n/**\n * @typedef {cell[]} validateData~column\n */\n\n/**\n * @param {column[]} rows\n * @returns {undefined}\n */\nexport default (rows) => {\n if (!Array.isArray(rows)) {\n throw new TypeError('Table data must be an array.');\n }\n\n if (rows.length === 0) {\n throw new Error('Table must define at least one row.');\n }\n\n if (rows[0].length === 0) {\n throw new Error('Table must define at least one column.');\n }\n\n const columnNumber = rows[0].length;\n\n for (const cells of rows) {\n if (!Array.isArray(cells)) {\n throw new TypeError('Table row data must be an array.');\n }\n\n if (cells.length !== columnNumber) {\n throw new Error('Table must have a consistent number of cells.');\n }\n\n for (const cell of cells) {\n // eslint-disable-next-line no-control-regex\n if (/[\\u0001-\\u0006\\u0008-\\u0009\\u000B-\\u001A]/.test(cell)) {\n throw new Error('Table data must not contain control characters.');\n }\n }\n }\n};\n"],"file":"validateTableData.js"}
package/package.json CHANGED
@@ -79,5 +79,5 @@
79
79
  "lint": "npm run build && eslint ./src ./test && flow",
80
80
  "test": "mocha --require @babel/register"
81
81
  },
82
- "version": "5.2.3"
82
+ "version": "5.3.0"
83
83
  }