@qodalis/angular-cli
Version:
A lightweight and flexible command-line interface (CLI) tool designed to streamline workflows and automate tasks for developers.
79 lines • 10.9 kB
JavaScript
export class CliTerminalProgressBar {
constructor(terminal) {
this.terminal = terminal;
this.isRunning = false;
this.text = '';
this.progress = 0;
this.total = 100;
this.progressText = '';
}
show(text) {
this.isRunning = true;
this.progress = 0;
this.text = text || '';
// Update progress bar every 100ms
this.progressBarInterval = setInterval(() => {
this.updateProgressBar();
// Stop when progress reaches 100%
if (this.progress > this.total) {
this.progress = this.total;
this.hide(); // Stop the progress bar
}
}, 100);
}
hide() {
this.isRunning = false;
if (this.progressBarInterval) {
clearInterval(this.progressBarInterval);
this.progressBarInterval = null;
}
this.clearCurrentLine();
this.text = '';
this.progressText = '';
}
update(progress, options) {
if (options?.type === 'increment') {
this.progress += progress;
}
else {
this.progress = progress;
}
if (this.progress > this.total) {
this.progress = this.total;
}
this.updateProgressBar();
}
complete() {
this.progress = 100;
this.hide();
}
setText(text) {
this.text = text;
this.updateProgressBar();
}
updateProgressBar() {
const totalBars = 50; // Length of the progress bar
const filledBars = Math.round((this.progress / this.total) * totalBars);
const emptyBars = totalBars - filledBars;
const progressBar = `[${'#'.repeat(filledBars)}${'.'.repeat(emptyBars)}]`;
const percentage = `${this.progress}%`.padStart(4, ' ');
const text = this.text.length > 0 ? ` ${this.text}` : '';
this.clearCurrentLine();
this.progressText = `${progressBar} ${percentage} ${text}`;
this.terminal.write(this.progressText); // Write progress bar
}
clearCurrentLine() {
const wrappedLines = Math.ceil(this.progressText.length / this.terminal.cols);
for (let i = 0; i < wrappedLines; i++) {
this.terminal.write('\x1b[2K'); // Clear the current line
this.terminal.write('\r'); // Move the cursor to the start of the line
if (i < wrappedLines - 1) {
this.terminal.write('\x1b[F'); // Move the cursor up for all but the last line
}
if (i === wrappedLines - 1) {
this.terminal.write('\r');
}
}
}
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY2xpLXRlcm1pbmFsLXByb2dyZXNzLWJhci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uLy4uLy4uLy4uL3Byb2plY3RzL2NsaS9zcmMvbGliL2NsaS9zZXJ2aWNlcy9wcm9ncmVzcy1iYXJzL2NsaS10ZXJtaW5hbC1wcm9ncmVzcy1iYXIudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBTUEsTUFBTSxPQUFPLHNCQUFzQjtJQVMvQixZQUFvQixRQUFrQjtRQUFsQixhQUFRLEdBQVIsUUFBUSxDQUFVO1FBUnRDLGNBQVMsR0FBWSxLQUFLLENBQUM7UUFFbkIsU0FBSSxHQUFXLEVBQUUsQ0FBQztRQUVsQixhQUFRLEdBQUcsQ0FBQyxDQUFDO1FBQ2IsVUFBSyxHQUFHLEdBQUcsQ0FBQztRQUNaLGlCQUFZLEdBQUcsRUFBRSxDQUFDO0lBRWUsQ0FBQztJQUVuQyxJQUFJLENBQUMsSUFBYTtRQUNyQixJQUFJLENBQUMsU0FBUyxHQUFHLElBQUksQ0FBQztRQUN0QixJQUFJLENBQUMsUUFBUSxHQUFHLENBQUMsQ0FBQztRQUNsQixJQUFJLENBQUMsSUFBSSxHQUFHLElBQUksSUFBSSxFQUFFLENBQUM7UUFFdkIsa0NBQWtDO1FBQ2xDLElBQUksQ0FBQyxtQkFBbUIsR0FBRyxXQUFXLENBQUMsR0FBRyxFQUFFO1lBQ3hDLElBQUksQ0FBQyxpQkFBaUIsRUFBRSxDQUFDO1lBRXpCLGtDQUFrQztZQUNsQyxJQUFJLElBQUksQ0FBQyxRQUFRLEdBQUcsSUFBSSxDQUFDLEtBQUssRUFBRTtnQkFDNUIsSUFBSSxDQUFDLFFBQVEsR0FBRyxJQUFJLENBQUMsS0FBSyxDQUFDO2dCQUMzQixJQUFJLENBQUMsSUFBSSxFQUFFLENBQUMsQ0FBQyx3QkFBd0I7YUFDeEM7UUFDTCxDQUFDLEVBQUUsR0FBRyxDQUFDLENBQUM7SUFDWixDQUFDO0lBRU0sSUFBSTtRQUNQLElBQUksQ0FBQyxTQUFTLEdBQUcsS0FBSyxDQUFDO1FBQ3ZCLElBQUksSUFB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LFFBQVEsQ0FBQyxDQUFDLENBQUMsK0NBQStDO2FBQ2pGO1lBRUQsSUFBSSxDQUFDLEtBQUssWUFBWSxHQUFHLENBQUMsRUFBRTtnQkFDeEIsSUFBSSxDQUFDLFFBQVEsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7YUFDN0I7U0FDSjtJQUNMLENBQUM7Q0FDSiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IFRlcm1pbmFsIH0gZnJvbSAnQHh0ZXJtL3h0ZXJtJztcbmltcG9ydCB7XG4gICAgQ2xpUGVyY2VudGFnZVByb2dyZXNzQmFyVXBkYXRlVmFsdWVPcHRpb25zLFxuICAgIElDbGlQZXJjZW50YWdlUHJvZ3Jlc3NCYXIsXG59IGZyb20gJ0Bxb2RhbGlzL2NsaS1jb3JlJztcblxuZXhwb3J0IGNsYXNzIENsaVRlcm1pbmFsUHJvZ3Jlc3NCYXIgaW1wbGVtZW50cyBJQ2xpUGVyY2VudGFnZVByb2dyZXNzQmFyIHtcbiAgICBpc1J1bm5pbmc6IGJvb2xlYW4gPSBmYWxzZTtcblxuICAgIHByaXZhdGUgdGV4dDogc3RyaW5nID0gJyc7XG4gICAgcHJpdmF0ZSBwcm9ncmVzc0JhckludGVydmFsPzogUmV0dXJuVHlwZTx0eXBlb2Ygc2V0SW50ZXJ2YWw+IHwgbnVsbDtcbiAgICBwcml2YXRlIHByb2dyZXNzID0gMDtcbiAgICBwcml2YXRlIHRvdGFsID0gMTAwO1xuICAgIHByaXZhdGUgcHJvZ3Jlc3NUZXh0ID0gJyc7XG5cbiAgICBjb25zdHJ1Y3Rvcihwcml2YXRlIHRlcm1pbmFsOiBUZXJtaW5hbCkge31cblxuICAgIHB1YmxpYyBzaG93KHRleHQ/OiBzdHJpbmcpOiB2b2lkIHtcbiAgICAgICAgdGhpcy5pc1J1bm5pbmcgPSB0cnVlO1xuICAgICAgICB0aGlzLnByb2dyZXNzID0gMDtcbiAgICAgICAgdGhpcy50ZXh0ID0gdGV4dCB8fCAnJztcblxuICAgICAgICAvLyBVcGRhdGUgcHJvZ3Jlc3MgYmFyIGV2ZXJ5IDEwMG1zXG4gICAgICAgIHRoaXMucHJvZ3Jlc3NCYXJJbnRlcnZhbCA9IHNldEludGVydmFsKCgpID0+IHtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlUHJvZ3Jlc3NCYXIoKTtcblxuICAgICAgICAgICAgLy8gU3RvcCB3aGVuIHByb2dyZXNzIHJlYWNoZXMgMTAwJVxuICAgICAgICAgICAgaWYgKHRoaXMucHJvZ3Jlc3MgPiB0aGlzLnRvdGFsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5wcm9ncmVzcyA9IHRoaXMudG90YWw7XG4gICAgICAgICAgICAgICAgdGhpcy5oaWRlKCk7IC8vIFN0b3AgdGhlIHByb2dyZXNzIGJhclxuICAgICAgICAgICAgfVxuICAgICAgICB9LCAxMDApO1xuICAgIH1cblxuICAgIHB1YmxpYyBoaWRlKCk6IHZvaWQge1xuICAgICAgICB0aGlzLmlzUnVubmluZyA9IGZhbHNlO1xuICAgICAgICBpZiAodGhpcy5wcm9ncmVzc0JhckludGVydmFsKSB7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKHRoaXMucHJvZ3Jlc3NCYXJJbnRlcnZhbCk7XG4gICAgICAgICAgICB0aGlzLnByb2dyZXNzQmFySW50ZXJ2YWwgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jbGVhckN1cnJlbnRMaW5lKCk7XG5cbiAgICAgICAgdGhpcy50ZXh0ID0gJyc7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3NUZXh0ID0gJyc7XG4gICAgfVxuXG4gICAgcHVibGljIHVwZGF0ZShcbiAgICAgICAgcHJvZ3Jlc3M6IG51bWJlcixcbiAgICAgICAgb3B0aW9ucz86IENsaVBlcmNlbnRhZ2VQcm9ncmVzc0JhclVwZGF0ZVZhbHVlT3B0aW9ucyxcbiAgICApIHtcbiAgICAgICAgaWYgKG9wdGlvbnM/LnR5cGUgPT09ICdpbmNyZW1lbnQnKSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyZXNzICs9IHByb2dyZXNzO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmVzcyA9IHByb2dyZXNzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMucHJvZ3Jlc3MgPiB0aGlzLnRvdGFsKSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyZXNzID0gdGhpcy50b3RhbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlUHJvZ3Jlc3NCYXIoKTtcbiAgICB9XG5cbiAgICBwdWJsaWMgY29tcGxldGUoKSB7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3MgPSAxMDA7XG4gICAgICAgIHRoaXMuaGlkZSgpO1xuICAgIH1cblxuICAgIHB1YmxpYyBzZXRUZXh0KHRleHQ6IHN0cmluZykge1xuICAgICAgICB0aGlzLnRleHQgPSB0ZXh0O1xuXG4gICAgICAgIHRoaXMudXBkYXRlUHJvZ3Jlc3NCYXIoKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIHVwZGF0ZVByb2dyZXNzQmFyKCk6IHZvaWQge1xuICAgICAgICBjb25zdCB0b3RhbEJhcnMgPSA1MDsgLy8gTGVuZ3RoIG9mIHRoZSBwcm9ncmVzcyBiYXJcbiAgICAgICAgY29uc3QgZmlsbGVkQmFycyA9IE1hdGgucm91bmQoKHRoaXMucHJvZ3Jlc3MgLyB0aGlzLnRvdGFsKSAqIHRvdGFsQmFycyk7XG4gICAgICAgIGNvbnN0IGVtcHR5QmFycyA9IHRvdGFsQmFycyAtIGZpbGxlZEJhcnM7XG5cbiAgICAgICAgY29uc3QgcHJvZ3Jlc3NCYXIgPSBgWyR7JyMnLnJlcGVhdChmaWxsZWRCYXJzKX0keycuJy5yZXBlYXQoZW1wdHlCYXJzKX1dYDtcbiAgICAgICAgY29uc3QgcGVyY2VudGFnZSA9IGAke3RoaXMucHJvZ3Jlc3N9JWAucGFkU3RhcnQoNCwgJyAnKTtcbiAgICAgICAgY29uc3QgdGV4dCA9IHRoaXMudGV4dC5sZW5ndGggPiAwID8gYCAke3RoaXMudGV4dH1gIDogJyc7XG5cbiAgICAgICAgdGhpcy5jbGVhckN1cnJlbnRMaW5lKCk7XG4gICAgICAgIHRoaXMucHJvZ3Jlc3NUZXh0ID0gYCR7cHJvZ3Jlc3NCYXJ9ICR7cGVyY2VudGFnZX0gJHt0ZXh0fWA7XG5cbiAgICAgICAgdGhpcy50ZXJtaW5hbC53cml0ZSh0aGlzLnByb2dyZXNzVGV4dCk7IC8vIFdyaXRlIHByb2dyZXNzIGJhclxuICAgIH1cblxuICAgIHByaXZhdGUgY2xlYXJDdXJyZW50TGluZSgpOiB2b2lkIHtcbiAgICAgICAgY29uc3Qgd3JhcHBlZExpbmVzID0gTWF0aC5jZWlsKFxuICAgICAgICAgICAgdGhpcy5wcm9ncmVzc1RleHQubGVuZ3RoIC8gdGhpcy50ZXJtaW5hbC5jb2xzLFxuICAgICAgICApO1xuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd3JhcHBlZExpbmVzOyBpKyspIHtcbiAgICAgICAgICAgIHRoaXMudGVybWluYWwud3JpdGUoJ1xceDFiWzJLJyk7IC8vIENsZWFyIHRoZSBjdXJyZW50IGxpbmVcbiAgICAgICAgICAgIHRoaXMudGVybWluYWwud3JpdGUoJ1xccicpOyAvLyBNb3ZlIHRoZSBjdXJzb3IgdG8gdGhlIHN0YXJ0IG9mIHRoZSBsaW5lXG4gICAgICAgICAgICBpZiAoaSA8IHdyYXBwZWRMaW5lcyAtIDEpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnRlcm1pbmFsLndyaXRlKCdcXHgxYltGJyk7IC8vIE1vdmUgdGhlIGN1cnNvciB1cCBmb3IgYWxsIGJ1dCB0aGUgbGFzdCBsaW5lXG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChpID09PSB3cmFwcGVkTGluZXMgLSAxKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50ZXJtaW5hbC53cml0ZSgnXFxyJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG4iXX0=