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,129 @@
1
+ import { FileWorkerService } from './services/files/index.js';
2
+ import { from } from 'rxjs';
3
+ import { catchError, filter, map, mergeMap, take, tap } from 'rxjs/operators';
4
+ import { ScanStatus } from './interfaces/search-status.model.js';
5
+ import _dirname from '../dirname.js';
6
+ import { LoggerService } from './services/logger.service.js';
7
+ import { StreamService } from './services/stream.service.js';
8
+ import { ProfilesService } from './services/profiles.service.js';
9
+ import { OSServiceMap } from '../constants/os-service-map.constants.js';
10
+ import { getFileContent } from '../utils/get-file-content.js';
11
+ import { ResultsService } from '../cli/services/results.service.js';
12
+ /**
13
+ * Main npkill class that implements the core directory scanning and cleanup functionality.
14
+ * Provides methods for recursive directory scanning, size calculation, file analysis,
15
+ * and safe deletion operations.
16
+ */
17
+ export class Npkill {
18
+ services;
19
+ constructor(customServices) {
20
+ const defaultServices = createDefaultServices(customServices?.searchStatus, customServices?.logger);
21
+ this.services = { ...defaultServices, ...customServices };
22
+ this.logger.info(process.argv.join(' '));
23
+ this.logger.info(`Npkill started! v${this.getVersion()}`);
24
+ }
25
+ searchDuration = 0;
26
+ startScan$(rootPath, options) {
27
+ const { fileService } = this.services;
28
+ this.logger.info(`Scan started in ${rootPath}`);
29
+ const startTime = Date.now();
30
+ return fileService.listDir(rootPath, options).pipe(catchError(() => {
31
+ throw new Error('Error while listing directories');
32
+ }), mergeMap((dataFolder) => from(splitData(dataFolder))), filter((path) => path !== ''), map((path) => {
33
+ if (options.performRiskAnalysis !== undefined &&
34
+ !options.performRiskAnalysis) {
35
+ return { path };
36
+ }
37
+ const riskAnalysis = fileService.isDangerous(path);
38
+ return {
39
+ path,
40
+ riskAnalysis,
41
+ };
42
+ }), tap((nodeFolder) => this.logger.info(`Folder found: ${String(nodeFolder.path)}`)), tap({
43
+ complete: () => {
44
+ this.searchDuration = (Date.now() - startTime) / 1000;
45
+ this.logger.info(`Search completed after ${this.searchDuration}s`);
46
+ },
47
+ }));
48
+ }
49
+ getSize$(path) {
50
+ const { fileService } = this.services;
51
+ this.logger.info(`Calculating folder size for ${String(path)}`);
52
+ return fileService.getFolderSize(path).pipe(take(1), map((size) => ({ size, unit: 'bytes' })), tap(({ size }) => this.logger.info(`Size of ${path}: ${size} bytes`)));
53
+ }
54
+ getNewestFile$(path) {
55
+ const { fileService } = this.services;
56
+ this.logger.info(`Calculating last mod. of ${path}`);
57
+ return from(fileService.getRecentModificationInDir(path)).pipe(tap((result) => {
58
+ if (!result) {
59
+ return;
60
+ }
61
+ this.logger.info(`Last mod. of ${path}: ${result.timestamp}`);
62
+ }));
63
+ }
64
+ delete$(path, options) {
65
+ const { fileService } = this.services;
66
+ this.logger.info(`Deleting ${String(path)} ${options?.dryRun ? '(dry run)' : ''}...`);
67
+ const deleteOperation = options?.dryRun
68
+ ? from(fileService.fakeDeleteDir())
69
+ : from(fileService.deleteDir(path));
70
+ return deleteOperation.pipe(map((result) => {
71
+ if (!result) {
72
+ this.logger.error(`Failed to delete ${String(path)}`);
73
+ return { path, success: false };
74
+ }
75
+ this.logger.info(`Deleted ${String(path)}: ${result}`);
76
+ return {
77
+ path,
78
+ success: result,
79
+ };
80
+ }));
81
+ }
82
+ getLogs$() {
83
+ return this.services.logger.getLog$();
84
+ }
85
+ stopScan() {
86
+ this.logger.info('Stopping scan...');
87
+ this.services.fileService.stopScan();
88
+ }
89
+ isValidRootFolder(path) {
90
+ return this.services.fileService.isValidRootFolder(path);
91
+ }
92
+ getVersion() {
93
+ const packageJson = _dirname + '/../package.json';
94
+ const packageData = JSON.parse(getFileContent(packageJson));
95
+ return packageData.version;
96
+ }
97
+ get logger() {
98
+ return this.services.logger;
99
+ }
100
+ }
101
+ function createDefaultServices(searchStatus, logger) {
102
+ const actualLogger = logger || new LoggerService();
103
+ const actualSearchStatus = searchStatus || new ScanStatus();
104
+ const fileWorkerService = new FileWorkerService(actualLogger, actualSearchStatus);
105
+ const streamService = new StreamService();
106
+ const resultsService = new ResultsService();
107
+ const profilesService = new ProfilesService();
108
+ const OSService = OSServiceMap[process.platform];
109
+ if (typeof OSService === 'undefined') {
110
+ throw new Error(`Unsupported platform: ${process.platform}. Cannot load OS service.`);
111
+ }
112
+ const fileService = new OSService(streamService, fileWorkerService);
113
+ return {
114
+ logger: actualLogger,
115
+ searchStatus: actualSearchStatus,
116
+ fileService,
117
+ fileWorkerService,
118
+ streamService,
119
+ resultsService,
120
+ profilesService,
121
+ };
122
+ }
123
+ function splitData(data, separator = '\n') {
124
+ if (data === '') {
125
+ return [];
126
+ }
127
+ return data.split(separator);
128
+ }
129
+ //# sourceMappingURL=npkill.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"npkill.js","sourceRoot":"","sources":["../../src/core/npkill.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { IDevkillrcConfig } from '../../interfaces/devkillrc-config.interface.js';
2
+ /**
3
+ * Merges exclude arrays from base and file config, avoiding duplicates
4
+ */
5
+ export declare function mergeExcludeArrays(baseExclude: unknown, fileExclude: string[]): string[];
6
+ /**
7
+ * Merges a simple property (direct override)
8
+ */
9
+ export declare function mergeProperty<T>(merged: Record<string, unknown>, key: string, value: T): void;
10
+ /**
11
+ * Type guard to check if a property exists and is not undefined
12
+ */
13
+ export declare function isDefined<T>(value: T | undefined): value is T;
14
+ /**
15
+ * Applies all file config properties to the merged config
16
+ */
17
+ export declare function applyFileConfigProperties(merged: Record<string, unknown>, baseConfig: Record<string, unknown>, fileConfig: IDevkillrcConfig): void;
@@ -0,0 +1,57 @@
1
+ /**
2
+ * Merges exclude arrays from base and file config, avoiding duplicates
3
+ */
4
+ export function mergeExcludeArrays(baseExclude, fileExclude) {
5
+ const base = Array.isArray(baseExclude) ? baseExclude : [];
6
+ return [...new Set([...base, ...fileExclude])];
7
+ }
8
+ /**
9
+ * Merges a simple property (direct override)
10
+ */
11
+ export function mergeProperty(merged, key, value) {
12
+ merged[key] = value;
13
+ }
14
+ /**
15
+ * Type guard to check if a property exists and is not undefined
16
+ */
17
+ export function isDefined(value) {
18
+ return value !== undefined;
19
+ }
20
+ /**
21
+ * Applies all file config properties to the merged config
22
+ */
23
+ export function applyFileConfigProperties(merged, baseConfig, fileConfig) {
24
+ // rootDir
25
+ if (isDefined(fileConfig.rootDir)) {
26
+ mergeProperty(merged, 'rootDir', fileConfig.rootDir);
27
+ }
28
+ // exclude (special merge logic)
29
+ if (isDefined(fileConfig.exclude)) {
30
+ merged.exclude = mergeExcludeArrays(baseConfig.exclude, fileConfig.exclude);
31
+ }
32
+ // sortBy
33
+ if (isDefined(fileConfig.sortBy)) {
34
+ mergeProperty(merged, 'sortBy', fileConfig.sortBy);
35
+ }
36
+ // sizeUnit
37
+ if (isDefined(fileConfig.sizeUnit)) {
38
+ mergeProperty(merged, 'sizeUnit', fileConfig.sizeUnit);
39
+ }
40
+ // excludeSensitiveResults
41
+ if (isDefined(fileConfig.excludeSensitiveResults)) {
42
+ mergeProperty(merged, 'excludeSensitiveResults', fileConfig.excludeSensitiveResults);
43
+ }
44
+ // dryRun
45
+ if (isDefined(fileConfig.dryRun)) {
46
+ mergeProperty(merged, 'dryRun', fileConfig.dryRun);
47
+ }
48
+ // checkUpdates
49
+ if (isDefined(fileConfig.checkUpdates)) {
50
+ mergeProperty(merged, 'checkUpdates', fileConfig.checkUpdates);
51
+ }
52
+ // defaultProfiles
53
+ if (isDefined(fileConfig.defaultProfiles)) {
54
+ mergeProperty(merged, 'defaultProfiles', fileConfig.defaultProfiles);
55
+ }
56
+ }
57
+ //# sourceMappingURL=config-merger.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-merger.js","sourceRoot":"","sources":["../../../../src/core/services/config/config-merger.ts"],"names":[],"mappings":"AAEA;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,WAAoB,EACpB,WAAqB;IAErB,MAAM,IAAI,GAAG,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAE,WAAwB,CAAC,CAAC,CAAC,EAAE,CAAC;IACzE,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,IAAI,EAAE,GAAG,WAAW,CAAC,CAAC,CAAC,CAAC;AACjD,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,aAAa,CAC3B,MAA+B,EAC/B,GAAW,EACX,KAAQ;IAER,MAAM,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AACtB,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,SAAS,CAAI,KAAoB;IAC/C,OAAO,KAAK,KAAK,SAAS,CAAC;AAC7B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,yBAAyB,CACvC,MAA+B,EAC/B,UAAmC,EACnC,UAA4B;IAE5B,UAAU;IACV,IAAI,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAClC,aAAa,CAAC,MAAM,EAAE,SAAS,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IACvD,CAAC;IAED,gCAAgC;IAChC,IAAI,SAAS,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QAClC,MAAM,CAAC,OAAO,GAAG,kBAAkB,CAAC,UAAU,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,CAAC,CAAC;IAC9E,CAAC;IAED,SAAS;IACT,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,aAAa,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IACrD,CAAC;IAED,WAAW;IACX,IAAI,SAAS,CAAC,UAAU,CAAC,QAAQ,CAAC,EAAE,CAAC;QACnC,aAAa,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,CAAC,QAAQ,CAAC,CAAC;IACzD,CAAC;IAED,0BAA0B;IAC1B,IAAI,SAAS,CAAC,UAAU,CAAC,uBAAuB,CAAC,EAAE,CAAC;QAClD,aAAa,CACX,MAAM,EACN,yBAAyB,EACzB,UAAU,CAAC,uBAAuB,CACnC,CAAC;IACJ,CAAC;IAED,SAAS;IACT,IAAI,SAAS,CAAC,UAAU,CAAC,MAAM,CAAC,EAAE,CAAC;QACjC,aAAa,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,MAAM,CAAC,CAAC;IACrD,CAAC;IAED,eAAe;IACf,IAAI,SAAS,CAAC,UAAU,CAAC,YAAY,CAAC,EAAE,CAAC;QACvC,aAAa,CAAC,MAAM,EAAE,cAAc,EAAE,UAAU,CAAC,YAAY,CAAC,CAAC;IACjE,CAAC;IAED,kBAAkB;IAClB,IAAI,SAAS,CAAC,UAAU,CAAC,eAAe,CAAC,EAAE,CAAC;QAC1C,aAAa,CAAC,MAAM,EAAE,iBAAiB,EAAE,UAAU,CAAC,eAAe,CAAC,CAAC;IACvE,CAAC;AACH,CAAC"}
@@ -0,0 +1,3 @@
1
+ import { type IDevkillrcConfig } from '../../interfaces/devkillrc-config.interface.js';
2
+ import { type ValidationResult } from './property-validators.js';
3
+ export declare function validateConfig(config: IDevkillrcConfig): ValidationResult;
@@ -0,0 +1,43 @@
1
+ import { VALID_DEVKILLRC_PROPERTIES, } from '../../interfaces/devkillrc-config.interface.js';
2
+ import { validateProfiles } from './profile-validator.js';
3
+ import { validateBoolean, validateDefaultProfiles, validateExclude, validateRootDir, validateSizeUnit, validateSortBy, validateUnknownProperties, } from './property-validators.js';
4
+ export function validateConfig(config) {
5
+ // Validate that config is an object
6
+ if (typeof config !== 'object' || config === null) {
7
+ return { isValid: false, error: 'Configuration must be an object.' };
8
+ }
9
+ // Validate unknown properties first
10
+ const unknownPropsResult = validateUnknownProperties(config, VALID_DEVKILLRC_PROPERTIES);
11
+ if (!unknownPropsResult.isValid) {
12
+ return unknownPropsResult;
13
+ }
14
+ // Validate each property
15
+ const validators = [
16
+ { name: 'rootDir', result: validateRootDir(config.rootDir) },
17
+ { name: 'exclude', result: validateExclude(config.exclude) },
18
+ { name: 'sortBy', result: validateSortBy(config.sortBy) },
19
+ { name: 'sizeUnit', result: validateSizeUnit(config.sizeUnit) },
20
+ {
21
+ name: 'excludeSensitiveResults',
22
+ result: validateBoolean(config.excludeSensitiveResults, 'excludeSensitiveResults'),
23
+ },
24
+ { name: 'dryRun', result: validateBoolean(config.dryRun, 'dryRun') },
25
+ {
26
+ name: 'checkUpdates',
27
+ result: validateBoolean(config.checkUpdates, 'checkUpdates'),
28
+ },
29
+ {
30
+ name: 'defaultProfiles',
31
+ result: validateDefaultProfiles(config.defaultProfiles),
32
+ },
33
+ { name: 'profiles', result: validateProfiles(config.profiles) },
34
+ ];
35
+ // Return first validation error found
36
+ for (const validator of validators) {
37
+ if (!validator.result.isValid) {
38
+ return validator.result;
39
+ }
40
+ }
41
+ return { isValid: true };
42
+ }
43
+ //# sourceMappingURL=config-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-validator.js","sourceRoot":"","sources":["../../../../src/core/services/config/config-validator.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,0BAA0B,GAC3B,MAAM,gDAAgD,CAAC;AACxD,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAEL,eAAe,EACf,uBAAuB,EACvB,eAAe,EACf,eAAe,EACf,gBAAgB,EAChB,cAAc,EACd,yBAAyB,GAC1B,MAAM,0BAA0B,CAAC;AAElC,MAAM,UAAU,cAAc,CAAC,MAAwB;IACrD,oCAAoC;IACpC,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,KAAK,IAAI,EAAE,CAAC;QAClD,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,kCAAkC,EAAE,CAAC;IACvE,CAAC;IAED,oCAAoC;IACpC,MAAM,kBAAkB,GAAG,yBAAyB,CAClD,MAAM,EACN,0BAA0B,CAC3B,CAAC;IACF,IAAI,CAAC,kBAAkB,CAAC,OAAO,EAAE,CAAC;QAChC,OAAO,kBAAkB,CAAC;IAC5B,CAAC;IAED,yBAAyB;IACzB,MAAM,UAAU,GAAsD;QACpE,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;QAC5D,EAAE,IAAI,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,OAAO,CAAC,EAAE;QAC5D,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,cAAc,CAAC,MAAM,CAAC,MAAM,CAAC,EAAE;QACzD,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;QAC/D;YACE,IAAI,EAAE,yBAAyB;YAC/B,MAAM,EAAE,eAAe,CACrB,MAAM,CAAC,uBAAuB,EAC9B,yBAAyB,CAC1B;SACF;QACD,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,QAAQ,CAAC,EAAE;QACpE;YACE,IAAI,EAAE,cAAc;YACpB,MAAM,EAAE,eAAe,CAAC,MAAM,CAAC,YAAY,EAAE,cAAc,CAAC;SAC7D;QACD;YACE,IAAI,EAAE,iBAAiB;YACvB,MAAM,EAAE,uBAAuB,CAAC,MAAM,CAAC,eAAe,CAAC;SACxD;QACD,EAAE,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,gBAAgB,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE;KAChE,CAAC;IAEF,sCAAsC;IACtC,KAAK,MAAM,SAAS,IAAI,UAAU,EAAE,CAAC;QACnC,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YAC9B,OAAO,SAAS,CAAC,MAAM,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { validateConfig } from './config-validator.js';
2
+ export { validateRootDir, validateExclude, validateSortBy, validateSizeUnit, validateBoolean, validateDefaultProfiles, validateUnknownProperties, type ValidationResult, } from './property-validators.js';
3
+ export { validateProfile, validateProfiles } from './profile-validator.js';
4
+ export { mergeExcludeArrays, mergeProperty, isDefined, applyFileConfigProperties, } from './config-merger.js';
@@ -0,0 +1,5 @@
1
+ export { validateConfig } from './config-validator.js';
2
+ export { validateRootDir, validateExclude, validateSortBy, validateSizeUnit, validateBoolean, validateDefaultProfiles, validateUnknownProperties, } from './property-validators.js';
3
+ export { validateProfile, validateProfiles } from './profile-validator.js';
4
+ export { mergeExcludeArrays, mergeProperty, isDefined, applyFileConfigProperties, } from './config-merger.js';
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/core/services/config/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAC;AACvD,OAAO,EACL,eAAe,EACf,eAAe,EACf,cAAc,EACd,gBAAgB,EAChB,eAAe,EACf,uBAAuB,EACvB,yBAAyB,GAE1B,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC3E,OAAO,EACL,kBAAkB,EAClB,aAAa,EACb,SAAS,EACT,yBAAyB,GAC1B,MAAM,oBAAoB,CAAC"}
@@ -0,0 +1,6 @@
1
+ import type { ValidationResult } from './property-validators.js';
2
+ export declare function validateProfile(profileName: string, profile: unknown): ValidationResult;
3
+ /**
4
+ * Validates the profiles property (all profiles)
5
+ */
6
+ export declare function validateProfiles(value: unknown): ValidationResult;
@@ -0,0 +1,68 @@
1
+ export function validateProfile(profileName, profile) {
2
+ if (typeof profile !== 'object' || profile === null) {
3
+ return {
4
+ isValid: false,
5
+ error: `Profile "${profileName}" must be an object.`,
6
+ };
7
+ }
8
+ const profileObj = profile;
9
+ // Validate description
10
+ if (!profileObj.description || typeof profileObj.description !== 'string') {
11
+ return {
12
+ isValid: false,
13
+ error: `Profile "${profileName}" must have a description property (string).`,
14
+ };
15
+ }
16
+ // Validate targets property exists
17
+ if (!profileObj.targets) {
18
+ return {
19
+ isValid: false,
20
+ error: `Profile "${profileName}" must have a targets property.`,
21
+ };
22
+ }
23
+ // Validate targets is an array
24
+ if (!Array.isArray(profileObj.targets)) {
25
+ return {
26
+ isValid: false,
27
+ error: `Profile "${profileName}" targets must be an array of strings.`,
28
+ };
29
+ }
30
+ // Validate all targets are strings
31
+ if (!profileObj.targets.every((t) => typeof t === 'string')) {
32
+ return {
33
+ isValid: false,
34
+ error: `All targets in profile "${profileName}" must be strings.`,
35
+ };
36
+ }
37
+ // Validate targets array is not empty
38
+ if (profileObj.targets.length === 0) {
39
+ return {
40
+ isValid: false,
41
+ error: `Profile "${profileName}" targets array cannot be empty.`,
42
+ };
43
+ }
44
+ return { isValid: true };
45
+ }
46
+ /**
47
+ * Validates the profiles property (all profiles)
48
+ */
49
+ export function validateProfiles(value) {
50
+ if (value === undefined) {
51
+ return { isValid: true };
52
+ }
53
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
54
+ return {
55
+ isValid: false,
56
+ error: 'profiles must be an object.',
57
+ };
58
+ }
59
+ // Validate each profile
60
+ for (const [profileName, profile] of Object.entries(value)) {
61
+ const result = validateProfile(profileName, profile);
62
+ if (!result.isValid) {
63
+ return result;
64
+ }
65
+ }
66
+ return { isValid: true };
67
+ }
68
+ //# sourceMappingURL=profile-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"profile-validator.js","sourceRoot":"","sources":["../../../../src/core/services/config/profile-validator.ts"],"names":[],"mappings":"AAEA,MAAM,UAAU,eAAe,CAC7B,WAAmB,EACnB,OAAgB;IAEhB,IAAI,OAAO,OAAO,KAAK,QAAQ,IAAI,OAAO,KAAK,IAAI,EAAE,CAAC;QACpD,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,YAAY,WAAW,sBAAsB;SACrD,CAAC;IACJ,CAAC;IAED,MAAM,UAAU,GAAG,OAAkC,CAAC;IAEtD,uBAAuB;IACvB,IAAI,CAAC,UAAU,CAAC,WAAW,IAAI,OAAO,UAAU,CAAC,WAAW,KAAK,QAAQ,EAAE,CAAC;QAC1E,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,YAAY,WAAW,8CAA8C;SAC7E,CAAC;IACJ,CAAC;IAED,mCAAmC;IACnC,IAAI,CAAC,UAAU,CAAC,OAAO,EAAE,CAAC;QACxB,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,YAAY,WAAW,iCAAiC;SAChE,CAAC;IACJ,CAAC;IAED,+BAA+B;IAC/B,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,EAAE,CAAC;QACvC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,YAAY,WAAW,wCAAwC;SACvE,CAAC;IACJ,CAAC;IAED,mCAAmC;IACnC,IAAI,CAAC,UAAU,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ,CAAC,EAAE,CAAC;QAC5D,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,2BAA2B,WAAW,oBAAoB;SAClE,CAAC;IACJ,CAAC;IAED,sCAAsC;IACtC,IAAI,UAAU,CAAC,OAAO,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpC,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,YAAY,WAAW,kCAAkC;SACjE,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAAC,KAAc;IAC7C,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;QACxB,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;IAC3B,CAAC;IAED,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QACxE,OAAO;YACL,OAAO,EAAE,KAAK;YACd,KAAK,EAAE,6BAA6B;SACrC,CAAC;IACJ,CAAC;IAED,wBAAwB;IACxB,KAAK,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;QAC3D,MAAM,MAAM,GAAG,eAAe,CAAC,WAAW,EAAE,OAAO,CAAC,CAAC;QACrD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;YACpB,OAAO,MAAM,CAAC;QAChB,CAAC;IACH,CAAC;IAED,OAAO,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC;AAC3B,CAAC"}
@@ -0,0 +1,33 @@
1
+ import type { IDevkillrcConfig } from '../../interfaces/devkillrc-config.interface.js';
2
+ export interface ValidationResult {
3
+ isValid: boolean;
4
+ error?: string;
5
+ }
6
+ /**
7
+ * Validates the rootDir property
8
+ */
9
+ export declare function validateRootDir(value: unknown): ValidationResult;
10
+ /**
11
+ * Validates the exclude property
12
+ */
13
+ export declare function validateExclude(value: unknown): ValidationResult;
14
+ /**
15
+ * Validates the sortBy property
16
+ */
17
+ export declare function validateSortBy(value: unknown): ValidationResult;
18
+ /**
19
+ * Validates the sizeUnit property
20
+ */
21
+ export declare function validateSizeUnit(value: unknown): ValidationResult;
22
+ /**
23
+ * Validates a boolean property
24
+ */
25
+ export declare function validateBoolean(value: unknown, propertyName: string): ValidationResult;
26
+ /**
27
+ * Validates the defaultProfiles property
28
+ */
29
+ export declare function validateDefaultProfiles(value: unknown): ValidationResult;
30
+ /**
31
+ * Validates unknown properties
32
+ */
33
+ export declare function validateUnknownProperties(config: IDevkillrcConfig, validProperties: readonly string[]): ValidationResult;
@@ -0,0 +1,125 @@
1
+ const VALID_SORT_OPTIONS = ['none', 'size', 'path', 'age'];
2
+ const VALID_SIZE_UNITS = ['auto', 'mb', 'gb'];
3
+ /**
4
+ * Validates the rootDir property
5
+ */
6
+ export function validateRootDir(value) {
7
+ if (value === undefined) {
8
+ return { isValid: true };
9
+ }
10
+ if (typeof value !== 'string') {
11
+ return {
12
+ isValid: false,
13
+ error: 'rootDir must be a string.',
14
+ };
15
+ }
16
+ if (value.trim() === '') {
17
+ return {
18
+ isValid: false,
19
+ error: 'rootDir cannot be an empty string.',
20
+ };
21
+ }
22
+ return { isValid: true };
23
+ }
24
+ /**
25
+ * Validates the exclude property
26
+ */
27
+ export function validateExclude(value) {
28
+ if (value === undefined) {
29
+ return { isValid: true };
30
+ }
31
+ if (!Array.isArray(value)) {
32
+ return {
33
+ isValid: false,
34
+ error: 'exclude must be an array of strings.',
35
+ };
36
+ }
37
+ if (!value.every((item) => typeof item === 'string')) {
38
+ return {
39
+ isValid: false,
40
+ error: 'All exclude items must be strings.',
41
+ };
42
+ }
43
+ return { isValid: true };
44
+ }
45
+ /**
46
+ * Validates the sortBy property
47
+ */
48
+ export function validateSortBy(value) {
49
+ if (value === undefined) {
50
+ return { isValid: true };
51
+ }
52
+ if (!VALID_SORT_OPTIONS.includes(value)) {
53
+ return {
54
+ isValid: false,
55
+ error: `sortBy must be one of: ${VALID_SORT_OPTIONS.join(', ')}.`,
56
+ };
57
+ }
58
+ return { isValid: true };
59
+ }
60
+ /**
61
+ * Validates the sizeUnit property
62
+ */
63
+ export function validateSizeUnit(value) {
64
+ if (value === undefined) {
65
+ return { isValid: true };
66
+ }
67
+ if (!VALID_SIZE_UNITS.includes(value)) {
68
+ return {
69
+ isValid: false,
70
+ error: `sizeUnit must be one of: ${VALID_SIZE_UNITS.join(', ')}.`,
71
+ };
72
+ }
73
+ return { isValid: true };
74
+ }
75
+ /**
76
+ * Validates a boolean property
77
+ */
78
+ export function validateBoolean(value, propertyName) {
79
+ if (value === undefined) {
80
+ return { isValid: true };
81
+ }
82
+ if (typeof value !== 'boolean') {
83
+ return {
84
+ isValid: false,
85
+ error: `${propertyName} must be a boolean.`,
86
+ };
87
+ }
88
+ return { isValid: true };
89
+ }
90
+ /**
91
+ * Validates the defaultProfiles property
92
+ */
93
+ export function validateDefaultProfiles(value) {
94
+ if (value === undefined) {
95
+ return { isValid: true };
96
+ }
97
+ if (!Array.isArray(value)) {
98
+ return {
99
+ isValid: false,
100
+ error: 'defaultProfiles must be an array of strings.',
101
+ };
102
+ }
103
+ if (!value.every((item) => typeof item === 'string')) {
104
+ return {
105
+ isValid: false,
106
+ error: 'All defaultProfiles items must be strings.',
107
+ };
108
+ }
109
+ return { isValid: true };
110
+ }
111
+ /**
112
+ * Validates unknown properties
113
+ */
114
+ export function validateUnknownProperties(config, validProperties) {
115
+ const unknownProps = Object.keys(config).filter((key) => !validProperties.includes(key));
116
+ if (unknownProps.length > 0) {
117
+ return {
118
+ isValid: false,
119
+ error: `Unknown configuration ${unknownProps.length === 1 ? 'property' : 'properties'}:` +
120
+ ` ${unknownProps.join(', ')}. Valid properties are: ${validProperties.join(', ')}.`,
121
+ };
122
+ }
123
+ return { isValid: true };
124
+ }
125
+ //# sourceMappingURL=property-validators.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"property-validators.js","sourceRoot":"","sources":["../../../../src/core/services/config/property-validators.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,37 @@
1
+ import type { IConfigLoadResult, IDevkillrcConfig } from '../interfaces/devkillrc-config.interface.js';
2
+ import type { PROFILE } from '../interfaces/profile.interface.js';
3
+ /**
4
+ * Service responsible for loading and parsing .devkillrc configuration files.
5
+ */
6
+ export declare class ConfigService {
7
+ /**
8
+ * Loads configuration with priority order:
9
+ * 1. Custom path specified via --config parameter
10
+ * 2. Current working directory ./.devkillrc
11
+ * 3. User's home directory ~/.devkillrc
12
+ * @param customPath Optional custom path to a configuration file
13
+ * @returns Configuration load result containing the parsed config or error information
14
+ */
15
+ loadConfig(customPath?: string): IConfigLoadResult;
16
+ /**
17
+ * Resolves the configuration file path based on priority order.
18
+ * Priority: custom path > cwd > home directory
19
+ * @param customPath Optional custom path specified by user
20
+ * @returns Resolved configuration file path
21
+ */
22
+ private resolveConfigPath;
23
+ /**
24
+ * Merges configuration from .devkillrc with a base configuration.
25
+ * Config file values take precedence over base values.
26
+ * @param baseConfig Base configuration object
27
+ * @param fileConfig Configuration loaded from .devkillrc
28
+ * @returns Merged configuration
29
+ */
30
+ mergeConfigs<T extends Record<string, unknown>>(baseConfig: T, fileConfig: IDevkillrcConfig | null): T;
31
+ /**
32
+ * Gets custom profiles from the configuration file.
33
+ * @param config Configuration loaded from .devkillrc
34
+ * @returns Record of user-defined profiles
35
+ */
36
+ getUserDefinedProfiles(config: IDevkillrcConfig | null): Record<string, PROFILE>;
37
+ }