Comparing version 4.1.2 to 5.0.0
{ | ||
"name": "chalk", | ||
"version": "4.1.2", | ||
"version": "5.0.0", | ||
"description": "Terminal string styling done right", | ||
@@ -8,8 +8,17 @@ "license": "MIT", | ||
"funding": "https://github.com/chalk/chalk?sponsor=1", | ||
"main": "source", | ||
"type": "module", | ||
"exports": "./source/index.js", | ||
"imports": { | ||
"#ansi-styles": "./source/vendor/ansi-styles/index.js", | ||
"#supports-color": { | ||
"node": "./source/vendor/supports-color/index.js", | ||
"default": "./source/vendor/supports-color/browser.js" | ||
} | ||
}, | ||
"types": "./source/index.d.ts", | ||
"engines": { | ||
"node": ">=10" | ||
"node": "^12.17.0 || ^14.13 || >=16.0.0" | ||
}, | ||
"scripts": { | ||
"test": "xo && nyc ava && tsd", | ||
"test": "xo && c8 ava && tsd", | ||
"bench": "matcha benchmark.js" | ||
@@ -19,3 +28,3 @@ }, | ||
"source", | ||
"index.d.ts" | ||
"!source/index.test-d.ts" | ||
], | ||
@@ -30,3 +39,2 @@ "keywords": [ | ||
"string", | ||
"str", | ||
"ansi", | ||
@@ -46,27 +54,28 @@ "style", | ||
], | ||
"dependencies": { | ||
"ansi-styles": "^4.1.0", | ||
"supports-color": "^7.1.0" | ||
}, | ||
"devDependencies": { | ||
"ava": "^2.4.0", | ||
"coveralls": "^3.0.7", | ||
"execa": "^4.0.0", | ||
"import-fresh": "^3.1.0", | ||
"@types/node": "^16.11.10", | ||
"ava": "^3.15.0", | ||
"c8": "^7.10.0", | ||
"color-convert": "^2.0.1", | ||
"execa": "^6.0.0", | ||
"log-update": "^5.0.0", | ||
"matcha": "^0.7.0", | ||
"nyc": "^15.0.0", | ||
"resolve-from": "^5.0.0", | ||
"tsd": "^0.7.4", | ||
"xo": "^0.28.2" | ||
"tsd": "^0.19.0", | ||
"xo": "^0.47.0", | ||
"yoctodelay": "^2.0.0" | ||
}, | ||
"xo": { | ||
"rules": { | ||
"unicorn/prefer-string-slice": "off", | ||
"unicorn/prefer-includes": "off", | ||
"@typescript-eslint/member-ordering": "off", | ||
"no-redeclare": "off", | ||
"unicorn/string-content": "off", | ||
"unicorn/better-regex": "off" | ||
"unicorn/prefer-string-slice": "off" | ||
} | ||
}, | ||
"c8": { | ||
"reporter": [ | ||
"text", | ||
"lcov" | ||
], | ||
"exclude": [ | ||
"source/vendor" | ||
] | ||
} | ||
} |
112
readme.md
@@ -12,3 +12,6 @@ <h1 align="center"> | ||
[![Build Status](https://travis-ci.org/chalk/chalk.svg?branch=master)](https://travis-ci.org/chalk/chalk) [![Coverage Status](https://coveralls.io/repos/github/chalk/chalk/badge.svg?branch=master)](https://coveralls.io/github/chalk/chalk?branch=master) [![npm dependents](https://badgen.net/npm/dependents/chalk)](https://www.npmjs.com/package/chalk?activeTab=dependents) [![Downloads](https://badgen.net/npm/dt/chalk)](https://www.npmjs.com/package/chalk) [![](https://img.shields.io/badge/unicorn-approved-ff69b4.svg)](https://www.youtube.com/watch?v=9auOCbH5Ns4) [![XO code style](https://img.shields.io/badge/code_style-XO-5ed9c7.svg)](https://github.com/xojs/xo) ![TypeScript-ready](https://img.shields.io/npm/types/chalk.svg) [![run on repl.it](https://repl.it/badge/github/chalk/chalk)](https://repl.it/github/chalk/chalk) | ||
[![Coverage Status](https://codecov.io/gh/chalk/chalk/branch/main/graph/badge.svg)](https://codecov.io/gh/chalk/chalk) | ||
[![npm dependents](https://badgen.net/npm/dependents/chalk)](https://www.npmjs.com/package/chalk?activeTab=dependents) [![Downloads](https://badgen.net/npm/dt/chalk)](https://www.npmjs.com/package/chalk) | ||
[![run on repl.it](https://repl.it/badge/github/chalk/chalk)](https://repl.it/github/chalk/chalk) | ||
[![Support Chalk on DEV](https://badge.devprotocol.xyz/0x44d871aebF0126Bf646753E2C976Aa7e68A66c15/descriptive)](https://stakes.social/0x44d871aebF0126Bf646753E2C976Aa7e68A66c15) | ||
@@ -53,6 +56,10 @@ <img src="https://cdn.jsdelivr.net/gh/chalk/ansi-styles@8261697c95bf34b6c7767e2cbe9941a851d59385/screenshot.svg" width="900"> | ||
<br> | ||
<a href="https://uibakery.io/?utm_source=chalk&utm_medium=sponsor&utm_campaign=github"> | ||
<a href="https://strapi.io/?ref=sindresorhus"> | ||
<div> | ||
<img src="https://sindresorhus.com/assets/thanks/uibakery-logo.jpg" width="270" alt="UI Bakery"> | ||
<img src="https://sindresorhus.com/assets/thanks/strapi-logo-white-bg.png" width="220" alt="Strapi"> | ||
</div> | ||
<b>Strapi is the leading open-source headless CMS.</b> | ||
<div> | ||
<sup>It’s 100% JavaScript, fully customizable, and developer-first.</sup> | ||
</div> | ||
</a> | ||
@@ -70,2 +77,3 @@ </p> | ||
- Highly performant | ||
- No dependencies | ||
- Ability to nest styles | ||
@@ -77,14 +85,16 @@ - [256/Truecolor color support](#256-and-truecolor-color-support) | ||
- Actively maintained | ||
- [Used by ~50,000 packages](https://www.npmjs.com/browse/depended/chalk) as of January 1, 2020 | ||
- [Used by ~76,000 packages](https://www.npmjs.com/browse/depended/chalk) as of October 26, 2021 | ||
## Install | ||
```console | ||
$ npm install chalk | ||
```sh | ||
npm install chalk | ||
``` | ||
**IMPORTANT:** Chalk 5 is ESM. If you want to use Chalk with TypeScript or a build tool, you will probably want to use Chalk 4 for now. [Read more.](https://github.com/chalk/chalk/releases/tag/v5.0.0) | ||
## Usage | ||
```js | ||
const chalk = require('chalk'); | ||
import chalk from 'chalk'; | ||
@@ -97,3 +107,4 @@ console.log(chalk.blue('Hello world!')); | ||
```js | ||
const chalk = require('chalk'); | ||
import chalk from 'chalk'; | ||
const log = console.log; | ||
@@ -127,11 +138,3 @@ | ||
// ES2015 tagged template literal | ||
log(chalk` | ||
CPU: {red ${cpu.totalPercent}%} | ||
RAM: {green ${ram.used / ram.total * 100}%} | ||
DISK: {rgb(255,131,0) ${disk.used / disk.total * 100}%} | ||
`); | ||
// Use RGB colors in terminal emulators that support it. | ||
log(chalk.keyword('orange')('Yay for orange colored text!')); | ||
log(chalk.rgb(123, 45, 67).underline('Underlined reddish color')); | ||
@@ -144,6 +147,6 @@ log(chalk.hex('#DEADED').bold('Bold gray!')); | ||
```js | ||
const chalk = require('chalk'); | ||
import chalk from 'chalk'; | ||
const error = chalk.bold.red; | ||
const warning = chalk.keyword('orange'); | ||
const warning = chalk.hex('#FFA500'); // Orange color | ||
@@ -157,2 +160,4 @@ console.log(error('Error!')); | ||
```js | ||
import chalk from 'chalk'; | ||
const name = 'Sindre'; | ||
@@ -182,3 +187,5 @@ console.log(chalk.green('Hello %s'), name); | ||
```js | ||
const ctx = new chalk.Instance({level: 0}); | ||
import {Chalk} from 'chalk'; | ||
const customChalk = new Chalk({level: 0}); | ||
``` | ||
@@ -193,3 +200,3 @@ | ||
### chalk.supportsColor | ||
### supportsColor | ||
@@ -202,5 +209,5 @@ Detect whether the terminal [supports color](https://github.com/chalk/supports-color). Used internally and handled for you, but exposed for convenience. | ||
### chalk.stderr and chalk.stderr.supportsColor | ||
### chalkStderr and supportsColorStderr | ||
`chalk.stderr` contains a separate instance configured with color support detected for `stderr` stream instead of `stdout`. Override rules from `chalk.supportsColor` apply to this too. `chalk.stderr.supportsColor` is exposed for convenience. | ||
`chalkStderr` contains a separate instance configured with color support detected for `stderr` stream instead of `stdout`. Override rules from `supportsColor` apply to this too. `supportsColorStderr` is exposed for convenience. | ||
@@ -211,11 +218,12 @@ ## Styles | ||
- `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. | ||
- `reset` - Reset the current style. | ||
- `bold` - Make the text bold. | ||
- `dim` - Make the text have lower opacity. | ||
- `italic` - Make the text italic. *(Not widely supported)* | ||
- `underline` - Put a horizontal line below the text. *(Not widely supported)* | ||
- `overline` - Put a horizontal line above the text. *(Not widely supported)* | ||
- `inverse`- Invert background and foreground colors. | ||
- `hidden` - Print the text but make 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. | ||
- `visible`- Print the text only when Chalk has a color level above zero. Can be useful for things that are purely cosmetic. | ||
@@ -260,32 +268,2 @@ ### Colors | ||
## Tagged template literal | ||
Chalk can be used as a [tagged template literal](https://exploringjs.com/es6/ch_template-literals.html#_tagged-template-literals). | ||
```js | ||
const chalk = require('chalk'); | ||
const miles = 18; | ||
const calculateFeet = miles => miles * 5280; | ||
console.log(chalk` | ||
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 Chalk styles. The following three statements are equivalent: | ||
```js | ||
console.log(chalk.bold.rgb(10, 100, 200)('Hello!')); | ||
console.log(chalk.bold.rgb(10, 100, 200)`Hello!`); | ||
console.log(chalk`{bold.rgb(10,100,200) Hello!}`); | ||
``` | ||
Note that function styles (`rgb()`, `hsl()`, `keyword()`, etc.) may not contain spaces between parameters. | ||
All interpolated values (`` chalk`${foo}` ``) are converted to strings via the `.toString()` method. All curly braces (`{` and `}`) in interpolated value strings are escaped. | ||
## 256 and Truecolor color support | ||
@@ -300,9 +278,7 @@ | ||
- `chalk.hex('#DEADED').underline('Hello, world!')` | ||
- `chalk.keyword('orange')('Some orange text')` | ||
- `chalk.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). | ||
Background versions of these models are prefixed with `bg` and the first level of the module capitalized (e.g. `hex` for foreground colors and `bgHex` for background colors). | ||
- `chalk.bgHex('#DEADED').underline('Hello, world!')` | ||
- `chalk.bgKeyword('orange')('Some orange text')` | ||
- `chalk.bgRgb(15, 100, 204).inverse('Hello!')` | ||
@@ -314,9 +290,8 @@ | ||
- [`hex`](https://en.wikipedia.org/wiki/Web_colors#Hex_triplet) - Example: `chalk.hex('#FF8800').bold('Orange!')` | ||
- [`keyword`](https://www.w3.org/wiki/CSS/Properties/color/keywords) (CSS keywords) - Example: `chalk.keyword('orange').bold('Orange!')` | ||
- [`hsl`](https://en.wikipedia.org/wiki/HSL_and_HSV) - Example: `chalk.hsl(32, 100, 50).bold('Orange!')` | ||
- [`hsv`](https://en.wikipedia.org/wiki/HSL_and_HSV) - Example: `chalk.hsv(32, 100, 100).bold('Orange!')` | ||
- [`hwb`](https://en.wikipedia.org/wiki/HWB_color_model) - Example: `chalk.hwb(32, 0, 50).bold('Orange!')` | ||
- [`ansi`](https://en.wikipedia.org/wiki/ANSI_escape_code#3/4_bit) - Example: `chalk.ansi(31).bgAnsi(93)('red on yellowBright')` | ||
- [`ansi256`](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) - Example: `chalk.bgAnsi256(194)('Honeydew, more or less')` | ||
## Browser support | ||
Since Chrome 69, ANSI escape codes are natively supported in the developer console. | ||
## Windows | ||
@@ -338,2 +313,3 @@ | ||
- [chalk-template](https://github.com/chalk/chalk-template) - [Tagged template literals](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Template_literals#tagged_templates) support for this module | ||
- [chalk-cli](https://github.com/chalk/chalk-cli) - CLI for this module | ||
@@ -340,0 +316,0 @@ - [ansi-styles](https://github.com/chalk/ansi-styles) - ANSI escape codes for styling strings in the terminal |
@@ -1,11 +0,14 @@ | ||
'use strict'; | ||
const ansiStyles = require('ansi-styles'); | ||
const {stdout: stdoutColor, stderr: stderrColor} = require('supports-color'); | ||
const { | ||
import ansiStyles from '#ansi-styles'; | ||
import supportsColor from '#supports-color'; | ||
import { // eslint-disable-line import/order | ||
stringReplaceAll, | ||
stringEncaseCRLFWithFirstIndex | ||
} = require('./util'); | ||
stringEncaseCRLFWithFirstIndex, | ||
} from './utilities.js'; | ||
const {isArray} = Array; | ||
const {stdout: stdoutColor, stderr: stderrColor} = supportsColor; | ||
const GENERATOR = Symbol('GENERATOR'); | ||
const STYLER = Symbol('STYLER'); | ||
const IS_EMPTY = Symbol('IS_EMPTY'); | ||
// `supportsColor.level` → `ansiStyles.color[name]` mapping | ||
@@ -16,3 +19,3 @@ const levelMapping = [ | ||
'ansi256', | ||
'ansi16m' | ||
'ansi16m', | ||
]; | ||
@@ -32,3 +35,3 @@ | ||
class ChalkClass { | ||
export class Chalk { | ||
constructor(options) { | ||
@@ -41,30 +44,23 @@ // eslint-disable-next-line no-constructor-return | ||
const chalkFactory = options => { | ||
const chalk = {}; | ||
const chalk = (...strings) => strings.join(' '); | ||
applyOptions(chalk, options); | ||
chalk.template = (...arguments_) => chalkTag(chalk.template, ...arguments_); | ||
Object.setPrototypeOf(chalk, createChalk.prototype); | ||
Object.setPrototypeOf(chalk, Chalk.prototype); | ||
Object.setPrototypeOf(chalk.template, chalk); | ||
chalk.template.constructor = () => { | ||
throw new Error('`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.'); | ||
}; | ||
chalk.template.Instance = ChalkClass; | ||
return chalk.template; | ||
return chalk; | ||
}; | ||
function Chalk(options) { | ||
function createChalk(options) { | ||
return chalkFactory(options); | ||
} | ||
Object.setPrototypeOf(createChalk.prototype, Function.prototype); | ||
for (const [styleName, style] of Object.entries(ansiStyles)) { | ||
styles[styleName] = { | ||
get() { | ||
const builder = createBuilder(this, createStyler(style.open, style.close, this._styler), this._isEmpty); | ||
const builder = createBuilder(this, createStyler(style.open, style.close, this[STYLER]), this[IS_EMPTY]); | ||
Object.defineProperty(this, styleName, {value: builder}); | ||
return builder; | ||
} | ||
}, | ||
}; | ||
@@ -75,9 +71,29 @@ } | ||
get() { | ||
const builder = createBuilder(this, this._styler, true); | ||
const builder = createBuilder(this, this[STYLER], true); | ||
Object.defineProperty(this, 'visible', {value: builder}); | ||
return builder; | ||
}, | ||
}; | ||
const getModelAnsi = (model, level, type, ...arguments_) => { | ||
if (model === 'rgb') { | ||
if (level === 'ansi16m') { | ||
return ansiStyles[type].ansi16m(...arguments_); | ||
} | ||
if (level === 'ansi256') { | ||
return ansiStyles[type].ansi256(ansiStyles.rgbToAnsi256(...arguments_)); | ||
} | ||
return ansiStyles[type].ansi(ansiStyles.rgbToAnsi(...arguments_)); | ||
} | ||
if (model === 'hex') { | ||
return getModelAnsi('rgb', level, type, ...ansiStyles.hexToRgb(...arguments_)); | ||
} | ||
return ansiStyles[type][model](...arguments_); | ||
}; | ||
const usedModels = ['rgb', 'hex', 'keyword', 'hsl', 'hsv', 'hwb', 'ansi', 'ansi256']; | ||
const usedModels = ['rgb', 'hex', 'ansi256']; | ||
@@ -89,10 +105,8 @@ for (const model of usedModels) { | ||
return function (...arguments_) { | ||
const styler = createStyler(ansiStyles.color[levelMapping[level]][model](...arguments_), ansiStyles.color.close, this._styler); | ||
return createBuilder(this, styler, this._isEmpty); | ||
const styler = createStyler(getModelAnsi(model, levelMapping[level], 'color', ...arguments_), ansiStyles.color.close, this[STYLER]); | ||
return createBuilder(this, styler, this[IS_EMPTY]); | ||
}; | ||
} | ||
}, | ||
}; | ||
} | ||
for (const model of usedModels) { | ||
const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1); | ||
@@ -103,6 +117,6 @@ styles[bgModel] = { | ||
return function (...arguments_) { | ||
const styler = createStyler(ansiStyles.bgColor[levelMapping[level]][model](...arguments_), ansiStyles.bgColor.close, this._styler); | ||
return createBuilder(this, styler, this._isEmpty); | ||
const styler = createStyler(getModelAnsi(model, levelMapping[level], 'bgColor', ...arguments_), ansiStyles.bgColor.close, this[STYLER]); | ||
return createBuilder(this, styler, this[IS_EMPTY]); | ||
}; | ||
} | ||
}, | ||
}; | ||
@@ -116,8 +130,8 @@ } | ||
get() { | ||
return this._generator.level; | ||
return this[GENERATOR].level; | ||
}, | ||
set(level) { | ||
this._generator.level = level; | ||
} | ||
} | ||
this[GENERATOR].level = level; | ||
}, | ||
}, | ||
}); | ||
@@ -141,3 +155,3 @@ | ||
closeAll, | ||
parent | ||
parent, | ||
}; | ||
@@ -147,13 +161,6 @@ }; | ||
const createBuilder = (self, _styler, _isEmpty) => { | ||
const builder = (...arguments_) => { | ||
if (isArray(arguments_[0]) && isArray(arguments_[0].raw)) { | ||
// Called as a template literal, for example: chalk.red`2 + 3 = {bold ${2+3}}` | ||
return applyStyle(builder, chalkTag(builder, ...arguments_)); | ||
} | ||
// Single argument is hot path, implicit coercion is faster than anything | ||
// eslint-disable-next-line no-implicit-coercion | ||
const builder = (...arguments_) => applyStyle(builder, (arguments_.length === 1) ? ('' + arguments_[0]) : arguments_.join(' ')); | ||
// Single argument is hot path, implicit coercion is faster than anything | ||
// eslint-disable-next-line no-implicit-coercion | ||
return applyStyle(builder, (arguments_.length === 1) ? ('' + arguments_[0]) : arguments_.join(' ')); | ||
}; | ||
// We alter the prototype because we must return a function, but there is | ||
@@ -163,5 +170,5 @@ // no way to create a function with a different prototype | ||
builder._generator = self; | ||
builder._styler = _styler; | ||
builder._isEmpty = _isEmpty; | ||
builder[GENERATOR] = self; | ||
builder[STYLER] = _styler; | ||
builder[IS_EMPTY] = _isEmpty; | ||
@@ -173,6 +180,6 @@ return builder; | ||
if (self.level <= 0 || !string) { | ||
return self._isEmpty ? '' : string; | ||
return self[IS_EMPTY] ? '' : string; | ||
} | ||
let styler = self._styler; | ||
let styler = self[STYLER]; | ||
@@ -184,3 +191,3 @@ if (styler === undefined) { | ||
const {openAll, closeAll} = styler; | ||
if (string.indexOf('\u001B') !== -1) { | ||
if (string.includes('\u001B')) { | ||
while (styler !== undefined) { | ||
@@ -207,36 +214,12 @@ // Replace any instances already present with a re-opening code | ||
let template; | ||
const chalkTag = (chalk, ...strings) => { | ||
const [firstString] = strings; | ||
Object.defineProperties(createChalk.prototype, styles); | ||
if (!isArray(firstString) || !isArray(firstString.raw)) { | ||
// If chalk() was called by itself or with a string, | ||
// return the string itself as a string. | ||
return strings.join(' '); | ||
} | ||
const chalk = createChalk(); | ||
export const chalkStderr = createChalk({level: stderrColor ? stderrColor.level : 0}); | ||
const arguments_ = strings.slice(1); | ||
const parts = [firstString.raw[0]]; | ||
for (let i = 1; i < firstString.length; i++) { | ||
parts.push( | ||
String(arguments_[i - 1]).replace(/[{}\\]/g, '\\$&'), | ||
String(firstString.raw[i]) | ||
); | ||
} | ||
if (template === undefined) { | ||
template = require('./templates'); | ||
} | ||
return template(chalk, parts.join('')); | ||
export { | ||
stdoutColor as supportsColor, | ||
stderrColor as supportsColorStderr, | ||
}; | ||
Object.defineProperties(Chalk.prototype, styles); | ||
const chalk = Chalk(); // eslint-disable-line new-cap | ||
chalk.supportsColor = stdoutColor; | ||
chalk.stderr = Chalk({level: stderrColor ? stderrColor.level : 0}); // eslint-disable-line new-cap | ||
chalk.stderr.supportsColor = stderrColor; | ||
module.exports = chalk; | ||
export default chalk; |
Sorry, the diff of this file is not supported yet
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
Major refactor
Supply chain riskPackage has recently undergone a major refactor. It may be unstable or indicate significant internal changes. Use caution when updating to versions that include significant changes.
Found 1 instance in 1 package
License Policy Violation
LicenseThis package is not allowed per your license policy. Review the package's license to ensure compliance.
Found 1 instance in 1 package
41306
0
12
988
Yes
10
318
1
- Removedansi-styles@^4.1.0
- Removedsupports-color@^7.1.0
- Removedansi-styles@4.3.0(transitive)
- Removedcolor-convert@2.0.1(transitive)
- Removedcolor-name@1.1.4(transitive)
- Removedhas-flag@4.0.0(transitive)
- Removedsupports-color@7.2.0(transitive)