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.
Files changed (274) hide show
  1. package/LICENSE +21 -0
  2. package/README.es.md +253 -0
  3. package/README.id.md +238 -0
  4. package/README.md +377 -0
  5. package/README.pt.md +241 -0
  6. package/README.tr.md +242 -0
  7. package/lib/cli/cli.controller.d.ts +81 -0
  8. package/lib/cli/cli.controller.js +760 -0
  9. package/lib/cli/cli.controller.js.map +1 -0
  10. package/lib/cli/interfaces/cli-options.interface.d.ts +5 -0
  11. package/lib/cli/interfaces/cli-options.interface.js +2 -0
  12. package/lib/cli/interfaces/cli-options.interface.js.map +1 -0
  13. package/lib/cli/interfaces/command-keys.interface.d.ts +17 -0
  14. package/lib/cli/interfaces/command-keys.interface.js +2 -0
  15. package/lib/cli/interfaces/command-keys.interface.js.map +1 -0
  16. package/lib/cli/interfaces/config.interface.d.ts +17 -0
  17. package/lib/cli/interfaces/config.interface.js +2 -0
  18. package/lib/cli/interfaces/config.interface.js.map +1 -0
  19. package/lib/cli/interfaces/index.d.ts +11 -0
  20. package/lib/cli/interfaces/index.js +12 -0
  21. package/lib/cli/interfaces/index.js.map +1 -0
  22. package/lib/cli/interfaces/json-output.interface.d.ts +30 -0
  23. package/lib/cli/interfaces/json-output.interface.js +2 -0
  24. package/lib/cli/interfaces/json-output.interface.js.map +1 -0
  25. package/lib/cli/interfaces/key-press.interface.d.ts +7 -0
  26. package/lib/cli/interfaces/key-press.interface.js +2 -0
  27. package/lib/cli/interfaces/key-press.interface.js.map +1 -0
  28. package/lib/cli/interfaces/node-version.interface.d.ts +5 -0
  29. package/lib/cli/interfaces/node-version.interface.js +2 -0
  30. package/lib/cli/interfaces/node-version.interface.js.map +1 -0
  31. package/lib/cli/interfaces/stats.interface.d.ts +15 -0
  32. package/lib/cli/interfaces/stats.interface.js +2 -0
  33. package/lib/cli/interfaces/stats.interface.js.map +1 -0
  34. package/lib/cli/interfaces/ui-positions.interface.d.ts +5 -0
  35. package/lib/cli/interfaces/ui-positions.interface.js +2 -0
  36. package/lib/cli/interfaces/ui-positions.interface.js.map +1 -0
  37. package/lib/cli/interfaces/version.interface.d.ts +5 -0
  38. package/lib/cli/interfaces/version.interface.js +2 -0
  39. package/lib/cli/interfaces/version.interface.js.map +1 -0
  40. package/lib/cli/models/start-parameters.model.d.ts +7 -0
  41. package/lib/cli/models/start-parameters.model.js +25 -0
  42. package/lib/cli/models/start-parameters.model.js.map +1 -0
  43. package/lib/cli/services/console.service.d.ts +23 -0
  44. package/lib/cli/services/console.service.js +87 -0
  45. package/lib/cli/services/console.service.js.map +1 -0
  46. package/lib/cli/services/https.service.d.ts +4 -0
  47. package/lib/cli/services/https.service.js +32 -0
  48. package/lib/cli/services/https.service.js.map +1 -0
  49. package/lib/cli/services/index.d.ts +7 -0
  50. package/lib/cli/services/index.js +8 -0
  51. package/lib/cli/services/index.js.map +1 -0
  52. package/lib/cli/services/json-output.service.d.ts +20 -0
  53. package/lib/cli/services/json-output.service.js +101 -0
  54. package/lib/cli/services/json-output.service.js.map +1 -0
  55. package/lib/cli/services/results.service.d.ts +13 -0
  56. package/lib/cli/services/results.service.js +61 -0
  57. package/lib/cli/services/results.service.js.map +1 -0
  58. package/lib/cli/services/scan.service.d.ts +13 -0
  59. package/lib/cli/services/scan.service.js +79 -0
  60. package/lib/cli/services/scan.service.js.map +1 -0
  61. package/lib/cli/services/spinner.service.d.ts +9 -0
  62. package/lib/cli/services/spinner.service.js +27 -0
  63. package/lib/cli/services/spinner.service.js.map +1 -0
  64. package/lib/cli/services/ui.service.d.ts +17 -0
  65. package/lib/cli/services/ui.service.js +59 -0
  66. package/lib/cli/services/ui.service.js.map +1 -0
  67. package/lib/cli/services/update.service.d.ts +15 -0
  68. package/lib/cli/services/update.service.js +37 -0
  69. package/lib/cli/services/update.service.js.map +1 -0
  70. package/lib/cli/ui/base.ui.d.ts +28 -0
  71. package/lib/cli/ui/base.ui.js +49 -0
  72. package/lib/cli/ui/base.ui.js.map +1 -0
  73. package/lib/cli/ui/components/general.ui.d.ts +7 -0
  74. package/lib/cli/ui/components/general.ui.js +13 -0
  75. package/lib/cli/ui/components/general.ui.js.map +1 -0
  76. package/lib/cli/ui/components/header/header-ui.constants.d.ts +7 -0
  77. package/lib/cli/ui/components/header/header-ui.constants.js +7 -0
  78. package/lib/cli/ui/components/header/header-ui.constants.js.map +1 -0
  79. package/lib/cli/ui/components/header/header.ui.d.ts +18 -0
  80. package/lib/cli/ui/components/header/header.ui.js +96 -0
  81. package/lib/cli/ui/components/header/header.ui.js.map +1 -0
  82. package/lib/cli/ui/components/header/stats.ui.d.ts +25 -0
  83. package/lib/cli/ui/components/header/stats.ui.js +198 -0
  84. package/lib/cli/ui/components/header/stats.ui.js.map +1 -0
  85. package/lib/cli/ui/components/header/status.ui.d.ts +33 -0
  86. package/lib/cli/ui/components/header/status.ui.js +188 -0
  87. package/lib/cli/ui/components/header/status.ui.js.map +1 -0
  88. package/lib/cli/ui/components/help/help-command.ui.d.ts +9 -0
  89. package/lib/cli/ui/components/help/help-command.ui.js +61 -0
  90. package/lib/cli/ui/components/help/help-command.ui.js.map +1 -0
  91. package/lib/cli/ui/components/help/help.constants.d.ts +8 -0
  92. package/lib/cli/ui/components/help/help.constants.js +270 -0
  93. package/lib/cli/ui/components/help/help.constants.js.map +1 -0
  94. package/lib/cli/ui/components/help/help.ui.d.ts +30 -0
  95. package/lib/cli/ui/components/help/help.ui.js +176 -0
  96. package/lib/cli/ui/components/help/help.ui.js.map +1 -0
  97. package/lib/cli/ui/components/logs.ui.d.ts +24 -0
  98. package/lib/cli/ui/components/logs.ui.js +132 -0
  99. package/lib/cli/ui/components/logs.ui.js.map +1 -0
  100. package/lib/cli/ui/components/options.ui.d.ts +29 -0
  101. package/lib/cli/ui/components/options.ui.js +327 -0
  102. package/lib/cli/ui/components/options.ui.js.map +1 -0
  103. package/lib/cli/ui/components/profile-picker.ui.d.ts +25 -0
  104. package/lib/cli/ui/components/profile-picker.ui.js +117 -0
  105. package/lib/cli/ui/components/profile-picker.ui.js.map +1 -0
  106. package/lib/cli/ui/components/result-details.ui.d.ts +23 -0
  107. package/lib/cli/ui/components/result-details.ui.js +182 -0
  108. package/lib/cli/ui/components/result-details.ui.js.map +1 -0
  109. package/lib/cli/ui/components/results.ui.d.ts +86 -0
  110. package/lib/cli/ui/components/results.ui.js +620 -0
  111. package/lib/cli/ui/components/results.ui.js.map +1 -0
  112. package/lib/cli/ui/components/warning.ui.d.ts +12 -0
  113. package/lib/cli/ui/components/warning.ui.js +30 -0
  114. package/lib/cli/ui/components/warning.ui.js.map +1 -0
  115. package/lib/cli/ui/heavy.ui.d.ts +18 -0
  116. package/lib/cli/ui/heavy.ui.js +37 -0
  117. package/lib/cli/ui/heavy.ui.js.map +1 -0
  118. package/lib/cli/ui/index.d.ts +14 -0
  119. package/lib/cli/ui/index.js +15 -0
  120. package/lib/cli/ui/index.js.map +1 -0
  121. package/lib/constants/cli.constants.d.ts +14 -0
  122. package/lib/constants/cli.constants.js +138 -0
  123. package/lib/constants/cli.constants.js.map +1 -0
  124. package/lib/constants/index.d.ts +8 -0
  125. package/lib/constants/index.js +9 -0
  126. package/lib/constants/index.js.map +1 -0
  127. package/lib/constants/main.constants.d.ts +96 -0
  128. package/lib/constants/main.constants.js +79 -0
  129. package/lib/constants/main.constants.js.map +1 -0
  130. package/lib/constants/messages.constants.d.ts +31 -0
  131. package/lib/constants/messages.constants.js +37 -0
  132. package/lib/constants/messages.constants.js.map +1 -0
  133. package/lib/constants/options.constants.d.ts +6 -0
  134. package/lib/constants/options.constants.js +8 -0
  135. package/lib/constants/options.constants.js.map +1 -0
  136. package/lib/constants/os-service-map.constants.d.ts +10 -0
  137. package/lib/constants/os-service-map.constants.js +11 -0
  138. package/lib/constants/os-service-map.constants.js.map +1 -0
  139. package/lib/constants/result-descriptions.constants.d.ts +142 -0
  140. package/lib/constants/result-descriptions.constants.js +203 -0
  141. package/lib/constants/result-descriptions.constants.js.map +1 -0
  142. package/lib/constants/sort.result.d.ts +6 -0
  143. package/lib/constants/sort.result.js +22 -0
  144. package/lib/constants/sort.result.js.map +1 -0
  145. package/lib/constants/spinner.constants.d.ts +5 -0
  146. package/lib/constants/spinner.constants.js +88 -0
  147. package/lib/constants/spinner.constants.js.map +1 -0
  148. package/lib/constants/status.constants.d.ts +7 -0
  149. package/lib/constants/status.constants.js +9 -0
  150. package/lib/constants/status.constants.js.map +1 -0
  151. package/lib/constants/update.constants.d.ts +2 -0
  152. package/lib/constants/update.constants.js +3 -0
  153. package/lib/constants/update.constants.js.map +1 -0
  154. package/lib/constants/workers.constants.d.ts +14 -0
  155. package/lib/constants/workers.constants.js +16 -0
  156. package/lib/constants/workers.constants.js.map +1 -0
  157. package/lib/core/constants/global-ignored.constants.d.ts +1 -0
  158. package/lib/core/constants/global-ignored.constants.js +44 -0
  159. package/lib/core/constants/global-ignored.constants.js.map +1 -0
  160. package/lib/core/constants/index.d.ts +1 -0
  161. package/lib/core/constants/index.js +2 -0
  162. package/lib/core/constants/index.js.map +1 -0
  163. package/lib/core/constants/profiles.constants.d.ts +8 -0
  164. package/lib/core/constants/profiles.constants.js +138 -0
  165. package/lib/core/constants/profiles.constants.js.map +1 -0
  166. package/lib/core/devkill.d.ts +25 -0
  167. package/lib/core/devkill.js +129 -0
  168. package/lib/core/devkill.js.map +1 -0
  169. package/lib/core/index.d.ts +4 -0
  170. package/lib/core/index.js +5 -0
  171. package/lib/core/index.js.map +1 -0
  172. package/lib/core/interfaces/devkill.interface.d.ts +78 -0
  173. package/lib/core/interfaces/devkill.interface.js +2 -0
  174. package/lib/core/interfaces/devkill.interface.js.map +1 -0
  175. package/lib/core/interfaces/devkillrc-config.interface.d.ts +87 -0
  176. package/lib/core/interfaces/devkillrc-config.interface.js +12 -0
  177. package/lib/core/interfaces/devkillrc-config.interface.js.map +1 -0
  178. package/lib/core/interfaces/file-service.interface.d.ts +76 -0
  179. package/lib/core/interfaces/file-service.interface.js +2 -0
  180. package/lib/core/interfaces/file-service.interface.js.map +1 -0
  181. package/lib/core/interfaces/folder.interface.d.ts +89 -0
  182. package/lib/core/interfaces/folder.interface.js +2 -0
  183. package/lib/core/interfaces/folder.interface.js.map +1 -0
  184. package/lib/core/interfaces/index.d.ts +6 -0
  185. package/lib/core/interfaces/index.js +7 -0
  186. package/lib/core/interfaces/index.js.map +1 -0
  187. package/lib/core/interfaces/logger-service.interface.d.ts +59 -0
  188. package/lib/core/interfaces/logger-service.interface.js +2 -0
  189. package/lib/core/interfaces/logger-service.interface.js.map +1 -0
  190. package/lib/core/interfaces/npkill.interface.d.ts +78 -0
  191. package/lib/core/interfaces/npkill.interface.js +2 -0
  192. package/lib/core/interfaces/npkill.interface.js.map +1 -0
  193. package/lib/core/interfaces/npkillrc-config.interface.d.ts +87 -0
  194. package/lib/core/interfaces/npkillrc-config.interface.js +12 -0
  195. package/lib/core/interfaces/npkillrc-config.interface.js.map +1 -0
  196. package/lib/core/interfaces/profile.interface.d.ts +9 -0
  197. package/lib/core/interfaces/profile.interface.js +2 -0
  198. package/lib/core/interfaces/profile.interface.js.map +1 -0
  199. package/lib/core/interfaces/search-status.model.d.ts +35 -0
  200. package/lib/core/interfaces/search-status.model.js +48 -0
  201. package/lib/core/interfaces/search-status.model.js.map +1 -0
  202. package/lib/core/interfaces/services.interface.d.ts +26 -0
  203. package/lib/core/interfaces/services.interface.js +2 -0
  204. package/lib/core/interfaces/services.interface.js.map +1 -0
  205. package/lib/core/npkill.d.ts +25 -0
  206. package/lib/core/npkill.js +129 -0
  207. package/lib/core/npkill.js.map +1 -0
  208. package/lib/core/services/config/config-merger.d.ts +17 -0
  209. package/lib/core/services/config/config-merger.js +57 -0
  210. package/lib/core/services/config/config-merger.js.map +1 -0
  211. package/lib/core/services/config/config-validator.d.ts +3 -0
  212. package/lib/core/services/config/config-validator.js +43 -0
  213. package/lib/core/services/config/config-validator.js.map +1 -0
  214. package/lib/core/services/config/index.d.ts +4 -0
  215. package/lib/core/services/config/index.js +5 -0
  216. package/lib/core/services/config/index.js.map +1 -0
  217. package/lib/core/services/config/profile-validator.d.ts +6 -0
  218. package/lib/core/services/config/profile-validator.js +68 -0
  219. package/lib/core/services/config/profile-validator.js.map +1 -0
  220. package/lib/core/services/config/property-validators.d.ts +33 -0
  221. package/lib/core/services/config/property-validators.js +125 -0
  222. package/lib/core/services/config/property-validators.js.map +1 -0
  223. package/lib/core/services/config.service.d.ts +37 -0
  224. package/lib/core/services/config.service.js +100 -0
  225. package/lib/core/services/config.service.js.map +1 -0
  226. package/lib/core/services/files/files.service.d.ts +28 -0
  227. package/lib/core/services/files/files.service.js +207 -0
  228. package/lib/core/services/files/files.service.js.map +1 -0
  229. package/lib/core/services/files/files.worker.d.ts +1 -0
  230. package/lib/core/services/files/files.worker.js +286 -0
  231. package/lib/core/services/files/files.worker.js.map +1 -0
  232. package/lib/core/services/files/files.worker.service.d.ts +90 -0
  233. package/lib/core/services/files/files.worker.service.js +216 -0
  234. package/lib/core/services/files/files.worker.service.js.map +1 -0
  235. package/lib/core/services/files/index.d.ts +4 -0
  236. package/lib/core/services/files/index.js +5 -0
  237. package/lib/core/services/files/index.js.map +1 -0
  238. package/lib/core/services/files/unix-files.service.d.ts +9 -0
  239. package/lib/core/services/files/unix-files.service.js +28 -0
  240. package/lib/core/services/files/unix-files.service.js.map +1 -0
  241. package/lib/core/services/files/windows-files.service.d.ts +9 -0
  242. package/lib/core/services/files/windows-files.service.js +16 -0
  243. package/lib/core/services/files/windows-files.service.js.map +1 -0
  244. package/lib/core/services/index.d.ts +5 -0
  245. package/lib/core/services/index.js +6 -0
  246. package/lib/core/services/index.js.map +1 -0
  247. package/lib/core/services/logger.service.d.ts +22 -0
  248. package/lib/core/services/logger.service.js +84 -0
  249. package/lib/core/services/logger.service.js.map +1 -0
  250. package/lib/core/services/profiles.service.d.ts +54 -0
  251. package/lib/core/services/profiles.service.js +86 -0
  252. package/lib/core/services/profiles.service.js.map +1 -0
  253. package/lib/core/services/stream.service.d.ts +12 -0
  254. package/lib/core/services/stream.service.js +39 -0
  255. package/lib/core/services/stream.service.js.map +1 -0
  256. package/lib/dirname.d.ts +2 -0
  257. package/lib/dirname.js +6 -0
  258. package/lib/dirname.js.map +1 -0
  259. package/lib/index.d.ts +2 -0
  260. package/lib/index.js +11 -0
  261. package/lib/index.js.map +1 -0
  262. package/lib/main.d.ts +2 -0
  263. package/lib/main.js +19 -0
  264. package/lib/main.js.map +1 -0
  265. package/lib/utils/get-file-content.d.ts +1 -0
  266. package/lib/utils/get-file-content.js +6 -0
  267. package/lib/utils/get-file-content.js.map +1 -0
  268. package/lib/utils/is-safe-to-delete.d.ts +1 -0
  269. package/lib/utils/is-safe-to-delete.js +9 -0
  270. package/lib/utils/is-safe-to-delete.js.map +1 -0
  271. package/lib/utils/unit-conversions.d.ts +11 -0
  272. package/lib/utils/unit-conversions.js +54 -0
  273. package/lib/utils/unit-conversions.js.map +1 -0
  274. 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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"}