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,267 @@
1
+ import { entitiesShell } from "../entities.shell";
2
+ import { entitiesConfig } from "../intershell-config/intershell-config";
3
+ import { packagesShell } from "./package.shell";
4
+ import type { PackageJson, TsConfig } from "./package.types";
5
+
6
+ export class EntityPackage {
7
+ private readonly packageName: string;
8
+ private packageJson: PackageJson | undefined;
9
+ constructor(packageName: string) {
10
+ this.packageName = packageName;
11
+ this.packageJson = this.readJson();
12
+ }
13
+
14
+ getName(): string {
15
+ return this.packageName;
16
+ }
17
+ isRoot(): boolean {
18
+ return this.getName() === "root";
19
+ }
20
+
21
+ getPath(): string {
22
+ if (this.packageName === "root") return ".";
23
+ if (this.packageName.startsWith("@repo/"))
24
+ return `packages/${this.packageName.replace("@repo/", "")}`;
25
+ return `apps/${this.packageName}`;
26
+ }
27
+
28
+ getJsonPath(): string {
29
+ return `${this.getPath()}/package.json`;
30
+ }
31
+ readJson(): PackageJson {
32
+ if (this.packageJson) {
33
+ return this.packageJson;
34
+ }
35
+
36
+ const jsonPath = this.getJsonPath();
37
+ try {
38
+ const packageJson = packagesShell.readJsonFile(jsonPath);
39
+ return packageJson;
40
+ } catch (error) {
41
+ throw new Error(`Package not found ${this.packageName} at ${this.getJsonPath()}: ${error}`);
42
+ }
43
+ }
44
+ async writeJson(data: PackageJson): Promise<void> {
45
+ await packagesShell.writeJsonFile(this.getJsonPath(), data);
46
+ this.packageJson = data;
47
+ await entitiesShell.runBiomeCheck(this.getJsonPath());
48
+ }
49
+
50
+ readVersion(): string | undefined {
51
+ return this.readJson().version;
52
+ }
53
+ async writeVersion(version: string): Promise<void> {
54
+ const packageJson = this.readJson();
55
+ packageJson.version = version;
56
+ this.packageJson = packageJson;
57
+ await this.writeJson(packageJson);
58
+ }
59
+
60
+ getTsconfigPath(): string {
61
+ return `${this.getPath()}/tsconfig.json`;
62
+ }
63
+ readTsconfig(): TsConfig {
64
+ const tsconfigPath = this.getTsconfigPath();
65
+ const content = packagesShell.readFileAsTextSync(tsconfigPath);
66
+ return JSON.parse(content);
67
+ }
68
+ async writeTsconfig(content: string): Promise<void> {
69
+ const tsconfigPath = this.getTsconfigPath();
70
+ await packagesShell.writeFileAsText(tsconfigPath, content);
71
+ await entitiesShell.runBiomeCheck(tsconfigPath);
72
+ }
73
+
74
+ getChangelogPath(): string {
75
+ return `${this.getPath()}/CHANGELOG.md`;
76
+ }
77
+ readChangelog(): string {
78
+ const changelogPath = this.getChangelogPath();
79
+ return packagesShell.readChangelogFile(changelogPath);
80
+ }
81
+ async writeChangelog(content: string): Promise<void> {
82
+ await packagesShell.writeChangelogFile(this.getChangelogPath(), content);
83
+ await entitiesShell.runBiomeCheck(this.getChangelogPath());
84
+ }
85
+
86
+ validatePackage(): string[] {
87
+ const packageJson = this.readJson();
88
+ const config = entitiesConfig.getConfig();
89
+ const errors: string[] = [];
90
+
91
+ // Only validate if package validation is enabled
92
+ if (!config.package) {
93
+ return errors;
94
+ }
95
+
96
+ const rules = config.package;
97
+
98
+ // Selective versioning rules
99
+ if (rules.selectiveVersioning.enabled) {
100
+ if (packageJson.private === true && packageJson.version) {
101
+ errors.push(`${this.packageName}: Private packages should not have version field`);
102
+ }
103
+ if (packageJson.private !== true && !packageJson.version) {
104
+ errors.push(`${this.packageName}: Versioned packages must have a version field`);
105
+ }
106
+ if (!packageJson.version && packageJson.private !== true) {
107
+ errors.push(`${this.packageName}: Unversioned packages must have private: true`);
108
+ }
109
+ if (packageJson.version && packageJson.private === true) {
110
+ errors.push(`${this.packageName}: Versioned packages should not have private: true`);
111
+ }
112
+ }
113
+
114
+ // Semantic versioning rules
115
+ if (rules.semanticVersioning.enabled && packageJson.version) {
116
+ if (!/^\d+\.\d+\.\d+$/.test(packageJson.version)) {
117
+ errors.push(`${this.packageName}: Version should follow semantic versioning (e.g., 1.0.0)`);
118
+ }
119
+ }
120
+
121
+ // Description rules
122
+ if (rules.description.enabled && packageJson.version && !packageJson.description) {
123
+ errors.push(`${this.packageName}: Consider adding a description to package.json`);
124
+ }
125
+
126
+ return errors;
127
+ }
128
+
129
+ /**
130
+ * Determines if this package should be versioned based on its private field
131
+ * @returns true if the package should be versioned (private !== true)
132
+ */
133
+ shouldVersion(): boolean {
134
+ const packageJson = this.readJson();
135
+ // Package should be versioned if private is false or undefined
136
+ return packageJson.private !== true;
137
+ }
138
+
139
+ /**
140
+ * Gets the tag series name for this package
141
+ * @returns tag series prefix (e.g., 'v', 'intershell-v') or null if package shouldn't be versioned
142
+ */
143
+ getTagSeriesName(): string | null {
144
+ if (!this.shouldVersion()) return null;
145
+
146
+ // Generate tag series name based on package name
147
+ if (this.packageName === "root") return "v";
148
+ return `${this.packageName.replace("@repo/", "")}-v`;
149
+ }
150
+
151
+ static getRepoUrl(): string {
152
+ const rootPackageJson = new EntityPackage("root").readJson();
153
+ return typeof rootPackageJson.repository === "string"
154
+ ? rootPackageJson.repository
155
+ : rootPackageJson.repository?.url || "";
156
+ }
157
+ static async getAllPackages(): Promise<string[]> {
158
+ const packages: string[] = ["root"];
159
+
160
+ // Get workspace root
161
+ const workspaceRoot = await packagesShell.getWorkspaceRoot();
162
+
163
+ // Read apps directory
164
+ let apps: string[] = [];
165
+ try {
166
+ const appsPath = `${workspaceRoot}/apps`;
167
+ apps = await packagesShell.readDirectory(appsPath);
168
+ } catch {
169
+ // apps directory doesn't exist or can't be read
170
+ }
171
+
172
+ // Read packages directory
173
+ let pkgs: string[] = [];
174
+ try {
175
+ const packagesPath = `${workspaceRoot}/packages`;
176
+ const packageNames = await packagesShell.readDirectory(packagesPath);
177
+ pkgs = packageNames.map((name) => `@repo/${name}`);
178
+ } catch {
179
+ // packages directory doesn't exist or can't be read
180
+ }
181
+
182
+ // Filter packages that have valid package.json files
183
+ const filteredPackages = await Promise.all(
184
+ [...apps, ...pkgs].map(async (pkg) => {
185
+ const packageInstance = new EntityPackage(pkg);
186
+ const packageJsonPath = packageInstance.getJsonPath();
187
+
188
+ try {
189
+ const exists = await packagesShell.canAccessFile(packageJsonPath);
190
+ if (!exists) return null;
191
+
192
+ const packageJsonContent = await packagesShell.readFileAsText(packageJsonPath);
193
+ const packageJson = JSON.parse(packageJsonContent);
194
+ const name = packageJson.name;
195
+
196
+ if (!name) return null;
197
+
198
+ if (name !== pkg) {
199
+ throw new Error(`Package ${pkg} has a different name in package.json: ${name}`);
200
+ }
201
+
202
+ return name;
203
+ } catch {
204
+ return null;
205
+ }
206
+ }),
207
+ );
208
+
209
+ packages.push(...filteredPackages.filter((pkg): pkg is string => pkg !== null));
210
+
211
+ return packages;
212
+ }
213
+
214
+ /**
215
+ * Gets all packages that should be versioned (private !== true)
216
+ * @returns Array of package names that should be versioned
217
+ */
218
+ static async getVersionedPackages(): Promise<string[]> {
219
+ const allPackages = await EntityPackage.getAllPackages();
220
+ const versionedPackages: string[] = [];
221
+
222
+ for (const packageName of allPackages) {
223
+ const packageInstance = new EntityPackage(packageName);
224
+ if (packageInstance.shouldVersion()) {
225
+ versionedPackages.push(packageName);
226
+ }
227
+ }
228
+
229
+ return versionedPackages;
230
+ }
231
+
232
+ /**
233
+ * Gets all packages that should NOT be versioned (private === true)
234
+ * @returns Array of package names that should NOT be versioned
235
+ */
236
+ static async getUnversionedPackages(): Promise<string[]> {
237
+ const allPackages = await EntityPackage.getAllPackages();
238
+ const unversionedPackages: string[] = [];
239
+
240
+ for (const packageName of allPackages) {
241
+ const packageInstance = new EntityPackage(packageName);
242
+ if (!packageInstance.shouldVersion()) {
243
+ unversionedPackages.push(packageName);
244
+ }
245
+ }
246
+
247
+ return unversionedPackages;
248
+ }
249
+
250
+ /**
251
+ * Validates all packages in the workspace
252
+ * @returns Object containing validation results for all packages
253
+ */
254
+ static async validateAllPackages(): Promise<string[]> {
255
+ const allPackages = await EntityPackage.getAllPackages();
256
+ const errors: Array<string> = [];
257
+
258
+ for (const packageName of allPackages) {
259
+ const packageInstance = new EntityPackage(packageName);
260
+ const packageErrors = packageInstance.validatePackage();
261
+
262
+ errors.push(...packageErrors);
263
+ }
264
+
265
+ return errors;
266
+ }
267
+ }
@@ -0,0 +1,49 @@
1
+ export interface PackageJson {
2
+ intershell?: {
3
+ config: string;
4
+ };
5
+ name: string;
6
+ version?: string; // Make version optional since private packages shouldn't have versions
7
+ description?: string;
8
+ main?: string;
9
+ scripts?: Record<string, string>;
10
+ dependencies?: Record<string, string>;
11
+ devDependencies?: Record<string, string>;
12
+ peerDependencies?: Record<string, string>;
13
+ author?: string;
14
+ license?: string;
15
+ repository?: string | RepositoryInfo;
16
+ bugs?: string | BugsInfo;
17
+ homepage?: string;
18
+ keywords?: string[];
19
+ private?: boolean;
20
+ workspaces?: string[];
21
+ [key: string]: unknown;
22
+ }
23
+
24
+ export interface TsConfigPaths {
25
+ readonly [key: string]: string[];
26
+ }
27
+
28
+ export interface TsConfig {
29
+ readonly extends?: string;
30
+ readonly compilerOptions?: {
31
+ readonly baseUrl?: string;
32
+ readonly paths?: TsConfigPaths;
33
+ readonly rootDir?: string;
34
+ readonly outDir?: string;
35
+ readonly references?: Array<{ readonly path: string }>;
36
+ };
37
+ readonly include?: string[];
38
+ readonly exclude?: string[];
39
+ }
40
+
41
+ export interface RepositoryInfo {
42
+ type: string;
43
+ url: string;
44
+ }
45
+
46
+ export interface BugsInfo {
47
+ url: string;
48
+ email?: string;
49
+ }
@@ -0,0 +1,3 @@
1
+ export * from "./package-changelog";
2
+ export * from "./package-changelog.types";
3
+ export * from "./template.default";
@@ -0,0 +1,81 @@
1
+ import type { ParsedCommitData } from "../commit";
2
+ import type { EntityPackage } from "../package";
3
+ import type { ChangelogData, VersionData } from "./package-changelog.types";
4
+ import type { TemplateEngine } from "./template";
5
+
6
+ export class EntityPackageChangelog {
7
+ private package: EntityPackage;
8
+ private template: TemplateEngine;
9
+ private versionMode: boolean;
10
+
11
+ private changelogData: ChangelogData | undefined;
12
+ private versionData: VersionData | undefined;
13
+
14
+ constructor(
15
+ packageInstance: EntityPackage,
16
+ commits: ParsedCommitData[],
17
+ options: { template: TemplateEngine; versionMode?: boolean; versionData?: VersionData },
18
+ ) {
19
+ this.package = packageInstance;
20
+ this.template = options.template;
21
+ this.versionMode = options.versionMode ?? true;
22
+ this.versionData = options.versionData;
23
+ this.changelogData = this.getChangelogData(commits);
24
+ }
25
+
26
+ generateChangelog(): string {
27
+ if (!this.changelogData) {
28
+ throw new Error("Changelog data not generated.");
29
+ }
30
+ if (!this.template) {
31
+ throw new Error("Template engine not set.");
32
+ }
33
+
34
+ const changelog = this.template.generateContent(this.changelogData);
35
+ return changelog;
36
+ }
37
+
38
+ generateMergedChangelog(): string {
39
+ if (!this.changelogData) {
40
+ throw new Error("Data not analyzed. Call calculateRange() first.");
41
+ }
42
+ if (!this.versionData) {
43
+ throw new Error("Version data not determined. Call calculateRange() first.");
44
+ }
45
+ if (!this.template) {
46
+ throw new Error("Template engine not set.");
47
+ }
48
+
49
+ const mergedChangelogData: ChangelogData = new Map();
50
+
51
+ const existingChangelog = this.package.readChangelog();
52
+ const existingChangelogData = this.template.parseVersions(existingChangelog);
53
+
54
+ for (const [version, content] of existingChangelogData) {
55
+ mergedChangelogData.set(version, content);
56
+ }
57
+ for (const [version, content] of this.changelogData) {
58
+ mergedChangelogData.set(version, content);
59
+ }
60
+
61
+ const mergedChangelog = this.template.generateContent(mergedChangelogData);
62
+ return mergedChangelog;
63
+ }
64
+
65
+ private getChangelogData(commits: ParsedCommitData[]): ChangelogData {
66
+ const changelogData: ChangelogData = new Map();
67
+
68
+ if (commits.length === 0) {
69
+ return changelogData;
70
+ }
71
+
72
+ // Use target version if there's a version bump, otherwise use current version
73
+ const versionToUse = this.versionData?.shouldBump
74
+ ? this.versionData.targetVersion
75
+ : this.package.readVersion() || "0.0.0";
76
+
77
+ changelogData.set(this.versionMode ? versionToUse : "[Unreleased]", commits);
78
+
79
+ return changelogData;
80
+ }
81
+ }
@@ -0,0 +1,30 @@
1
+ import type { ParsedCommitData } from "../commit";
2
+
3
+ export type ChangelogData = Map<string, string | ParsedCommitData[]>;
4
+
5
+ export type VersionBumpType = "major" | "minor" | "patch" | "none" | "synced";
6
+
7
+ export interface VersionData {
8
+ readonly currentVersion: string;
9
+ readonly bumpType: VersionBumpType;
10
+ readonly shouldBump: boolean;
11
+ readonly targetVersion: string;
12
+ readonly reason: string;
13
+ }
14
+
15
+ export interface ChangelogSnapshot {
16
+ readonly versionData: VersionData;
17
+ readonly changelogData: ChangelogData;
18
+ }
19
+
20
+ export interface GitTagVersion {
21
+ readonly tag: string;
22
+ readonly version: string;
23
+ readonly commitHash: string;
24
+ readonly date: Date;
25
+ }
26
+
27
+ export interface PackageVersionHistory {
28
+ readonly packageName: string;
29
+ readonly versions: GitTagVersion[];
30
+ }
@@ -0,0 +1,109 @@
1
+ import { type ParsedCommitData, prCategories } from "../commit";
2
+ import { entitiesConfig } from "../intershell-config/intershell-config";
3
+ import { ChangelogTemplate } from "./template";
4
+
5
+ const DEFAULT_BADGE_COLOR = "6B7280";
6
+ const validTypes = entitiesConfig.getConfig().commit.conventional.type?.list ?? [];
7
+
8
+ export class DefaultChangelogTemplate extends ChangelogTemplate {
9
+ protected generateChangelogHeader(): string {
10
+ return [
11
+ `## Changelog (${this.packageName})`,
12
+ "",
13
+ "[![Keep a Changelog](https://img.shields.io/badge/changelog-Keep%20a%20Changelog%20v1.0.0-$E05735)](https://keepachangelog.com)",
14
+ "[![Semantic Versioning](https://img.shields.io/badge/semver-semantic%20versioning%20v2.0.0-%23E05735)](https://semver.org)",
15
+ "",
16
+ "All notable changes to this project will be documented in this file.",
17
+ "The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),",
18
+ "and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).",
19
+ "",
20
+ ].join("\n");
21
+ }
22
+
23
+ protected generateChangelogVersionHeader(version: string): string {
24
+ return ["", `## ${version === "[Unreleased]" ? "" : this.prefix}${version}`, ""].join("\n");
25
+ }
26
+
27
+ protected generateCommitSection(commit: ParsedCommitData, repoUrl: string): string {
28
+ if (commit.pr?.prNumber) {
29
+ return this.generatePrSection(commit, commit.pr.prCommits || [commit], repoUrl);
30
+ }
31
+
32
+ return `###### ${this.generateCommitLine(commit, repoUrl)}`;
33
+ }
34
+
35
+ private generatePrSection(
36
+ mainCommit: ParsedCommitData,
37
+ allCommits: ParsedCommitData[],
38
+ repoUrl: string,
39
+ ): string {
40
+ const { pr: { prNumber, prCategory = "other", prBranchName } = {} } = mainCommit;
41
+ const commitCount = allCommits.length;
42
+
43
+ const categoryEmoji = prCategories[prCategory]?.emoji;
44
+ const categoryTitle = prCategories[prCategory]?.label;
45
+ const prCategoryBadge = `<img src="https://img.shields.io/badge/${encodeURIComponent(categoryTitle)}-495057?style=flat" alt="${categoryTitle}" style="vertical-align: middle;" />`;
46
+ const prNumberBadge =
47
+ !!prNumber &&
48
+ `<img src="https://img.shields.io/badge/%23${prNumber}-blue?style=flat" alt="#${prNumber}" style="vertical-align: middle;" />`;
49
+ const commitCountBadge = `<img src="https://img.shields.io/badge/${commitCount}%20commits-green?style=flat" alt="${commitCount} commits" style="vertical-align: middle;" />`;
50
+ const prNumberLink =
51
+ !!prNumberBadge && `<a href="${repoUrl}/pull/${prNumber}">${prNumberBadge}</a>`;
52
+
53
+ const prMessages = mainCommit.message.isMerge
54
+ ? [
55
+ // mainCommit.message.bodyLines[0], // We don't want the first line: "Merge pull request #154 from feature/custom-version-management"
56
+ // "", // Empty line for separation, if you added the first line above, uncomment this line as well
57
+ ...mainCommit.message.bodyLines.slice(1), // Rest of the lines: "Refactors the version management system..."
58
+ ]
59
+ : [mainCommit.message.description, "", ...mainCommit.message.bodyLines];
60
+
61
+ return [
62
+ // Format: emoji branch-name category-title #PR-number commit-count
63
+ // Example: 🔄 refactor/test-versioning Code Quality & Refactoring #144 9 commits
64
+ "",
65
+ `### ${categoryEmoji} ${typeof prBranchName === "object" && prBranchName?.name ? prBranchName.name : typeof prBranchName === "string" ? prBranchName : "unknown-branch"} ${prCategoryBadge} ${prNumberLink} ${commitCountBadge}`,
66
+ "",
67
+ ...prMessages,
68
+ "",
69
+ "<details><summary><strong>📝 Commits</strong> (Click to expand)</summary>",
70
+ "",
71
+ ...allCommits.map((commit) => `- ${this.generateCommitLine(commit, repoUrl)}`),
72
+ "",
73
+ "</details>",
74
+ "",
75
+ ].join("\n");
76
+ }
77
+
78
+ private generateCommitLine(commit: ParsedCommitData, repoUrl: string): string {
79
+ const {
80
+ info: { hash, author = "Unknown" } = {},
81
+ message: { type, description, scopes = [] },
82
+ } = commit;
83
+
84
+ const hashKey = hash?.substring(0, 7) || "unknown";
85
+ const hashUrl = hash ? `${repoUrl}/commit/${hash}` : undefined;
86
+
87
+ const scopeSection =
88
+ scopes && scopes.length > 0
89
+ ? scopes.map((s: string) => s.toLowerCase().replace("-", "%20")).join(",")
90
+ : "";
91
+
92
+ const badgeText = `${type}-(${scopeSection || "noscope"})`;
93
+ const badgeColor = validTypes.find((t) => t.type === type)?.badgeColor || DEFAULT_BADGE_COLOR;
94
+ const badge = `<img src="https://img.shields.io/badge/${badgeText}-${badgeColor}?style=flat" alt="${type}" style="vertical-align: middle;" />`;
95
+ const badgeUrl = hashUrl ? `<a href="${hashUrl}">${badge}</a>` : badge;
96
+
97
+ const hashLink = hashUrl ? `([${hashKey}](${hashUrl}))` : `[${hashKey}]`;
98
+
99
+ return [
100
+ badgeUrl,
101
+ description,
102
+ hashLink,
103
+ author && (author.includes("@") ? `by [${author}](mailto:${author})` : `by **${author}**`),
104
+ ]
105
+ .filter(Boolean)
106
+ .join(" ")
107
+ .trim();
108
+ }
109
+ }
@@ -0,0 +1,118 @@
1
+ import type { ParsedCommitData } from "../commit";
2
+ import { EntityPackage } from "../package";
3
+ import type { ChangelogData } from "./package-changelog.types";
4
+
5
+ export interface TemplateEngine {
6
+ generateContent(data: ChangelogData): string;
7
+ parseVersions(content: string): ChangelogData;
8
+ sortVersions(versionA: string, versionB: string): number;
9
+ }
10
+ export type TemplateEngineData = ChangelogData;
11
+
12
+ const repoUrl = EntityPackage.getRepoUrl();
13
+
14
+ export class ChangelogTemplate implements TemplateEngine {
15
+ readonly packageName: string;
16
+ readonly prefix: string;
17
+
18
+ constructor(packageName: string, prefix: string) {
19
+ this.packageName = packageName;
20
+ this.prefix = prefix;
21
+ }
22
+
23
+ generateContent(changelogData: TemplateEngineData): string {
24
+ let changelog = this.generateChangelogHeader(this.packageName);
25
+
26
+ const sortedVersions = Array.from(changelogData.keys()).sort((a, b) => this.sortVersions(b, a));
27
+ for (const version of sortedVersions) {
28
+ const commits = changelogData.get(version) || [];
29
+ if (typeof commits === "string") {
30
+ changelog += `\n${commits}`;
31
+ continue;
32
+ }
33
+
34
+ const versionHeader = this.generateChangelogVersionHeader(version);
35
+ changelog += versionHeader;
36
+ changelog += commits.map((commit) => this.generateCommitSection(commit, repoUrl)).join("\n");
37
+ }
38
+
39
+ return changelog;
40
+ }
41
+
42
+ parseVersions(content: string): TemplateEngineData {
43
+ const versions: TemplateEngineData = new Map();
44
+ const lines = content.split("\n");
45
+ const headerEnd = lines.findIndex((line, i) => i > 0 && line.startsWith("## "));
46
+
47
+ if (headerEnd === -1) return versions;
48
+
49
+ let currentVersion = "";
50
+ let currentContent: string[] = [];
51
+
52
+ for (let i = headerEnd; i < lines.length; i++) {
53
+ const line = lines[i];
54
+ const isVersionLine =
55
+ line.match(/## \[Unreleased\]/) ||
56
+ line.match(new RegExp(`^## ${this.prefix}?\\d+\\.\\d+\\.\\d+`));
57
+
58
+ if (isVersionLine) {
59
+ if (currentVersion) {
60
+ versions.set(currentVersion, currentContent.join("\n"));
61
+ }
62
+
63
+ // Extract clean version number from the header line
64
+ let cleanVersion = line;
65
+ if (line.includes("[Unreleased]")) {
66
+ cleanVersion = "[Unreleased]";
67
+ } else {
68
+ // Extract version from "## v1.2.3" or "## intershell-v1.2.3" format
69
+ const versionMatch = line.match(new RegExp(`## (${this.prefix}\\d+\\.\\d+\\.\\d+)`));
70
+ if (versionMatch) {
71
+ cleanVersion = versionMatch[1].replace(this.prefix, "");
72
+ }
73
+ }
74
+
75
+ currentVersion = cleanVersion;
76
+ currentContent = [line];
77
+ } else {
78
+ currentContent.push(line);
79
+ }
80
+ }
81
+
82
+ if (currentVersion) {
83
+ versions.set(currentVersion, currentContent.join("\n"));
84
+ }
85
+
86
+ return versions;
87
+ }
88
+
89
+ sortVersions(versionA: string, versionB: string): number {
90
+ const partsA = versionA.split(".").map(Number);
91
+ const partsB = versionB.split(".").map(Number);
92
+
93
+ while (partsA.length < 3) partsA.push(0);
94
+ while (partsB.length < 3) partsB.push(0);
95
+
96
+ if (partsA[0] !== partsB[0]) {
97
+ return partsA[0] - partsB[0]; // Descending order (newest first)
98
+ }
99
+
100
+ if (partsA[1] !== partsB[1]) {
101
+ return partsA[1] - partsB[1]; // Descending order
102
+ }
103
+
104
+ return partsA[2] - partsB[2]; // Descending order
105
+ }
106
+
107
+ protected generateChangelogHeader(_packageName: string): string {
108
+ return "";
109
+ }
110
+
111
+ protected generateChangelogVersionHeader(_version: string): string {
112
+ return "";
113
+ }
114
+
115
+ protected generateCommitSection(_commit: ParsedCommitData, _repoUrl: string): string {
116
+ return "";
117
+ }
118
+ }
@@ -0,0 +1,29 @@
1
+ import { describe, expect, test } from "bun:test";
2
+ import { EntityPackage } from "../package";
3
+ import { EntityDependencyAnalyzer } from "./dependency-analyzer";
4
+
5
+ describe("EntityDependencyAnalyzer", () => {
6
+ test("should create instance", () => {
7
+ const packageInstance = new EntityPackage("root");
8
+ const analyzer = new EntityDependencyAnalyzer(packageInstance);
9
+ expect(analyzer).toBeDefined();
10
+ });
11
+
12
+ test("should get package dependencies at ref", async () => {
13
+ const packageInstance = new EntityPackage("root");
14
+ const analyzer = new EntityDependencyAnalyzer(packageInstance);
15
+
16
+ // This will return empty array since we can't mock git operations easily
17
+ const deps = await analyzer.getPackageDependenciesAtRef("HEAD");
18
+ expect(Array.isArray(deps)).toBe(true);
19
+ });
20
+
21
+ test("should handle dependencies", async () => {
22
+ const packageInstance = new EntityPackage("root");
23
+ const analyzer = new EntityDependencyAnalyzer(packageInstance);
24
+
25
+ const deps = await analyzer.getPackageDependenciesAtRef("HEAD");
26
+ expect(Array.isArray(deps)).toBe(true);
27
+ // Root package might have dependencies, so we just check it's an array
28
+ });
29
+ });