@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,489 @@
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 * as path from 'path';
8
+ import { parseMemorySize } from '../shared/config.js';
9
+ import { ProcmanError, createError } from '../shared/errors.js';
10
+ /**
11
+ * Configuration validator class
12
+ * Responsible for validating procman configuration structure and content
13
+ */
14
+ export class ConfigValidator {
15
+ projectRoot;
16
+ collectIssues;
17
+ validationIssues = [];
18
+ constructor(options = {}) {
19
+ this.projectRoot = options.projectRoot || process.cwd();
20
+ this.collectIssues = options.collectIssues || false;
21
+ }
22
+ /**
23
+ * Validate configuration structure and content
24
+ * @param config Configuration object to validate
25
+ * @throws ProcmanError if validation fails
26
+ */
27
+ validateConfig(config) {
28
+ this.validationIssues = []; // Reset issues for new validation
29
+ // Enhanced type guards with better error messages
30
+ if (!this.isValidConfigObject(config)) {
31
+ throw createError('CONFIG_VALIDATION_ERROR', {
32
+ message: this.getConfigTypeErrorMessage(config),
33
+ });
34
+ }
35
+ const configObj = config;
36
+ // Validate apps array exists
37
+ if (!('apps' in configObj)) {
38
+ throw createError('CONFIG_VALIDATION_ERROR', {
39
+ message: 'Configuration must contain an "apps" array',
40
+ });
41
+ }
42
+ // Validate apps is an array
43
+ if (!Array.isArray(configObj.apps)) {
44
+ throw createError('CONFIG_VALIDATION_ERROR', {
45
+ message: 'Configuration "apps" property must be an array',
46
+ });
47
+ }
48
+ // Validate apps array is not empty
49
+ if (configObj.apps.length === 0) {
50
+ throw createError('CONFIG_VALIDATION_ERROR', {
51
+ message: 'Configuration "apps" array cannot be empty',
52
+ });
53
+ }
54
+ // Track app names to check for duplicates
55
+ const appNames = new Set();
56
+ // Validate each app configuration
57
+ configObj.apps.forEach((app, index) => {
58
+ this.validateAppConfig(app, index, appNames);
59
+ });
60
+ }
61
+ /**
62
+ * Validate individual app configuration
63
+ * @param app App configuration to validate
64
+ * @param index Index in the apps array (for error reporting)
65
+ * @param appNames Set to track duplicate names
66
+ * @throws ProcmanError if validation fails
67
+ */
68
+ validateAppConfig(app, index, appNames) {
69
+ // Basic structure check
70
+ if (!app || typeof app !== 'object') {
71
+ throw createError('CONFIG_VALIDATION_ERROR', {
72
+ message: `App configuration at index ${index} must be an object`,
73
+ details: { appIndex: index },
74
+ });
75
+ }
76
+ const appConfig = app;
77
+ // Validate required fields
78
+ this.validateRequiredField(appConfig, 'name', 'string', index);
79
+ this.validateRequiredField(appConfig, 'script', 'string', index);
80
+ // Get name for duplicate checking
81
+ const appName = appConfig.name;
82
+ // Validate name format (must be non-empty and valid identifier)
83
+ if (!appName.trim()) {
84
+ throw createError('CONFIG_VALIDATION_ERROR', {
85
+ message: `App configuration at index ${index}: name cannot be empty`,
86
+ details: { appIndex: index, field: 'name' },
87
+ });
88
+ }
89
+ // Check for valid app name format (alphanumeric, dash, underscore)
90
+ if (!/^[a-zA-Z0-9_-]+$/.test(appName)) {
91
+ throw createError('CONFIG_VALIDATION_ERROR', {
92
+ message: `App configuration at index ${index}: name "${appName}" contains invalid characters. Only alphanumeric, dash, and underscore are allowed`,
93
+ details: { appIndex: index, field: 'name', value: appName },
94
+ });
95
+ }
96
+ // Check for duplicate names
97
+ if (appNames.has(appName)) {
98
+ throw createError('CONFIG_VALIDATION_ERROR', {
99
+ message: `App configuration at index ${index}: duplicate app name "${appName}"`,
100
+ details: { appIndex: index, field: 'name', value: appName },
101
+ });
102
+ }
103
+ appNames.add(appName);
104
+ // Validate script is non-empty
105
+ const script = appConfig.script;
106
+ if (!script.trim()) {
107
+ throw createError('CONFIG_VALIDATION_ERROR', {
108
+ message: `App configuration at index ${index}: script cannot be empty`,
109
+ details: { appIndex: index, field: 'script' },
110
+ });
111
+ }
112
+ // Validate optional fields
113
+ this.validateOptionalField(appConfig, 'namespace', 'string', index);
114
+ this.validateOptionalField(appConfig, 'args', 'string', index);
115
+ this.validateOptionalField(appConfig, 'cwd', 'string', index);
116
+ this.validateOptionalField(appConfig, 'note', 'string', index);
117
+ this.validateOptionalField(appConfig, 'out_log', 'string', index);
118
+ this.validateOptionalField(appConfig, 'error_log', 'string', index);
119
+ this.validateOptionalField(appConfig, 'merge_logs', 'boolean', index);
120
+ this.validateOptionalField(appConfig, 'max_memory_restart', 'string', index);
121
+ // Validate env object if present
122
+ if ('env' in appConfig && appConfig.env !== undefined) {
123
+ this.validateEnvObject(appConfig.env, index);
124
+ }
125
+ // Validate memory size if present
126
+ if ('max_memory_restart' in appConfig && appConfig.max_memory_restart) {
127
+ this.validateMemorySize(appConfig.max_memory_restart, index);
128
+ }
129
+ // Validate script path security
130
+ this.validateScriptPathSecurity(script, index);
131
+ this.validatePathSecurity(script, index, 'script');
132
+ // Validate file paths for security
133
+ if ('cwd' in appConfig && appConfig.cwd) {
134
+ this.validatePathSecurity(appConfig.cwd, index, 'cwd');
135
+ }
136
+ if ('out_log' in appConfig && appConfig.out_log) {
137
+ this.validatePathSecurity(appConfig.out_log, index, 'out_log');
138
+ }
139
+ if ('error_log' in appConfig && appConfig.error_log) {
140
+ this.validatePathSecurity(appConfig.error_log, index, 'error_log');
141
+ }
142
+ if ('log_file' in appConfig && appConfig.log_file) {
143
+ this.validatePathSecurity(appConfig.log_file, index, 'log_file');
144
+ }
145
+ }
146
+ /**
147
+ * Validate required field exists and has correct type
148
+ * @param obj Object to validate
149
+ * @param field Field name
150
+ * @param expectedType Expected type
151
+ * @param appIndex App index for error reporting
152
+ * @throws ProcmanError if validation fails
153
+ */
154
+ validateRequiredField(obj, field, expectedType, appIndex) {
155
+ if (!(field in obj) || obj[field] === undefined || obj[field] === null) {
156
+ throw createError('CONFIG_VALIDATION_ERROR', {
157
+ message: `App configuration at index ${appIndex}: missing required field "${field}"`,
158
+ details: { appIndex, field },
159
+ });
160
+ }
161
+ if (typeof obj[field] !== expectedType) {
162
+ throw createError('CONFIG_VALIDATION_ERROR', {
163
+ message: `App configuration at index ${appIndex}: field "${field}" must be of type ${expectedType}, got ${typeof obj[field]}`,
164
+ details: { appIndex, field, value: String(obj[field]) },
165
+ });
166
+ }
167
+ }
168
+ /**
169
+ * Validate optional field has correct type if present
170
+ * @param obj Object to validate
171
+ * @param field Field name
172
+ * @param expectedType Expected type
173
+ * @param appIndex App index for error reporting
174
+ * @throws ProcmanError if validation fails
175
+ */
176
+ validateOptionalField(obj, field, expectedType, appIndex) {
177
+ if (field in obj && obj[field] !== undefined && obj[field] !== null) {
178
+ if (typeof obj[field] !== expectedType) {
179
+ throw createError('CONFIG_VALIDATION_ERROR', {
180
+ message: `App configuration at index ${appIndex}: field "${field}" must be of type ${expectedType}, got ${typeof obj[field]}`,
181
+ details: { appIndex, field, value: String(obj[field]) },
182
+ });
183
+ }
184
+ }
185
+ }
186
+ /**
187
+ * Validate environment variables object
188
+ * @param env Environment variables object
189
+ * @param appIndex App index for error reporting
190
+ * @throws ProcmanError if validation fails
191
+ */
192
+ validateEnvObject(env, appIndex) {
193
+ if (env === null || env === undefined) {
194
+ return; // Allow null/undefined
195
+ }
196
+ if (typeof env !== 'object' || Array.isArray(env)) {
197
+ throw createError('CONFIG_VALIDATION_ERROR', {
198
+ message: `App configuration at index ${appIndex}: env must be an object`,
199
+ details: { appIndex, field: 'env' },
200
+ });
201
+ }
202
+ const envObj = env;
203
+ for (const [key, value] of Object.entries(envObj)) {
204
+ // Validate environment variable name
205
+ if (!/^[A-Z_][A-Z0-9_]*$/i.test(key)) {
206
+ throw createError('CONFIG_VALIDATION_ERROR', {
207
+ message: `App configuration at index ${appIndex}: Invalid environment variable name "${key}". Use uppercase letters, numbers, and underscores only.`,
208
+ details: { appIndex, field: 'env', value: key },
209
+ });
210
+ }
211
+ // Validate environment variable value (must be string for portability)
212
+ if (typeof value !== 'string') {
213
+ throw createError('CONFIG_VALIDATION_ERROR', {
214
+ message: `App configuration at index ${appIndex}: env["${key}"] must be a string, got ${typeof value}`,
215
+ details: { appIndex, field: 'env', value: key },
216
+ });
217
+ }
218
+ }
219
+ }
220
+ /**
221
+ * Validate memory size format and convert to bytes
222
+ * @param memorySize Memory size string (e.g., "300M", "1G")
223
+ * @param appIndex App index for error reporting
224
+ * @throws ProcmanError if validation fails
225
+ */
226
+ validateMemorySize(memorySize, appIndex) {
227
+ const result = parseMemorySize(memorySize);
228
+ if (!result.success) {
229
+ throw createError('CONFIG_VALIDATION_ERROR', {
230
+ message: `App configuration at index ${appIndex}: invalid memory size format "${memorySize}": ${result.error}`,
231
+ details: { appIndex, field: 'max_memory_restart', value: memorySize },
232
+ });
233
+ }
234
+ const bytes = result.value;
235
+ // Reject very small memory limits (less than 1MB)
236
+ if (bytes < 1024 * 1024) {
237
+ // Less than 1MB
238
+ throw createError('CONFIG_VALIDATION_ERROR', {
239
+ message: `App configuration at index ${appIndex}: Memory limit "${memorySize}" below minimum limit (1MB)`,
240
+ details: { appIndex, field: 'max_memory_restart', value: memorySize },
241
+ });
242
+ }
243
+ // Reject extremely unrealistic memory limits (more than 1EB for boundary testing)
244
+ if (bytes > 1024 * 1024 * 1024 * 1024 * 1024 * 1024) {
245
+ // More than 1EB - clearly unrealistic
246
+ throw createError('CONFIG_VALIDATION_ERROR', {
247
+ message: `App configuration at index ${appIndex}: Memory limit "${memorySize}" exceeds maximum limit (1EB)`,
248
+ details: { appIndex, field: 'max_memory_restart', value: memorySize },
249
+ });
250
+ }
251
+ }
252
+ /**
253
+ * Validate script path for security issues
254
+ * @param scriptPath Script path to validate
255
+ * @param appIndex App index for error reporting
256
+ */
257
+ validateScriptPathSecurity(scriptPath, appIndex) {
258
+ // Check for potentially dangerous script patterns
259
+ const dangerousPatterns = [
260
+ /^\s*sudo\s+/i, // sudo commands
261
+ /^\s*su\s+/i, // su commands
262
+ /[|&;`$(){}]/, // Shell injection characters
263
+ /\beval\b/i, // eval functions
264
+ /\bexec\b/i, // exec functions
265
+ ];
266
+ for (const pattern of dangerousPatterns) {
267
+ if (pattern.test(scriptPath)) {
268
+ this.addValidationIssue({
269
+ severity: 'warning',
270
+ category: 'security',
271
+ message: `Script "${scriptPath}" contains potentially dangerous patterns`,
272
+ location: { appIndex, field: 'script', value: scriptPath },
273
+ suggestion: 'Review script for security implications',
274
+ });
275
+ break;
276
+ }
277
+ }
278
+ }
279
+ /**
280
+ * Validate file path for security issues
281
+ * @param filePath File path to validate
282
+ * @param appIndex App index for error reporting
283
+ * @param fieldName Field name for error reporting
284
+ */
285
+ validatePathSecurity(filePath, appIndex, fieldName) {
286
+ try {
287
+ this.sanitizeFilePath(filePath);
288
+ // For relative paths, ensure they don't escape project boundaries
289
+ if (!path.isAbsolute(filePath)) {
290
+ this.validatePathWithinProject(filePath, this.projectRoot);
291
+ }
292
+ }
293
+ catch (error) {
294
+ if (error instanceof ProcmanError &&
295
+ error.code === 'CONFIG_SECURITY_ERROR') {
296
+ throw createError('CONFIG_VALIDATION_ERROR', {
297
+ message: `App configuration at index ${appIndex}: ${error.message}`,
298
+ details: { appIndex, field: fieldName, value: filePath },
299
+ });
300
+ }
301
+ throw error;
302
+ }
303
+ }
304
+ /**
305
+ * Add validation issue to collection (if enabled)
306
+ * @param issue Validation issue to add
307
+ */
308
+ addValidationIssue(issue) {
309
+ if (this.collectIssues) {
310
+ this.validationIssues.push(issue);
311
+ }
312
+ }
313
+ /**
314
+ * Get collected validation issues
315
+ * @returns Array of validation issues
316
+ */
317
+ getValidationIssues() {
318
+ return [...this.validationIssues];
319
+ }
320
+ /**
321
+ * Clear collected validation issues
322
+ */
323
+ clearValidationIssues() {
324
+ this.validationIssues = [];
325
+ }
326
+ /**
327
+ * Sanitize file path to prevent path traversal attacks
328
+ * @param filePath File path to sanitize
329
+ * @returns Sanitized file path
330
+ * @throws ProcmanError if path is potentially malicious
331
+ */
332
+ sanitizeFilePath(filePath) {
333
+ if (typeof filePath !== 'string') {
334
+ throw createError('CONFIG_SECURITY_ERROR', {
335
+ message: 'File path must be a string',
336
+ });
337
+ }
338
+ const trimmedPath = filePath.trim();
339
+ if (trimmedPath === '') {
340
+ throw createError('CONFIG_SECURITY_ERROR', {
341
+ message: 'File path cannot be empty',
342
+ });
343
+ }
344
+ // Check for null bytes (directory traversal attack)
345
+ if (trimmedPath.includes('\0')) {
346
+ throw createError('CONFIG_SECURITY_ERROR', {
347
+ message: 'File path contains null bytes',
348
+ });
349
+ }
350
+ // Check for suspicious characters
351
+ const suspiciousChars = ['<', '>', '|', '*', '?'];
352
+ for (const char of suspiciousChars) {
353
+ if (trimmedPath.includes(char)) {
354
+ throw createError('CONFIG_SECURITY_ERROR', {
355
+ message: `File path contains suspicious character: ${char}`,
356
+ });
357
+ }
358
+ }
359
+ // Normalize the path to resolve . and .. segments
360
+ const normalizedPath = path.normalize(trimmedPath);
361
+ // Additional check after normalization
362
+ if (normalizedPath !== trimmedPath && normalizedPath.includes('..')) {
363
+ throw createError('CONFIG_SECURITY_ERROR', {
364
+ message: 'Normalized path contains directory traversal patterns',
365
+ });
366
+ }
367
+ return normalizedPath;
368
+ }
369
+ /**
370
+ * Validate that a path stays within the project boundaries
371
+ * @param filePath File path to validate (relative)
372
+ * @param basePath Base path to resolve against
373
+ * @returns Resolved absolute path
374
+ * @throws ProcmanError if path escapes project boundaries
375
+ */
376
+ validatePathWithinProject(filePath, basePath) {
377
+ // Only validate relative paths - absolute paths are allowed as explicit admin choice
378
+ if (path.isAbsolute(filePath)) {
379
+ return filePath;
380
+ }
381
+ // Block relative paths with .. that could escape project
382
+ if (filePath.includes('..')) {
383
+ throw createError('CONFIG_SECURITY_ERROR', {
384
+ message: `Path traversal attack detected: ${filePath}`,
385
+ });
386
+ }
387
+ const resolvedPath = path.resolve(basePath, filePath);
388
+ const normalizedRoot = path.normalize(basePath);
389
+ if (!path.normalize(resolvedPath).startsWith(normalizedRoot)) {
390
+ throw createError('CONFIG_SECURITY_ERROR', {
391
+ message: `Path traversal attack detected - path is outside of the project root: ${filePath}`,
392
+ });
393
+ }
394
+ return resolvedPath;
395
+ }
396
+ /**
397
+ * Generate suggestions for validation errors
398
+ * @param errorCode Error code
399
+ * @param field Field name (optional)
400
+ * @returns Array of suggestions
401
+ */
402
+ generateSuggestions(errorCode, field) {
403
+ const suggestions = [];
404
+ switch (errorCode) {
405
+ case 'CONFIG_VALIDATION_ERROR':
406
+ if (field === 'name') {
407
+ suggestions.push('Use only alphanumeric characters, dashes, and underscores');
408
+ suggestions.push('Ensure the name is unique across all apps');
409
+ }
410
+ else if (field === 'script') {
411
+ suggestions.push('Provide the full command to execute');
412
+ suggestions.push('Use absolute paths for executables if needed');
413
+ }
414
+ else if (field === 'max_memory_restart') {
415
+ suggestions.push('Use format like "300M", "1G", or "512000K"');
416
+ suggestions.push('Ensure the unit (K/M/G) is specified');
417
+ }
418
+ break;
419
+ case 'CONFIG_SECURITY_ERROR':
420
+ suggestions.push('Use relative paths within the project directory');
421
+ suggestions.push('Avoid ".." in paths to prevent directory traversal');
422
+ suggestions.push('Use absolute paths only when explicitly needed');
423
+ break;
424
+ default:
425
+ suggestions.push('Check the configuration documentation');
426
+ suggestions.push('Verify all required fields are present');
427
+ }
428
+ return suggestions;
429
+ }
430
+ /**
431
+ * Enhanced type guard for configuration objects
432
+ * @param config Unknown input to validate
433
+ * @returns Type predicate indicating if config is a valid object
434
+ */
435
+ isValidConfigObject(config) {
436
+ return (config !== null &&
437
+ config !== undefined &&
438
+ typeof config === 'object' &&
439
+ !Array.isArray(config) &&
440
+ // Check for common invalid objects
441
+ !(config instanceof Date) &&
442
+ !(config instanceof RegExp) &&
443
+ !(config instanceof Error));
444
+ }
445
+ /**
446
+ * Generate detailed error message for invalid config types
447
+ * @param config Invalid config to analyze
448
+ * @returns Descriptive error message
449
+ */
450
+ getConfigTypeErrorMessage(config) {
451
+ if (config === null) {
452
+ return 'Configuration cannot be null. Expected an object with an "apps" array.';
453
+ }
454
+ if (config === undefined) {
455
+ return 'Configuration is undefined. Expected an object with an "apps" array.';
456
+ }
457
+ if (Array.isArray(config)) {
458
+ return 'Configuration cannot be an array. Expected an object with an "apps" property.';
459
+ }
460
+ if (typeof config === 'string') {
461
+ return `Configuration cannot be a string ('${config.slice(0, 50)}${config.length > 50 ? '...' : ''}'). Expected an object.`;
462
+ }
463
+ if (typeof config === 'number') {
464
+ return `Configuration cannot be a number (${config}). Expected an object.`;
465
+ }
466
+ if (typeof config === 'boolean') {
467
+ return `Configuration cannot be a boolean (${config}). Expected an object.`;
468
+ }
469
+ if (config instanceof Date) {
470
+ return `Configuration cannot be a Date object (${config.toISOString()}). Expected a plain object.`;
471
+ }
472
+ if (config instanceof Error) {
473
+ return `Configuration cannot be an Error object (${config.message}). Expected a plain object.`;
474
+ }
475
+ if (typeof config === 'function') {
476
+ return 'Configuration cannot be a function. Expected an object.';
477
+ }
478
+ return `Configuration must be a plain object, got ${typeof config}.`;
479
+ }
480
+ }
481
+ /**
482
+ * Create a new configuration validator instance
483
+ * @param options Validator options
484
+ * @returns ConfigValidator instance
485
+ */
486
+ export function createConfigValidator(options) {
487
+ return new ConfigValidator(options);
488
+ }
489
+ //# sourceMappingURL=config-validator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config-validator.js","sourceRoot":"","sources":["../../../src/config/config-validator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,161 @@
1
+ /**
2
+ * Configuration Watcher
3
+ *
4
+ * Handles file watching functionality for procman configuration files.
5
+ * Provides change detection and notification capabilities.
6
+ */
7
+ import { EventEmitter } from 'events';
8
+ /**
9
+ * File change event types
10
+ */
11
+ export type FileChangeEvent = 'change' | 'rename';
12
+ /**
13
+ * Watch callback function type
14
+ */
15
+ export type WatchCallback = (event: FileChangeEvent, filename?: string) => void;
16
+ /**
17
+ * ConfigWatcher event types
18
+ */
19
+ export interface ConfigWatcherEvents {
20
+ configChanged: (filePath: string) => void;
21
+ }
22
+ /**
23
+ * Watcher disposal interface
24
+ */
25
+ export interface WatcherDisposal {
26
+ dispose: () => void;
27
+ }
28
+ /**
29
+ * Configuration watcher options
30
+ */
31
+ export interface ConfigWatcherOptions {
32
+ /** Polling interval for file watching in milliseconds (default: 1000) */
33
+ interval?: number;
34
+ /** Whether to watch for file existence changes (default: true) */
35
+ persistent?: boolean;
36
+ }
37
+ /**
38
+ * Configuration watcher class
39
+ * Responsible for monitoring configuration file changes
40
+ */
41
+ export declare class ConfigWatcher extends EventEmitter {
42
+ private fileWatchers;
43
+ private interval;
44
+ private persistent;
45
+ constructor(options?: ConfigWatcherOptions);
46
+ /**
47
+ * Watch a configuration file for changes
48
+ * @param filePath Path to configuration file to watch
49
+ * @param callback Callback function for change events
50
+ * @returns Disposal object to stop watching
51
+ */
52
+ watchConfig(filePath: string, callback: WatchCallback): WatcherDisposal;
53
+ /**
54
+ * Watch multiple configuration files
55
+ * @param filePaths Array of file paths to watch
56
+ * @param callback Callback function for change events
57
+ * @returns Disposal object to stop watching all files
58
+ */
59
+ watchMultiple(filePaths: string[], callback: WatchCallback): WatcherDisposal;
60
+ /**
61
+ * Stop watching a configuration file
62
+ * @param filePath Path to stop watching
63
+ */
64
+ stopWatching(filePath: string): void;
65
+ /**
66
+ * Stop watching all configuration files
67
+ */
68
+ stopAllWatching(): void;
69
+ /**
70
+ * Check if a file is currently being watched
71
+ * @param filePath Path to check
72
+ * @returns True if file is being watched
73
+ */
74
+ isWatching(filePath: string): boolean;
75
+ /**
76
+ * Get list of all watched file paths
77
+ * @returns Array of watched file paths
78
+ */
79
+ getWatchedFiles(): string[];
80
+ /**
81
+ * Check if configuration file has changed since last check
82
+ * @param filePath Path to configuration file
83
+ * @param lastCheckTime Timestamp of last check
84
+ * @returns Promise resolving to true if file has changed
85
+ */
86
+ hasConfigChanged(filePath: string, lastCheckTime: number): Promise<boolean>;
87
+ /**
88
+ * Get file modification time
89
+ * @param filePath Path to file
90
+ * @returns Promise resolving to modification time timestamp
91
+ */
92
+ getFileModTime(filePath: string): Promise<number>;
93
+ /**
94
+ * Watch for configuration changes with debouncing
95
+ * @param filePath Path to configuration file
96
+ * @param callback Callback function for change events
97
+ * @param debounceMs Debounce delay in milliseconds (default: 100)
98
+ * @returns Disposal object to stop watching
99
+ */
100
+ watchConfigDebounced(filePath: string, callback: WatchCallback, debounceMs?: number): WatcherDisposal;
101
+ /**
102
+ * Listen for configuration change events (type-safe version)
103
+ * @param event Event name
104
+ * @param listener Event listener function
105
+ */
106
+ on<K extends keyof ConfigWatcherEvents>(event: K, listener: ConfigWatcherEvents[K]): this;
107
+ on(event: string | symbol, listener: (...args: unknown[]) => void): this;
108
+ /**
109
+ * Remove configuration change event listener (type-safe version)
110
+ * @param event Event name
111
+ * @param listener Event listener function
112
+ */
113
+ off<K extends keyof ConfigWatcherEvents>(event: K, listener: ConfigWatcherEvents[K]): this;
114
+ off(event: string | symbol, listener: (...args: unknown[]) => void): this;
115
+ /**
116
+ * Dispose of all watchers and cleanup resources
117
+ */
118
+ dispose(): void;
119
+ /**
120
+ * Get resource usage information
121
+ * @returns Object with watcher count and memory usage
122
+ */
123
+ getResourceUsage(): {
124
+ watcherCount: number;
125
+ watchedFiles: string[];
126
+ memoryUsage: ReturnType<typeof process.memoryUsage>;
127
+ };
128
+ /**
129
+ * Set polling interval for file watching
130
+ * @param interval New interval in milliseconds
131
+ */
132
+ setInterval(interval: number): void;
133
+ /**
134
+ * Get current polling interval
135
+ * @returns Current interval in milliseconds
136
+ */
137
+ getInterval(): number;
138
+ /**
139
+ * Enable or disable persistent watching
140
+ * @param persistent Whether to keep the process alive for watching
141
+ */
142
+ setPersistent(persistent: boolean): void;
143
+ /**
144
+ * Check if persistent watching is enabled
145
+ * @returns True if persistent watching is enabled
146
+ */
147
+ isPersistent(): boolean;
148
+ /**
149
+ * Create backup of configuration file
150
+ * @param filePath Path to configuration file
151
+ * @returns Path to backup file
152
+ */
153
+ createBackup(filePath: string): Promise<string>;
154
+ }
155
+ /**
156
+ * Create a new configuration watcher instance
157
+ * @param options Watcher options
158
+ * @returns ConfigWatcher instance
159
+ */
160
+ export declare function createConfigWatcher(options?: ConfigWatcherOptions): ConfigWatcher;
161
+ //# sourceMappingURL=config-watcher.d.ts.map