Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add TypeScript type definition #55

Merged
merged 8 commits into from Nov 12, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
197 changes: 197 additions & 0 deletions index.d.ts
@@ -0,0 +1,197 @@
import * as cssColors from 'color-name';
ExE-Boss marked this conversation as resolved.
Show resolved Hide resolved

declare namespace ansiStyles {
interface ColorConvert {
/**
The RGB color space.

@param red - (`0`-`255`)
@param green - (`0`-`255`)
@param blue - (`0`-`255`)
*/
rgb(red: number, green: number, blue: number): string;

/**
The HSL color space.

@param hue - (`0`-`360`)
@param saturation - (`0`-`100`)
@param lightness - (`0`-`100`)
*/
hsl(hue: number, saturation: number, lightness: number): string;

/**
The HSV color space.

@param hue - (`0`-`360`)
@param saturation - (`0`-`100`)
@param value - (`0`-`100`)
*/
hsv(hue: number, saturation: number, value: number): string;

/**
The HSV color space.

@param hue - (`0`-`360`)
@param whiteness - (`0`-`100`)
@param blackness - (`0`-`100`)
*/
hwb(hue: number, whiteness: number, blackness: number): string;

/**
The RGB HEX color space.

@param hex - A hexadecimal string containing RGB data.
*/
hex(hex: string): string;

/**
@param keyword - A CSS color name.
*/
keyword(keyword: keyof typeof cssColors): string;

/**
Use a [4-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#3/4-bit) to set text color.
*/
ansi(ansi: number): string;

/**
Use an [8-bit unsigned number](https://en.wikipedia.org/wiki/ANSI_escape_code#8-bit) to set text color.
*/
ansi256(ansi: number): string;
}

interface CSPair {
/**
The ANSI terminal control sequence for starting this style.
*/
readonly open: string;

/**
The ANSI terminal control sequence for ending this style.
*/
readonly close: string;
}

interface ColorBase {
readonly ansi: ColorConvert;
readonly ansi256: ColorConvert;
readonly ansi16m: ColorConvert;

/**
The ANSI terminal control sequence for ending this color.
*/
readonly close: string;
}

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;

/**
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;
}

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

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

declare const ansiStyles: {
readonly modifier: ansiStyles.Modifier;
readonly color: ansiStyles.ForegroundColor & ansiStyles.ColorBase;
readonly bgColor: ansiStyles.BackgroundColor & ansiStyles.ColorBase;
readonly codes: ReadonlyMap<number, number>;
} & ansiStyles.BackgroundColor & ansiStyles.ForegroundColor & ansiStyles.Modifier;

export = ansiStyles;
1 change: 1 addition & 0 deletions index.js
Expand Up @@ -36,6 +36,7 @@ const setLazyProperty = (object, property, get) => {
});
};

/** @type {typeof import('color-convert')} */
let colorConvert;
const makeDynamicStyles = (wrap, targetSpace, identity, isBackground) => {
if (colorConvert === undefined) {
Expand Down
161 changes: 161 additions & 0 deletions index.test-d.ts
@@ -0,0 +1,161 @@
import {expectType, expectError} from 'tsd';
import * as cssColors from 'color-name';
import {KEYWORD} from 'color-convert/conversions';
import colorConvert = require('color-convert');
import ansiStyles = require('.');

declare function keyof<T>(type: T): keyof T;
declare function params<T extends (...args: any) => unknown>(type: T): Parameters<T>

type CSS_COLOR_NAMES = keyof typeof cssColors;
type ExpectedColorSpaces = Exclude<keyof typeof colorConvert, 'ansi16'> | 'ansi';
let expectedColors!: ExpectedColorSpaces;
let CSS_COLOR_NAMES!: CSS_COLOR_NAMES;
let KEYWORD!: KEYWORD;

expectType<KEYWORD>(CSS_COLOR_NAMES);
expectType<CSS_COLOR_NAMES>(KEYWORD);

expectType<ReadonlyMap<number, number>>(ansiStyles.codes);

// - ColorConvert -
// -- Foreground color --
expectType<ExpectedColorSpaces>(keyof(ansiStyles.color.ansi));
expectType<ExpectedColorSpaces>(keyof(ansiStyles.color.ansi256));
expectType<ExpectedColorSpaces>(keyof(ansiStyles.color.ansi16m));

expectType<keyof typeof ansiStyles.color.ansi>(expectedColors);
expectType<keyof typeof ansiStyles.color.ansi256>(expectedColors);
expectType<keyof typeof ansiStyles.color.ansi16m>(expectedColors);

expectType<[CSS_COLOR_NAMES]>(params(ansiStyles.color.ansi.keyword));
expectType<[CSS_COLOR_NAMES]>(params(ansiStyles.color.ansi256.keyword));
expectType<[CSS_COLOR_NAMES]>(params(ansiStyles.color.ansi16m.keyword));

// -- Background color --
expectType<ExpectedColorSpaces>(keyof(ansiStyles.bgColor.ansi));
expectType<ExpectedColorSpaces>(keyof(ansiStyles.bgColor.ansi256));
expectType<ExpectedColorSpaces>(keyof(ansiStyles.bgColor.ansi16m));

expectType<keyof typeof ansiStyles.bgColor.ansi>(expectedColors);
expectType<keyof typeof ansiStyles.bgColor.ansi256>(expectedColors);
expectType<keyof typeof ansiStyles.bgColor.ansi16m>(expectedColors);

expectType<[CSS_COLOR_NAMES]>(params(ansiStyles.bgColor.ansi.keyword));
expectType<[CSS_COLOR_NAMES]>(params(ansiStyles.bgColor.ansi256.keyword));
expectType<[CSS_COLOR_NAMES]>(params(ansiStyles.bgColor.ansi16m.keyword));

// - Static colors -
// -- Namespaced --
// --- Foreground color ---
expectType<ansiStyles.CSPair>(ansiStyles.color.black);
expectType<ansiStyles.CSPair>(ansiStyles.color.red);
expectType<ansiStyles.CSPair>(ansiStyles.color.green);
expectType<ansiStyles.CSPair>(ansiStyles.color.yellow);
expectType<ansiStyles.CSPair>(ansiStyles.color.blue);
expectType<ansiStyles.CSPair>(ansiStyles.color.cyan);
expectType<ansiStyles.CSPair>(ansiStyles.color.magenta);
expectType<ansiStyles.CSPair>(ansiStyles.color.white);

expectType<ansiStyles.CSPair>(ansiStyles.color.gray);
expectType<ansiStyles.CSPair>(ansiStyles.color.grey);

expectType<ansiStyles.CSPair>(ansiStyles.color.blackBright);
expectType<ansiStyles.CSPair>(ansiStyles.color.redBright);
expectType<ansiStyles.CSPair>(ansiStyles.color.greenBright);
expectType<ansiStyles.CSPair>(ansiStyles.color.yellowBright);
expectType<ansiStyles.CSPair>(ansiStyles.color.blueBright);
expectType<ansiStyles.CSPair>(ansiStyles.color.cyanBright);
expectType<ansiStyles.CSPair>(ansiStyles.color.magentaBright);
expectType<ansiStyles.CSPair>(ansiStyles.color.whiteBright);

expectType<string>(ansiStyles.color.close);

// --- Background color ---
expectType<ansiStyles.CSPair>(ansiStyles.bgColor.bgBlack);
expectType<ansiStyles.CSPair>(ansiStyles.bgColor.bgRed);
expectType<ansiStyles.CSPair>(ansiStyles.bgColor.bgGreen);
expectType<ansiStyles.CSPair>(ansiStyles.bgColor.bgYellow);
expectType<ansiStyles.CSPair>(ansiStyles.bgColor.bgBlue);
expectType<ansiStyles.CSPair>(ansiStyles.bgColor.bgCyan);
expectType<ansiStyles.CSPair>(ansiStyles.bgColor.bgMagenta);
expectType<ansiStyles.CSPair>(ansiStyles.bgColor.bgWhite);

expectType<ansiStyles.CSPair>(ansiStyles.bgColor.bgGray);
expectType<ansiStyles.CSPair>(ansiStyles.bgColor.bgGrey);

expectType<ansiStyles.CSPair>(ansiStyles.bgColor.bgBlackBright);
expectType<ansiStyles.CSPair>(ansiStyles.bgColor.bgRedBright);
expectType<ansiStyles.CSPair>(ansiStyles.bgColor.bgGreenBright);
expectType<ansiStyles.CSPair>(ansiStyles.bgColor.bgYellowBright);
expectType<ansiStyles.CSPair>(ansiStyles.bgColor.bgBlueBright);
expectType<ansiStyles.CSPair>(ansiStyles.bgColor.bgCyanBright);
expectType<ansiStyles.CSPair>(ansiStyles.bgColor.bgMagentaBright);
expectType<ansiStyles.CSPair>(ansiStyles.bgColor.bgWhiteBright);

expectType<string>(ansiStyles.bgColor.close);

// --- Modifiers ---
expectType<ansiStyles.CSPair>(ansiStyles.modifier.bold);
expectType<ansiStyles.CSPair>(ansiStyles.modifier.dim);
expectType<ansiStyles.CSPair>(ansiStyles.modifier.hidden);
expectType<ansiStyles.CSPair>(ansiStyles.modifier.inverse);
expectType<ansiStyles.CSPair>(ansiStyles.modifier.italic);
expectType<ansiStyles.CSPair>(ansiStyles.modifier.reset);
expectType<ansiStyles.CSPair>(ansiStyles.modifier.strikethrough);
expectType<ansiStyles.CSPair>(ansiStyles.modifier.underline);

// -- Top level --
// --- Foreground color ---
expectType<ansiStyles.CSPair>(ansiStyles.black);
expectType<ansiStyles.CSPair>(ansiStyles.red);
expectType<ansiStyles.CSPair>(ansiStyles.green);
expectType<ansiStyles.CSPair>(ansiStyles.yellow);
expectType<ansiStyles.CSPair>(ansiStyles.blue);
expectType<ansiStyles.CSPair>(ansiStyles.cyan);
expectType<ansiStyles.CSPair>(ansiStyles.magenta);
expectType<ansiStyles.CSPair>(ansiStyles.white);

expectType<ansiStyles.CSPair>(ansiStyles.gray);
expectType<ansiStyles.CSPair>(ansiStyles.grey);

expectType<ansiStyles.CSPair>(ansiStyles.blackBright);
expectType<ansiStyles.CSPair>(ansiStyles.redBright);
expectType<ansiStyles.CSPair>(ansiStyles.greenBright);
expectType<ansiStyles.CSPair>(ansiStyles.yellowBright);
expectType<ansiStyles.CSPair>(ansiStyles.blueBright);
expectType<ansiStyles.CSPair>(ansiStyles.cyanBright);
expectType<ansiStyles.CSPair>(ansiStyles.magentaBright);
expectType<ansiStyles.CSPair>(ansiStyles.whiteBright);

// --- Background color ---
expectType<ansiStyles.CSPair>(ansiStyles.bgBlack);
expectType<ansiStyles.CSPair>(ansiStyles.bgRed);
expectType<ansiStyles.CSPair>(ansiStyles.bgGreen);
expectType<ansiStyles.CSPair>(ansiStyles.bgYellow);
expectType<ansiStyles.CSPair>(ansiStyles.bgBlue);
expectType<ansiStyles.CSPair>(ansiStyles.bgCyan);
expectType<ansiStyles.CSPair>(ansiStyles.bgMagenta);
expectType<ansiStyles.CSPair>(ansiStyles.bgWhite);

expectType<ansiStyles.CSPair>(ansiStyles.bgGray);
expectType<ansiStyles.CSPair>(ansiStyles.bgGrey);

expectType<ansiStyles.CSPair>(ansiStyles.bgBlackBright);
expectType<ansiStyles.CSPair>(ansiStyles.bgRedBright);
expectType<ansiStyles.CSPair>(ansiStyles.bgGreenBright);
expectType<ansiStyles.CSPair>(ansiStyles.bgYellowBright);
expectType<ansiStyles.CSPair>(ansiStyles.bgBlueBright);
expectType<ansiStyles.CSPair>(ansiStyles.bgCyanBright);
expectType<ansiStyles.CSPair>(ansiStyles.bgMagentaBright);
expectType<ansiStyles.CSPair>(ansiStyles.bgWhiteBright);

// --- Modifiers ---
expectType<ansiStyles.CSPair>(ansiStyles.bold);
expectType<ansiStyles.CSPair>(ansiStyles.dim);
expectType<ansiStyles.CSPair>(ansiStyles.hidden);
expectType<ansiStyles.CSPair>(ansiStyles.inverse);
expectType<ansiStyles.CSPair>(ansiStyles.italic);
expectType<ansiStyles.CSPair>(ansiStyles.reset);
expectType<ansiStyles.CSPair>(ansiStyles.strikethrough);
expectType<ansiStyles.CSPair>(ansiStyles.underline);
8 changes: 6 additions & 2 deletions package.json
Expand Up @@ -13,11 +13,12 @@
"node": ">=8"
},
"scripts": {
"test": "xo && ava",
"test": "xo && ava && tsd",
"screenshot": "svg-term --command='node screenshot' --out=screenshot.svg --padding=3 --width=55 --height=3 --at=1000 --no-cursor"
},
"files": [
"index.js"
"index.js",
"index.d.ts"
],
"keywords": [
"ansi",
Expand All @@ -42,11 +43,14 @@
"text"
],
"dependencies": {
"@types/color-name": "^1.1.1",
"color-convert": "^2.0.1"
},
"devDependencies": {
"@types/color-convert": "^1.9.0",
"ava": "^2.3.0",
"svg-term-cli": "^2.1.1",
"tsd": "^0.9.0",
"xo": "^0.24.0"
}
}