@masuidrive/procman 0.1.0

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 (315) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +149 -0
  3. package/dist/src/cli/commands/clear-log.d.ts +10 -0
  4. package/dist/src/cli/commands/clear-log.d.ts.map +1 -0
  5. package/dist/src/cli/commands/clear-log.js +77 -0
  6. package/dist/src/cli/commands/clear-log.js.map +1 -0
  7. package/dist/src/cli/commands/exit.d.ts +10 -0
  8. package/dist/src/cli/commands/exit.d.ts.map +1 -0
  9. package/dist/src/cli/commands/exit.js +65 -0
  10. package/dist/src/cli/commands/exit.js.map +1 -0
  11. package/dist/src/cli/commands/help.d.ts +10 -0
  12. package/dist/src/cli/commands/help.d.ts.map +1 -0
  13. package/dist/src/cli/commands/help.js +340 -0
  14. package/dist/src/cli/commands/help.js.map +1 -0
  15. package/dist/src/cli/commands/list.d.ts +11 -0
  16. package/dist/src/cli/commands/list.d.ts.map +1 -0
  17. package/dist/src/cli/commands/list.js +130 -0
  18. package/dist/src/cli/commands/list.js.map +1 -0
  19. package/dist/src/cli/commands/load.d.ts +11 -0
  20. package/dist/src/cli/commands/load.d.ts.map +1 -0
  21. package/dist/src/cli/commands/load.js +250 -0
  22. package/dist/src/cli/commands/load.js.map +1 -0
  23. package/dist/src/cli/commands/log.d.ts +18 -0
  24. package/dist/src/cli/commands/log.d.ts.map +1 -0
  25. package/dist/src/cli/commands/log.js +282 -0
  26. package/dist/src/cli/commands/log.js.map +1 -0
  27. package/dist/src/cli/commands/restart.d.ts +11 -0
  28. package/dist/src/cli/commands/restart.d.ts.map +1 -0
  29. package/dist/src/cli/commands/restart.js +99 -0
  30. package/dist/src/cli/commands/restart.js.map +1 -0
  31. package/dist/src/cli/commands/start.d.ts +11 -0
  32. package/dist/src/cli/commands/start.d.ts.map +1 -0
  33. package/dist/src/cli/commands/start.js +105 -0
  34. package/dist/src/cli/commands/start.js.map +1 -0
  35. package/dist/src/cli/commands/stop.d.ts +12 -0
  36. package/dist/src/cli/commands/stop.d.ts.map +1 -0
  37. package/dist/src/cli/commands/stop.js +105 -0
  38. package/dist/src/cli/commands/stop.js.map +1 -0
  39. package/dist/src/cli/index.d.ts +3 -0
  40. package/dist/src/cli/index.d.ts.map +1 -0
  41. package/dist/src/cli/index.js +28 -0
  42. package/dist/src/cli/index.js.map +1 -0
  43. package/dist/src/cli/parser.d.ts +14 -0
  44. package/dist/src/cli/parser.d.ts.map +1 -0
  45. package/dist/src/cli/parser.js +131 -0
  46. package/dist/src/cli/parser.js.map +1 -0
  47. package/dist/src/cli/signal-handler.d.ts +51 -0
  48. package/dist/src/cli/signal-handler.d.ts.map +1 -0
  49. package/dist/src/cli/signal-handler.js +129 -0
  50. package/dist/src/cli/signal-handler.js.map +1 -0
  51. package/dist/src/cli/utils/error-handler.d.ts +39 -0
  52. package/dist/src/cli/utils/error-handler.d.ts.map +1 -0
  53. package/dist/src/cli/utils/error-handler.js +200 -0
  54. package/dist/src/cli/utils/error-handler.js.map +1 -0
  55. package/dist/src/cli/utils/error-utils.d.ts +16 -0
  56. package/dist/src/cli/utils/error-utils.d.ts.map +1 -0
  57. package/dist/src/cli/utils/error-utils.js +48 -0
  58. package/dist/src/cli/utils/error-utils.js.map +1 -0
  59. package/dist/src/cli/utils/ipc-client.d.ts +80 -0
  60. package/dist/src/cli/utils/ipc-client.d.ts.map +1 -0
  61. package/dist/src/cli/utils/ipc-client.js +275 -0
  62. package/dist/src/cli/utils/ipc-client.js.map +1 -0
  63. package/dist/src/config/config-loader.d.ts +74 -0
  64. package/dist/src/config/config-loader.d.ts.map +1 -0
  65. package/dist/src/config/config-loader.js +229 -0
  66. package/dist/src/config/config-loader.js.map +1 -0
  67. package/dist/src/config/config-normalizer.d.ts +135 -0
  68. package/dist/src/config/config-normalizer.d.ts.map +1 -0
  69. package/dist/src/config/config-normalizer.js +309 -0
  70. package/dist/src/config/config-normalizer.js.map +1 -0
  71. package/dist/src/config/config-reporter.d.ts +183 -0
  72. package/dist/src/config/config-reporter.d.ts.map +1 -0
  73. package/dist/src/config/config-reporter.js +311 -0
  74. package/dist/src/config/config-reporter.js.map +1 -0
  75. package/dist/src/config/config-validator.d.ts +163 -0
  76. package/dist/src/config/config-validator.d.ts.map +1 -0
  77. package/dist/src/config/config-validator.js +489 -0
  78. package/dist/src/config/config-validator.js.map +1 -0
  79. package/dist/src/config/config-watcher.d.ts +161 -0
  80. package/dist/src/config/config-watcher.d.ts.map +1 -0
  81. package/dist/src/config/config-watcher.js +245 -0
  82. package/dist/src/config/config-watcher.js.map +1 -0
  83. package/dist/src/config/index.d.ts +36 -0
  84. package/dist/src/config/index.d.ts.map +1 -0
  85. package/dist/src/config/index.js +41 -0
  86. package/dist/src/config/index.js.map +1 -0
  87. package/dist/src/config/secure-config-loader.d.ts +77 -0
  88. package/dist/src/config/secure-config-loader.d.ts.map +1 -0
  89. package/dist/src/config/secure-config-loader.js +326 -0
  90. package/dist/src/config/secure-config-loader.js.map +1 -0
  91. package/dist/src/daemon/base-socket-connection.d.ts +66 -0
  92. package/dist/src/daemon/base-socket-connection.d.ts.map +1 -0
  93. package/dist/src/daemon/base-socket-connection.js +192 -0
  94. package/dist/src/daemon/base-socket-connection.js.map +1 -0
  95. package/dist/src/daemon/component-manager.d.ts +180 -0
  96. package/dist/src/daemon/component-manager.d.ts.map +1 -0
  97. package/dist/src/daemon/component-manager.js +794 -0
  98. package/dist/src/daemon/component-manager.js.map +1 -0
  99. package/dist/src/daemon/crash-recovery.d.ts +71 -0
  100. package/dist/src/daemon/crash-recovery.d.ts.map +1 -0
  101. package/dist/src/daemon/crash-recovery.js +282 -0
  102. package/dist/src/daemon/crash-recovery.js.map +1 -0
  103. package/dist/src/daemon/daemon-main.d.ts +18 -0
  104. package/dist/src/daemon/daemon-main.d.ts.map +1 -0
  105. package/dist/src/daemon/daemon-main.js +160 -0
  106. package/dist/src/daemon/daemon-main.js.map +1 -0
  107. package/dist/src/daemon/daemon-state-manager.d.ts +111 -0
  108. package/dist/src/daemon/daemon-state-manager.d.ts.map +1 -0
  109. package/dist/src/daemon/daemon-state-manager.js +194 -0
  110. package/dist/src/daemon/daemon-state-manager.js.map +1 -0
  111. package/dist/src/daemon/data-directory.d.ts +51 -0
  112. package/dist/src/daemon/data-directory.d.ts.map +1 -0
  113. package/dist/src/daemon/data-directory.js +136 -0
  114. package/dist/src/daemon/data-directory.js.map +1 -0
  115. package/dist/src/daemon/index.d.ts +20 -0
  116. package/dist/src/daemon/index.d.ts.map +1 -0
  117. package/dist/src/daemon/index.js +24 -0
  118. package/dist/src/daemon/index.js.map +1 -0
  119. package/dist/src/daemon/ipc-client-base.d.ts +153 -0
  120. package/dist/src/daemon/ipc-client-base.d.ts.map +1 -0
  121. package/dist/src/daemon/ipc-client-base.js +476 -0
  122. package/dist/src/daemon/ipc-client-base.js.map +1 -0
  123. package/dist/src/daemon/ipc-command-handler.d.ts +107 -0
  124. package/dist/src/daemon/ipc-command-handler.d.ts.map +1 -0
  125. package/dist/src/daemon/ipc-command-handler.js +483 -0
  126. package/dist/src/daemon/ipc-command-handler.js.map +1 -0
  127. package/dist/src/daemon/ipc-factory.d.ts +92 -0
  128. package/dist/src/daemon/ipc-factory.d.ts.map +1 -0
  129. package/dist/src/daemon/ipc-factory.js +210 -0
  130. package/dist/src/daemon/ipc-factory.js.map +1 -0
  131. package/dist/src/daemon/ipc-server-base.d.ts +158 -0
  132. package/dist/src/daemon/ipc-server-base.d.ts.map +1 -0
  133. package/dist/src/daemon/ipc-server-base.js +491 -0
  134. package/dist/src/daemon/ipc-server-base.js.map +1 -0
  135. package/dist/src/daemon/message-protocol.d.ts +132 -0
  136. package/dist/src/daemon/message-protocol.d.ts.map +1 -0
  137. package/dist/src/daemon/message-protocol.js +252 -0
  138. package/dist/src/daemon/message-protocol.js.map +1 -0
  139. package/dist/src/daemon/named-pipe-client.d.ts +61 -0
  140. package/dist/src/daemon/named-pipe-client.d.ts.map +1 -0
  141. package/dist/src/daemon/named-pipe-client.js +221 -0
  142. package/dist/src/daemon/named-pipe-client.js.map +1 -0
  143. package/dist/src/daemon/named-pipe-server.d.ts +40 -0
  144. package/dist/src/daemon/named-pipe-server.d.ts.map +1 -0
  145. package/dist/src/daemon/named-pipe-server.js +102 -0
  146. package/dist/src/daemon/named-pipe-server.js.map +1 -0
  147. package/dist/src/daemon/orphan-detector.d.ts +66 -0
  148. package/dist/src/daemon/orphan-detector.d.ts.map +1 -0
  149. package/dist/src/daemon/orphan-detector.js +208 -0
  150. package/dist/src/daemon/orphan-detector.js.map +1 -0
  151. package/dist/src/daemon/pid-manager.d.ts +49 -0
  152. package/dist/src/daemon/pid-manager.d.ts.map +1 -0
  153. package/dist/src/daemon/pid-manager.js +110 -0
  154. package/dist/src/daemon/pid-manager.js.map +1 -0
  155. package/dist/src/daemon/procman-daemon.d.ts +188 -0
  156. package/dist/src/daemon/procman-daemon.d.ts.map +1 -0
  157. package/dist/src/daemon/procman-daemon.js +802 -0
  158. package/dist/src/daemon/procman-daemon.js.map +1 -0
  159. package/dist/src/daemon/reconnection-system.d.ts +113 -0
  160. package/dist/src/daemon/reconnection-system.d.ts.map +1 -0
  161. package/dist/src/daemon/reconnection-system.js +223 -0
  162. package/dist/src/daemon/reconnection-system.js.map +1 -0
  163. package/dist/src/daemon/resource-manager.d.ts +204 -0
  164. package/dist/src/daemon/resource-manager.d.ts.map +1 -0
  165. package/dist/src/daemon/resource-manager.js +423 -0
  166. package/dist/src/daemon/resource-manager.js.map +1 -0
  167. package/dist/src/daemon/signal-handler.d.ts +58 -0
  168. package/dist/src/daemon/signal-handler.d.ts.map +1 -0
  169. package/dist/src/daemon/signal-handler.js +142 -0
  170. package/dist/src/daemon/signal-handler.js.map +1 -0
  171. package/dist/src/daemon/simple-resource-manager.d.ts +95 -0
  172. package/dist/src/daemon/simple-resource-manager.d.ts.map +1 -0
  173. package/dist/src/daemon/simple-resource-manager.js +180 -0
  174. package/dist/src/daemon/simple-resource-manager.js.map +1 -0
  175. package/dist/src/daemon/unix-socket-client.d.ts +69 -0
  176. package/dist/src/daemon/unix-socket-client.d.ts.map +1 -0
  177. package/dist/src/daemon/unix-socket-client.js +313 -0
  178. package/dist/src/daemon/unix-socket-client.js.map +1 -0
  179. package/dist/src/daemon/unix-socket-server.d.ts +61 -0
  180. package/dist/src/daemon/unix-socket-server.d.ts.map +1 -0
  181. package/dist/src/daemon/unix-socket-server.js +262 -0
  182. package/dist/src/daemon/unix-socket-server.js.map +1 -0
  183. package/dist/src/daemon/zombie-reaper.d.ts +83 -0
  184. package/dist/src/daemon/zombie-reaper.d.ts.map +1 -0
  185. package/dist/src/daemon/zombie-reaper.js +278 -0
  186. package/dist/src/daemon/zombie-reaper.js.map +1 -0
  187. package/dist/src/process-manager/index.d.ts +13 -0
  188. package/dist/src/process-manager/index.d.ts.map +1 -0
  189. package/dist/src/process-manager/index.js +11 -0
  190. package/dist/src/process-manager/index.js.map +1 -0
  191. package/dist/src/process-manager/interfaces/index.d.ts +31 -0
  192. package/dist/src/process-manager/interfaces/index.d.ts.map +1 -0
  193. package/dist/src/process-manager/interfaces/index.js +14 -0
  194. package/dist/src/process-manager/interfaces/index.js.map +1 -0
  195. package/dist/src/process-manager/interfaces/process-group.d.ts +200 -0
  196. package/dist/src/process-manager/interfaces/process-group.d.ts.map +1 -0
  197. package/dist/src/process-manager/interfaces/process-group.js +10 -0
  198. package/dist/src/process-manager/interfaces/process-group.js.map +1 -0
  199. package/dist/src/process-manager/interfaces/process-lifecycle.d.ts +97 -0
  200. package/dist/src/process-manager/interfaces/process-lifecycle.d.ts.map +1 -0
  201. package/dist/src/process-manager/interfaces/process-lifecycle.js +10 -0
  202. package/dist/src/process-manager/interfaces/process-lifecycle.js.map +1 -0
  203. package/dist/src/process-manager/interfaces/process-monitor.d.ts +118 -0
  204. package/dist/src/process-manager/interfaces/process-monitor.d.ts.map +1 -0
  205. package/dist/src/process-manager/interfaces/process-monitor.js +10 -0
  206. package/dist/src/process-manager/interfaces/process-monitor.js.map +1 -0
  207. package/dist/src/process-manager/interfaces/process-persistence.d.ts +125 -0
  208. package/dist/src/process-manager/interfaces/process-persistence.d.ts.map +1 -0
  209. package/dist/src/process-manager/interfaces/process-persistence.js +10 -0
  210. package/dist/src/process-manager/interfaces/process-persistence.js.map +1 -0
  211. package/dist/src/process-manager/managed-process-info.d.ts +307 -0
  212. package/dist/src/process-manager/managed-process-info.d.ts.map +1 -0
  213. package/dist/src/process-manager/managed-process-info.js +650 -0
  214. package/dist/src/process-manager/managed-process-info.js.map +1 -0
  215. package/dist/src/process-manager/process-group-manager.d.ts +103 -0
  216. package/dist/src/process-manager/process-group-manager.d.ts.map +1 -0
  217. package/dist/src/process-manager/process-group-manager.js +400 -0
  218. package/dist/src/process-manager/process-group-manager.js.map +1 -0
  219. package/dist/src/process-manager/process-lifecycle-manager.d.ts +68 -0
  220. package/dist/src/process-manager/process-lifecycle-manager.d.ts.map +1 -0
  221. package/dist/src/process-manager/process-lifecycle-manager.js +372 -0
  222. package/dist/src/process-manager/process-lifecycle-manager.js.map +1 -0
  223. package/dist/src/process-manager/process-manager.d.ts +296 -0
  224. package/dist/src/process-manager/process-manager.d.ts.map +1 -0
  225. package/dist/src/process-manager/process-manager.js +659 -0
  226. package/dist/src/process-manager/process-manager.js.map +1 -0
  227. package/dist/src/process-manager/process-monitor.d.ts +95 -0
  228. package/dist/src/process-manager/process-monitor.d.ts.map +1 -0
  229. package/dist/src/process-manager/process-monitor.js +357 -0
  230. package/dist/src/process-manager/process-monitor.js.map +1 -0
  231. package/dist/src/process-manager/process-persistence.d.ts +68 -0
  232. package/dist/src/process-manager/process-persistence.d.ts.map +1 -0
  233. package/dist/src/process-manager/process-persistence.js +364 -0
  234. package/dist/src/process-manager/process-persistence.js.map +1 -0
  235. package/dist/src/process-manager/utils/mutex.d.ts +82 -0
  236. package/dist/src/process-manager/utils/mutex.d.ts.map +1 -0
  237. package/dist/src/process-manager/utils/mutex.js +172 -0
  238. package/dist/src/process-manager/utils/mutex.js.map +1 -0
  239. package/dist/src/services/index.d.ts +8 -0
  240. package/dist/src/services/index.d.ts.map +1 -0
  241. package/dist/src/services/index.js +8 -0
  242. package/dist/src/services/index.js.map +1 -0
  243. package/dist/src/services/log-manager-config.d.ts +65 -0
  244. package/dist/src/services/log-manager-config.d.ts.map +1 -0
  245. package/dist/src/services/log-manager-config.js +145 -0
  246. package/dist/src/services/log-manager-config.js.map +1 -0
  247. package/dist/src/services/log-manager-factory.d.ts +134 -0
  248. package/dist/src/services/log-manager-factory.d.ts.map +1 -0
  249. package/dist/src/services/log-manager-factory.js +203 -0
  250. package/dist/src/services/log-manager-factory.js.map +1 -0
  251. package/dist/src/services/log-manager.d.ts +170 -0
  252. package/dist/src/services/log-manager.d.ts.map +1 -0
  253. package/dist/src/services/log-manager.js +1199 -0
  254. package/dist/src/services/log-manager.js.map +1 -0
  255. package/dist/src/services/log-path-validator.d.ts +121 -0
  256. package/dist/src/services/log-path-validator.d.ts.map +1 -0
  257. package/dist/src/services/log-path-validator.js +302 -0
  258. package/dist/src/services/log-path-validator.js.map +1 -0
  259. package/dist/src/services/process-log-integration.d.ts +62 -0
  260. package/dist/src/services/process-log-integration.d.ts.map +1 -0
  261. package/dist/src/services/process-log-integration.js +157 -0
  262. package/dist/src/services/process-log-integration.js.map +1 -0
  263. package/dist/src/shared/config.d.ts +67 -0
  264. package/dist/src/shared/config.d.ts.map +1 -0
  265. package/dist/src/shared/config.js +92 -0
  266. package/dist/src/shared/config.js.map +1 -0
  267. package/dist/src/shared/constants-streaming.d.ts +39 -0
  268. package/dist/src/shared/constants-streaming.d.ts.map +1 -0
  269. package/dist/src/shared/constants-streaming.js +39 -0
  270. package/dist/src/shared/constants-streaming.js.map +1 -0
  271. package/dist/src/shared/constants.d.ts +60 -0
  272. package/dist/src/shared/constants.d.ts.map +1 -0
  273. package/dist/src/shared/constants.js +71 -0
  274. package/dist/src/shared/constants.js.map +1 -0
  275. package/dist/src/shared/errors.d.ts +70 -0
  276. package/dist/src/shared/errors.d.ts.map +1 -0
  277. package/dist/src/shared/errors.js +101 -0
  278. package/dist/src/shared/errors.js.map +1 -0
  279. package/dist/src/shared/index.d.ts +14 -0
  280. package/dist/src/shared/index.d.ts.map +1 -0
  281. package/dist/src/shared/index.js +22 -0
  282. package/dist/src/shared/index.js.map +1 -0
  283. package/dist/src/shared/ipc.d.ts +402 -0
  284. package/dist/src/shared/ipc.d.ts.map +1 -0
  285. package/dist/src/shared/ipc.js +85 -0
  286. package/dist/src/shared/ipc.js.map +1 -0
  287. package/dist/src/shared/logger.d.ts +38 -0
  288. package/dist/src/shared/logger.d.ts.map +1 -0
  289. package/dist/src/shared/logger.js +139 -0
  290. package/dist/src/shared/logger.js.map +1 -0
  291. package/dist/src/shared/logs.d.ts +53 -0
  292. package/dist/src/shared/logs.d.ts.map +1 -0
  293. package/dist/src/shared/logs.js +26 -0
  294. package/dist/src/shared/logs.js.map +1 -0
  295. package/dist/src/shared/process.d.ts +102 -0
  296. package/dist/src/shared/process.d.ts.map +1 -0
  297. package/dist/src/shared/process.js +55 -0
  298. package/dist/src/shared/process.js.map +1 -0
  299. package/dist/src/shared/types.d.ts +15 -0
  300. package/dist/src/shared/types.d.ts.map +1 -0
  301. package/dist/src/shared/types.js +8 -0
  302. package/dist/src/shared/types.js.map +1 -0
  303. package/dist/src/types/index.d.ts +19 -0
  304. package/dist/src/types/index.d.ts.map +1 -0
  305. package/dist/src/types/index.js +5 -0
  306. package/dist/src/types/index.js.map +1 -0
  307. package/dist/src/utils/event-cleanup.d.ts +30 -0
  308. package/dist/src/utils/event-cleanup.d.ts.map +1 -0
  309. package/dist/src/utils/event-cleanup.js +32 -0
  310. package/dist/src/utils/event-cleanup.js.map +1 -0
  311. package/dist/src/utils/memory/memory-monitor.d.ts +126 -0
  312. package/dist/src/utils/memory/memory-monitor.d.ts.map +1 -0
  313. package/dist/src/utils/memory/memory-monitor.js +246 -0
  314. package/dist/src/utils/memory/memory-monitor.js.map +1 -0
  315. package/package.json +74 -0
@@ -0,0 +1,311 @@
1
+ /**
2
+ * Configuration Reporter
3
+ *
4
+ * Handles reporting logic for procman configuration validation.
5
+ * Provides detailed validation reports and error tracking.
6
+ */
7
+ import * as path from 'path';
8
+ import { ProcmanError } from '../shared/errors.js';
9
+ /**
10
+ * Configuration reporter class
11
+ * Responsible for generating validation reports and error messages
12
+ */
13
+ export class ConfigReporter {
14
+ includeSuggestions;
15
+ maxIssues;
16
+ validationIssues = [];
17
+ lastReport = null;
18
+ constructor(options = {}) {
19
+ this.includeSuggestions = options.includeSuggestions !== false;
20
+ this.maxIssues = options.maxIssues || 100;
21
+ }
22
+ /**
23
+ * Generate validation report for configuration
24
+ * @param config Validated configuration (or null if validation failed)
25
+ * @param filePath Path to configuration file
26
+ * @param issues Array of validation issues
27
+ * @returns Validation report
28
+ */
29
+ generateReport(config, filePath, issues = []) {
30
+ const absolutePath = path.resolve(filePath);
31
+ this.validationIssues = [...issues];
32
+ const report = {
33
+ success: config !== null,
34
+ filePath: absolutePath,
35
+ appCount: config?.apps.length || 0,
36
+ issues: [...this.validationIssues],
37
+ summary: this.calculateSummary(this.validationIssues),
38
+ apps: [],
39
+ };
40
+ if (config) {
41
+ // Generate app summaries
42
+ report.apps = config.apps.map((app) => ({
43
+ name: app.name,
44
+ script: app.script,
45
+ memoryLimit: app.max_memory_restart,
46
+ hasEnvVars: !!app.env && Object.keys(app.env).length > 0,
47
+ hasLogFiles: !!(app.log_file || app.out_file || app.error_file),
48
+ }));
49
+ }
50
+ this.lastReport = report;
51
+ return report;
52
+ }
53
+ /**
54
+ * Generate report from validation attempt
55
+ * @param filePath Path to configuration file
56
+ * @param validationFunction Function that performs validation
57
+ * @returns Validation report
58
+ */
59
+ async generateReportFromValidation(filePath, validationFunction) {
60
+ const absolutePath = path.resolve(filePath);
61
+ this.validationIssues = [];
62
+ const report = {
63
+ success: false,
64
+ filePath: absolutePath,
65
+ appCount: 0,
66
+ issues: [],
67
+ summary: { errors: 0, warnings: 0, infos: 0 },
68
+ apps: [],
69
+ };
70
+ try {
71
+ const config = await validationFunction();
72
+ // Generate app summaries
73
+ report.appCount = config.apps.length;
74
+ report.apps = config.apps.map((app) => ({
75
+ name: app.name,
76
+ script: app.script,
77
+ memoryLimit: app.max_memory_restart,
78
+ hasEnvVars: !!app.env && Object.keys(app.env).length > 0,
79
+ hasLogFiles: !!(app.log_file || app.out_file || app.error_file),
80
+ }));
81
+ report.success = true;
82
+ }
83
+ catch (error) {
84
+ // Add error to issues
85
+ if (error instanceof ProcmanError) {
86
+ this.addValidationIssue({
87
+ severity: 'error',
88
+ category: 'structure',
89
+ message: error.message,
90
+ });
91
+ }
92
+ else {
93
+ this.addValidationIssue({
94
+ severity: 'error',
95
+ category: 'structure',
96
+ message: `Unexpected error: ${error instanceof Error ? error.message : String(error)}`,
97
+ });
98
+ }
99
+ }
100
+ // Add collected issues to report
101
+ report.issues = [...this.validationIssues];
102
+ // Calculate summary
103
+ report.summary = this.calculateSummary(report.issues);
104
+ this.lastReport = report;
105
+ return report;
106
+ }
107
+ /**
108
+ * Add validation issue to collection
109
+ * @param issue Validation issue to add
110
+ */
111
+ addValidationIssue(issue) {
112
+ if (this.validationIssues.length < this.maxIssues) {
113
+ this.validationIssues.push(issue);
114
+ }
115
+ }
116
+ /**
117
+ * Get collected validation issues
118
+ * @returns Array of validation issues
119
+ */
120
+ getValidationIssues() {
121
+ return [...this.validationIssues];
122
+ }
123
+ /**
124
+ * Clear collected validation issues
125
+ */
126
+ clearValidationIssues() {
127
+ this.validationIssues = [];
128
+ }
129
+ /**
130
+ * Get last validation report
131
+ * @returns Last validation report or null
132
+ */
133
+ getLastReport() {
134
+ return this.lastReport;
135
+ }
136
+ /**
137
+ * Calculate summary statistics from issues
138
+ * @param issues Array of validation issues
139
+ * @returns Summary object with counts
140
+ */
141
+ calculateSummary(issues) {
142
+ const summary = { errors: 0, warnings: 0, infos: 0 };
143
+ for (const issue of issues) {
144
+ switch (issue.severity) {
145
+ case 'error':
146
+ summary.errors++;
147
+ break;
148
+ case 'warning':
149
+ summary.warnings++;
150
+ break;
151
+ case 'info':
152
+ summary.infos++;
153
+ break;
154
+ }
155
+ }
156
+ return summary;
157
+ }
158
+ /**
159
+ * Create enhanced validation error with suggestions
160
+ * @param originalError Original error
161
+ * @param issues Validation issues
162
+ * @returns Enhanced validation error
163
+ */
164
+ createEnhancedValidationError(originalError, issues = []) {
165
+ const suggestions = this.includeSuggestions
166
+ ? this.generateSuggestions(originalError.code, originalError.details?.field)
167
+ : [];
168
+ const enhancedError = originalError;
169
+ enhancedError.suggestions = suggestions;
170
+ enhancedError.validationIssues = [...issues];
171
+ return enhancedError;
172
+ }
173
+ /**
174
+ * Generate suggestions for validation errors
175
+ * @param errorCode Error code
176
+ * @param field Field name (optional)
177
+ * @returns Array of suggestions
178
+ */
179
+ generateSuggestions(errorCode, field) {
180
+ const suggestions = [];
181
+ switch (errorCode) {
182
+ case 'CONFIG_VALIDATION_ERROR':
183
+ if (field === 'name') {
184
+ suggestions.push('Use only alphanumeric characters, dashes, and underscores');
185
+ suggestions.push('Ensure the name is unique across all apps');
186
+ }
187
+ else if (field === 'script') {
188
+ suggestions.push('Provide the full command to execute');
189
+ suggestions.push('Use absolute paths for executables if needed');
190
+ }
191
+ else if (field === 'max_memory_restart') {
192
+ suggestions.push('Use format like "300M", "1G", or "512000K"');
193
+ suggestions.push('Ensure the unit (K/M/G) is specified');
194
+ }
195
+ break;
196
+ case 'CONFIG_SECURITY_ERROR':
197
+ suggestions.push('Use relative paths within the project directory');
198
+ suggestions.push('Avoid ".." in paths to prevent directory traversal');
199
+ suggestions.push('Use absolute paths only when explicitly needed');
200
+ break;
201
+ case 'CONFIG_FILE_ERROR':
202
+ suggestions.push('Ensure the configuration file exists');
203
+ suggestions.push('Check file permissions for read access');
204
+ suggestions.push('Verify the file has .js extension');
205
+ break;
206
+ default:
207
+ suggestions.push('Check the configuration documentation');
208
+ suggestions.push('Verify all required fields are present');
209
+ }
210
+ return suggestions;
211
+ }
212
+ /**
213
+ * Format validation report as human-readable text
214
+ * @param report Validation report to format
215
+ * @returns Formatted report text
216
+ */
217
+ formatReport(report) {
218
+ const lines = [];
219
+ lines.push(`Configuration Validation Report`);
220
+ lines.push(`==============================`);
221
+ lines.push(`File: ${report.filePath}`);
222
+ lines.push(`Status: ${report.success ? 'VALID' : 'INVALID'}`);
223
+ lines.push(`Apps: ${report.appCount}`);
224
+ lines.push('');
225
+ if (report.summary.errors > 0 ||
226
+ report.summary.warnings > 0 ||
227
+ report.summary.infos > 0) {
228
+ lines.push(`Summary: ${report.summary.errors} errors, ${report.summary.warnings} warnings, ${report.summary.infos} info`);
229
+ lines.push('');
230
+ }
231
+ if (report.issues.length > 0) {
232
+ lines.push('Issues:');
233
+ lines.push('-------');
234
+ for (const issue of report.issues) {
235
+ const location = issue.location
236
+ ? ` (app[${issue.location.appIndex}]${issue.location.field ? `.${issue.location.field}` : ''})`
237
+ : '';
238
+ lines.push(`[${issue.severity.toUpperCase()}] ${issue.message}${location}`);
239
+ if (issue.suggestion && this.includeSuggestions) {
240
+ lines.push(` Suggestion: ${issue.suggestion}`);
241
+ }
242
+ lines.push('');
243
+ }
244
+ }
245
+ if (report.success && report.apps.length > 0) {
246
+ lines.push('Apps:');
247
+ lines.push('-----');
248
+ for (const app of report.apps) {
249
+ lines.push(`• ${app.name}: ${app.script}`);
250
+ const details = [];
251
+ if (app.memoryLimit)
252
+ details.push(`memory: ${app.memoryLimit}`);
253
+ if (app.hasEnvVars)
254
+ details.push('env vars');
255
+ if (app.hasLogFiles)
256
+ details.push('log files');
257
+ if (details.length > 0) {
258
+ lines.push(` (${details.join(', ')})`);
259
+ }
260
+ lines.push('');
261
+ }
262
+ }
263
+ return lines.join('\n');
264
+ }
265
+ /**
266
+ * Format validation report as JSON
267
+ * @param report Validation report to format
268
+ * @param pretty Whether to pretty-print JSON (default: false)
269
+ * @returns JSON string
270
+ */
271
+ formatReportAsJson(report, pretty = false) {
272
+ return JSON.stringify(report, null, pretty ? 2 : undefined);
273
+ }
274
+ /**
275
+ * Set whether to include suggestions in reports
276
+ * @param include Whether to include suggestions
277
+ */
278
+ setIncludeSuggestions(include) {
279
+ this.includeSuggestions = include;
280
+ }
281
+ /**
282
+ * Get whether suggestions are included in reports
283
+ * @returns True if suggestions are included
284
+ */
285
+ isIncludingSuggestions() {
286
+ return this.includeSuggestions;
287
+ }
288
+ /**
289
+ * Set maximum number of issues to collect
290
+ * @param maxIssues Maximum number of issues
291
+ */
292
+ setMaxIssues(maxIssues) {
293
+ this.maxIssues = Math.max(1, maxIssues);
294
+ }
295
+ /**
296
+ * Get maximum number of issues to collect
297
+ * @returns Maximum number of issues
298
+ */
299
+ getMaxIssues() {
300
+ return this.maxIssues;
301
+ }
302
+ }
303
+ /**
304
+ * Create a new configuration reporter instance
305
+ * @param options Reporter options
306
+ * @returns ConfigReporter instance
307
+ */
308
+ export function createConfigReporter(options) {
309
+ return new ConfigReporter(options);
310
+ }
311
+ //# sourceMappingURL=config-reporter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-reporter.js","sourceRoot":"","sources":["../../../src/config/config-reporter.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Configuration Validator
3
+ *
4
+ * Handles validation logic for procman configuration files.
5
+ * Provides comprehensive validation with detailed error reporting and suggestions.
6
+ */
7
+ import { ProcmanConfig } from '../shared/config.js';
8
+ /**
9
+ * Validation issue severity levels
10
+ */
11
+ export type ValidationSeverity = 'error' | 'warning' | 'info';
12
+ /**
13
+ * Validation issue details
14
+ */
15
+ export interface ValidationIssue {
16
+ /** Issue severity level */
17
+ severity: ValidationSeverity;
18
+ /** Issue category */
19
+ category: 'structure' | 'security' | 'performance' | 'compatibility';
20
+ /** Issue message */
21
+ message: string;
22
+ /** Location of the issue */
23
+ location?: {
24
+ appIndex?: number;
25
+ field?: string;
26
+ value?: string;
27
+ };
28
+ /** Suggested fix */
29
+ suggestion?: string;
30
+ }
31
+ /**
32
+ * Configuration validator options
33
+ */
34
+ export interface ConfigValidatorOptions {
35
+ /** Project root path for security validation */
36
+ projectRoot?: string;
37
+ /** Whether to collect validation issues for reporting (default: false) */
38
+ collectIssues?: boolean;
39
+ }
40
+ /**
41
+ * Configuration validator class
42
+ * Responsible for validating procman configuration structure and content
43
+ */
44
+ export declare class ConfigValidator {
45
+ private projectRoot;
46
+ private collectIssues;
47
+ private validationIssues;
48
+ constructor(options?: ConfigValidatorOptions);
49
+ /**
50
+ * Validate configuration structure and content
51
+ * @param config Configuration object to validate
52
+ * @throws ProcmanError if validation fails
53
+ */
54
+ validateConfig(config: unknown): asserts config is ProcmanConfig;
55
+ /**
56
+ * Validate individual app configuration
57
+ * @param app App configuration to validate
58
+ * @param index Index in the apps array (for error reporting)
59
+ * @param appNames Set to track duplicate names
60
+ * @throws ProcmanError if validation fails
61
+ */
62
+ validateAppConfig(app: unknown, index: number, appNames: Set<string>): void;
63
+ /**
64
+ * Validate required field exists and has correct type
65
+ * @param obj Object to validate
66
+ * @param field Field name
67
+ * @param expectedType Expected type
68
+ * @param appIndex App index for error reporting
69
+ * @throws ProcmanError if validation fails
70
+ */
71
+ private validateRequiredField;
72
+ /**
73
+ * Validate optional field has correct type if present
74
+ * @param obj Object to validate
75
+ * @param field Field name
76
+ * @param expectedType Expected type
77
+ * @param appIndex App index for error reporting
78
+ * @throws ProcmanError if validation fails
79
+ */
80
+ private validateOptionalField;
81
+ /**
82
+ * Validate environment variables object
83
+ * @param env Environment variables object
84
+ * @param appIndex App index for error reporting
85
+ * @throws ProcmanError if validation fails
86
+ */
87
+ private validateEnvObject;
88
+ /**
89
+ * Validate memory size format and convert to bytes
90
+ * @param memorySize Memory size string (e.g., "300M", "1G")
91
+ * @param appIndex App index for error reporting
92
+ * @throws ProcmanError if validation fails
93
+ */
94
+ validateMemorySize(memorySize: string, appIndex: number): void;
95
+ /**
96
+ * Validate script path for security issues
97
+ * @param scriptPath Script path to validate
98
+ * @param appIndex App index for error reporting
99
+ */
100
+ private validateScriptPathSecurity;
101
+ /**
102
+ * Validate file path for security issues
103
+ * @param filePath File path to validate
104
+ * @param appIndex App index for error reporting
105
+ * @param fieldName Field name for error reporting
106
+ */
107
+ private validatePathSecurity;
108
+ /**
109
+ * Add validation issue to collection (if enabled)
110
+ * @param issue Validation issue to add
111
+ */
112
+ private addValidationIssue;
113
+ /**
114
+ * Get collected validation issues
115
+ * @returns Array of validation issues
116
+ */
117
+ getValidationIssues(): ValidationIssue[];
118
+ /**
119
+ * Clear collected validation issues
120
+ */
121
+ clearValidationIssues(): void;
122
+ /**
123
+ * Sanitize file path to prevent path traversal attacks
124
+ * @param filePath File path to sanitize
125
+ * @returns Sanitized file path
126
+ * @throws ProcmanError if path is potentially malicious
127
+ */
128
+ private sanitizeFilePath;
129
+ /**
130
+ * Validate that a path stays within the project boundaries
131
+ * @param filePath File path to validate (relative)
132
+ * @param basePath Base path to resolve against
133
+ * @returns Resolved absolute path
134
+ * @throws ProcmanError if path escapes project boundaries
135
+ */
136
+ private validatePathWithinProject;
137
+ /**
138
+ * Generate suggestions for validation errors
139
+ * @param errorCode Error code
140
+ * @param field Field name (optional)
141
+ * @returns Array of suggestions
142
+ */
143
+ generateSuggestions(errorCode: string, field?: string): string[];
144
+ /**
145
+ * Enhanced type guard for configuration objects
146
+ * @param config Unknown input to validate
147
+ * @returns Type predicate indicating if config is a valid object
148
+ */
149
+ private isValidConfigObject;
150
+ /**
151
+ * Generate detailed error message for invalid config types
152
+ * @param config Invalid config to analyze
153
+ * @returns Descriptive error message
154
+ */
155
+ private getConfigTypeErrorMessage;
156
+ }
157
+ /**
158
+ * Create a new configuration validator instance
159
+ * @param options Validator options
160
+ * @returns ConfigValidator instance
161
+ */
162
+ export declare function createConfigValidator(options?: ConfigValidatorOptions): ConfigValidator;
163
+ //# sourceMappingURL=config-validator.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-validator.d.ts","sourceRoot":"","sources":["../../../src/config/config-validator.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAGH,OAAO,EAAE,aAAa,EAAmB,MAAM,qBAAqB,CAAC;AAGrE;;GAEG;AACH,MAAM,MAAM,kBAAkB,GAAG,OAAO,GAAG,SAAS,GAAG,MAAM,CAAC;AAE9D;;GAEG;AACH,MAAM,WAAW,eAAe;IAC9B,2BAA2B;IAC3B,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,qBAAqB;IACrB,QAAQ,EAAE,WAAW,GAAG,UAAU,GAAG,aAAa,GAAG,eAAe,CAAC;IACrE,oBAAoB;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,4BAA4B;IAC5B,QAAQ,CAAC,EAAE;QACT,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,KAAK,CAAC,EAAE,MAAM,CAAC;QACf,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;IACF,oBAAoB;IACpB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED;;GAEG;AACH,MAAM,WAAW,sBAAsB;IACrC,gDAAgD;IAChD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,0EAA0E;IAC1E,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED;;;GAGG;AACH,qBAAa,eAAe;IAC1B,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,aAAa,CAAU;IAC/B,OAAO,CAAC,gBAAgB,CAAyB;gBAErC,OAAO,GAAE,sBAA2B;IAKhD;;;;OAIG;IACH,cAAc,CAAC,MAAM,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,IAAI,aAAa;IA0ChE;;;;;;OAMG;IACH,iBAAiB,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,GAAG,IAAI;IAwG3E;;;;;;;OAOG;IACH,OAAO,CAAC,qBAAqB;IAqB7B;;;;;;;OAOG;IACH,OAAO,CAAC,qBAAqB;IAgB7B;;;;;OAKG;IACH,OAAO,CAAC,iBAAiB;IAgCzB;;;;;OAKG;IACH,kBAAkB,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,IAAI;IA+B9D;;;;OAIG;IACH,OAAO,CAAC,0BAA0B;IA2BlC;;;;;OAKG;IACH,OAAO,CAAC,oBAAoB;IA0B5B;;;OAGG;IACH,OAAO,CAAC,kBAAkB;IAM1B;;;OAGG;IACH,mBAAmB,IAAI,eAAe,EAAE;IAIxC;;OAEG;IACH,qBAAqB,IAAI,IAAI;IAI7B;;;;;OAKG;IACH,OAAO,CAAC,gBAAgB;IA6CxB;;;;;;OAMG;IACH,OAAO,CAAC,yBAAyB;IA4BjC;;;;;OAKG;IACH,mBAAmB,CAAC,SAAS,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,MAAM,EAAE;IAiChE;;;;OAIG;IACH,OAAO,CAAC,mBAAmB;IAe3B;;;;OAIG;IACH,OAAO,CAAC,yBAAyB;CA+BlC;AAED;;;;GAIG;AACH,wBAAgB,qBAAqB,CACnC,OAAO,CAAC,EAAE,sBAAsB,GAC/B,eAAe,CAEjB"}