intershell 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 (357) hide show
  1. package/README.md +301 -0
  2. package/dist/commands/ci/act.d.ts +13 -0
  3. package/dist/commands/ci/act.d.ts.map +1 -0
  4. package/dist/commands/ci/act.js +89 -0
  5. package/dist/commands/ci/act.js.map +1 -0
  6. package/dist/commands/ci/attach-affected.d.ts +12 -0
  7. package/dist/commands/ci/attach-affected.d.ts.map +1 -0
  8. package/dist/commands/ci/attach-affected.js +83 -0
  9. package/dist/commands/ci/attach-affected.js.map +1 -0
  10. package/dist/commands/ci/attach-service-ports.d.ts +10 -0
  11. package/dist/commands/ci/attach-service-ports.d.ts.map +1 -0
  12. package/dist/commands/ci/attach-service-ports.js +25 -0
  13. package/dist/commands/ci/attach-service-ports.js.map +1 -0
  14. package/dist/commands/commit-check.d.ts +13 -0
  15. package/dist/commands/commit-check.d.ts.map +1 -0
  16. package/dist/commands/commit-check.js +110 -0
  17. package/dist/commands/commit-check.js.map +1 -0
  18. package/dist/commands/commit.d.ts +16 -0
  19. package/dist/commands/commit.d.ts.map +1 -0
  20. package/dist/commands/commit.js +91 -0
  21. package/dist/commands/commit.js.map +1 -0
  22. package/dist/commands/dev/check.d.ts +13 -0
  23. package/dist/commands/dev/check.d.ts.map +1 -0
  24. package/dist/commands/dev/check.js +91 -0
  25. package/dist/commands/dev/check.js.map +1 -0
  26. package/dist/commands/dev/cleanup.d.ts +10 -0
  27. package/dist/commands/dev/cleanup.d.ts.map +1 -0
  28. package/dist/commands/dev/cleanup.js +28 -0
  29. package/dist/commands/dev/cleanup.js.map +1 -0
  30. package/dist/commands/dev/rm.d.ts +12 -0
  31. package/dist/commands/dev/rm.d.ts.map +1 -0
  32. package/dist/commands/dev/rm.js +49 -0
  33. package/dist/commands/dev/rm.js.map +1 -0
  34. package/dist/commands/dev/setup.d.ts +10 -0
  35. package/dist/commands/dev/setup.d.ts.map +1 -0
  36. package/dist/commands/dev/setup.js +40 -0
  37. package/dist/commands/dev/setup.js.map +1 -0
  38. package/dist/commands/local/cleanup.d.ts +12 -0
  39. package/dist/commands/local/cleanup.d.ts.map +1 -0
  40. package/dist/commands/local/cleanup.js +62 -0
  41. package/dist/commands/local/cleanup.js.map +1 -0
  42. package/dist/commands/local/setup.d.ts +11 -0
  43. package/dist/commands/local/setup.d.ts.map +1 -0
  44. package/dist/commands/local/setup.js +55 -0
  45. package/dist/commands/local/setup.js.map +1 -0
  46. package/dist/commands/local/vscode.d.ts +17 -0
  47. package/dist/commands/local/vscode.d.ts.map +1 -0
  48. package/dist/commands/local/vscode.js +94 -0
  49. package/dist/commands/local/vscode.js.map +1 -0
  50. package/dist/commands/update-package-json.d.ts +12 -0
  51. package/dist/commands/update-package-json.d.ts.map +1 -0
  52. package/dist/commands/update-package-json.js +82 -0
  53. package/dist/commands/update-package-json.js.map +1 -0
  54. package/dist/commands/version/apply.d.ts +16 -0
  55. package/dist/commands/version/apply.d.ts.map +1 -0
  56. package/dist/commands/version/apply.js +120 -0
  57. package/dist/commands/version/apply.js.map +1 -0
  58. package/dist/commands/version/ci.d.ts +12 -0
  59. package/dist/commands/version/ci.d.ts.map +1 -0
  60. package/dist/commands/version/ci.js +67 -0
  61. package/dist/commands/version/ci.js.map +1 -0
  62. package/dist/commands/version/prepare.d.ts +19 -0
  63. package/dist/commands/version/prepare.d.ts.map +1 -0
  64. package/dist/commands/version/prepare.js +153 -0
  65. package/dist/commands/version/prepare.js.map +1 -0
  66. package/dist/core/colorify.d.ts +21 -0
  67. package/dist/core/colorify.d.ts.map +1 -0
  68. package/dist/core/colorify.js +56 -0
  69. package/dist/core/colorify.js.map +1 -0
  70. package/dist/core/index.d.ts +4 -0
  71. package/dist/core/index.d.ts.map +1 -0
  72. package/dist/core/index.js +3 -0
  73. package/dist/core/index.js.map +1 -0
  74. package/dist/core/types.d.ts +181 -0
  75. package/dist/core/types.d.ts.map +1 -0
  76. package/dist/core/types.js +5 -0
  77. package/dist/core/types.js.map +1 -0
  78. package/dist/core/wrapshell.d.ts +19 -0
  79. package/dist/core/wrapshell.d.ts.map +1 -0
  80. package/dist/core/wrapshell.js +323 -0
  81. package/dist/core/wrapshell.js.map +1 -0
  82. package/dist/entities/affected/affected.d.ts +4 -0
  83. package/dist/entities/affected/affected.d.ts.map +1 -0
  84. package/dist/entities/affected/affected.js +20 -0
  85. package/dist/entities/affected/affected.js.map +1 -0
  86. package/dist/entities/affected/affected.test.d.ts +2 -0
  87. package/dist/entities/affected/affected.test.d.ts.map +1 -0
  88. package/dist/entities/affected/affected.test.js +305 -0
  89. package/dist/entities/affected/affected.test.js.map +1 -0
  90. package/dist/entities/affected/index.d.ts +2 -0
  91. package/dist/entities/affected/index.d.ts.map +1 -0
  92. package/dist/entities/affected/index.js +2 -0
  93. package/dist/entities/affected/index.js.map +1 -0
  94. package/dist/entities/branch/branch.d.ts +8 -0
  95. package/dist/entities/branch/branch.d.ts.map +1 -0
  96. package/dist/entities/branch/branch.js +74 -0
  97. package/dist/entities/branch/branch.js.map +1 -0
  98. package/dist/entities/branch/branch.test.d.ts +2 -0
  99. package/dist/entities/branch/branch.test.d.ts.map +1 -0
  100. package/dist/entities/branch/branch.test.js +316 -0
  101. package/dist/entities/branch/branch.test.js.map +1 -0
  102. package/dist/entities/branch/branch.types.d.ts +6 -0
  103. package/dist/entities/branch/branch.types.d.ts.map +1 -0
  104. package/dist/entities/branch/branch.types.js +2 -0
  105. package/dist/entities/branch/branch.types.js.map +1 -0
  106. package/dist/entities/branch/index.d.ts +3 -0
  107. package/dist/entities/branch/index.d.ts.map +1 -0
  108. package/dist/entities/branch/index.js +3 -0
  109. package/dist/entities/branch/index.js.map +1 -0
  110. package/dist/entities/commit/commit.d.ts +15 -0
  111. package/dist/entities/commit/commit.d.ts.map +1 -0
  112. package/dist/entities/commit/commit.js +196 -0
  113. package/dist/entities/commit/commit.js.map +1 -0
  114. package/dist/entities/commit/commit.test.d.ts +26 -0
  115. package/dist/entities/commit/commit.test.d.ts.map +1 -0
  116. package/dist/entities/commit/commit.test.js +550 -0
  117. package/dist/entities/commit/commit.test.js.map +1 -0
  118. package/dist/entities/commit/commit.types.d.ts +49 -0
  119. package/dist/entities/commit/commit.types.d.ts.map +1 -0
  120. package/dist/entities/commit/commit.types.js +31 -0
  121. package/dist/entities/commit/commit.types.js.map +1 -0
  122. package/dist/entities/commit/index.d.ts +3 -0
  123. package/dist/entities/commit/index.d.ts.map +1 -0
  124. package/dist/entities/commit/index.js +3 -0
  125. package/dist/entities/commit/index.js.map +1 -0
  126. package/dist/entities/commit/pr.d.ts +11 -0
  127. package/dist/entities/commit/pr.d.ts.map +1 -0
  128. package/dist/entities/commit/pr.js +201 -0
  129. package/dist/entities/commit/pr.js.map +1 -0
  130. package/dist/entities/commit/pr.test.d.ts +2 -0
  131. package/dist/entities/commit/pr.test.d.ts.map +1 -0
  132. package/dist/entities/commit/pr.test.js +782 -0
  133. package/dist/entities/commit/pr.test.js.map +1 -0
  134. package/dist/entities/compose/compose.d.ts +18 -0
  135. package/dist/entities/compose/compose.d.ts.map +1 -0
  136. package/dist/entities/compose/compose.js +197 -0
  137. package/dist/entities/compose/compose.js.map +1 -0
  138. package/dist/entities/compose/compose.test.d.ts +2 -0
  139. package/dist/entities/compose/compose.test.d.ts.map +1 -0
  140. package/dist/entities/compose/compose.test.js +406 -0
  141. package/dist/entities/compose/compose.test.js.map +1 -0
  142. package/dist/entities/compose/compose.types.d.ts +77 -0
  143. package/dist/entities/compose/compose.types.d.ts.map +1 -0
  144. package/dist/entities/compose/compose.types.js +2 -0
  145. package/dist/entities/compose/compose.types.js.map +1 -0
  146. package/dist/entities/compose/index.d.ts +3 -0
  147. package/dist/entities/compose/index.d.ts.map +1 -0
  148. package/dist/entities/compose/index.js +3 -0
  149. package/dist/entities/compose/index.js.map +1 -0
  150. package/dist/entities/entities.shell.d.ts +29 -0
  151. package/dist/entities/entities.shell.d.ts.map +1 -0
  152. package/dist/entities/entities.shell.js +27 -0
  153. package/dist/entities/entities.shell.js.map +1 -0
  154. package/dist/entities/entities.shell.test.d.ts +2 -0
  155. package/dist/entities/entities.shell.test.d.ts.map +1 -0
  156. package/dist/entities/entities.shell.test.js +23 -0
  157. package/dist/entities/entities.shell.test.js.map +1 -0
  158. package/dist/entities/index.d.ts +12 -0
  159. package/dist/entities/index.d.ts.map +1 -0
  160. package/dist/entities/index.js +12 -0
  161. package/dist/entities/index.js.map +1 -0
  162. package/dist/entities/intershell-config/intershell-config.d.ts +11 -0
  163. package/dist/entities/intershell-config/intershell-config.d.ts.map +1 -0
  164. package/dist/entities/intershell-config/intershell-config.default.d.ts +188 -0
  165. package/dist/entities/intershell-config/intershell-config.default.d.ts.map +1 -0
  166. package/dist/entities/intershell-config/intershell-config.default.js +225 -0
  167. package/dist/entities/intershell-config/intershell-config.default.js.map +1 -0
  168. package/dist/entities/intershell-config/intershell-config.js +132 -0
  169. package/dist/entities/intershell-config/intershell-config.js.map +1 -0
  170. package/dist/entities/intershell-config/intershell-config.test.d.ts +2 -0
  171. package/dist/entities/intershell-config/intershell-config.test.d.ts.map +1 -0
  172. package/dist/entities/intershell-config/intershell-config.test.js +102 -0
  173. package/dist/entities/intershell-config/intershell-config.test.js.map +1 -0
  174. package/dist/entities/intershell-config/intershell-config.types.d.ts +103 -0
  175. package/dist/entities/intershell-config/intershell-config.types.d.ts.map +1 -0
  176. package/dist/entities/intershell-config/intershell-config.types.js +2 -0
  177. package/dist/entities/intershell-config/intershell-config.types.js.map +1 -0
  178. package/dist/entities/package/index.d.ts +4 -0
  179. package/dist/entities/package/index.d.ts.map +1 -0
  180. package/dist/entities/package/index.js +4 -0
  181. package/dist/entities/package/index.js.map +1 -0
  182. package/dist/entities/package/package.d.ts +49 -0
  183. package/dist/entities/package/package.d.ts.map +1 -0
  184. package/dist/entities/package/package.js +234 -0
  185. package/dist/entities/package/package.js.map +1 -0
  186. package/dist/entities/package/package.shell.d.ts +48 -0
  187. package/dist/entities/package/package.shell.d.ts.map +1 -0
  188. package/dist/entities/package/package.shell.js +118 -0
  189. package/dist/entities/package/package.shell.js.map +1 -0
  190. package/dist/entities/package/package.test.d.ts +23 -0
  191. package/dist/entities/package/package.test.d.ts.map +1 -0
  192. package/dist/entities/package/package.test.js +637 -0
  193. package/dist/entities/package/package.test.js.map +1 -0
  194. package/dist/entities/package/package.types.d.ts +48 -0
  195. package/dist/entities/package/package.types.d.ts.map +1 -0
  196. package/dist/entities/package/package.types.js +2 -0
  197. package/dist/entities/package/package.types.js.map +1 -0
  198. package/dist/entities/package-changelog/index.d.ts +4 -0
  199. package/dist/entities/package-changelog/index.d.ts.map +1 -0
  200. package/dist/entities/package-changelog/index.js +4 -0
  201. package/dist/entities/package-changelog/index.js.map +1 -0
  202. package/dist/entities/package-changelog/package-changelog.d.ts +20 -0
  203. package/dist/entities/package-changelog/package-changelog.d.ts.map +1 -0
  204. package/dist/entities/package-changelog/package-changelog.js +59 -0
  205. package/dist/entities/package-changelog/package-changelog.js.map +1 -0
  206. package/dist/entities/package-changelog/package-changelog.types.d.ts +25 -0
  207. package/dist/entities/package-changelog/package-changelog.types.d.ts.map +1 -0
  208. package/dist/entities/package-changelog/package-changelog.types.js +2 -0
  209. package/dist/entities/package-changelog/package-changelog.types.js.map +1 -0
  210. package/dist/entities/package-changelog/template.d.ts +20 -0
  211. package/dist/entities/package-changelog/template.d.ts.map +1 -0
  212. package/dist/entities/package-changelog/template.default.d.ts +10 -0
  213. package/dist/entities/package-changelog/template.default.d.ts.map +1 -0
  214. package/dist/entities/package-changelog/template.default.js +85 -0
  215. package/dist/entities/package-changelog/template.default.js.map +1 -0
  216. package/dist/entities/package-changelog/template.js +90 -0
  217. package/dist/entities/package-changelog/template.js.map +1 -0
  218. package/dist/entities/package-commits/dependency-analyzer.d.ts +35 -0
  219. package/dist/entities/package-commits/dependency-analyzer.d.ts.map +1 -0
  220. package/dist/entities/package-commits/dependency-analyzer.js +169 -0
  221. package/dist/entities/package-commits/dependency-analyzer.js.map +1 -0
  222. package/dist/entities/package-commits/dependency-analyzer.test.d.ts +2 -0
  223. package/dist/entities/package-commits/dependency-analyzer.test.d.ts.map +1 -0
  224. package/dist/entities/package-commits/dependency-analyzer.test.js +25 -0
  225. package/dist/entities/package-commits/dependency-analyzer.test.js.map +1 -0
  226. package/dist/entities/package-commits/index.d.ts +3 -0
  227. package/dist/entities/package-commits/index.d.ts.map +1 -0
  228. package/dist/entities/package-commits/index.js +3 -0
  229. package/dist/entities/package-commits/index.js.map +1 -0
  230. package/dist/entities/package-commits/package-commits.d.ts +33 -0
  231. package/dist/entities/package-commits/package-commits.d.ts.map +1 -0
  232. package/dist/entities/package-commits/package-commits.js +149 -0
  233. package/dist/entities/package-commits/package-commits.js.map +1 -0
  234. package/dist/entities/package-commits/package-commits.test.d.ts +2 -0
  235. package/dist/entities/package-commits/package-commits.test.d.ts.map +1 -0
  236. package/dist/entities/package-commits/package-commits.test.js +40 -0
  237. package/dist/entities/package-commits/package-commits.test.js.map +1 -0
  238. package/dist/entities/package-tags/index.d.ts +2 -0
  239. package/dist/entities/package-tags/index.d.ts.map +1 -0
  240. package/dist/entities/package-tags/index.js +2 -0
  241. package/dist/entities/package-tags/index.js.map +1 -0
  242. package/dist/entities/package-tags/package-tags.d.ts +24 -0
  243. package/dist/entities/package-tags/package-tags.d.ts.map +1 -0
  244. package/dist/entities/package-tags/package-tags.js +197 -0
  245. package/dist/entities/package-tags/package-tags.js.map +1 -0
  246. package/dist/entities/package-tags/package-tags.test.d.ts +2 -0
  247. package/dist/entities/package-tags/package-tags.test.d.ts.map +1 -0
  248. package/dist/entities/package-tags/package-tags.test.js +60 -0
  249. package/dist/entities/package-tags/package-tags.test.js.map +1 -0
  250. package/dist/entities/package-version/index.d.ts +3 -0
  251. package/dist/entities/package-version/index.d.ts.map +1 -0
  252. package/dist/entities/package-version/index.js +3 -0
  253. package/dist/entities/package-version/index.js.map +1 -0
  254. package/dist/entities/package-version/package-version.d.ts +16 -0
  255. package/dist/entities/package-version/package-version.d.ts.map +1 -0
  256. package/dist/entities/package-version/package-version.js +166 -0
  257. package/dist/entities/package-version/package-version.js.map +1 -0
  258. package/dist/entities/package-version/package-version.test.d.ts +2 -0
  259. package/dist/entities/package-version/package-version.test.d.ts.map +1 -0
  260. package/dist/entities/package-version/package-version.test.js +113 -0
  261. package/dist/entities/package-version/package-version.test.js.map +1 -0
  262. package/dist/entities/package-version/package-version.types.d.ts +31 -0
  263. package/dist/entities/package-version/package-version.types.d.ts.map +1 -0
  264. package/dist/entities/package-version/package-version.types.js +2 -0
  265. package/dist/entities/package-version/package-version.types.js.map +1 -0
  266. package/dist/entities/tag/index.d.ts +3 -0
  267. package/dist/entities/tag/index.d.ts.map +1 -0
  268. package/dist/entities/tag/index.js +3 -0
  269. package/dist/entities/tag/index.js.map +1 -0
  270. package/dist/entities/tag/tag.d.ts +24 -0
  271. package/dist/entities/tag/tag.d.ts.map +1 -0
  272. package/dist/entities/tag/tag.js +168 -0
  273. package/dist/entities/tag/tag.js.map +1 -0
  274. package/dist/entities/tag/tag.test.d.ts +2 -0
  275. package/dist/entities/tag/tag.test.d.ts.map +1 -0
  276. package/dist/entities/tag/tag.test.js +638 -0
  277. package/dist/entities/tag/tag.test.js.map +1 -0
  278. package/dist/entities/tag/tag.types.d.ts +35 -0
  279. package/dist/entities/tag/tag.types.d.ts.map +1 -0
  280. package/dist/entities/tag/tag.types.js +2 -0
  281. package/dist/entities/tag/tag.types.js.map +1 -0
  282. package/dist/index.d.ts +3 -0
  283. package/dist/index.d.ts.map +1 -0
  284. package/dist/index.js +6 -0
  285. package/dist/index.js.map +1 -0
  286. package/package.json +73 -0
  287. package/src/commands/ci/act.ts +95 -0
  288. package/src/commands/ci/attach-affected.ts +93 -0
  289. package/src/commands/ci/attach-service-ports.ts +31 -0
  290. package/src/commands/commit-check.ts +124 -0
  291. package/src/commands/commit.ts +103 -0
  292. package/src/commands/dev/check.ts +117 -0
  293. package/src/commands/dev/cleanup.ts +34 -0
  294. package/src/commands/dev/rm.ts +66 -0
  295. package/src/commands/dev/setup.ts +48 -0
  296. package/src/commands/local/cleanup.ts +74 -0
  297. package/src/commands/local/setup.ts +68 -0
  298. package/src/commands/local/vscode.ts +118 -0
  299. package/src/commands/update-package-json.ts +104 -0
  300. package/src/commands/version/apply.ts +156 -0
  301. package/src/commands/version/ci.ts +85 -0
  302. package/src/commands/version/prepare.ts +217 -0
  303. package/src/core/colorify.ts +61 -0
  304. package/src/core/index.ts +3 -0
  305. package/src/core/types.ts +262 -0
  306. package/src/core/wrapshell.ts +388 -0
  307. package/src/entities/affected/affected.test.ts +427 -0
  308. package/src/entities/affected/affected.ts +22 -0
  309. package/src/entities/affected/index.ts +1 -0
  310. package/src/entities/branch/branch.test.ts +348 -0
  311. package/src/entities/branch/branch.ts +89 -0
  312. package/src/entities/branch/branch.types.ts +5 -0
  313. package/src/entities/branch/index.ts +2 -0
  314. package/src/entities/commit/commit.test.ts +769 -0
  315. package/src/entities/commit/commit.ts +245 -0
  316. package/src/entities/commit/commit.types.ts +81 -0
  317. package/src/entities/commit/index.ts +2 -0
  318. package/src/entities/commit/pr.test.ts +860 -0
  319. package/src/entities/commit/pr.ts +241 -0
  320. package/src/entities/compose/compose.test.ts +496 -0
  321. package/src/entities/compose/compose.ts +251 -0
  322. package/src/entities/compose/compose.types.ts +88 -0
  323. package/src/entities/compose/index.ts +2 -0
  324. package/src/entities/entities.shell.test.ts +35 -0
  325. package/src/entities/entities.shell.ts +81 -0
  326. package/src/entities/index.ts +11 -0
  327. package/src/entities/intershell-config/intershell-config.default.ts +229 -0
  328. package/src/entities/intershell-config/intershell-config.test.ts +117 -0
  329. package/src/entities/intershell-config/intershell-config.ts +143 -0
  330. package/src/entities/intershell-config/intershell-config.types.ts +118 -0
  331. package/src/entities/package/index.ts +3 -0
  332. package/src/entities/package/package.shell.ts +124 -0
  333. package/src/entities/package/package.test.ts +830 -0
  334. package/src/entities/package/package.ts +267 -0
  335. package/src/entities/package/package.types.ts +49 -0
  336. package/src/entities/package-changelog/index.ts +3 -0
  337. package/src/entities/package-changelog/package-changelog.ts +81 -0
  338. package/src/entities/package-changelog/package-changelog.types.ts +30 -0
  339. package/src/entities/package-changelog/template.default.ts +109 -0
  340. package/src/entities/package-changelog/template.ts +118 -0
  341. package/src/entities/package-commits/dependency-analyzer.test.ts +29 -0
  342. package/src/entities/package-commits/dependency-analyzer.ts +194 -0
  343. package/src/entities/package-commits/index.ts +2 -0
  344. package/src/entities/package-commits/package-commits.test.ts +44 -0
  345. package/src/entities/package-commits/package-commits.ts +191 -0
  346. package/src/entities/package-tags/index.ts +1 -0
  347. package/src/entities/package-tags/package-tags.test.ts +73 -0
  348. package/src/entities/package-tags/package-tags.ts +234 -0
  349. package/src/entities/package-version/index.ts +2 -0
  350. package/src/entities/package-version/package-version.test.ts +141 -0
  351. package/src/entities/package-version/package-version.ts +234 -0
  352. package/src/entities/package-version/package-version.types.ts +35 -0
  353. package/src/entities/tag/index.ts +2 -0
  354. package/src/entities/tag/tag.test.ts +844 -0
  355. package/src/entities/tag/tag.ts +208 -0
  356. package/src/entities/tag/tag.types.ts +37 -0
  357. package/src/index.ts +7 -0
@@ -0,0 +1,496 @@
1
+ import { afterEach, beforeEach, describe, expect, it, mock } from "bun:test";
2
+
3
+ type CustomBunType = {
4
+ YAML: {
5
+ parse: (input: string) => Record<string, unknown>;
6
+ };
7
+ file: (path: string) => { text: () => string };
8
+ };
9
+
10
+ describe("EntityCompose", () => {
11
+ // Store original Bun methods for restoration
12
+ let originalBunYaml: CustomBunType["YAML"];
13
+ let originalBunFile: CustomBunType["file"];
14
+
15
+ // Default YAML template that we can modify per test case
16
+ const defaultYaml = {
17
+ version: "3.8",
18
+ services: {
19
+ "test-service": {
20
+ image: "app:latest",
21
+ ports: ["3000:3000"],
22
+ environment: ["NODE_ENV=production", "PORT=3000"],
23
+ volumes: ["/app/data:/data"],
24
+ depends_on: ["db"],
25
+ },
26
+ db: {
27
+ image: "postgres:13",
28
+ ports: ["5432:5432"],
29
+ environment: ["POSTGRES_DB=myapp"],
30
+ },
31
+ } as Record<
32
+ string,
33
+ {
34
+ image?: string;
35
+ build?: string;
36
+ ports?: string[];
37
+ environment?: string[];
38
+ volumes?: string[];
39
+ depends_on?: string[];
40
+ }
41
+ >,
42
+ networks: { default: {} } as Record<string, unknown>,
43
+ volumes: { data: {} } as Record<string, unknown>,
44
+ };
45
+
46
+ // Helper function to create modified YAML for specific test cases
47
+ const createTestYaml = (modifications: Partial<typeof defaultYaml>) => {
48
+ return { ...defaultYaml, ...modifications };
49
+ };
50
+
51
+ // Set up mocks before each test
52
+ beforeEach(async () => {
53
+ // Store original Bun methods
54
+ originalBunYaml = (Bun as unknown as CustomBunType).YAML;
55
+ originalBunFile = (Bun as unknown as CustomBunType).file;
56
+ });
57
+
58
+ // Restore mocks after each test
59
+ afterEach(() => {
60
+ // Restore original Bun methods
61
+ (Bun as unknown as CustomBunType).YAML = originalBunYaml;
62
+ (Bun as unknown as CustomBunType).file = originalBunFile;
63
+ });
64
+
65
+ // Store original methods to restore after tests
66
+ let originalEntityPackageGetAllPackages: () => Promise<string[]>;
67
+ let originalEntityAffectedGetAffectedPackages: (
68
+ baseSha?: string,
69
+ to?: string,
70
+ ) => Promise<string[]>;
71
+
72
+ // Common mock setup for dependencies - now with proper cleanup
73
+ const setupMocks = async () => {
74
+ // Import modules
75
+ const { EntityPackage } = await import("../package");
76
+ const { EntityAffected } = await import("../affected");
77
+
78
+ // Store original methods if not already stored
79
+ if (!originalEntityPackageGetAllPackages) {
80
+ originalEntityPackageGetAllPackages = EntityPackage.getAllPackages;
81
+ }
82
+ if (!originalEntityAffectedGetAffectedPackages) {
83
+ originalEntityAffectedGetAffectedPackages = EntityAffected.getAffectedPackages;
84
+ }
85
+
86
+ // Mock EntityPackage.getAllPackages to avoid package.json errors
87
+ EntityPackage.getAllPackages = () => Promise.resolve(["root", "test-package"]);
88
+
89
+ // Mock EntityAffected.getAffectedPackages
90
+ EntityAffected.getAffectedPackages = () => Promise.resolve(["test-service", "db"]);
91
+
92
+ return { EntityPackage, EntityAffected };
93
+ };
94
+
95
+ // Cleanup function to restore original methods
96
+ const cleanupMocks = async () => {
97
+ if (originalEntityPackageGetAllPackages) {
98
+ const { EntityPackage } = await import("../package");
99
+ EntityPackage.getAllPackages = originalEntityPackageGetAllPackages;
100
+ }
101
+ if (originalEntityAffectedGetAffectedPackages) {
102
+ const { EntityAffected } = await import("../affected");
103
+ EntityAffected.getAffectedPackages = originalEntityAffectedGetAffectedPackages;
104
+ }
105
+ };
106
+
107
+ // Common mock setup for Bun
108
+ const setupBunMocks = (
109
+ mockYamlParse: ReturnType<typeof mock>,
110
+ mockFileText: ReturnType<typeof mock>,
111
+ ) => {
112
+ (Bun as unknown as CustomBunType).YAML = { parse: mockYamlParse };
113
+ (Bun as unknown as CustomBunType).file = mock(() => ({ text: mockFileText }));
114
+ };
115
+
116
+ it("should handle core functionality - parsing, validation, and basic operations", async () => {
117
+ await setupMocks();
118
+
119
+ // Create test YAML with an invalid service for validation testing
120
+ const testYaml = createTestYaml({
121
+ version: "3.9",
122
+ services: {
123
+ ...defaultYaml.services,
124
+ "invalid-service": {
125
+ // Missing image and build - should fail validation
126
+ },
127
+ },
128
+ });
129
+
130
+ const mockYamlParse = mock(() => testYaml);
131
+
132
+ const mockFileText = mock(() => Promise.resolve("mock yaml content"));
133
+ setupBunMocks(mockYamlParse, mockFileText);
134
+
135
+ const { EntityCompose } = await import("./compose");
136
+
137
+ // Test instance creation and validation
138
+ const entityCompose = new EntityCompose("docker-compose.yml");
139
+
140
+ const validation = await entityCompose.validate();
141
+ expect(validation.isValid).toBe(false);
142
+ expect(validation.errors).toHaveLength(1);
143
+ expect(validation.errors[0].code).toBe("NO_IMAGE_OR_BUILD");
144
+ expect(validation.errors[0].service).toBe("invalid-service");
145
+
146
+ // Test getCompose and caching behavior
147
+ const compose1 = await entityCompose.getCompose();
148
+ const compose2 = await entityCompose.getCompose();
149
+ expect(compose1).toBe(compose2); // Should return cached version
150
+ expect(compose1.version).toBe("3.9");
151
+ expect(Object.keys(compose1.services)).toHaveLength(3);
152
+
153
+ // Test getServices with comprehensive data
154
+ const services = await entityCompose.getServices();
155
+ expect(services).toHaveLength(3);
156
+
157
+ const testService = services.find((s) => s.name === "test-service");
158
+ expect(testService?.image).toBe("app:latest");
159
+ expect(testService?.ports).toHaveLength(1);
160
+ expect(testService?.ports[0].host).toBe(3000);
161
+ expect(testService?.dependencies).toEqual(["db"]);
162
+ expect(testService?.volumes).toEqual(["/app/data:/data"]);
163
+
164
+ const dbService = services.find((s) => s.name === "db");
165
+ expect(dbService?.image).toBe("postgres:13");
166
+ expect(dbService?.ports[0].host).toBe(5432);
167
+
168
+ // Cleanup mocks
169
+ await cleanupMocks();
170
+ });
171
+
172
+ it("should handle service operations - health, dependencies, URLs, and caching", async () => {
173
+ await setupMocks();
174
+
175
+ // Use default YAML for this test - it already has the dependencies we need
176
+ const mockYamlParse = mock(() => defaultYaml);
177
+
178
+ const mockFileText = mock(() => Promise.resolve("mock yaml content"));
179
+ setupBunMocks(mockYamlParse, mockFileText);
180
+
181
+ const { EntityCompose } = await import("./compose");
182
+ const entityCompose = new EntityCompose("docker-compose.yml");
183
+
184
+ // Test getServiceHealth (lines 79-81)
185
+ const health = await entityCompose.getServiceHealth();
186
+ expect(health).toHaveLength(2);
187
+ expect(health[0]).toEqual({
188
+ name: "test-service",
189
+ status: "healthy",
190
+ checks: 10,
191
+ failures: 0,
192
+ lastCheck: expect.any(Date),
193
+ });
194
+ expect(health[1]).toEqual({
195
+ name: "db",
196
+ status: "healthy",
197
+ checks: 10,
198
+ failures: 0,
199
+ lastCheck: expect.any(Date),
200
+ });
201
+
202
+ // Test getServiceDependencies
203
+ const dependencies = await entityCompose.getServiceDependencies();
204
+ expect(dependencies.services).toHaveLength(2);
205
+ expect(dependencies.dependencies).toEqual({
206
+ "test-service": ["db"],
207
+ db: [],
208
+ });
209
+
210
+ // Test getServiceUrls (lines 93-95)
211
+ const urls = await entityCompose.getServiceUrls();
212
+ expect(urls).toEqual({
213
+ "3000": "http://localhost:3000",
214
+ "5432": "http://localhost:5432",
215
+ });
216
+
217
+ // Test getPortMappings
218
+ const portMappings = await entityCompose.getPortMappings();
219
+ expect(portMappings).toHaveLength(2);
220
+ expect(portMappings[0]).toEqual({
221
+ host: 3000,
222
+ container: 3000,
223
+ protocol: "tcp",
224
+ });
225
+ expect(portMappings[1]).toEqual({
226
+ host: 5432,
227
+ container: 5432,
228
+ protocol: "tcp",
229
+ });
230
+
231
+ // Cleanup mocks
232
+ await cleanupMocks();
233
+ });
234
+
235
+ it("should handle static parsing methods with comprehensive edge cases", async () => {
236
+ await setupMocks();
237
+ const { EntityCompose } = await import("./compose");
238
+
239
+ // Test parsePortMappings with various scenarios
240
+ const portTestCases = [
241
+ "3000:3000", // Normal
242
+ "8080", // Host only
243
+ ":80", // Container only
244
+ "0:3000", // Zero host port
245
+ "3000:0", // Zero container port
246
+ "65535:3000", // Max port number
247
+ "abc:3000", // Non-numeric host
248
+ "3000:def", // Non-numeric container
249
+ "", // Empty string
250
+ ];
251
+
252
+ const result = EntityCompose.parsePortMappings(portTestCases);
253
+ expect(result).toHaveLength(9);
254
+
255
+ // Normal case
256
+ expect(result[0]).toEqual({ host: 3000, container: 3000, protocol: "tcp" });
257
+
258
+ // Host only
259
+ expect(result[1]).toEqual({ host: 8080, container: 8080, protocol: "tcp" });
260
+
261
+ // Container only - empty string becomes 0, then 0 ?? 80 = 0 (0 is not null/undefined)
262
+ expect(result[2]).toEqual({ host: 0, container: 80, protocol: "tcp" });
263
+
264
+ // Zero ports (should preserve 0, not treat as falsy)
265
+ expect(result[3]).toEqual({ host: 0, container: 3000, protocol: "tcp" });
266
+ expect(result[4]).toEqual({ host: 3000, container: 0, protocol: "tcp" });
267
+
268
+ // Max port
269
+ expect(result[5]).toEqual({ host: 65535, container: 3000, protocol: "tcp" });
270
+
271
+ // Non-numeric (should result in NaN)
272
+ expect(result[6].host).toBeNaN();
273
+ expect(result[7].container).toBeNaN();
274
+
275
+ // Empty string - Number("") returns 0 for both host and container
276
+ expect(result[8].host).toBe(0);
277
+ expect(result[8].container).toBe(0);
278
+ expect(result[8].protocol).toBe("tcp");
279
+
280
+ // Test parseEnvironment with various scenarios
281
+ const envTestCases = [
282
+ "NODE_ENV=production",
283
+ "PORT=3000",
284
+ "KEY1=value=with=equals",
285
+ "KEY2=", // Empty value
286
+ "KEY3", // No equals
287
+ "=VALUE", // No key
288
+ "", // Empty string
289
+ "KEY4=0", // Zero value
290
+ "KEY5=false", // Falsy value
291
+ ];
292
+
293
+ const envResult = EntityCompose.parseEnvironment(envTestCases);
294
+ expect(envResult).toEqual({
295
+ NODE_ENV: "production",
296
+ PORT: "3000",
297
+ KEY1: "value=with=equals",
298
+ KEY2: "", // Empty values are included
299
+ KEY4: "0",
300
+ KEY5: "false",
301
+ });
302
+
303
+ // Test parseDockerCompose with comprehensive YAML
304
+ // Note: The static parseDockerCompose method uses Bun.YAML.parse directly
305
+ // So we need to mock it before calling the static method
306
+ const mockYamlParse = mock((input: string) => {
307
+ if (input.includes('version: "3.9"')) {
308
+ return createTestYaml({
309
+ version: "3.9",
310
+ services: {
311
+ app: {
312
+ image: "node:18",
313
+ ports: ["3000:3000", "8080:80"],
314
+ environment: [
315
+ "NODE_ENV=production",
316
+ "DATABASE_URL=postgresql://user:pass@db:5432/db",
317
+ ],
318
+ volumes: ["/app/data:/data", "/app/logs:/logs"],
319
+ depends_on: ["db", "redis"],
320
+ },
321
+ db: {
322
+ image: "postgres:13",
323
+ ports: ["5432:5432"],
324
+ environment: ["POSTGRES_DB=myapp", "POSTGRES_PASSWORD=secret"],
325
+ },
326
+ },
327
+ });
328
+ }
329
+ return defaultYaml;
330
+ });
331
+
332
+ // Set up Bun mock for static method testing
333
+ (Bun as unknown as CustomBunType).YAML = { parse: mockYamlParse };
334
+
335
+ const yamlInput = `
336
+ version: "3.9"
337
+ services:
338
+ app:
339
+ image: node:18
340
+ ports:
341
+ - "3000:3000"
342
+ - "8080:80"
343
+ environment:
344
+ - NODE_ENV=production
345
+ - DATABASE_URL=postgresql://user:pass@db:5432/db
346
+ volumes:
347
+ - /app/data:/data
348
+ - /app/logs:/logs
349
+ depends_on:
350
+ - db
351
+ - redis
352
+ db:
353
+ image: postgres:13
354
+ ports:
355
+ - "5432:5432"
356
+ environment:
357
+ - POSTGRES_DB=myapp
358
+ - POSTGRES_PASSWORD=secret
359
+ networks:
360
+ default:
361
+ volumes:
362
+ data:
363
+ logs:
364
+ `;
365
+
366
+ const composeData = EntityCompose.parseDockerCompose(yamlInput);
367
+ expect(composeData.version).toBe("3.9");
368
+ expect(composeData.services.app).toBeDefined();
369
+ expect(composeData.services.app.image).toBe("node:18");
370
+ expect(composeData.services.app.ports).toEqual(["3000:3000", "8080:80"]);
371
+ expect(composeData.services.app.depends_on).toEqual(["db", "redis"]);
372
+ expect(composeData.services.db.image).toBe("postgres:13");
373
+
374
+ // Cleanup mocks
375
+ await cleanupMocks();
376
+ });
377
+
378
+ it("should handle complex scenarios and error cases comprehensively", async () => {
379
+ await setupMocks();
380
+
381
+ // Create complex test YAML with multiple services and invalid ones for validation
382
+ const complexYaml = createTestYaml({
383
+ services: {
384
+ "web-app": {
385
+ image: "nginx:alpine",
386
+ ports: ["80:80", "443:443"],
387
+ environment: ["NGINX_HOST=localhost"],
388
+ volumes: ["/var/log/nginx:/var/log/nginx"],
389
+ depends_on: ["api", "db"],
390
+ },
391
+ api: {
392
+ build: ".",
393
+ ports: ["3000:3000"],
394
+ environment: ["NODE_ENV=production", "DB_HOST=db"],
395
+ depends_on: ["db"],
396
+ },
397
+ db: {
398
+ image: "postgres:13",
399
+ ports: ["5432:5432"],
400
+ environment: ["POSTGRES_DB=myapp"],
401
+ volumes: ["postgres_data:/var/lib/postgresql/data"],
402
+ },
403
+ redis: {
404
+ image: "redis:alpine",
405
+ ports: ["6379:6379"],
406
+ },
407
+ "invalid-service": {
408
+ // Missing image and build - should fail validation
409
+ },
410
+ "another-invalid": {
411
+ // Also missing image and build
412
+ },
413
+ },
414
+ networks: { default: { driver: "bridge" } },
415
+ volumes: { postgres_data: { driver: "local" } },
416
+ });
417
+
418
+ const mockYamlParse = mock(() => complexYaml);
419
+
420
+ const mockFileText = mock(() => Promise.resolve("mock yaml content"));
421
+ setupBunMocks(mockYamlParse, mockFileText);
422
+
423
+ const { EntityCompose } = await import("./compose");
424
+ const entityCompose = new EntityCompose("docker-compose.yml");
425
+
426
+ // Test validation with multiple invalid services
427
+ const validation = await entityCompose.validate();
428
+ expect(validation.isValid).toBe(false);
429
+ expect(validation.errors).toHaveLength(2);
430
+ expect(validation.errors.map((e: { code: string }) => e.code)).toEqual([
431
+ "NO_IMAGE_OR_BUILD",
432
+ "NO_IMAGE_OR_BUILD",
433
+ ]);
434
+
435
+ // Test comprehensive service operations
436
+ const services = await entityCompose.getServices();
437
+ expect(services).toHaveLength(6);
438
+
439
+ // Test web-app service
440
+ const webApp = services.find((s) => s.name === "web-app");
441
+ expect(webApp?.image).toBe("nginx:alpine");
442
+ expect(webApp?.ports).toHaveLength(2);
443
+ expect(webApp?.dependencies).toEqual(["api", "db"]);
444
+
445
+ // Test API service
446
+ const api = services.find((s) => s.name === "api");
447
+ expect(api?.image).toBeUndefined(); // API service uses build, not image
448
+ expect(api?.ports[0].host).toBe(3000);
449
+ expect(api?.dependencies).toEqual(["db"]);
450
+
451
+ // Test database service
452
+ const db = services.find((s) => s.name === "db");
453
+ expect(db?.image).toBe("postgres:13");
454
+ expect(db?.ports[0].host).toBe(5432);
455
+
456
+ // Test Redis service
457
+ const redis = services.find((s) => s.name === "redis");
458
+ expect(redis?.image).toBe("redis:alpine");
459
+ expect(redis?.ports[0].host).toBe(6379);
460
+
461
+ // Test port mappings across all services
462
+ const allPortMappings = await entityCompose.getPortMappings();
463
+ expect(allPortMappings).toHaveLength(5); // 5 services with ports: web-app(2), api(1), db(1), redis(1)
464
+
465
+ const portNumbers = allPortMappings.map((p) => p.host).filter((p) => typeof p === "number");
466
+ expect(portNumbers).toEqual([80, 443, 3000, 5432, 6379]);
467
+
468
+ // Test service dependencies graph
469
+ const dependencies = await entityCompose.getServiceDependencies();
470
+ expect(dependencies.services).toHaveLength(6);
471
+ expect(dependencies.dependencies["web-app"]).toEqual(["api", "db"]);
472
+ expect(dependencies.dependencies.api).toEqual(["db"]);
473
+ expect(dependencies.dependencies.db).toEqual([]);
474
+ expect(dependencies.dependencies.redis).toEqual([]);
475
+
476
+ // Test service URLs
477
+ const urls = await entityCompose.getServiceUrls();
478
+ expect(urls).toEqual({
479
+ "80": "http://localhost:80",
480
+ "443": "http://localhost:443",
481
+ "3000": "http://localhost:3000",
482
+ "5432": "http://localhost:5432",
483
+ "6379": "http://localhost:6379",
484
+ });
485
+
486
+ // Test health status
487
+ const health = await entityCompose.getServiceHealth();
488
+ expect(health).toHaveLength(6);
489
+ expect(health.every((h) => h.status === "healthy")).toBe(true);
490
+ expect(health.every((h) => h.checks === 10)).toBe(true);
491
+ expect(health.every((h) => h.failures === 0)).toBe(true);
492
+
493
+ // Cleanup mocks
494
+ await cleanupMocks();
495
+ });
496
+ });