devkill 0.12.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +21 -0
- package/README.es.md +253 -0
- package/README.id.md +238 -0
- package/README.md +377 -0
- package/README.pt.md +241 -0
- package/README.tr.md +242 -0
- package/lib/cli/cli.controller.d.ts +81 -0
- package/lib/cli/cli.controller.js +760 -0
- package/lib/cli/cli.controller.js.map +1 -0
- package/lib/cli/interfaces/cli-options.interface.d.ts +5 -0
- package/lib/cli/interfaces/cli-options.interface.js +2 -0
- package/lib/cli/interfaces/cli-options.interface.js.map +1 -0
- package/lib/cli/interfaces/command-keys.interface.d.ts +17 -0
- package/lib/cli/interfaces/command-keys.interface.js +2 -0
- package/lib/cli/interfaces/command-keys.interface.js.map +1 -0
- package/lib/cli/interfaces/config.interface.d.ts +17 -0
- package/lib/cli/interfaces/config.interface.js +2 -0
- package/lib/cli/interfaces/config.interface.js.map +1 -0
- package/lib/cli/interfaces/index.d.ts +11 -0
- package/lib/cli/interfaces/index.js +12 -0
- package/lib/cli/interfaces/index.js.map +1 -0
- package/lib/cli/interfaces/json-output.interface.d.ts +30 -0
- package/lib/cli/interfaces/json-output.interface.js +2 -0
- package/lib/cli/interfaces/json-output.interface.js.map +1 -0
- package/lib/cli/interfaces/key-press.interface.d.ts +7 -0
- package/lib/cli/interfaces/key-press.interface.js +2 -0
- package/lib/cli/interfaces/key-press.interface.js.map +1 -0
- package/lib/cli/interfaces/node-version.interface.d.ts +5 -0
- package/lib/cli/interfaces/node-version.interface.js +2 -0
- package/lib/cli/interfaces/node-version.interface.js.map +1 -0
- package/lib/cli/interfaces/stats.interface.d.ts +15 -0
- package/lib/cli/interfaces/stats.interface.js +2 -0
- package/lib/cli/interfaces/stats.interface.js.map +1 -0
- package/lib/cli/interfaces/ui-positions.interface.d.ts +5 -0
- package/lib/cli/interfaces/ui-positions.interface.js +2 -0
- package/lib/cli/interfaces/ui-positions.interface.js.map +1 -0
- package/lib/cli/interfaces/version.interface.d.ts +5 -0
- package/lib/cli/interfaces/version.interface.js +2 -0
- package/lib/cli/interfaces/version.interface.js.map +1 -0
- package/lib/cli/models/start-parameters.model.d.ts +7 -0
- package/lib/cli/models/start-parameters.model.js +25 -0
- package/lib/cli/models/start-parameters.model.js.map +1 -0
- package/lib/cli/services/console.service.d.ts +23 -0
- package/lib/cli/services/console.service.js +87 -0
- package/lib/cli/services/console.service.js.map +1 -0
- package/lib/cli/services/https.service.d.ts +4 -0
- package/lib/cli/services/https.service.js +32 -0
- package/lib/cli/services/https.service.js.map +1 -0
- package/lib/cli/services/index.d.ts +7 -0
- package/lib/cli/services/index.js +8 -0
- package/lib/cli/services/index.js.map +1 -0
- package/lib/cli/services/json-output.service.d.ts +20 -0
- package/lib/cli/services/json-output.service.js +101 -0
- package/lib/cli/services/json-output.service.js.map +1 -0
- package/lib/cli/services/results.service.d.ts +13 -0
- package/lib/cli/services/results.service.js +61 -0
- package/lib/cli/services/results.service.js.map +1 -0
- package/lib/cli/services/scan.service.d.ts +13 -0
- package/lib/cli/services/scan.service.js +79 -0
- package/lib/cli/services/scan.service.js.map +1 -0
- package/lib/cli/services/spinner.service.d.ts +9 -0
- package/lib/cli/services/spinner.service.js +27 -0
- package/lib/cli/services/spinner.service.js.map +1 -0
- package/lib/cli/services/ui.service.d.ts +17 -0
- package/lib/cli/services/ui.service.js +59 -0
- package/lib/cli/services/ui.service.js.map +1 -0
- package/lib/cli/services/update.service.d.ts +15 -0
- package/lib/cli/services/update.service.js +37 -0
- package/lib/cli/services/update.service.js.map +1 -0
- package/lib/cli/ui/base.ui.d.ts +28 -0
- package/lib/cli/ui/base.ui.js +49 -0
- package/lib/cli/ui/base.ui.js.map +1 -0
- package/lib/cli/ui/components/general.ui.d.ts +7 -0
- package/lib/cli/ui/components/general.ui.js +13 -0
- package/lib/cli/ui/components/general.ui.js.map +1 -0
- package/lib/cli/ui/components/header/header-ui.constants.d.ts +7 -0
- package/lib/cli/ui/components/header/header-ui.constants.js +7 -0
- package/lib/cli/ui/components/header/header-ui.constants.js.map +1 -0
- package/lib/cli/ui/components/header/header.ui.d.ts +18 -0
- package/lib/cli/ui/components/header/header.ui.js +96 -0
- package/lib/cli/ui/components/header/header.ui.js.map +1 -0
- package/lib/cli/ui/components/header/stats.ui.d.ts +25 -0
- package/lib/cli/ui/components/header/stats.ui.js +198 -0
- package/lib/cli/ui/components/header/stats.ui.js.map +1 -0
- package/lib/cli/ui/components/header/status.ui.d.ts +33 -0
- package/lib/cli/ui/components/header/status.ui.js +188 -0
- package/lib/cli/ui/components/header/status.ui.js.map +1 -0
- package/lib/cli/ui/components/help/help-command.ui.d.ts +9 -0
- package/lib/cli/ui/components/help/help-command.ui.js +61 -0
- package/lib/cli/ui/components/help/help-command.ui.js.map +1 -0
- package/lib/cli/ui/components/help/help.constants.d.ts +8 -0
- package/lib/cli/ui/components/help/help.constants.js +270 -0
- package/lib/cli/ui/components/help/help.constants.js.map +1 -0
- package/lib/cli/ui/components/help/help.ui.d.ts +30 -0
- package/lib/cli/ui/components/help/help.ui.js +176 -0
- package/lib/cli/ui/components/help/help.ui.js.map +1 -0
- package/lib/cli/ui/components/logs.ui.d.ts +24 -0
- package/lib/cli/ui/components/logs.ui.js +132 -0
- package/lib/cli/ui/components/logs.ui.js.map +1 -0
- package/lib/cli/ui/components/options.ui.d.ts +29 -0
- package/lib/cli/ui/components/options.ui.js +327 -0
- package/lib/cli/ui/components/options.ui.js.map +1 -0
- package/lib/cli/ui/components/profile-picker.ui.d.ts +25 -0
- package/lib/cli/ui/components/profile-picker.ui.js +117 -0
- package/lib/cli/ui/components/profile-picker.ui.js.map +1 -0
- package/lib/cli/ui/components/result-details.ui.d.ts +23 -0
- package/lib/cli/ui/components/result-details.ui.js +182 -0
- package/lib/cli/ui/components/result-details.ui.js.map +1 -0
- package/lib/cli/ui/components/results.ui.d.ts +86 -0
- package/lib/cli/ui/components/results.ui.js +620 -0
- package/lib/cli/ui/components/results.ui.js.map +1 -0
- package/lib/cli/ui/components/warning.ui.d.ts +12 -0
- package/lib/cli/ui/components/warning.ui.js +30 -0
- package/lib/cli/ui/components/warning.ui.js.map +1 -0
- package/lib/cli/ui/heavy.ui.d.ts +18 -0
- package/lib/cli/ui/heavy.ui.js +37 -0
- package/lib/cli/ui/heavy.ui.js.map +1 -0
- package/lib/cli/ui/index.d.ts +14 -0
- package/lib/cli/ui/index.js +15 -0
- package/lib/cli/ui/index.js.map +1 -0
- package/lib/constants/cli.constants.d.ts +14 -0
- package/lib/constants/cli.constants.js +138 -0
- package/lib/constants/cli.constants.js.map +1 -0
- package/lib/constants/index.d.ts +8 -0
- package/lib/constants/index.js +9 -0
- package/lib/constants/index.js.map +1 -0
- package/lib/constants/main.constants.d.ts +96 -0
- package/lib/constants/main.constants.js +79 -0
- package/lib/constants/main.constants.js.map +1 -0
- package/lib/constants/messages.constants.d.ts +31 -0
- package/lib/constants/messages.constants.js +37 -0
- package/lib/constants/messages.constants.js.map +1 -0
- package/lib/constants/options.constants.d.ts +6 -0
- package/lib/constants/options.constants.js +8 -0
- package/lib/constants/options.constants.js.map +1 -0
- package/lib/constants/os-service-map.constants.d.ts +10 -0
- package/lib/constants/os-service-map.constants.js +11 -0
- package/lib/constants/os-service-map.constants.js.map +1 -0
- package/lib/constants/result-descriptions.constants.d.ts +142 -0
- package/lib/constants/result-descriptions.constants.js +203 -0
- package/lib/constants/result-descriptions.constants.js.map +1 -0
- package/lib/constants/sort.result.d.ts +6 -0
- package/lib/constants/sort.result.js +22 -0
- package/lib/constants/sort.result.js.map +1 -0
- package/lib/constants/spinner.constants.d.ts +5 -0
- package/lib/constants/spinner.constants.js +88 -0
- package/lib/constants/spinner.constants.js.map +1 -0
- package/lib/constants/status.constants.d.ts +7 -0
- package/lib/constants/status.constants.js +9 -0
- package/lib/constants/status.constants.js.map +1 -0
- package/lib/constants/update.constants.d.ts +2 -0
- package/lib/constants/update.constants.js +3 -0
- package/lib/constants/update.constants.js.map +1 -0
- package/lib/constants/workers.constants.d.ts +14 -0
- package/lib/constants/workers.constants.js +16 -0
- package/lib/constants/workers.constants.js.map +1 -0
- package/lib/core/constants/global-ignored.constants.d.ts +1 -0
- package/lib/core/constants/global-ignored.constants.js +44 -0
- package/lib/core/constants/global-ignored.constants.js.map +1 -0
- package/lib/core/constants/index.d.ts +1 -0
- package/lib/core/constants/index.js +2 -0
- package/lib/core/constants/index.js.map +1 -0
- package/lib/core/constants/profiles.constants.d.ts +8 -0
- package/lib/core/constants/profiles.constants.js +138 -0
- package/lib/core/constants/profiles.constants.js.map +1 -0
- package/lib/core/devkill.d.ts +25 -0
- package/lib/core/devkill.js +129 -0
- package/lib/core/devkill.js.map +1 -0
- package/lib/core/index.d.ts +4 -0
- package/lib/core/index.js +5 -0
- package/lib/core/index.js.map +1 -0
- package/lib/core/interfaces/devkill.interface.d.ts +78 -0
- package/lib/core/interfaces/devkill.interface.js +2 -0
- package/lib/core/interfaces/devkill.interface.js.map +1 -0
- package/lib/core/interfaces/devkillrc-config.interface.d.ts +87 -0
- package/lib/core/interfaces/devkillrc-config.interface.js +12 -0
- package/lib/core/interfaces/devkillrc-config.interface.js.map +1 -0
- package/lib/core/interfaces/file-service.interface.d.ts +76 -0
- package/lib/core/interfaces/file-service.interface.js +2 -0
- package/lib/core/interfaces/file-service.interface.js.map +1 -0
- package/lib/core/interfaces/folder.interface.d.ts +89 -0
- package/lib/core/interfaces/folder.interface.js +2 -0
- package/lib/core/interfaces/folder.interface.js.map +1 -0
- package/lib/core/interfaces/index.d.ts +6 -0
- package/lib/core/interfaces/index.js +7 -0
- package/lib/core/interfaces/index.js.map +1 -0
- package/lib/core/interfaces/logger-service.interface.d.ts +59 -0
- package/lib/core/interfaces/logger-service.interface.js +2 -0
- package/lib/core/interfaces/logger-service.interface.js.map +1 -0
- package/lib/core/interfaces/npkill.interface.d.ts +78 -0
- package/lib/core/interfaces/npkill.interface.js +2 -0
- package/lib/core/interfaces/npkill.interface.js.map +1 -0
- package/lib/core/interfaces/npkillrc-config.interface.d.ts +87 -0
- package/lib/core/interfaces/npkillrc-config.interface.js +12 -0
- package/lib/core/interfaces/npkillrc-config.interface.js.map +1 -0
- package/lib/core/interfaces/profile.interface.d.ts +9 -0
- package/lib/core/interfaces/profile.interface.js +2 -0
- package/lib/core/interfaces/profile.interface.js.map +1 -0
- package/lib/core/interfaces/search-status.model.d.ts +35 -0
- package/lib/core/interfaces/search-status.model.js +48 -0
- package/lib/core/interfaces/search-status.model.js.map +1 -0
- package/lib/core/interfaces/services.interface.d.ts +26 -0
- package/lib/core/interfaces/services.interface.js +2 -0
- package/lib/core/interfaces/services.interface.js.map +1 -0
- package/lib/core/npkill.d.ts +25 -0
- package/lib/core/npkill.js +129 -0
- package/lib/core/npkill.js.map +1 -0
- package/lib/core/services/config/config-merger.d.ts +17 -0
- package/lib/core/services/config/config-merger.js +57 -0
- package/lib/core/services/config/config-merger.js.map +1 -0
- package/lib/core/services/config/config-validator.d.ts +3 -0
- package/lib/core/services/config/config-validator.js +43 -0
- package/lib/core/services/config/config-validator.js.map +1 -0
- package/lib/core/services/config/index.d.ts +4 -0
- package/lib/core/services/config/index.js +5 -0
- package/lib/core/services/config/index.js.map +1 -0
- package/lib/core/services/config/profile-validator.d.ts +6 -0
- package/lib/core/services/config/profile-validator.js +68 -0
- package/lib/core/services/config/profile-validator.js.map +1 -0
- package/lib/core/services/config/property-validators.d.ts +33 -0
- package/lib/core/services/config/property-validators.js +125 -0
- package/lib/core/services/config/property-validators.js.map +1 -0
- package/lib/core/services/config.service.d.ts +37 -0
- package/lib/core/services/config.service.js +100 -0
- package/lib/core/services/config.service.js.map +1 -0
- package/lib/core/services/files/files.service.d.ts +28 -0
- package/lib/core/services/files/files.service.js +207 -0
- package/lib/core/services/files/files.service.js.map +1 -0
- package/lib/core/services/files/files.worker.d.ts +1 -0
- package/lib/core/services/files/files.worker.js +286 -0
- package/lib/core/services/files/files.worker.js.map +1 -0
- package/lib/core/services/files/files.worker.service.d.ts +90 -0
- package/lib/core/services/files/files.worker.service.js +216 -0
- package/lib/core/services/files/files.worker.service.js.map +1 -0
- package/lib/core/services/files/index.d.ts +4 -0
- package/lib/core/services/files/index.js +5 -0
- package/lib/core/services/files/index.js.map +1 -0
- package/lib/core/services/files/unix-files.service.d.ts +9 -0
- package/lib/core/services/files/unix-files.service.js +28 -0
- package/lib/core/services/files/unix-files.service.js.map +1 -0
- package/lib/core/services/files/windows-files.service.d.ts +9 -0
- package/lib/core/services/files/windows-files.service.js +16 -0
- package/lib/core/services/files/windows-files.service.js.map +1 -0
- package/lib/core/services/index.d.ts +5 -0
- package/lib/core/services/index.js +6 -0
- package/lib/core/services/index.js.map +1 -0
- package/lib/core/services/logger.service.d.ts +22 -0
- package/lib/core/services/logger.service.js +84 -0
- package/lib/core/services/logger.service.js.map +1 -0
- package/lib/core/services/profiles.service.d.ts +54 -0
- package/lib/core/services/profiles.service.js +86 -0
- package/lib/core/services/profiles.service.js.map +1 -0
- package/lib/core/services/stream.service.d.ts +12 -0
- package/lib/core/services/stream.service.js +39 -0
- package/lib/core/services/stream.service.js.map +1 -0
- package/lib/dirname.d.ts +2 -0
- package/lib/dirname.js +6 -0
- package/lib/dirname.js.map +1 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +11 -0
- package/lib/index.js.map +1 -0
- package/lib/main.d.ts +2 -0
- package/lib/main.js +19 -0
- package/lib/main.js.map +1 -0
- package/lib/utils/get-file-content.d.ts +1 -0
- package/lib/utils/get-file-content.js +6 -0
- package/lib/utils/get-file-content.js.map +1 -0
- package/lib/utils/is-safe-to-delete.d.ts +1 -0
- package/lib/utils/is-safe-to-delete.js +9 -0
- package/lib/utils/is-safe-to-delete.js.map +1 -0
- package/lib/utils/unit-conversions.d.ts +11 -0
- package/lib/utils/unit-conversions.js +54 -0
- package/lib/utils/unit-conversions.js.map +1 -0
- package/package.json +96 -0
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import pc from 'picocolors';
|
|
2
|
+
import { BehaviorSubject } from 'rxjs';
|
|
3
|
+
import { BANNER, INFO_MSGS, MENU_BAR, UI_POSITIONS, } from '../../../../constants/index.js';
|
|
4
|
+
import { BaseUi } from '../../base.ui.js';
|
|
5
|
+
import { MENU_BAR_OPTIONS } from './header-ui.constants.js';
|
|
6
|
+
export class HeaderUi extends BaseUi {
|
|
7
|
+
config;
|
|
8
|
+
programVersion;
|
|
9
|
+
activeMenuIndex = MENU_BAR_OPTIONS.DELETE;
|
|
10
|
+
searchMode = false;
|
|
11
|
+
searchText = '';
|
|
12
|
+
isSearchInputActive = false;
|
|
13
|
+
menuIndex$ = new BehaviorSubject(MENU_BAR_OPTIONS.DELETE);
|
|
14
|
+
constructor(config) {
|
|
15
|
+
super();
|
|
16
|
+
this.config = config;
|
|
17
|
+
this.menuIndex$.subscribe((menuIndex) => {
|
|
18
|
+
this.activeMenuIndex = menuIndex;
|
|
19
|
+
this.render();
|
|
20
|
+
});
|
|
21
|
+
}
|
|
22
|
+
setSearch(text, isInputActive = false) {
|
|
23
|
+
if (text === null) {
|
|
24
|
+
this.searchMode = false;
|
|
25
|
+
this.searchText = '';
|
|
26
|
+
this.isSearchInputActive = false;
|
|
27
|
+
}
|
|
28
|
+
else {
|
|
29
|
+
this.searchMode = true;
|
|
30
|
+
this.searchText = text;
|
|
31
|
+
this.isSearchInputActive = isInputActive;
|
|
32
|
+
}
|
|
33
|
+
this.render();
|
|
34
|
+
}
|
|
35
|
+
render() {
|
|
36
|
+
// banner and tutorial
|
|
37
|
+
this.printAt(BANNER, UI_POSITIONS.INITIAL);
|
|
38
|
+
this.renderHeader();
|
|
39
|
+
this.renderMenuBar();
|
|
40
|
+
if (this.programVersion !== undefined) {
|
|
41
|
+
this.printAt(pc.gray(this.programVersion), UI_POSITIONS.VERSION);
|
|
42
|
+
}
|
|
43
|
+
if (this.config.dryRun) {
|
|
44
|
+
this.printAt(pc.black(pc.bgMagenta(` ${INFO_MSGS.DRY_RUN} `)), UI_POSITIONS.DRY_RUN_NOTICE);
|
|
45
|
+
}
|
|
46
|
+
// Columns headers
|
|
47
|
+
if (this.activeMenuIndex === MENU_BAR_OPTIONS.DELETE) {
|
|
48
|
+
this.printAt(pc.bgYellow(pc.black(INFO_MSGS.HEADER_COLUMNS)), {
|
|
49
|
+
x: this.terminal.columns - INFO_MSGS.HEADER_COLUMNS.length - 2,
|
|
50
|
+
y: UI_POSITIONS.FOLDER_SIZE_HEADER.y,
|
|
51
|
+
});
|
|
52
|
+
}
|
|
53
|
+
// npkill stats
|
|
54
|
+
this.printAt(pc.gray(INFO_MSGS.TOTAL_SPACE), UI_POSITIONS.TOTAL_SPACE);
|
|
55
|
+
this.printAt(pc.gray(INFO_MSGS.SPACE_RELEASED), UI_POSITIONS.SPACE_RELEASED);
|
|
56
|
+
}
|
|
57
|
+
renderHeader() {
|
|
58
|
+
const { columns } = this.terminal;
|
|
59
|
+
const spaceToFill = Math.max(0, columns - 2);
|
|
60
|
+
this.printAt(pc.bgYellow(' '.repeat(spaceToFill)), UI_POSITIONS.TUTORIAL_TIP);
|
|
61
|
+
}
|
|
62
|
+
renderMenuBar() {
|
|
63
|
+
if (this.searchMode) {
|
|
64
|
+
let searchText = ` Search: ${this.searchText} `;
|
|
65
|
+
if (this.isSearchInputActive) {
|
|
66
|
+
searchText = ` Search: ${this.searchText}_ `;
|
|
67
|
+
this.printAt(pc.bgBlue(pc.white(searchText)), {
|
|
68
|
+
x: 2,
|
|
69
|
+
y: UI_POSITIONS.TUTORIAL_TIP.y,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
else {
|
|
73
|
+
this.printAt(pc.bgWhite(pc.black(searchText)), {
|
|
74
|
+
x: 2,
|
|
75
|
+
y: UI_POSITIONS.TUTORIAL_TIP.y,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
return;
|
|
79
|
+
}
|
|
80
|
+
const options = Object.values(MENU_BAR);
|
|
81
|
+
let xStart = 2;
|
|
82
|
+
for (const option of options) {
|
|
83
|
+
const isActive = option === options[this.activeMenuIndex];
|
|
84
|
+
const colorFn = isActive
|
|
85
|
+
? (v) => pc.bgYellow(pc.black(pc.bold(pc.underline(v))))
|
|
86
|
+
: (v) => pc.bgYellow(pc.gray(v));
|
|
87
|
+
this.printAt(colorFn(option), {
|
|
88
|
+
x: xStart,
|
|
89
|
+
y: UI_POSITIONS.TUTORIAL_TIP.y,
|
|
90
|
+
});
|
|
91
|
+
const MARGIN = 1;
|
|
92
|
+
xStart += option.length + MARGIN;
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=header.ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"header.ui.js","sourceRoot":"","sources":["../../../../../src/cli/ui/components/header/header.ui.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import type { LoggerService } from '@core/services/logger.service.js';
|
|
2
|
+
import type { IConfig } from '../../../interfaces/config.interface.js';
|
|
3
|
+
import type { ResultsService } from '../../../services/results.service.js';
|
|
4
|
+
import { BaseUi } from '../../base.ui.js';
|
|
5
|
+
export declare class StatsUi extends BaseUi {
|
|
6
|
+
private readonly config;
|
|
7
|
+
private readonly resultsService;
|
|
8
|
+
private readonly logger;
|
|
9
|
+
private lastValues;
|
|
10
|
+
private timeouts;
|
|
11
|
+
private lastResultTypesValues;
|
|
12
|
+
private resultTypesTimeouts;
|
|
13
|
+
constructor(config: IConfig, resultsService: ResultsService, logger: LoggerService);
|
|
14
|
+
reset(): void;
|
|
15
|
+
render(): void;
|
|
16
|
+
/** Print the value of the stat and if it is a different value from the
|
|
17
|
+
* previous run, highlight it for a while.
|
|
18
|
+
*/
|
|
19
|
+
private showStat;
|
|
20
|
+
private showErrorsCount;
|
|
21
|
+
private showActivePreset;
|
|
22
|
+
private showResultsTypesCount;
|
|
23
|
+
private formatResultTypeText;
|
|
24
|
+
private showResultTypeRow;
|
|
25
|
+
}
|
|
@@ -0,0 +1,198 @@
|
|
|
1
|
+
import pc from 'picocolors';
|
|
2
|
+
import { INFO_MSGS, UI_POSITIONS } from '../../../../constants/index.js';
|
|
3
|
+
import { BaseUi } from '../../base.ui.js';
|
|
4
|
+
export class StatsUi extends BaseUi {
|
|
5
|
+
config;
|
|
6
|
+
resultsService;
|
|
7
|
+
logger;
|
|
8
|
+
lastValues = {
|
|
9
|
+
totalSpace: '',
|
|
10
|
+
spaceReleased: '',
|
|
11
|
+
};
|
|
12
|
+
timeouts = {
|
|
13
|
+
totalSpace: setTimeout(() => { }),
|
|
14
|
+
spaceReleased: setTimeout(() => { }),
|
|
15
|
+
};
|
|
16
|
+
lastResultTypesValues = new Map();
|
|
17
|
+
resultTypesTimeouts = new Map();
|
|
18
|
+
constructor(config, resultsService, logger) {
|
|
19
|
+
super();
|
|
20
|
+
this.config = config;
|
|
21
|
+
this.resultsService = resultsService;
|
|
22
|
+
this.logger = logger;
|
|
23
|
+
}
|
|
24
|
+
// Prevent bug where the "Releasable space" and "Saved Space" got o 0.
|
|
25
|
+
reset() {
|
|
26
|
+
this.lastValues = {
|
|
27
|
+
totalSpace: '',
|
|
28
|
+
spaceReleased: '',
|
|
29
|
+
};
|
|
30
|
+
this.lastResultTypesValues.clear();
|
|
31
|
+
}
|
|
32
|
+
render() {
|
|
33
|
+
const { totalSpace, spaceReleased, resultsTypesCount } = this.resultsService.getStats();
|
|
34
|
+
this.showStat({
|
|
35
|
+
description: INFO_MSGS.TOTAL_SPACE,
|
|
36
|
+
value: totalSpace,
|
|
37
|
+
lastValueKey: 'totalSpace',
|
|
38
|
+
position: UI_POSITIONS.TOTAL_SPACE,
|
|
39
|
+
updateColor: 'yellow',
|
|
40
|
+
});
|
|
41
|
+
this.showStat({
|
|
42
|
+
description: INFO_MSGS.SPACE_RELEASED,
|
|
43
|
+
value: spaceReleased,
|
|
44
|
+
lastValueKey: 'spaceReleased',
|
|
45
|
+
position: UI_POSITIONS.SPACE_RELEASED,
|
|
46
|
+
updateColor: 'green',
|
|
47
|
+
});
|
|
48
|
+
if (this.config.showErrors) {
|
|
49
|
+
this.showErrorsCount();
|
|
50
|
+
}
|
|
51
|
+
this.showResultsTypesCount(resultsTypesCount);
|
|
52
|
+
this.showActivePreset();
|
|
53
|
+
}
|
|
54
|
+
/** Print the value of the stat and if it is a different value from the
|
|
55
|
+
* previous run, highlight it for a while.
|
|
56
|
+
*/
|
|
57
|
+
showStat({ description, value, lastValueKey, position, updateColor, }) {
|
|
58
|
+
const statPosition = { ...position };
|
|
59
|
+
statPosition.x += description.length;
|
|
60
|
+
if (value !== this.lastValues[lastValueKey]) {
|
|
61
|
+
// If is first render, initialize.
|
|
62
|
+
if (!this.lastValues[lastValueKey]) {
|
|
63
|
+
this.printAt(value, statPosition);
|
|
64
|
+
this.lastValues[lastValueKey] = value;
|
|
65
|
+
return;
|
|
66
|
+
}
|
|
67
|
+
this.printAt(pc[updateColor](`${value} ▲`), statPosition);
|
|
68
|
+
if (this.timeouts[lastValueKey]) {
|
|
69
|
+
clearTimeout(this.timeouts[lastValueKey]);
|
|
70
|
+
}
|
|
71
|
+
this.timeouts[lastValueKey] = setTimeout(() => {
|
|
72
|
+
this.printAt(`${value} `, statPosition);
|
|
73
|
+
}, 700);
|
|
74
|
+
this.lastValues[lastValueKey] = value;
|
|
75
|
+
}
|
|
76
|
+
else {
|
|
77
|
+
this.printAt(value, statPosition);
|
|
78
|
+
}
|
|
79
|
+
}
|
|
80
|
+
showErrorsCount() {
|
|
81
|
+
const errors = this.logger.get('error').length;
|
|
82
|
+
if (errors === 0) {
|
|
83
|
+
return;
|
|
84
|
+
}
|
|
85
|
+
const text = `${errors} error${errors > 1 ? 's' : ''}. 'e' to see`;
|
|
86
|
+
this.printAt(pc.yellow(text), { ...UI_POSITIONS.ERRORS_COUNT });
|
|
87
|
+
}
|
|
88
|
+
showActivePreset() {
|
|
89
|
+
const MIN_TERMINAL_WIDTH = 94;
|
|
90
|
+
if (this.terminal.columns < MIN_TERMINAL_WIDTH) {
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
const RIGHT_MARGIN = 2;
|
|
94
|
+
const CLEAR_LENGTH = 50;
|
|
95
|
+
const xStartClear = this.terminal.columns - CLEAR_LENGTH - RIGHT_MARGIN;
|
|
96
|
+
const clearText = ' '.repeat(CLEAR_LENGTH);
|
|
97
|
+
this.printAt(clearText, { x: xStartClear, y: 0 });
|
|
98
|
+
if (!this.config.profiles || this.config.profiles.length === 0) {
|
|
99
|
+
return;
|
|
100
|
+
}
|
|
101
|
+
const text = `[${this.config.profiles.join(', ')}]`;
|
|
102
|
+
const xPosition = this.terminal.columns - text.length - RIGHT_MARGIN;
|
|
103
|
+
this.printAt(pc.gray(pc.bold(text)), { x: xPosition, y: 0 });
|
|
104
|
+
}
|
|
105
|
+
showResultsTypesCount(resultsTypesCount) {
|
|
106
|
+
const MAX_CONTENT_LENGTH = 20;
|
|
107
|
+
const RIGHT_MARGIN = 2;
|
|
108
|
+
const MIN_TERMINAL_WIDTH = 94;
|
|
109
|
+
const START_Y = 1;
|
|
110
|
+
const NUM_ROWS = 5;
|
|
111
|
+
if (this.terminal.columns < MIN_TERMINAL_WIDTH) {
|
|
112
|
+
return;
|
|
113
|
+
}
|
|
114
|
+
const clearText = ' '.repeat(MAX_CONTENT_LENGTH);
|
|
115
|
+
const xStart = this.terminal.columns - MAX_CONTENT_LENGTH - RIGHT_MARGIN;
|
|
116
|
+
for (let i = 0; i < NUM_ROWS; i++) {
|
|
117
|
+
const yPos = START_Y + i;
|
|
118
|
+
this.printAt(clearText, { x: xStart, y: yPos });
|
|
119
|
+
}
|
|
120
|
+
const positions = [
|
|
121
|
+
{ key: 'row1', yPosition: 1 },
|
|
122
|
+
{ key: 'row2', yPosition: 2 },
|
|
123
|
+
{ key: 'row3', yPosition: 3 },
|
|
124
|
+
{ key: 'row4', yPosition: 4 },
|
|
125
|
+
{ key: 'row5', yPosition: 5 },
|
|
126
|
+
];
|
|
127
|
+
const maxRows = 5;
|
|
128
|
+
if (resultsTypesCount.length <= maxRows) {
|
|
129
|
+
resultsTypesCount.forEach((item, index) => {
|
|
130
|
+
const { key, yPosition } = positions[index];
|
|
131
|
+
const text = this.formatResultTypeText(item.count, item.type, MAX_CONTENT_LENGTH);
|
|
132
|
+
const xPosition = this.terminal.columns - text.length - RIGHT_MARGIN;
|
|
133
|
+
this.showResultTypeRow(key, text, { x: xPosition, y: yPosition });
|
|
134
|
+
});
|
|
135
|
+
}
|
|
136
|
+
else {
|
|
137
|
+
const topTypes = resultsTypesCount.slice(0, 4);
|
|
138
|
+
const remainingTypes = resultsTypesCount.slice(4);
|
|
139
|
+
topTypes.forEach((item, index) => {
|
|
140
|
+
const { key, yPosition } = positions[index];
|
|
141
|
+
const text = this.formatResultTypeText(item.count, item.type, MAX_CONTENT_LENGTH);
|
|
142
|
+
const xPosition = this.terminal.columns - text.length - RIGHT_MARGIN;
|
|
143
|
+
this.showResultTypeRow(key, text, { x: xPosition, y: yPosition });
|
|
144
|
+
});
|
|
145
|
+
// Show summary in 5th row
|
|
146
|
+
const totalRemaining = remainingTypes.reduce((sum, item) => sum + item.count, 0);
|
|
147
|
+
const { key, yPosition } = positions[4];
|
|
148
|
+
const summaryText = `[+${remainingTypes.length}·total ${totalRemaining}]`;
|
|
149
|
+
const trimmedSummary = summaryText.length > MAX_CONTENT_LENGTH
|
|
150
|
+
? `${summaryText.substring(0, MAX_CONTENT_LENGTH - 3)}...`
|
|
151
|
+
: summaryText;
|
|
152
|
+
const xPosition = this.terminal.columns - trimmedSummary.length - RIGHT_MARGIN;
|
|
153
|
+
this.showResultTypeRow(key, trimmedSummary, {
|
|
154
|
+
x: xPosition,
|
|
155
|
+
y: yPosition,
|
|
156
|
+
});
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
formatResultTypeText(count, type, maxLength) {
|
|
160
|
+
const countStr = count.toString();
|
|
161
|
+
const baseLength = countStr.length + 3; // ' (' and ')'
|
|
162
|
+
const fullText = `${type} (${countStr})`;
|
|
163
|
+
if (fullText.length <= maxLength) {
|
|
164
|
+
return fullText;
|
|
165
|
+
}
|
|
166
|
+
const maxTypeLength = maxLength - baseLength;
|
|
167
|
+
const trimmedType = type.length > maxTypeLength
|
|
168
|
+
? `${type.substring(0, maxTypeLength - 3)}...`
|
|
169
|
+
: type;
|
|
170
|
+
return `${trimmedType} (${countStr})`;
|
|
171
|
+
}
|
|
172
|
+
showResultTypeRow(rowKey, text, position) {
|
|
173
|
+
const lastValue = this.lastResultTypesValues.get(rowKey);
|
|
174
|
+
const valueChanged = text !== lastValue;
|
|
175
|
+
const hasActiveHighlight = this.resultTypesTimeouts.has(rowKey);
|
|
176
|
+
const shouldHighlight = valueChanged && lastValue !== undefined;
|
|
177
|
+
if (shouldHighlight) {
|
|
178
|
+
this.printAt(pc.white(text), { ...position });
|
|
179
|
+
const previousTimeout = this.resultTypesTimeouts.get(rowKey);
|
|
180
|
+
if (previousTimeout) {
|
|
181
|
+
clearTimeout(previousTimeout);
|
|
182
|
+
}
|
|
183
|
+
const timeout = setTimeout(() => {
|
|
184
|
+
this.printAt(pc.gray(text), { ...position });
|
|
185
|
+
this.resultTypesTimeouts.delete(rowKey);
|
|
186
|
+
}, 300);
|
|
187
|
+
this.resultTypesTimeouts.set(rowKey, timeout);
|
|
188
|
+
}
|
|
189
|
+
else if (hasActiveHighlight) {
|
|
190
|
+
this.printAt(pc.white(text), { ...position });
|
|
191
|
+
}
|
|
192
|
+
else {
|
|
193
|
+
this.printAt(pc.gray(text), { ...position });
|
|
194
|
+
}
|
|
195
|
+
this.lastResultTypesValues.set(rowKey, text);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
//# sourceMappingURL=stats.ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"stats.ui.js","sourceRoot":"","sources":["../../../../../src/cli/ui/components/header/stats.ui.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { ScanStatus } from '@core/interfaces/search-status.model.js';
|
|
2
|
+
import type { SpinnerService } from '../../../services/spinner.service.js';
|
|
3
|
+
import { BaseUi } from '../../base.ui.js';
|
|
4
|
+
export declare class StatusUi extends BaseUi {
|
|
5
|
+
private readonly spinnerService;
|
|
6
|
+
private readonly searchStatus;
|
|
7
|
+
private text;
|
|
8
|
+
private barNormalizedWidth;
|
|
9
|
+
private barClosing;
|
|
10
|
+
private showProgressBar;
|
|
11
|
+
private pendingTasksPosition;
|
|
12
|
+
private searchEnd$;
|
|
13
|
+
private readonly SEARCH_STATES;
|
|
14
|
+
constructor(spinnerService: SpinnerService, searchStatus: ScanStatus);
|
|
15
|
+
start(): void;
|
|
16
|
+
reset(): void;
|
|
17
|
+
completeSearch(duration: number): void;
|
|
18
|
+
render(): void;
|
|
19
|
+
private renderPendingTasks;
|
|
20
|
+
private clearPendingTasks;
|
|
21
|
+
private renderProgressBar;
|
|
22
|
+
private activeAnimation;
|
|
23
|
+
private animateProgressBar;
|
|
24
|
+
private animateClose;
|
|
25
|
+
/** When the progress bar disappears, "pending tasks" will move up one
|
|
26
|
+
position. */
|
|
27
|
+
private movePendingTaskToTop;
|
|
28
|
+
private printProgressBar;
|
|
29
|
+
private startingSearch;
|
|
30
|
+
private continueSearching;
|
|
31
|
+
private fatalError;
|
|
32
|
+
private continueFinishing;
|
|
33
|
+
}
|
|
@@ -0,0 +1,188 @@
|
|
|
1
|
+
import pc from 'picocolors';
|
|
2
|
+
import { Subject, interval, takeUntil } from 'rxjs';
|
|
3
|
+
import { UI_POSITIONS } from '../../../../constants/main.constants.js';
|
|
4
|
+
import { INFO_MSGS } from '../../../../constants/messages.constants.js';
|
|
5
|
+
import { SPINNERS, SPINNER_INTERVAL, } from '../../../../constants/spinner.constants.js';
|
|
6
|
+
import { BAR_PARTS, BAR_WIDTH, } from '../../../../constants/status.constants.js';
|
|
7
|
+
import { BaseUi } from '../../base.ui.js';
|
|
8
|
+
export class StatusUi extends BaseUi {
|
|
9
|
+
spinnerService;
|
|
10
|
+
searchStatus;
|
|
11
|
+
text = '';
|
|
12
|
+
barNormalizedWidth = 0;
|
|
13
|
+
barClosing = false;
|
|
14
|
+
showProgressBar = true;
|
|
15
|
+
pendingTasksPosition = { ...UI_POSITIONS.PENDING_TASKS };
|
|
16
|
+
searchEnd$ = new Subject();
|
|
17
|
+
SEARCH_STATES = {
|
|
18
|
+
stopped: () => this.startingSearch(),
|
|
19
|
+
scanning: () => this.continueSearching(),
|
|
20
|
+
dead: () => this.fatalError(),
|
|
21
|
+
finished: () => this.continueFinishing(),
|
|
22
|
+
};
|
|
23
|
+
constructor(spinnerService, searchStatus) {
|
|
24
|
+
super();
|
|
25
|
+
this.spinnerService = spinnerService;
|
|
26
|
+
this.searchStatus = searchStatus;
|
|
27
|
+
}
|
|
28
|
+
start() {
|
|
29
|
+
this.barClosing = false;
|
|
30
|
+
this.showProgressBar = true;
|
|
31
|
+
this.spinnerService.setSpinner(SPINNERS.W10);
|
|
32
|
+
interval(SPINNER_INTERVAL)
|
|
33
|
+
.pipe(takeUntil(this.searchEnd$))
|
|
34
|
+
.subscribe(() => {
|
|
35
|
+
this.SEARCH_STATES[this.searchStatus.workerStatus]();
|
|
36
|
+
});
|
|
37
|
+
this.animateProgressBar();
|
|
38
|
+
}
|
|
39
|
+
reset() {
|
|
40
|
+
this.barClosing = false;
|
|
41
|
+
this.showProgressBar = true;
|
|
42
|
+
this.barNormalizedWidth = 0;
|
|
43
|
+
this.text = '';
|
|
44
|
+
this.pendingTasksPosition = { ...UI_POSITIONS.PENDING_TASKS };
|
|
45
|
+
this.searchEnd$.next(true);
|
|
46
|
+
this.searchEnd$.complete();
|
|
47
|
+
this.searchEnd$ = new Subject();
|
|
48
|
+
if (this.activeAnimation) {
|
|
49
|
+
clearTimeout(this.activeAnimation);
|
|
50
|
+
}
|
|
51
|
+
this.clearPendingTasks();
|
|
52
|
+
this.render();
|
|
53
|
+
}
|
|
54
|
+
completeSearch(duration) {
|
|
55
|
+
this.searchEnd$.next(true);
|
|
56
|
+
this.searchEnd$.complete();
|
|
57
|
+
this.text = pc.green(INFO_MSGS.SEARCH_COMPLETED) + pc.gray(`${duration}s`);
|
|
58
|
+
this.render();
|
|
59
|
+
if (this.activeAnimation) {
|
|
60
|
+
clearTimeout(this.activeAnimation);
|
|
61
|
+
}
|
|
62
|
+
this.activeAnimation = setTimeout(() => this.animateClose(), 2000);
|
|
63
|
+
}
|
|
64
|
+
render() {
|
|
65
|
+
this.printAt(`${this.text} `, UI_POSITIONS.STATUS);
|
|
66
|
+
if (this.showProgressBar) {
|
|
67
|
+
this.renderProgressBar();
|
|
68
|
+
}
|
|
69
|
+
this.renderPendingTasks();
|
|
70
|
+
}
|
|
71
|
+
renderPendingTasks() {
|
|
72
|
+
this.clearPendingTasks();
|
|
73
|
+
if (this.searchStatus.pendingDeletions === 0) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const { pendingDeletions } = this.searchStatus;
|
|
77
|
+
const text = pendingDeletions > 1 ? 'pending tasks' : 'pending task ';
|
|
78
|
+
this.printAt(pc.yellow(`${pendingDeletions} ${text}`), this.pendingTasksPosition);
|
|
79
|
+
}
|
|
80
|
+
clearPendingTasks() {
|
|
81
|
+
const PENDING_TASK_LENGHT = 17;
|
|
82
|
+
this.printAt(' '.repeat(PENDING_TASK_LENGHT), this.pendingTasksPosition);
|
|
83
|
+
}
|
|
84
|
+
renderProgressBar() {
|
|
85
|
+
const { pendingSearchTasks, completedSearchTasks, completedStatsCalculation, pendingStatsCalculation, } = this.searchStatus;
|
|
86
|
+
const proportional = (a, b, c) => {
|
|
87
|
+
if (c === 0) {
|
|
88
|
+
return 0;
|
|
89
|
+
}
|
|
90
|
+
return (a * b) / c;
|
|
91
|
+
};
|
|
92
|
+
const modifier = this.barNormalizedWidth === 1
|
|
93
|
+
? 1
|
|
94
|
+
: // easeInOut formula
|
|
95
|
+
-(Math.cos(Math.PI * this.barNormalizedWidth) - 1) / 2;
|
|
96
|
+
const barSearchMax = pendingSearchTasks + completedSearchTasks;
|
|
97
|
+
const barStatsMax = pendingStatsCalculation + completedStatsCalculation;
|
|
98
|
+
let barLenght = Math.ceil(BAR_WIDTH * modifier);
|
|
99
|
+
let searchBarLenght = proportional(completedSearchTasks, BAR_WIDTH, barSearchMax);
|
|
100
|
+
searchBarLenght = Math.ceil(searchBarLenght * modifier);
|
|
101
|
+
let doneBarLenght = proportional(completedStatsCalculation, searchBarLenght, barStatsMax);
|
|
102
|
+
doneBarLenght = Math.floor(doneBarLenght * modifier);
|
|
103
|
+
barLenght -= searchBarLenght;
|
|
104
|
+
searchBarLenght -= doneBarLenght;
|
|
105
|
+
barLenght = Math.max(0, barLenght);
|
|
106
|
+
searchBarLenght = Math.max(0, searchBarLenght);
|
|
107
|
+
doneBarLenght = Math.max(0, doneBarLenght);
|
|
108
|
+
// Debug
|
|
109
|
+
// this.printAt(
|
|
110
|
+
// `V: ${barSearchMax},T: ${barLenght},C: ${searchBarLenght},D:${doneBarLenght} `,
|
|
111
|
+
// { x: 60, y: 5 },
|
|
112
|
+
// );
|
|
113
|
+
const progressBar = BAR_PARTS.completed.repeat(doneBarLenght) +
|
|
114
|
+
BAR_PARTS.searchTask.repeat(searchBarLenght) +
|
|
115
|
+
BAR_PARTS.bg.repeat(barLenght);
|
|
116
|
+
this.printProgressBar(progressBar);
|
|
117
|
+
}
|
|
118
|
+
activeAnimation = null;
|
|
119
|
+
animateProgressBar() {
|
|
120
|
+
if (this.barNormalizedWidth > 1) {
|
|
121
|
+
this.barNormalizedWidth = 1;
|
|
122
|
+
return;
|
|
123
|
+
}
|
|
124
|
+
this.barNormalizedWidth += 0.05;
|
|
125
|
+
this.renderProgressBar();
|
|
126
|
+
if (this.activeAnimation) {
|
|
127
|
+
clearTimeout(this.activeAnimation);
|
|
128
|
+
}
|
|
129
|
+
this.activeAnimation = setTimeout(() => this.animateProgressBar(), SPINNER_INTERVAL);
|
|
130
|
+
}
|
|
131
|
+
animateClose() {
|
|
132
|
+
this.barClosing = true;
|
|
133
|
+
if (this.barNormalizedWidth < 0) {
|
|
134
|
+
this.barNormalizedWidth = 0;
|
|
135
|
+
this.showProgressBar = false;
|
|
136
|
+
this.movePendingTaskToTop();
|
|
137
|
+
return;
|
|
138
|
+
}
|
|
139
|
+
this.barNormalizedWidth -= 0.05;
|
|
140
|
+
this.renderProgressBar();
|
|
141
|
+
if (this.activeAnimation) {
|
|
142
|
+
clearTimeout(this.activeAnimation);
|
|
143
|
+
}
|
|
144
|
+
this.activeAnimation = setTimeout(() => this.animateClose(), SPINNER_INTERVAL);
|
|
145
|
+
}
|
|
146
|
+
/** When the progress bar disappears, "pending tasks" will move up one
|
|
147
|
+
position. */
|
|
148
|
+
movePendingTaskToTop() {
|
|
149
|
+
this.clearPendingTasks();
|
|
150
|
+
this.pendingTasksPosition = { ...UI_POSITIONS.STATUS_BAR };
|
|
151
|
+
this.renderPendingTasks();
|
|
152
|
+
}
|
|
153
|
+
printProgressBar(progressBar) {
|
|
154
|
+
if (this.barClosing) {
|
|
155
|
+
const postX = UI_POSITIONS.STATUS_BAR.x -
|
|
156
|
+
1 +
|
|
157
|
+
Math.round((BAR_WIDTH / 2) * (1 - this.barNormalizedWidth));
|
|
158
|
+
// Clear previus bar
|
|
159
|
+
this.printAt(' '.repeat(BAR_WIDTH), UI_POSITIONS.STATUS_BAR);
|
|
160
|
+
this.printAt(progressBar, {
|
|
161
|
+
x: postX,
|
|
162
|
+
y: UI_POSITIONS.STATUS_BAR.y,
|
|
163
|
+
});
|
|
164
|
+
}
|
|
165
|
+
else {
|
|
166
|
+
this.printAt(progressBar, UI_POSITIONS.STATUS_BAR);
|
|
167
|
+
}
|
|
168
|
+
}
|
|
169
|
+
startingSearch() {
|
|
170
|
+
this.text = INFO_MSGS.STARTING;
|
|
171
|
+
this.render();
|
|
172
|
+
}
|
|
173
|
+
continueSearching() {
|
|
174
|
+
this.text = INFO_MSGS.SEARCHING + this.spinnerService.nextFrame();
|
|
175
|
+
this.render();
|
|
176
|
+
}
|
|
177
|
+
fatalError() {
|
|
178
|
+
this.text = pc.red(INFO_MSGS.FATAL_ERROR);
|
|
179
|
+
this.searchEnd$.next(true);
|
|
180
|
+
this.searchEnd$.complete();
|
|
181
|
+
this.render();
|
|
182
|
+
}
|
|
183
|
+
continueFinishing() {
|
|
184
|
+
this.text = INFO_MSGS.CALCULATING_STATS + this.spinnerService.nextFrame();
|
|
185
|
+
this.render();
|
|
186
|
+
}
|
|
187
|
+
}
|
|
188
|
+
//# sourceMappingURL=status.ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"status.ui.js","sourceRoot":"","sources":["../../../../../src/cli/ui/components/header/status.ui.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import type { ConsoleService } from '../../../services/console.service.js';
|
|
2
|
+
import { BaseUi } from '../../base.ui.js';
|
|
3
|
+
export declare class HelpCommandUi extends BaseUi {
|
|
4
|
+
private readonly consoleService;
|
|
5
|
+
constructor(consoleService: ConsoleService);
|
|
6
|
+
render(): void;
|
|
7
|
+
show(): void;
|
|
8
|
+
clear(): void;
|
|
9
|
+
}
|
|
@@ -0,0 +1,61 @@
|
|
|
1
|
+
import pc from 'picocolors';
|
|
2
|
+
import { HELP_FOOTER, HELP_HEADER, HELP_PROGRESSBAR, OPTIONS, } from '../../../../constants/cli.constants.js';
|
|
3
|
+
import { MARGINS, UI_HELP } from '../../../../constants/main.constants.js';
|
|
4
|
+
import { INFO_MSGS } from '../../../../constants/messages.constants.js';
|
|
5
|
+
import { BaseUi } from '../../base.ui.js';
|
|
6
|
+
export class HelpCommandUi extends BaseUi {
|
|
7
|
+
consoleService;
|
|
8
|
+
constructor(consoleService) {
|
|
9
|
+
super();
|
|
10
|
+
this.consoleService = consoleService;
|
|
11
|
+
}
|
|
12
|
+
render() {
|
|
13
|
+
throw new Error('Method not implemented.');
|
|
14
|
+
}
|
|
15
|
+
show() {
|
|
16
|
+
const maxWidth = Math.min(UI_HELP.MAX_WIDTH, this.terminal.columns);
|
|
17
|
+
this.clear();
|
|
18
|
+
this.print(pc.inverse(pc.bold(`${INFO_MSGS.HELP_TITLE}\n`)));
|
|
19
|
+
const headerLines = this.consoleService.splitWordsByWidth(HELP_HEADER, maxWidth);
|
|
20
|
+
headerLines.forEach((line) => this.print(`${line}\n`));
|
|
21
|
+
this.print('\n');
|
|
22
|
+
const progressBarLines = this.consoleService.splitWordsByWidth(HELP_PROGRESSBAR, maxWidth);
|
|
23
|
+
progressBarLines.forEach((line) => this.print(`${line}\n`));
|
|
24
|
+
this.print('\n');
|
|
25
|
+
const maxDescriptionWidth = Math.min(maxWidth - UI_HELP.X_DESCRIPTION_OFFSET, this.terminal.columns - UI_HELP.X_DESCRIPTION_OFFSET);
|
|
26
|
+
this.print(`${pc.black(pc.bgYellow(pc.bold(' Options ')))}\n`);
|
|
27
|
+
OPTIONS.forEach((option) => {
|
|
28
|
+
const args = option.arg.reduce((text, arg) => `${text}, ${arg}`);
|
|
29
|
+
const padding = ' '.repeat(UI_HELP.X_COMMAND_OFFSET);
|
|
30
|
+
const commandLength = UI_HELP.X_COMMAND_OFFSET + args.length;
|
|
31
|
+
const commandTooLong = commandLength >= UI_HELP.X_DESCRIPTION_OFFSET;
|
|
32
|
+
if (commandTooLong) {
|
|
33
|
+
this.print(`${padding + args}\n`);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
this.print(padding + args);
|
|
37
|
+
}
|
|
38
|
+
const description = this.consoleService.splitWordsByWidth(option.description, maxDescriptionWidth);
|
|
39
|
+
description.forEach((line, index) => {
|
|
40
|
+
if (index === 0 && !commandTooLong) {
|
|
41
|
+
const spaceBetween = ' '.repeat(UI_HELP.X_DESCRIPTION_OFFSET - commandLength);
|
|
42
|
+
this.print(`${spaceBetween + line}\n`);
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
const descriptionPadding = ' '.repeat(UI_HELP.X_DESCRIPTION_OFFSET);
|
|
46
|
+
this.print(`${descriptionPadding + line}\n`);
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
this.print('\n');
|
|
50
|
+
});
|
|
51
|
+
this.print('\n');
|
|
52
|
+
const footerLines = this.consoleService.splitWordsByWidth(HELP_FOOTER, maxWidth);
|
|
53
|
+
footerLines.forEach((line) => this.print(`${line}\n`));
|
|
54
|
+
}
|
|
55
|
+
clear() {
|
|
56
|
+
for (let row = MARGINS.ROW_RESULTS_START; row < this.terminal.rows; row++) {
|
|
57
|
+
this.clearLine(row);
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
//# sourceMappingURL=help-command.ui.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"help-command.ui.js","sourceRoot":"","sources":["../../../../../src/cli/ui/components/help/help-command.ui.ts"],"names":[],"mappings":"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"}
|