Skip to content

Wrapper over kleur with better support for testing

License

Notifications You must be signed in to change notification settings

poppinss/colors

Repository files navigation

@poppinss/colors

Wrapper over kleur with better support for testing

gh-workflow-image typescript-image npm-image license-image

Why this package exists?

This package is a wrapper over kleur with additional implementations to make testing easier and work seamlessly with terminals/stdout streams that do not support colors.

Usage

Install the package from the npm registry as follows.

npm i @poppinss/colors

And use it as follows. The ansi method returns an instance of the kleur package.

import useColors from '@poppinss/colors'
const colors = useColors.ansi()

console.log(colors.red('this is an error'))
console.log(colors.cyan('hello world'))

Chaining methods

const colors = useColors.ansi()
console.log(colors.red().bgBlack('this is an error'))

Raw implementation

The raw implementation is ideal for testing. Instead of outputting ANSI escape codes, we wrap the string with transformation names. For example:

import useColors from '@poppinss/colors'
const colors = useColors.raw()

console.log(colors.red('hello world'))
// OUTPUT: red(hello world)

console.log(colors.bgBlack().red('hello world'))
// OUTPUT: bgBlack(red(hello world))

As you can notice, the output is a plain text value, so it is easier to write assertions against it.

assert.equal(colors.red('hello world'), 'red(hello world)')

Silent output

The silent mode does not perform any transformations on the string and returns the value. This is helpful when the output terminal or stdout stream does not support colors.

import useColors from '@poppinss/colors'
const colors = useColors.silent()

console.log(colors.red('hello world'))
// OUTPUT: hello world

console.log(colors.bgBlack().red('hello world'))
// OUTPUT: hello world

Pick based on the runtime environment

Ideally, you will use one of the available implementations based on some runtime environment. For example:

import useColors from '@poppinss/colors'
import supportsColor from 'supports-color'

const isTestEnv = process.env.NODE_ENV === 'test'

const colors = isTestEnv
  ? useColors.raw() // use raw in test environment
  : supportsColor.stdout
    ? useColors.ansi() // use kleur when stdout has colors
    : useColors.silent() // use silent mode 

export default colors