Terminal table for Windows, Linux, and MacOS. Written in nodejs. Also works in browser console. Word wrap, padding, alignment, colors, Asian character support, per-column callbacks, and you can pass rows as objects or arrays. Backwards compatible with Automattic/cli-table.

Overview

tty-table 端子台

Build Status NPM version Coverage Status

Display your data in a table using a terminal, browser, or browser console.


Examples

See here for complete example list

To view all example output:

$ git clone https://github.com/tecfu/tty-table && cd tty-table && npm i
$ npm run view-examples

Terminal (Static)

examples/styles-and-formatting.js

Static

Terminal (Streaming)

$ node examples/data/fake-stream.js | tty-table --format json --header examples/config/header.js

Streaming

  • See the built-in help for the terminal version of tty-table with:
$ tty-table -h

Browser & Browser Console

Browser Console Example



API Reference

Table(header array, rows array, options object)

Param Type Description
header array Per-column configuration. An array of objects, one object for each column. Each object contains properties you can use to configure that particular column. See available properties
rows array Your data. An array of arrays or objects. See examples
options object Global table configuration. See available properties

header array of objects

Param Type Description
alias string Text to display in column header cell
align string default: "center"
color string default: terminal default color
footerAlign string default: "center"
footerColor string default: terminal default color
formatter function(cellValue, columnIndex, rowIndex, rowData, inputData Runs a callback on each cell value in the parent column.
Please note that fat arrow functions () => {} don't support scope overrides, and this feature won't work correctly within them.
@formatter configure function(object) Configure cell properties. For example:
this.configure({ truncate: false, align: "left" }) More here.
@formatter resetStyle function(cellValue) Removes ANSI escape sequences. For example:
this.resetStyle("�[32m� myText��[39m") // "myText"
@formatter style function(cellValue, effect) Style cell value. For example:
this.style("mytext", "bold", "green", "underline")
For a full list of options in the terminal: chalk. For a full list of options in the browser: kleur
headerAlign string default: "center"
headerColor string default: terminal's default color
marginLeft integer default: 0
marginTop integer default: 0
paddingBottom integer default: 0
paddingLeft integer default: 1
paddingRight integer default: 1
paddingTop integer default: 0
value string Name of the property to display in each cell when data passed as an array of objects
width string || integer default: "auto"
Can be a percentage of table width i.e. "20%" or a fixed number of columns i.e. "20".
When set to the default ("auto"), the column widths are made proportionate by the longest value in each column.
Note: Percentage columns and fixed value colums not intended to be mixed in the same table.

Example

let header = [{
  value: "item",
  headerColor: "cyan",
  color: "white",
  align: "left",
  width: 20
},
{
  value: "price",
  color: "red",
  width: 10,
  formatter: function (value) {
    let str = `$${value.toFixed(2)}`
    return (value > 5) ? this.style(str, "green", "bold") : 
      this.style(str, "red", "underline")
  }
}]


rows array

Example

  • each row an array
const rows = [
  ["hamburger",2.50],
]
  • each row an object
const rows = [
  {
    item: "hamburger",
    price: 2.50
  }
]


footer array

  • Footer is optional

Example

const footer = [
  "TOTAL",
  function (cellValue, columnIndex, rowIndex, rowData) {
    let total = rowData.reduce((prev, curr) => {
      return prev + curr[1]
    }, 0)
    .toFixed(2)

    return this.style(`$${total}`, "italic")
  }
]


options object

Param Type Description
borderStyle string default: "solid".
options: "solid", "dashed", "none"
borderColor string default: terminal default color
color string default: terminal default color
compact boolean default: false
Removes horizontal borders when true.
defaultErrorValue mixed default: '�'
defaultValue mixed default: '?'
errorOnNull boolean default: false
truncate mixed default: false
When this property is set to a string, cell contents will be truncated by that string instead of wrapped when they extend beyond of the width of the cell.
For example if:
"truncate":"..."
the cell will be truncated with "..."
Note: tty-table wraps overflowing cell text into multiple lines by default, so you would likely only utilize truncate for extremely long values.
width string default: "100%"
Width of the table. Can be a percentage of i.e. "50%" or a fixed number of columns in the terminal viewport i.e. "100".
Note: When you use a percentage, your table will be "responsive".

Example

const options = {
  borderStyle: "solid",
  borderColor: "blue",
  headerAlign: "center",
  align: "left",
  color: "white",
  truncate: "...",
  width: "90%"
}

Table.render() ⇒ String

Add method to render table to a string

Example

const out = Table(header,rows,options).render()
console.log(out); //prints output


Installation

$ npm install tty-table -g
  • Node Module
$ npm install tty-table
  • Browser
import Table from 'https://cdn.jsdelivr.net/gh/tecfu/tty-table/dist/tty-table.esm.js'
let Table = require('tty-table')   // https://cdn.jsdelivr.net/gh/tecfu/tty-table/dist/tty-table.cjs.js
let Table = TTY_Table;             // https://cdn.jsdelivr.net/gh/tecfu/tty-table/dist/tty-table.umd.js

Version Compatibility

Node Version tty-table Version
8 >= 2.0
0.11 >= 0.0

Running tests

$ npm test
$ npm run coverage

Saving the output of new unit tests

$ npm run save-tests

Dev Tips

  • To generate vim tags (make sure jsctags is installed globally)
$ npm run tags
  • To generate vim tags on file save
$ npm run watch-tags

Pull Requests

Pull requests are encouraged!

  • Please remember to add a unit test when necessary
  • Please format your commit messages according to the "Conventional Commits" specification

If you aren't familiar with Conventional Commits, here's a good article on the topic

TL/DR:

  • feat: a feature that is visible for end users.
  • fix: a bugfix that is visible for end users.
  • chore: a change that doesn't impact end users (e.g. chances to CI pipeline)
  • docs: a change in the README or documentation
  • refactor: a change in production code focused on readability, style and/or performance.

Packaging as a distributable

License

MIT License

Copyright 2015-2020, Tecfu.

Comments
  • Double-width East Asian characters vs other unicode characters

    Double-width East Asian characters vs other unicode characters

    Hi, Using Polish characters( like ą,ć,ę etc) cause layout breakage. Output from echo -e "abc\nabć\nab한" | ./node_modules/.bin/tty-table is on this screenshot. Format.calculateLength assumes all unicode chars to be two-char width on display which isn't true. Imo correct way to implement it is to (re)use method from npm east-asian-width( see also links section at the bottom of project's page). Cheers

    opened by kac- 9
  • Resize code has several issues

    Resize code has several issues

    Problem Summary

    Resize code has several issues

    • Sometimes the table is too wide
    • The table is often more narrow than it needs to be
    • At very small sizes the formatting can be broken

    Expected Result (screen shot if possible)

    Formatting should always be correct and the table should always be the desired width

    Actual Result (screen shot if possible)

    See attached output of https://gist.github.com/mscalora/628b05731b7674a1993115752bafd1ee resize-table.txt

    Environment Information

    • OS: MacOS

    • Terminal Emulator: iTerm

    Steps to Reproduce

    1. run: curl https://gist.githubusercontent.com/mscalora/628b05731b7674a1993115752bafd1ee/raw/41a1aab155d4235144513eebefe401fe10169456/resize-table.js | node -
    2. examine output

    Fixes

    I would like to take on fixing these issues and enhancing the table resize functionality with some addition options to better control how resize works:

    • Fix the proportional resize mode issue outline above
    • Add a resize mode that works like CSS flex layout "shrink" mechanism so one can specify which columns should be resized irrespective of content
    • Add a option for desired max output width that will override the terminal width (stdout.columns)
    • Add minimum column width option that can be set on all or specific columns
    • Maybe: Add an option to truncate the whole table if it can't fit in the max output width

    Proposed new table options:

        maxTableWidth: "auto" (default) | "none" | number of char
        truncateTable: true (default, if > maxTableWidth) | false | # of char 
        minColWidth: number of char (4 default)
        resizeTable: "proportional" (default) | "shrink" (only used if natural width is > maxTableWidth)
    

    Proposed new column (header) options:

        minWidth: number of char (default is global minColWidth)
        shrink: [optional] used to weight resizing in "shrink" resize mode
    

    Notes:

    • minWidth would be respected by both resize modes

    Shrink Mode

      Columns are reduced using the weighting of  shrink / sum(all shrinks)
        Col  |  Shink  | Proportion of resize
         A   |    0    |  none
         A   |    1    |  1/5 or 20%
         A   |    4    |  4/5 or 80%
    

    Discussion

    I've actually already started and have most of the work done. I planned on submitting a pull request but wanted to start a discussion and get feedback while I'm still working on it. I understand it may be a a lot of complexity for the scope of this project so I am happy to fork if it is judged to be beyond the desired scope since I need something like this. Also, I can fix some of the issues listed at the top without the new features but it would be a significant amount of extra work to pull that out. I was trying to implement a "legacy" mode but these issues I ran into make that difficult, the broken formatting may only be fixable with some changes like minWidth or using a truncated truncation string.

    opened by mscalora 6
  • Example code throws 'undefined'

    Example code throws 'undefined'

    Running code in examples/data/fake-stream.js with node process_name | tty-table --format=json

    Output via console.log(JSON.stringify(array))

    Throws undefined

    Node v8.1.4

    opened by nstansbury 6
  • Breaks when used in browser with browserify

    Breaks when used in browser with browserify

    When using in browser with browserify, recent builds break with the message:

    >> Error: Cannot find module 'spawn-sync' from './node_modules/cross-spawn'
    

    The issue is, that there is no spawn-sync for browsers as spawning is not possible, I guess. So cross-spawn only works in node. I don't know if it was ever intended, but previous versions (until 2.2.x) worked great in the browsers console... From Version 2.3.0 until the most recent versions, it does not work anymore.

    $ npm ls cross-spawn
    analyzer
    └─┬ [email protected]
      └─┬ [email protected]
        └─┬ [email protected]
          └─┬ [email protected]
            └── [email protected] 
    

    For now I am sticking with version 2.2.5, as my module must work in node.js and browsers, using the table as debug output.

    opened by 0815fox 6
  • Version 2.8.12 breaks backwards compatibility with version 2.8.11

    Version 2.8.12 breaks backwards compatibility with version 2.8.11

    Problem Summary

    Upgrading from 2.8.11 to 2.8.12 broke my application. After investigating, I noticed that chalk was replaced with kleur in version 2.8.12. I was using whiteBright as a header color, which is supported by chalk, but not kleur. This is a backwards compatibility break, and I think it should have caused in a major version bump.

    In addition to the BC break, it's no longer possible to use bright/bold colors in headers as far as I can tell. I think you'd need to introduce a header equivalent to the formatter option to restore that functionality.

    Expected Result (screen shot if possible)

    Using whiteBright as a header color should continue to work when upgrading from 2.8.11 to 2.8.12.

    Actual Result (screen shot if possible)

    Using whiteBright as a header color throws the following error:

    TypeError: kleur[color] is not a function
        at /path/to/project/node_modules/tty-table/src/style.js:6:24
        at Array.reduce (<anonymous>:null:null)
        at Object.module.exports.color (/path/to/project/node_modules/tty-table/src/style.js:5:17)
        at Object.module.exports.colorizeCell (/path/to/project/node_modules/tty-table/src/style.js:28:19)
        at Object.module.exports.buildCell (/path/to/project/node_modules/tty-table/src/render.js:275:21)
        at Object.module.exports.buildRow (/path/to/project/node_modules/tty-table/src/render.js:177:21)
        at /path/to/project/node_modules/tty-table/src/render.js:45:24
        at Array.map (<anonymous>:null:null)
        at Object.module.exports.stringifyData (/path/to/project/node_modules/tty-table/src/render.js:44:45)
        at Array.Factory.tableObject.render (/path/to/project/node_modules/tty-table/src/factory.js:175:25)
        at outputSites (/path/to/project/node_modules/@codeworx/sparse-dev/src/server.js:112:34)
        at run (/path/to/project/node_modules/@codeworx/sparse-dev/src/server.js:69:15)
        at runMicrotasks (<anonymous>:null:null)
        at processTicksAndRejections (internal/process/task_queues.js:97:5)
    

    Environment Information

    • OS: N/A
    • Terminal Emulator: N/A

    Steps to Reproduce

    Run this code using 2.8.11, then 2.8.12. Observe that the upgrade breaks BC:

    const Table = require('tty-table')
    
    const header = [
      {
        value: 'Heading',
        headerColor: 'whiteBright',
      },
    ]
    const rows = [['Row']]
    const table = new Table(header, rows)
    
    console.log(table.render())
    
    opened by ezzatron 5
  • ignore excessive newlines

    ignore excessive newlines

    It it possible to get rid of excess new lines at the beginning of the table ? and around the heading ?

    untitled

    Also how to disable colors for the heading ?

    • OS: Windows 10 (Creator's Update)

    • Terminal Emulator: ConEmu

    Thanks

    opened by sourcevault 5
  • dependencies: merge performance

    dependencies: merge performance

    Problem Summary

    The merge module is slow, the cli that i'm building depend on it to render few lines, i'm seing a ~4x difference between Object.assign and merge : Object.assign:

    /home/vmarchaud/****/bin/pmp.js status  0,48s user 0,04s system 40% cpu 1,276 total
    

    Merge:

    /home/vmarchaud/****/bin/pmp.js status  2,06s user 0,06s system 78% cpu 2,696 total
    

    Expected Result (screen shot if possible)

    image

    Actual Result (screen shot if possible)

    image

    Environment Information

    • OS: Uubuntu 17.10

    • Terminal Emulator: Vscode (xterm.js)

    Steps to Reproduce

    1. Have a CLI using tty-table
    2. Replace Merge here by Object.assign
    3. Profit

    Conclusion

    Would it be possible to use Object.assign when available ? I dont mind making a PR if needed

    opened by vmarchaud 4
  • Incorrect number of columns

    Incorrect number of columns

    Problem Summary

    Version 2.5.6 introduce the following issue: It is not possible to have multiple tables with a different number of columns. Version 2.5.5. is ok.

    Consider this code:

    import table from 'tty-table';
    
    const header = [
      { value: 'col1' },
      { value: 'col2' }
    ];
    
    const rows = [[1, 2]];
    console.log(table(header, rows).render());
    
    const header2 = [
      { value: 'col1' },
      { value: 'col2' },
      { value: 'col3' }
    ];
    
    const rows2 = [[1, 2, 3]];
    console.log(table(header2, rows2).render());
    

    Expected Result

    image

    Actual Result

    image

    Environment Information

    • OS: macOS High Sierra
    • Terminal: iTerm2
    opened by deftomat 4
  • Prevent truncating on specific cell

    Prevent truncating on specific cell

    Hi, I'm using truncate: "..." and global parameter for my table and I'm trying to prevent truncation on a single cell. I Had no luck with truncate: false (default value) which sets the cell content to "false" (bug?)

    Any idea? Thanks!

    opened by jonathanasquier 4
  • Error: Number of columns is inconsistent on line 363

    Error: Number of columns is inconsistent on line 363

    I have csv file with line number of 365.

    When i remove line 363. It still throw the error until my csv total line become 362.

    I think the only line it can read is 363?

    Command i use to read is. cat filename.csv | tty-table

    environment: osx 10.12.6 node: v6.10.3

    opened by junejie 4
  • Smartwrap deprecation warning

    Smartwrap deprecation warning

    Problem Summary

    Projects using tty-table such as the popular changesets cli output deprecation warning related to smartwrap:

    Screenshot from 2022-02-16 14-23-43

    Expected Result (screen shot if possible)

    No deprecation warning

    Actual Result (screen shot if possible)

    See screenshot above.

    Environment Information

    • OS: GNU/Linux 5.15.11-3-t2

    • Terminal Emulator: Alacritty

    • Node Version: 17.x

    Steps to Reproduce

    1. Clone https://codeberg.org/vhs/oathqr
    2. Install dependencies with pnpm i
    3. Run pnpm up to observe warning message
    opened by vhscom 3
  • RangeError is thrown when the column width is float

    RangeError is thrown when the column width is float

    Problem Summary

    If any column width is evaluated to float, RangeError will be thrown on that line:

    let emptySpace = columnWidth - lineLength
    const padRemainder = emptySpace % 2
    ...
    Array(padBoth + 1 + padRemainder).join(" ")
    

    Array constructor doesn't accept float as a parameter, therefore that exception is thrown:

    RangeError: Invalid array length
    

    Expected Result (screen shot if possible)

    No exception is thrown. Column widths are always coerced to ints.

    Actual Result (screen shot if possible)

    Column widths can be floats, exception is thrown

    Environment Information

    • OS: all

    • Node Version: reproduced on 8.x and 16.x

    Steps to Reproduce

    1. Set headers with percentage widths not divisible by total table width and not exceeding the table width when summed up
    2. Try to create a table

    Example affected headers:

    const baseHeaders = [
      { alias: "Fixed header", width: "25%" },
      { alias: "Auto header" }
    ]
    

    Error is not present when columns exceed viewport width, because in that case widths are coerced in Format.getColumnWidths, more specifically:

      if (totalWidth > availableWidth || config.FIXED_WIDTH) {
        // proportion wont be exact fit, but this method keeps us safe
        const proportion = (availableWidth / totalWidth).toFixed(2) - 0.01
        const relativeWidths = widths.map(value => Math.max(2, Math.floor(proportion * value)))
        if (config.FIXED_WIDTH) return relativeWidths
    
        // when proportion < 0 column cant be resized and totalWidth must overflow viewport
        if (proportion > 0) {
          const totalRelativeWidths = relativeWidths.reduce((prev, current) => prev + current)
          widths = (totalRelativeWidths < totalWidth) ? relativeWidths : widths
        }
      }
    
    opened by norbertcyran 1
  • Footer align does not work

    Footer align does not work

    Problem Summary

    I am trying to align a footer cell to right.

    Expected Result (screen shot if possible)

    Actual Result (screen shot if possible)

    Bildschirmfoto 2020-07-02 um 11 14 41

    Environment Information

    • OS: latest public macOS

    • Terminal Emulator: iTerm2 with zsh and zprezto plugin

    • Node Version: LTS

    Steps to Reproduce

      const header = [
        {
          value: 'Test',
          align: 'left',
          headerAlign: 'left',
          footerAlign: 'right',
        },
        {
          value: 'Score',
          align: 'left',
          headerAlign: 'left',
          footerAlign: 'left',
          formatter: (cellValue) => {
            return cellValue > 60 ? green(cellValue) : red(cellValue)
          },
        },
      ]
      const rows = [
        ['Performance', 64],
        ['Accessibility', 70],
        ['Best Practices', 30],
        ['SEO', 60],
        ['PWA', 100],
      ]
      const footer = [
        'Total',
        (cellValue, columnIndex, rowIndex, rowData) => {
          const total = Math.round(rowData.map((i) => i[1]).reduce((p, c) => p + c) / 5)
          return italic(total)
        },
      ]
      const renderedTable = Table(header, rows, footer).render()
      console.log(renderedTable)
    
    opened by muuvmuuv 1
  • Automatic width not correct when using formatter

    Automatic width not correct when using formatter

    Problem Summary

    I'm using a formatter function to add 'USD' to a money amount. The automatic column width is determined by the value before the formatter instead of the string returned by the formatter.

    Expected Result (screen shot if possible)

    Automatic column width should be wider.

    Actual Result (screen shot if possible)

    It's the width based on the original value before the formatter.

    Steps to Reproduce

    1. Basic table code without specifying column widths
    2. formatter: (cellValue) => { return cellValue + ' USD' }
    3. Column is not wide enough.
    opened by Richie765 1
Releases(v4.1.6)
  • v4.1.6(Jun 10, 2022)

    What's Changed

    • chore(deps): bump glob-parent from 5.1.0 to 5.1.2 by @dependabot in https://github.com/tecfu/tty-table/pull/79
    • Mark formatter as optional by @Andarist in https://github.com/tecfu/tty-table/pull/93

    New Contributors

    • @Andarist made their first contribution in https://github.com/tecfu/tty-table/pull/93

    Full Changelog: https://github.com/tecfu/tty-table/compare/v4.1.5...v4.1.6

    Source code(tar.gz)
    Source code(zip)
Owner
$2y$10$pCG0Qzwi0AhuaYCFpydbS.c3PHUJGu3AJreDudGce.Zd/UV.HQyLe
"The ambitious dreamer sees himself at the summit of power, while he slavishly prostrates himself in the mire." - Balzac (The Talisman)
$2y$10$pCG0Qzwi0AhuaYCFpydbS.c3PHUJGu3AJreDudGce.Zd/UV.HQyLe
Uses marked-terminal to render a README.md for any npm module in the terminal.

modhelp Uses marked-terminal to render a README.md for any npm module in the terminal. Now with built-in pager! Page up/down, arrow keys to scroll lin

Jason Livesay 23 Feb 8, 2022
Terminal ui for discord with interactive terminal

dickord why No fucking clue i was bored or something. why does it look dogshit Try and find a node module that supports terminal functions like trauma

Hima 3 Nov 7, 2022
DataENV is a cli tool that allows you to save data temporarily using your terminal.

DataEnv CLI Instllation npm install -g dataenv Usage Table of Contents LocalStorage npx dataenv save Parameters npx dataenv show Parameters npx dataen

PGamerX 2 Feb 5, 2022
:white_square_button: WhatsApp chat from commandline/console/cli using GoogleChrome puppeteer

Whatspup Use Whatsapp from commandline/console/cli using GoogleChrome puppeteer! ?? Features ✅ Send and receive messages ✅ Read Receipts ✅ Switch betw

Sarfraz Ahmed 343 Dec 1, 2022
LinkFree CLI is a command line tool that helps you to create your LinkFree profile through CLI.

LinkFree CLI LinkFree CLI is a command line tool that helps you to create your LinkFree profile through CLI. Demo Using the CLI (Commands) Note First

Pradumna Saraf 32 Dec 26, 2022
Control the macOS dark mode from the command-line

dark-mode Control the macOS dark mode from the command-line Requires macOS 10.10 or later. macOS 10.13 or earlier needs to download the Swift runtime

Sindre Sorhus 630 Dec 30, 2022
Close chrome tabs from command-line (macOS only)

Close-tab Read all tabs from an activated window of the chrome, open with vi prompt, you can close tabs by deleting lines. Istallation npm install -g

Karl Saehun Chung 8 Jun 18, 2022
💻 macOS interface with ReactJS

macOS a clone of the macOS interface, made with ReactJS. this open source project was made for studies, and aims to replicate the macOS interface. Be

Marcos Andre 16 Nov 10, 2022
rtail(1) - Terminal output to the browser in seconds, using UNIX pipes.

rtail(1) Terminal output to the browser in seconds, using UNIX pipes. rtail is a command line utility that grabs every line in stdin and broadcasts it

Kilian Ciuffolo 1.6k Jan 6, 2023
Pretty diff to html javascript cli (diff2html-cli)

diff2html-cli Diff to Html generates pretty HTML diffs from unified and git diff output in your terminal Table of Contents Features Online Example Dis

Rodrigo Fernandes 404 Dec 19, 2022
Cross-platform Linux commands in ES6

Cross-platform Linux commands in pure ES6 Cash is a cross-platform implementation of Unix shell commands written in straight ES6. No native compiling

dc 7.8k Dec 27, 2022
Add stdin support to any CLI app that accepts file input

tmpin Add stdin support to any CLI app that accepts file input It pipes stdin to a temp file and spawns the chosen app with the temp file path as the

Sindre Sorhus 121 Oct 3, 2022
Tasks Management CLI application with Nodejs, Mongodb, inquirer.js, and commander

Tasks CLI Tasks CLI is a program to manage your tasks in a database using terminal or console. This is a sample project for beginners Requirements Nod

Fazt Web 9 Nov 17, 2022
NodeJS built CLI, allows to spell check in 14 languages, get Coleman-Liau Index and build hash Pyramids

Magic CLI ?? ?? NodeJS built CLI, allows to spell check in 14 languages, get Coleman-Liau Index and build hash Pyramids Installing Install dependencie

Lucas 3 Sep 27, 2022
Add a hungry turtle to your terminal and feed it every time you mistype 'npm' as 'nom'

Nom Does this ever happen to you? You happily code away on a project, navigating the command line like a pro, testing, error logging, installing packa

Meike Hankewicz 5 Apr 26, 2022
Started pack for working with the new GameTest Framework API. Usable in windows, and mobile in worlds and realms!

GameTest FrameWork GameTest FrameWork is a new feature in Minecraft Bedrock Edition. This gives you the ability to script! In this example I will be u

null 40 Dec 24, 2022
Windows command line tool to block outbound connections for files within a directory.

fwg A Windows command line tool to block outbound connections for files within a directory. fwg utilizes the power of PowerShell and Windows Network S

raymond wang 3 Jul 19, 2022
Pipeable javascript. Quickly filter, map, and reduce from the terminal

Pipeable JavaScript - another utility like sed/awk/wc... but with JS! Quickly filter, map and reduce from the command line. Features a streaming API.

Daniel St. Jules 410 Dec 10, 2022
📜 Create mutable log lines into the terminal, and give life to your logs!

Because Logging can be pretty and fun Installation $ npm install draftlog What it does It allows you to re-write a line of your log after being writt

Ivan Seidel 1.2k Dec 31, 2022