UNPKG

multi-progress-bars

Version:

Multiple progress bars with option for indefinite spinners

132 lines (131 loc) 4.88 kB
/// <reference types="node" /> import { WriteStream } from "tty"; type TaskType = "percentage" | "indefinite"; type TransformFn = (bar: string) => string; type Anchor = "top" | "bottom"; interface Task { name: string; index: number; type: TaskType; message: string; barTransformFn: TransformFn; nameTransformFn: TransformFn; percentage?: number; done: boolean; } interface AddOptions { index?: number; type: TaskType; message?: string; nameTransformFn?: TransformFn; barTransformFn?: TransformFn; percentage?: number; } type UpdateOptions = Partial<Pick<Task, "message" | "barTransformFn" | "percentage" | "nameTransformFn">>; interface Tasks { [key: string]: Task; } /** * Function for generating the indefinite spinner * * @param t Current timestep * @param width Width of the spinner * * @returns String of length "width" */ type SpinnerGenerator = (t: number, width: number) => string; /** * Options for setting the border, all optional */ interface Border { message?: string; pattern?: string; left?: number; right?: number; } /** * Constructor Options * @param stream A node TTY stream * @param spinnerFPS FPS to run the indefinite spinner * @param numCrawlers Optional: Number of crawlers for the indefinite spinner * @param progressWidth Width of the progress bar * @param spinnerGenerator See SpinnerGenerator type * @param initMessage Message to display in the header * @param border boolean or a string for the border design * @param anchor 'top' or 'bottom', default 'bottom' * @param persist Keep console override even if all progress bars are 100% * @param header Optional: Border object, string, or boolean. Will override initMessage and border if provided * @param footer Optional: Border object, string, or boolean. */ interface CtorOptions { stream: WriteStream; spinnerFPS: number; numCrawlers: number; progressWidth: number; spinnerGenerator: SpinnerGenerator; initMessage: string; anchor: Anchor; persist: boolean; border: boolean | string; header: Border | string | boolean; footer: Border | string | boolean; } declare class MultiProgressBars { private tasks; private spinnerFPS; private progressWidth; private persist; private intervalID; private numCrawlers; private longestNameLength; private t; private resolve; private spinnerGenerator; private logger; private border; private bottomBorder; private endIdx; // 1 past the last index private allFinished; private headerSettings; private footerSettings; promise: Promise<void>; /** * * @param options {@link CtorOptions | See CtorOptions Type} */ constructor(options?: Partial<CtorOptions>); /** Make simple border from supplied option */ private processSimpleBorder; /** Make border from message, pattern, left, right. Called internally by setHeader and setFooter * * [message] will be placed within a string surrounded by [pattern] at the specified [left] or [right] * Pass undefined or null to [left] if you want [right] to be used. */ private makeBorder; cleanup: () => never; setHeader(options: Border | string | boolean): void; setFooter(options: Border | string | boolean): void; removeHeader(): void; removeFooter(): void; addTask(name: string, { index, ...options }: AddOptions): void; // Call this BEFORE you add a new task to the list private restartPromiseIfNeeded; isDone(name: string): boolean; removeTask(task: string | number, shift?: boolean): void; private progressString; private indefiniteString; private writeTask; incrementTask(name: string, { percentage, ...options }?: UpdateOptions): void; updateTask(name: string, options?: UpdateOptions): void; done(name: string, { message, ...options }?: Pick<UpdateOptions, "message" | "barTransformFn" | "nameTransformFn">): void; restartTask(name: string, { percentage, ...options }: Pick<UpdateOptions, "percentage" | "message" | "barTransformFn" | "nameTransformFn">): void; close(): void; // Returns the index of task with supplied name. Returns undefined if name not found. getIndex(taskName: string): number; // Returns the name of the task with given index. Returns undefined if name not found. getName(index: number): string; // TODO maybe make this static? private hilbertSpinner; private renderIndefinite; } export { TaskType, Task, AddOptions, UpdateOptions, Tasks, SpinnerGenerator, Border, CtorOptions, MultiProgressBars };