tap
Version:
A Test-Anything-Protocol library for JavaScript
311 lines (282 loc) • 9.13 kB
TypeScript
import * as React from 'react';
export interface RenderOptions {
/**
* Output stream where app will be rendered.
*
* @default process.stdout
*/
readonly stdout?: NodeJS.WriteStream;
/**
* Input stream where app will listen for input.
*
* @default process.stdin
*/
readonly stdin?: NodeJS.ReadStream;
/**
* Configure whether Ink should listen to Ctrl+C keyboard input and exit the app. This is needed in case `process.stdin` is in raw mode, because then Ctrl+C is ignored by default and process is expected to handle it manually.
*
* @default true
*/
readonly exitOnCtrlC?: boolean;
/**
* If true, each update will be rendered as a separate output, without replacing the previous one.
*
* @default false
*/
readonly debug?: boolean;
/**
* Enable experimental mode and use a new and faster reconciler and renderer.
* There should be no changes to the output. If there are, please report it.
*
* @default false
*/
readonly experimental?: boolean;
}
export type Instance = {
/**
* Replace previous root node with a new one or update props of the current root node.
*/
rerender: <Props>(tree: React.ReactElement<Props>) => void;
/**
* Manually unmount the whole Ink app.
*/
unmount: Unmount;
/**
* Returns a promise, which resolves when app is unmounted.
*/
waitUntilExit: () => Promise<void>;
};
export type Unmount = () => void;
/**
* This hook is used for handling user input.
* It's a more convienient alternative to using `StdinContext` and listening to `data` events.
* The callback you pass to `useInput` is called for each character when user enters any input.
* However, if user pastes text and it's more than one character, the callback will be called only once and the whole string will be passed as `input`.
*
* ```
* import {useInput} from 'ink';
*
* const UserInput = () => {
* useInput((input, key) => {
* if (input === 'q') {
* // Exit program
* }
*
* if (key.leftArrow) {
* // Left arrow key pressed
* }
* });
*
* return …
* };
* ```
*/
export function useInput(
inputHandler: (input: string, key: Key) => void
): void;
export interface Key {
upArrow: boolean
downArrow: boolean
leftArrow: boolean
rightArrow: boolean
return: boolean
escape: boolean
ctrl: boolean
shift: boolean
meta: boolean
}
/**
* Mount a component and render the output.
*/
export function render<Props>(
tree: React.ReactElement<Props>,
options?: NodeJS.WriteStream | RenderOptions
): Instance;
export interface ColorProps {
readonly hex?: string;
readonly hsl?: [number, number, number];
readonly hsv?: [number, number, number];
readonly hwb?: [number, number, number];
readonly rgb?: [number, number, number];
readonly keyword?: string;
readonly bgHex?: string;
readonly bgHsl?: [number, number, number];
readonly bgHsv?: [number, number, number];
readonly bgHwb?: [number, number, number];
readonly bgRgb?: [number, number, number];
readonly bgKeyword?: string;
readonly reset?: boolean;
readonly bold?: boolean;
readonly dim?: boolean;
readonly italic?: boolean;
readonly underline?: boolean;
readonly inverse?: boolean;
readonly hidden?: boolean;
readonly strikethrough?: boolean;
readonly visible?: boolean;
readonly black?: boolean;
readonly red?: boolean;
readonly green?: boolean;
readonly yellow?: boolean;
readonly blue?: boolean;
readonly magenta?: boolean;
readonly cyan?: boolean;
readonly white?: boolean;
readonly gray?: boolean;
readonly grey?: boolean;
readonly blackBright?: boolean;
readonly redBright?: boolean;
readonly greenBright?: boolean;
readonly yellowBright?: boolean;
readonly blueBright?: boolean;
readonly magentaBright?: boolean;
readonly cyanBright?: boolean;
readonly whiteBright?: boolean;
readonly bgBlack?: boolean;
readonly bgRed?: boolean;
readonly bgGreen?: boolean;
readonly bgYellow?: boolean;
readonly bgBlue?: boolean;
readonly bgMagenta?: boolean;
readonly bgCyan?: boolean;
readonly bgWhite?: boolean;
readonly bgBlackBright?: boolean;
readonly bgRedBright?: boolean;
readonly bgGreenBright?: boolean;
readonly bgYellowBright?: boolean;
readonly bgBlueBright?: boolean;
readonly bgMagentaBright?: boolean;
readonly bgCyanBright?: boolean;
readonly bgWhiteBright?: boolean;
}
/**
* The `<Color>` compoment is a simple wrapper around the `chalk` API. It supports all of the `chalk`'s methods as `props`.
*/
export const Color: React.FC<ColorProps>;
export interface BoxProps {
readonly width?: number | string;
readonly height?: number | string;
readonly minWidth?: number;
readonly minHeight?: number;
readonly paddingTop?: number;
readonly paddingBottom?: number;
readonly paddingLeft?: number;
readonly paddingRight?: number;
readonly paddingX?: number;
readonly paddingY?: number;
readonly padding?: number;
readonly marginTop?: number;
readonly marginBottom?: number;
readonly marginLeft?: number;
readonly marginRight?: number;
readonly marginX?: number;
readonly marginY?: number;
readonly margin?: number;
readonly flexGrow?: number;
readonly flexShrink?: number;
readonly flexDirection?: 'row' | 'row-reverse' | 'column' | 'column-reverse';
readonly flexBasis?: string | number;
readonly alignItems?: 'flex-start' | 'center' | 'flex-end';
readonly justifyContent?:
| 'flex-start'
| 'center'
| 'flex-end'
| 'space-between'
| 'space-around';
readonly textWrap?:
| 'wrap'
| 'truncate'
| 'truncate-start'
| 'truncate-middle'
| 'truncate-end';
}
/**
* `<Box>` it's an essential Ink component to build your layout. It's like a `<div style="display: flex">` in a browser.
*/
export const Box: React.ComponentClass<BoxProps>;
export interface TextProps {
readonly bold?: boolean;
readonly italic?: boolean;
readonly underline?: boolean;
readonly strikethrough?: boolean;
}
/**
* This component can change the style of the text, make it bold, underline, italic or strikethrough.
*/
export const Text: React.FC<TextProps>;
/**
* `<Static>` component allows permanently rendering output to stdout and preserving it across renders. Components passed to `<Static>` as children will be written to stdout only once and will never be rerendered. `<Static>` output comes first, before any other output from your components, no matter where it is in the tree. In order for this mechanism to work properly, at most one `<Static>` component must be present in your node tree and components that were rendered must never update their output. Ink will detect new children appended to `<Static>` and render them to stdout.
*
* __Note__: `<Static>` accepts only an array of children and each of them must have a unique key.
*/
export const Static: React.FC<{children: React.ReactNodeArray}>;
interface AppProps {
/**
* Exit (unmount) the whole Ink app.
*/
readonly exit: (error?: Error) => void;
}
/**
* `AppContext` is a React context, which exposes a method to manually exit the app (unmount).
*/
export const AppContext: React.Context<AppProps>;
/**
* `useApp` is a React hook, which exposes props of `AppContext`.
* ```js
* import {useApp} from 'ink';
*
* const MyApp = () => {
* const {exit} = useApp();
* };
* ```
*
* It's equivalent to consuming `AppContext` props via `AppContext.Consumer`:
*
* ```jsx
* <AppContext.Consumer>
* {({exit}) => {
* // …
* }}
* </AppContext.Consumer>
* ```
*/
export function useApp(): AppProps;
interface StdinProps {
/**
* Stdin stream passed to `render()` in `options.stdin` or `process.stdin` by default. Useful if your app needs to handle user input.
*/
readonly stdin: NodeJS.ReadStream;
/**
* A boolean flag determining if the current `stdin` supports `setRawMode`. A component using `setRawMode` might want to use `isRawModeSupported` to nicely fall back in environments where raw mode is not supported.
*/
readonly isRawModeSupported: boolean;
/**
* Ink exposes this function via own `<StdinContext>` to be able to handle Ctrl+C, that's why you should use Ink's `setRawMode` instead of `process.stdin.setRawMode`.
* If the `stdin` stream passed to Ink does not support setRawMode, this function does nothing.
*/
readonly setRawMode: NodeJS.ReadStream['setRawMode'];
}
/**
* `StdinContext` is a React context, which exposes input stream.
*/
export const StdinContext: React.Context<StdinProps>;
/**
* `useStdin` is a React hook, which exposes props of `StdinContext`.
* Similar to `useApp`, it's equivalent to consuming `StdinContext` directly.
*/
export function useStdin(): StdinProps;
interface StdoutProps {
/**
* Stdout stream passed to `render()` in `options.stdout` or `process.stdout` by default.
*/
readonly stdout: NodeJS.WriteStream;
}
/**
* `StdoutContext` is a React context, which exposes stdout stream, where Ink renders your app.
*/
export const StdoutContext: React.Context<StdoutProps>;
/**
* `useStdout` is a React hook, which exposes props of `StdoutContext`.
* Similar to `useStdout`, it's equivalent to consuming `StdoutContext` directly.
*/
export function useStdout(): StdoutProps;