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,637 @@
1
+ /** biome-ignore-all lint/suspicious/noExplicitAny: Mock types require any for flexibility */
2
+ import { afterEach, beforeEach, describe, expect, it, mock } from "bun:test";
3
+ import { EntityPackage } from "./package";
4
+ export function mockEntityPackage(EntityPackage) {
5
+ // Return the mock object directly instead of using mock.module
6
+ return EntityPackage;
7
+ }
8
+ describe("EntityPackage", () => {
9
+ let packages;
10
+ const mockPackageName = "test-package";
11
+ const mockPackageJson = (overrides = {}) => ({
12
+ name: "test-package",
13
+ version: "1.0.0",
14
+ description: "Test package",
15
+ ...overrides,
16
+ });
17
+ let mockPackagesShell;
18
+ let mockEntitiesShell;
19
+ // Store original methods to restore after tests
20
+ let originalPackagesShellReadJsonFile;
21
+ let originalPackagesShellWriteJsonFile;
22
+ let originalPackagesShellReadChangelogFile;
23
+ let originalPackagesShellWriteChangelogFile;
24
+ let originalPackagesShellFileExists;
25
+ let originalPackagesShellReadDirectory;
26
+ let originalPackagesShellCanAccessFile;
27
+ let originalPackagesShellReadFileAsText;
28
+ let originalPackagesShellGetWorkspaceRoot;
29
+ let originalEntitiesShellRunBiomeCheck;
30
+ beforeEach(async () => {
31
+ // Import fresh modules to avoid interference
32
+ const { packagesShell } = await import("./package.shell");
33
+ const { entitiesShell } = await import("../entities.shell");
34
+ // Store original methods if not already stored
35
+ if (!originalPackagesShellReadJsonFile) {
36
+ originalPackagesShellReadJsonFile = packagesShell.readJsonFile;
37
+ }
38
+ if (!originalPackagesShellWriteJsonFile) {
39
+ originalPackagesShellWriteJsonFile = packagesShell.writeJsonFile;
40
+ }
41
+ if (!originalPackagesShellReadChangelogFile) {
42
+ originalPackagesShellReadChangelogFile = packagesShell.readChangelogFile;
43
+ }
44
+ if (!originalPackagesShellWriteChangelogFile) {
45
+ originalPackagesShellWriteChangelogFile = packagesShell.writeChangelogFile;
46
+ }
47
+ if (!originalPackagesShellFileExists) {
48
+ originalPackagesShellFileExists = packagesShell.fileExists;
49
+ }
50
+ if (!originalPackagesShellReadDirectory) {
51
+ originalPackagesShellReadDirectory = packagesShell.readDirectory;
52
+ }
53
+ if (!originalPackagesShellCanAccessFile) {
54
+ originalPackagesShellCanAccessFile = packagesShell.canAccessFile;
55
+ }
56
+ if (!originalPackagesShellReadFileAsText) {
57
+ originalPackagesShellReadFileAsText = packagesShell.readFileAsText;
58
+ }
59
+ if (!originalPackagesShellGetWorkspaceRoot) {
60
+ originalPackagesShellGetWorkspaceRoot = packagesShell.getWorkspaceRoot;
61
+ }
62
+ if (!originalEntitiesShellRunBiomeCheck) {
63
+ originalEntitiesShellRunBiomeCheck = entitiesShell.runBiomeCheck;
64
+ }
65
+ // Clear any existing mock state
66
+ mock.clearAllMocks();
67
+ // Mock packagesShell
68
+ mockPackagesShell = {
69
+ readJsonFile: mock((path) => {
70
+ if (path.includes("package.json")) {
71
+ return mockPackageJson();
72
+ }
73
+ throw new Error(`File not found: ${path}`);
74
+ }),
75
+ writeJsonFile: mock(() => Promise.resolve()),
76
+ readChangelogFile: mock((path) => {
77
+ if (path.includes("CHANGELOG.md")) {
78
+ return "# Test Changelog\n\n## 1.0.0\n- Initial release";
79
+ }
80
+ return "";
81
+ }),
82
+ writeChangelogFile: mock(() => Promise.resolve()),
83
+ runBiomeCheck: mock(() => Promise.resolve()),
84
+ fileExists: mock(() => Promise.resolve(true)),
85
+ readDirectory: mock(() => Promise.resolve([])),
86
+ canAccessFile: mock(() => Promise.resolve(true)),
87
+ readFileAsText: mock((path) => {
88
+ if (path.includes("package.json")) {
89
+ return Promise.resolve(JSON.stringify(mockPackageJson()));
90
+ }
91
+ return Promise.resolve("");
92
+ }),
93
+ getWorkspaceRoot: mock(() => Promise.resolve("/workspace")),
94
+ };
95
+ // Mock the packagesShell methods directly
96
+ packagesShell.readJsonFile = mockPackagesShell.readJsonFile;
97
+ packagesShell.writeJsonFile = mockPackagesShell.writeJsonFile;
98
+ packagesShell.readChangelogFile = mockPackagesShell.readChangelogFile;
99
+ packagesShell.writeChangelogFile = mockPackagesShell.writeChangelogFile;
100
+ packagesShell.fileExists = mockPackagesShell.fileExists;
101
+ packagesShell.readDirectory = mockPackagesShell.readDirectory;
102
+ packagesShell.canAccessFile = mockPackagesShell.canAccessFile;
103
+ packagesShell.readFileAsText = mockPackagesShell.readFileAsText;
104
+ packagesShell.getWorkspaceRoot = mockPackagesShell.getWorkspaceRoot;
105
+ // Mock the entitiesShell methods directly
106
+ mockEntitiesShell = {
107
+ runBiomeCheck: mock(() => Promise.resolve()),
108
+ };
109
+ entitiesShell.runBiomeCheck = mockEntitiesShell.runBiomeCheck;
110
+ // Store for cleanup
111
+ // Original methods are now stored globally above
112
+ // Original methods are now stored globally above
113
+ // Create instance after mocking
114
+ packages = new EntityPackage(mockPackageName);
115
+ });
116
+ afterEach(async () => {
117
+ // Restore original methods
118
+ const { packagesShell } = await import("./package.shell");
119
+ const { entitiesShell } = await import("../entities.shell");
120
+ if (originalPackagesShellReadJsonFile) {
121
+ packagesShell.readJsonFile = originalPackagesShellReadJsonFile;
122
+ }
123
+ if (originalPackagesShellWriteJsonFile) {
124
+ packagesShell.writeJsonFile = originalPackagesShellWriteJsonFile;
125
+ }
126
+ if (originalPackagesShellReadChangelogFile) {
127
+ packagesShell.readChangelogFile = originalPackagesShellReadChangelogFile;
128
+ }
129
+ if (originalPackagesShellWriteChangelogFile) {
130
+ packagesShell.writeChangelogFile = originalPackagesShellWriteChangelogFile;
131
+ }
132
+ if (originalPackagesShellFileExists) {
133
+ packagesShell.fileExists = originalPackagesShellFileExists;
134
+ }
135
+ if (originalPackagesShellReadDirectory) {
136
+ packagesShell.readDirectory = originalPackagesShellReadDirectory;
137
+ }
138
+ if (originalPackagesShellCanAccessFile) {
139
+ packagesShell.canAccessFile = originalPackagesShellCanAccessFile;
140
+ }
141
+ if (originalPackagesShellReadFileAsText) {
142
+ packagesShell.readFileAsText = originalPackagesShellReadFileAsText;
143
+ }
144
+ if (originalPackagesShellGetWorkspaceRoot) {
145
+ packagesShell.getWorkspaceRoot = originalPackagesShellGetWorkspaceRoot;
146
+ }
147
+ if (originalEntitiesShellRunBiomeCheck) {
148
+ entitiesShell.runBiomeCheck = originalEntitiesShellRunBiomeCheck;
149
+ }
150
+ });
151
+ describe("constructor", () => {
152
+ it("should create instance with package name", () => {
153
+ packages = new EntityPackage(mockPackageName);
154
+ expect(packages).toBeInstanceOf(EntityPackage);
155
+ });
156
+ it("should read package.json on construction", () => {
157
+ packages = new EntityPackage(mockPackageName);
158
+ expect(packages).toBeInstanceOf(EntityPackage);
159
+ });
160
+ });
161
+ describe("getPath", () => {
162
+ beforeEach(() => {
163
+ packages = new EntityPackage(mockPackageName);
164
+ });
165
+ it("should return root path for root package", () => {
166
+ const rootPackages = new EntityPackage("root");
167
+ expect(rootPackages.getPath()).toBe(".");
168
+ });
169
+ it("should return packages path for @repo packages", () => {
170
+ const repoPackages = new EntityPackage("@repo/test-package");
171
+ expect(repoPackages.getPath()).toBe("packages/test-package");
172
+ });
173
+ it("should return apps path for regular packages", () => {
174
+ expect(packages.getPath()).toBe("apps/test-package");
175
+ });
176
+ });
177
+ describe("getJsonPath", () => {
178
+ beforeEach(() => {
179
+ packages = new EntityPackage(mockPackageName);
180
+ });
181
+ it("should return correct package.json path", () => {
182
+ expect(packages.getJsonPath()).toBe("apps/test-package/package.json");
183
+ });
184
+ it("should return correct path for root package", () => {
185
+ const rootPackages = new EntityPackage("root");
186
+ expect(rootPackages.getJsonPath()).toBe("./package.json");
187
+ });
188
+ it("should return correct path for @repo package", () => {
189
+ const repoPackages = new EntityPackage("@repo/test-package");
190
+ expect(repoPackages.getJsonPath()).toBe("packages/test-package/package.json");
191
+ });
192
+ });
193
+ describe.skip("readJson", () => {
194
+ beforeEach(() => {
195
+ packages = new EntityPackage(mockPackageName);
196
+ });
197
+ it("should return cached package.json if available", () => {
198
+ const result1 = packages.readJson();
199
+ expect(result1).toEqual(mockPackageJson());
200
+ const result2 = packages.readJson();
201
+ expect(result2).toEqual(mockPackageJson());
202
+ });
203
+ it("should read and parse package.json from file", () => {
204
+ const result = packages.readJson();
205
+ expect(result).toEqual(mockPackageJson());
206
+ });
207
+ it("should throw error when file read fails", async () => {
208
+ // Create a fresh mock for this test
209
+ const { packagesShell } = await import("./package.shell");
210
+ packagesShell.readJsonFile = mock(() => {
211
+ throw new Error("File read failed");
212
+ });
213
+ expect(() => {
214
+ new EntityPackage("error-package");
215
+ }).toThrow("Package not found error-package at apps/error-package/package.json: Error: File read failed");
216
+ });
217
+ it("should throw error when JSON parsing fails", () => {
218
+ // Mock packagesShell to return invalid JSON for this test
219
+ mockPackagesShell.readJsonFile.mockImplementationOnce(() => {
220
+ throw new Error("Invalid JSON");
221
+ });
222
+ expect(() => {
223
+ new EntityPackage("invalid-json-package");
224
+ }).toThrow("Package not found invalid-json-package at apps/invalid-json-package/package.json: Error: Invalid JSON");
225
+ });
226
+ });
227
+ describe.skip("writeJson", () => {
228
+ beforeEach(() => {
229
+ packages = new EntityPackage(mockPackageName);
230
+ });
231
+ it("should write package.json and run biome check", async () => {
232
+ // Use the already mocked packagesShell methods from beforeEach
233
+ // No need for additional mock.module since we're already mocking at the method level
234
+ const newData = { ...mockPackageJson(), version: "2.0.0" };
235
+ await packages.writeJson(newData);
236
+ expect(packages.readJson().version).toBe("2.0.0");
237
+ });
238
+ it("should update cached package.json", async () => {
239
+ const newData = { ...mockPackageJson(), version: "3.0.0" };
240
+ await packages.writeJson(newData);
241
+ expect(packages.readJson().version).toBe("3.0.0");
242
+ });
243
+ });
244
+ describe("readVersion", () => {
245
+ beforeEach(() => {
246
+ packages = new EntityPackage(mockPackageName);
247
+ });
248
+ it("should return version from package.json", () => {
249
+ const version = packages.readVersion();
250
+ expect(version).toBe("1.0.0");
251
+ });
252
+ });
253
+ describe.skip("writeVersion", () => {
254
+ beforeEach(() => {
255
+ packages = new EntityPackage(mockPackageName);
256
+ });
257
+ it("should update version and write package.json", async () => {
258
+ await packages.writeVersion("2.0.0");
259
+ expect(packages.readVersion()).toBe("2.0.0");
260
+ });
261
+ it("should update cached package.json version", async () => {
262
+ await packages.writeVersion("3.0.0");
263
+ expect(packages.readVersion()).toBe("3.0.0");
264
+ });
265
+ });
266
+ describe("getChangelogPath", () => {
267
+ beforeEach(() => {
268
+ packages = new EntityPackage(mockPackageName);
269
+ });
270
+ it("should return correct changelog path", () => {
271
+ expect(packages.getChangelogPath()).toBe("apps/test-package/CHANGELOG.md");
272
+ });
273
+ });
274
+ describe("readChangelog", () => {
275
+ beforeEach(() => {
276
+ packages = new EntityPackage(mockPackageName);
277
+ });
278
+ it("should read changelog content", () => {
279
+ // Update the mock for this specific test
280
+ mockPackagesShell.readChangelogFile.mockImplementationOnce((path) => {
281
+ if (path.includes("CHANGELOG.md")) {
282
+ return "# Test Changelog\n\n## 1.0.0\n- Initial release";
283
+ }
284
+ return "";
285
+ });
286
+ const changelogPackages = new EntityPackage("test-package");
287
+ const result = changelogPackages.readChangelog();
288
+ expect(result).toBe("# Test Changelog\n\n## 1.0.0\n- Initial release");
289
+ });
290
+ it("should return empty string when changelog is empty", () => {
291
+ // Update the mock for this specific test
292
+ mockPackagesShell.readChangelogFile.mockImplementationOnce(() => "");
293
+ const emptyChangelogPackages = new EntityPackage("test-package");
294
+ const result = emptyChangelogPackages.readChangelog();
295
+ expect(result).toBe("");
296
+ });
297
+ it("should not throw error when changelog read fails", () => {
298
+ // The readChangelog method should handle errors gracefully
299
+ expect(() => packages.readChangelog()).not.toThrow();
300
+ });
301
+ });
302
+ describe("writeChangelog", () => {
303
+ beforeEach(() => {
304
+ packages = new EntityPackage(mockPackageName);
305
+ });
306
+ it("should write changelog when file exists", async () => {
307
+ const content = "# New Changelog\n\n## 2.0.0\n- New features";
308
+ await packages.writeChangelog(content);
309
+ expect(packages).toBeDefined();
310
+ });
311
+ it("should create changelog with createPath when file doesn't exist", async () => {
312
+ const content = "# New Changelog\n\n## 2.0.0\n- New features";
313
+ await packages.writeChangelog(content);
314
+ expect(packages).toBeDefined();
315
+ });
316
+ });
317
+ describe("validatePackage", () => {
318
+ beforeEach(() => {
319
+ packages = new EntityPackage(mockPackageName);
320
+ });
321
+ it.skip("should return valid result for valid package", () => {
322
+ const result = packages.validatePackage();
323
+ expect(result).toHaveLength(0);
324
+ });
325
+ it.skip("should return error for invalid version format", () => {
326
+ // Mock packagesShell to return invalid version for this test
327
+ mockPackagesShell.readJsonFile.mockImplementationOnce(() => mockPackageJson({ version: "invalid-version" }));
328
+ const invalidPackages = new EntityPackage("invalid-version-package");
329
+ const result = invalidPackages.validatePackage();
330
+ expect(result).toHaveLength(1);
331
+ expect(result[0]).toContain("invalid-version-package: Version should follow semantic versioning");
332
+ });
333
+ it.skip("should return error for missing description", () => {
334
+ const packageJson = mockPackageJson();
335
+ delete packageJson.description;
336
+ // Mock packagesShell to return package without description for this test
337
+ mockPackagesShell.readJsonFile.mockImplementationOnce(() => packageJson);
338
+ const noDescPackages = new EntityPackage("no-description-package");
339
+ const result = noDescPackages.validatePackage();
340
+ expect(result).toHaveLength(1);
341
+ expect(result[0]).toContain("no-description-package: Consider adding a description to package.json");
342
+ });
343
+ it.skip("should return multiple errors for multiple issues", () => {
344
+ const packageJson = mockPackageJson({ version: "invalid" });
345
+ delete packageJson.description;
346
+ // Mock packagesShell to return package with multiple issues for this test
347
+ mockPackagesShell.readJsonFile.mockImplementationOnce(() => packageJson);
348
+ const multiIssuePackages = new EntityPackage("multi-issue-package");
349
+ const result = multiIssuePackages.validatePackage();
350
+ expect(result).toHaveLength(2);
351
+ expect(result).toEqual(expect.arrayContaining([
352
+ expect.stringContaining("Version should follow semantic versioning"),
353
+ expect.stringContaining("Consider adding a description to package.json"),
354
+ ]));
355
+ });
356
+ it.skip("should validate semantic versioning correctly", () => {
357
+ const validVersions = ["1.0.0", "2.1.3", "10.20.30"];
358
+ const invalidVersions = ["1.0", "1.0.0.0", "1.0.0-beta", "v1.0.0"];
359
+ validVersions.forEach((version) => {
360
+ // Mock packagesShell to return valid version for this test
361
+ mockPackagesShell.readJsonFile.mockImplementationOnce(() => mockPackageJson({ version }));
362
+ const validPackages = new EntityPackage(`valid-${version}-package`);
363
+ const result = validPackages.validatePackage();
364
+ expect(result).toHaveLength(0);
365
+ });
366
+ invalidVersions.forEach((version) => {
367
+ // Mock packagesShell to return invalid version for this test
368
+ mockPackagesShell.readJsonFile.mockImplementationOnce(() => mockPackageJson({ version }));
369
+ const invalidPackages = new EntityPackage(`invalid-${version}-package`);
370
+ const result = invalidPackages.validatePackage();
371
+ expect(result.length).toBeGreaterThan(0);
372
+ });
373
+ });
374
+ });
375
+ describe("selective versioning", () => {
376
+ describe("shouldVersion", () => {
377
+ it.skip("should return true for packages with private: false", () => {
378
+ // Mock packagesShell to return package with private: false for this test
379
+ mockPackagesShell.readJsonFile.mockImplementationOnce(() => mockPackageJson({ private: false }));
380
+ const publicPackages = new EntityPackage("public-package");
381
+ expect(publicPackages.shouldVersion()).toBe(true);
382
+ });
383
+ it.skip("should return true for packages with no private field", () => {
384
+ const packageJson = mockPackageJson();
385
+ delete packageJson.private;
386
+ // Mock packagesShell to return package without private field for this test
387
+ mockPackagesShell.readJsonFile.mockImplementationOnce(() => packageJson);
388
+ const defaultPackages = new EntityPackage("default-package");
389
+ expect(defaultPackages.shouldVersion()).toBe(true);
390
+ });
391
+ it.skip("should return false for packages with private: true", () => {
392
+ // Mock packagesShell to return package with private: true for this test
393
+ mockPackagesShell.readJsonFile.mockImplementationOnce(() => mockPackageJson({ private: true }));
394
+ const privatePackages = new EntityPackage("private-package");
395
+ expect(privatePackages.shouldVersion()).toBe(false);
396
+ });
397
+ });
398
+ describe("getTagSeriesName", () => {
399
+ it.skip("should return 'v' for root package", () => {
400
+ // Mock packagesShell to return root package for this test
401
+ mockPackagesShell.readJsonFile.mockImplementationOnce(() => mockPackageJson({ name: "root", private: false }));
402
+ const rootPackages = new EntityPackage("root");
403
+ expect(rootPackages.getTagSeriesName()).toBe("v");
404
+ });
405
+ it.skip("should return 'package-name-v' for @repo packages", () => {
406
+ // Mock packagesShell to return @repo package for this test
407
+ mockPackagesShell.readJsonFile.mockImplementationOnce(() => mockPackageJson({ name: "@repo/package-name", private: false }));
408
+ const intershellPackages = new EntityPackage("@repo/package-name");
409
+ expect(intershellPackages.getTagSeriesName()).toBe("package-name-v");
410
+ });
411
+ it.skip("should return 'package-name-v' for regular packages", () => {
412
+ // Mock packagesShell to return regular package for this test
413
+ mockPackagesShell.readJsonFile.mockImplementationOnce(() => mockPackageJson({ name: "my-app", private: false }));
414
+ const appPackages = new EntityPackage("my-app");
415
+ expect(appPackages.getTagSeriesName()).toBe("my-app-v");
416
+ });
417
+ it.skip("should return null for private packages", () => {
418
+ // Mock packagesShell to return private package for this test
419
+ mockPackagesShell.readJsonFile.mockImplementationOnce(() => mockPackageJson({ private: true }));
420
+ const privatePackages = new EntityPackage("private-package");
421
+ expect(privatePackages.getTagSeriesName()).toBe(null);
422
+ });
423
+ });
424
+ });
425
+ describe("static methods", () => {
426
+ describe("getRepoUrl", () => {
427
+ it.skip("should return repository URL when repository is a string", () => {
428
+ // Mock packagesShell to return root package with string repository for this test
429
+ mockPackagesShell.readJsonFile.mockImplementationOnce(() => mockPackageJson({
430
+ name: "root",
431
+ repository: "https://github.com/user/repo.git",
432
+ }));
433
+ const result = EntityPackage.getRepoUrl();
434
+ expect(result).toBe("https://github.com/user/repo.git");
435
+ });
436
+ it.skip("should return repository URL when repository is an object", () => {
437
+ // Mock packagesShell to return root package with object repository for this test
438
+ mockPackagesShell.readJsonFile.mockImplementationOnce(() => mockPackageJson({
439
+ name: "root",
440
+ repository: {
441
+ type: "git",
442
+ url: "https://github.com/user/repo.git",
443
+ },
444
+ }));
445
+ const result = EntityPackage.getRepoUrl();
446
+ expect(result).toBe("https://github.com/user/repo.git");
447
+ });
448
+ it("should return empty string when repository is missing", () => {
449
+ const packageJson = mockPackageJson({ name: "root" });
450
+ delete packageJson.repository;
451
+ // Mock packagesShell to return root package without repository for this test
452
+ mockPackagesShell.readJsonFile.mockImplementationOnce(() => packageJson);
453
+ const result = EntityPackage.getRepoUrl();
454
+ expect(result).toBe("");
455
+ });
456
+ it("should return empty string when repository object has no url", () => {
457
+ // Mock packagesShell to return root package with repository object without url for this test
458
+ mockPackagesShell.readJsonFile.mockImplementationOnce(() => mockPackageJson({
459
+ name: "root",
460
+ repository: {
461
+ type: "git",
462
+ url: "",
463
+ },
464
+ }));
465
+ const result = EntityPackage.getRepoUrl();
466
+ expect(result).toBe("");
467
+ });
468
+ it("should return empty string when repository object has no url property", () => {
469
+ // Mock packagesShell to return root package with repository object without url property for this test
470
+ mockPackagesShell.readJsonFile.mockImplementationOnce(() => mockPackageJson({
471
+ name: "root",
472
+ repository: {
473
+ type: "git",
474
+ url: "", // Provide empty url to satisfy type requirements
475
+ },
476
+ }));
477
+ const result = EntityPackage.getRepoUrl();
478
+ expect(result).toBe("");
479
+ });
480
+ it("should return empty string when repository is undefined", () => {
481
+ // Mock packagesShell to return root package with undefined repository for this test
482
+ mockPackagesShell.readJsonFile.mockImplementationOnce(() => mockPackageJson({
483
+ name: "root",
484
+ repository: undefined,
485
+ }));
486
+ const result = EntityPackage.getRepoUrl();
487
+ expect(result).toBe("");
488
+ });
489
+ it.skip("should return repository URL when repository is a string", () => {
490
+ // Mock packagesShell to return root package with string repository for this test
491
+ mockPackagesShell.readJsonFile.mockImplementationOnce(() => mockPackageJson({
492
+ name: "root",
493
+ repository: "https://github.com/example/repo",
494
+ }));
495
+ const result = EntityPackage.getRepoUrl();
496
+ expect(result).toBe("https://github.com/example/repo");
497
+ });
498
+ });
499
+ describe("getAllPackages", () => {
500
+ it("should return list of packages including root", async () => {
501
+ // Mock packagesShell methods for this test
502
+ mockPackagesShell.getWorkspaceRoot.mockResolvedValueOnce("/workspace");
503
+ mockPackagesShell.readDirectory
504
+ .mockResolvedValueOnce(["test-app", "another-app"]) // apps
505
+ .mockResolvedValueOnce(["ui", "utils"]); // packages
506
+ mockPackagesShell.canAccessFile
507
+ .mockResolvedValueOnce(true) // apps/test-app/package.json
508
+ .mockResolvedValueOnce(true) // apps/another-app/package.json
509
+ .mockResolvedValueOnce(true) // packages/ui/package.json
510
+ .mockResolvedValueOnce(true); // packages/utils/package.json
511
+ mockPackagesShell.readFileAsText
512
+ .mockResolvedValueOnce('{"name": "test-app", "version": "1.0.0"}')
513
+ .mockResolvedValueOnce('{"name": "another-app", "version": "1.0.0"}')
514
+ .mockResolvedValueOnce('{"name": "@repo/ui", "version": "1.0.0"}')
515
+ .mockResolvedValueOnce('{"name": "@repo/utils", "version": "1.0.0"}');
516
+ const result = await EntityPackage.getAllPackages();
517
+ expect(result).toContain("root");
518
+ expect(result).toContain("test-app");
519
+ expect(result).toContain("another-app");
520
+ expect(result).toContain("@repo/ui");
521
+ expect(result).toContain("@repo/utils");
522
+ });
523
+ it("should handle empty directories gracefully", async () => {
524
+ // Mock packagesShell methods for this test
525
+ mockPackagesShell.getWorkspaceRoot.mockResolvedValueOnce("/workspace");
526
+ mockPackagesShell.readDirectory
527
+ .mockResolvedValueOnce([]) // apps
528
+ .mockResolvedValueOnce([]); // packages
529
+ const result = await EntityPackage.getAllPackages();
530
+ expect(result).toEqual(["root"]);
531
+ });
532
+ it("should filter out packages without valid package.json", async () => {
533
+ // Mock packagesShell methods for this test
534
+ mockPackagesShell.getWorkspaceRoot.mockResolvedValueOnce("/workspace");
535
+ mockPackagesShell.readDirectory
536
+ .mockResolvedValueOnce(["invalid-app"]) // apps
537
+ .mockResolvedValueOnce(["invalid-pkg"]); // packages
538
+ mockPackagesShell.canAccessFile
539
+ .mockResolvedValueOnce(false) // apps/invalid-app/package.json
540
+ .mockResolvedValueOnce(false); // packages/invalid-pkg/package.json
541
+ const result = await EntityPackage.getAllPackages();
542
+ expect(result).toEqual(["root"]);
543
+ });
544
+ });
545
+ });
546
+ describe("edge cases and error handling", () => {
547
+ it("should handle package names with special characters", () => {
548
+ const specialPackages = new EntityPackage("test-package@1.0.0");
549
+ expect(specialPackages.getPath()).toBe("apps/test-package@1.0.0");
550
+ });
551
+ it("should handle empty package name", () => {
552
+ const emptyPackages = new EntityPackage("");
553
+ expect(emptyPackages.getPath()).toBe("apps/");
554
+ });
555
+ it("should handle very long package names", () => {
556
+ const longName = "a".repeat(1000);
557
+ const longPackages = new EntityPackage(longName);
558
+ expect(longPackages.getPath()).toBe(`apps/${longName}`);
559
+ });
560
+ it("should handle package names with spaces", () => {
561
+ const spacedPackages = new EntityPackage("test package");
562
+ expect(spacedPackages.getPath()).toBe("apps/test package");
563
+ });
564
+ });
565
+ describe("getVersionedPackages", () => {
566
+ it.skip("should return packages that should be versioned", async () => {
567
+ // Mock packagesShell methods for this test
568
+ mockPackagesShell.getWorkspaceRoot.mockResolvedValueOnce("/workspace");
569
+ mockPackagesShell.readDirectory
570
+ .mockResolvedValueOnce(["test-app"]) // apps
571
+ .mockResolvedValueOnce(["ui"]); // packages
572
+ mockPackagesShell.canAccessFile
573
+ .mockResolvedValueOnce(true) // apps/test-app/package.json
574
+ .mockResolvedValueOnce(true); // packages/ui/package.json
575
+ mockPackagesShell.readFileAsText
576
+ .mockResolvedValueOnce('{"name": "test-app", "version": "1.0.0", "private": false}')
577
+ .mockResolvedValueOnce('{"name": "@repo/ui", "version": "1.0.0", "private": false}');
578
+ const result = await EntityPackage.getVersionedPackages();
579
+ expect(Array.isArray(result)).toBe(true);
580
+ expect(result).toContain("test-app");
581
+ expect(result).toContain("@repo/ui");
582
+ });
583
+ });
584
+ describe("getUnversionedPackages", () => {
585
+ it.skip("should return packages that should not be versioned", async () => {
586
+ // Override the readJsonFile mock for this specific test to return private packages
587
+ mockPackagesShell.readJsonFile.mockImplementation((path) => {
588
+ if (path.includes("test-app")) {
589
+ return { name: "test-app", version: "1.0.0", private: true };
590
+ }
591
+ if (path.includes("ui")) {
592
+ return { name: "@repo/ui", version: "1.0.0", private: true };
593
+ }
594
+ // Default fallback
595
+ return mockPackageJson();
596
+ });
597
+ // Mock packagesShell methods for this test
598
+ mockPackagesShell.getWorkspaceRoot.mockResolvedValueOnce("/workspace");
599
+ mockPackagesShell.readDirectory
600
+ .mockResolvedValueOnce(["test-app"]) // apps
601
+ .mockResolvedValueOnce(["ui"]); // packages
602
+ mockPackagesShell.canAccessFile
603
+ .mockResolvedValueOnce(true) // apps/test-app/package.json
604
+ .mockResolvedValueOnce(true); // packages/ui/package.json
605
+ mockPackagesShell.readFileAsText
606
+ .mockResolvedValueOnce('{"name": "test-app", "version": "1.0.0", "private": true}')
607
+ .mockResolvedValueOnce('{"name": "@repo/ui", "version": "1.0.0", "private": true}');
608
+ const result = await EntityPackage.getUnversionedPackages();
609
+ expect(Array.isArray(result)).toBe(true);
610
+ expect(result).toContain("test-app");
611
+ expect(result).toContain("@repo/ui");
612
+ });
613
+ });
614
+ describe.skip("validateAllPackages", () => {
615
+ it("should validate all packages and return results", async () => {
616
+ // Mock packagesShell methods for this test
617
+ mockPackagesShell.getWorkspaceRoot.mockResolvedValueOnce("/workspace");
618
+ mockPackagesShell.readDirectory
619
+ .mockResolvedValueOnce(["test-app"]) // apps
620
+ .mockResolvedValueOnce(["ui"]); // packages
621
+ mockPackagesShell.canAccessFile
622
+ .mockResolvedValueOnce(true) // apps/test-app/package.json
623
+ .mockResolvedValueOnce(true); // packages/ui/package.json
624
+ mockPackagesShell.readFileAsText
625
+ .mockResolvedValueOnce('{"name": "test-app", "version": "1.0.0", "private": false}')
626
+ .mockResolvedValueOnce('{"name": "@repo/ui", "version": "1.0.0", "private": false}');
627
+ const result = await EntityPackage.validateAllPackages();
628
+ expect(Array.isArray(result)).toBe(true);
629
+ console.log(result);
630
+ expect(result).toHaveLength(3);
631
+ expect(result).toContain("root: Consider adding a description to package.json");
632
+ expect(result).toContain("test-app: Consider adding a description to package.json");
633
+ expect(result).toContain("@repo/ui: Consider adding a description to package.json");
634
+ });
635
+ });
636
+ });
637
+ //# sourceMappingURL=package.test.js.map