multi-progress-bars
Version:
Multiple progress bars with option for indefinite spinners
132 lines (131 loc) • 4.88 kB
text/typescript
/// <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 };