diff --git a/index.d.ts b/index.d.ts new file mode 100644 index 0000000..be0eaab --- /dev/null +++ b/index.d.ts @@ -0,0 +1,197 @@ +import * as cssColors from 'color-name'; + +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; +} & ansiStyles.BackgroundColor & ansiStyles.ForegroundColor & ansiStyles.Modifier; + +export = ansiStyles; diff --git a/index.js b/index.js index 886101d..19bcb2f 100644 --- a/index.js +++ b/index.js @@ -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) { diff --git a/index.test-d.ts b/index.test-d.ts new file mode 100644 index 0000000..50ef318 --- /dev/null +++ b/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(type: T): keyof T; +declare function params unknown>(type: T): Parameters + +type CSS_COLOR_NAMES = keyof typeof cssColors; +type ExpectedColorSpaces = Exclude | 'ansi'; +let expectedColors!: ExpectedColorSpaces; +let CSS_COLOR_NAMES!: CSS_COLOR_NAMES; +let KEYWORD!: KEYWORD; + +expectType(CSS_COLOR_NAMES); +expectType(KEYWORD); + +expectType>(ansiStyles.codes); + +// - ColorConvert - +// -- Foreground color -- +expectType(keyof(ansiStyles.color.ansi)); +expectType(keyof(ansiStyles.color.ansi256)); +expectType(keyof(ansiStyles.color.ansi16m)); + +expectType(expectedColors); +expectType(expectedColors); +expectType(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(keyof(ansiStyles.bgColor.ansi)); +expectType(keyof(ansiStyles.bgColor.ansi256)); +expectType(keyof(ansiStyles.bgColor.ansi16m)); + +expectType(expectedColors); +expectType(expectedColors); +expectType(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.color.black); +expectType(ansiStyles.color.red); +expectType(ansiStyles.color.green); +expectType(ansiStyles.color.yellow); +expectType(ansiStyles.color.blue); +expectType(ansiStyles.color.cyan); +expectType(ansiStyles.color.magenta); +expectType(ansiStyles.color.white); + +expectType(ansiStyles.color.gray); +expectType(ansiStyles.color.grey); + +expectType(ansiStyles.color.blackBright); +expectType(ansiStyles.color.redBright); +expectType(ansiStyles.color.greenBright); +expectType(ansiStyles.color.yellowBright); +expectType(ansiStyles.color.blueBright); +expectType(ansiStyles.color.cyanBright); +expectType(ansiStyles.color.magentaBright); +expectType(ansiStyles.color.whiteBright); + +expectType(ansiStyles.color.close); + +// --- Background color --- +expectType(ansiStyles.bgColor.bgBlack); +expectType(ansiStyles.bgColor.bgRed); +expectType(ansiStyles.bgColor.bgGreen); +expectType(ansiStyles.bgColor.bgYellow); +expectType(ansiStyles.bgColor.bgBlue); +expectType(ansiStyles.bgColor.bgCyan); +expectType(ansiStyles.bgColor.bgMagenta); +expectType(ansiStyles.bgColor.bgWhite); + +expectType(ansiStyles.bgColor.bgGray); +expectType(ansiStyles.bgColor.bgGrey); + +expectType(ansiStyles.bgColor.bgBlackBright); +expectType(ansiStyles.bgColor.bgRedBright); +expectType(ansiStyles.bgColor.bgGreenBright); +expectType(ansiStyles.bgColor.bgYellowBright); +expectType(ansiStyles.bgColor.bgBlueBright); +expectType(ansiStyles.bgColor.bgCyanBright); +expectType(ansiStyles.bgColor.bgMagentaBright); +expectType(ansiStyles.bgColor.bgWhiteBright); + +expectType(ansiStyles.bgColor.close); + +// --- Modifiers --- +expectType(ansiStyles.modifier.bold); +expectType(ansiStyles.modifier.dim); +expectType(ansiStyles.modifier.hidden); +expectType(ansiStyles.modifier.inverse); +expectType(ansiStyles.modifier.italic); +expectType(ansiStyles.modifier.reset); +expectType(ansiStyles.modifier.strikethrough); +expectType(ansiStyles.modifier.underline); + +// -- Top level -- +// --- Foreground color --- +expectType(ansiStyles.black); +expectType(ansiStyles.red); +expectType(ansiStyles.green); +expectType(ansiStyles.yellow); +expectType(ansiStyles.blue); +expectType(ansiStyles.cyan); +expectType(ansiStyles.magenta); +expectType(ansiStyles.white); + +expectType(ansiStyles.gray); +expectType(ansiStyles.grey); + +expectType(ansiStyles.blackBright); +expectType(ansiStyles.redBright); +expectType(ansiStyles.greenBright); +expectType(ansiStyles.yellowBright); +expectType(ansiStyles.blueBright); +expectType(ansiStyles.cyanBright); +expectType(ansiStyles.magentaBright); +expectType(ansiStyles.whiteBright); + +// --- Background color --- +expectType(ansiStyles.bgBlack); +expectType(ansiStyles.bgRed); +expectType(ansiStyles.bgGreen); +expectType(ansiStyles.bgYellow); +expectType(ansiStyles.bgBlue); +expectType(ansiStyles.bgCyan); +expectType(ansiStyles.bgMagenta); +expectType(ansiStyles.bgWhite); + +expectType(ansiStyles.bgGray); +expectType(ansiStyles.bgGrey); + +expectType(ansiStyles.bgBlackBright); +expectType(ansiStyles.bgRedBright); +expectType(ansiStyles.bgGreenBright); +expectType(ansiStyles.bgYellowBright); +expectType(ansiStyles.bgBlueBright); +expectType(ansiStyles.bgCyanBright); +expectType(ansiStyles.bgMagentaBright); +expectType(ansiStyles.bgWhiteBright); + +// --- Modifiers --- +expectType(ansiStyles.bold); +expectType(ansiStyles.dim); +expectType(ansiStyles.hidden); +expectType(ansiStyles.inverse); +expectType(ansiStyles.italic); +expectType(ansiStyles.reset); +expectType(ansiStyles.strikethrough); +expectType(ansiStyles.underline); diff --git a/package.json b/package.json index 6ae0d56..4390764 100644 --- a/package.json +++ b/package.json @@ -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", @@ -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" } }