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 3 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
199 changes: 199 additions & 0 deletions index.d.ts
@@ -0,0 +1,199 @@
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 CMYK color space

@param cyan (0-100)
@param magenta (0-100)
@param yellow (0-100)
@param black (0-100)
*/
cmyk(cyan: number, magenta: number, yellow: number, black: number): string;

/**
The XYZ color space

@param x (0-100)
@param y (0-100)
@param z (0-100)
*/
xyz(x: number, y: number, z: number): string;

/**
The LAB color space

@param x (0-100)
@param y (0-100)
@param z (0-100)
*/
lab(lightness: number, a: number, b: number): string;

/**
The LCH/HCL color space

@param lightness (0-100)
@param chroma (0-100)
@param hue (0-360)
*/
lch(lightness: number, chroma: number, hue: 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;

ansi(ansi: number): string;
ansi256(ansi: number): string;
ExE-Boss marked this conversation as resolved.
Show resolved Hide resolved

/**
The HCG color space

@param hue (0-360)
@param chroma (0-100)
@param gray (0-100)
*/
hcg(hue: number, chroma: number, gray: number): string;

/**
The Apple RGB 16-bit color space

@param red (0-65535)
@param green (0-65535)
@param blue (0-65535)
*/
apple(r16: number, g16: number, b16: number): string;

/**
Grayscale color

@param gray (0-100)
*/
gray(gray: number): string;
ExE-Boss marked this conversation as resolved.
Show resolved Hide resolved
}

interface CSIPair {
/** 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<Close extends string> {
readonly ansi: ColorConvert;
readonly ansi256: ColorConvert;
readonly ansi16m: ColorConvert;

/** The ANSI terminal Control Sequence for ending this color */
readonly close: Close;
}

interface Modifier {
readonly bold: CSIPair;
readonly dim: CSIPair;
readonly hidden: CSIPair;
readonly inverse: CSIPair;
readonly italic: CSIPair;
readonly reset: CSIPair;
readonly strikethrough: CSIPair;
readonly underline: CSIPair;
ExE-Boss marked this conversation as resolved.
Show resolved Hide resolved
}

interface ForegroundColor {
readonly black: CSIPair;
readonly red: CSIPair;
readonly green: CSIPair;
readonly yellow: CSIPair;
readonly blue: CSIPair;
readonly cyan: CSIPair;
readonly magenta: CSIPair;
readonly white: CSIPair;

readonly gray: CSIPair;
readonly grey: CSIPair;
ExE-Boss marked this conversation as resolved.
Show resolved Hide resolved

readonly blackBright: CSIPair;
readonly redBright: CSIPair;
readonly greenBright: CSIPair;
readonly yellowBright: CSIPair;
readonly blueBright: CSIPair;
readonly cyanBright: CSIPair;
readonly magentaBright: CSIPair;
readonly whiteBright: CSIPair;
}

interface BackgroundColor {
readonly bgBlack: CSIPair;
readonly bgRed: CSIPair;
readonly bgGreen: CSIPair;
readonly bgYellow: CSIPair;
readonly bgBlue: CSIPair;
readonly bgCyan: CSIPair;
readonly bgMagenta: CSIPair;
readonly bgWhite: CSIPair;

readonly bgGray: CSIPair;
readonly bgGrey: CSIPair;

readonly bgBlackBright: CSIPair;
readonly bgRedBright: CSIPair;
readonly bgGreenBright: CSIPair;
readonly bgYellowBright: CSIPair;
readonly bgBlueBright: CSIPair;
readonly bgCyanBright: CSIPair;
readonly bgMagentaBright: CSIPair;
readonly bgWhiteBright: CSIPair;
}
}

declare const ansiStyles: {
readonly modifier: ansiStyles.Modifier;
readonly color: ansiStyles.ForegroundColor & ansiStyles.ColorBase<'\u001B[39m'>;
ExE-Boss marked this conversation as resolved.
Show resolved Hide resolved
readonly bgColor: ansiStyles.BackgroundColor & ansiStyles.ColorBase<'\u001B[49m'>;
readonly codes: ReadonlyMap<number, number>;
} & ansiStyles.BackgroundColor & ansiStyles.ForegroundColor & ansiStyles.Modifier;

export = ansiStyles;
155 changes: 155 additions & 0 deletions index.test-d.ts
@@ -0,0 +1,155 @@
import {expectType, expectError} from 'tsd';
import * as cssColors from 'color-name';
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;

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.CSIPair>(ansiStyles.color.black);
expectType<ansiStyles.CSIPair>(ansiStyles.color.red);
expectType<ansiStyles.CSIPair>(ansiStyles.color.green);
expectType<ansiStyles.CSIPair>(ansiStyles.color.yellow);
expectType<ansiStyles.CSIPair>(ansiStyles.color.blue);
expectType<ansiStyles.CSIPair>(ansiStyles.color.cyan);
expectType<ansiStyles.CSIPair>(ansiStyles.color.magenta);
expectType<ansiStyles.CSIPair>(ansiStyles.color.white);

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

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

expectType<'\x1B[39m'>(ansiStyles.color.close);

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

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

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

expectType<'\x1B[49m'>(ansiStyles.bgColor.close);

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

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

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

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

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

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

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

// --- Modifiers ---
expectType<ansiStyles.CSIPair>(ansiStyles.bold);
expectType<ansiStyles.CSIPair>(ansiStyles.dim);
expectType<ansiStyles.CSIPair>(ansiStyles.hidden);
expectType<ansiStyles.CSIPair>(ansiStyles.inverse);
expectType<ansiStyles.CSIPair>(ansiStyles.italic);
expectType<ansiStyles.CSIPair>(ansiStyles.reset);
expectType<ansiStyles.CSIPair>(ansiStyles.strikethrough);
expectType<ansiStyles.CSIPair>(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.8.0",
"xo": "^0.24.0"
}
}