From 445092f9af0a0c71070c3acc435340a9278e67f1 Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Wed, 9 Sep 2020 17:48:28 +0200 Subject: [PATCH 01/71] Update readme.md --- readme.md | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/readme.md b/readme.md index 338f42c..c1d4ebc 100644 --- a/readme.md +++ b/readme.md @@ -13,6 +13,30 @@ +
+ +--- + +
+

+

+ + Sindre Sorhus' open source work is supported by the community + +

+ Special thanks to: +
+
+ + + +

+
+ +--- + +
+ ## Highlights - Expressive API From b31d6fb48a570d9be48044abe656c36dcac094e4 Mon Sep 17 00:00:00 2001 From: Richie Bendall Date: Sun, 4 Oct 2020 10:55:17 +1300 Subject: [PATCH 02/71] Add browser support information (#415) --- readme.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/readme.md b/readme.md index c1d4ebc..e4ac487 100644 --- a/readme.md +++ b/readme.md @@ -280,6 +280,10 @@ The following color models can be used: - [`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 If you're on Windows, do yourself a favor and use [Windows Terminal](https://github.com/microsoft/terminal) instead of `cmd.exe`. From c0d8e7ed8a3ec549c81597fc06163276142d948d Mon Sep 17 00:00:00 2001 From: Richie Bendall Date: Sun, 4 Oct 2020 10:56:24 +1300 Subject: [PATCH 03/71] Update test dependencies (#414) --- examples/rainbow.js | 4 +++- index.d.ts | 32 ++++++++++++++++---------------- index.test-d.ts | 38 +++++++++++++++++++------------------- package.json | 12 ++++++------ source/templates.js | 4 ++-- test/instance.js | 4 ++-- test/template-literal.js | 2 +- 7 files changed, 49 insertions(+), 47 deletions(-) diff --git a/examples/rainbow.js b/examples/rainbow.js index 813e026..6e0664c 100644 --- a/examples/rainbow.js +++ b/examples/rainbow.js @@ -3,7 +3,9 @@ const chalk = require('..'); const ignoreChars = /[^!-~]/g; -const delay = milliseconds => new Promise(resolve => setTimeout(resolve, milliseconds)); +const delay = milliseconds => new Promise(resolve => { + setTimeout(resolve, milliseconds); +}); function rainbow(string, offset) { if (!string || string.length === 0) { diff --git a/index.d.ts b/index.d.ts index 9cd88f3..8fa375f 100644 --- a/index.d.ts +++ b/index.d.ts @@ -181,7 +181,7 @@ declare namespace chalk { chalk.hex('#DEADED'); ``` */ - hex(color: string): Chalk; + hex: (color: string) => Chalk; /** Use keyword color value to set text color. @@ -195,27 +195,27 @@ declare namespace chalk { chalk.keyword('orange'); ``` */ - keyword(color: string): Chalk; + keyword: (color: string) => Chalk; /** Use RGB values to set text color. */ - rgb(red: number, green: number, blue: number): Chalk; + rgb: (red: number, green: number, blue: number) => Chalk; /** Use HSL values to set text color. */ - hsl(hue: number, saturation: number, lightness: number): Chalk; + hsl: (hue: number, saturation: number, lightness: number) => Chalk; /** Use HSV values to set text color. */ - hsv(hue: number, saturation: number, value: number): Chalk; + hsv: (hue: number, saturation: number, value: number) => Chalk; /** Use HWB values to set text color. */ - hwb(hue: number, whiteness: number, blackness: number): Chalk; + hwb: (hue: number, whiteness: number, blackness: number) => Chalk; /** Use a [Select/Set Graphic Rendition](https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters) (SGR) [color code number](https://en.wikipedia.org/wiki/ANSI_escape_code#3/4_bit) to set text color. @@ -223,12 +223,12 @@ declare namespace chalk { 30 <= code && code < 38 || 90 <= code && code < 98 For example, 31 for red, 91 for redBright. */ - ansi(code: number): Chalk; + ansi: (code: number) => Chalk; /** Use a [8-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) to set text color. */ - ansi256(index: number): Chalk; + ansi256: (index: number) => Chalk; /** Use HEX value to set background color. @@ -242,7 +242,7 @@ declare namespace chalk { chalk.bgHex('#DEADED'); ``` */ - bgHex(color: string): Chalk; + bgHex: (color: string) => Chalk; /** Use keyword color value to set background color. @@ -256,27 +256,27 @@ declare namespace chalk { chalk.bgKeyword('orange'); ``` */ - bgKeyword(color: string): Chalk; + bgKeyword: (color: string) => Chalk; /** Use RGB values to set background color. */ - bgRgb(red: number, green: number, blue: number): Chalk; + bgRgb: (red: number, green: number, blue: number) => Chalk; /** Use HSL values to set background color. */ - bgHsl(hue: number, saturation: number, lightness: number): Chalk; + bgHsl: (hue: number, saturation: number, lightness: number) => Chalk; /** Use HSV values to set background color. */ - bgHsv(hue: number, saturation: number, value: number): Chalk; + bgHsv: (hue: number, saturation: number, value: number) => Chalk; /** Use HWB values to set background color. */ - bgHwb(hue: number, whiteness: number, blackness: number): Chalk; + bgHwb: (hue: number, whiteness: number, blackness: number) => Chalk; /** Use a [Select/Set Graphic Rendition](https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters) (SGR) [color code number](https://en.wikipedia.org/wiki/ANSI_escape_code#3/4_bit) to set background color. @@ -285,12 +285,12 @@ declare namespace chalk { For example, 31 for red, 91 for redBright. Use the foreground code, not the background code (for example, not 41, nor 101). */ - bgAnsi(code: number): Chalk; + bgAnsi: (code: number) => Chalk; /** Use a [8-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) to set background color. */ - bgAnsi256(index: number): Chalk; + bgAnsi256: (index: number) => Chalk; /** Modifier: Resets the current color chain. diff --git a/index.test-d.ts b/index.test-d.ts index aa9e2f5..ba91b63 100644 --- a/index.test-d.ts +++ b/index.test-d.ts @@ -1,4 +1,4 @@ -import {expectType, expectError} from 'tsd'; +import {expectType, expectAssignable, expectError} from 'tsd'; import chalk = require('.'); // - Helpers - @@ -13,7 +13,7 @@ if (chalk.supportsColor) { } // - stderr - -expectType(chalk.stderr); +expectAssignable(chalk.stderr); expectType(chalk.stderr.supportsColor); if (chalk.stderr.supportsColor) { expectType(chalk.stderr.supportsColor.hasBasic); @@ -41,22 +41,22 @@ expectType(chalk`Hello {bold.red ${name}}`); expectType(chalk`Works with numbers {bold.red ${1}}`); // -- Color methods -- -expectType(chalk.hex('#DEADED')); -expectType(chalk.keyword('orange')); -expectType(chalk.rgb(0, 0, 0)); -expectType(chalk.hsl(0, 0, 0)); -expectType(chalk.hsv(0, 0, 0)); -expectType(chalk.hwb(0, 0, 0)); -expectType(chalk.ansi(30)); -expectType(chalk.ansi256(0)); -expectType(chalk.bgHex('#DEADED')); -expectType(chalk.bgKeyword('orange')); -expectType(chalk.bgRgb(0, 0, 0)); -expectType(chalk.bgHsl(0, 0, 0)); -expectType(chalk.bgHsv(0, 0, 0)); -expectType(chalk.bgHwb(0, 0, 0)); -expectType(chalk.bgAnsi(30)); -expectType(chalk.bgAnsi256(0)); +expectAssignable(chalk.hex('#DEADED')); +expectAssignable(chalk.keyword('orange')); +expectAssignable(chalk.rgb(0, 0, 0)); +expectAssignable(chalk.hsl(0, 0, 0)); +expectAssignable(chalk.hsv(0, 0, 0)); +expectAssignable(chalk.hwb(0, 0, 0)); +expectAssignable(chalk.ansi(30)); +expectAssignable(chalk.ansi256(0)); +expectAssignable(chalk.bgHex('#DEADED')); +expectAssignable(chalk.bgKeyword('orange')); +expectAssignable(chalk.bgRgb(0, 0, 0)); +expectAssignable(chalk.bgHsl(0, 0, 0)); +expectAssignable(chalk.bgHsv(0, 0, 0)); +expectAssignable(chalk.bgHwb(0, 0, 0)); +expectAssignable(chalk.bgAnsi(30)); +expectAssignable(chalk.bgAnsi256(0)); // -- Modifiers -- expectType(chalk.reset('foo')); @@ -158,5 +158,5 @@ expectType(chalk.red.bgGreen.bold`Hello {italic.blue ${name}}`); expectType(chalk.strikethrough.cyanBright.bgBlack`Works with {reset {bold numbers}} {bold.red ${1}}`); // -- Color types == -expectType('red'); +expectAssignable('red'); expectError('hotpink'); diff --git a/package.json b/package.json index 0d99f0f..7a3bd25 100644 --- a/package.json +++ b/package.json @@ -46,14 +46,14 @@ }, "devDependencies": { "ava": "^2.4.0", - "coveralls": "^3.0.7", - "execa": "^4.0.0", - "import-fresh": "^3.1.0", + "coveralls": "^3.1.0", + "execa": "^4.0.3", + "import-fresh": "^3.2.1", "matcha": "^0.7.0", - "nyc": "^15.0.0", + "nyc": "^15.1.0", "resolve-from": "^5.0.0", - "tsd": "^0.7.4", - "xo": "^0.28.2" + "tsd": "^0.13.1", + "xo": "^0.33.1" }, "xo": { "rules": { diff --git a/source/templates.js b/source/templates.js index b130949..bfdaba8 100644 --- a/source/templates.js +++ b/source/templates.js @@ -22,11 +22,11 @@ function unescape(c) { const bracket = c[1] === '{'; if ((u && !bracket && c.length === 5) || (c[0] === 'x' && c.length === 3)) { - return String.fromCharCode(parseInt(c.slice(1), 16)); + return String.fromCharCode(Number.parseInt(c.slice(1), 16)); } if (u && bracket) { - return String.fromCodePoint(parseInt(c.slice(2, -1), 16)); + return String.fromCodePoint(Number.parseInt(c.slice(2, -1), 16)); } return ESCAPES.get(c) || c; diff --git a/test/instance.js b/test/instance.js index e936333..37c72eb 100644 --- a/test/instance.js +++ b/test/instance.js @@ -17,10 +17,10 @@ test('the `level` option should be a number from 0 to 3', t => { /* eslint-disable no-new */ t.throws(() => { new chalk.Instance({level: 10}); - }, /should be an integer from 0 to 3/); + }, {message: /should be an integer from 0 to 3/}); t.throws(() => { new chalk.Instance({level: -1}); - }, /should be an integer from 0 to 3/); + }, {message: /should be an integer from 0 to 3/}); /* eslint-enable no-new */ }); diff --git a/test/template-literal.js b/test/template-literal.js index 2f75e03..c918a5b 100644 --- a/test/template-literal.js +++ b/test/template-literal.js @@ -179,7 +179,7 @@ test('throws if an extra unescaped } is found', t => { test('should not parse upper-case escapes', t => { const instance = new chalk.Instance({level: 0}); - t.is(instance`\N\n\T\t\X07\x07\U000A\u000A\U000a\u000a`, 'N\nT\tX07\x07U000A\u000AU000a\u000A'); + t.is(instance`\N\n\T\t\X07\x07\U000A\u000A\U000a\u000A`, 'N\nT\tX07\x07U000A\u000AU000a\u000A'); }); test('should properly handle undefined template interpolated values', t => { From 72299f99a0f785128b3b974afac7d8a9bccbeb4a Mon Sep 17 00:00:00 2001 From: Toon Baeyens Date: Fri, 20 Nov 2020 15:26:28 +0100 Subject: [PATCH 04/71] remove fixed number of iterations (#406) --- benchmark.js | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/benchmark.js b/benchmark.js index 25b3f5d..98ee5ee 100644 --- a/benchmark.js +++ b/benchmark.js @@ -1,10 +1,8 @@ -/* globals suite, set, bench */ +/* globals suite, bench */ 'use strict'; const chalk = require('.'); suite('chalk', () => { - set('iterations', 1000000); - const chalkRed = chalk.red; const chalkBgRed = chalk.bgRed; const chalkBlueBgRed = chalk.blue.bgRed; @@ -48,8 +46,6 @@ suite('chalk', () => { chalkBgRed(blueStyledString); }); - set('iterations', 10000); - bench('cached: 1 style template literal', () => { // eslint-disable-next-line no-unused-expressions chalkRed`the fox jumps over the lazy dog`; From 02abeebac3fa41b346ad1f0b4674d371953da932 Mon Sep 17 00:00:00 2001 From: Richie Bendall Date: Sun, 22 Nov 2020 02:07:13 +1300 Subject: [PATCH 05/71] Only iterate through models once (#421) --- source/index.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/source/index.js b/source/index.js index 75ec663..6313bde 100644 --- a/source/index.js +++ b/source/index.js @@ -87,9 +87,7 @@ for (const model of usedModels) { }; } }; -} -for (const model of usedModels) { const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1); styles[bgModel] = { get() { From e304e8c2302c5fc3a1705756640a3bee94dec857 Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Tue, 8 Dec 2020 21:43:19 +0700 Subject: [PATCH 06/71] Add Dev badge --- readme.md | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/readme.md b/readme.md index e4ac487..f0e2eb5 100644 --- a/readme.md +++ b/readme.md @@ -9,7 +9,11 @@ > Terminal string styling done right -[![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) +[![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) +[![run on repl.it](https://repl.it/badge/github/chalk/chalk)](https://repl.it/github/chalk/chalk) +[![Stake to support us](https://badge.devprotocol.xyz/0x44d871aebF0126Bf646753E2C976Aa7e68A66c15)](https://stakes.social/0x44d871aebF0126Bf646753E2C976Aa7e68A66c15) @@ -21,7 +25,7 @@

- Sindre Sorhus' open source work is supported by the community + Sindre Sorhus' open source work is supported by the community on GitHub Sponsors and Dev

Special thanks to: From ca330532ecfb83e46efa9e94d1c0630a058ff1ba Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Wed, 16 Dec 2020 10:09:08 +0700 Subject: [PATCH 07/71] Add @Qix- to funding.yml --- .github/funding.yml | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/.github/funding.yml b/.github/funding.yml index baa12cf..5692ede 100644 --- a/.github/funding.yml +++ b/.github/funding.yml @@ -1,5 +1,4 @@ -github: sindresorhus +github: [sindresorhus,Qix-] open_collective: sindresorhus -patreon: sindresorhus tidelift: npm/chalk custom: https://sindresorhus.com/donate From d5fb377019c26e3beae55f97906c4fd1bec30402 Mon Sep 17 00:00:00 2001 From: Richie Bendall Date: Sun, 3 Jan 2021 02:38:53 +1300 Subject: [PATCH 08/71] Move to GitHub Actions (#426) * Move to GitHub Actions * Update readme.md --- .github/workflows/main.yml | 22 ++++++++++++++++++++++ .travis.yml | 6 ------ readme.md | 1 - 3 files changed, 22 insertions(+), 7 deletions(-) create mode 100644 .github/workflows/main.yml delete mode 100644 .travis.yml diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml new file mode 100644 index 0000000..c1870cf --- /dev/null +++ b/.github/workflows/main.yml @@ -0,0 +1,22 @@ +name: CI +on: + - push + - pull_request +jobs: + test: + name: Node.js ${{ matrix.node-version }} + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + node-version: + - 14 + - 12 + - 10 + steps: + - uses: actions/checkout@v2 + - uses: actions/setup-node@v1 + with: + node-version: ${{ matrix.node-version }} + - run: npm install + - run: npm test diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index fd301d7..0000000 --- a/.travis.yml +++ /dev/null @@ -1,6 +0,0 @@ -language: node_js -node_js: - - '12' - - '10' -after_success: - - './node_modules/.bin/nyc report --reporter=text-lcov | ./node_modules/.bin/coveralls' diff --git a/readme.md b/readme.md index f0e2eb5..e8fe039 100644 --- a/readme.md +++ b/readme.md @@ -9,7 +9,6 @@ > Terminal string styling done right -[![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) [![run on repl.it](https://repl.it/badge/github/chalk/chalk)](https://repl.it/github/chalk/chalk) From 0433fcff2af28a64cc4e07345b0e78cb664142ea Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Wed, 20 Jan 2021 14:45:02 +0700 Subject: [PATCH 09/71] Update a link --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index e8fe039..18a0554 100644 --- a/readme.md +++ b/readme.md @@ -30,7 +30,7 @@ Special thanks to:

- +

From 97a08618485d25cee6c62712584648f838777727 Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Thu, 21 Jan 2021 10:19:50 +0700 Subject: [PATCH 10/71] Update badge --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 18a0554..ba83864 100644 --- a/readme.md +++ b/readme.md @@ -12,7 +12,7 @@ [![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) [![run on repl.it](https://repl.it/badge/github/chalk/chalk)](https://repl.it/github/chalk/chalk) -[![Stake to support us](https://badge.devprotocol.xyz/0x44d871aebF0126Bf646753E2C976Aa7e68A66c15)](https://stakes.social/0x44d871aebF0126Bf646753E2C976Aa7e68A66c15) +[![Support Chalk on DEV](https://badge.devprotocol.xyz/0x44d871aebF0126Bf646753E2C976Aa7e68A66c15/descriptive)](https://stakes.social/0x44d871aebF0126Bf646753E2C976Aa7e68A66c15) From 2a9abb18f4c33b71fbda25be0f3de53bd86eef31 Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Sun, 24 Jan 2021 14:27:41 +0700 Subject: [PATCH 11/71] Rename `master` branch to `main` --- index.d.ts | 6 +++--- readme.md | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/index.d.ts b/index.d.ts index 8fa375f..ddaf8d4 100644 --- a/index.d.ts +++ b/index.d.ts @@ -1,7 +1,7 @@ /** Basic foreground colors. -[More colors here.](https://github.com/chalk/chalk/blob/master/readme.md#256-and-truecolor-color-support) +[More colors here.](https://github.com/chalk/chalk/blob/main/readme.md#256-and-truecolor-color-support) */ declare type ForegroundColor = | 'black' @@ -26,7 +26,7 @@ declare type ForegroundColor = /** Basic background colors. -[More colors here.](https://github.com/chalk/chalk/blob/master/readme.md#256-and-truecolor-color-support) +[More colors here.](https://github.com/chalk/chalk/blob/main/readme.md#256-and-truecolor-color-support) */ declare type BackgroundColor = | 'bgBlack' @@ -51,7 +51,7 @@ declare type BackgroundColor = /** Basic colors. -[More colors here.](https://github.com/chalk/chalk/blob/master/readme.md#256-and-truecolor-color-support) +[More colors here.](https://github.com/chalk/chalk/blob/main/readme.md#256-and-truecolor-color-support) */ declare type Color = ForegroundColor | BackgroundColor; diff --git a/readme.md b/readme.md index ba83864..eeaac7c 100644 --- a/readme.md +++ b/readme.md @@ -9,7 +9,7 @@ > Terminal string styling done right -[![Coverage Status](https://coveralls.io/repos/github/chalk/chalk/badge.svg?branch=master)](https://coveralls.io/github/chalk/chalk?branch=master) +[![Coverage Status](https://coveralls.io/repos/github/chalk/chalk/badge.svg?branch=main)](https://coveralls.io/github/chalk/chalk?branch=main) [![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) From 9bf298571eeee20001ba9ff5158b07d2d8a67ec1 Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Sat, 30 Jan 2021 16:59:16 +0700 Subject: [PATCH 12/71] Meta tweaks --- readme.md | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/readme.md b/readme.md index eeaac7c..f1c9b9e 100644 --- a/readme.md +++ b/readme.md @@ -31,7 +31,12 @@

- + + +
+
+ +

From 4dab5e1fb6f42c6c9fdacbe34b9dafd24359208e Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Sat, 13 Mar 2021 00:51:42 +0700 Subject: [PATCH 13/71] Meta tweaks --- readme.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/readme.md b/readme.md index f1c9b9e..4867321 100644 --- a/readme.md +++ b/readme.md @@ -38,6 +38,19 @@ +
+
+ +
+ Doppler +
+ All your environment variables, in one place +
+ Stop struggling with scattered API keys, hacking together home-brewed tools, +
+ and avoiding access controls. Keep your team and servers in sync with Doppler. +
+

From fa16f4ec37c1c25bda6ca1864bf53ecd3ea3d3c9 Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Fri, 16 Apr 2021 15:23:29 +0700 Subject: [PATCH 14/71] Require Node.js 12 and move to ESM --- .github/funding.yml | 2 +- .github/workflows/main.yml | 3 +- benchmark.js | 3 +- examples/rainbow.js | 9 +- examples/screenshot.js | 5 +- index.d.ts | 550 ++++++++++++++++++------------------- index.test-d.ts | 18 +- license | 2 +- package.json | 21 +- readme.md | 17 +- source/index.js | 20 +- source/templates.js | 11 +- source/util.js | 19 +- test/_fixture.js | 3 +- test/_supports-color.js | 21 -- test/chalk.js | 7 +- test/constructor.js | 3 +- test/instance.js | 6 +- test/level.js | 10 +- test/no-color-support.js | 32 +-- test/template-literal.js | 6 +- test/visible.js | 6 +- 22 files changed, 362 insertions(+), 412 deletions(-) delete mode 100644 test/_supports-color.js diff --git a/.github/funding.yml b/.github/funding.yml index 5692ede..1cd069f 100644 --- a/.github/funding.yml +++ b/.github/funding.yml @@ -1,4 +1,4 @@ -github: [sindresorhus,Qix-] +github: [sindresorhus, Qix-] open_collective: sindresorhus tidelift: npm/chalk custom: https://sindresorhus.com/donate diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index c1870cf..d36e1a8 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -12,10 +12,9 @@ jobs: node-version: - 14 - 12 - - 10 steps: - uses: actions/checkout@v2 - - uses: actions/setup-node@v1 + - uses: actions/setup-node@v2 with: node-version: ${{ matrix.node-version }} - run: npm install diff --git a/benchmark.js b/benchmark.js index 98ee5ee..c5c6e27 100644 --- a/benchmark.js +++ b/benchmark.js @@ -1,6 +1,5 @@ /* globals suite, bench */ -'use strict'; -const chalk = require('.'); +import chalk from './index.js'; suite('chalk', () => { const chalkRed = chalk.red; diff --git a/examples/rainbow.js b/examples/rainbow.js index 6e0664c..67dd236 100644 --- a/examples/rainbow.js +++ b/examples/rainbow.js @@ -1,5 +1,4 @@ -'use strict'; -const chalk = require('..'); +import chalk from '../index.js'; const ignoreChars = /[^!-~]/g; @@ -17,7 +16,7 @@ function rainbow(string, offset) { let hue = offset % 360; const characters = []; for (const character of string) { - if (character.match(ignoreChars)) { + if (ignoreChars.test(character)) { characters.push(character); } else { characters.push(chalk.hsl(hue, 100, 50)(character)); @@ -30,8 +29,8 @@ function rainbow(string, offset) { async function animateString(string) { console.log(); - for (let i = 0; i < 360 * 5; i++) { - console.log('\u001B[1F\u001B[G', rainbow(string, i)); + for (let index = 0; index < 360 * 5; index++) { + console.log('\u001B[1F\u001B[G', rainbow(string, index)); await delay(2); // eslint-disable-line no-await-in-loop } } diff --git a/examples/screenshot.js b/examples/screenshot.js index fc64030..ea61e0c 100644 --- a/examples/screenshot.js +++ b/examples/screenshot.js @@ -1,6 +1,5 @@ -'use strict'; -const styles = require('ansi-styles'); -const chalk = require('..'); +import styles from 'ansi-styles'; +import chalk from '../index.js'; // Generates screenshot for (const key of Object.keys(styles)) { diff --git a/index.d.ts b/index.d.ts index ddaf8d4..268ab75 100644 --- a/index.d.ts +++ b/index.d.ts @@ -3,7 +3,7 @@ Basic foreground colors. [More colors here.](https://github.com/chalk/chalk/blob/main/readme.md#256-and-truecolor-color-support) */ -declare type ForegroundColor = +export type ForegroundColor = | 'black' | 'red' | 'green' @@ -28,7 +28,7 @@ Basic background colors. [More colors here.](https://github.com/chalk/chalk/blob/main/readme.md#256-and-truecolor-color-support) */ -declare type BackgroundColor = +export type BackgroundColor = | 'bgBlack' | 'bgRed' | 'bgGreen' @@ -53,9 +53,9 @@ Basic colors. [More colors here.](https://github.com/chalk/chalk/blob/main/readme.md#256-and-truecolor-color-support) */ -declare type Color = ForegroundColor | BackgroundColor; +export type Color = ForegroundColor | BackgroundColor; -declare type Modifiers = +export type Modifiers = | 'reset' | 'bold' | 'dim' @@ -66,350 +66,346 @@ declare type Modifiers = | 'strikethrough' | 'visible'; -declare namespace chalk { +/** +Levels: +- `0` - All colors disabled. +- `1` - Basic 16 colors support. +- `2` - ANSI 256 colors support. +- `3` - Truecolor 16 million colors support. +*/ +export type ColorSupportLevel = 0 | 1 | 2 | 3; + +export interface Options { /** + Specify the color support for Chalk. + + By default, color support is automatically detected based on the environment. + Levels: - `0` - All colors disabled. - `1` - Basic 16 colors support. - `2` - ANSI 256 colors support. - `3` - Truecolor 16 million colors support. */ - type Level = 0 | 1 | 2 | 3; + readonly level?: ColorSupportLevel; +} - interface Options { - /** - Specify the color support for Chalk. +/** +Return a new Chalk instance. +*/ +export type ChalkInstance = new (options?: Options) => Chalk; - By default, color support is automatically detected based on the environment. +/** +Detect whether the terminal supports color. +*/ +export interface ColorSupport { + /** + The color level used by Chalk. + */ + level: ColorSupportLevel; - Levels: - - `0` - All colors disabled. - - `1` - Basic 16 colors support. - - `2` - ANSI 256 colors support. - - `3` - Truecolor 16 million colors support. - */ - level?: Level; - } + /** + Return whether Chalk supports basic 16 colors. + */ + hasBasic: boolean; + /** + Return whether Chalk supports ANSI 256 colors. + */ + has256: boolean; + + /** + Return whether Chalk supports Truecolor 16 million colors. + */ + has16m: boolean; +} + +interface ChalkFunction { + /** + Use a template string. + + @remarks Template literals are unsupported for nested calls (see [issue #341](https://github.com/chalk/chalk/issues/341)) + + @example + ``` + import chalk from 'chalk'; + + log(chalk` + CPU: {red ${cpu.totalPercent}%} + RAM: {green ${ram.used / ram.total * 100}%} + DISK: {rgb(255,131,0) ${disk.used / disk.total * 100}%} + `); + ``` + + @example + ``` + import chalk from 'chalk'; + + log(chalk.red.bgBlack`2 + 3 = {bold ${2 + 3}}`) + ``` + */ + (text: TemplateStringsArray, ...placeholders: unknown[]): string; + + (...text: unknown[]): string; +} + +export interface Chalk extends ChalkFunction { /** Return a new Chalk instance. */ - type Instance = new (options?: Options) => Chalk; + Instance: ChalkInstance; /** - Detect whether the terminal supports color. + The color support for Chalk. + + By default, color support is automatically detected based on the environment. + + Levels: + - `0` - All colors disabled. + - `1` - Basic 16 colors support. + - `2` - ANSI 256 colors support. + - `3` - Truecolor 16 million colors support. */ - interface ColorSupport { - /** - The color level used by Chalk. - */ - level: Level; + level: ColorSupportLevel; - /** - Return whether Chalk supports basic 16 colors. - */ - hasBasic: boolean; + /** + Use HEX value to set text color. - /** - Return whether Chalk supports ANSI 256 colors. - */ - has256: boolean; + @param color - Hexadecimal value representing the desired color. - /** - Return whether Chalk supports Truecolor 16 million colors. - */ - has16m: boolean; - } + @example + ``` + import chalk from 'chalk'; - interface ChalkFunction { - /** - Use a template string. + chalk.hex('#DEADED'); + ``` + */ + hex: (color: string) => Chalk; - @remarks Template literals are unsupported for nested calls (see [issue #341](https://github.com/chalk/chalk/issues/341)) + /** + Use keyword color value to set text color. - @example - ``` - import chalk = require('chalk'); + @param color - Keyword value representing the desired color. - log(chalk` - CPU: {red ${cpu.totalPercent}%} - RAM: {green ${ram.used / ram.total * 100}%} - DISK: {rgb(255,131,0) ${disk.used / disk.total * 100}%} - `); - ``` + @example + ``` + import chalk from 'chalk'; - @example - ``` - import chalk = require('chalk'); + chalk.keyword('orange'); + ``` + */ + keyword: (color: string) => Chalk; - log(chalk.red.bgBlack`2 + 3 = {bold ${2 + 3}}`) - ``` - */ - (text: TemplateStringsArray, ...placeholders: unknown[]): string; + /** + Use RGB values to set text color. + */ + rgb: (red: number, green: number, blue: number) => Chalk; - (...text: unknown[]): string; - } + /** + Use HSL values to set text color. + */ + hsl: (hue: number, saturation: number, lightness: number) => Chalk; - interface Chalk extends ChalkFunction { - /** - Return a new Chalk instance. - */ - Instance: Instance; + /** + Use HSV values to set text color. + */ + hsv: (hue: number, saturation: number, value: number) => Chalk; - /** - The color support for Chalk. + /** + Use HWB values to set text color. + */ + hwb: (hue: number, whiteness: number, blackness: number) => Chalk; - By default, color support is automatically detected based on the environment. + /** + Use a [Select/Set Graphic Rendition](https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters) (SGR) [color code number](https://en.wikipedia.org/wiki/ANSI_escape_code#3/4_bit) to set text color. - Levels: - - `0` - All colors disabled. - - `1` - Basic 16 colors support. - - `2` - ANSI 256 colors support. - - `3` - Truecolor 16 million colors support. - */ - level: Level; + 30 <= code && code < 38 || 90 <= code && code < 98 + For example, 31 for red, 91 for redBright. + */ + ansi: (code: number) => Chalk; - /** - Use HEX value to set text color. + /** + Use a [8-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) to set text color. + */ + ansi256: (index: number) => Chalk; - @param color - Hexadecimal value representing the desired color. + /** + Use HEX value to set background color. - @example - ``` - import chalk = require('chalk'); + @param color - Hexadecimal value representing the desired color. - chalk.hex('#DEADED'); - ``` - */ - hex: (color: string) => Chalk; + @example + ``` + import chalk from 'chalk'; - /** - Use keyword color value to set text color. + chalk.bgHex('#DEADED'); + ``` + */ + bgHex: (color: string) => Chalk; - @param color - Keyword value representing the desired color. + /** + Use keyword color value to set background color. - @example - ``` - import chalk = require('chalk'); + @param color - Keyword value representing the desired color. - chalk.keyword('orange'); - ``` - */ - keyword: (color: string) => Chalk; + @example + ``` + import chalk from 'chalk'; - /** - Use RGB values to set text color. - */ - rgb: (red: number, green: number, blue: number) => Chalk; + chalk.bgKeyword('orange'); + ``` + */ + bgKeyword: (color: string) => Chalk; - /** - Use HSL values to set text color. - */ - hsl: (hue: number, saturation: number, lightness: number) => Chalk; + /** + Use RGB values to set background color. + */ + bgRgb: (red: number, green: number, blue: number) => Chalk; - /** - Use HSV values to set text color. - */ - hsv: (hue: number, saturation: number, value: number) => Chalk; + /** + Use HSL values to set background color. + */ + bgHsl: (hue: number, saturation: number, lightness: number) => Chalk; - /** - Use HWB values to set text color. - */ - hwb: (hue: number, whiteness: number, blackness: number) => Chalk; + /** + Use HSV values to set background color. + */ + bgHsv: (hue: number, saturation: number, value: number) => Chalk; - /** - Use a [Select/Set Graphic Rendition](https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters) (SGR) [color code number](https://en.wikipedia.org/wiki/ANSI_escape_code#3/4_bit) to set text color. + /** + Use HWB values to set background color. + */ + bgHwb: (hue: number, whiteness: number, blackness: number) => Chalk; - 30 <= code && code < 38 || 90 <= code && code < 98 - For example, 31 for red, 91 for redBright. - */ - ansi: (code: number) => Chalk; + /** + Use a [Select/Set Graphic Rendition](https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters) (SGR) [color code number](https://en.wikipedia.org/wiki/ANSI_escape_code#3/4_bit) to set background color. - /** - Use a [8-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) to set text color. - */ - ansi256: (index: number) => Chalk; + 30 <= code && code < 38 || 90 <= code && code < 98 + For example, 31 for red, 91 for redBright. + Use the foreground code, not the background code (for example, not 41, nor 101). + */ + bgAnsi: (code: number) => Chalk; - /** - Use HEX value to set background color. + /** + Use a [8-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) to set background color. + */ + bgAnsi256: (index: number) => Chalk; - @param color - Hexadecimal value representing the desired color. + /** + Modifier: Resets the current color chain. + */ + readonly reset: Chalk; - @example - ``` - import chalk = require('chalk'); + /** + Modifier: Make text bold. + */ + readonly bold: Chalk; - chalk.bgHex('#DEADED'); - ``` - */ - bgHex: (color: string) => Chalk; + /** + Modifier: Emitting only a small amount of light. + */ + readonly dim: Chalk; - /** - Use keyword color value to set background color. + /** + Modifier: Make text italic. (Not widely supported) + */ + readonly italic: Chalk; - @param color - Keyword value representing the desired color. + /** + Modifier: Make text underline. (Not widely supported) + */ + readonly underline: Chalk; - @example - ``` - import chalk = require('chalk'); + /** + Modifier: Inverse background and foreground colors. + */ + readonly inverse: Chalk; - chalk.bgKeyword('orange'); - ``` - */ - bgKeyword: (color: string) => Chalk; + /** + Modifier: Prints the text, but makes it invisible. + */ + readonly hidden: Chalk; - /** - Use RGB values to set background color. - */ - bgRgb: (red: number, green: number, blue: number) => Chalk; + /** + Modifier: Puts a horizontal line through the center of the text. (Not widely supported) + */ + readonly strikethrough: Chalk; - /** - Use HSL values to set background color. - */ - bgHsl: (hue: number, saturation: number, lightness: number) => Chalk; + /** + Modifier: Prints the text only when Chalk has a color support level > 0. + Can be useful for things that are purely cosmetic. + */ + readonly visible: Chalk; - /** - Use HSV values to set background color. - */ - bgHsv: (hue: number, saturation: number, value: number) => Chalk; + readonly black: Chalk; + readonly red: Chalk; + readonly green: Chalk; + readonly yellow: Chalk; + readonly blue: Chalk; + readonly magenta: Chalk; + readonly cyan: Chalk; + readonly white: Chalk; - /** - Use HWB values to set background color. - */ - bgHwb: (hue: number, whiteness: number, blackness: number) => Chalk; + /* + Alias for `blackBright`. + */ + readonly gray: Chalk; - /** - Use a [Select/Set Graphic Rendition](https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters) (SGR) [color code number](https://en.wikipedia.org/wiki/ANSI_escape_code#3/4_bit) to set background color. + /* + Alias for `blackBright`. + */ + readonly grey: Chalk; - 30 <= code && code < 38 || 90 <= code && code < 98 - For example, 31 for red, 91 for redBright. - Use the foreground code, not the background code (for example, not 41, nor 101). - */ - bgAnsi: (code: number) => Chalk; + readonly blackBright: Chalk; + readonly redBright: Chalk; + readonly greenBright: Chalk; + readonly yellowBright: Chalk; + readonly blueBright: Chalk; + readonly magentaBright: Chalk; + readonly cyanBright: Chalk; + readonly whiteBright: Chalk; - /** - Use a [8-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) to set background color. - */ - bgAnsi256: (index: number) => Chalk; + readonly bgBlack: Chalk; + readonly bgRed: Chalk; + readonly bgGreen: Chalk; + readonly bgYellow: Chalk; + readonly bgBlue: Chalk; + readonly bgMagenta: Chalk; + readonly bgCyan: Chalk; + readonly bgWhite: Chalk; - /** - Modifier: Resets the current color chain. - */ - readonly reset: Chalk; + /* + Alias for `bgBlackBright`. + */ + readonly bgGray: Chalk; - /** - Modifier: Make text bold. - */ - readonly bold: Chalk; + /* + Alias for `bgBlackBright`. + */ + readonly bgGrey: Chalk; - /** - Modifier: Emitting only a small amount of light. - */ - readonly dim: Chalk; - - /** - Modifier: Make text italic. (Not widely supported) - */ - readonly italic: Chalk; - - /** - Modifier: Make text underline. (Not widely supported) - */ - readonly underline: Chalk; - - /** - Modifier: Inverse background and foreground colors. - */ - readonly inverse: Chalk; - - /** - Modifier: Prints the text, but makes it invisible. - */ - readonly hidden: Chalk; - - /** - Modifier: Puts a horizontal line through the center of the text. (Not widely supported) - */ - readonly strikethrough: Chalk; - - /** - Modifier: Prints the text only when Chalk has a color support level > 0. - Can be useful for things that are purely cosmetic. - */ - readonly visible: Chalk; - - readonly black: Chalk; - readonly red: Chalk; - readonly green: Chalk; - readonly yellow: Chalk; - readonly blue: Chalk; - readonly magenta: Chalk; - readonly cyan: Chalk; - readonly white: Chalk; - - /* - Alias for `blackBright`. - */ - readonly gray: Chalk; - - /* - Alias for `blackBright`. - */ - readonly grey: Chalk; - - readonly blackBright: Chalk; - readonly redBright: Chalk; - readonly greenBright: Chalk; - readonly yellowBright: Chalk; - readonly blueBright: Chalk; - readonly magentaBright: Chalk; - readonly cyanBright: Chalk; - readonly whiteBright: Chalk; - - readonly bgBlack: Chalk; - readonly bgRed: Chalk; - readonly bgGreen: Chalk; - readonly bgYellow: Chalk; - readonly bgBlue: Chalk; - readonly bgMagenta: Chalk; - readonly bgCyan: Chalk; - readonly bgWhite: Chalk; - - /* - Alias for `bgBlackBright`. - */ - readonly bgGray: Chalk; - - /* - Alias for `bgBlackBright`. - */ - readonly bgGrey: Chalk; - - readonly bgBlackBright: Chalk; - readonly bgRedBright: Chalk; - readonly bgGreenBright: Chalk; - readonly bgYellowBright: Chalk; - readonly bgBlueBright: Chalk; - readonly bgMagentaBright: Chalk; - readonly bgCyanBright: Chalk; - readonly bgWhiteBright: Chalk; - } + readonly bgBlackBright: Chalk; + readonly bgRedBright: Chalk; + readonly bgGreenBright: Chalk; + readonly bgYellowBright: Chalk; + readonly bgBlueBright: Chalk; + readonly bgMagentaBright: Chalk; + readonly bgCyanBright: Chalk; + readonly bgWhiteBright: Chalk; } /** Main Chalk object that allows to chain styles together. + 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 `chalk.red.yellow.green` is equivalent to `chalk.green`. */ -declare const chalk: chalk.Chalk & chalk.ChalkFunction & { - supportsColor: chalk.ColorSupport | false; - Level: chalk.Level; - Color: Color; - ForegroundColor: ForegroundColor; - BackgroundColor: BackgroundColor; - Modifiers: Modifiers; - stderr: chalk.Chalk & {supportsColor: chalk.ColorSupport | false}; +declare const chalk: Chalk & ChalkFunction & { + supportsColor: ColorSupport | false; + stderr: Chalk & {supportsColor: ColorSupport | false}; }; -export = chalk; +export default chalk; diff --git a/index.test-d.ts b/index.test-d.ts index ba91b63..292707e 100644 --- a/index.test-d.ts +++ b/index.test-d.ts @@ -1,11 +1,11 @@ import {expectType, expectAssignable, expectError} from 'tsd'; -import chalk = require('.'); +import chalk, {Chalk, Color, ColorSupport, ColorSupportLevel} from './index.js'; // - Helpers - -type colorReturn = chalk.Chalk & {supportsColor?: never}; +type colorReturn = Chalk & {supportsColor?: never}; // - supportsColor - -expectType(chalk.supportsColor); +expectType(chalk.supportsColor); if (chalk.supportsColor) { expectType(chalk.supportsColor.hasBasic); expectType(chalk.supportsColor.has256); @@ -13,8 +13,8 @@ if (chalk.supportsColor) { } // - stderr - -expectAssignable(chalk.stderr); -expectType(chalk.stderr.supportsColor); +expectAssignable(chalk.stderr); +expectType(chalk.stderr.supportsColor); if (chalk.stderr.supportsColor) { expectType(chalk.stderr.supportsColor.hasBasic); expectType(chalk.stderr.supportsColor.has256); @@ -29,10 +29,10 @@ expectError(chalk.reset.supportsColor); // - Chalk - // -- Instance -- -expectType(new chalk.Instance({level: 1})); +expectType(new chalk.Instance({level: 1})); // -- Properties -- -expectType(chalk.level); +expectType(chalk.level); // -- Template literal -- expectType(chalk``); @@ -158,5 +158,5 @@ expectType(chalk.red.bgGreen.bold`Hello {italic.blue ${name}}`); expectType(chalk.strikethrough.cyanBright.bgBlack`Works with {reset {bold numbers}} {bold.red ${1}}`); // -- Color types == -expectAssignable('red'); -expectError('hotpink'); +expectAssignable('red'); +expectError('hotpink'); diff --git a/license b/license index e7af2f7..fa7ceba 100644 --- a/license +++ b/license @@ -1,6 +1,6 @@ MIT License -Copyright (c) Sindre Sorhus (sindresorhus.com) +Copyright (c) Sindre Sorhus (https://sindresorhus.com) 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: diff --git a/package.json b/package.json index 7a3bd25..9e6f031 100644 --- a/package.json +++ b/package.json @@ -5,9 +5,10 @@ "license": "MIT", "repository": "chalk/chalk", "funding": "https://github.com/chalk/chalk?sponsor=1", - "main": "source", + "type": "module", + "exports": "./source/index.js", "engines": { - "node": ">=10" + "node": ">=12" }, "scripts": { "test": "xo && nyc ava && tsd", @@ -42,26 +43,20 @@ ], "dependencies": { "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "supports-color": "^9.0.0" }, "devDependencies": { - "ava": "^2.4.0", + "ava": "^3.15.0", "coveralls": "^3.1.0", - "execa": "^4.0.3", - "import-fresh": "^3.2.1", + "execa": "^5.0.0", "matcha": "^0.7.0", "nyc": "^15.1.0", - "resolve-from": "^5.0.0", - "tsd": "^0.13.1", - "xo": "^0.33.1" + "tsd": "^0.14.0", + "xo": "^0.38.2" }, "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" } } diff --git a/readme.md b/readme.md index 4867321..c48056c 100644 --- a/readme.md +++ b/readme.md @@ -79,7 +79,7 @@ $ npm install chalk ## Usage ```js -const chalk = require('chalk'); +import chalk from 'chalk'; console.log(chalk.blue('Hello world!')); ``` @@ -87,7 +87,8 @@ console.log(chalk.blue('Hello world!')); Chalk comes with an easy to use composable API where you just chain and nest the styles you want. ```js -const chalk = require('chalk'); +import chalk from 'chalk'; + const log = console.log; // Combine styled and normal strings @@ -132,7 +133,7 @@ log(chalk.hex('#DEADED').bold('Bold gray!')); Easily define your own themes: ```js -const chalk = require('chalk'); +import chalk from 'chalk'; const error = chalk.bold.red; const warning = chalk.keyword('orange'); @@ -144,6 +145,8 @@ console.log(warning('Warning!')); Take advantage of console.log [string substitution](https://nodejs.org/docs/latest/api/console.html#console_console_log_data_args): ```js +import chalk from 'chalk'; + const name = 'Sindre'; console.log(chalk.green('Hello %s'), name); //=> 'Hello Sindre' @@ -168,7 +171,9 @@ Color support is automatically detected, but you can override it by setting the If you need to change this in a reusable module, create a new instance: ```js -const ctx = new chalk.Instance({level: 0}); +import chalk from 'chalk'; + +const customChalk = new chalk.Instance({level: 0}); ``` | Level | Description | @@ -247,7 +252,7 @@ Explicit 256/Truecolor mode can be enabled using the `--color=256` and `--color= 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'); +import chalk from 'chalk'; const miles = 18; const calculateFeet = miles => miles * 5280; @@ -263,6 +268,8 @@ Blocks are delimited by an opening curly brace (`{`), a style, some content, and Template styles are chained exactly like normal Chalk styles. The following three statements are equivalent: ```js +import chalk from 'chalk'; + 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!}`); diff --git a/source/index.js b/source/index.js index 6313bde..9a9986d 100644 --- a/source/index.js +++ b/source/index.js @@ -1,11 +1,12 @@ -'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 { stringReplaceAll, stringEncaseCRLFWithFirstIndex -} = require('./util'); +} from './util.js'; +import template from './templates.js'; +const {stdout: stdoutColor, stderr: stderrColor} = supportsColor; const {isArray} = Array; // `supportsColor.level` → `ansiStyles.color[name]` mapping @@ -168,7 +169,7 @@ const applyStyle = (self, string) => { } const {openAll, closeAll} = styler; - if (string.indexOf('\u001B') !== -1) { + if (string.includes('\u001B')) { while (styler !== undefined) { // Replace any instances already present with a re-opening code // otherwise only the part of the string until said closing code @@ -190,7 +191,6 @@ const applyStyle = (self, string) => { return openAll + string + closeAll; }; -let template; const chalkTag = (chalk, ...strings) => { const [firstString] = strings; @@ -210,10 +210,6 @@ const chalkTag = (chalk, ...strings) => { ); } - if (template === undefined) { - template = require('./templates'); - } - return template(chalk, parts.join('')); }; @@ -224,4 +220,4 @@ 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; diff --git a/source/templates.js b/source/templates.js index bfdaba8..1a2f95c 100644 --- a/source/templates.js +++ b/source/templates.js @@ -1,4 +1,3 @@ -'use strict'; const TEMPLATE_REGEX = /(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi; const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g; const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/; @@ -62,7 +61,7 @@ function parseStyle(style) { if (matches[2]) { const args = parseArguments(name, matches[2]); - results.push([name].concat(args)); + results.push([name, ...args]); } else { results.push([name]); } @@ -96,7 +95,7 @@ function buildStyle(chalk, styles) { return current; } -module.exports = (chalk, temporary) => { +export default function template(chalk, temporary) { const styles = []; const chunks = []; let chunk = []; @@ -126,9 +125,9 @@ module.exports = (chalk, temporary) => { chunks.push(chunk.join('')); if (styles.length > 0) { - const errMessage = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`; - throw new Error(errMessage); + const errorMessage = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`; + throw new Error(errorMessage); } return chunks.join(''); -}; +} diff --git a/source/util.js b/source/util.js index ca466fd..4d8bc4a 100644 --- a/source/util.js +++ b/source/util.js @@ -1,6 +1,4 @@ -'use strict'; - -const stringReplaceAll = (string, substring, replacer) => { +export function stringReplaceAll(string, substring, replacer) { let index = string.indexOf(substring); if (index === -1) { return string; @@ -15,11 +13,11 @@ const stringReplaceAll = (string, substring, replacer) => { index = string.indexOf(substring, endIndex); } while (index !== -1); - returnValue += string.substr(endIndex); + returnValue += string.slice(endIndex); return returnValue; -}; +} -const stringEncaseCRLFWithFirstIndex = (string, prefix, postfix, index) => { +export function stringEncaseCRLFWithFirstIndex(string, prefix, postfix, index) { let endIndex = 0; let returnValue = ''; do { @@ -29,11 +27,6 @@ const stringEncaseCRLFWithFirstIndex = (string, prefix, postfix, index) => { index = string.indexOf('\n', endIndex); } while (index !== -1); - returnValue += string.substr(endIndex); + returnValue += string.slice(endIndex); return returnValue; -}; - -module.exports = { - stringReplaceAll, - stringEncaseCRLFWithFirstIndex -}; +} diff --git a/test/_fixture.js b/test/_fixture.js index 29f34b0..1a8e8ba 100644 --- a/test/_fixture.js +++ b/test/_fixture.js @@ -1,4 +1,3 @@ -'use strict'; -const chalk = require('../source'); +import chalk from '../source/index.js'; console.log(`${chalk.hex('#ff6159')('testout')} ${chalk.stderr.hex('#ff6159')('testerr')}`); diff --git a/test/_supports-color.js b/test/_supports-color.js deleted file mode 100644 index b5c0f78..0000000 --- a/test/_supports-color.js +++ /dev/null @@ -1,21 +0,0 @@ -'use strict'; -const resolveFrom = require('resolve-from'); - -const DEFAULT = { - stdout: { - level: 3, - hasBasic: true, - has256: true, - has16m: true - }, - stderr: { - level: 3, - hasBasic: true, - has256: true, - has16m: true - } -}; - -module.exports = (dir, override) => { - require.cache[resolveFrom(dir, 'supports-color')] = {exports: override || DEFAULT}; -}; diff --git a/test/chalk.js b/test/chalk.js index 4e78565..93e9c23 100644 --- a/test/chalk.js +++ b/test/chalk.js @@ -1,9 +1,8 @@ import test from 'ava'; +import chalk from '../source/index.js'; -// Spoof supports-color -require('./_supports-color')(__dirname); - -const chalk = require('../source'); +chalk.level = 3; +chalk.stderr.level = 3; console.log('TERM:', process.env.TERM || '[none]'); console.log('platform:', process.platform || '[unknown]'); diff --git a/test/constructor.js b/test/constructor.js index f4e9ca1..78ee070 100644 --- a/test/constructor.js +++ b/test/constructor.js @@ -1,6 +1,5 @@ import test from 'ava'; - -const chalk = require('../source'); +import chalk from '../source/index.js'; test('Chalk.constructor should throw an expected error', t => { const expectedError = t.throws(() => { diff --git a/test/instance.js b/test/instance.js index 37c72eb..c063109 100644 --- a/test/instance.js +++ b/test/instance.js @@ -1,9 +1,7 @@ import test from 'ava'; +import chalk from '../source/index.js'; -// Spoof supports-color -require('./_supports-color')(__dirname); - -const chalk = require('../source'); +chalk.level = 1; test('create an isolated context where colors can be disabled (by level)', t => { const instance = new chalk.Instance({level: 0}); diff --git a/test/level.js b/test/level.js index 65d4720..4aab162 100644 --- a/test/level.js +++ b/test/level.js @@ -1,11 +1,9 @@ -import path from 'path'; +import {fileURLToPath} from 'url'; import test from 'ava'; import execa from 'execa'; +import chalk from '../source/index.js'; -// Spoof supports-color -require('./_supports-color')(__dirname); - -const chalk = require('../source'); +chalk.level = 1; test('don\'t output colors when manually disabled', t => { const oldLevel = chalk.level; @@ -40,6 +38,6 @@ test('propagate enable/disable changes from child colors', t => { }); test('disable colors if they are not supported', async t => { - const {stdout} = await execa.node(path.join(__dirname, '_fixture')); + const {stdout} = await execa.node(fileURLToPath(new URL('./_fixture.js', import.meta.url))); t.is(stdout, 'testout testerr'); }); diff --git a/test/no-color-support.js b/test/no-color-support.js index ae88ac9..0a5734d 100644 --- a/test/no-color-support.js +++ b/test/no-color-support.js @@ -1,22 +1,22 @@ import test from 'ava'; +import chalk from '../source/index.js'; +// TODO: Do this when ESM supports loader hooks // Spoof supports-color -require('./_supports-color')(__dirname, { - stdout: { - level: 0, - hasBasic: false, - has256: false, - has16m: false - }, - stderr: { - level: 0, - hasBasic: false, - has256: false, - has16m: false - } -}); - -const chalk = require('../source'); +// require('./_supports-color')(__dirname, { +// stdout: { +// level: 0, +// hasBasic: false, +// has256: false, +// has16m: false +// }, +// stderr: { +// level: 0, +// hasBasic: false, +// has256: false, +// has16m: false +// } +// }); test('colors can be forced by using chalk.level', t => { chalk.level = 1; diff --git a/test/template-literal.js b/test/template-literal.js index c918a5b..95383c4 100644 --- a/test/template-literal.js +++ b/test/template-literal.js @@ -1,10 +1,8 @@ /* eslint-disable unicorn/no-hex-escape */ import test from 'ava'; +import chalk from '../source/index.js'; -// Spoof supports-color -require('./_supports-color')(__dirname); - -const chalk = require('../source'); +chalk.level = 1; test('return an empty string for an empty literal', t => { const instance = new chalk.Instance(); diff --git a/test/visible.js b/test/visible.js index 7987712..cd9e46d 100644 --- a/test/visible.js +++ b/test/visible.js @@ -1,9 +1,7 @@ import test from 'ava'; +import chalk from '../source/index.js'; -// Spoof supports-color -require('./_supports-color')(__dirname); - -const chalk = require('../source'); +chalk.level = 1; test('visible: normal output when level > 0', t => { const instance = new chalk.Instance({level: 3}); From d798222a5a3ff208782ce81f5fbd3babb286b3e3 Mon Sep 17 00:00:00 2001 From: Richie Bendall Date: Sun, 18 Apr 2021 00:33:03 +1200 Subject: [PATCH 15/71] Add named exports (#432) --- index.d.ts | 141 +++++++++++++++++++-------------------- index.test-d.ts | 32 ++++----- readme.md | 10 +-- source/index.js | 25 ++++--- test/_fixture.js | 4 +- test/chalk.js | 24 +++---- test/constructor.js | 14 ---- test/instance.js | 8 +-- test/template-literal.js | 46 ++++++------- test/visible.js | 8 +-- 10 files changed, 147 insertions(+), 165 deletions(-) delete mode 100644 test/constructor.js diff --git a/index.d.ts b/index.d.ts index 268ab75..a1d2857 100644 --- a/index.d.ts +++ b/index.d.ts @@ -93,7 +93,7 @@ export interface Options { /** Return a new Chalk instance. */ -export type ChalkInstance = new (options?: Options) => Chalk; +export const Chalk: new (options?: Options) => ChalkInstance; /** Detect whether the terminal supports color. @@ -149,12 +149,7 @@ interface ChalkFunction { (...text: unknown[]): string; } -export interface Chalk extends ChalkFunction { - /** - Return a new Chalk instance. - */ - Instance: ChalkInstance; - +export interface ChalkInstance extends ChalkFunction { /** The color support for Chalk. @@ -180,7 +175,7 @@ export interface Chalk extends ChalkFunction { chalk.hex('#DEADED'); ``` */ - hex: (color: string) => Chalk; + hex: (color: string) => this; /** Use keyword color value to set text color. @@ -194,27 +189,27 @@ export interface Chalk extends ChalkFunction { chalk.keyword('orange'); ``` */ - keyword: (color: string) => Chalk; + keyword: (color: string) => this; /** Use RGB values to set text color. */ - rgb: (red: number, green: number, blue: number) => Chalk; + rgb: (red: number, green: number, blue: number) => this; /** Use HSL values to set text color. */ - hsl: (hue: number, saturation: number, lightness: number) => Chalk; + hsl: (hue: number, saturation: number, lightness: number) => this; /** Use HSV values to set text color. */ - hsv: (hue: number, saturation: number, value: number) => Chalk; + hsv: (hue: number, saturation: number, value: number) => this; /** Use HWB values to set text color. */ - hwb: (hue: number, whiteness: number, blackness: number) => Chalk; + hwb: (hue: number, whiteness: number, blackness: number) => this; /** Use a [Select/Set Graphic Rendition](https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters) (SGR) [color code number](https://en.wikipedia.org/wiki/ANSI_escape_code#3/4_bit) to set text color. @@ -222,12 +217,12 @@ export interface Chalk extends ChalkFunction { 30 <= code && code < 38 || 90 <= code && code < 98 For example, 31 for red, 91 for redBright. */ - ansi: (code: number) => Chalk; + ansi: (code: number) => this; /** Use a [8-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) to set text color. */ - ansi256: (index: number) => Chalk; + ansi256: (index: number) => this; /** Use HEX value to set background color. @@ -241,7 +236,7 @@ export interface Chalk extends ChalkFunction { chalk.bgHex('#DEADED'); ``` */ - bgHex: (color: string) => Chalk; + bgHex: (color: string) => this; /** Use keyword color value to set background color. @@ -255,27 +250,27 @@ export interface Chalk extends ChalkFunction { chalk.bgKeyword('orange'); ``` */ - bgKeyword: (color: string) => Chalk; + bgKeyword: (color: string) => this; /** Use RGB values to set background color. */ - bgRgb: (red: number, green: number, blue: number) => Chalk; + bgRgb: (red: number, green: number, blue: number) => this; /** Use HSL values to set background color. */ - bgHsl: (hue: number, saturation: number, lightness: number) => Chalk; + bgHsl: (hue: number, saturation: number, lightness: number) => this; /** Use HSV values to set background color. */ - bgHsv: (hue: number, saturation: number, value: number) => Chalk; + bgHsv: (hue: number, saturation: number, value: number) => this; /** Use HWB values to set background color. */ - bgHwb: (hue: number, whiteness: number, blackness: number) => Chalk; + bgHwb: (hue: number, whiteness: number, blackness: number) => this; /** Use a [Select/Set Graphic Rendition](https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters) (SGR) [color code number](https://en.wikipedia.org/wiki/ANSI_escape_code#3/4_bit) to set background color. @@ -284,114 +279,114 @@ export interface Chalk extends ChalkFunction { For example, 31 for red, 91 for redBright. Use the foreground code, not the background code (for example, not 41, nor 101). */ - bgAnsi: (code: number) => Chalk; + bgAnsi: (code: number) => this; /** Use a [8-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) to set background color. */ - bgAnsi256: (index: number) => Chalk; + bgAnsi256: (index: number) => this; /** Modifier: Resets the current color chain. */ - readonly reset: Chalk; + readonly reset: this; /** Modifier: Make text bold. */ - readonly bold: Chalk; + readonly bold: this; /** Modifier: Emitting only a small amount of light. */ - readonly dim: Chalk; + readonly dim: this; /** Modifier: Make text italic. (Not widely supported) */ - readonly italic: Chalk; + readonly italic: this; /** Modifier: Make text underline. (Not widely supported) */ - readonly underline: Chalk; + readonly underline: this; /** Modifier: Inverse background and foreground colors. */ - readonly inverse: Chalk; + readonly inverse: this; /** Modifier: Prints the text, but makes it invisible. */ - readonly hidden: Chalk; + readonly hidden: this; /** Modifier: Puts a horizontal line through the center of the text. (Not widely supported) */ - readonly strikethrough: Chalk; + readonly strikethrough: this; /** Modifier: Prints the text only when Chalk has a color support level > 0. Can be useful for things that are purely cosmetic. */ - readonly visible: Chalk; + readonly visible: this; - readonly black: Chalk; - readonly red: Chalk; - readonly green: Chalk; - readonly yellow: Chalk; - readonly blue: Chalk; - readonly magenta: Chalk; - readonly cyan: Chalk; - readonly white: Chalk; + readonly black: this; + readonly red: this; + readonly green: this; + readonly yellow: this; + readonly blue: this; + readonly magenta: this; + readonly cyan: this; + readonly white: this; /* Alias for `blackBright`. */ - readonly gray: Chalk; + readonly gray: this; /* Alias for `blackBright`. */ - readonly grey: Chalk; + readonly grey: this; - readonly blackBright: Chalk; - readonly redBright: Chalk; - readonly greenBright: Chalk; - readonly yellowBright: Chalk; - readonly blueBright: Chalk; - readonly magentaBright: Chalk; - readonly cyanBright: Chalk; - readonly whiteBright: Chalk; + readonly blackBright: this; + readonly redBright: this; + readonly greenBright: this; + readonly yellowBright: this; + readonly blueBright: this; + readonly magentaBright: this; + readonly cyanBright: this; + readonly whiteBright: this; - readonly bgBlack: Chalk; - readonly bgRed: Chalk; - readonly bgGreen: Chalk; - readonly bgYellow: Chalk; - readonly bgBlue: Chalk; - readonly bgMagenta: Chalk; - readonly bgCyan: Chalk; - readonly bgWhite: Chalk; + readonly bgBlack: this; + readonly bgRed: this; + readonly bgGreen: this; + readonly bgYellow: this; + readonly bgBlue: this; + readonly bgMagenta: this; + readonly bgCyan: this; + readonly bgWhite: this; /* Alias for `bgBlackBright`. */ - readonly bgGray: Chalk; + readonly bgGray: this; /* Alias for `bgBlackBright`. */ - readonly bgGrey: Chalk; + readonly bgGrey: this; - readonly bgBlackBright: Chalk; - readonly bgRedBright: Chalk; - readonly bgGreenBright: Chalk; - readonly bgYellowBright: Chalk; - readonly bgBlueBright: Chalk; - readonly bgMagentaBright: Chalk; - readonly bgCyanBright: Chalk; - readonly bgWhiteBright: Chalk; + readonly bgBlackBright: this; + readonly bgRedBright: this; + readonly bgGreenBright: this; + readonly bgYellowBright: this; + readonly bgBlueBright: this; + readonly bgMagentaBright: this; + readonly bgCyanBright: this; + readonly bgWhiteBright: this; } /** @@ -403,9 +398,11 @@ Order doesn't matter, and later styles take precedent in case of a conflict. This simply means that `chalk.red.yellow.green` is equivalent to `chalk.green`. */ -declare const chalk: Chalk & ChalkFunction & { - supportsColor: ColorSupport | false; - stderr: Chalk & {supportsColor: ColorSupport | false}; -}; +declare const chalk: ChalkInstance & ChalkFunction; + +export const supportsColor: ColorSupport | false; + +export const chalkStderr: typeof chalk; +export const supportsColorStderr: typeof supportsColor; export default chalk; diff --git a/index.test-d.ts b/index.test-d.ts index 292707e..3e7e2d6 100644 --- a/index.test-d.ts +++ b/index.test-d.ts @@ -1,35 +1,35 @@ import {expectType, expectAssignable, expectError} from 'tsd'; -import chalk, {Chalk, Color, ColorSupport, ColorSupportLevel} from './index.js'; +import chalk, {Chalk, ChalkInstance, Color, ColorSupport, ColorSupportLevel, chalkStderr, supportsColor, supportsColorStderr} from './index.js'; // - Helpers - -type colorReturn = Chalk & {supportsColor?: never}; +type colorReturn = ChalkInstance & {supportsColor?: never}; // - supportsColor - -expectType(chalk.supportsColor); -if (chalk.supportsColor) { - expectType(chalk.supportsColor.hasBasic); - expectType(chalk.supportsColor.has256); - expectType(chalk.supportsColor.has16m); +expectType(supportsColor); +if (supportsColor) { + expectType(supportsColor.hasBasic); + expectType(supportsColor.has256); + expectType(supportsColor.has16m); } // - stderr - -expectAssignable(chalk.stderr); -expectType(chalk.stderr.supportsColor); -if (chalk.stderr.supportsColor) { - expectType(chalk.stderr.supportsColor.hasBasic); - expectType(chalk.stderr.supportsColor.has256); - expectType(chalk.stderr.supportsColor.has16m); +expectAssignable(chalkStderr); +expectType(supportsColorStderr); +if (supportsColorStderr) { + expectType(supportsColorStderr.hasBasic); + expectType(supportsColorStderr.has256); + expectType(supportsColorStderr.has16m); } -// -- `stderr` is not a member of the Chalk interface -- -expectError(chalk.reset.stderr); +// -- `supportsColorStderr` is not a member of the Chalk interface -- +expectError(chalk.reset.supportsColorStderr); // -- `supportsColor` is not a member of the Chalk interface -- expectError(chalk.reset.supportsColor); // - Chalk - // -- Instance -- -expectType(new chalk.Instance({level: 1})); +expectType(new Chalk({level: 1})); // -- Properties -- expectType(chalk.level); diff --git a/readme.md b/readme.md index c48056c..45e4be7 100644 --- a/readme.md +++ b/readme.md @@ -171,9 +171,9 @@ Color support is automatically detected, but you can override it by setting the If you need to change this in a reusable module, create a new instance: ```js -import chalk from 'chalk'; +import {Chalk} from 'chalk'; -const customChalk = new chalk.Instance({level: 0}); +const customChalk = new Chalk({level: 0}); ``` | Level | Description | @@ -183,7 +183,7 @@ const customChalk = new chalk.Instance({level: 0}); | `2` | 256 color support | | `3` | Truecolor support (16 million colors) | -### chalk.supportsColor +### supportsColor Detect whether the terminal [supports color](https://github.com/chalk/supports-color). Used internally and handled for you, but exposed for convenience. @@ -191,9 +191,9 @@ Can be overridden by the user with the flags `--color` and `--no-color`. For sit Explicit 256/Truecolor mode can be enabled using the `--color=256` and `--color=16m` flags, respectively. -### 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. ## Styles diff --git a/source/index.js b/source/index.js index 9a9986d..0f159d4 100644 --- a/source/index.js +++ b/source/index.js @@ -29,7 +29,7 @@ const applyOptions = (object, options = {}) => { object.level = options.level === undefined ? colorLevel : options.level; }; -class ChalkClass { +export class Chalk { constructor(options) { // eslint-disable-next-line no-constructor-return return chalkFactory(options); @@ -42,19 +42,15 @@ const chalkFactory = options => { chalk.template = (...arguments_) => chalkTag(chalk.template, ...arguments_); - Object.setPrototypeOf(chalk, Chalk.prototype); + Object.setPrototypeOf(chalk, createChalk.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; + chalk.template.Chalk = Chalk; return chalk.template; }; -function Chalk(options) { +function createChalk(options) { return chalkFactory(options); } @@ -213,11 +209,14 @@ const chalkTag = (chalk, ...strings) => { return template(chalk, parts.join('')); }; -Object.defineProperties(Chalk.prototype, styles); +Object.defineProperties(createChalk.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; +const chalk = createChalk(); +export const chalkStderr = createChalk({level: stderrColor ? stderrColor.level : 0}); + +export { + stdoutColor as supportsColor, + stderrColor as supportsColorStderr +}; export default chalk; diff --git a/test/_fixture.js b/test/_fixture.js index 1a8e8ba..c3e5b15 100644 --- a/test/_fixture.js +++ b/test/_fixture.js @@ -1,3 +1,3 @@ -import chalk from '../source/index.js'; +import chalk, {chalkStderr} from '../source/index.js'; -console.log(`${chalk.hex('#ff6159')('testout')} ${chalk.stderr.hex('#ff6159')('testerr')}`); +console.log(`${chalk.hex('#ff6159')('testout')} ${chalkStderr.hex('#ff6159')('testerr')}`); diff --git a/test/chalk.js b/test/chalk.js index 93e9c23..adc1aed 100644 --- a/test/chalk.js +++ b/test/chalk.js @@ -1,8 +1,8 @@ import test from 'ava'; -import chalk from '../source/index.js'; +import chalk, {Chalk, chalkStderr} from '../source/index.js'; chalk.level = 3; -chalk.stderr.level = 3; +chalkStderr.level = 3; console.log('TERM:', process.env.TERM || '[none]'); console.log('platform:', process.platform || '[unknown]'); @@ -94,26 +94,26 @@ test('line breaks should open and close colors with CRLF', t => { }); test('properly convert RGB to 16 colors on basic color terminals', t => { - t.is(new chalk.Instance({level: 1}).hex('#FF0000')('hello'), '\u001B[91mhello\u001B[39m'); - t.is(new chalk.Instance({level: 1}).bgHex('#FF0000')('hello'), '\u001B[101mhello\u001B[49m'); + t.is(new Chalk({level: 1}).hex('#FF0000')('hello'), '\u001B[91mhello\u001B[39m'); + t.is(new Chalk({level: 1}).bgHex('#FF0000')('hello'), '\u001B[101mhello\u001B[49m'); }); test('properly convert RGB to 256 colors on basic color terminals', t => { - t.is(new chalk.Instance({level: 2}).hex('#FF0000')('hello'), '\u001B[38;5;196mhello\u001B[39m'); - t.is(new chalk.Instance({level: 2}).bgHex('#FF0000')('hello'), '\u001B[48;5;196mhello\u001B[49m'); - t.is(new chalk.Instance({level: 3}).bgHex('#FF0000')('hello'), '\u001B[48;2;255;0;0mhello\u001B[49m'); + t.is(new Chalk({level: 2}).hex('#FF0000')('hello'), '\u001B[38;5;196mhello\u001B[39m'); + t.is(new Chalk({level: 2}).bgHex('#FF0000')('hello'), '\u001B[48;5;196mhello\u001B[49m'); + t.is(new Chalk({level: 3}).bgHex('#FF0000')('hello'), '\u001B[48;2;255;0;0mhello\u001B[49m'); }); test('don\'t emit RGB codes if level is 0', t => { - t.is(new chalk.Instance({level: 0}).hex('#FF0000')('hello'), 'hello'); - t.is(new chalk.Instance({level: 0}).bgHex('#FF0000')('hello'), 'hello'); + t.is(new Chalk({level: 0}).hex('#FF0000')('hello'), 'hello'); + t.is(new Chalk({level: 0}).bgHex('#FF0000')('hello'), 'hello'); }); test('supports blackBright color', t => { t.is(chalk.blackBright('foo'), '\u001B[90mfoo\u001B[39m'); }); -test('sets correct level for chalk.stderr and respects it', t => { - t.is(chalk.stderr.level, 3); - t.is(chalk.stderr.red.bold('foo'), '\u001B[31m\u001B[1mfoo\u001B[22m\u001B[39m'); +test('sets correct level for chalkStderr and respects it', t => { + t.is(chalkStderr.level, 3); + t.is(chalkStderr.red.bold('foo'), '\u001B[31m\u001B[1mfoo\u001B[22m\u001B[39m'); }); diff --git a/test/constructor.js b/test/constructor.js deleted file mode 100644 index 78ee070..0000000 --- a/test/constructor.js +++ /dev/null @@ -1,14 +0,0 @@ -import test from 'ava'; -import chalk from '../source/index.js'; - -test('Chalk.constructor should throw an expected error', t => { - const expectedError = t.throws(() => { - chalk.constructor(); - }); - - t.is(expectedError.message, '`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.'); - - t.throws(() => { - new chalk.constructor(); // eslint-disable-line no-new - }); -}); diff --git a/test/instance.js b/test/instance.js index c063109..c3cc70b 100644 --- a/test/instance.js +++ b/test/instance.js @@ -1,10 +1,10 @@ import test from 'ava'; -import chalk from '../source/index.js'; +import chalk, {Chalk} from '../source/index.js'; chalk.level = 1; test('create an isolated context where colors can be disabled (by level)', t => { - const instance = new chalk.Instance({level: 0}); + const instance = new Chalk({level: 0}); t.is(instance.red('foo'), 'foo'); t.is(chalk.red('foo'), '\u001B[31mfoo\u001B[39m'); instance.level = 2; @@ -14,11 +14,11 @@ test('create an isolated context where colors can be disabled (by level)', t => test('the `level` option should be a number from 0 to 3', t => { /* eslint-disable no-new */ t.throws(() => { - new chalk.Instance({level: 10}); + new Chalk({level: 10}); }, {message: /should be an integer from 0 to 3/}); t.throws(() => { - new chalk.Instance({level: -1}); + new Chalk({level: -1}); }, {message: /should be an integer from 0 to 3/}); /* eslint-enable no-new */ }); diff --git a/test/template-literal.js b/test/template-literal.js index 95383c4..773e097 100644 --- a/test/template-literal.js +++ b/test/template-literal.js @@ -1,27 +1,27 @@ /* eslint-disable unicorn/no-hex-escape */ import test from 'ava'; -import chalk from '../source/index.js'; +import chalk, {Chalk} from '../source/index.js'; chalk.level = 1; test('return an empty string for an empty literal', t => { - const instance = new chalk.Instance(); + const instance = new Chalk(); t.is(instance``, ''); }); test('return a regular string for a literal with no templates', t => { - const instance = new chalk.Instance({level: 0}); + const instance = new Chalk({level: 0}); t.is(instance`hello`, 'hello'); }); test('correctly perform template parsing', t => { - const instance = new chalk.Instance({level: 0}); + const instance = new Chalk({level: 0}); t.is(instance`{bold Hello, {cyan World!} This is a} test. {green Woo!}`, instance.bold('Hello,', instance.cyan('World!'), 'This is a') + ' test. ' + instance.green('Woo!')); }); test('correctly perform template substitutions', t => { - const instance = new chalk.Instance({level: 0}); + const instance = new Chalk({level: 0}); const name = 'Sindre'; const exclamation = 'Neat'; t.is(instance`{bold Hello, {cyan.inverse ${name}!} This is a} test. {green ${exclamation}!}`, @@ -29,7 +29,7 @@ test('correctly perform template substitutions', t => { }); test('correctly perform nested template substitutions', t => { - const instance = new chalk.Instance({level: 0}); + const instance = new Chalk({level: 0}); const name = 'Sindre'; const exclamation = 'Neat'; t.is(instance.bold`Hello, {cyan.inverse ${name}!} This is a` + ' test. ' + instance.green`${exclamation}!`, @@ -48,7 +48,7 @@ test('correctly perform nested template substitutions', t => { }); test('correctly parse and evaluate color-convert functions', t => { - const instance = new chalk.Instance({level: 3}); + const instance = new Chalk({level: 3}); t.is(instance`{bold.rgb(144,10,178).inverse Hello, {~inverse there!}}`, '\u001B[1m\u001B[38;2;144;10;178m\u001B[7mHello, ' + '\u001B[27m\u001B[39m\u001B[22m\u001B[1m' + @@ -61,13 +61,13 @@ test('correctly parse and evaluate color-convert functions', t => { }); test('properly handle escapes', t => { - const instance = new chalk.Instance({level: 3}); + const instance = new Chalk({level: 3}); t.is(instance`{bold hello \{in brackets\}}`, '\u001B[1mhello {in brackets}\u001B[22m'); }); test('throw if there is an unclosed block', t => { - const instance = new chalk.Instance({level: 3}); + const instance = new Chalk({level: 3}); try { console.log(instance`{bold this shouldn't appear ever\}`); t.fail(); @@ -84,7 +84,7 @@ test('throw if there is an unclosed block', t => { }); test('throw if there is an invalid style', t => { - const instance = new chalk.Instance({level: 3}); + const instance = new Chalk({level: 3}); try { console.log(instance`{abadstylethatdoesntexist this shouldn't appear ever}`); t.fail(); @@ -94,7 +94,7 @@ test('throw if there is an invalid style', t => { }); test('properly style multiline color blocks', t => { - const instance = new chalk.Instance({level: 3}); + const instance = new Chalk({level: 3}); t.is( instance`{bold Hello! This is a @@ -114,49 +114,49 @@ test('properly style multiline color blocks', t => { }); test('escape interpolated values', t => { - const instance = new chalk.Instance({level: 0}); + const instance = new Chalk({level: 0}); t.is(instance`Hello {bold hi}`, 'Hello hi'); t.is(instance`Hello ${'{bold hi}'}`, 'Hello {bold hi}'); }); test('allow custom colors (themes) on custom contexts', t => { - const instance = new chalk.Instance({level: 3}); + const instance = new Chalk({level: 3}); instance.rose = instance.hex('#F6D9D9'); t.is(instance`Hello, {rose Rose}.`, 'Hello, \u001B[38;2;246;217;217mRose\u001B[39m.'); }); test('correctly parse newline literals (bug #184)', t => { - const instance = new chalk.Instance({level: 0}); + const instance = new Chalk({level: 0}); t.is(instance`Hello {red there}`, 'Hello\nthere'); }); test('correctly parse newline escapes (bug #177)', t => { - const instance = new chalk.Instance({level: 0}); + const instance = new Chalk({level: 0}); t.is(instance`Hello\nthere!`, 'Hello\nthere!'); }); test('correctly parse escape in parameters (bug #177 comment 318622809)', t => { - const instance = new chalk.Instance({level: 0}); + const instance = new Chalk({level: 0}); const string = '\\'; t.is(instance`{blue ${string}}`, '\\'); }); test('correctly parses unicode/hex escapes', t => { - const instance = new chalk.Instance({level: 0}); + const instance = new Chalk({level: 0}); t.is(instance`\u0078ylophones are fo\x78y! {magenta.inverse \u0078ylophones are fo\x78y!}`, 'xylophones are foxy! xylophones are foxy!'); }); test('correctly parses string arguments', t => { - const instance = new chalk.Instance({level: 3}); + const instance = new Chalk({level: 3}); t.is(instance`{keyword('black').bold can haz cheezburger}`, '\u001B[38;2;0;0;0m\u001B[1mcan haz cheezburger\u001B[22m\u001B[39m'); t.is(instance`{keyword('blac\x6B').bold can haz cheezburger}`, '\u001B[38;2;0;0;0m\u001B[1mcan haz cheezburger\u001B[22m\u001B[39m'); t.is(instance`{keyword('blac\u006B').bold can haz cheezburger}`, '\u001B[38;2;0;0;0m\u001B[1mcan haz cheezburger\u001B[22m\u001B[39m'); }); test('throws if a bad argument is encountered', t => { - const instance = new chalk.Instance({level: 3}); // Keep level at least 1 in case we optimize for disabled chalk instances + const instance = new Chalk({level: 3}); // Keep level at least 1 in case we optimize for disabled chalk instances try { console.log(instance`{keyword(????) hi}`); t.fail(); @@ -166,7 +166,7 @@ test('throws if a bad argument is encountered', t => { }); test('throws if an extra unescaped } is found', t => { - const instance = new chalk.Instance({level: 0}); + const instance = new Chalk({level: 0}); try { console.log(instance`{red hi!}}`); t.fail(); @@ -176,18 +176,18 @@ test('throws if an extra unescaped } is found', t => { }); test('should not parse upper-case escapes', t => { - const instance = new chalk.Instance({level: 0}); + const instance = new Chalk({level: 0}); t.is(instance`\N\n\T\t\X07\x07\U000A\u000A\U000a\u000A`, 'N\nT\tX07\x07U000A\u000AU000a\u000A'); }); test('should properly handle undefined template interpolated values', t => { - const instance = new chalk.Instance({level: 0}); + const instance = new Chalk({level: 0}); t.is(instance`hello ${undefined}`, 'hello undefined'); t.is(instance`hello ${null}`, 'hello null'); }); test('should allow bracketed Unicode escapes', t => { - const instance = new chalk.Instance({level: 3}); + const instance = new Chalk({level: 3}); t.is(instance`\u{AB}`, '\u{AB}'); t.is(instance`This is a {bold \u{AB681}} test`, 'This is a \u001B[1m\u{AB681}\u001B[22m test'); t.is(instance`This is a {bold \u{10FFFF}} test`, 'This is a \u001B[1m\u{10FFFF}\u001B[22m test'); diff --git a/test/visible.js b/test/visible.js index cd9e46d..4d34af8 100644 --- a/test/visible.js +++ b/test/visible.js @@ -1,22 +1,22 @@ import test from 'ava'; -import chalk from '../source/index.js'; +import chalk, {Chalk} from '../source/index.js'; chalk.level = 1; test('visible: normal output when level > 0', t => { - const instance = new chalk.Instance({level: 3}); + const instance = new Chalk({level: 3}); t.is(instance.visible.red('foo'), '\u001B[31mfoo\u001B[39m'); t.is(instance.red.visible('foo'), '\u001B[31mfoo\u001B[39m'); }); test('visible: no output when level is too low', t => { - const instance = new chalk.Instance({level: 0}); + const instance = new Chalk({level: 0}); t.is(instance.visible.red('foo'), ''); t.is(instance.red.visible('foo'), ''); }); test('test switching back and forth between level == 0 and level > 0', t => { - const instance = new chalk.Instance({level: 3}); + const instance = new Chalk({level: 3}); t.is(instance.red('foo'), '\u001B[31mfoo\u001B[39m'); t.is(instance.visible.red('foo'), '\u001B[31mfoo\u001B[39m'); t.is(instance.red.visible('foo'), '\u001B[31mfoo\u001B[39m'); From 0fba91b0373c86800c45096ad215d38481f49614 Mon Sep 17 00:00:00 2001 From: Richie Bendall Date: Tue, 20 Apr 2021 18:48:30 +1200 Subject: [PATCH 16/71] Keep function prototype methods (#434) --- source/index.js | 2 ++ test/chalk.js | 6 ++++++ 2 files changed, 8 insertions(+) diff --git a/source/index.js b/source/index.js index 0f159d4..8db69d2 100644 --- a/source/index.js +++ b/source/index.js @@ -54,6 +54,8 @@ function createChalk(options) { return chalkFactory(options); } +Object.setPrototypeOf(createChalk.prototype, Function.prototype); + for (const [styleName, style] of Object.entries(ansiStyles)) { styles[styleName] = { get() { diff --git a/test/chalk.js b/test/chalk.js index adc1aed..af43558 100644 --- a/test/chalk.js +++ b/test/chalk.js @@ -117,3 +117,9 @@ test('sets correct level for chalkStderr and respects it', t => { t.is(chalkStderr.level, 3); t.is(chalkStderr.red.bold('foo'), '\u001B[31m\u001B[1mfoo\u001B[22m\u001B[39m'); }); + +test('keeps function prototype methods', t => { + t.is(chalk.apply(chalk, ['foo']), 'foo'); + t.is(chalk.bind(chalk, 'foo')(), 'foo'); + t.is(chalk.call(chalk, 'foo'), 'foo'); +}); From 4cf2e40e0739d4f5a3f1cd235b0e05e979bc5f34 Mon Sep 17 00:00:00 2001 From: Richie Bendall Date: Thu, 22 Apr 2021 15:54:42 +1200 Subject: [PATCH 17/71] Add `overline` style and remove `keyword`, `hsl`, `hsv`, `hwb` and `ansi` color spaces (#433) --- examples/rainbow.js | 14 +++--- examples/screenshot.js | 2 +- index.d.ts | 103 +++++++-------------------------------- index.test-d.ts | 15 ++---- package.json | 7 ++- readme.md | 14 ++---- source/index.js | 26 ++++++++-- test/template-literal.js | 10 ++-- 8 files changed, 63 insertions(+), 128 deletions(-) diff --git a/examples/rainbow.js b/examples/rainbow.js index 67dd236..9ea1d72 100644 --- a/examples/rainbow.js +++ b/examples/rainbow.js @@ -1,11 +1,10 @@ -import chalk from '../index.js'; +import chalk from '../source/index.js'; +import convertColor from 'color-convert'; +import updateLog from 'log-update'; +import delay from 'yoctodelay'; const ignoreChars = /[^!-~]/g; -const delay = milliseconds => new Promise(resolve => { - setTimeout(resolve, milliseconds); -}); - function rainbow(string, offset) { if (!string || string.length === 0) { return string; @@ -19,7 +18,7 @@ function rainbow(string, offset) { if (ignoreChars.test(character)) { characters.push(character); } else { - characters.push(chalk.hsl(hue, 100, 50)(character)); + characters.push(chalk.hex(convertColor.hsl.hex(hue, 100, 50))(character)); hue = (hue + hueStep) % 360; } } @@ -28,9 +27,8 @@ function rainbow(string, offset) { } async function animateString(string) { - console.log(); for (let index = 0; index < 360 * 5; index++) { - console.log('\u001B[1F\u001B[G', rainbow(string, index)); + updateLog(rainbow(string, index)); await delay(2); // eslint-disable-line no-await-in-loop } } diff --git a/examples/screenshot.js b/examples/screenshot.js index ea61e0c..6d5ed15 100644 --- a/examples/screenshot.js +++ b/examples/screenshot.js @@ -1,5 +1,5 @@ import styles from 'ansi-styles'; -import chalk from '../index.js'; +import chalk from '../source/index.js'; // Generates screenshot for (const key of Object.keys(styles)) { diff --git a/index.d.ts b/index.d.ts index a1d2857..a21fa89 100644 --- a/index.d.ts +++ b/index.d.ts @@ -61,6 +61,7 @@ export type Modifiers = | 'dim' | 'italic' | 'underline' + | 'overline' | 'inverse' | 'hidden' | 'strikethrough' @@ -163,6 +164,11 @@ export interface ChalkInstance extends ChalkFunction { */ level: ColorSupportLevel; + /** + Use RGB values to set text color. + */ + rgb: (red: number, green: number, blue: number) => this; + /** Use HEX value to set text color. @@ -178,52 +184,15 @@ export interface ChalkInstance extends ChalkFunction { hex: (color: string) => this; /** - Use keyword color value to set text color. - - @param color - Keyword value representing the desired color. - - @example - ``` - import chalk from 'chalk'; - - chalk.keyword('orange'); - ``` - */ - keyword: (color: string) => this; - - /** - Use RGB values to set text color. - */ - rgb: (red: number, green: number, blue: number) => this; - - /** - Use HSL values to set text color. - */ - hsl: (hue: number, saturation: number, lightness: number) => this; - - /** - Use HSV values to set text color. - */ - hsv: (hue: number, saturation: number, value: number) => this; - - /** - Use HWB values to set text color. - */ - hwb: (hue: number, whiteness: number, blackness: number) => this; - - /** - Use a [Select/Set Graphic Rendition](https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters) (SGR) [color code number](https://en.wikipedia.org/wiki/ANSI_escape_code#3/4_bit) to set text color. - - 30 <= code && code < 38 || 90 <= code && code < 98 - For example, 31 for red, 91 for redBright. - */ - ansi: (code: number) => this; - - /** - Use a [8-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) to set text color. + Use an [8-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) to set text color. */ ansi256: (index: number) => this; + /** + Use RGB values to set background color. + */ + bgRgb: (red: number, green: number, blue: number) => this; + /** Use HEX value to set background color. @@ -238,49 +207,6 @@ export interface ChalkInstance extends ChalkFunction { */ bgHex: (color: string) => this; - /** - Use keyword color value to set background color. - - @param color - Keyword value representing the desired color. - - @example - ``` - import chalk from 'chalk'; - - chalk.bgKeyword('orange'); - ``` - */ - bgKeyword: (color: string) => this; - - /** - Use RGB values to set background color. - */ - bgRgb: (red: number, green: number, blue: number) => this; - - /** - Use HSL values to set background color. - */ - bgHsl: (hue: number, saturation: number, lightness: number) => this; - - /** - Use HSV values to set background color. - */ - bgHsv: (hue: number, saturation: number, value: number) => this; - - /** - Use HWB values to set background color. - */ - bgHwb: (hue: number, whiteness: number, blackness: number) => this; - - /** - Use a [Select/Set Graphic Rendition](https://en.wikipedia.org/wiki/ANSI_escape_code#SGR_parameters) (SGR) [color code number](https://en.wikipedia.org/wiki/ANSI_escape_code#3/4_bit) to set background color. - - 30 <= code && code < 38 || 90 <= code && code < 98 - For example, 31 for red, 91 for redBright. - Use the foreground code, not the background code (for example, not 41, nor 101). - */ - bgAnsi: (code: number) => this; - /** Use a [8-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) to set background color. */ @@ -311,6 +237,11 @@ export interface ChalkInstance extends ChalkFunction { */ readonly underline: this; + /** + Modifier: Make text overline. (Not widely supported) + */ + readonly overline: this; + /** Modifier: Inverse background and foreground colors. */ diff --git a/index.test-d.ts b/index.test-d.ts index 3e7e2d6..45299d6 100644 --- a/index.test-d.ts +++ b/index.test-d.ts @@ -41,21 +41,11 @@ expectType(chalk`Hello {bold.red ${name}}`); expectType(chalk`Works with numbers {bold.red ${1}}`); // -- Color methods -- -expectAssignable(chalk.hex('#DEADED')); -expectAssignable(chalk.keyword('orange')); expectAssignable(chalk.rgb(0, 0, 0)); -expectAssignable(chalk.hsl(0, 0, 0)); -expectAssignable(chalk.hsv(0, 0, 0)); -expectAssignable(chalk.hwb(0, 0, 0)); -expectAssignable(chalk.ansi(30)); +expectAssignable(chalk.hex('#DEADED')); expectAssignable(chalk.ansi256(0)); -expectAssignable(chalk.bgHex('#DEADED')); -expectAssignable(chalk.bgKeyword('orange')); expectAssignable(chalk.bgRgb(0, 0, 0)); -expectAssignable(chalk.bgHsl(0, 0, 0)); -expectAssignable(chalk.bgHsv(0, 0, 0)); -expectAssignable(chalk.bgHwb(0, 0, 0)); -expectAssignable(chalk.bgAnsi(30)); +expectAssignable(chalk.bgHex('#DEADED')); expectAssignable(chalk.bgAnsi256(0)); // -- Modifiers -- @@ -64,6 +54,7 @@ expectType(chalk.bold('foo')); expectType(chalk.dim('foo')); expectType(chalk.italic('foo')); expectType(chalk.underline('foo')); +expectType(chalk.overline('foo')); expectType(chalk.inverse('foo')); expectType(chalk.hidden('foo')); expectType(chalk.strikethrough('foo')); diff --git a/package.json b/package.json index 9e6f031..2509b62 100644 --- a/package.json +++ b/package.json @@ -42,17 +42,20 @@ "text" ], "dependencies": { - "ansi-styles": "^4.1.0", + "ansi-styles": "^6.1.0", "supports-color": "^9.0.0" }, "devDependencies": { "ava": "^3.15.0", + "color-convert": "^2.0.1", "coveralls": "^3.1.0", "execa": "^5.0.0", + "log-update": "^4.0.0", "matcha": "^0.7.0", "nyc": "^15.1.0", "tsd": "^0.14.0", - "xo": "^0.38.2" + "xo": "^0.38.2", + "yoctodelay": "^1.2.0" }, "xo": { "rules": { diff --git a/readme.md b/readme.md index 45e4be7..6d92165 100644 --- a/readme.md +++ b/readme.md @@ -125,7 +125,6 @@ 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')); log(chalk.hex('#DEADED').bold('Bold gray!')); ``` @@ -136,7 +135,7 @@ Easily define your own themes: import chalk from 'chalk'; const error = chalk.bold.red; -const warning = chalk.keyword('orange'); +const warning = chalk.hex('#FFA500'); // Orange color console.log(error('Error!')); console.log(warning('Warning!')); @@ -275,7 +274,7 @@ 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. +Note that function styles (`rgb()`, `hex()`, 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. @@ -288,24 +287,17 @@ Colors are downsampled from 16 million RGB values to an ANSI color format that i Examples: - `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!')` The following color models can be used: - [`rgb`](https://en.wikipedia.org/wiki/RGB_color_model) - Example: `chalk.rgb(255, 136, 0).bold('Orange!')` - [`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 diff --git a/source/index.js b/source/index.js index 8db69d2..70f7a5d 100644 --- a/source/index.js +++ b/source/index.js @@ -74,14 +74,34 @@ styles.visible = { } }; -const usedModels = ['rgb', 'hex', 'keyword', 'hsl', 'hsv', 'hwb', 'ansi', 'ansi256']; +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', 'ansi256']; for (const model of usedModels) { styles[model] = { get() { const {level} = this; return function (...arguments_) { - const styler = createStyler(ansiStyles.color[levelMapping[level]][model](...arguments_), ansiStyles.color.close, this._styler); + const styler = createStyler(getModelAnsi(model, levelMapping[level], 'color', ...arguments_), ansiStyles.color.close, this._styler); return createBuilder(this, styler, this._isEmpty); }; } @@ -92,7 +112,7 @@ for (const model of usedModels) { get() { const {level} = this; return function (...arguments_) { - const styler = createStyler(ansiStyles.bgColor[levelMapping[level]][model](...arguments_), ansiStyles.bgColor.close, this._styler); + const styler = createStyler(getModelAnsi(model, levelMapping[level], 'bgColor', ...arguments_), ansiStyles.bgColor.close, this._styler); return createBuilder(this, styler, this._isEmpty); }; } diff --git a/test/template-literal.js b/test/template-literal.js index 773e097..e8d5950 100644 --- a/test/template-literal.js +++ b/test/template-literal.js @@ -150,18 +150,18 @@ test('correctly parses unicode/hex escapes', t => { test('correctly parses string arguments', t => { const instance = new Chalk({level: 3}); - t.is(instance`{keyword('black').bold can haz cheezburger}`, '\u001B[38;2;0;0;0m\u001B[1mcan haz cheezburger\u001B[22m\u001B[39m'); - t.is(instance`{keyword('blac\x6B').bold can haz cheezburger}`, '\u001B[38;2;0;0;0m\u001B[1mcan haz cheezburger\u001B[22m\u001B[39m'); - t.is(instance`{keyword('blac\u006B').bold can haz cheezburger}`, '\u001B[38;2;0;0;0m\u001B[1mcan haz cheezburger\u001B[22m\u001B[39m'); + t.is(instance`{hex('#000000').bold can haz cheezburger}`, '\u001B[38;2;0;0;0m\u001B[1mcan haz cheezburger\u001B[22m\u001B[39m'); + t.is(instance`{hex('#00000\x30').bold can haz cheezburger}`, '\u001B[38;2;0;0;0m\u001B[1mcan haz cheezburger\u001B[22m\u001B[39m'); + t.is(instance`{hex('#00000\u0030').bold can haz cheezburger}`, '\u001B[38;2;0;0;0m\u001B[1mcan haz cheezburger\u001B[22m\u001B[39m'); }); test('throws if a bad argument is encountered', t => { const instance = new Chalk({level: 3}); // Keep level at least 1 in case we optimize for disabled chalk instances try { - console.log(instance`{keyword(????) hi}`); + console.log(instance`{hex(????) hi}`); t.fail(); } catch (error) { - t.is(error.message, 'Invalid Chalk template style argument: ???? (in style \'keyword\')'); + t.is(error.message, 'Invalid Chalk template style argument: ???? (in style \'hex\')'); } }); From f8a3642a8107f6029c6923b72a43c35a1065a336 Mon Sep 17 00:00:00 2001 From: Richie Bendall Date: Thu, 22 Apr 2021 20:03:48 +1200 Subject: [PATCH 18/71] Minor tweaks (#437) Co-authored-by: Qix --- index.d.ts | 2 +- package.json | 2 +- source/index.js | 30 +++++++++++++++++------------- 3 files changed, 19 insertions(+), 15 deletions(-) diff --git a/index.d.ts b/index.d.ts index a21fa89..6f7ff2e 100644 --- a/index.d.ts +++ b/index.d.ts @@ -223,7 +223,7 @@ export interface ChalkInstance extends ChalkFunction { readonly bold: this; /** - Modifier: Emitting only a small amount of light. + Modifier: Make text slightly darker. (Inconsistent across terminals; might do nothing) */ readonly dim: this; diff --git a/package.json b/package.json index 2509b62..05cbf72 100644 --- a/package.json +++ b/package.json @@ -54,7 +54,7 @@ "matcha": "^0.7.0", "nyc": "^15.1.0", "tsd": "^0.14.0", - "xo": "^0.38.2", + "xo": "^0.39.1", "yoctodelay": "^1.2.0" }, "xo": { diff --git a/source/index.js b/source/index.js index 70f7a5d..8a3785b 100644 --- a/source/index.js +++ b/source/index.js @@ -9,6 +9,10 @@ import template from './templates.js'; const {stdout: stdoutColor, stderr: stderrColor} = supportsColor; const {isArray} = Array; +const GENERATOR = Symbol('GENERATOR'); +const STYLER = Symbol('STYLER'); +const IS_EMPTY = Symbol('IS_EMPTY'); + // `supportsColor.level` → `ansiStyles.color[name]` mapping const levelMapping = [ 'ansi', @@ -59,7 +63,7 @@ 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; } @@ -68,7 +72,7 @@ for (const [styleName, style] of Object.entries(ansiStyles)) { styles.visible = { get() { - const builder = createBuilder(this, this._styler, true); + const builder = createBuilder(this, this[STYLER], true); Object.defineProperty(this, 'visible', {value: builder}); return builder; } @@ -101,8 +105,8 @@ for (const model of usedModels) { get() { const {level} = this; return function (...arguments_) { - const styler = createStyler(getModelAnsi(model, levelMapping[level], 'color', ...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]); }; } }; @@ -112,8 +116,8 @@ for (const model of usedModels) { get() { const {level} = this; return function (...arguments_) { - const styler = createStyler(getModelAnsi(model, levelMapping[level], 'bgColor', ...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]); }; } }; @@ -124,10 +128,10 @@ const proto = Object.defineProperties(() => {}, { level: { enumerable: true, get() { - return this._generator.level; + return this[GENERATOR].level; }, set(level) { - this._generator.level = level; + this[GENERATOR].level = level; } } }); @@ -168,19 +172,19 @@ const createBuilder = (self, _styler, _isEmpty) => { // no way to create a function with a different prototype Object.setPrototypeOf(builder, proto); - builder._generator = self; - builder._styler = _styler; - builder._isEmpty = _isEmpty; + builder[GENERATOR] = self; + builder[STYLER] = _styler; + builder[IS_EMPTY] = _isEmpty; return builder; }; const applyStyle = (self, string) => { if (self.level <= 0 || !string) { - return self._isEmpty ? '' : string; + return self[IS_EMPTY] ? '' : string; } - let styler = self._styler; + let styler = self[STYLER]; if (styler === undefined) { return string; From b68c8b5102f04fb80bfdf83319d143aedff68bcb Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Wed, 5 May 2021 21:40:56 +0700 Subject: [PATCH 19/71] Meta tweaks --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 05cbf72..a205ed7 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "type": "module", "exports": "./source/index.js", "engines": { - "node": ">=12" + "node": ">=12.17" }, "scripts": { "test": "xo && nyc ava && tsd", From 48d25d156a109a6859ff2e907dbecf90a19e7e0a Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Fri, 30 Jul 2021 13:58:57 +0200 Subject: [PATCH 20/71] Meta tweaks --- readme.md | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 6d92165..9fe28fb 100644 --- a/readme.md +++ b/readme.md @@ -36,7 +36,7 @@

- +

@@ -51,6 +51,12 @@ and avoiding access controls. Keep your team and servers in sync with Doppler. +
+ +
+ UI Bakery +
+

From 625a2857722fb86cfe98f22c9c12888238e36f51 Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Fri, 30 Jul 2021 17:30:19 +0200 Subject: [PATCH 21/71] Add `types` field to package.json Fixes #500 --- examples/rainbow.js | 2 +- package.json | 14 +++++----- index.d.ts => source/index.d.ts | 0 source/index.js | 22 ++++++++-------- index.test-d.ts => source/index.test-d.ts | 0 source/templates.js | 2 +- test/chalk.js | 6 ++--- test/level.js | 2 +- test/template-literal.js | 32 +++++++++++------------ 9 files changed, 41 insertions(+), 39 deletions(-) rename index.d.ts => source/index.d.ts (100%) rename index.test-d.ts => source/index.test-d.ts (100%) diff --git a/examples/rainbow.js b/examples/rainbow.js index 9ea1d72..3501dab 100644 --- a/examples/rainbow.js +++ b/examples/rainbow.js @@ -1,7 +1,7 @@ -import chalk from '../source/index.js'; import convertColor from 'color-convert'; import updateLog from 'log-update'; import delay from 'yoctodelay'; +import chalk from '../source/index.js'; const ignoreChars = /[^!-~]/g; diff --git a/package.json b/package.json index a205ed7..3ad50b2 100644 --- a/package.json +++ b/package.json @@ -16,7 +16,7 @@ }, "files": [ "source", - "index.d.ts" + "!source/index.test-d.ts" ], "keywords": [ "color", @@ -43,20 +43,22 @@ ], "dependencies": { "ansi-styles": "^6.1.0", - "supports-color": "^9.0.0" + "supports-color": "^9.0.2" }, "devDependencies": { "ava": "^3.15.0", "color-convert": "^2.0.1", - "coveralls": "^3.1.0", - "execa": "^5.0.0", + "coveralls": "^3.1.1", + "execa": "^5.1.1", "log-update": "^4.0.0", "matcha": "^0.7.0", "nyc": "^15.1.0", - "tsd": "^0.14.0", - "xo": "^0.39.1", + "tsd": "^0.17.0", + "typescript": "^4.3.5", + "xo": "^0.42.0", "yoctodelay": "^1.2.0" }, + "types": "./source/index.d.ts", "xo": { "rules": { "unicorn/prefer-string-slice": "off", diff --git a/index.d.ts b/source/index.d.ts similarity index 100% rename from index.d.ts rename to source/index.d.ts diff --git a/source/index.js b/source/index.js index 8a3785b..88c7528 100644 --- a/source/index.js +++ b/source/index.js @@ -2,7 +2,7 @@ import ansiStyles from 'ansi-styles'; import supportsColor from 'supports-color'; import { stringReplaceAll, - stringEncaseCRLFWithFirstIndex + stringEncaseCRLFWithFirstIndex, } from './util.js'; import template from './templates.js'; @@ -18,7 +18,7 @@ const levelMapping = [ 'ansi', 'ansi', 'ansi256', - 'ansi16m' + 'ansi16m', ]; const styles = Object.create(null); @@ -66,7 +66,7 @@ for (const [styleName, style] of Object.entries(ansiStyles)) { const builder = createBuilder(this, createStyler(style.open, style.close, this[STYLER]), this[IS_EMPTY]); Object.defineProperty(this, styleName, {value: builder}); return builder; - } + }, }; } @@ -75,7 +75,7 @@ styles.visible = { const builder = createBuilder(this, this[STYLER], true); Object.defineProperty(this, 'visible', {value: builder}); return builder; - } + }, }; const getModelAnsi = (model, level, type, ...arguments_) => { @@ -108,7 +108,7 @@ for (const model of usedModels) { const styler = createStyler(getModelAnsi(model, levelMapping[level], 'color', ...arguments_), ansiStyles.color.close, this[STYLER]); return createBuilder(this, styler, this[IS_EMPTY]); }; - } + }, }; const bgModel = 'bg' + model[0].toUpperCase() + model.slice(1); @@ -119,7 +119,7 @@ for (const model of usedModels) { const styler = createStyler(getModelAnsi(model, levelMapping[level], 'bgColor', ...arguments_), ansiStyles.bgColor.close, this[STYLER]); return createBuilder(this, styler, this[IS_EMPTY]); }; - } + }, }; } @@ -132,8 +132,8 @@ const proto = Object.defineProperties(() => {}, { }, set(level) { this[GENERATOR].level = level; - } - } + }, + }, }); const createStyler = (open, close, parent) => { @@ -152,7 +152,7 @@ const createStyler = (open, close, parent) => { close, openAll, closeAll, - parent + parent, }; }; @@ -228,7 +228,7 @@ const chalkTag = (chalk, ...strings) => { for (let i = 1; i < firstString.length; i++) { parts.push( String(arguments_[i - 1]).replace(/[{}\\]/g, '\\$&'), - String(firstString.raw[i]) + String(firstString.raw[i]), ); } @@ -242,7 +242,7 @@ export const chalkStderr = createChalk({level: stderrColor ? stderrColor.level : export { stdoutColor as supportsColor, - stderrColor as supportsColorStderr + stderrColor as supportsColorStderr, }; export default chalk; diff --git a/index.test-d.ts b/source/index.test-d.ts similarity index 100% rename from index.test-d.ts rename to source/index.test-d.ts diff --git a/source/templates.js b/source/templates.js index 1a2f95c..590223f 100644 --- a/source/templates.js +++ b/source/templates.js @@ -13,7 +13,7 @@ const ESCAPES = new Map([ ['0', '\0'], ['\\', '\\'], ['e', '\u001B'], - ['a', '\u0007'] + ['a', '\u0007'], ]); function unescape(c) { diff --git a/test/chalk.js b/test/chalk.js index af43558..32b57c6 100644 --- a/test/chalk.js +++ b/test/chalk.js @@ -20,7 +20,7 @@ test('support automatic casting to string', t => { t.is(chalk(123), '123'); t.is(chalk.bold(['foo', 'bar']), '\u001B[1mfoo,bar\u001B[22m'); - t.is(chalk.green(98765), '\u001B[32m98765\u001B[39m'); + t.is(chalk.green(98_765), '\u001B[32m98765\u001B[39m'); }); test('style string', t => { @@ -37,14 +37,14 @@ test('support applying multiple styles at once', t => { test('support nesting styles', t => { t.is( chalk.red('foo' + chalk.underline.bgBlue('bar') + '!'), - '\u001B[31mfoo\u001B[4m\u001B[44mbar\u001B[49m\u001B[24m!\u001B[39m' + '\u001B[31mfoo\u001B[4m\u001B[44mbar\u001B[49m\u001B[24m!\u001B[39m', ); }); test('support nesting styles of the same type (color, underline, bg)', t => { t.is( chalk.red('a' + chalk.yellow('b' + chalk.green('c') + 'b') + 'c'), - '\u001B[31ma\u001B[33mb\u001B[32mc\u001B[39m\u001B[31m\u001B[33mb\u001B[39m\u001B[31mc\u001B[39m' + '\u001B[31ma\u001B[33mb\u001B[32mc\u001B[39m\u001B[31m\u001B[33mb\u001B[39m\u001B[31mc\u001B[39m', ); }); diff --git a/test/level.js b/test/level.js index 4aab162..5fed269 100644 --- a/test/level.js +++ b/test/level.js @@ -1,4 +1,4 @@ -import {fileURLToPath} from 'url'; +import {fileURLToPath} from 'node:url'; import test from 'ava'; import execa from 'execa'; import chalk from '../source/index.js'; diff --git a/test/template-literal.js b/test/template-literal.js index e8d5950..5e737a5 100644 --- a/test/template-literal.js +++ b/test/template-literal.js @@ -42,22 +42,22 @@ test('correctly perform nested template substitutions', t => { instance.strikethrough.cyanBright.bgBlack('Works with ' + instance.reset.bold('numbers') + ' ' + instance.bold.red(1))); t.is(chalk.bold`Also works on the shared {bgBlue chalk} object`, - '\u001B[1mAlso works on the shared \u001B[1m' + - '\u001B[44mchalk\u001B[49m\u001B[22m' + - '\u001B[1m object\u001B[22m'); + '\u001B[1mAlso works on the shared \u001B[1m' + + '\u001B[44mchalk\u001B[49m\u001B[22m' + + '\u001B[1m object\u001B[22m'); }); test('correctly parse and evaluate color-convert functions', t => { const instance = new Chalk({level: 3}); t.is(instance`{bold.rgb(144,10,178).inverse Hello, {~inverse there!}}`, - '\u001B[1m\u001B[38;2;144;10;178m\u001B[7mHello, ' + - '\u001B[27m\u001B[39m\u001B[22m\u001B[1m' + - '\u001B[38;2;144;10;178mthere!\u001B[39m\u001B[22m'); + '\u001B[1m\u001B[38;2;144;10;178m\u001B[7mHello, ' + + '\u001B[27m\u001B[39m\u001B[22m\u001B[1m' + + '\u001B[38;2;144;10;178mthere!\u001B[39m\u001B[22m'); t.is(instance`{bold.bgRgb(144,10,178).inverse Hello, {~inverse there!}}`, - '\u001B[1m\u001B[48;2;144;10;178m\u001B[7mHello, ' + - '\u001B[27m\u001B[49m\u001B[22m\u001B[1m' + - '\u001B[48;2;144;10;178mthere!\u001B[49m\u001B[22m'); + '\u001B[1m\u001B[48;2;144;10;178m\u001B[7mHello, ' + + '\u001B[27m\u001B[49m\u001B[22m\u001B[1m' + + '\u001B[48;2;144;10;178mthere!\u001B[49m\u001B[22m'); }); test('properly handle escapes', t => { @@ -103,13 +103,13 @@ test('properly style multiline color blocks', t => { } {underline I hope you enjoy }`, - '\u001B[1m\u001B[22m\n' + - '\u001B[1m\t\t\tHello! This is a\u001B[22m\n' + - '\u001B[1m\t\t\tmultiline block!\u001B[22m\n' + - '\u001B[1m\t\t\t:)\u001B[22m\n' + - '\u001B[1m\t\t\u001B[22m \u001B[4m\u001B[24m\n' + - '\u001B[4m\t\t\tI hope you enjoy\u001B[24m\n' + - '\u001B[4m\t\t\u001B[24m' + '\u001B[1m\u001B[22m\n' + + '\u001B[1m\t\t\tHello! This is a\u001B[22m\n' + + '\u001B[1m\t\t\tmultiline block!\u001B[22m\n' + + '\u001B[1m\t\t\t:)\u001B[22m\n' + + '\u001B[1m\t\t\u001B[22m \u001B[4m\u001B[24m\n' + + '\u001B[4m\t\t\tI hope you enjoy\u001B[24m\n' + + '\u001B[4m\t\t\u001B[24m', ); }); From 95217429be9de27c826ca02fa37653e9e371e82f Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Wed, 11 Aug 2021 15:01:41 +0200 Subject: [PATCH 22/71] Minor tweaks --- package.json | 3 +-- readme.md | 29 +++++++++++++++++------------ source/index.d.ts | 21 +++++++++++---------- 3 files changed, 29 insertions(+), 24 deletions(-) diff --git a/package.json b/package.json index 3ad50b2..ef0cc13 100644 --- a/package.json +++ b/package.json @@ -8,7 +8,7 @@ "type": "module", "exports": "./source/index.js", "engines": { - "node": ">=12.17" + "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "scripts": { "test": "xo && nyc ava && tsd", @@ -26,7 +26,6 @@ "console", "cli", "string", - "str", "ansi", "style", "styles", diff --git a/readme.md b/readme.md index 9fe28fb..18cddc7 100644 --- a/readme.md +++ b/readme.md @@ -52,9 +52,13 @@
- +
- UI Bakery + Strapi +
+ Strapi is the leading open-source headless CMS. +
+ It’s 100% JavaScript, fully customizable, and developer-first.

@@ -78,8 +82,8 @@ ## Install -```console -$ npm install chalk +```sh +npm install chalk ``` ## Usage @@ -204,15 +208,16 @@ Explicit 256/Truecolor mode can be enabled using the `--color=256` and `--color= ### 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. +- `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. ### Colors diff --git a/source/index.d.ts b/source/index.d.ts index 6f7ff2e..e94d260 100644 --- a/source/index.d.ts +++ b/source/index.d.ts @@ -213,52 +213,53 @@ export interface ChalkInstance extends ChalkFunction { bgAnsi256: (index: number) => this; /** - Modifier: Resets the current color chain. + Modifier: Reset the current style. */ readonly reset: this; /** - Modifier: Make text bold. + Modifier: Make the text bold. */ readonly bold: this; /** - Modifier: Make text slightly darker. (Inconsistent across terminals; might do nothing) + Modifier: Make the text have lower opacity. */ readonly dim: this; /** - Modifier: Make text italic. (Not widely supported) + Modifier: Make the text italic. *(Not widely supported)* */ readonly italic: this; /** - Modifier: Make text underline. (Not widely supported) + Modifier: Put a horizontal line below the text. *(Not widely supported)* */ readonly underline: this; /** - Modifier: Make text overline. (Not widely supported) + Modifier: Put a horizontal line above the text. *(Not widely supported)* */ readonly overline: this; /** - Modifier: Inverse background and foreground colors. + Modifier: Invert background and foreground colors. */ readonly inverse: this; /** - Modifier: Prints the text, but makes it invisible. + Modifier: Print the text but make it invisible. */ readonly hidden: this; /** - Modifier: Puts a horizontal line through the center of the text. (Not widely supported) + Modifier: Puts a horizontal line through the center of the text. *(Not widely supported)* */ readonly strikethrough: this; /** - Modifier: Prints the text only when Chalk has a color support level > 0. + Modifier: Print the text only when Chalk has a color level above zero. + Can be useful for things that are purely cosmetic. */ readonly visible: this; From 3761e455a17ebb1c01b2736fbe8bd42534383ab2 Mon Sep 17 00:00:00 2001 From: Richie Bendall Date: Mon, 25 Oct 2021 08:07:02 +1300 Subject: [PATCH 23/71] Meta tweak (#520) --- source/index.d.ts | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/source/index.d.ts b/source/index.d.ts index e94d260..73ae767 100644 --- a/source/index.d.ts +++ b/source/index.d.ts @@ -166,6 +166,13 @@ export interface ChalkInstance extends ChalkFunction { /** Use RGB values to set text color. + + @example + ``` + import chalk from 'chalk'; + + chalk.rgb(222, 173, 237); + ``` */ rgb: (red: number, green: number, blue: number) => this; @@ -185,11 +192,25 @@ export interface ChalkInstance extends ChalkFunction { /** Use an [8-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) to set text color. + + @example + ``` + import chalk from 'chalk'; + + chalk.ansi256(201); + ``` */ ansi256: (index: number) => this; /** Use RGB values to set background color. + + @example + ``` + import chalk from 'chalk'; + + chalk.bgRgb(222, 173, 237); + ``` */ bgRgb: (red: number, green: number, blue: number) => this; @@ -209,6 +230,13 @@ export interface ChalkInstance extends ChalkFunction { /** Use a [8-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) to set background color. + + @example + ``` + import chalk from 'chalk'; + + chalk.bgAnsi256(201); + ``` */ bgAnsi256: (index: number) => this; From f478655c3c04c844f70a596d9ec750c3da00f795 Mon Sep 17 00:00:00 2001 From: LightnerDev <79603731+LightnerDev@users.noreply.github.com> Date: Tue, 26 Oct 2021 13:22:37 -0500 Subject: [PATCH 24/71] Update dependents number in readme (#521) --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 18cddc7..7f041b5 100644 --- a/readme.md +++ b/readme.md @@ -78,7 +78,7 @@ - Doesn't extend `String.prototype` - Clean and focused - 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 From c987c614869ba286f0eb11c1966ee1d135c80599 Mon Sep 17 00:00:00 2001 From: Richie Bendall Date: Wed, 10 Nov 2021 22:12:33 +1300 Subject: [PATCH 25/71] Remove support for tagged template literals (#524) --- readme.md | 40 +------- source/index.d.ts | 31 +------ source/index.js | 46 +--------- source/index.test-d.ts | 6 -- source/templates.js | 133 --------------------------- test/template-literal.js | 194 --------------------------------------- 6 files changed, 8 insertions(+), 442 deletions(-) delete mode 100644 source/templates.js delete mode 100644 test/template-literal.js diff --git a/readme.md b/readme.md index 7f041b5..ed157bd 100644 --- a/readme.md +++ b/readme.md @@ -127,13 +127,6 @@ RAM: ${chalk.green('40%')} DISK: ${chalk.yellow('70%')} `); -// 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.rgb(123, 45, 67).underline('Underlined reddish color')); log(chalk.hex('#DEADED').bold('Bold gray!')); @@ -257,38 +250,6 @@ Explicit 256/Truecolor mode can be enabled using the `--color=256` and `--color= - `bgCyanBright` - `bgWhiteBright` -## Tagged template literal - -Chalk can be used as a [tagged template literal](https://exploringjs.com/es6/ch_template-literals.html#_tagged-template-literals). - -```js -import chalk from '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 -import chalk from 'chalk'; - -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()`, `hex()`, 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 Chalk supports 256 colors and [Truecolor](https://gist.github.com/XVilka/8346728) (16 million colors) on supported terminal apps. @@ -331,6 +292,7 @@ The maintainers of chalk and thousands of other packages are working with Tideli ## Related +- [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 - [ansi-styles](https://github.com/chalk/ansi-styles) - ANSI escape codes for styling strings in the terminal - [supports-color](https://github.com/chalk/supports-color) - Detect whether a terminal supports color diff --git a/source/index.d.ts b/source/index.d.ts index 73ae767..a6c6f76 100644 --- a/source/index.d.ts +++ b/source/index.d.ts @@ -121,36 +121,9 @@ export interface ColorSupport { has16m: boolean; } -interface ChalkFunction { - /** - Use a template string. - - @remarks Template literals are unsupported for nested calls (see [issue #341](https://github.com/chalk/chalk/issues/341)) - - @example - ``` - import chalk from 'chalk'; - - log(chalk` - CPU: {red ${cpu.totalPercent}%} - RAM: {green ${ram.used / ram.total * 100}%} - DISK: {rgb(255,131,0) ${disk.used / disk.total * 100}%} - `); - ``` - - @example - ``` - import chalk from 'chalk'; - - log(chalk.red.bgBlack`2 + 3 = {bold ${2 + 3}}`) - ``` - */ - (text: TemplateStringsArray, ...placeholders: unknown[]): string; - +export interface ChalkInstance { (...text: unknown[]): string; -} -export interface ChalkInstance extends ChalkFunction { /** The color support for Chalk. @@ -358,7 +331,7 @@ Order doesn't matter, and later styles take precedent in case of a conflict. This simply means that `chalk.red.yellow.green` is equivalent to `chalk.green`. */ -declare const chalk: ChalkInstance & ChalkFunction; +declare const chalk: ChalkInstance; export const supportsColor: ColorSupport | false; diff --git a/source/index.js b/source/index.js index 88c7528..6411672 100644 --- a/source/index.js +++ b/source/index.js @@ -4,10 +4,8 @@ import { stringReplaceAll, stringEncaseCRLFWithFirstIndex, } from './util.js'; -import template from './templates.js'; const {stdout: stdoutColor, stderr: stderrColor} = supportsColor; -const {isArray} = Array; const GENERATOR = Symbol('GENERATOR'); const STYLER = Symbol('STYLER'); @@ -41,17 +39,12 @@ export class Chalk { } 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.template, chalk); - chalk.template.Chalk = Chalk; - - return chalk.template; + return chalk; }; function createChalk(options) { @@ -157,16 +150,9 @@ const createStyler = (open, close, parent) => { }; 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 - return 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 + const builder = (...arguments_) => applyStyle(builder, (arguments_.length === 1) ? ('' + arguments_[0]) : arguments_.join(' ')); // We alter the prototype because we must return a function, but there is // no way to create a function with a different prototype @@ -213,28 +199,6 @@ const applyStyle = (self, string) => { return openAll + string + closeAll; }; -const chalkTag = (chalk, ...strings) => { - const [firstString] = strings; - - 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 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]), - ); - } - - return template(chalk, parts.join('')); -}; - Object.defineProperties(createChalk.prototype, styles); const chalk = createChalk(); diff --git a/source/index.test-d.ts b/source/index.test-d.ts index 45299d6..2bd0ed5 100644 --- a/source/index.test-d.ts +++ b/source/index.test-d.ts @@ -34,12 +34,6 @@ expectType(new Chalk({level: 1})); // -- Properties -- expectType(chalk.level); -// -- Template literal -- -expectType(chalk``); -const name = 'John'; -expectType(chalk`Hello {bold.red ${name}}`); -expectType(chalk`Works with numbers {bold.red ${1}}`); - // -- Color methods -- expectAssignable(chalk.rgb(0, 0, 0)); expectAssignable(chalk.hex('#DEADED')); diff --git a/source/templates.js b/source/templates.js deleted file mode 100644 index 590223f..0000000 --- a/source/templates.js +++ /dev/null @@ -1,133 +0,0 @@ -const TEMPLATE_REGEX = /(?:\\(u(?:[a-f\d]{4}|\{[a-f\d]{1,6}\})|x[a-f\d]{2}|.))|(?:\{(~)?(\w+(?:\([^)]*\))?(?:\.\w+(?:\([^)]*\))?)*)(?:[ \t]|(?=\r?\n)))|(\})|((?:.|[\r\n\f])+?)/gi; -const STYLE_REGEX = /(?:^|\.)(\w+)(?:\(([^)]*)\))?/g; -const STRING_REGEX = /^(['"])((?:\\.|(?!\1)[^\\])*)\1$/; -const ESCAPE_REGEX = /\\(u(?:[a-f\d]{4}|{[a-f\d]{1,6}})|x[a-f\d]{2}|.)|([^\\])/gi; - -const ESCAPES = new Map([ - ['n', '\n'], - ['r', '\r'], - ['t', '\t'], - ['b', '\b'], - ['f', '\f'], - ['v', '\v'], - ['0', '\0'], - ['\\', '\\'], - ['e', '\u001B'], - ['a', '\u0007'], -]); - -function unescape(c) { - const u = c[0] === 'u'; - const bracket = c[1] === '{'; - - if ((u && !bracket && c.length === 5) || (c[0] === 'x' && c.length === 3)) { - return String.fromCharCode(Number.parseInt(c.slice(1), 16)); - } - - if (u && bracket) { - return String.fromCodePoint(Number.parseInt(c.slice(2, -1), 16)); - } - - return ESCAPES.get(c) || c; -} - -function parseArguments(name, arguments_) { - const results = []; - const chunks = arguments_.trim().split(/\s*,\s*/g); - let matches; - - for (const chunk of chunks) { - const number = Number(chunk); - if (!Number.isNaN(number)) { - results.push(number); - } else if ((matches = chunk.match(STRING_REGEX))) { - results.push(matches[2].replace(ESCAPE_REGEX, (m, escape, character) => escape ? unescape(escape) : character)); - } else { - throw new Error(`Invalid Chalk template style argument: ${chunk} (in style '${name}')`); - } - } - - return results; -} - -function parseStyle(style) { - STYLE_REGEX.lastIndex = 0; - - const results = []; - let matches; - - while ((matches = STYLE_REGEX.exec(style)) !== null) { - const name = matches[1]; - - if (matches[2]) { - const args = parseArguments(name, matches[2]); - results.push([name, ...args]); - } else { - results.push([name]); - } - } - - return results; -} - -function buildStyle(chalk, styles) { - const enabled = {}; - - for (const layer of styles) { - for (const style of layer.styles) { - enabled[style[0]] = layer.inverse ? null : style.slice(1); - } - } - - let current = chalk; - for (const [styleName, styles] of Object.entries(enabled)) { - if (!Array.isArray(styles)) { - continue; - } - - if (!(styleName in current)) { - throw new Error(`Unknown Chalk style: ${styleName}`); - } - - current = styles.length > 0 ? current[styleName](...styles) : current[styleName]; - } - - return current; -} - -export default function template(chalk, temporary) { - const styles = []; - const chunks = []; - let chunk = []; - - // eslint-disable-next-line max-params - temporary.replace(TEMPLATE_REGEX, (m, escapeCharacter, inverse, style, close, character) => { - if (escapeCharacter) { - chunk.push(unescape(escapeCharacter)); - } else if (style) { - const string = chunk.join(''); - chunk = []; - chunks.push(styles.length === 0 ? string : buildStyle(chalk, styles)(string)); - styles.push({inverse, styles: parseStyle(style)}); - } else if (close) { - if (styles.length === 0) { - throw new Error('Found extraneous } in Chalk template literal'); - } - - chunks.push(buildStyle(chalk, styles)(chunk.join(''))); - chunk = []; - styles.pop(); - } else { - chunk.push(character); - } - }); - - chunks.push(chunk.join('')); - - if (styles.length > 0) { - const errorMessage = `Chalk template literal is missing ${styles.length} closing bracket${styles.length === 1 ? '' : 's'} (\`}\`)`; - throw new Error(errorMessage); - } - - return chunks.join(''); -} diff --git a/test/template-literal.js b/test/template-literal.js deleted file mode 100644 index 5e737a5..0000000 --- a/test/template-literal.js +++ /dev/null @@ -1,194 +0,0 @@ -/* eslint-disable unicorn/no-hex-escape */ -import test from 'ava'; -import chalk, {Chalk} from '../source/index.js'; - -chalk.level = 1; - -test('return an empty string for an empty literal', t => { - const instance = new Chalk(); - t.is(instance``, ''); -}); - -test('return a regular string for a literal with no templates', t => { - const instance = new Chalk({level: 0}); - t.is(instance`hello`, 'hello'); -}); - -test('correctly perform template parsing', t => { - const instance = new Chalk({level: 0}); - t.is(instance`{bold Hello, {cyan World!} This is a} test. {green Woo!}`, - instance.bold('Hello,', instance.cyan('World!'), 'This is a') + ' test. ' + instance.green('Woo!')); -}); - -test('correctly perform template substitutions', t => { - const instance = new Chalk({level: 0}); - const name = 'Sindre'; - const exclamation = 'Neat'; - t.is(instance`{bold Hello, {cyan.inverse ${name}!} This is a} test. {green ${exclamation}!}`, - instance.bold('Hello,', instance.cyan.inverse(name + '!'), 'This is a') + ' test. ' + instance.green(exclamation + '!')); -}); - -test('correctly perform nested template substitutions', t => { - const instance = new Chalk({level: 0}); - const name = 'Sindre'; - const exclamation = 'Neat'; - t.is(instance.bold`Hello, {cyan.inverse ${name}!} This is a` + ' test. ' + instance.green`${exclamation}!`, - instance.bold('Hello,', instance.cyan.inverse(name + '!'), 'This is a') + ' test. ' + instance.green(exclamation + '!')); - - t.is(instance.red.bgGreen.bold`Hello {italic.blue ${name}}`, - instance.red.bgGreen.bold('Hello ' + instance.italic.blue(name))); - - t.is(instance.strikethrough.cyanBright.bgBlack`Works with {reset {bold numbers}} {bold.red ${1}}`, - instance.strikethrough.cyanBright.bgBlack('Works with ' + instance.reset.bold('numbers') + ' ' + instance.bold.red(1))); - - t.is(chalk.bold`Also works on the shared {bgBlue chalk} object`, - '\u001B[1mAlso works on the shared \u001B[1m' - + '\u001B[44mchalk\u001B[49m\u001B[22m' - + '\u001B[1m object\u001B[22m'); -}); - -test('correctly parse and evaluate color-convert functions', t => { - const instance = new Chalk({level: 3}); - t.is(instance`{bold.rgb(144,10,178).inverse Hello, {~inverse there!}}`, - '\u001B[1m\u001B[38;2;144;10;178m\u001B[7mHello, ' - + '\u001B[27m\u001B[39m\u001B[22m\u001B[1m' - + '\u001B[38;2;144;10;178mthere!\u001B[39m\u001B[22m'); - - t.is(instance`{bold.bgRgb(144,10,178).inverse Hello, {~inverse there!}}`, - '\u001B[1m\u001B[48;2;144;10;178m\u001B[7mHello, ' - + '\u001B[27m\u001B[49m\u001B[22m\u001B[1m' - + '\u001B[48;2;144;10;178mthere!\u001B[49m\u001B[22m'); -}); - -test('properly handle escapes', t => { - const instance = new Chalk({level: 3}); - t.is(instance`{bold hello \{in brackets\}}`, - '\u001B[1mhello {in brackets}\u001B[22m'); -}); - -test('throw if there is an unclosed block', t => { - const instance = new Chalk({level: 3}); - try { - console.log(instance`{bold this shouldn't appear ever\}`); - t.fail(); - } catch (error) { - t.is(error.message, 'Chalk template literal is missing 1 closing bracket (`}`)'); - } - - try { - console.log(instance`{bold this shouldn't {inverse appear {underline ever\} :) \}`); - t.fail(); - } catch (error) { - t.is(error.message, 'Chalk template literal is missing 3 closing brackets (`}`)'); - } -}); - -test('throw if there is an invalid style', t => { - const instance = new Chalk({level: 3}); - try { - console.log(instance`{abadstylethatdoesntexist this shouldn't appear ever}`); - t.fail(); - } catch (error) { - t.is(error.message, 'Unknown Chalk style: abadstylethatdoesntexist'); - } -}); - -test('properly style multiline color blocks', t => { - const instance = new Chalk({level: 3}); - t.is( - instance`{bold - Hello! This is a - ${'multiline'} block! - :) - } {underline - I hope you enjoy - }`, - '\u001B[1m\u001B[22m\n' - + '\u001B[1m\t\t\tHello! This is a\u001B[22m\n' - + '\u001B[1m\t\t\tmultiline block!\u001B[22m\n' - + '\u001B[1m\t\t\t:)\u001B[22m\n' - + '\u001B[1m\t\t\u001B[22m \u001B[4m\u001B[24m\n' - + '\u001B[4m\t\t\tI hope you enjoy\u001B[24m\n' - + '\u001B[4m\t\t\u001B[24m', - ); -}); - -test('escape interpolated values', t => { - const instance = new Chalk({level: 0}); - t.is(instance`Hello {bold hi}`, 'Hello hi'); - t.is(instance`Hello ${'{bold hi}'}`, 'Hello {bold hi}'); -}); - -test('allow custom colors (themes) on custom contexts', t => { - const instance = new Chalk({level: 3}); - instance.rose = instance.hex('#F6D9D9'); - t.is(instance`Hello, {rose Rose}.`, 'Hello, \u001B[38;2;246;217;217mRose\u001B[39m.'); -}); - -test('correctly parse newline literals (bug #184)', t => { - const instance = new Chalk({level: 0}); - t.is(instance`Hello -{red there}`, 'Hello\nthere'); -}); - -test('correctly parse newline escapes (bug #177)', t => { - const instance = new Chalk({level: 0}); - t.is(instance`Hello\nthere!`, 'Hello\nthere!'); -}); - -test('correctly parse escape in parameters (bug #177 comment 318622809)', t => { - const instance = new Chalk({level: 0}); - const string = '\\'; - t.is(instance`{blue ${string}}`, '\\'); -}); - -test('correctly parses unicode/hex escapes', t => { - const instance = new Chalk({level: 0}); - t.is(instance`\u0078ylophones are fo\x78y! {magenta.inverse \u0078ylophones are fo\x78y!}`, - 'xylophones are foxy! xylophones are foxy!'); -}); - -test('correctly parses string arguments', t => { - const instance = new Chalk({level: 3}); - t.is(instance`{hex('#000000').bold can haz cheezburger}`, '\u001B[38;2;0;0;0m\u001B[1mcan haz cheezburger\u001B[22m\u001B[39m'); - t.is(instance`{hex('#00000\x30').bold can haz cheezburger}`, '\u001B[38;2;0;0;0m\u001B[1mcan haz cheezburger\u001B[22m\u001B[39m'); - t.is(instance`{hex('#00000\u0030').bold can haz cheezburger}`, '\u001B[38;2;0;0;0m\u001B[1mcan haz cheezburger\u001B[22m\u001B[39m'); -}); - -test('throws if a bad argument is encountered', t => { - const instance = new Chalk({level: 3}); // Keep level at least 1 in case we optimize for disabled chalk instances - try { - console.log(instance`{hex(????) hi}`); - t.fail(); - } catch (error) { - t.is(error.message, 'Invalid Chalk template style argument: ???? (in style \'hex\')'); - } -}); - -test('throws if an extra unescaped } is found', t => { - const instance = new Chalk({level: 0}); - try { - console.log(instance`{red hi!}}`); - t.fail(); - } catch (error) { - t.is(error.message, 'Found extraneous } in Chalk template literal'); - } -}); - -test('should not parse upper-case escapes', t => { - const instance = new Chalk({level: 0}); - t.is(instance`\N\n\T\t\X07\x07\U000A\u000A\U000a\u000A`, 'N\nT\tX07\x07U000A\u000AU000a\u000A'); -}); - -test('should properly handle undefined template interpolated values', t => { - const instance = new Chalk({level: 0}); - t.is(instance`hello ${undefined}`, 'hello undefined'); - t.is(instance`hello ${null}`, 'hello null'); -}); - -test('should allow bracketed Unicode escapes', t => { - const instance = new Chalk({level: 3}); - t.is(instance`\u{AB}`, '\u{AB}'); - t.is(instance`This is a {bold \u{AB681}} test`, 'This is a \u001B[1m\u{AB681}\u001B[22m test'); - t.is(instance`This is a {bold \u{10FFFF}} test`, 'This is a \u001B[1m\u{10FFFF}\u001B[22m test'); -}); From 09fd5c4ba812cc2e3a0df183caf3e53cc556e440 Mon Sep 17 00:00:00 2001 From: Richie Bendall Date: Sun, 21 Nov 2021 19:51:24 +1300 Subject: [PATCH 26/71] Re-export types from `supports-color` (#526) --- examples/screenshot.js | 1 + package.json | 4 ++-- source/index.d.ts | 46 +++++++++--------------------------------- source/index.test-d.ts | 23 ++++++++++----------- test/chalk.js | 1 + 5 files changed, 25 insertions(+), 50 deletions(-) diff --git a/examples/screenshot.js b/examples/screenshot.js index 6d5ed15..6f66b77 100644 --- a/examples/screenshot.js +++ b/examples/screenshot.js @@ -1,3 +1,4 @@ +import process from 'node:process'; import styles from 'ansi-styles'; import chalk from '../source/index.js'; diff --git a/package.json b/package.json index ef0cc13..703426b 100644 --- a/package.json +++ b/package.json @@ -42,7 +42,7 @@ ], "dependencies": { "ansi-styles": "^6.1.0", - "supports-color": "^9.0.2" + "supports-color": "^9.1.0" }, "devDependencies": { "ava": "^3.15.0", @@ -54,7 +54,7 @@ "nyc": "^15.1.0", "tsd": "^0.17.0", "typescript": "^4.3.5", - "xo": "^0.42.0", + "xo": "^0.46.4", "yoctodelay": "^1.2.0" }, "types": "./source/index.d.ts", diff --git a/source/index.d.ts b/source/index.d.ts index a6c6f76..cf6fb33 100644 --- a/source/index.d.ts +++ b/source/index.d.ts @@ -1,3 +1,5 @@ +import {ColorInfo, ColorSupportLevel} from 'supports-color'; + /** Basic foreground colors. @@ -67,15 +69,6 @@ export type Modifiers = | 'strikethrough' | 'visible'; -/** -Levels: -- `0` - All colors disabled. -- `1` - Basic 16 colors support. -- `2` - ANSI 256 colors support. -- `3` - Truecolor 16 million colors support. -*/ -export type ColorSupportLevel = 0 | 1 | 2 | 3; - export interface Options { /** Specify the color support for Chalk. @@ -94,32 +87,7 @@ export interface Options { /** Return a new Chalk instance. */ -export const Chalk: new (options?: Options) => ChalkInstance; - -/** -Detect whether the terminal supports color. -*/ -export interface ColorSupport { - /** - The color level used by Chalk. - */ - level: ColorSupportLevel; - - /** - Return whether Chalk supports basic 16 colors. - */ - hasBasic: boolean; - - /** - Return whether Chalk supports ANSI 256 colors. - */ - has256: boolean; - - /** - Return whether Chalk supports Truecolor 16 million colors. - */ - has16m: boolean; -} +export const Chalk: new (options?: Options) => ChalkInstance; // eslint-disable-line @typescript-eslint/naming-convention export interface ChalkInstance { (...text: unknown[]): string; @@ -333,9 +301,15 @@ This simply means that `chalk.red.yellow.green` is equivalent to `chalk.green`. */ declare const chalk: ChalkInstance; -export const supportsColor: ColorSupport | false; +export const supportsColor: ColorInfo; export const chalkStderr: typeof chalk; export const supportsColorStderr: typeof supportsColor; +export { + ColorInfo, + ColorSupport, + ColorSupportLevel, +} from 'supports-color'; + export default chalk; diff --git a/source/index.test-d.ts b/source/index.test-d.ts index 2bd0ed5..a1ef854 100644 --- a/source/index.test-d.ts +++ b/source/index.test-d.ts @@ -1,12 +1,11 @@ import {expectType, expectAssignable, expectError} from 'tsd'; -import chalk, {Chalk, ChalkInstance, Color, ColorSupport, ColorSupportLevel, chalkStderr, supportsColor, supportsColorStderr} from './index.js'; - -// - Helpers - -type colorReturn = ChalkInstance & {supportsColor?: never}; +import chalk, {Chalk, ChalkInstance, Color, ColorInfo, ColorSupport, ColorSupportLevel, chalkStderr, supportsColor, supportsColorStderr} from './index.js'; // - supportsColor - -expectType(supportsColor); +expectType(supportsColor); if (supportsColor) { + expectType(supportsColor); + expectType(supportsColor.level); expectType(supportsColor.hasBasic); expectType(supportsColor.has256); expectType(supportsColor.has16m); @@ -14,7 +13,7 @@ if (supportsColor) { // - stderr - expectAssignable(chalkStderr); -expectType(supportsColorStderr); +expectType(supportsColorStderr); if (supportsColorStderr) { expectType(supportsColorStderr.hasBasic); expectType(supportsColorStderr.has256); @@ -35,12 +34,12 @@ expectType(new Chalk({level: 1})); expectType(chalk.level); // -- Color methods -- -expectAssignable(chalk.rgb(0, 0, 0)); -expectAssignable(chalk.hex('#DEADED')); -expectAssignable(chalk.ansi256(0)); -expectAssignable(chalk.bgRgb(0, 0, 0)); -expectAssignable(chalk.bgHex('#DEADED')); -expectAssignable(chalk.bgAnsi256(0)); +expectType(chalk.rgb(0, 0, 0)); +expectType(chalk.hex('#DEADED')); +expectType(chalk.ansi256(0)); +expectType(chalk.bgRgb(0, 0, 0)); +expectType(chalk.bgHex('#DEADED')); +expectType(chalk.bgAnsi256(0)); // -- Modifiers -- expectType(chalk.reset('foo')); diff --git a/test/chalk.js b/test/chalk.js index 32b57c6..8d58e45 100644 --- a/test/chalk.js +++ b/test/chalk.js @@ -1,3 +1,4 @@ +import process from 'node:process'; import test from 'ava'; import chalk, {Chalk, chalkStderr} from '../source/index.js'; From d7c4aac07e422c8ae534897b3f1707aa71a51c73 Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Fri, 26 Nov 2021 16:00:01 +0700 Subject: [PATCH 27/71] Upgrade dependencies --- package.json | 12 ++++++------ test/level.js | 4 ++-- 2 files changed, 8 insertions(+), 8 deletions(-) diff --git a/package.json b/package.json index 703426b..412fdad 100644 --- a/package.json +++ b/package.json @@ -48,14 +48,14 @@ "ava": "^3.15.0", "color-convert": "^2.0.1", "coveralls": "^3.1.1", - "execa": "^5.1.1", - "log-update": "^4.0.0", + "execa": "^6.0.0", + "log-update": "^5.0.0", "matcha": "^0.7.0", "nyc": "^15.1.0", - "tsd": "^0.17.0", - "typescript": "^4.3.5", - "xo": "^0.46.4", - "yoctodelay": "^1.2.0" + "tsd": "^0.19.0", + "typescript": "^4.5.2", + "xo": "^0.47.0", + "yoctodelay": "^2.0.0" }, "types": "./source/index.d.ts", "xo": { diff --git a/test/level.js b/test/level.js index 5fed269..f8efeba 100644 --- a/test/level.js +++ b/test/level.js @@ -1,6 +1,6 @@ import {fileURLToPath} from 'node:url'; import test from 'ava'; -import execa from 'execa'; +import {execaNode} from 'execa'; import chalk from '../source/index.js'; chalk.level = 1; @@ -38,6 +38,6 @@ test('propagate enable/disable changes from child colors', t => { }); test('disable colors if they are not supported', async t => { - const {stdout} = await execa.node(fileURLToPath(new URL('./_fixture.js', import.meta.url))); + const {stdout} = await execaNode(fileURLToPath(new URL('./_fixture.js', import.meta.url))); t.is(stdout, 'testout testerr'); }); From 04fdbd6d8d262ed8668cf3f2e94f647d2bc028d8 Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Fri, 26 Nov 2021 16:34:27 +0700 Subject: [PATCH 28/71] Bundle dependencies --- package.json | 11 +- source/index.d.ts | 7 +- source/index.js | 8 +- source/{util.js => utilities.js} | 0 source/vendor/ansi-styles/index.d.ts | 190 +++++++++++++++++++ source/vendor/ansi-styles/index.js | 219 ++++++++++++++++++++++ source/vendor/supports-color/browser.d.ts | 1 + source/vendor/supports-color/browser.js | 17 ++ source/vendor/supports-color/index.d.ts | 55 ++++++ source/vendor/supports-color/index.js | 169 +++++++++++++++++ 10 files changed, 667 insertions(+), 10 deletions(-) rename source/{util.js => utilities.js} (100%) create mode 100644 source/vendor/ansi-styles/index.d.ts create mode 100644 source/vendor/ansi-styles/index.js create mode 100644 source/vendor/supports-color/browser.d.ts create mode 100644 source/vendor/supports-color/browser.js create mode 100644 source/vendor/supports-color/index.d.ts create mode 100644 source/vendor/supports-color/index.js diff --git a/package.json b/package.json index 412fdad..a9b7d79 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,13 @@ "funding": "https://github.com/chalk/chalk?sponsor=1", "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" + } + }, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -40,10 +47,6 @@ "command-line", "text" ], - "dependencies": { - "ansi-styles": "^6.1.0", - "supports-color": "^9.1.0" - }, "devDependencies": { "ava": "^3.15.0", "color-convert": "^2.0.1", diff --git a/source/index.d.ts b/source/index.d.ts index cf6fb33..b2408c6 100644 --- a/source/index.d.ts +++ b/source/index.d.ts @@ -1,4 +1,6 @@ -import {ColorInfo, ColorSupportLevel} from 'supports-color'; +// TODO: Make it this when TS suports that. +// import {ColorInfo, ColorSupportLevel} from '#supports-color'; +import {ColorInfo, ColorSupportLevel} from './vendor/supports-color/index.js'; /** Basic foreground colors. @@ -310,6 +312,7 @@ export { ColorInfo, ColorSupport, ColorSupportLevel, -} from 'supports-color'; +// } from '#supports-color'; +} from './vendor/supports-color/index.js'; export default chalk; diff --git a/source/index.js b/source/index.js index 6411672..302024b 100644 --- a/source/index.js +++ b/source/index.js @@ -1,9 +1,9 @@ -import ansiStyles from 'ansi-styles'; -import supportsColor from 'supports-color'; -import { +import ansiStyles from '#ansi-styles'; +import supportsColor from '#supports-color'; +import { // eslint-disable-line import/order stringReplaceAll, stringEncaseCRLFWithFirstIndex, -} from './util.js'; +} from './utilities.js'; const {stdout: stdoutColor, stderr: stderrColor} = supportsColor; diff --git a/source/util.js b/source/utilities.js similarity index 100% rename from source/util.js rename to source/utilities.js diff --git a/source/vendor/ansi-styles/index.d.ts b/source/vendor/ansi-styles/index.d.ts new file mode 100644 index 0000000..7518d2a --- /dev/null +++ b/source/vendor/ansi-styles/index.d.ts @@ -0,0 +1,190 @@ +export interface CSPair { // eslint-disable-line @typescript-eslint/naming-convention + /** + The ANSI terminal control sequence for starting this style. + */ + readonly open: string; + + /** + The ANSI terminal control sequence for ending this style. + */ + readonly close: string; +} + +export interface ColorBase { + /** + The ANSI terminal control sequence for ending this color. + */ + readonly close: string; + + ansi(code: number): string; + + ansi256(code: number): string; + + ansi16m(red: number, green: number, blue: number): string; +} + +export interface Modifier { + /** + Resets the current color chain. + */ + readonly reset: CSPair; + + /** + Make text bold. + */ + readonly bold: CSPair; + + /** + Emitting only a small amount of light. + */ + readonly dim: CSPair; + + /** + Make text italic. (Not widely supported) + */ + readonly italic: CSPair; + + /** + Make text underline. (Not widely supported) + */ + readonly underline: CSPair; + + /** + Make text overline. + + Supported on VTE-based terminals, the GNOME terminal, mintty, and Git Bash. + */ + readonly overline: CSPair; + + /** + Inverse background and foreground colors. + */ + readonly inverse: CSPair; + + /** + Prints the text, but makes it invisible. + */ + readonly hidden: CSPair; + + /** + Puts a horizontal line through the center of the text. (Not widely supported) + */ + readonly strikethrough: CSPair; +} + +export interface ForegroundColor { + readonly black: CSPair; + readonly red: CSPair; + readonly green: CSPair; + readonly yellow: CSPair; + readonly blue: CSPair; + readonly cyan: CSPair; + readonly magenta: CSPair; + readonly white: CSPair; + + /** + Alias for `blackBright`. + */ + readonly gray: CSPair; + + /** + Alias for `blackBright`. + */ + readonly grey: CSPair; + + readonly blackBright: CSPair; + readonly redBright: CSPair; + readonly greenBright: CSPair; + readonly yellowBright: CSPair; + readonly blueBright: CSPair; + readonly cyanBright: CSPair; + readonly magentaBright: CSPair; + readonly whiteBright: CSPair; +} + +export interface BackgroundColor { + readonly bgBlack: CSPair; + readonly bgRed: CSPair; + readonly bgGreen: CSPair; + readonly bgYellow: CSPair; + readonly bgBlue: CSPair; + readonly bgCyan: CSPair; + readonly bgMagenta: CSPair; + readonly bgWhite: CSPair; + + /** + Alias for `bgBlackBright`. + */ + readonly bgGray: CSPair; + + /** + Alias for `bgBlackBright`. + */ + readonly bgGrey: CSPair; + + readonly bgBlackBright: CSPair; + readonly bgRedBright: CSPair; + readonly bgGreenBright: CSPair; + readonly bgYellowBright: CSPair; + readonly bgBlueBright: CSPair; + readonly bgCyanBright: CSPair; + readonly bgMagentaBright: CSPair; + readonly bgWhiteBright: CSPair; +} + +export interface ConvertColor { + /** + Convert from the RGB color space to the ANSI 256 color space. + + @param red - (`0...255`) + @param green - (`0...255`) + @param blue - (`0...255`) + */ + rgbToAnsi256(red: number, green: number, blue: number): number; + + /** + Convert from the RGB HEX color space to the RGB color space. + + @param hex - A hexadecimal string containing RGB data. + */ + hexToRgb(hex: string): [red: number, green: number, blue: number]; + + /** + Convert from the RGB HEX color space to the ANSI 256 color space. + + @param hex - A hexadecimal string containing RGB data. + */ + hexToAnsi256(hex: string): number; + + /** + Convert from the ANSI 256 color space to the ANSI 16 color space. + + @param code - A number representing the ANSI 256 color. + */ + ansi256ToAnsi(code: number): number; + + /** + Convert from the RGB color space to the ANSI 16 color space. + + @param red - (`0...255`) + @param green - (`0...255`) + @param blue - (`0...255`) + */ + rgbToAnsi(red: number, green: number, blue: number): number; + + /** + Convert from the RGB HEX color space to the ANSI 16 color space. + + @param hex - A hexadecimal string containing RGB data. + */ + hexToAnsi(hex: string): number; +} + +declare const ansiStyles: { + readonly modifier: Modifier; + readonly color: ColorBase & ForegroundColor; + readonly bgColor: ColorBase & BackgroundColor; + readonly codes: ReadonlyMap; +} & ForegroundColor & BackgroundColor & Modifier & ConvertColor; + +export default ansiStyles; diff --git a/source/vendor/ansi-styles/index.js b/source/vendor/ansi-styles/index.js new file mode 100644 index 0000000..5746537 --- /dev/null +++ b/source/vendor/ansi-styles/index.js @@ -0,0 +1,219 @@ +const ANSI_BACKGROUND_OFFSET = 10; + +const wrapAnsi16 = (offset = 0) => code => `\u001B[${code + offset}m`; + +const wrapAnsi256 = (offset = 0) => code => `\u001B[${38 + offset};5;${code}m`; + +const wrapAnsi16m = (offset = 0) => (red, green, blue) => `\u001B[${38 + offset};2;${red};${green};${blue}m`; + +function assembleStyles() { + const codes = new Map(); + const styles = { + modifier: { + reset: [0, 0], + // 21 isn't widely supported and 22 does the same thing + bold: [1, 22], + dim: [2, 22], + italic: [3, 23], + underline: [4, 24], + overline: [53, 55], + inverse: [7, 27], + hidden: [8, 28], + strikethrough: [9, 29], + }, + color: { + black: [30, 39], + red: [31, 39], + green: [32, 39], + yellow: [33, 39], + blue: [34, 39], + magenta: [35, 39], + cyan: [36, 39], + white: [37, 39], + + // Bright color + blackBright: [90, 39], + redBright: [91, 39], + greenBright: [92, 39], + yellowBright: [93, 39], + blueBright: [94, 39], + magentaBright: [95, 39], + cyanBright: [96, 39], + whiteBright: [97, 39], + }, + bgColor: { + bgBlack: [40, 49], + bgRed: [41, 49], + bgGreen: [42, 49], + bgYellow: [43, 49], + bgBlue: [44, 49], + bgMagenta: [45, 49], + bgCyan: [46, 49], + bgWhite: [47, 49], + + // Bright color + bgBlackBright: [100, 49], + bgRedBright: [101, 49], + bgGreenBright: [102, 49], + bgYellowBright: [103, 49], + bgBlueBright: [104, 49], + bgMagentaBright: [105, 49], + bgCyanBright: [106, 49], + bgWhiteBright: [107, 49], + }, + }; + + // Alias bright black as gray (and grey) + styles.color.gray = styles.color.blackBright; + styles.bgColor.bgGray = styles.bgColor.bgBlackBright; + styles.color.grey = styles.color.blackBright; + styles.bgColor.bgGrey = styles.bgColor.bgBlackBright; + + for (const [groupName, group] of Object.entries(styles)) { + for (const [styleName, style] of Object.entries(group)) { + styles[styleName] = { + open: `\u001B[${style[0]}m`, + close: `\u001B[${style[1]}m`, + }; + + group[styleName] = styles[styleName]; + + codes.set(style[0], style[1]); + } + + Object.defineProperty(styles, groupName, { + value: group, + enumerable: false, + }); + } + + Object.defineProperty(styles, 'codes', { + value: codes, + enumerable: false, + }); + + styles.color.close = '\u001B[39m'; + styles.bgColor.close = '\u001B[49m'; + + styles.color.ansi = wrapAnsi16(); + styles.color.ansi256 = wrapAnsi256(); + styles.color.ansi16m = wrapAnsi16m(); + styles.bgColor.ansi = wrapAnsi16(ANSI_BACKGROUND_OFFSET); + styles.bgColor.ansi256 = wrapAnsi256(ANSI_BACKGROUND_OFFSET); + styles.bgColor.ansi16m = wrapAnsi16m(ANSI_BACKGROUND_OFFSET); + + // From https://github.com/Qix-/color-convert/blob/3f0e0d4e92e235796ccb17f6e85c72094a651f49/conversions.js + Object.defineProperties(styles, { + rgbToAnsi256: { + value: (red, green, blue) => { + // We use the extended greyscale palette here, with the exception of + // black and white. normal palette only has 4 greyscale shades. + if (red === green && green === blue) { + if (red < 8) { + return 16; + } + + if (red > 248) { + return 231; + } + + return Math.round(((red - 8) / 247) * 24) + 232; + } + + return 16 + + (36 * Math.round(red / 255 * 5)) + + (6 * Math.round(green / 255 * 5)) + + Math.round(blue / 255 * 5); + }, + enumerable: false, + }, + hexToRgb: { + value: hex => { + const matches = /(?[a-f\d]{6}|[a-f\d]{3})/i.exec(hex.toString(16)); + if (!matches) { + return [0, 0, 0]; + } + + let {colorString} = matches.groups; + + if (colorString.length === 3) { + colorString = [...colorString].map(character => character + character).join(''); + } + + const integer = Number.parseInt(colorString, 16); + + return [ + /* eslint-disable no-bitwise */ + (integer >> 16) & 0xFF, + (integer >> 8) & 0xFF, + integer & 0xFF, + /* eslint-enable no-bitwise */ + ]; + }, + enumerable: false, + }, + hexToAnsi256: { + value: hex => styles.rgbToAnsi256(...styles.hexToRgb(hex)), + enumerable: false, + }, + ansi256ToAnsi: { + value: code => { + if (code < 8) { + return 30 + code; + } + + if (code < 16) { + return 90 + (code - 8); + } + + let red; + let green; + let blue; + + if (code >= 232) { + red = (((code - 232) * 10) + 8) / 255; + green = red; + blue = red; + } else { + code -= 16; + + const remainder = code % 36; + + red = Math.floor(code / 36) / 5; + green = Math.floor(remainder / 6) / 5; + blue = (remainder % 6) / 5; + } + + const value = Math.max(red, green, blue) * 2; + + if (value === 0) { + return 30; + } + + // eslint-disable-next-line no-bitwise + let result = 30 + ((Math.round(blue) << 2) | (Math.round(green) << 1) | Math.round(red)); + + if (value === 2) { + result += 60; + } + + return result; + }, + enumerable: false, + }, + rgbToAnsi: { + value: (red, green, blue) => styles.ansi256ToAnsi(styles.rgbToAnsi256(red, green, blue)), + enumerable: false, + }, + hexToAnsi: { + value: hex => styles.ansi256ToAnsi(styles.hexToAnsi256(hex)), + enumerable: false, + }, + }); + + return styles; +} + +const ansiStyles = assembleStyles(); + +export default ansiStyles; diff --git a/source/vendor/supports-color/browser.d.ts b/source/vendor/supports-color/browser.d.ts new file mode 100644 index 0000000..0e8a9cc --- /dev/null +++ b/source/vendor/supports-color/browser.d.ts @@ -0,0 +1 @@ +export {default} from './index.js'; diff --git a/source/vendor/supports-color/browser.js b/source/vendor/supports-color/browser.js new file mode 100644 index 0000000..f4e9acd --- /dev/null +++ b/source/vendor/supports-color/browser.js @@ -0,0 +1,17 @@ +/* eslint-env browser */ + +const isBlinkBasedBrowser = /\b(Chrome|Chromium)\//.test(navigator.userAgent); + +const colorSupport = isBlinkBasedBrowser ? { + level: 1, + hasBasic: true, + has256: false, + has16m: false, +} : false; + +const supportsColor = { + stdout: colorSupport, + stderr: colorSupport, +}; + +export default supportsColor; diff --git a/source/vendor/supports-color/index.d.ts b/source/vendor/supports-color/index.d.ts new file mode 100644 index 0000000..98e3618 --- /dev/null +++ b/source/vendor/supports-color/index.d.ts @@ -0,0 +1,55 @@ +import {WriteStream} from 'node:tty'; + +export interface Options { + /** + Whether `process.argv` should be sniffed for `--color` and `--no-color` flags. + + @default true + */ + readonly sniffFlags?: boolean; +} + +/** +Levels: +- `0` - All colors disabled. +- `1` - Basic 16 colors support. +- `2` - ANSI 256 colors support. +- `3` - Truecolor 16 million colors support. +*/ +export type ColorSupportLevel = 0 | 1 | 2 | 3; + +/** +Detect whether the terminal supports color. +*/ +export interface ColorSupport { + /** + The color level. + */ + level: ColorSupportLevel; + + /** + Whether basic 16 colors are supported. + */ + hasBasic: boolean; + + /** + Whether ANSI 256 colors are supported. + */ + has256: boolean; + + /** + Whether Truecolor 16 million colors are supported. + */ + has16m: boolean; +} + +export type ColorInfo = ColorSupport | false; + +export function createSupportsColor(stream: WriteStream, options?: Options): ColorInfo; + +declare const supportsColor: { + stdout: ColorInfo; + stderr: ColorInfo; +}; + +export default supportsColor; diff --git a/source/vendor/supports-color/index.js b/source/vendor/supports-color/index.js new file mode 100644 index 0000000..55f813c --- /dev/null +++ b/source/vendor/supports-color/index.js @@ -0,0 +1,169 @@ +import process from 'node:process'; +import os from 'node:os'; +import tty from 'node:tty'; + +// From: https://github.com/sindresorhus/has-flag/blob/main/index.js +function hasFlag(flag, argv = process.argv) { + const prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--'); + const position = argv.indexOf(prefix + flag); + const terminatorPosition = argv.indexOf('--'); + return position !== -1 && (terminatorPosition === -1 || position < terminatorPosition); +} + +const {env} = process; + +let flagForceColor; +if ( + hasFlag('no-color') + || hasFlag('no-colors') + || hasFlag('color=false') + || hasFlag('color=never') +) { + flagForceColor = 0; +} else if ( + hasFlag('color') + || hasFlag('colors') + || hasFlag('color=true') + || hasFlag('color=always') +) { + flagForceColor = 1; +} + +function envForceColor() { + if ('FORCE_COLOR' in env) { + if (env.FORCE_COLOR === 'true') { + return 1; + } + + if (env.FORCE_COLOR === 'false') { + return 0; + } + + return env.FORCE_COLOR.length === 0 ? 1 : Math.min(Number.parseInt(env.FORCE_COLOR, 10), 3); + } +} + +function translateLevel(level) { + if (level === 0) { + return false; + } + + return { + level, + hasBasic: true, + has256: level >= 2, + has16m: level >= 3, + }; +} + +function _supportsColor(haveStream, {streamIsTTY, sniffFlags = true} = {}) { + const noFlagForceColor = envForceColor(); + if (noFlagForceColor !== undefined) { + flagForceColor = noFlagForceColor; + } + + const forceColor = sniffFlags ? flagForceColor : noFlagForceColor; + + if (forceColor === 0) { + return 0; + } + + if (sniffFlags) { + if (hasFlag('color=16m') + || hasFlag('color=full') + || hasFlag('color=truecolor')) { + return 3; + } + + if (hasFlag('color=256')) { + return 2; + } + } + + if (haveStream && !streamIsTTY && forceColor === undefined) { + return 0; + } + + const min = forceColor || 0; + + if (env.TERM === 'dumb') { + return min; + } + + if (process.platform === 'win32') { + // Windows 10 build 10586 is the first Windows release that supports 256 colors. + // Windows 10 build 14931 is the first release that supports 16m/TrueColor. + const osRelease = os.release().split('.'); + if ( + Number(osRelease[0]) >= 10 + && Number(osRelease[2]) >= 10_586 + ) { + return Number(osRelease[2]) >= 14_931 ? 3 : 2; + } + + return 1; + } + + if ('CI' in env) { + if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI', 'GITHUB_ACTIONS', 'BUILDKITE', 'DRONE'].some(sign => sign in env) || env.CI_NAME === 'codeship') { + return 1; + } + + return min; + } + + if ('TEAMCITY_VERSION' in env) { + return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; + } + + // Check for Azure DevOps pipelines + if ('TF_BUILD' in env && 'AGENT_NAME' in env) { + return 1; + } + + if (env.COLORTERM === 'truecolor') { + return 3; + } + + if ('TERM_PROGRAM' in env) { + const version = Number.parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); + + switch (env.TERM_PROGRAM) { + case 'iTerm.app': + return version >= 3 ? 3 : 2; + case 'Apple_Terminal': + return 2; + // No default + } + } + + if (/-256(color)?$/i.test(env.TERM)) { + return 2; + } + + if (/^screen|^xterm|^vt100|^vt220|^rxvt|color|ansi|cygwin|linux/i.test(env.TERM)) { + return 1; + } + + if ('COLORTERM' in env) { + return 1; + } + + return min; +} + +export function createSupportsColor(stream, options = {}) { + const level = _supportsColor(stream, { + streamIsTTY: stream && stream.isTTY, + ...options, + }); + + return translateLevel(level); +} + +const supportsColor = { + stdout: createSupportsColor({isTTY: tty.isatty(1)}), + stderr: createSupportsColor({isTTY: tty.isatty(2)}), +}; + +export default supportsColor; From 7a6893551d93ebe0bd031141b3e2b91d7e0676aa Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Fri, 26 Nov 2021 16:50:15 +0700 Subject: [PATCH 29/71] Fix code coverage --- .github/workflows/main.yml | 5 +++++ package.json | 21 ++++++++++++++------- readme.md | 5 ++++- source/utilities.js | 1 + 4 files changed, 24 insertions(+), 8 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index d36e1a8..ef5d807 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -10,6 +10,7 @@ jobs: fail-fast: false matrix: node-version: + - 16 - 14 - 12 steps: @@ -19,3 +20,7 @@ jobs: node-version: ${{ matrix.node-version }} - run: npm install - run: npm test + - uses: codecov/codecov-action@v2 + if: matrix.node-version == 16 + with: + fail_ci_if_error: true diff --git a/package.json b/package.json index a9b7d79..fd72b27 100644 --- a/package.json +++ b/package.json @@ -14,11 +14,12 @@ "default": "./source/vendor/supports-color/browser.js" } }, + "types": "./source/index.d.ts", "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, "scripts": { - "test": "xo && nyc ava && tsd", + "test": "xo && c8 ava && tsd", "bench": "matcha benchmark.js" }, "files": [ @@ -48,23 +49,29 @@ "text" ], "devDependencies": { + "@types/node": "^16.11.10", "ava": "^3.15.0", + "c8": "^7.10.0", "color-convert": "^2.0.1", - "coveralls": "^3.1.1", "execa": "^6.0.0", "log-update": "^5.0.0", "matcha": "^0.7.0", - "nyc": "^15.1.0", "tsd": "^0.19.0", - "typescript": "^4.5.2", "xo": "^0.47.0", "yoctodelay": "^2.0.0" }, - "types": "./source/index.d.ts", "xo": { "rules": { - "unicorn/prefer-string-slice": "off", - "unicorn/better-regex": "off" + "unicorn/prefer-string-slice": "off" } + }, + "c8": { + "reporter": [ + "text", + "lcov" + ], + "exclude": [ + "source/vendor" + ] } } diff --git a/readme.md b/readme.md index ed157bd..f6adc80 100644 --- a/readme.md +++ b/readme.md @@ -9,7 +9,7 @@ > Terminal string styling done right -[![Coverage Status](https://coveralls.io/repos/github/chalk/chalk/badge.svg?branch=main)](https://coveralls.io/github/chalk/chalk?branch=main) +[![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) @@ -72,6 +72,7 @@ - Expressive API - Highly performant +- No dependencies - Ability to nest styles - [256/Truecolor color support](#256-and-truecolor-color-support) - Auto-detects color support @@ -86,6 +87,8 @@ 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 diff --git a/source/utilities.js b/source/utilities.js index 4d8bc4a..5d49dad 100644 --- a/source/utilities.js +++ b/source/utilities.js @@ -1,3 +1,4 @@ +// TODO: When targeting Node.js 16, use `String.prototype.replaceAll`. export function stringReplaceAll(string, substring, replacer) { let index = string.indexOf(substring); if (index === -1) { From 4d5c4795ad24c326ae16bfe0c39c826c732716a9 Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Fri, 26 Nov 2021 16:57:26 +0700 Subject: [PATCH 30/71] 5.0.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index fd72b27..f693c87 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chalk", - "version": "4.1.0", + "version": "5.0.0", "description": "Terminal string styling done right", "license": "MIT", "repository": "chalk/chalk", From 85f7e96f758e95dee5211b9bca1a173b8fb3abe9 Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Wed, 9 Mar 2022 01:42:04 +0700 Subject: [PATCH 31/71] Add `main` field to package.json for backwards compatibiltiy Fixes #536 --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index f693c87..d3d644b 100644 --- a/package.json +++ b/package.json @@ -6,6 +6,7 @@ "repository": "chalk/chalk", "funding": "https://github.com/chalk/chalk?sponsor=1", "type": "module", + "main": "./source/index.js", "exports": "./source/index.js", "imports": { "#ansi-styles": "./source/vendor/ansi-styles/index.js", From bccde97f8a1bb125d4fe99e8fd355182101ff4f2 Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Wed, 9 Mar 2022 01:43:33 +0700 Subject: [PATCH 32/71] 5.0.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index d3d644b..7daddb2 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chalk", - "version": "5.0.0", + "version": "5.0.1", "description": "Terminal string styling done right", "license": "MIT", "repository": "chalk/chalk", From d28690e66b184dc19b9baaea1cce900737aa8ccc Mon Sep 17 00:00:00 2001 From: CommanderRoot Date: Sun, 27 Mar 2022 20:11:02 +0200 Subject: [PATCH 33/71] Refactor: Replace deprecated `String#substr()` (#541) --- source/utilities.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/utilities.js b/source/utilities.js index 5d49dad..4366dee 100644 --- a/source/utilities.js +++ b/source/utilities.js @@ -9,7 +9,7 @@ export function stringReplaceAll(string, substring, replacer) { let endIndex = 0; let returnValue = ''; do { - returnValue += string.substr(endIndex, index - endIndex) + substring + replacer; + returnValue += string.slice(endIndex, index) + substring + replacer; endIndex = index + substringLength; index = string.indexOf(substring, endIndex); } while (index !== -1); @@ -23,7 +23,7 @@ export function stringEncaseCRLFWithFirstIndex(string, prefix, postfix, index) { let returnValue = ''; do { const gotCR = string[index - 1] === '\r'; - returnValue += string.substr(endIndex, (gotCR ? index - 1 : index) - endIndex) + prefix + (gotCR ? '\r\n' : '\n') + postfix; + returnValue += string.slice(endIndex, (gotCR ? index - 1 : index)) + prefix + (gotCR ? '\r\n' : '\n') + postfix; endIndex = index + 1; index = string.indexOf('\n', endIndex); } while (index !== -1); From b17d862944f9efea1ee12aaf80fe19ed5063a34d Mon Sep 17 00:00:00 2001 From: Richie Bendall Date: Wed, 30 Mar 2022 18:41:57 +1300 Subject: [PATCH 34/71] Improve browser detection (#542) --- source/vendor/supports-color/browser.js | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/source/vendor/supports-color/browser.js b/source/vendor/supports-color/browser.js index f4e9acd..4e75e86 100644 --- a/source/vendor/supports-color/browser.js +++ b/source/vendor/supports-color/browser.js @@ -1,6 +1,8 @@ /* eslint-env browser */ -const isBlinkBasedBrowser = /\b(Chrome|Chromium)\//.test(navigator.userAgent); +const isBlinkBasedBrowser = navigator.userAgentData + ? navigator.userAgentData.brands.some(({brand}) => brand === 'Chromium') + : /\b(Chrome|Chromium)\//.test(navigator.userAgent); const colorSupport = isBlinkBasedBrowser ? { level: 1, From 503b9d35cd0a1fe2ac80deadd06def00db8221a0 Mon Sep 17 00:00:00 2001 From: LitoMore Date: Sun, 26 Jun 2022 20:58:46 +0800 Subject: [PATCH 35/71] Update Replit badge (#551) --- readme.md | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/readme.md b/readme.md index f6adc80..b57510e 100644 --- a/readme.md +++ b/readme.md @@ -10,8 +10,9 @@ > Terminal string styling done right [![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) +[![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://img.shields.io/badge/Run_on_Replit-130f26?logo=replit&logoColor=white)](https://repl.it/github/chalk/chalk) [![Support Chalk on DEV](https://badge.devprotocol.xyz/0x44d871aebF0126Bf646753E2C976Aa7e68A66c15/descriptive)](https://stakes.social/0x44d871aebF0126Bf646753E2C976Aa7e68A66c15) From ba5c385ecf6c2ad8a0fadb8b94e1ea515c8f9496 Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Sun, 3 Jul 2022 00:36:34 +0200 Subject: [PATCH 36/71] Update screenshot Fixes #554 --- examples/screenshot.js | 11 ++++++++++- media/screenshot.png | Bin 0 -> 240871 bytes readme.md | 2 +- 3 files changed, 11 insertions(+), 2 deletions(-) create mode 100644 media/screenshot.png diff --git a/examples/screenshot.js b/examples/screenshot.js index 6f66b77..9ad164b 100644 --- a/examples/screenshot.js +++ b/examples/screenshot.js @@ -6,7 +6,16 @@ import chalk from '../source/index.js'; for (const key of Object.keys(styles)) { let returnValue = key; - if (key === 'reset' || key === 'hidden' || key === 'grey') { + // We skip `overline` as almost no terminal supports it so we cannot show it off. + if ( + key === 'reset' + || key === 'hidden' + || key === 'grey' + || key === 'bgGray' + || key === 'bgGrey' + || key === 'overline' + || key.endsWith('Bright') + ) { continue; } diff --git a/media/screenshot.png b/media/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..da9d89bd2399d811d0bb2350d906f8a08f2afd6b GIT binary patch literal 240871 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�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%0A%EEOpCcEXvM1U;pO&N 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 Mr>mdKI;Vst07luhqyPW_ literal 0 HcmV?d00001 diff --git a/readme.md b/readme.md index b57510e..2f41876 100644 --- a/readme.md +++ b/readme.md @@ -15,7 +15,7 @@ [![run on repl.it](https://img.shields.io/badge/Run_on_Replit-130f26?logo=replit&logoColor=white)](https://repl.it/github/chalk/chalk) [![Support Chalk on DEV](https://badge.devprotocol.xyz/0x44d871aebF0126Bf646753E2C976Aa7e68A66c15/descriptive)](https://stakes.social/0x44d871aebF0126Bf646753E2C976Aa7e68A66c15) - +![](media/screenshot.png)
From c2311622c3f5b972cf80b9f353ea82679cc77edf Mon Sep 17 00:00:00 2001 From: Matt Schlenker Date: Sat, 24 Sep 2022 22:24:19 -0700 Subject: [PATCH 37/71] Use template literal types for simple color name transformations in the TypeScript types (#564) --- source/index.d.ts | 45 +++++++-------------------------------------- 1 file changed, 7 insertions(+), 38 deletions(-) diff --git a/source/index.d.ts b/source/index.d.ts index b2408c6..c840202 100644 --- a/source/index.d.ts +++ b/source/index.d.ts @@ -2,55 +2,24 @@ // import {ColorInfo, ColorSupportLevel} from '#supports-color'; import {ColorInfo, ColorSupportLevel} from './vendor/supports-color/index.js'; +type BasicColor = 'black' | 'red' | 'green' | 'yellow' | 'blue' | 'magenta' | 'cyan' | 'white'; +type BrightColor = `${BasicColor}Bright`; +type Grey = 'gray' | 'grey'; + /** Basic foreground colors. [More colors here.](https://github.com/chalk/chalk/blob/main/readme.md#256-and-truecolor-color-support) */ -export type ForegroundColor = - | 'black' - | 'red' - | 'green' - | 'yellow' - | 'blue' - | 'magenta' - | 'cyan' - | 'white' - | 'gray' - | 'grey' - | 'blackBright' - | 'redBright' - | 'greenBright' - | 'yellowBright' - | 'blueBright' - | 'magentaBright' - | 'cyanBright' - | 'whiteBright'; + +export type ForegroundColor = BasicColor | BrightColor | Grey; /** Basic background colors. [More colors here.](https://github.com/chalk/chalk/blob/main/readme.md#256-and-truecolor-color-support) */ -export type BackgroundColor = - | 'bgBlack' - | 'bgRed' - | 'bgGreen' - | 'bgYellow' - | 'bgBlue' - | 'bgMagenta' - | 'bgCyan' - | 'bgWhite' - | 'bgGray' - | 'bgGrey' - | 'bgBlackBright' - | 'bgRedBright' - | 'bgGreenBright' - | 'bgYellowBright' - | 'bgBlueBright' - | 'bgMagentaBright' - | 'bgCyanBright' - | 'bgWhiteBright'; +export type BackgroundColor = `bg${Capitalize}`; /** Basic colors. From 96f44c976bfcad5651b50831821ce75b441d272b Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Tue, 4 Oct 2022 21:22:40 +0700 Subject: [PATCH 38/71] Meta tweaks --- .github/workflows/main.yml | 5 +++-- package.json | 7 +++++-- readme.md | 25 ++++++++++++++----------- source/vendor/ansi-styles/index.js | 6 +++--- test/level.js | 2 +- 5 files changed, 26 insertions(+), 19 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index ef5d807..5cd8789 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -10,12 +10,13 @@ jobs: fail-fast: false matrix: node-version: + - 18 - 16 - 14 - 12 steps: - - uses: actions/checkout@v2 - - uses: actions/setup-node@v2 + - uses: actions/checkout@v3 + - uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - run: npm install diff --git a/package.json b/package.json index 7daddb2..aa639ff 100644 --- a/package.json +++ b/package.json @@ -58,12 +58,15 @@ "log-update": "^5.0.0", "matcha": "^0.7.0", "tsd": "^0.19.0", - "xo": "^0.47.0", + "xo": "^0.52.4", "yoctodelay": "^2.0.0" }, "xo": { "rules": { - "unicorn/prefer-string-slice": "off" + "unicorn/prefer-string-slice": "off", + "@typescript-eslint/consistent-type-imports": "off", + "@typescript-eslint/consistent-type-exports": "off", + "@typescript-eslint/consistent-type-definitions": "off" } }, "c8": { diff --git a/readme.md b/readme.md index 2f41876..cf4d414 100644 --- a/readme.md +++ b/readme.md @@ -13,7 +13,6 @@ [![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://img.shields.io/badge/Run_on_Replit-130f26?logo=replit&logoColor=white)](https://repl.it/github/chalk/chalk) -[![Support Chalk on DEV](https://badge.devprotocol.xyz/0x44d871aebF0126Bf646753E2C976Aa7e68A66c15/descriptive)](https://stakes.social/0x44d871aebF0126Bf646753E2C976Aa7e68A66c15) ![](media/screenshot.png) @@ -25,19 +24,19 @@

- Sindre Sorhus' open source work is supported by the community on GitHub Sponsors and Dev + Sindre Sorhus' open source work is supported by the community on GitHub Sponsors

Special thanks to:

- +

- +

@@ -62,6 +61,16 @@ It’s 100% JavaScript, fully customizable, and developer-first. +
+
+ +
+ StackAid +
+ Fund your open source dependencies +
+
+

@@ -80,7 +89,7 @@ - Doesn't extend `String.prototype` - Clean and focused - Actively maintained -- [Used by ~76,000 packages](https://www.npmjs.com/browse/depended/chalk) as of October 26, 2021 +- [Used by ~86,000 packages](https://www.npmjs.com/browse/depended/chalk) as of October 4, 2022 ## Install @@ -288,12 +297,6 @@ If you're on Windows, do yourself a favor and use [Windows Terminal](https://git [colors.js](https://github.com/Marak/colors.js) used to be the most popular string styling module, but it has serious deficiencies like extending `String.prototype` which causes all kinds of [problems](https://github.com/yeoman/yo/issues/68) and the package is unmaintained. Although there are other packages, they either do too much or not enough. Chalk is a clean and focused alternative. -## chalk for enterprise - -Available as part of the Tidelift Subscription. - -The maintainers of chalk and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. [Learn more.](https://tidelift.com/subscription/pkg/npm-chalk?utm_source=npm-chalk&utm_medium=referral&utm_campaign=enterprise&utm_term=repo) - ## Related - [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 diff --git a/source/vendor/ansi-styles/index.js b/source/vendor/ansi-styles/index.js index 5746537..50e9dfa 100644 --- a/source/vendor/ansi-styles/index.js +++ b/source/vendor/ansi-styles/index.js @@ -105,7 +105,7 @@ function assembleStyles() { // From https://github.com/Qix-/color-convert/blob/3f0e0d4e92e235796ccb17f6e85c72094a651f49/conversions.js Object.defineProperties(styles, { rgbToAnsi256: { - value: (red, green, blue) => { + value(red, green, blue) { // We use the extended greyscale palette here, with the exception of // black and white. normal palette only has 4 greyscale shades. if (red === green && green === blue) { @@ -128,7 +128,7 @@ function assembleStyles() { enumerable: false, }, hexToRgb: { - value: hex => { + value(hex) { const matches = /(?[a-f\d]{6}|[a-f\d]{3})/i.exec(hex.toString(16)); if (!matches) { return [0, 0, 0]; @@ -157,7 +157,7 @@ function assembleStyles() { enumerable: false, }, ansi256ToAnsi: { - value: code => { + value(code) { if (code < 8) { return 30 + code; } diff --git a/test/level.js b/test/level.js index f8efeba..367baa6 100644 --- a/test/level.js +++ b/test/level.js @@ -38,6 +38,6 @@ test('propagate enable/disable changes from child colors', t => { }); test('disable colors if they are not supported', async t => { - const {stdout} = await execaNode(fileURLToPath(new URL('./_fixture.js', import.meta.url))); + const {stdout} = await execaNode(fileURLToPath(new URL('_fixture.js', import.meta.url))); t.is(stdout, 'testout testerr'); }); From d7d75717b3d5a482edd0a1b98b35c7443791709f Mon Sep 17 00:00:00 2001 From: LitoMore Date: Wed, 5 Oct 2022 22:44:40 +0800 Subject: [PATCH 39/71] Expose style names (#566) Co-authored-by: Sindre Sorhus --- readme.md | 16 ++++++++++++++++ source/index.d.ts | 5 +++++ source/index.js | 5 +++++ 3 files changed, 26 insertions(+) diff --git a/readme.md b/readme.md index cf4d414..5431631 100644 --- a/readme.md +++ b/readme.md @@ -210,6 +210,22 @@ Explicit 256/Truecolor mode can be enabled using the `--color=256` and `--color= `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. +### modifiers, foregroundColors, backgroundColors, and colors + +All supported style strings are exposed as an array of strings for convenience. `colors` is the combination of `foregroundColors` and `backgroundColors`. + +This can be useful if you wrap Chalk and need to validate input: + +```js +import {modifiers, foregroundColors} from 'chalk'; + +console.log(modifiers.includes('bold')); +//=> true + +console.log(foregroundColors.includes('pink')); +//=> false +``` + ## Styles ### Modifiers diff --git a/source/index.d.ts b/source/index.d.ts index c840202..b0acc0f 100644 --- a/source/index.d.ts +++ b/source/index.d.ts @@ -284,4 +284,9 @@ export { // } from '#supports-color'; } from './vendor/supports-color/index.js'; +export const modifiers: readonly Modifiers[]; +export const foregroundColors: readonly ForegroundColor[]; +export const backgroundColors: readonly BackgroundColor[]; +export const colors: readonly Color[]; + export default chalk; diff --git a/source/index.js b/source/index.js index 302024b..340eb10 100644 --- a/source/index.js +++ b/source/index.js @@ -209,4 +209,9 @@ export { stderrColor as supportsColorStderr, }; +export const modifiers = Object.keys(ansiStyles.modifier); +export const foregroundColors = Object.keys(ansiStyles.color); +export const backgroundColors = Object.keys(ansiStyles.bgColor); +export const colors = [...foregroundColors, ...backgroundColors]; + export default chalk; From 92c55db46f2396c18764e55e6a52dcb49884a42b Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Wed, 5 Oct 2022 21:45:55 +0700 Subject: [PATCH 40/71] 5.1.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index aa639ff..f87ccd8 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chalk", - "version": "5.0.1", + "version": "5.1.0", "description": "Terminal string styling done right", "license": "MIT", "repository": "chalk/chalk", From 6e0df055f49b08158b570898cc816aad35f1a003 Mon Sep 17 00:00:00 2001 From: LitoMore Date: Wed, 12 Oct 2022 17:35:02 +0800 Subject: [PATCH 41/71] Export styles from `ansi-styles` (#567) --- readme.md | 10 +-- source/index.d.ts | 104 ++++++++++++++-------- source/index.js | 18 ++-- source/index.test-d.ts | 28 ++++-- source/vendor/ansi-styles/index.d.ts | 46 ++++++++++ source/vendor/ansi-styles/index.js | 128 ++++++++++++++------------- 6 files changed, 219 insertions(+), 115 deletions(-) diff --git a/readme.md b/readme.md index 5431631..f18b2aa 100644 --- a/readme.md +++ b/readme.md @@ -210,19 +210,19 @@ Explicit 256/Truecolor mode can be enabled using the `--color=256` and `--color= `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. -### modifiers, foregroundColors, backgroundColors, and colors +### modifierNames, foregroundColorNames, backgroundColorNames, and colorNames -All supported style strings are exposed as an array of strings for convenience. `colors` is the combination of `foregroundColors` and `backgroundColors`. +All supported style strings are exposed as an array of strings for convenience. `colorNames` is the combination of `foregroundColorNames` and `backgroundColorNames`. This can be useful if you wrap Chalk and need to validate input: ```js -import {modifiers, foregroundColors} from 'chalk'; +import {modifierNames, foregroundColorNames} from 'chalk'; -console.log(modifiers.includes('bold')); +console.log(modifierNames.includes('bold')); //=> true -console.log(foregroundColors.includes('pink')); +console.log(foregroundColorNames.includes('pink')); //=> false ``` diff --git a/source/index.d.ts b/source/index.d.ts index b0acc0f..b0cd2ae 100644 --- a/source/index.d.ts +++ b/source/index.d.ts @@ -1,45 +1,9 @@ // TODO: Make it this when TS suports that. +// import {ModifierName, ForegroundColor, BackgroundColor, ColorName} from '#ansi-styles'; // import {ColorInfo, ColorSupportLevel} from '#supports-color'; +import {ModifierName, ForegroundColorName, BackgroundColorName, ColorName} from './vendor/ansi-styles/index.js'; import {ColorInfo, ColorSupportLevel} from './vendor/supports-color/index.js'; -type BasicColor = 'black' | 'red' | 'green' | 'yellow' | 'blue' | 'magenta' | 'cyan' | 'white'; -type BrightColor = `${BasicColor}Bright`; -type Grey = 'gray' | 'grey'; - -/** -Basic foreground colors. - -[More colors here.](https://github.com/chalk/chalk/blob/main/readme.md#256-and-truecolor-color-support) -*/ - -export type ForegroundColor = BasicColor | BrightColor | Grey; - -/** -Basic background colors. - -[More colors here.](https://github.com/chalk/chalk/blob/main/readme.md#256-and-truecolor-color-support) -*/ -export type BackgroundColor = `bg${Capitalize}`; - -/** -Basic colors. - -[More colors here.](https://github.com/chalk/chalk/blob/main/readme.md#256-and-truecolor-color-support) -*/ -export type Color = ForegroundColor | BackgroundColor; - -export type Modifiers = - | 'reset' - | 'bold' - | 'dim' - | 'italic' - | 'underline' - | 'overline' - | 'inverse' - | 'hidden' - | 'strikethrough' - | 'visible'; - export interface Options { /** Specify the color support for Chalk. @@ -277,6 +241,12 @@ export const supportsColor: ColorInfo; export const chalkStderr: typeof chalk; export const supportsColorStderr: typeof supportsColor; +export { + ModifierName, ForegroundColorName, BackgroundColorName, ColorName, + modifierNames, foregroundColorNames, backgroundColorNames, colorNames, +// } from '#ansi-styles'; +} from './vendor/ansi-styles/index.js'; + export { ColorInfo, ColorSupport, @@ -284,9 +254,67 @@ export { // } from '#supports-color'; } from './vendor/supports-color/index.js'; +// TODO: Remove these aliases in the next major version +/** +@deprecated Use `ModifierName` instead. + +Basic modifier names. +*/ +export type Modifiers = ModifierName; + +/** +@deprecated Use `ForegroundColorName` instead. + +Basic foreground color names. + +[More colors here.](https://github.com/chalk/chalk/blob/main/readme.md#256-and-truecolor-color-support) +*/ +export type ForegroundColor = ForegroundColorName; + +/** +@deprecated Use `BackgroundColorName` instead. + +Basic background color names. + +[More colors here.](https://github.com/chalk/chalk/blob/main/readme.md#256-and-truecolor-color-support) +*/ +export type BackgroundColor = BackgroundColorName; + +/** +@deprecated Use `ColorName` instead. + +Basic color names. The combination of foreground and background color names. + +[More colors here.](https://github.com/chalk/chalk/blob/main/readme.md#256-and-truecolor-color-support) +*/ +export type Color = ColorName; + +/** +@deprecated Use `modifierNames` instead. + +Basic modifier names. +*/ export const modifiers: readonly Modifiers[]; + +/** +@deprecated Use `foregroundColorNames` instead. + +Basic foreground color names. +*/ export const foregroundColors: readonly ForegroundColor[]; + +/** +@deprecated Use `backgroundColorNames` instead. + +Basic background color names. +*/ export const backgroundColors: readonly BackgroundColor[]; + +/** +@deprecated Use `colorNames` instead. + +Basic color names. The combination of foreground and background color names. +*/ export const colors: readonly Color[]; export default chalk; diff --git a/source/index.js b/source/index.js index 340eb10..8bc993d 100644 --- a/source/index.js +++ b/source/index.js @@ -204,14 +204,22 @@ Object.defineProperties(createChalk.prototype, styles); const chalk = createChalk(); export const chalkStderr = createChalk({level: stderrColor ? stderrColor.level : 0}); +export { + modifierNames, + foregroundColorNames, + backgroundColorNames, + colorNames, + + // TODO: Remove these aliases in the next major version + modifierNames as modifiers, + foregroundColorNames as foregroundColors, + backgroundColorNames as backgroundColors, + colorNames as colors, +} from './vendor/ansi-styles/index.js'; + export { stdoutColor as supportsColor, stderrColor as supportsColorStderr, }; -export const modifiers = Object.keys(ansiStyles.modifier); -export const foregroundColors = Object.keys(ansiStyles.color); -export const backgroundColors = Object.keys(ansiStyles.bgColor); -export const colors = [...foregroundColors, ...backgroundColors]; - export default chalk; diff --git a/source/index.test-d.ts b/source/index.test-d.ts index a1ef854..e729675 100644 --- a/source/index.test-d.ts +++ b/source/index.test-d.ts @@ -1,5 +1,9 @@ -import {expectType, expectAssignable, expectError} from 'tsd'; -import chalk, {Chalk, ChalkInstance, Color, ColorInfo, ColorSupport, ColorSupportLevel, chalkStderr, supportsColor, supportsColorStderr} from './index.js'; +import {expectType, expectAssignable, expectError, expectDeprecated} from 'tsd'; +import chalk, { + Chalk, ChalkInstance, ColorInfo, ColorSupport, ColorSupportLevel, chalkStderr, supportsColor, supportsColorStderr, + ModifierName, ForegroundColorName, BackgroundColorName, ColorName, + Modifiers, +} from './index.js'; // - supportsColor - expectType(supportsColor); @@ -141,6 +145,20 @@ expectType(chalk.underline``); expectType(chalk.red.bgGreen.bold`Hello {italic.blue ${name}}`); expectType(chalk.strikethrough.cyanBright.bgBlack`Works with {reset {bold numbers}} {bold.red ${1}}`); -// -- Color types == -expectAssignable('red'); -expectError('hotpink'); +// -- Modifiers types +expectAssignable('strikethrough'); +expectError('delete'); + +// -- Foreground types +expectAssignable('red'); +expectError('pink'); + +// -- Background types +expectAssignable('bgRed'); +expectError('bgPink'); + +// -- Color types -- +expectAssignable('red'); +expectAssignable('bgRed'); +expectError('hotpink'); +expectError('bgHotpink'); diff --git a/source/vendor/ansi-styles/index.d.ts b/source/vendor/ansi-styles/index.d.ts index 7518d2a..58f133a 100644 --- a/source/vendor/ansi-styles/index.d.ts +++ b/source/vendor/ansi-styles/index.d.ts @@ -180,6 +180,52 @@ export interface ConvertColor { hexToAnsi(hex: string): number; } +/** +Basic modifier names. +*/ +export type ModifierName = keyof Modifier; + +/** +Basic foreground color names. + +[More colors here.](https://github.com/chalk/chalk/blob/main/readme.md#256-and-truecolor-color-support) +*/ +export type ForegroundColorName = keyof ForegroundColor; + +/** +Basic background color names. + +[More colors here.](https://github.com/chalk/chalk/blob/main/readme.md#256-and-truecolor-color-support) +*/ +export type BackgroundColorName = keyof BackgroundColor; + +/** +Basic color names. The combination of foreground and background color names. + +[More colors here.](https://github.com/chalk/chalk/blob/main/readme.md#256-and-truecolor-color-support) +*/ +export type ColorName = ForegroundColorName | BackgroundColorName; + +/** +Basic modifier names. +*/ +export const modifierNames: readonly ModifierName[]; + +/** +Basic foreground color names. +*/ +export const foregroundColorNames: readonly ForegroundColorName[]; + +/** +Basic background color names. +*/ +export const backgroundColorNames: readonly BackgroundColorName[]; + +/* +Basic color names. The combination of foreground and background color names. +*/ +export const colorNames: readonly ColorName[]; + declare const ansiStyles: { readonly modifier: Modifier; readonly color: ColorBase & ForegroundColor; diff --git a/source/vendor/ansi-styles/index.js b/source/vendor/ansi-styles/index.js index 50e9dfa..bd1010c 100644 --- a/source/vendor/ansi-styles/index.js +++ b/source/vendor/ansi-styles/index.js @@ -6,68 +6,67 @@ const wrapAnsi256 = (offset = 0) => code => `\u001B[${38 + offset};5;${code}m`; const wrapAnsi16m = (offset = 0) => (red, green, blue) => `\u001B[${38 + offset};2;${red};${green};${blue}m`; +const styles = { + modifier: { + reset: [0, 0], + // 21 isn't widely supported and 22 does the same thing + bold: [1, 22], + dim: [2, 22], + italic: [3, 23], + underline: [4, 24], + overline: [53, 55], + inverse: [7, 27], + hidden: [8, 28], + strikethrough: [9, 29], + }, + color: { + black: [30, 39], + red: [31, 39], + green: [32, 39], + yellow: [33, 39], + blue: [34, 39], + magenta: [35, 39], + cyan: [36, 39], + white: [37, 39], + + // Bright color + blackBright: [90, 39], + gray: [90, 39], // Alias of `blackBright` + grey: [90, 39], // Alias of `blackBright` + redBright: [91, 39], + greenBright: [92, 39], + yellowBright: [93, 39], + blueBright: [94, 39], + magentaBright: [95, 39], + cyanBright: [96, 39], + whiteBright: [97, 39], + }, + bgColor: { + bgBlack: [40, 49], + bgRed: [41, 49], + bgGreen: [42, 49], + bgYellow: [43, 49], + bgBlue: [44, 49], + bgMagenta: [45, 49], + bgCyan: [46, 49], + bgWhite: [47, 49], + + // Bright color + bgBlackBright: [100, 49], + bgGray: [100, 49], // Alias of `bgBlackBright` + bgGrey: [100, 49], // Alias of `bgBlackBright` + bgRedBright: [101, 49], + bgGreenBright: [102, 49], + bgYellowBright: [103, 49], + bgBlueBright: [104, 49], + bgMagentaBright: [105, 49], + bgCyanBright: [106, 49], + bgWhiteBright: [107, 49], + }, +}; + function assembleStyles() { const codes = new Map(); - const styles = { - modifier: { - reset: [0, 0], - // 21 isn't widely supported and 22 does the same thing - bold: [1, 22], - dim: [2, 22], - italic: [3, 23], - underline: [4, 24], - overline: [53, 55], - inverse: [7, 27], - hidden: [8, 28], - strikethrough: [9, 29], - }, - color: { - black: [30, 39], - red: [31, 39], - green: [32, 39], - yellow: [33, 39], - blue: [34, 39], - magenta: [35, 39], - cyan: [36, 39], - white: [37, 39], - - // Bright color - blackBright: [90, 39], - redBright: [91, 39], - greenBright: [92, 39], - yellowBright: [93, 39], - blueBright: [94, 39], - magentaBright: [95, 39], - cyanBright: [96, 39], - whiteBright: [97, 39], - }, - bgColor: { - bgBlack: [40, 49], - bgRed: [41, 49], - bgGreen: [42, 49], - bgYellow: [43, 49], - bgBlue: [44, 49], - bgMagenta: [45, 49], - bgCyan: [46, 49], - bgWhite: [47, 49], - - // Bright color - bgBlackBright: [100, 49], - bgRedBright: [101, 49], - bgGreenBright: [102, 49], - bgYellowBright: [103, 49], - bgBlueBright: [104, 49], - bgMagentaBright: [105, 49], - bgCyanBright: [106, 49], - bgWhiteBright: [107, 49], - }, - }; - - // Alias bright black as gray (and grey) - styles.color.gray = styles.color.blackBright; - styles.bgColor.bgGray = styles.bgColor.bgBlackBright; - styles.color.grey = styles.color.blackBright; - styles.bgColor.bgGrey = styles.bgColor.bgBlackBright; for (const [groupName, group] of Object.entries(styles)) { for (const [styleName, style] of Object.entries(group)) { @@ -129,12 +128,12 @@ function assembleStyles() { }, hexToRgb: { value(hex) { - const matches = /(?[a-f\d]{6}|[a-f\d]{3})/i.exec(hex.toString(16)); + const matches = /[a-f\d]{6}|[a-f\d]{3}/i.exec(hex.toString(16)); if (!matches) { return [0, 0, 0]; } - let {colorString} = matches.groups; + let [colorString] = matches; if (colorString.length === 3) { colorString = [...colorString].map(character => character + character).join(''); @@ -217,3 +216,8 @@ function assembleStyles() { const ansiStyles = assembleStyles(); export default ansiStyles; + +export const modifierNames = Object.keys(styles.modifier); +export const foregroundColorNames = Object.keys(styles.color); +export const backgroundColorNames = Object.keys(styles.bgColor); +export const colorNames = [...foregroundColorNames, ...backgroundColorNames]; From 1b4cd21fb15ca441ab8ff1fc4ce9fcd1365e4b7d Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Wed, 12 Oct 2022 16:36:43 +0700 Subject: [PATCH 42/71] 5.1.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index f87ccd8..1736ff9 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chalk", - "version": "5.1.0", + "version": "5.1.1", "description": "Terminal string styling done right", "license": "MIT", "repository": "chalk/chalk", From a34bcf63273cd94da041b9507ce57f0f3fd1e89e Mon Sep 17 00:00:00 2001 From: LitoMore Date: Thu, 13 Oct 2022 00:30:36 +0800 Subject: [PATCH 43/71] Fix exported styles names (#569) --- source/vendor/ansi-styles/index.js | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/source/vendor/ansi-styles/index.js b/source/vendor/ansi-styles/index.js index bd1010c..eaa7bed 100644 --- a/source/vendor/ansi-styles/index.js +++ b/source/vendor/ansi-styles/index.js @@ -65,6 +65,11 @@ const styles = { }, }; +export const modifierNames = Object.keys(styles.modifier); +export const foregroundColorNames = Object.keys(styles.color); +export const backgroundColorNames = Object.keys(styles.bgColor); +export const colorNames = [...foregroundColorNames, ...backgroundColorNames]; + function assembleStyles() { const codes = new Map(); @@ -216,8 +221,3 @@ function assembleStyles() { const ansiStyles = assembleStyles(); export default ansiStyles; - -export const modifierNames = Object.keys(styles.modifier); -export const foregroundColorNames = Object.keys(styles.color); -export const backgroundColorNames = Object.keys(styles.bgColor); -export const colorNames = [...foregroundColorNames, ...backgroundColorNames]; From 158bf4429ee5c40fd23d45b7d43e5cbbbdf6795e Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Wed, 12 Oct 2022 23:31:43 +0700 Subject: [PATCH 44/71] 5.1.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 1736ff9..cc07db0 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chalk", - "version": "5.1.1", + "version": "5.1.2", "description": "Terminal string styling done right", "license": "MIT", "repository": "chalk/chalk", From c3d14f9ea81713a05d834434027a35de14c17751 Mon Sep 17 00:00:00 2001 From: Daniel Li Date: Thu, 20 Oct 2022 03:29:51 -0700 Subject: [PATCH 45/71] Update link to Truecolor in the readme (#573) --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index f18b2aa..4c620a2 100644 --- a/readme.md +++ b/readme.md @@ -281,7 +281,7 @@ console.log(foregroundColorNames.includes('pink')); ## 256 and Truecolor color support -Chalk supports 256 colors and [Truecolor](https://gist.github.com/XVilka/8346728) (16 million colors) on supported terminal apps. +Chalk supports 256 colors and [Truecolor](https://github.com/termstandard/colors) (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). From 79c56dfc1ea57b6762984aac86ab89acd6a9bc2c Mon Sep 17 00:00:00 2001 From: LitoMore Date: Mon, 31 Oct 2022 00:54:53 +0800 Subject: [PATCH 46/71] Update Replit badge (#576) --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 4c620a2..a3e14ce 100644 --- a/readme.md +++ b/readme.md @@ -12,7 +12,7 @@ [![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://img.shields.io/badge/Run_on_Replit-130f26?logo=replit&logoColor=white)](https://repl.it/github/chalk/chalk) +[![run on repl.it](https://img.shields.io/badge/Run_on_Replit-f26207?logo=replit&logoColor=white)](https://repl.it/github/chalk/chalk) ![](media/screenshot.png) From a027e3c1e0fa8dcd850e20b7a99e73a5278e8f9a Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Thu, 17 Nov 2022 01:56:01 +0700 Subject: [PATCH 47/71] Minor tweaks --- .github/workflows/main.yml | 1 - examples/rainbow.js | 8 +++----- package.json | 2 +- readme.md | 12 ------------ source/vendor/supports-color/index.js | 7 +++++-- 5 files changed, 9 insertions(+), 21 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 5cd8789..10bb5ee 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -13,7 +13,6 @@ jobs: - 18 - 16 - 14 - - 12 steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 diff --git a/examples/rainbow.js b/examples/rainbow.js index 3501dab..71e3c37 100644 --- a/examples/rainbow.js +++ b/examples/rainbow.js @@ -33,8 +33,6 @@ async function animateString(string) { } } -(async () => { - console.log(); - await animateString('We hope you enjoy Chalk! <3'); - console.log(); -})(); +console.log(); +await animateString('We hope you enjoy Chalk! <3'); +console.log(); diff --git a/package.json b/package.json index cc07db0..8f55398 100644 --- a/package.json +++ b/package.json @@ -58,7 +58,7 @@ "log-update": "^5.0.0", "matcha": "^0.7.0", "tsd": "^0.19.0", - "xo": "^0.52.4", + "xo": "^0.53.0", "yoctodelay": "^2.0.0" }, "xo": { diff --git a/readme.md b/readme.md index a3e14ce..93511c0 100644 --- a/readme.md +++ b/readme.md @@ -40,18 +40,6 @@

- -
- Doppler -
- All your environment variables, in one place -
- Stop struggling with scattered API keys, hacking together home-brewed tools, -
- and avoiding access controls. Keep your team and servers in sync with Doppler. -
-
-
Strapi diff --git a/source/vendor/supports-color/index.js b/source/vendor/supports-color/index.js index 55f813c..130c8b9 100644 --- a/source/vendor/supports-color/index.js +++ b/source/vendor/supports-color/index.js @@ -129,10 +129,13 @@ function _supportsColor(haveStream, {streamIsTTY, sniffFlags = true} = {}) { const version = Number.parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); switch (env.TERM_PROGRAM) { - case 'iTerm.app': + case 'iTerm.app': { return version >= 3 ? 3 : 2; - case 'Apple_Terminal': + } + + case 'Apple_Terminal': { return 2; + } // No default } } From 7443e9faa05b470a8a53850c2ded16fa0810a407 Mon Sep 17 00:00:00 2001 From: idanran <96647698+idanran@users.noreply.github.com> Date: Fri, 9 Dec 2022 02:43:43 +0800 Subject: [PATCH 48/71] Update `supports-color` dependency (#579) --- source/vendor/supports-color/browser.js | 27 +++++++++++++++++-------- source/vendor/supports-color/index.d.ts | 12 +++++------ source/vendor/supports-color/index.js | 21 +++++++++++++------ 3 files changed, 40 insertions(+), 20 deletions(-) diff --git a/source/vendor/supports-color/browser.js b/source/vendor/supports-color/browser.js index 4e75e86..9fa6888 100644 --- a/source/vendor/supports-color/browser.js +++ b/source/vendor/supports-color/browser.js @@ -1,15 +1,26 @@ /* eslint-env browser */ -const isBlinkBasedBrowser = navigator.userAgentData - ? navigator.userAgentData.brands.some(({brand}) => brand === 'Chromium') - : /\b(Chrome|Chromium)\//.test(navigator.userAgent); +const level = (() => { + if (navigator.userAgentData) { + const brand = navigator.userAgentData.brands.find(({brand}) => brand === 'Chromium'); + if (brand && brand.version > 93) { + return 3; + } + } -const colorSupport = isBlinkBasedBrowser ? { - level: 1, + if (/\b(Chrome|Chromium)\//.test(navigator.userAgent)) { + return 1; + } + + return 0; +})(); + +const colorSupport = level !== 0 && { + level, hasBasic: true, - has256: false, - has16m: false, -} : false; + has256: level >= 2, + has16m: level >= 3, +}; const supportsColor = { stdout: colorSupport, diff --git a/source/vendor/supports-color/index.d.ts b/source/vendor/supports-color/index.d.ts index 98e3618..db44a78 100644 --- a/source/vendor/supports-color/index.d.ts +++ b/source/vendor/supports-color/index.d.ts @@ -1,13 +1,13 @@ -import {WriteStream} from 'node:tty'; +import type {WriteStream} from 'node:tty'; -export interface Options { +export type Options = { /** Whether `process.argv` should be sniffed for `--color` and `--no-color` flags. @default true */ readonly sniffFlags?: boolean; -} +}; /** Levels: @@ -21,7 +21,7 @@ export type ColorSupportLevel = 0 | 1 | 2 | 3; /** Detect whether the terminal supports color. */ -export interface ColorSupport { +export type ColorSupport = { /** The color level. */ @@ -41,11 +41,11 @@ export interface ColorSupport { Whether Truecolor 16 million colors are supported. */ has16m: boolean; -} +}; export type ColorInfo = ColorSupport | false; -export function createSupportsColor(stream: WriteStream, options?: Options): ColorInfo; +export function createSupportsColor(stream?: WriteStream, options?: Options): ColorInfo; declare const supportsColor: { stdout: ColorInfo; diff --git a/source/vendor/supports-color/index.js b/source/vendor/supports-color/index.js index 130c8b9..a7cea61 100644 --- a/source/vendor/supports-color/index.js +++ b/source/vendor/supports-color/index.js @@ -3,7 +3,7 @@ import os from 'node:os'; import tty from 'node:tty'; // From: https://github.com/sindresorhus/has-flag/blob/main/index.js -function hasFlag(flag, argv = process.argv) { +function hasFlag(flag, argv = globalThis.Deno ? globalThis.Deno.args : process.argv) { const prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--'); const position = argv.indexOf(prefix + flag); const terminatorPosition = argv.indexOf('--'); @@ -80,6 +80,12 @@ function _supportsColor(haveStream, {streamIsTTY, sniffFlags = true} = {}) { } } + // Check for Azure DevOps pipelines. + // Has to be above the `!streamIsTTY` check. + if ('TF_BUILD' in env && 'AGENT_NAME' in env) { + return 1; + } + if (haveStream && !streamIsTTY && forceColor === undefined) { return 0; } @@ -105,7 +111,11 @@ function _supportsColor(haveStream, {streamIsTTY, sniffFlags = true} = {}) { } if ('CI' in env) { - if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI', 'GITHUB_ACTIONS', 'BUILDKITE', 'DRONE'].some(sign => sign in env) || env.CI_NAME === 'codeship') { + if ('GITHUB_ACTIONS' in env) { + return 3; + } + + if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI', 'BUILDKITE', 'DRONE'].some(sign => sign in env) || env.CI_NAME === 'codeship') { return 1; } @@ -116,12 +126,11 @@ function _supportsColor(haveStream, {streamIsTTY, sniffFlags = true} = {}) { return /^(9\.(0*[1-9]\d*)\.|\d{2,}\.)/.test(env.TEAMCITY_VERSION) ? 1 : 0; } - // Check for Azure DevOps pipelines - if ('TF_BUILD' in env && 'AGENT_NAME' in env) { - return 1; + if (env.COLORTERM === 'truecolor') { + return 3; } - if (env.COLORTERM === 'truecolor') { + if (env.TERM === 'xterm-kitty') { return 3; } From a370f468a43999e4397094ff5c3d17aadcc4860e Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Thu, 8 Dec 2022 19:46:06 +0100 Subject: [PATCH 49/71] 5.2.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 8f55398..ddcf758 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chalk", - "version": "5.1.2", + "version": "5.2.0", "description": "Terminal string styling done right", "license": "MIT", "repository": "chalk/chalk", From 29b856959f4bee5a514c7ed48a1f6879686eadf2 Mon Sep 17 00:00:00 2001 From: silverwind Date: Thu, 29 Jun 2023 12:47:28 +0200 Subject: [PATCH 50/71] Update `supports-color` to 9.4.0 (#603) Co-authored-by: Sindre Sorhus --- source/vendor/supports-color/browser.js | 2 +- source/vendor/supports-color/index.js | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/source/vendor/supports-color/browser.js b/source/vendor/supports-color/browser.js index 9fa6888..1ffde64 100644 --- a/source/vendor/supports-color/browser.js +++ b/source/vendor/supports-color/browser.js @@ -3,7 +3,7 @@ const level = (() => { if (navigator.userAgentData) { const brand = navigator.userAgentData.brands.find(({brand}) => brand === 'Chromium'); - if (brand && brand.version > 93) { + if (brand?.version > 93) { return 3; } } diff --git a/source/vendor/supports-color/index.js b/source/vendor/supports-color/index.js index a7cea61..4ce0a2d 100644 --- a/source/vendor/supports-color/index.js +++ b/source/vendor/supports-color/index.js @@ -3,6 +3,7 @@ import os from 'node:os'; import tty from 'node:tty'; // From: https://github.com/sindresorhus/has-flag/blob/main/index.js +/// function hasFlag(flag, argv = globalThis.Deno?.args ?? process.argv) { function hasFlag(flag, argv = globalThis.Deno ? globalThis.Deno.args : process.argv) { const prefix = flag.startsWith('-') ? '' : (flag.length === 1 ? '-' : '--'); const position = argv.indexOf(prefix + flag); @@ -111,7 +112,7 @@ function _supportsColor(haveStream, {streamIsTTY, sniffFlags = true} = {}) { } if ('CI' in env) { - if ('GITHUB_ACTIONS' in env) { + if ('GITHUB_ACTIONS' in env || 'GITEA_ACTIONS' in env) { return 3; } From df0e69df5129a5e19acc7ae0199319a104d0e6cc Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Thu, 29 Jun 2023 12:49:29 +0200 Subject: [PATCH 51/71] Fix CI --- package.json | 3 ++- source/vendor/supports-color/browser.js | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index ddcf758..0d05e4e 100644 --- a/package.json +++ b/package.json @@ -66,7 +66,8 @@ "unicorn/prefer-string-slice": "off", "@typescript-eslint/consistent-type-imports": "off", "@typescript-eslint/consistent-type-exports": "off", - "@typescript-eslint/consistent-type-definitions": "off" + "@typescript-eslint/consistent-type-definitions": "off", + "unicorn/expiring-todo-comments": "off" } }, "c8": { diff --git a/source/vendor/supports-color/browser.js b/source/vendor/supports-color/browser.js index 1ffde64..9fa6888 100644 --- a/source/vendor/supports-color/browser.js +++ b/source/vendor/supports-color/browser.js @@ -3,7 +3,7 @@ const level = (() => { if (navigator.userAgentData) { const brand = navigator.userAgentData.brands.find(({brand}) => brand === 'Chromium'); - if (brand?.version > 93) { + if (brand && brand.version > 93) { return 3; } } From 5aafc0af74d06c89a2a4567aaf9d84d44af4a3aa Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Thu, 29 Jun 2023 12:52:59 +0200 Subject: [PATCH 52/71] Add `sideEffects` field to package.json Fixes #585 --- package.json | 1 + 1 file changed, 1 insertion(+) diff --git a/package.json b/package.json index 0d05e4e..7447a1f 100644 --- a/package.json +++ b/package.json @@ -61,6 +61,7 @@ "xo": "^0.53.0", "yoctodelay": "^2.0.0" }, + "sideEffects": false, "xo": { "rules": { "unicorn/prefer-string-slice": "off", From 72c742d4716b1f94bb24bbda86d96fbb247ca646 Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Thu, 29 Jun 2023 12:56:55 +0200 Subject: [PATCH 53/71] 5.3.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 7447a1f..3c50010 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chalk", - "version": "5.2.0", + "version": "5.3.0", "description": "Terminal string styling done right", "license": "MIT", "repository": "chalk/chalk", From f399cd0ff69841e88cca89d43a49f1cc9ba2efd5 Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Thu, 29 Jun 2023 14:45:41 +0200 Subject: [PATCH 54/71] Meta tweaks --- readme.md | 8 -------- 1 file changed, 8 deletions(-) diff --git a/readme.md b/readme.md index 93511c0..b4e0849 100644 --- a/readme.md +++ b/readme.md @@ -51,14 +51,6 @@

- -
- StackAid -
- Fund your open source dependencies -
-
-

From f7b29ae8ef4fd2048e08aa361778d290ed10ce7a Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Wed, 16 Aug 2023 12:14:40 +0200 Subject: [PATCH 55/71] Remove repl.it badge Fixes #587 --- readme.md | 1 - 1 file changed, 1 deletion(-) diff --git a/readme.md b/readme.md index b4e0849..7cd796d 100644 --- a/readme.md +++ b/readme.md @@ -12,7 +12,6 @@ [![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://img.shields.io/badge/Run_on_Replit-f26207?logo=replit&logoColor=white)](https://repl.it/github/chalk/chalk) ![](media/screenshot.png) From 2db3c7701ec87a1d88b3c636dd46d3d985304bce Mon Sep 17 00:00:00 2001 From: Edwin Kofler Date: Fri, 5 Jan 2024 17:08:07 -0800 Subject: [PATCH 56/71] Remove .replit file (#622) --- .replit | 2 -- 1 file changed, 2 deletions(-) delete mode 100644 .replit diff --git a/.replit b/.replit deleted file mode 100644 index cf3930d..0000000 --- a/.replit +++ /dev/null @@ -1,2 +0,0 @@ -language = "nodejs" -run = "cd examples && node rainbow" From 386909ee0bfe4346d04e3eeba712f0db597c038d Mon Sep 17 00:00:00 2001 From: Richie Bendall Date: Sat, 20 Jan 2024 03:36:11 +1300 Subject: [PATCH 57/71] Tweak example (#623) --- examples/rainbow.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/rainbow.js b/examples/rainbow.js index 71e3c37..cfc4cef 100644 --- a/examples/rainbow.js +++ b/examples/rainbow.js @@ -1,6 +1,6 @@ +import {setTimeout as delay} from 'node:timers/promises'; import convertColor from 'color-convert'; import updateLog from 'log-update'; -import delay from 'yoctodelay'; import chalk from '../source/index.js'; const ignoreChars = /[^!-~]/g; From 795273f17a94329c7a46247d8277f9afc2f0a6d9 Mon Sep 17 00:00:00 2001 From: Lightner <79603731+LightnerDev@users.noreply.github.com> Date: Fri, 5 Jul 2024 05:41:35 -0500 Subject: [PATCH 58/71] Update dependents number in readme (#629) --- readme.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/readme.md b/readme.md index 7cd796d..d52688b 100644 --- a/readme.md +++ b/readme.md @@ -68,7 +68,7 @@ - Doesn't extend `String.prototype` - Clean and focused - Actively maintained -- [Used by ~86,000 packages](https://www.npmjs.com/browse/depended/chalk) as of October 4, 2022 +- [Used by ~115,000 packages](https://www.npmjs.com/browse/depended/chalk) as of July 4, 2024 ## Install From 77126fba1328bb1b5524c45164d0a44074d5179d Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Sat, 11 Nov 2023 19:54:30 +0700 Subject: [PATCH 59/71] Meta tweaks --- .github/workflows/main.yml | 4 ++-- examples/rainbow.js | 2 +- package.json | 4 ++-- readme.md | 42 -------------------------------------- source/index.d.ts | 7 ++++++- source/index.test-d.ts | 21 ++++++++++++++++--- 6 files changed, 29 insertions(+), 51 deletions(-) diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml index 10bb5ee..d588995 100644 --- a/.github/workflows/main.yml +++ b/.github/workflows/main.yml @@ -14,8 +14,8 @@ jobs: - 16 - 14 steps: - - uses: actions/checkout@v3 - - uses: actions/setup-node@v3 + - uses: actions/checkout@v4 + - uses: actions/setup-node@v4 with: node-version: ${{ matrix.node-version }} - run: npm install diff --git a/examples/rainbow.js b/examples/rainbow.js index cfc4cef..5b2b1d2 100644 --- a/examples/rainbow.js +++ b/examples/rainbow.js @@ -10,7 +10,7 @@ function rainbow(string, offset) { return string; } - const hueStep = 360 / string.replace(ignoreChars, '').length; + const hueStep = 360 / string.replaceAll(ignoreChars, '').length; let hue = offset % 360; const characters = []; diff --git a/package.json b/package.json index 3c50010..4eb7f11 100644 --- a/package.json +++ b/package.json @@ -16,6 +16,7 @@ } }, "types": "./source/index.d.ts", + "sideEffects": false, "engines": { "node": "^12.17.0 || ^14.13 || >=16.0.0" }, @@ -58,10 +59,9 @@ "log-update": "^5.0.0", "matcha": "^0.7.0", "tsd": "^0.19.0", - "xo": "^0.53.0", + "xo": "^0.57.0", "yoctodelay": "^2.0.0" }, - "sideEffects": false, "xo": { "rules": { "unicorn/prefer-string-slice": "off", diff --git a/readme.md b/readme.md index d52688b..6aa0119 100644 --- a/readme.md +++ b/readme.md @@ -15,48 +15,6 @@ ![](media/screenshot.png) -
- ---- - -
-

-

- - Sindre Sorhus' open source work is supported by the community on GitHub Sponsors - -

- Special thanks to: -
-
- - - -
-
- - - -
-
- -
- Strapi -
- Strapi is the leading open-source headless CMS. -
- It’s 100% JavaScript, fully customizable, and developer-first. -
-
-
-
-

-
- ---- - -
- ## Highlights - Expressive API diff --git a/source/index.d.ts b/source/index.d.ts index b0cd2ae..8295d92 100644 --- a/source/index.d.ts +++ b/source/index.d.ts @@ -1,7 +1,12 @@ // TODO: Make it this when TS suports that. // import {ModifierName, ForegroundColor, BackgroundColor, ColorName} from '#ansi-styles'; // import {ColorInfo, ColorSupportLevel} from '#supports-color'; -import {ModifierName, ForegroundColorName, BackgroundColorName, ColorName} from './vendor/ansi-styles/index.js'; +import { + ModifierName, + ForegroundColorName, + BackgroundColorName, + ColorName, +} from './vendor/ansi-styles/index.js'; import {ColorInfo, ColorSupportLevel} from './vendor/supports-color/index.js'; export interface Options { diff --git a/source/index.test-d.ts b/source/index.test-d.ts index e729675..92da39d 100644 --- a/source/index.test-d.ts +++ b/source/index.test-d.ts @@ -1,7 +1,22 @@ -import {expectType, expectAssignable, expectError, expectDeprecated} from 'tsd'; +import { + expectType, + expectAssignable, + expectError, + expectDeprecated, +} from 'tsd'; import chalk, { - Chalk, ChalkInstance, ColorInfo, ColorSupport, ColorSupportLevel, chalkStderr, supportsColor, supportsColorStderr, - ModifierName, ForegroundColorName, BackgroundColorName, ColorName, + Chalk, + ChalkInstance, + ColorInfo, + ColorSupport, + ColorSupportLevel, + chalkStderr, + supportsColor, + supportsColorStderr, + ModifierName, + ForegroundColorName, + BackgroundColorName, + ColorName, Modifiers, } from './index.js'; From 4a10354857ba6d7932dad5fa6ef2e021c4ed47fb Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Tue, 13 Aug 2024 14:49:54 +0200 Subject: [PATCH 60/71] Add FAQ to readme --- readme.md | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/readme.md b/readme.md index 6aa0119..455efaa 100644 --- a/readme.md +++ b/readme.md @@ -15,6 +15,11 @@ ![](media/screenshot.png) +## Info + +- [Why not switch to a smaller coloring package?](https://github.com/chalk/chalk?tab=readme-ov-file#why-not-switch-to-a-smaller-coloring-package) +- See [yoctocolors](https://github.com/sindresorhus/yoctocolors) for a smaller alternative + ## Highlights - Expressive API @@ -246,9 +251,25 @@ Since Chrome 69, ANSI escape codes are natively supported in the developer conso If you're on Windows, do yourself a favor and use [Windows Terminal](https://github.com/microsoft/terminal) instead of `cmd.exe`. -## Origin story +## FAQ -[colors.js](https://github.com/Marak/colors.js) used to be the most popular string styling module, but it has serious deficiencies like extending `String.prototype` which causes all kinds of [problems](https://github.com/yeoman/yo/issues/68) and the package is unmaintained. Although there are other packages, they either do too much or not enough. Chalk is a clean and focused alternative. +### Why not switch to a smaller coloring package? + +Chalk may be larger, but there is a reason for that. It offers a more user-friendly API, well-documented types, supports millions of colors, and covers edge cases that smaller alternatives miss. Chalk is mature, reliable, and built to last. + +But beyond the technical aspects, there's something more critical: trust and long-term maintenance. I have been active in open source for over a decade, and I'm committed to keeping Chalk maintained. Smaller packages might seem appealing now, but there's no guarantee they will be around for the long term, or that they won't become malicious over time. + +Chalk is also likely already in your dependency tree (since 100K+ packages depend on it), so switching won’t save space—in fact, it might increase it. npm deduplicates dependencies, so multiple Chalk instances turn into one, but adding another package alongside it will increase your overall size. + +If the goal is to clean up the ecosystem, switching away from Chalk won’t even make a dent. The real problem lies with packages that have very deep dependency trees (for example, those including a lot of polyfills). Chalk has no dependencies. It's better to focus on impactful changes rather than minor optimizations. + +If absolute package size is important to you, I also maintain [yoctocolors](https://github.com/sindresorhus/yoctocolors), one of the smallest color packages out there. + +*\- [Sindre](https://github.com/sindresorhus)* + +### But the smaller coloring package has benchmarks showing it is faster + +[Micro-benchmarks are flawed](https://sindresorhus.com/blog/micro-benchmark-fallacy) because they measure performance in unrealistic, isolated scenarios, often giving a distorted view of real-world performance. Don't believe marketing fluff. All the coloring packages are more than fast enough. ## Related From f8381204fb096207074089f5ab265fffff6bc341 Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Wed, 18 Dec 2024 18:57:37 +0100 Subject: [PATCH 61/71] Update `CIRCLECI` environments to return level 3 color support https://github.com/chalk/supports-color/commit/89a52f4a8e3f7606c27810a8f182394d333a844f --- source/vendor/supports-color/index.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/source/vendor/supports-color/index.js b/source/vendor/supports-color/index.js index 4ce0a2d..1388372 100644 --- a/source/vendor/supports-color/index.js +++ b/source/vendor/supports-color/index.js @@ -112,11 +112,11 @@ function _supportsColor(haveStream, {streamIsTTY, sniffFlags = true} = {}) { } if ('CI' in env) { - if ('GITHUB_ACTIONS' in env || 'GITEA_ACTIONS' in env) { + if (['GITHUB_ACTIONS', 'GITEA_ACTIONS', 'CIRCLECI'].some(key => key in env)) { return 3; } - if (['TRAVIS', 'CIRCLECI', 'APPVEYOR', 'GITLAB_CI', 'BUILDKITE', 'DRONE'].some(sign => sign in env) || env.CI_NAME === 'codeship') { + if (['TRAVIS', 'APPVEYOR', 'GITLAB_CI', 'BUILDKITE', 'DRONE'].some(sign => sign in env) || env.CI_NAME === 'codeship') { return 1; } From 83acfcf8cb17437b63beceb027180399da74f0a7 Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Wed, 18 Dec 2024 18:59:38 +0100 Subject: [PATCH 62/71] 5.4.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4eb7f11..3fd5094 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chalk", - "version": "5.3.0", + "version": "5.4.0", "description": "Terminal string styling done right", "license": "MIT", "repository": "chalk/chalk", From fc809b686d5048d56fec3a5d96d1ad57dee193bf Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Wed, 18 Dec 2024 19:10:23 +0100 Subject: [PATCH 63/71] Readme tweak --- readme.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/readme.md b/readme.md index 455efaa..5754e7c 100644 --- a/readme.md +++ b/readme.md @@ -289,6 +289,8 @@ If absolute package size is important to you, I also maintain [yoctocolors](http - [chalk-pipe](https://github.com/LitoMore/chalk-pipe) - Create chalk style schemes with simpler style strings - [terminal-link](https://github.com/sindresorhus/terminal-link) - Create clickable links in the terminal +*(Not accepting additional entries)* + ## Maintainers - [Sindre Sorhus](https://github.com/sindresorhus) From 4ebb62d1ca70c122674558a88932ddf6545fe9ef Mon Sep 17 00:00:00 2001 From: Edwin Kofler Date: Sat, 21 Dec 2024 09:01:49 -0800 Subject: [PATCH 64/71] Fix `navigator` not defined `ReferenceError` (#642) --- source/vendor/supports-color/browser.js | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/source/vendor/supports-color/browser.js b/source/vendor/supports-color/browser.js index 9fa6888..fbb6ce0 100644 --- a/source/vendor/supports-color/browser.js +++ b/source/vendor/supports-color/browser.js @@ -1,14 +1,18 @@ /* eslint-env browser */ const level = (() => { - if (navigator.userAgentData) { + if (!('navigator' in globalThis)) { + return 0; + } + + if (globalThis.navigator.userAgentData) { const brand = navigator.userAgentData.brands.find(({brand}) => brand === 'Chromium'); if (brand && brand.version > 93) { return 3; } } - if (/\b(Chrome|Chromium)\//.test(navigator.userAgent)) { + if (/\b(Chrome|Chromium)\//.test(globalThis.navigator.userAgent)) { return 1; } From 5dbc1e2633f3874f43c144fa4919934bc934c495 Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Sat, 21 Dec 2024 18:04:25 +0100 Subject: [PATCH 65/71] 5.4.1 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 3fd5094..23b4ce3 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chalk", - "version": "5.4.0", + "version": "5.4.1", "description": "Terminal string styling done right", "license": "MIT", "repository": "chalk/chalk", From 79ee2d386c58ae3863c28a01f5f86b04c78adfc1 Mon Sep 17 00:00:00 2001 From: Brice <59537185+rhodes-b@users.noreply.github.com> Date: Sun, 3 Aug 2025 18:14:54 -0500 Subject: [PATCH 66/71] Make Ghostty terminal use true color (#653) --- source/vendor/supports-color/index.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/vendor/supports-color/index.js b/source/vendor/supports-color/index.js index 1388372..0e130a1 100644 --- a/source/vendor/supports-color/index.js +++ b/source/vendor/supports-color/index.js @@ -135,6 +135,10 @@ function _supportsColor(haveStream, {streamIsTTY, sniffFlags = true} = {}) { return 3; } + if (env.TERM === 'xterm-ghostty') { + return 3; + } + if ('TERM_PROGRAM' in env) { const version = Number.parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); From 67db246ae0a2bbcc57c190d641c5d767e5275160 Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Mon, 4 Aug 2025 01:17:43 +0200 Subject: [PATCH 67/71] 5.5.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 23b4ce3..e431a64 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chalk", - "version": "5.4.1", + "version": "5.5.0", "description": "Terminal string styling done right", "license": "MIT", "repository": "chalk/chalk", From a8f5bf7a6733b1e2a356d5cccea6a45d80cf16c7 Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Sun, 17 Aug 2025 14:25:09 +0700 Subject: [PATCH 68/71] Make WezTerm terminal use true color --- source/vendor/supports-color/index.js | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/source/vendor/supports-color/index.js b/source/vendor/supports-color/index.js index 0e130a1..265d7f8 100644 --- a/source/vendor/supports-color/index.js +++ b/source/vendor/supports-color/index.js @@ -139,6 +139,10 @@ function _supportsColor(haveStream, {streamIsTTY, sniffFlags = true} = {}) { return 3; } + if (env.TERM === 'wezterm') { + return 3; + } + if ('TERM_PROGRAM' in env) { const version = Number.parseInt((env.TERM_PROGRAM_VERSION || '').split('.')[0], 10); From 5c91505e184aff4609c0a7fb235770c2f71db4a3 Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Sun, 17 Aug 2025 14:26:22 +0700 Subject: [PATCH 69/71] 5.6.0 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index e431a64..910d7fa 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chalk", - "version": "5.5.0", + "version": "5.6.0", "description": "Terminal string styling done right", "license": "MIT", "repository": "chalk/chalk", From 51557784b829c87ff8d138206598764f2eb957b1 Mon Sep 17 00:00:00 2001 From: Sindre Sorhus Date: Mon, 8 Sep 2025 21:47:34 +0700 Subject: [PATCH 70/71] 5.6.2 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 910d7fa..c9e0dc5 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "chalk", - "version": "5.6.0", + "version": "5.6.2", "description": "Terminal string styling done right", "license": "MIT", "repository": "chalk/chalk", From aa06bb5ac3f14df9fda8cfb54274dfc165ddfdef Mon Sep 17 00:00:00 2001 From: Mohamed Hamed <79021260+mdhamed238@users.noreply.github.com> Date: Tue, 27 Jan 2026 07:30:36 +0100 Subject: [PATCH 71/71] Fix typos (#664) --- readme.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/readme.md b/readme.md index 5754e7c..ce1f3f3 100644 --- a/readme.md +++ b/readme.md @@ -178,10 +178,10 @@ console.log(foregroundColorNames.includes('pink')); - `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. +- `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`- Print the text only when Chalk has a color level above zero. 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. ### Colors