/** * Represents the possible configuration values that can be provided when creating the progress bar text. */ interface IProgressBarConfiguration { /** * Current progress, taken as a decimal (i.e. '0.6' to represent '60%') */ progress?: number; /** * Total number of ticks in progress bar. Preferably a factor of 100. */ totalTicks?: number; } /** * Represents concrete configuration values when creating the progress bar text. */ interface IProgressBarConfigurationMaterialized extends IProgressBarConfiguration { progress: number; totalTicks: number; } /** * Creates a graphical "progress bar" * e.g.: [||||---------------] * @param params The configuration parameters for the progress bar */ export function createProgressBarText(params: IProgressBarConfiguration) { // Default values const defaultParams: IProgressBarConfigurationMaterialized = { progress: 0, totalTicks: 20, }; // tslint:disable-next-line:prefer-object-spread const derivedParams: IProgressBarConfigurationMaterialized = Object.assign({}, defaultParams, params); const bars: number = Math.floor(derivedParams.progress / (1 / derivedParams.totalTicks)); const dashes: number = derivedParams.totalTicks - bars; // String.prototype.repeat isn't completley supported, but good enough for our purposes return `[${"|".repeat(bars + 1)}${"-".repeat(dashes + 1)}]`; }