@jahia/jahia-cli 0.1.4 → 0.3.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 (348) hide show
  1. package/README.md +271 -56
  2. package/bin/dev.js +5 -1
  3. package/dist/commands/config/init.d.ts +12 -0
  4. package/dist/commands/config/init.d.ts.map +1 -0
  5. package/dist/commands/config/init.js +76 -0
  6. package/dist/commands/config/init.js.map +1 -0
  7. package/dist/commands/environment/create.d.ts +27 -0
  8. package/dist/commands/environment/create.d.ts.map +1 -0
  9. package/dist/commands/environment/create.js +192 -0
  10. package/dist/commands/environment/create.js.map +1 -0
  11. package/dist/commands/environment/delete.d.ts +12 -0
  12. package/dist/commands/environment/delete.d.ts.map +1 -0
  13. package/dist/commands/environment/delete.js +69 -0
  14. package/dist/commands/environment/delete.js.map +1 -0
  15. package/dist/commands/environment/doctor.d.ts +13 -0
  16. package/dist/commands/environment/doctor.d.ts.map +1 -0
  17. package/dist/commands/environment/doctor.js +63 -0
  18. package/dist/commands/environment/doctor.js.map +1 -0
  19. package/dist/commands/environment/export.d.ts +35 -0
  20. package/dist/commands/environment/export.d.ts.map +1 -0
  21. package/dist/commands/environment/export.js +127 -0
  22. package/dist/commands/environment/export.js.map +1 -0
  23. package/dist/commands/environment/list.d.ts +11 -0
  24. package/dist/commands/environment/list.d.ts.map +1 -0
  25. package/dist/commands/environment/list.js +70 -0
  26. package/dist/commands/environment/list.js.map +1 -0
  27. package/dist/commands/environment/logs.d.ts +13 -0
  28. package/dist/commands/environment/logs.d.ts.map +1 -0
  29. package/dist/commands/environment/logs.js +77 -0
  30. package/dist/commands/environment/logs.js.map +1 -0
  31. package/dist/commands/environment/start.d.ts +12 -0
  32. package/dist/commands/environment/start.d.ts.map +1 -0
  33. package/dist/commands/environment/start.js +71 -0
  34. package/dist/commands/environment/start.js.map +1 -0
  35. package/dist/commands/environment/stop.d.ts +12 -0
  36. package/dist/commands/environment/stop.d.ts.map +1 -0
  37. package/dist/commands/environment/stop.js +71 -0
  38. package/dist/commands/environment/stop.js.map +1 -0
  39. package/dist/commands/init.d.ts +39 -0
  40. package/dist/commands/init.d.ts.map +1 -0
  41. package/dist/commands/init.js +178 -0
  42. package/dist/commands/init.js.map +1 -0
  43. package/dist/commands/jahia/alive.d.ts +18 -0
  44. package/dist/commands/jahia/alive.d.ts.map +1 -0
  45. package/dist/commands/jahia/alive.js +118 -0
  46. package/dist/commands/jahia/alive.js.map +1 -0
  47. package/dist/commands/jahia/provision.d.ts +68 -0
  48. package/dist/commands/jahia/provision.d.ts.map +1 -0
  49. package/dist/commands/jahia/provision.js +352 -0
  50. package/dist/commands/jahia/provision.js.map +1 -0
  51. package/dist/commands/tests/artifacts.d.ts +25 -0
  52. package/dist/commands/tests/artifacts.d.ts.map +1 -0
  53. package/dist/commands/tests/artifacts.js +112 -0
  54. package/dist/commands/tests/artifacts.js.map +1 -0
  55. package/dist/commands/tests/build.d.ts +30 -0
  56. package/dist/commands/tests/build.d.ts.map +1 -0
  57. package/dist/commands/tests/build.js +90 -0
  58. package/dist/commands/tests/build.js.map +1 -0
  59. package/dist/commands/tests/init.d.ts +56 -0
  60. package/dist/commands/tests/init.d.ts.map +1 -0
  61. package/dist/commands/tests/init.js +195 -0
  62. package/dist/commands/tests/init.js.map +1 -0
  63. package/dist/commands/tests/run.d.ts +28 -0
  64. package/dist/commands/tests/run.d.ts.map +1 -0
  65. package/dist/commands/tests/run.js +166 -0
  66. package/dist/commands/tests/run.js.map +1 -0
  67. package/dist/commands/workflow/init.d.ts +21 -0
  68. package/dist/commands/workflow/init.d.ts.map +1 -0
  69. package/dist/commands/workflow/init.js +84 -0
  70. package/dist/commands/workflow/init.js.map +1 -0
  71. package/dist/commands/workflow/run.d.ts +22 -0
  72. package/dist/commands/workflow/run.d.ts.map +1 -0
  73. package/dist/commands/workflow/run.js +111 -0
  74. package/dist/commands/workflow/run.js.map +1 -0
  75. package/dist/lib/artifacts/collect-all.d.ts +17 -0
  76. package/dist/lib/artifacts/collect-all.d.ts.map +1 -0
  77. package/dist/lib/artifacts/collect-all.js +107 -0
  78. package/dist/lib/artifacts/collect-all.js.map +1 -0
  79. package/dist/lib/artifacts/copy-container-artifacts.d.ts +13 -0
  80. package/dist/lib/artifacts/copy-container-artifacts.d.ts.map +1 -0
  81. package/dist/lib/artifacts/copy-container-artifacts.js +48 -0
  82. package/dist/lib/artifacts/copy-container-artifacts.js.map +1 -0
  83. package/dist/lib/artifacts/fetch-container-logs.d.ts +17 -0
  84. package/dist/lib/artifacts/fetch-container-logs.d.ts.map +1 -0
  85. package/dist/lib/artifacts/fetch-container-logs.js +36 -0
  86. package/dist/lib/artifacts/fetch-container-logs.js.map +1 -0
  87. package/dist/lib/artifacts/index.d.ts +6 -0
  88. package/dist/lib/artifacts/index.d.ts.map +1 -0
  89. package/dist/lib/artifacts/index.js +5 -0
  90. package/dist/lib/artifacts/index.js.map +1 -0
  91. package/dist/lib/artifacts/query-vlogs.d.ts +14 -0
  92. package/dist/lib/artifacts/query-vlogs.d.ts.map +1 -0
  93. package/dist/lib/artifacts/query-vlogs.js +33 -0
  94. package/dist/lib/artifacts/query-vlogs.js.map +1 -0
  95. package/dist/lib/artifacts/types.d.ts +28 -0
  96. package/dist/lib/artifacts/types.d.ts.map +1 -0
  97. package/dist/lib/artifacts/types.js +2 -0
  98. package/dist/lib/artifacts/types.js.map +1 -0
  99. package/dist/lib/components/cypress.d.ts +16 -0
  100. package/dist/lib/components/cypress.d.ts.map +1 -0
  101. package/dist/lib/components/cypress.js +35 -0
  102. package/dist/lib/components/cypress.js.map +1 -0
  103. package/dist/lib/components/index.d.ts +59 -0
  104. package/dist/lib/components/index.d.ts.map +1 -0
  105. package/dist/lib/components/index.js +114 -0
  106. package/dist/lib/components/index.js.map +1 -0
  107. package/dist/lib/components/jahia.d.ts +3 -0
  108. package/dist/lib/components/jahia.d.ts.map +1 -0
  109. package/dist/lib/components/jahia.js +38 -0
  110. package/dist/lib/components/jahia.js.map +1 -0
  111. package/dist/lib/components/smtp-server.d.ts +3 -0
  112. package/dist/lib/components/smtp-server.d.ts.map +1 -0
  113. package/dist/lib/components/smtp-server.js +30 -0
  114. package/dist/lib/components/smtp-server.js.map +1 -0
  115. package/dist/lib/components/types.d.ts +101 -0
  116. package/dist/lib/components/types.d.ts.map +1 -0
  117. package/dist/lib/components/types.js +2 -0
  118. package/dist/lib/components/types.js.map +1 -0
  119. package/dist/lib/components/victorialogs.d.ts +3 -0
  120. package/dist/lib/components/victorialogs.d.ts.map +1 -0
  121. package/dist/lib/components/victorialogs.js +29 -0
  122. package/dist/lib/components/victorialogs.js.map +1 -0
  123. package/dist/lib/config/build-blank-config.d.ts +6 -0
  124. package/dist/lib/config/build-blank-config.d.ts.map +1 -0
  125. package/dist/lib/config/build-blank-config.js +19 -0
  126. package/dist/lib/config/build-blank-config.js.map +1 -0
  127. package/dist/lib/config/config-to-yaml-with-comments.d.ts +11 -0
  128. package/dist/lib/config/config-to-yaml-with-comments.d.ts.map +1 -0
  129. package/dist/lib/config/config-to-yaml-with-comments.js +87 -0
  130. package/dist/lib/config/config-to-yaml-with-comments.js.map +1 -0
  131. package/dist/lib/config/config-to-yaml.d.ts +7 -0
  132. package/dist/lib/config/config-to-yaml.d.ts.map +1 -0
  133. package/dist/lib/config/config-to-yaml.js +37 -0
  134. package/dist/lib/config/config-to-yaml.js.map +1 -0
  135. package/dist/lib/config/defaults.d.ts +15 -0
  136. package/dist/lib/config/defaults.d.ts.map +1 -0
  137. package/dist/lib/config/defaults.js +19 -0
  138. package/dist/lib/config/defaults.js.map +1 -0
  139. package/dist/lib/config/export-config.d.ts +15 -0
  140. package/dist/lib/config/export-config.d.ts.map +1 -0
  141. package/dist/lib/config/export-config.js +27 -0
  142. package/dist/lib/config/export-config.js.map +1 -0
  143. package/dist/lib/config/initialize-config-file.d.ts +12 -0
  144. package/dist/lib/config/initialize-config-file.d.ts.map +1 -0
  145. package/dist/lib/config/initialize-config-file.js +16 -0
  146. package/dist/lib/config/initialize-config-file.js.map +1 -0
  147. package/dist/lib/config/parser.d.ts +59 -0
  148. package/dist/lib/config/parser.d.ts.map +1 -0
  149. package/dist/lib/config/parser.js +281 -0
  150. package/dist/lib/config/parser.js.map +1 -0
  151. package/dist/lib/config/resolve-env-vars.d.ts +29 -0
  152. package/dist/lib/config/resolve-env-vars.d.ts.map +1 -0
  153. package/dist/lib/config/resolve-env-vars.js +47 -0
  154. package/dist/lib/config/resolve-env-vars.js.map +1 -0
  155. package/dist/lib/config/types.d.ts +120 -0
  156. package/dist/lib/config/types.d.ts.map +1 -0
  157. package/dist/lib/config/types.js +2 -0
  158. package/dist/lib/config/types.js.map +1 -0
  159. package/dist/lib/config/with-tests-version.d.ts +6 -0
  160. package/dist/lib/config/with-tests-version.d.ts.map +1 -0
  161. package/dist/lib/config/with-tests-version.js +11 -0
  162. package/dist/lib/config/with-tests-version.js.map +1 -0
  163. package/dist/lib/output/formatter.d.ts +38 -0
  164. package/dist/lib/output/formatter.d.ts.map +1 -0
  165. package/dist/lib/output/formatter.js +172 -0
  166. package/dist/lib/output/formatter.js.map +1 -0
  167. package/dist/lib/providers/docker/container.d.ts +63 -0
  168. package/dist/lib/providers/docker/container.d.ts.map +1 -0
  169. package/dist/lib/providers/docker/container.js +105 -0
  170. package/dist/lib/providers/docker/container.js.map +1 -0
  171. package/dist/lib/providers/docker/get-container-logs.d.ts +5 -0
  172. package/dist/lib/providers/docker/get-container-logs.d.ts.map +1 -0
  173. package/dist/lib/providers/docker/get-container-logs.js +17 -0
  174. package/dist/lib/providers/docker/get-container-logs.js.map +1 -0
  175. package/dist/lib/providers/docker/index.d.ts +8 -0
  176. package/dist/lib/providers/docker/index.d.ts.map +1 -0
  177. package/dist/lib/providers/docker/index.js +424 -0
  178. package/dist/lib/providers/docker/index.js.map +1 -0
  179. package/dist/lib/providers/docker/network.d.ts +17 -0
  180. package/dist/lib/providers/docker/network.d.ts.map +1 -0
  181. package/dist/lib/providers/docker/network.js +36 -0
  182. package/dist/lib/providers/docker/network.js.map +1 -0
  183. package/dist/lib/providers/docker/start-container.d.ts +5 -0
  184. package/dist/lib/providers/docker/start-container.d.ts.map +1 -0
  185. package/dist/lib/providers/docker/start-container.js +10 -0
  186. package/dist/lib/providers/docker/start-container.js.map +1 -0
  187. package/dist/lib/providers/docker/stop-container.d.ts +5 -0
  188. package/dist/lib/providers/docker/stop-container.d.ts.map +1 -0
  189. package/dist/lib/providers/docker/stop-container.js +10 -0
  190. package/dist/lib/providers/docker/stop-container.js.map +1 -0
  191. package/dist/lib/providers/docker/volume.d.ts +13 -0
  192. package/dist/lib/providers/docker/volume.d.ts.map +1 -0
  193. package/dist/lib/providers/docker/volume.js +23 -0
  194. package/dist/lib/providers/docker/volume.js.map +1 -0
  195. package/dist/lib/providers/index.d.ts +13 -0
  196. package/dist/lib/providers/index.d.ts.map +1 -0
  197. package/dist/lib/providers/index.js +22 -0
  198. package/dist/lib/providers/index.js.map +1 -0
  199. package/dist/lib/providers/jahiacloudv1/index.d.ts +7 -0
  200. package/dist/lib/providers/jahiacloudv1/index.d.ts.map +1 -0
  201. package/dist/lib/providers/jahiacloudv1/index.js +16 -0
  202. package/dist/lib/providers/jahiacloudv1/index.js.map +1 -0
  203. package/dist/lib/providers/types.d.ts +84 -0
  204. package/dist/lib/providers/types.d.ts.map +1 -0
  205. package/dist/lib/providers/types.js +2 -0
  206. package/dist/lib/providers/types.js.map +1 -0
  207. package/dist/lib/provisioning/detect-manifest-source.d.ts +7 -0
  208. package/dist/lib/provisioning/detect-manifest-source.d.ts.map +1 -0
  209. package/dist/lib/provisioning/detect-manifest-source.js +6 -0
  210. package/dist/lib/provisioning/detect-manifest-source.js.map +1 -0
  211. package/dist/lib/provisioning/fetch-manifest.d.ts +9 -0
  212. package/dist/lib/provisioning/fetch-manifest.d.ts.map +1 -0
  213. package/dist/lib/provisioning/fetch-manifest.js +17 -0
  214. package/dist/lib/provisioning/fetch-manifest.js.map +1 -0
  215. package/dist/lib/provisioning/filter-files.d.ts +7 -0
  216. package/dist/lib/provisioning/filter-files.d.ts.map +1 -0
  217. package/dist/lib/provisioning/filter-files.js +14 -0
  218. package/dist/lib/provisioning/filter-files.js.map +1 -0
  219. package/dist/lib/provisioning/read-manifest.d.ts +9 -0
  220. package/dist/lib/provisioning/read-manifest.d.ts.map +1 -0
  221. package/dist/lib/provisioning/read-manifest.js +12 -0
  222. package/dist/lib/provisioning/read-manifest.js.map +1 -0
  223. package/dist/lib/provisioning/resolve-asset-paths.d.ts +7 -0
  224. package/dist/lib/provisioning/resolve-asset-paths.d.ts.map +1 -0
  225. package/dist/lib/provisioning/resolve-asset-paths.js +22 -0
  226. package/dist/lib/provisioning/resolve-asset-paths.js.map +1 -0
  227. package/dist/lib/provisioning/submit-file-action.d.ts +29 -0
  228. package/dist/lib/provisioning/submit-file-action.d.ts.map +1 -0
  229. package/dist/lib/provisioning/submit-file-action.js +75 -0
  230. package/dist/lib/provisioning/submit-file-action.js.map +1 -0
  231. package/dist/lib/provisioning/submit-provisioning.d.ts +12 -0
  232. package/dist/lib/provisioning/submit-provisioning.d.ts.map +1 -0
  233. package/dist/lib/provisioning/submit-provisioning.js +70 -0
  234. package/dist/lib/provisioning/submit-provisioning.js.map +1 -0
  235. package/dist/lib/provisioning/types.d.ts +45 -0
  236. package/dist/lib/provisioning/types.d.ts.map +1 -0
  237. package/dist/lib/provisioning/types.js +2 -0
  238. package/dist/lib/provisioning/types.js.map +1 -0
  239. package/dist/lib/sam/index.d.ts +4 -0
  240. package/dist/lib/sam/index.d.ts.map +1 -0
  241. package/dist/lib/sam/index.js +3 -0
  242. package/dist/lib/sam/index.js.map +1 -0
  243. package/dist/lib/sam/query-sam-status.d.ts +6 -0
  244. package/dist/lib/sam/query-sam-status.d.ts.map +1 -0
  245. package/dist/lib/sam/query-sam-status.js +54 -0
  246. package/dist/lib/sam/query-sam-status.js.map +1 -0
  247. package/dist/lib/sam/types.d.ts +41 -0
  248. package/dist/lib/sam/types.d.ts.map +1 -0
  249. package/dist/lib/sam/types.js +2 -0
  250. package/dist/lib/sam/types.js.map +1 -0
  251. package/dist/lib/sam/wait-for-sam.d.ts +7 -0
  252. package/dist/lib/sam/wait-for-sam.d.ts.map +1 -0
  253. package/dist/lib/sam/wait-for-sam.js +31 -0
  254. package/dist/lib/sam/wait-for-sam.js.map +1 -0
  255. package/dist/lib/state/delete-state.d.ts +6 -0
  256. package/dist/lib/state/delete-state.d.ts.map +1 -0
  257. package/dist/lib/state/delete-state.js +16 -0
  258. package/dist/lib/state/delete-state.js.map +1 -0
  259. package/dist/lib/state/get-active-environment.d.ts +6 -0
  260. package/dist/lib/state/get-active-environment.d.ts.map +1 -0
  261. package/dist/lib/state/get-active-environment.js +9 -0
  262. package/dist/lib/state/get-active-environment.js.map +1 -0
  263. package/dist/lib/state/get-jahia-connection-defaults.d.ts +16 -0
  264. package/dist/lib/state/get-jahia-connection-defaults.d.ts.map +1 -0
  265. package/dist/lib/state/get-jahia-connection-defaults.js +28 -0
  266. package/dist/lib/state/get-jahia-connection-defaults.js.map +1 -0
  267. package/dist/lib/state/has-active-environment.d.ts +5 -0
  268. package/dist/lib/state/has-active-environment.d.ts.map +1 -0
  269. package/dist/lib/state/has-active-environment.js +9 -0
  270. package/dist/lib/state/has-active-environment.js.map +1 -0
  271. package/dist/lib/state/index.d.ts +11 -0
  272. package/dist/lib/state/index.d.ts.map +1 -0
  273. package/dist/lib/state/index.js +9 -0
  274. package/dist/lib/state/index.js.map +1 -0
  275. package/dist/lib/state/load-state.d.ts +7 -0
  276. package/dist/lib/state/load-state.d.ts.map +1 -0
  277. package/dist/lib/state/load-state.js +17 -0
  278. package/dist/lib/state/load-state.js.map +1 -0
  279. package/dist/lib/state/reconcile-with-docker.d.ts +19 -0
  280. package/dist/lib/state/reconcile-with-docker.d.ts.map +1 -0
  281. package/dist/lib/state/reconcile-with-docker.js +36 -0
  282. package/dist/lib/state/reconcile-with-docker.js.map +1 -0
  283. package/dist/lib/state/save-state.d.ts +7 -0
  284. package/dist/lib/state/save-state.d.ts.map +1 -0
  285. package/dist/lib/state/save-state.js +13 -0
  286. package/dist/lib/state/save-state.js.map +1 -0
  287. package/dist/lib/state/state-file-path.d.ts +8 -0
  288. package/dist/lib/state/state-file-path.d.ts.map +1 -0
  289. package/dist/lib/state/state-file-path.js +14 -0
  290. package/dist/lib/state/state-file-path.js.map +1 -0
  291. package/dist/lib/state/state-flag.d.ts +6 -0
  292. package/dist/lib/state/state-flag.d.ts.map +1 -0
  293. package/dist/lib/state/state-flag.js +12 -0
  294. package/dist/lib/state/state-flag.js.map +1 -0
  295. package/dist/lib/state/types.d.ts +30 -0
  296. package/dist/lib/state/types.d.ts.map +1 -0
  297. package/dist/lib/state/types.js +2 -0
  298. package/dist/lib/state/types.js.map +1 -0
  299. package/dist/lib/tests/build-image.d.ts +33 -0
  300. package/dist/lib/tests/build-image.d.ts.map +1 -0
  301. package/dist/lib/tests/build-image.js +59 -0
  302. package/dist/lib/tests/build-image.js.map +1 -0
  303. package/dist/lib/tests/clone-scaffolding.d.ts +16 -0
  304. package/dist/lib/tests/clone-scaffolding.d.ts.map +1 -0
  305. package/dist/lib/tests/clone-scaffolding.js +64 -0
  306. package/dist/lib/tests/clone-scaffolding.js.map +1 -0
  307. package/dist/lib/tests/exclusion-list.d.ts +11 -0
  308. package/dist/lib/tests/exclusion-list.d.ts.map +1 -0
  309. package/dist/lib/tests/exclusion-list.js +19 -0
  310. package/dist/lib/tests/exclusion-list.js.map +1 -0
  311. package/dist/lib/tests/gitignore-manager.d.ts +21 -0
  312. package/dist/lib/tests/gitignore-manager.d.ts.map +1 -0
  313. package/dist/lib/tests/gitignore-manager.js +47 -0
  314. package/dist/lib/tests/gitignore-manager.js.map +1 -0
  315. package/dist/lib/tests/index.d.ts +6 -0
  316. package/dist/lib/tests/index.d.ts.map +1 -0
  317. package/dist/lib/tests/index.js +5 -0
  318. package/dist/lib/tests/index.js.map +1 -0
  319. package/dist/lib/tests/sync-missing-files.d.ts +3 -0
  320. package/dist/lib/tests/sync-missing-files.d.ts.map +1 -0
  321. package/dist/lib/tests/sync-missing-files.js +65 -0
  322. package/dist/lib/tests/sync-missing-files.js.map +1 -0
  323. package/dist/lib/tests/types.d.ts +26 -0
  324. package/dist/lib/tests/types.d.ts.map +1 -0
  325. package/dist/lib/tests/types.js +2 -0
  326. package/dist/lib/tests/types.js.map +1 -0
  327. package/dist/lib/workflow/build-sample-workflow.d.ts +8 -0
  328. package/dist/lib/workflow/build-sample-workflow.d.ts.map +1 -0
  329. package/dist/lib/workflow/build-sample-workflow.js +39 -0
  330. package/dist/lib/workflow/build-sample-workflow.js.map +1 -0
  331. package/dist/lib/workflow/executor.d.ts +23 -0
  332. package/dist/lib/workflow/executor.d.ts.map +1 -0
  333. package/dist/lib/workflow/executor.js +129 -0
  334. package/dist/lib/workflow/executor.js.map +1 -0
  335. package/dist/lib/workflow/merge-workflow-into-config.d.ts +7 -0
  336. package/dist/lib/workflow/merge-workflow-into-config.d.ts.map +1 -0
  337. package/dist/lib/workflow/merge-workflow-into-config.js +9 -0
  338. package/dist/lib/workflow/merge-workflow-into-config.js.map +1 -0
  339. package/dist/lib/workflow/resolve-workflow.d.ts +20 -0
  340. package/dist/lib/workflow/resolve-workflow.d.ts.map +1 -0
  341. package/dist/lib/workflow/resolve-workflow.js +38 -0
  342. package/dist/lib/workflow/resolve-workflow.js.map +1 -0
  343. package/dist/lib/workflow/types.d.ts +30 -0
  344. package/dist/lib/workflow/types.d.ts.map +1 -0
  345. package/dist/lib/workflow/types.js +25 -0
  346. package/dist/lib/workflow/types.js.map +1 -0
  347. package/oclif.manifest.json +1057 -1
  348. package/package.json +11 -4
@@ -0,0 +1,166 @@
1
+ import { resolve } from 'node:path';
2
+ import { Command, Flags } from '@oclif/core';
3
+ import { execa } from 'execa';
4
+ import { applyEnvInjections, getComponent, resolveComponent } from '../../lib/components/index.js';
5
+ import { loadConfigFile } from '../../lib/config/parser.js';
6
+ import { buildRunArgs, containerName, removeContainer } from '../../lib/providers/docker/container.js';
7
+ import { getActiveEnvironment } from '../../lib/state/get-active-environment.js';
8
+ import { stateFilePath } from '../../lib/state/state-file-path.js';
9
+ import { stateFlag } from '../../lib/state/state-flag.js';
10
+ import { DEFAULT_IMAGE_NAME, parseKeyValueArgs } from '../../lib/tests/build-image.js';
11
+ /**
12
+ * Formats a human-readable test run start message.
13
+ */
14
+ export const formatRunStart = (image, network, name) => [
15
+ `▶ Running tests`,
16
+ ` Image: ${image}`,
17
+ ` Network: ${network}`,
18
+ ` Container: ${name}`,
19
+ '',
20
+ ].join('\n');
21
+ /**
22
+ * Formats a human-readable test completion message.
23
+ */
24
+ export const formatRunComplete = (name, exitCode) => {
25
+ const icon = exitCode === 0 ? '✓' : '✗';
26
+ const status = exitCode === 0 ? 'passed' : `failed (exit code ${String(exitCode)})`;
27
+ return `${icon} Tests ${status}\n Container "${name}" kept for inspection`;
28
+ };
29
+ /**
30
+ * Builds a ResolvedComponent for the cypress test runner using the component registry.
31
+ * Reads image/tag from tests.container config and applies env injections from sibling components.
32
+ */
33
+ export const buildCypressComponent = (envComponents, containerConfig, scaffoldingVersion, extraEnv) => {
34
+ const definition = getComponent('cypress');
35
+ if (definition === undefined) {
36
+ throw new Error('cypress component not found in registry');
37
+ }
38
+ const imageOverride = containerConfig?.image ?? DEFAULT_IMAGE_NAME;
39
+ const tagOverride = containerConfig?.tag ?? scaffoldingVersion ?? 'latest';
40
+ const resolved = resolveComponent(definition, {
41
+ image: `${imageOverride}:${tagOverride}`,
42
+ env: extraEnv,
43
+ });
44
+ // Build sibling components (from persisted env) to apply envInjections
45
+ const siblings = envComponents
46
+ .map((name) => {
47
+ const def = getComponent(name);
48
+ return def !== undefined ? resolveComponent(def) : undefined;
49
+ })
50
+ .filter((c) => c !== undefined);
51
+ const allComponents = [...siblings, resolved];
52
+ const injected = applyEnvInjections(allComponents);
53
+ // Return the cypress component with injections applied
54
+ const cypressResult = injected[injected.length - 1];
55
+ if (cypressResult === undefined) {
56
+ throw new Error('Failed to resolve cypress component after env injection');
57
+ }
58
+ return cypressResult;
59
+ };
60
+ export default class TestsRun extends Command {
61
+ static description = 'Run the test Docker image against an active environment. ' +
62
+ 'The container attaches to the environment network, streams output in real-time, ' +
63
+ 'and the CLI exits with the container exit code. Container is kept after completion for debugging.';
64
+ static examples = [
65
+ '<%= config.bin %> tests run -c config.yml',
66
+ '<%= config.bin %> tests run -c config.yml --env CYPRESS_SPEC=cypress/e2e/login.cy.ts',
67
+ '<%= config.bin %> tests run -c config.yml --state /ci/workspace/state.json --json',
68
+ ];
69
+ static flags = {
70
+ config: Flags.string({
71
+ char: 'c',
72
+ description: 'Path to jahia-cli config file',
73
+ required: true,
74
+ }),
75
+ state: stateFlag,
76
+ env: Flags.string({
77
+ char: 'e',
78
+ description: 'Additional env var for test container (KEY=VALUE, repeatable). Supports ${VAR:-default}.',
79
+ multiple: true,
80
+ }),
81
+ json: Flags.boolean({
82
+ description: 'Output result as structured JSON',
83
+ default: false,
84
+ }),
85
+ };
86
+ async run() {
87
+ const { flags } = await this.parse(TestsRun);
88
+ const statePath = stateFilePath(flags.state);
89
+ try {
90
+ const activeEnv = await getActiveEnvironment(statePath);
91
+ if (activeEnv === undefined) {
92
+ throw new Error('No active environment found. Create one with "environment create" first.');
93
+ }
94
+ if (activeEnv.provider !== 'docker') {
95
+ throw new Error(`tests run requires a Docker environment. Current provider: ${activeEnv.provider}`);
96
+ }
97
+ const config = await loadConfigFile(resolve(flags.config));
98
+ const containerConfig = config.tests?.container;
99
+ const userEnv = flags.env !== undefined
100
+ ? parseKeyValueArgs(flags.env)
101
+ : {};
102
+ const component = buildCypressComponent(activeEnv.components.map((c) => c.name), containerConfig, config.tests?.scaffolding?.version, userEnv);
103
+ const imageRef = `${component.effectiveImage}:${component.effectiveTag}`;
104
+ const name = containerName(activeEnv.name, 'cypress');
105
+ const args = buildRunArgs({
106
+ envName: activeEnv.name,
107
+ componentName: component.definition.name,
108
+ image: component.effectiveImage,
109
+ tag: component.effectiveTag,
110
+ networkName: activeEnv.network,
111
+ ports: component.effectivePorts,
112
+ env: component.effectiveEnv,
113
+ volumes: component.definition.volumes,
114
+ networkAliases: component.definition.networkAliases,
115
+ detached: false,
116
+ });
117
+ if (!flags.json) {
118
+ this.log(formatRunStart(imageRef, activeEnv.network, name));
119
+ }
120
+ // Remove any leftover container from a previous run
121
+ await removeContainer(name);
122
+ const result = await execa('docker', [...args], {
123
+ stdio: 'inherit',
124
+ reject: false,
125
+ });
126
+ const exitCode = result.exitCode ?? 1;
127
+ if (flags.json) {
128
+ this.log(JSON.stringify({
129
+ success: exitCode === 0,
130
+ exitCode,
131
+ container: name,
132
+ image: imageRef,
133
+ network: activeEnv.network,
134
+ }, null, 2));
135
+ }
136
+ else {
137
+ this.log(formatRunComplete(name, exitCode));
138
+ }
139
+ if (exitCode !== 0) {
140
+ this.exit(exitCode);
141
+ }
142
+ }
143
+ catch (error) {
144
+ if (isExecaError(error)) {
145
+ const exitCode = error.exitCode ?? 1;
146
+ if (!flags.json) {
147
+ this.log(formatRunComplete('unknown', exitCode));
148
+ }
149
+ this.exit(exitCode);
150
+ return;
151
+ }
152
+ const message = error instanceof Error ? error.message : String(error);
153
+ if (flags.json) {
154
+ this.log(JSON.stringify({ success: false, error: message }, null, 2));
155
+ }
156
+ else {
157
+ this.error(message);
158
+ }
159
+ }
160
+ }
161
+ }
162
+ /**
163
+ * Type guard for ExecaError (has exitCode property).
164
+ */
165
+ const isExecaError = (error) => error instanceof Error && 'exitCode' in error;
166
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/commands/tests/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,21 @@
1
+ import { Command } from '@oclif/core';
2
+ import type { JahiaCliConfig } from '../../lib/config/types.js';
3
+ /**
4
+ * Loads an existing config file if it exists, returning an empty config if not found.
5
+ */
6
+ export declare const loadExistingConfigForWorkflow: (filePath: string) => Promise<JahiaCliConfig>;
7
+ /**
8
+ * Builds a human-readable success message for the workflow init command.
9
+ */
10
+ export declare const buildWorkflowInitSuccessMessage: (outputPath: string) => string;
11
+ export default class WorkflowInit extends Command {
12
+ static description: string;
13
+ static examples: string[];
14
+ static flags: {
15
+ config: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
16
+ force: import("@oclif/core/interfaces").BooleanFlag<boolean>;
17
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
18
+ };
19
+ run(): Promise<void>;
20
+ }
21
+ //# sourceMappingURL=init.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.d.ts","sourceRoot":"","sources":["../../../src/commands/workflow/init.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAK7C,OAAO,KAAK,EAAE,cAAc,EAAa,MAAM,2BAA2B,CAAC;AAM3E;;GAEG;AACH,eAAO,MAAM,6BAA6B,GAAU,UAAU,MAAM,KAAG,OAAO,CAAC,cAAc,CAQ5F,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,+BAA+B,GAAI,YAAY,MAAM,KAAG,MAGlB,CAAC;AAEpD,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,OAAO;IAC/C,OAAgB,WAAW,SAI4B;IAEvD,OAAgB,QAAQ,WAKtB;IAEF,OAAgB,KAAK;;;;MAenB;IAEW,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAoClC"}
@@ -0,0 +1,84 @@
1
+ import { readFile, writeFile } from 'node:fs/promises';
2
+ import { resolve } from 'node:path';
3
+ import { Command, Flags } from '@oclif/core';
4
+ import yaml from 'js-yaml';
5
+ import { configToYaml } from '../../lib/config/config-to-yaml.js';
6
+ import { validateConfig } from '../../lib/config/parser.js';
7
+ import { buildSampleWorkflows } from '../../lib/workflow/build-sample-workflow.js';
8
+ import { mergeWorkflowsIntoConfig } from '../../lib/workflow/merge-workflow-into-config.js';
9
+ const DEFAULT_CONFIG_FILE = 'jahia-cli.config.yml';
10
+ /**
11
+ * Loads an existing config file if it exists, returning an empty config if not found.
12
+ */
13
+ export const loadExistingConfigForWorkflow = async (filePath) => {
14
+ try {
15
+ const content = await readFile(filePath, 'utf-8');
16
+ const raw = yaml.load(content);
17
+ return validateConfig(raw);
18
+ }
19
+ catch {
20
+ return {};
21
+ }
22
+ };
23
+ /**
24
+ * Builds a human-readable success message for the workflow init command.
25
+ */
26
+ export const buildWorkflowInitSuccessMessage = (outputPath) => `✓ Sample workflows added to ${outputPath}\n\n` +
27
+ ' Edit the workflow steps to match your needs, then run:\n' +
28
+ ` jahia-cli workflow run --config ${outputPath}`;
29
+ export default class WorkflowInit extends Command {
30
+ static description = 'Add sample workflows section to a configuration file. ' +
31
+ 'Generates a named "main" workflow with representative steps ' +
32
+ '(init, create, alive, test, cleanup) to help get started. ' +
33
+ 'Preserves existing environment and tests sections.';
34
+ static examples = [
35
+ '<%= config.bin %> workflow init',
36
+ '<%= config.bin %> workflow init --config ./my-config.yml',
37
+ '<%= config.bin %> workflow init --force',
38
+ '<%= config.bin %> workflow init --json',
39
+ ];
40
+ static flags = {
41
+ config: Flags.string({
42
+ char: 'c',
43
+ description: 'Path to the YAML configuration file',
44
+ default: DEFAULT_CONFIG_FILE,
45
+ }),
46
+ force: Flags.boolean({
47
+ char: 'f',
48
+ description: 'Overwrite existing workflows section if already present',
49
+ default: false,
50
+ }),
51
+ json: Flags.boolean({
52
+ description: 'Output result as structured JSON (for AI agents and scripting)',
53
+ default: false,
54
+ }),
55
+ };
56
+ async run() {
57
+ const { flags } = await this.parse(WorkflowInit);
58
+ const configPath = resolve(flags.config);
59
+ const existingConfig = await loadExistingConfigForWorkflow(configPath);
60
+ if (existingConfig.workflows !== undefined && !flags.force) {
61
+ const msg = `Configuration file already has a workflows section.\n\n` +
62
+ ` File: ${configPath}\n\n` +
63
+ ' Use --force to overwrite the existing workflows.';
64
+ if (flags.json) {
65
+ this.log(JSON.stringify({ success: false, error: 'workflows_exists', file: configPath }));
66
+ }
67
+ else {
68
+ this.error(msg);
69
+ }
70
+ return;
71
+ }
72
+ const sampleWorkflows = buildSampleWorkflows();
73
+ const merged = mergeWorkflowsIntoConfig(existingConfig, sampleWorkflows);
74
+ const yamlContent = configToYaml(merged);
75
+ await writeFile(configPath, yamlContent, 'utf-8');
76
+ if (flags.json) {
77
+ this.log(JSON.stringify({ success: true, file: configPath, workflows: sampleWorkflows }, undefined, 2));
78
+ }
79
+ else {
80
+ this.log(buildWorkflowInitSuccessMessage(configPath));
81
+ }
82
+ }
83
+ }
84
+ //# sourceMappingURL=init.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"init.js","sourceRoot":"","sources":["../../../src/commands/workflow/init.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,22 @@
1
+ import { Command } from '@oclif/core';
2
+ import type { StepResult } from '../../lib/workflow/types.js';
3
+ /**
4
+ * Formats a duration in milliseconds to a human-readable string.
5
+ */
6
+ export declare const formatDuration: (ms: number) => string;
7
+ /**
8
+ * Builds a formatted summary of workflow execution for human-readable output.
9
+ */
10
+ export declare const buildWorkflowSummary: (workflowName: string, steps: readonly StepResult[], success: boolean, totalDurationMs: number) => string;
11
+ export default class WorkflowRun extends Command {
12
+ static description: string;
13
+ static examples: string[];
14
+ static flags: {
15
+ config: import("@oclif/core/interfaces").OptionFlag<string, import("@oclif/core/interfaces").CustomOptions>;
16
+ name: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
17
+ json: import("@oclif/core/interfaces").BooleanFlag<boolean>;
18
+ state: import("@oclif/core/interfaces").OptionFlag<string | undefined, import("@oclif/core/interfaces").CustomOptions>;
19
+ };
20
+ run(): Promise<void>;
21
+ }
22
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../../src/commands/workflow/run.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,OAAO,EAAS,MAAM,aAAa,CAAC;AAK7C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,6BAA6B,CAAC;AAE9D;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,IAAI,MAAM,KAAG,MAa3C,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,GAC/B,cAAc,MAAM,EACpB,OAAO,SAAS,UAAU,EAAE,EAC5B,SAAS,OAAO,EAChB,iBAAiB,MAAM,KACtB,MAoBF,CAAC;AAEF,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,OAAO;IAC9C,OAAgB,WAAW,SAIsC;IAEjE,OAAgB,QAAQ,WAItB;IAEF,OAAgB,KAAK;;;;;MAkBnB;IAEW,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC;CAqDlC"}
@@ -0,0 +1,111 @@
1
+ import { resolve } from 'node:path';
2
+ import { Command, Flags } from '@oclif/core';
3
+ import { loadConfigFile } from '../../lib/config/parser.js';
4
+ import { executeWorkflow } from '../../lib/workflow/executor.js';
5
+ import { resolveDefaultWorkflow, resolveWorkflowByName } from '../../lib/workflow/resolve-workflow.js';
6
+ /**
7
+ * Formats a duration in milliseconds to a human-readable string.
8
+ */
9
+ export const formatDuration = (ms) => {
10
+ if (ms < 1000) {
11
+ return `${String(ms)}ms`;
12
+ }
13
+ const seconds = Math.floor(ms / 1000);
14
+ if (seconds < 60) {
15
+ return `${String(seconds)}s`;
16
+ }
17
+ const minutes = Math.floor(seconds / 60);
18
+ const remainingSeconds = seconds % 60;
19
+ return `${String(minutes)}m ${String(remainingSeconds)}s`;
20
+ };
21
+ /**
22
+ * Builds a formatted summary of workflow execution for human-readable output.
23
+ */
24
+ export const buildWorkflowSummary = (workflowName, steps, success, totalDurationMs) => {
25
+ const header = success
26
+ ? `✓ Workflow "${workflowName}" completed successfully`
27
+ : `✗ Workflow "${workflowName}" failed`;
28
+ const stepLines = steps.map((step) => ` ${step.success ? '✓' : '✗'} ${step.name} (${formatDuration(step.durationMs)})${step.error !== undefined ? `\n Error: ${step.error}` : ''}`);
29
+ return [
30
+ header,
31
+ '',
32
+ ' Steps:',
33
+ ...stepLines,
34
+ '',
35
+ ` Total time: ${formatDuration(totalDurationMs)}`,
36
+ ].join('\n');
37
+ };
38
+ export default class WorkflowRun extends Command {
39
+ static description = 'Execute a named workflow defined in a configuration file. ' +
40
+ 'Runs steps sequentially — shell commands via execa, ' +
41
+ 'jahia-cli commands via subprocess. Stops on first failure. ' +
42
+ 'Use --name to select a workflow, or omit to run the default.';
43
+ static examples = [
44
+ '<%= config.bin %> workflow run --config jahia-cli.config.yml',
45
+ '<%= config.bin %> workflow run --config jahia-cli.config.yml --name setup',
46
+ '<%= config.bin %> workflow run --config ./my-config.yml --json',
47
+ ];
48
+ static flags = {
49
+ config: Flags.string({
50
+ char: 'c',
51
+ description: 'Path to the YAML configuration file',
52
+ required: true,
53
+ }),
54
+ name: Flags.string({
55
+ char: 'n',
56
+ description: 'Name of the workflow to run (runs default workflow if omitted)',
57
+ }),
58
+ json: Flags.boolean({
59
+ description: 'Output result as structured JSON (for AI agents and scripting)',
60
+ default: false,
61
+ }),
62
+ state: Flags.string({
63
+ char: 's',
64
+ description: 'Path to the state file (auto-passed to jahia-cli subcommands)',
65
+ }),
66
+ };
67
+ async run() {
68
+ const { flags } = await this.parse(WorkflowRun);
69
+ const configPath = resolve(flags.config);
70
+ const config = await loadConfigFile(configPath);
71
+ if (config.workflows === undefined) {
72
+ this.error('No workflows section found in configuration file.\n\n' +
73
+ ' Run "jahia-cli workflow init" to generate sample workflows.');
74
+ return;
75
+ }
76
+ const { name: workflowName, workflow } = flags.name !== undefined
77
+ ? { name: flags.name, workflow: resolveWorkflowByName(config.workflows, flags.name) }
78
+ : resolveDefaultWorkflow(config.workflows);
79
+ const { steps } = workflow;
80
+ if (!flags.json) {
81
+ this.log(`▶ Running workflow "${workflowName}" (${String(steps.length)} steps)\n`);
82
+ }
83
+ const cliEntryPoint = resolve(this.config.root, 'bin', 'run.js');
84
+ const result = await executeWorkflow({
85
+ steps,
86
+ configPath,
87
+ statePath: flags.state,
88
+ cwd: process.cwd(),
89
+ cliEntryPoint,
90
+ workflows: config.workflows,
91
+ callStack: [workflowName],
92
+ onStepStart: flags.json
93
+ ? undefined
94
+ : (stepName, index) => {
95
+ this.log(` [${String(index + 1)}/${String(steps.length)}] ${stepName}...`);
96
+ },
97
+ onStepComplete: undefined,
98
+ });
99
+ if (flags.json) {
100
+ this.log(JSON.stringify({ ...result, workflowName }, undefined, 2));
101
+ }
102
+ else {
103
+ this.log('');
104
+ this.log(buildWorkflowSummary(workflowName, result.steps, result.success, result.totalDurationMs));
105
+ }
106
+ if (!result.success) {
107
+ this.exit(1);
108
+ }
109
+ }
110
+ }
111
+ //# sourceMappingURL=run.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.js","sourceRoot":"","sources":["../../../src/commands/workflow/run.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { PersistedEnvironment } from '../state/types.js';
2
+ import type { CollectionResult } from './types.js';
3
+ /**
4
+ * Resolves the VictoriaLogs base URL from a persisted environment.
5
+ * Returns undefined if VictoriaLogs is not present or its port can't be determined.
6
+ */
7
+ export declare const resolveVlogsUrl: (env: PersistedEnvironment) => string | undefined;
8
+ /**
9
+ * Collects all artifacts (logs + file copies) for every component in an environment.
10
+ * Errors are isolated per-component — one failure does not block the others.
11
+ */
12
+ export declare const collectAllArtifacts: (params: {
13
+ readonly env: PersistedEnvironment;
14
+ readonly outputDir: string;
15
+ readonly onProgress?: ((message: string) => void) | undefined;
16
+ }) => Promise<CollectionResult>;
17
+ //# sourceMappingURL=collect-all.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collect-all.d.ts","sourceRoot":"","sources":["../../../src/lib/artifacts/collect-all.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,mBAAmB,CAAC;AAI9D,OAAO,KAAK,EAAsB,gBAAgB,EAA6B,MAAM,YAAY,CAAC;AAElG;;;GAGG;AACH,eAAO,MAAM,eAAe,GAAI,KAAK,oBAAoB,KAAG,MAAM,GAAG,SAUpE,CAAC;AAkCF;;;GAGG;AACH,eAAO,MAAM,mBAAmB,GAAU,QAAQ;IAChD,QAAQ,CAAC,GAAG,EAAE,oBAAoB,CAAC;IACnC,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC,GAAG,SAAS,CAAC;CAC/D,KAAG,OAAO,CAAC,gBAAgB,CA0E3B,CAAC"}
@@ -0,0 +1,107 @@
1
+ import { mkdir, writeFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { resolveConfigComponents } from '../config/parser.js';
4
+ import { copyContainerArtifacts } from './copy-container-artifacts.js';
5
+ import { fetchContainerLogs } from './fetch-container-logs.js';
6
+ /**
7
+ * Resolves the VictoriaLogs base URL from a persisted environment.
8
+ * Returns undefined if VictoriaLogs is not present or its port can't be determined.
9
+ */
10
+ export const resolveVlogsUrl = (env) => {
11
+ const vlComponent = env.components.find((c) => c.name === 'victorialogs');
12
+ if (vlComponent === undefined) {
13
+ return undefined;
14
+ }
15
+ // VictoriaLogs HTTP API listens on port 9428
16
+ const resolved = env.config.components.find((c) => c.name === 'victorialogs');
17
+ const portOverride = resolved?.overrides?.ports?.find((p) => p.container === 9428);
18
+ const hostPort = portOverride?.host ?? 9428;
19
+ return `http://localhost:${String(hostPort)}`;
20
+ };
21
+ /**
22
+ * Collects logs for a single container, returning log metadata.
23
+ */
24
+ const collectLogsForComponent = async (params) => {
25
+ const logFileName = `${params.componentName}.log`;
26
+ const logFilePath = join(params.outputDir, logFileName);
27
+ try {
28
+ const logResult = await fetchContainerLogs({
29
+ containerId: params.containerId,
30
+ componentName: params.componentName,
31
+ envName: params.envName,
32
+ vlogsBaseUrl: params.vlogsBaseUrl,
33
+ });
34
+ await writeFile(logFilePath, logResult.content, 'utf-8');
35
+ return { logFile: logFileName, logSource: logResult.source, logError: undefined };
36
+ }
37
+ catch (error) {
38
+ const message = error instanceof Error ? error.message : String(error);
39
+ return { logFile: undefined, logSource: undefined, logError: message };
40
+ }
41
+ };
42
+ /**
43
+ * Collects all artifacts (logs + file copies) for every component in an environment.
44
+ * Errors are isolated per-component — one failure does not block the others.
45
+ */
46
+ export const collectAllArtifacts = async (params) => {
47
+ const { env, outputDir, onProgress } = params;
48
+ if (env.provider !== 'docker') {
49
+ throw new Error(`Artifact collection is only supported for Docker environments (got "${env.provider}").`);
50
+ }
51
+ await mkdir(outputDir, { recursive: true });
52
+ const vlogsUrl = resolveVlogsUrl(env);
53
+ // Re-resolve components from config to get effectiveArtifacts
54
+ const resolvedComponents = resolveConfigComponents(env.config);
55
+ // Map persisted components by name for container ID lookup
56
+ const containerIdByName = new Map(env.components.map((c) => [c.name, c.containerId]));
57
+ const componentResults = await resolvedComponents.reduce(async (chainPromise, resolved) => {
58
+ const chain = await chainPromise;
59
+ const componentName = resolved.definition.name;
60
+ const containerId = containerIdByName.get(componentName);
61
+ if (containerId === undefined) {
62
+ return [...chain, {
63
+ componentName,
64
+ containerId: 'unknown',
65
+ logFile: undefined,
66
+ logSource: undefined,
67
+ logError: `No container ID found in state for "${componentName}"`,
68
+ artifacts: [],
69
+ }];
70
+ }
71
+ // Collect logs
72
+ onProgress?.(`Collecting logs for ${componentName}...`);
73
+ const logResult = await collectLogsForComponent({
74
+ containerId,
75
+ componentName,
76
+ envName: env.name,
77
+ vlogsBaseUrl: vlogsUrl,
78
+ outputDir,
79
+ });
80
+ // Copy artifacts
81
+ const artifactResults = resolved.effectiveArtifacts.length > 0
82
+ ? await (() => {
83
+ onProgress?.(`Copying artifacts for ${componentName}...`);
84
+ return copyContainerArtifacts({
85
+ containerId,
86
+ componentName,
87
+ artifactPaths: resolved.effectiveArtifacts,
88
+ outputDir,
89
+ });
90
+ })()
91
+ : [];
92
+ return [...chain, {
93
+ componentName,
94
+ containerId,
95
+ logFile: logResult.logFile,
96
+ logSource: logResult.logSource,
97
+ logError: logResult.logError,
98
+ artifacts: artifactResults,
99
+ }];
100
+ }, Promise.resolve([]));
101
+ return {
102
+ envName: env.name,
103
+ outputDir,
104
+ components: componentResults,
105
+ };
106
+ };
107
+ //# sourceMappingURL=collect-all.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"collect-all.js","sourceRoot":"","sources":["../../../src/lib/artifacts/collect-all.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ import type { ArtifactCopyResult } from './types.js';
2
+ /**
3
+ * Copies artifact paths from a container using `docker cp`.
4
+ * Each artifact path is copied to a per-component subdirectory.
5
+ * Errors are captured per-path — one failure does not block others.
6
+ */
7
+ export declare const copyContainerArtifacts: (params: {
8
+ readonly containerId: string;
9
+ readonly componentName: string;
10
+ readonly artifactPaths: readonly string[];
11
+ readonly outputDir: string;
12
+ }) => Promise<readonly ArtifactCopyResult[]>;
13
+ //# sourceMappingURL=copy-container-artifacts.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"copy-container-artifacts.d.ts","sourceRoot":"","sources":["../../../src/lib/artifacts/copy-container-artifacts.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAIrD;;;;GAIG;AACH,eAAO,MAAM,sBAAsB,GAAU,QAAQ;IACnD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,MAAM,CAAC;IAC/B,QAAQ,CAAC,aAAa,EAAE,SAAS,MAAM,EAAE,CAAC;IAC1C,QAAQ,CAAC,SAAS,EAAE,MAAM,CAAC;CAC5B,KAAG,OAAO,CAAC,SAAS,kBAAkB,EAAE,CAyCxC,CAAC"}
@@ -0,0 +1,48 @@
1
+ import { execFile } from 'node:child_process';
2
+ import { mkdir } from 'node:fs/promises';
3
+ import { basename, join } from 'node:path';
4
+ import { promisify } from 'node:util';
5
+ const execFileAsync = promisify(execFile);
6
+ /**
7
+ * Copies artifact paths from a container using `docker cp`.
8
+ * Each artifact path is copied to a per-component subdirectory.
9
+ * Errors are captured per-path — one failure does not block others.
10
+ */
11
+ export const copyContainerArtifacts = async (params) => {
12
+ if (params.artifactPaths.length === 0) {
13
+ return [];
14
+ }
15
+ const componentDir = join(params.outputDir, params.componentName);
16
+ await mkdir(componentDir, { recursive: true });
17
+ const results = await params.artifactPaths.reduce(async (chainPromise, artifactPath) => {
18
+ const chain = await chainPromise;
19
+ const destName = basename(artifactPath);
20
+ const destPath = join(componentDir, destName);
21
+ try {
22
+ // First try copying as directory contents (trailing '/.' avoids double-nesting).
23
+ // If the path is a file, this will fail, so we fall back to a plain copy.
24
+ try {
25
+ await mkdir(destPath, { recursive: true });
26
+ await execFileAsync('docker', [
27
+ 'cp',
28
+ `${params.containerId}:${artifactPath}/.`,
29
+ destPath,
30
+ ]);
31
+ }
32
+ catch {
33
+ await execFileAsync('docker', [
34
+ 'cp',
35
+ `${params.containerId}:${artifactPath}`,
36
+ destPath,
37
+ ]);
38
+ }
39
+ return [...chain, { path: artifactPath, success: true }];
40
+ }
41
+ catch (error) {
42
+ const message = error instanceof Error ? error.message : String(error);
43
+ return [...chain, { path: artifactPath, success: false, error: message }];
44
+ }
45
+ }, Promise.resolve([]));
46
+ return results;
47
+ };
48
+ //# sourceMappingURL=copy-container-artifacts.js.map