Add named exports (#432)

This commit is contained in:
Richie Bendall 2021-04-18 00:33:03 +12:00 committed by GitHub
parent fa16f4ec37
commit d798222a5a
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
10 changed files with 147 additions and 165 deletions

141
index.d.ts vendored
View file

@ -93,7 +93,7 @@ export interface Options {
/** /**
Return a new Chalk instance. 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. Detect whether the terminal supports color.
@ -149,12 +149,7 @@ interface ChalkFunction {
(...text: unknown[]): string; (...text: unknown[]): string;
} }
export interface Chalk extends ChalkFunction { export interface ChalkInstance extends ChalkFunction {
/**
Return a new Chalk instance.
*/
Instance: ChalkInstance;
/** /**
The color support for Chalk. The color support for Chalk.
@ -180,7 +175,7 @@ export interface Chalk extends ChalkFunction {
chalk.hex('#DEADED'); chalk.hex('#DEADED');
``` ```
*/ */
hex: (color: string) => Chalk; hex: (color: string) => this;
/** /**
Use keyword color value to set text color. Use keyword color value to set text color.
@ -194,27 +189,27 @@ export interface Chalk extends ChalkFunction {
chalk.keyword('orange'); chalk.keyword('orange');
``` ```
*/ */
keyword: (color: string) => Chalk; keyword: (color: string) => this;
/** /**
Use RGB values to set text color. 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. 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. 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. 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. 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 30 <= code && code < 38 || 90 <= code && code < 98
For example, 31 for red, 91 for redBright. 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. 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. Use HEX value to set background color.
@ -241,7 +236,7 @@ export interface Chalk extends ChalkFunction {
chalk.bgHex('#DEADED'); chalk.bgHex('#DEADED');
``` ```
*/ */
bgHex: (color: string) => Chalk; bgHex: (color: string) => this;
/** /**
Use keyword color value to set background color. Use keyword color value to set background color.
@ -255,27 +250,27 @@ export interface Chalk extends ChalkFunction {
chalk.bgKeyword('orange'); chalk.bgKeyword('orange');
``` ```
*/ */
bgKeyword: (color: string) => Chalk; bgKeyword: (color: string) => this;
/** /**
Use RGB values to set background color. 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. 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. 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. 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. 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. For example, 31 for red, 91 for redBright.
Use the foreground code, not the background code (for example, not 41, nor 101). 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. 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. Modifier: Resets the current color chain.
*/ */
readonly reset: Chalk; readonly reset: this;
/** /**
Modifier: Make text bold. Modifier: Make text bold.
*/ */
readonly bold: Chalk; readonly bold: this;
/** /**
Modifier: Emitting only a small amount of light. Modifier: Emitting only a small amount of light.
*/ */
readonly dim: Chalk; readonly dim: this;
/** /**
Modifier: Make text italic. (Not widely supported) Modifier: Make text italic. (Not widely supported)
*/ */
readonly italic: Chalk; readonly italic: this;
/** /**
Modifier: Make text underline. (Not widely supported) Modifier: Make text underline. (Not widely supported)
*/ */
readonly underline: Chalk; readonly underline: this;
/** /**
Modifier: Inverse background and foreground colors. Modifier: Inverse background and foreground colors.
*/ */
readonly inverse: Chalk; readonly inverse: this;
/** /**
Modifier: Prints the text, but makes it invisible. 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) 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. Modifier: Prints the text only when Chalk has a color support level > 0.
Can be useful for things that are purely cosmetic. Can be useful for things that are purely cosmetic.
*/ */
readonly visible: Chalk; readonly visible: this;
readonly black: Chalk; readonly black: this;
readonly red: Chalk; readonly red: this;
readonly green: Chalk; readonly green: this;
readonly yellow: Chalk; readonly yellow: this;
readonly blue: Chalk; readonly blue: this;
readonly magenta: Chalk; readonly magenta: this;
readonly cyan: Chalk; readonly cyan: this;
readonly white: Chalk; readonly white: this;
/* /*
Alias for `blackBright`. Alias for `blackBright`.
*/ */
readonly gray: Chalk; readonly gray: this;
/* /*
Alias for `blackBright`. Alias for `blackBright`.
*/ */
readonly grey: Chalk; readonly grey: this;
readonly blackBright: Chalk; readonly blackBright: this;
readonly redBright: Chalk; readonly redBright: this;
readonly greenBright: Chalk; readonly greenBright: this;
readonly yellowBright: Chalk; readonly yellowBright: this;
readonly blueBright: Chalk; readonly blueBright: this;
readonly magentaBright: Chalk; readonly magentaBright: this;
readonly cyanBright: Chalk; readonly cyanBright: this;
readonly whiteBright: Chalk; readonly whiteBright: this;
readonly bgBlack: Chalk; readonly bgBlack: this;
readonly bgRed: Chalk; readonly bgRed: this;
readonly bgGreen: Chalk; readonly bgGreen: this;
readonly bgYellow: Chalk; readonly bgYellow: this;
readonly bgBlue: Chalk; readonly bgBlue: this;
readonly bgMagenta: Chalk; readonly bgMagenta: this;
readonly bgCyan: Chalk; readonly bgCyan: this;
readonly bgWhite: Chalk; readonly bgWhite: this;
/* /*
Alias for `bgBlackBright`. Alias for `bgBlackBright`.
*/ */
readonly bgGray: Chalk; readonly bgGray: this;
/* /*
Alias for `bgBlackBright`. Alias for `bgBlackBright`.
*/ */
readonly bgGrey: Chalk; readonly bgGrey: this;
readonly bgBlackBright: Chalk; readonly bgBlackBright: this;
readonly bgRedBright: Chalk; readonly bgRedBright: this;
readonly bgGreenBright: Chalk; readonly bgGreenBright: this;
readonly bgYellowBright: Chalk; readonly bgYellowBright: this;
readonly bgBlueBright: Chalk; readonly bgBlueBright: this;
readonly bgMagentaBright: Chalk; readonly bgMagentaBright: this;
readonly bgCyanBright: Chalk; readonly bgCyanBright: this;
readonly bgWhiteBright: Chalk; 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`. This simply means that `chalk.red.yellow.green` is equivalent to `chalk.green`.
*/ */
declare const chalk: Chalk & ChalkFunction & { declare const chalk: ChalkInstance & ChalkFunction;
supportsColor: ColorSupport | false;
stderr: Chalk & {supportsColor: ColorSupport | false}; export const supportsColor: ColorSupport | false;
};
export const chalkStderr: typeof chalk;
export const supportsColorStderr: typeof supportsColor;
export default chalk; export default chalk;

View file

@ -1,35 +1,35 @@
import {expectType, expectAssignable, expectError} from 'tsd'; 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 - // - Helpers -
type colorReturn = Chalk & {supportsColor?: never}; type colorReturn = ChalkInstance & {supportsColor?: never};
// - supportsColor - // - supportsColor -
expectType<ColorSupport | false>(chalk.supportsColor); expectType<ColorSupport | false>(supportsColor);
if (chalk.supportsColor) { if (supportsColor) {
expectType<boolean>(chalk.supportsColor.hasBasic); expectType<boolean>(supportsColor.hasBasic);
expectType<boolean>(chalk.supportsColor.has256); expectType<boolean>(supportsColor.has256);
expectType<boolean>(chalk.supportsColor.has16m); expectType<boolean>(supportsColor.has16m);
} }
// - stderr - // - stderr -
expectAssignable<Chalk>(chalk.stderr); expectAssignable<ChalkInstance>(chalkStderr);
expectType<ColorSupport | false>(chalk.stderr.supportsColor); expectType<ColorSupport | false>(supportsColorStderr);
if (chalk.stderr.supportsColor) { if (supportsColorStderr) {
expectType<boolean>(chalk.stderr.supportsColor.hasBasic); expectType<boolean>(supportsColorStderr.hasBasic);
expectType<boolean>(chalk.stderr.supportsColor.has256); expectType<boolean>(supportsColorStderr.has256);
expectType<boolean>(chalk.stderr.supportsColor.has16m); expectType<boolean>(supportsColorStderr.has16m);
} }
// -- `stderr` is not a member of the Chalk interface -- // -- `supportsColorStderr` is not a member of the Chalk interface --
expectError(chalk.reset.stderr); expectError(chalk.reset.supportsColorStderr);
// -- `supportsColor` is not a member of the Chalk interface -- // -- `supportsColor` is not a member of the Chalk interface --
expectError(chalk.reset.supportsColor); expectError(chalk.reset.supportsColor);
// - Chalk - // - Chalk -
// -- Instance -- // -- Instance --
expectType<Chalk>(new chalk.Instance({level: 1})); expectType<ChalkInstance>(new Chalk({level: 1}));
// -- Properties -- // -- Properties --
expectType<ColorSupportLevel>(chalk.level); expectType<ColorSupportLevel>(chalk.level);

View file

@ -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: If you need to change this in a reusable module, create a new instance:
```js ```js
import chalk from 'chalk'; import {Chalk} from 'chalk';
const customChalk = new chalk.Instance({level: 0}); const customChalk = new Chalk({level: 0});
``` ```
| Level | Description | | Level | Description |
@ -183,7 +183,7 @@ const customChalk = new chalk.Instance({level: 0});
| `2` | 256 color support | | `2` | 256 color support |
| `3` | Truecolor support (16 million colors) | | `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. 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. 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 ## Styles

View file

@ -29,7 +29,7 @@ const applyOptions = (object, options = {}) => {
object.level = options.level === undefined ? colorLevel : options.level; object.level = options.level === undefined ? colorLevel : options.level;
}; };
class ChalkClass { export class Chalk {
constructor(options) { constructor(options) {
// eslint-disable-next-line no-constructor-return // eslint-disable-next-line no-constructor-return
return chalkFactory(options); return chalkFactory(options);
@ -42,19 +42,15 @@ const chalkFactory = options => {
chalk.template = (...arguments_) => chalkTag(chalk.template, ...arguments_); chalk.template = (...arguments_) => chalkTag(chalk.template, ...arguments_);
Object.setPrototypeOf(chalk, Chalk.prototype); Object.setPrototypeOf(chalk, createChalk.prototype);
Object.setPrototypeOf(chalk.template, chalk); Object.setPrototypeOf(chalk.template, chalk);
chalk.template.constructor = () => { chalk.template.Chalk = Chalk;
throw new Error('`chalk.constructor()` is deprecated. Use `new chalk.Instance()` instead.');
};
chalk.template.Instance = ChalkClass;
return chalk.template; return chalk.template;
}; };
function Chalk(options) { function createChalk(options) {
return chalkFactory(options); return chalkFactory(options);
} }
@ -213,11 +209,14 @@ const chalkTag = (chalk, ...strings) => {
return template(chalk, parts.join('')); return template(chalk, parts.join(''));
}; };
Object.defineProperties(Chalk.prototype, styles); Object.defineProperties(createChalk.prototype, styles);
const chalk = Chalk(); // eslint-disable-line new-cap const chalk = createChalk();
chalk.supportsColor = stdoutColor; export const chalkStderr = createChalk({level: stderrColor ? stderrColor.level : 0});
chalk.stderr = Chalk({level: stderrColor ? stderrColor.level : 0}); // eslint-disable-line new-cap
chalk.stderr.supportsColor = stderrColor; export {
stdoutColor as supportsColor,
stderrColor as supportsColorStderr
};
export default chalk; export default chalk;

View file

@ -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')}`);

View file

@ -1,8 +1,8 @@
import test from 'ava'; import test from 'ava';
import chalk from '../source/index.js'; import chalk, {Chalk, chalkStderr} from '../source/index.js';
chalk.level = 3; chalk.level = 3;
chalk.stderr.level = 3; chalkStderr.level = 3;
console.log('TERM:', process.env.TERM || '[none]'); console.log('TERM:', process.env.TERM || '[none]');
console.log('platform:', process.platform || '[unknown]'); 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 => { 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({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}).bgHex('#FF0000')('hello'), '\u001B[101mhello\u001B[49m');
}); });
test('properly convert RGB to 256 colors on basic color terminals', t => { 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({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({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: 3}).bgHex('#FF0000')('hello'), '\u001B[48;2;255;0;0mhello\u001B[49m');
}); });
test('don\'t emit RGB codes if level is 0', t => { 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({level: 0}).hex('#FF0000')('hello'), 'hello');
t.is(new chalk.Instance({level: 0}).bgHex('#FF0000')('hello'), 'hello'); t.is(new Chalk({level: 0}).bgHex('#FF0000')('hello'), 'hello');
}); });
test('supports blackBright color', t => { test('supports blackBright color', t => {
t.is(chalk.blackBright('foo'), '\u001B[90mfoo\u001B[39m'); t.is(chalk.blackBright('foo'), '\u001B[90mfoo\u001B[39m');
}); });
test('sets correct level for chalk.stderr and respects it', t => { test('sets correct level for chalkStderr and respects it', t => {
t.is(chalk.stderr.level, 3); t.is(chalkStderr.level, 3);
t.is(chalk.stderr.red.bold('foo'), '\u001B[31m\u001B[1mfoo\u001B[22m\u001B[39m'); t.is(chalkStderr.red.bold('foo'), '\u001B[31m\u001B[1mfoo\u001B[22m\u001B[39m');
}); });

View file

@ -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
});
});

View file

@ -1,10 +1,10 @@
import test from 'ava'; import test from 'ava';
import chalk from '../source/index.js'; import chalk, {Chalk} from '../source/index.js';
chalk.level = 1; chalk.level = 1;
test('create an isolated context where colors can be disabled (by level)', t => { 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(instance.red('foo'), 'foo');
t.is(chalk.red('foo'), '\u001B[31mfoo\u001B[39m'); t.is(chalk.red('foo'), '\u001B[31mfoo\u001B[39m');
instance.level = 2; 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 => { test('the `level` option should be a number from 0 to 3', t => {
/* eslint-disable no-new */ /* eslint-disable no-new */
t.throws(() => { t.throws(() => {
new chalk.Instance({level: 10}); new Chalk({level: 10});
}, {message: /should be an integer from 0 to 3/}); }, {message: /should be an integer from 0 to 3/});
t.throws(() => { t.throws(() => {
new chalk.Instance({level: -1}); new Chalk({level: -1});
}, {message: /should be an integer from 0 to 3/}); }, {message: /should be an integer from 0 to 3/});
/* eslint-enable no-new */ /* eslint-enable no-new */
}); });

View file

@ -1,27 +1,27 @@
/* eslint-disable unicorn/no-hex-escape */ /* eslint-disable unicorn/no-hex-escape */
import test from 'ava'; import test from 'ava';
import chalk from '../source/index.js'; import chalk, {Chalk} from '../source/index.js';
chalk.level = 1; chalk.level = 1;
test('return an empty string for an empty literal', t => { test('return an empty string for an empty literal', t => {
const instance = new chalk.Instance(); const instance = new Chalk();
t.is(instance``, ''); t.is(instance``, '');
}); });
test('return a regular string for a literal with no templates', t => { 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'); t.is(instance`hello`, 'hello');
}); });
test('correctly perform template parsing', t => { 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!}`, 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!')); instance.bold('Hello,', instance.cyan('World!'), 'This is a') + ' test. ' + instance.green('Woo!'));
}); });
test('correctly perform template substitutions', t => { test('correctly perform template substitutions', t => {
const instance = new chalk.Instance({level: 0}); const instance = new Chalk({level: 0});
const name = 'Sindre'; const name = 'Sindre';
const exclamation = 'Neat'; const exclamation = 'Neat';
t.is(instance`{bold Hello, {cyan.inverse ${name}!} This is a} test. {green ${exclamation}!}`, 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 => { test('correctly perform nested template substitutions', t => {
const instance = new chalk.Instance({level: 0}); const instance = new Chalk({level: 0});
const name = 'Sindre'; const name = 'Sindre';
const exclamation = 'Neat'; const exclamation = 'Neat';
t.is(instance.bold`Hello, {cyan.inverse ${name}!} This is a` + ' test. ' + instance.green`${exclamation}!`, 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 => { 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!}}`, t.is(instance`{bold.rgb(144,10,178).inverse Hello, {~inverse there!}}`,
'\u001B[1m\u001B[38;2;144;10;178m\u001B[7mHello, ' + '\u001B[1m\u001B[38;2;144;10;178m\u001B[7mHello, ' +
'\u001B[27m\u001B[39m\u001B[22m\u001B[1m' + '\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 => { 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\}}`, t.is(instance`{bold hello \{in brackets\}}`,
'\u001B[1mhello {in brackets}\u001B[22m'); '\u001B[1mhello {in brackets}\u001B[22m');
}); });
test('throw if there is an unclosed block', t => { test('throw if there is an unclosed block', t => {
const instance = new chalk.Instance({level: 3}); const instance = new Chalk({level: 3});
try { try {
console.log(instance`{bold this shouldn't appear ever\}`); console.log(instance`{bold this shouldn't appear ever\}`);
t.fail(); t.fail();
@ -84,7 +84,7 @@ test('throw if there is an unclosed block', t => {
}); });
test('throw if there is an invalid style', t => { test('throw if there is an invalid style', t => {
const instance = new chalk.Instance({level: 3}); const instance = new Chalk({level: 3});
try { try {
console.log(instance`{abadstylethatdoesntexist this shouldn't appear ever}`); console.log(instance`{abadstylethatdoesntexist this shouldn't appear ever}`);
t.fail(); t.fail();
@ -94,7 +94,7 @@ test('throw if there is an invalid style', t => {
}); });
test('properly style multiline color blocks', t => { test('properly style multiline color blocks', t => {
const instance = new chalk.Instance({level: 3}); const instance = new Chalk({level: 3});
t.is( t.is(
instance`{bold instance`{bold
Hello! This is a Hello! This is a
@ -114,49 +114,49 @@ test('properly style multiline color blocks', t => {
}); });
test('escape interpolated values', 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 hi');
t.is(instance`Hello ${'{bold hi}'}`, 'Hello {bold hi}'); t.is(instance`Hello ${'{bold hi}'}`, 'Hello {bold hi}');
}); });
test('allow custom colors (themes) on custom contexts', t => { 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'); instance.rose = instance.hex('#F6D9D9');
t.is(instance`Hello, {rose Rose}.`, 'Hello, \u001B[38;2;246;217;217mRose\u001B[39m.'); t.is(instance`Hello, {rose Rose}.`, 'Hello, \u001B[38;2;246;217;217mRose\u001B[39m.');
}); });
test('correctly parse newline literals (bug #184)', t => { 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 t.is(instance`Hello
{red there}`, 'Hello\nthere'); {red there}`, 'Hello\nthere');
}); });
test('correctly parse newline escapes (bug #177)', t => { 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!'); t.is(instance`Hello\nthere!`, 'Hello\nthere!');
}); });
test('correctly parse escape in parameters (bug #177 comment 318622809)', t => { 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 = '\\'; const string = '\\';
t.is(instance`{blue ${string}}`, '\\'); t.is(instance`{blue ${string}}`, '\\');
}); });
test('correctly parses unicode/hex escapes', t => { 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!}`, t.is(instance`\u0078ylophones are fo\x78y! {magenta.inverse \u0078ylophones are fo\x78y!}`,
'xylophones are foxy! xylophones are foxy!'); 'xylophones are foxy! xylophones are foxy!');
}); });
test('correctly parses string arguments', t => { 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('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\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`{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 => { 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 { try {
console.log(instance`{keyword(????) hi}`); console.log(instance`{keyword(????) hi}`);
t.fail(); t.fail();
@ -166,7 +166,7 @@ test('throws if a bad argument is encountered', t => {
}); });
test('throws if an extra unescaped } is found', t => { test('throws if an extra unescaped } is found', t => {
const instance = new chalk.Instance({level: 0}); const instance = new Chalk({level: 0});
try { try {
console.log(instance`{red hi!}}`); console.log(instance`{red hi!}}`);
t.fail(); t.fail();
@ -176,18 +176,18 @@ test('throws if an extra unescaped } is found', t => {
}); });
test('should not parse upper-case escapes', 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'); 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 => { 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 ${undefined}`, 'hello undefined');
t.is(instance`hello ${null}`, 'hello null'); t.is(instance`hello ${null}`, 'hello null');
}); });
test('should allow bracketed Unicode escapes', t => { 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`\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{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'); t.is(instance`This is a {bold \u{10FFFF}} test`, 'This is a \u001B[1m\u{10FFFF}\u001B[22m test');

View file

@ -1,22 +1,22 @@
import test from 'ava'; import test from 'ava';
import chalk from '../source/index.js'; import chalk, {Chalk} from '../source/index.js';
chalk.level = 1; chalk.level = 1;
test('visible: normal output when level > 0', t => { 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.visible.red('foo'), '\u001B[31mfoo\u001B[39m');
t.is(instance.red.visible('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 => { 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.visible.red('foo'), '');
t.is(instance.red.visible('foo'), ''); t.is(instance.red.visible('foo'), '');
}); });
test('test switching back and forth between level == 0 and level > 0', t => { 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.red('foo'), '\u001B[31mfoo\u001B[39m');
t.is(instance.visible.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'); t.is(instance.red.visible('foo'), '\u001B[31mfoo\u001B[39m');