Colorer.js
Terminal string styling done right
Highlights
- Expressive API
- Highly performant
- Ability to nest styles
- 256/Truecolor color support
- Auto-detects color support
- Doesn't extend
String.prototype
- Clean and focused
- Actively maintained
Installation
$ npm install colorer.js -g
Usage
const color = require('colorer.js');
console.log(color.blue('Hello world!'));
Chalk comes with an easy to use composable API where you just chain and nest the styles you want.
const color = require('colorer.js');
const log = console.log;
log(color.blue('Hello') + ' World' + color.red('!'));
log(color.blue.bgRed.bold('Hello world!'));
log(color.blue('Hello', 'World!', 'Foo', 'bar', 'biz', 'baz'));
log(color.red('Hello', chalk.underline.bgBlue('world') + '!'));
log(color.green(
'I am a green line ' +
color.blue.underline.bold('with a blue substring') +
' that becomes green again!'
));
log(`
CPU: ${color.red('90%')}
RAM: ${color.green('40%')}
DISK: ${color.yellow('70%')}
`);
log(color`
CPU: {red ${cpu.totalPercent}%}
RAM: {green ${ram.used / ram.total * 100}%}
DISK: {rgb(255,131,0) ${disk.used / disk.total * 100}%}
`);
log(color.keyword('orange')('Yay for orange colored text!'));
log(color.rgb(123, 45, 67).underline('Underlined reddish color'));
log(color.hex('#DEADED').bold('Bold gray!'));
Easily define your own themes:
const color = require('colorer.js');
const error = color.bold.red;
const warning = color.keyword('orange');
console.log(error('Error!'));
console.log(warning('Warning!'));
Take advantage of console.log string substitution:
const name = 'Sindre';
console.log(color.green('Hello %s'), name);
API
color.<style>[.<style>...](string, [string...])
Example: color.red.bold.underline('Hello', 'world');
Chain styles and call the last one as a method with a string argument. Order doesn't matter, and later styles take precedent in case of a conflict. This simply means that color.red.yellow.green
is equivalent to color.green
.
Multiple arguments will be separated by space.
color.level
Specifies the level of color support.
Color support is automatically detected, but you can override it by setting the level
property. You should however only do this in your own code as it applies globally to all Chalk consumers.
If you need to change this in a reusable module, create a new instance:
const ctx = new color.Instance({level: 0});
Level | Description |
---|
0 | All colors disabled |
1 | Basic color support (16 colors) |
2 | 256 color support |
3 | Truecolor support (16 million colors) |
color.supportsColor
Detect whether the terminal supports color. Used internally and handled for you, but exposed for convenience.
Can be overridden by the user with the flags --color
and --no-color
. For situations where using --color
is not possible, use the environment variable FORCE_COLOR=1
(level 1), FORCE_COLOR=2
(level 2), or FORCE_COLOR=3
(level 3) to forcefully enable color, or FORCE_COLOR=0
to forcefully disable. The use of FORCE_COLOR
overrides all other color support checks.
Explicit 256/Truecolor mode can be enabled using the --color=256
and --color=16m
flags, respectively.
color.stderr and color.stderr.supportsColor
color.stderr
contains a separate instance configured with color support detected for stderr
stream instead of stdout
. Override rules from color.supportsColor
apply to this too. color.stderr.supportsColor
is exposed for convenience.
Styles
Modifiers
reset
- Resets the current color chain.bold
- Make text bold.dim
- Emitting only a small amount of light.italic
- Make text italic. (Not widely supported)underline
- Make text underline. (Not widely supported)inverse
- Inverse background and foreground colors.hidden
- Prints the text, but makes it invisible.strikethrough
- Puts a horizontal line through the center of the text. (Not widely supported)visible
- Prints the text only when Chalk has a color level > 0. Can be useful for things that are purely cosmetic.
Colors
black
red
green
yellow
blue
magenta
cyan
white
blackBright
(alias: gray
, grey
)redBright
greenBright
yellowBright
blueBright
magentaBright
cyanBright
whiteBright
Background colors
bgBlack
bgRed
bgGreen
bgYellow
bgBlue
bgMagenta
bgCyan
bgWhite
bgBlackBright
(alias: bgGray
, bgGrey
)bgRedBright
bgGreenBright
bgYellowBright
bgBlueBright
bgMagentaBright
bgCyanBright
bgWhiteBright
Tagged template literal
Chalk can be used as a tagged template literal.
const color = require('colorer.js');
const miles = 18;
const calculateFeet = miles => miles * 5280;
console.log(color`
There are {bold 5280 feet} in a mile.
In {bold ${miles} miles}, there are {green.bold ${calculateFeet(miles)} feet}.
`);
Blocks are delimited by an opening curly brace ({
), a style, some content, and a closing curly brace (}
).
Template styles are chained exactly like normal Colorer.js styles. The following three statements are equivalent:
console.log(color.bold.rgb(10, 100, 200)('Hello!'));
console.log(color.bold.rgb(10, 100, 200)`Hello!`);
console.log(color`{bold.rgb(10,100,200) Hello!}`);
Note that function styles (rgb()
, hsl()
, keyword()
, etc.) may not contain spaces between parameters.
All interpolated values (color`${foo}`
) are converted to strings via the .toString()
method. All curly braces ({
and }
) in interpolated value strings are escaped.
256 and Truecolor color support
Colorer.js supports 256 colors and True Color (16 million colors) on supported terminal apps.
Colors are downsampled from 16 million RGB values to an ANSI color format that is supported by the terminal emulator (or by specifying {level: n}
as a Chalk option). For example, Chalk configured to run at level 1 (basic color support) will downsample an RGB value of #FF0000 (red) to 31 (ANSI escape for red).
Examples:
color.hex('#DEADED').underline('Hello, world!')
color.keyword('orange')('Some orange text')
color.rgb(15, 100, 204).inverse('Hello!')
Background versions of these models are prefixed with bg
and the first level of the module capitalized (e.g. keyword
for foreground colors and bgKeyword
for background colors).
color.bgHex('#DEADED').underline('Hello, world!')
color.bgKeyword('orange')('Some orange text')
color.bgRgb(15, 100, 204).inverse('Hello!')
The following color models can be used:
rgb
- Example: color.rgb(255, 136, 0).bold('Orange!')
hex
- Example: color.hex('#FF8800').bold('Orange!')
keyword
(CSS keywords) - Example: color.keyword('orange').bold('Orange!')
hsl
- Example: color.hsl(32, 100, 50).bold('Orange!')
hsv
- Example: color.hsv(32, 100, 100).bold('Orange!')
hwb
- Example: color.hwb(32, 0, 50).bold('Orange!')
ansi
- Example: color.ansi(31).bgAnsi(93)('red on yellowBright')
ansi256
- Example: color.bgAnsi256(194)('Honeydew, more or less')
Browser support
Since Chrome 69, ANSI escape codes are natively supported in the developer console.
Windows
If you're on Windows, do yourself a favor and use Windows Terminal instead of cmd.exe
.
License
MIT License
Copyright (c) 2020 JediThePro
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.