@xylabs/toolchain 7.10.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 (622) hide show
  1. package/dist/actions/analyze.mjs +140 -0
  2. package/dist/actions/analyze.mjs.map +1 -0
  3. package/dist/actions/build.mjs +173 -0
  4. package/dist/actions/build.mjs.map +1 -0
  5. package/dist/actions/claude-check.mjs +199 -0
  6. package/dist/actions/claude-check.mjs.map +1 -0
  7. package/dist/actions/claude-clean.mjs +70 -0
  8. package/dist/actions/claude-clean.mjs.map +1 -0
  9. package/dist/actions/claude-commands.mjs +126 -0
  10. package/dist/actions/claude-commands.mjs.map +1 -0
  11. package/dist/actions/claude-rules.mjs +151 -0
  12. package/dist/actions/claude-rules.mjs.map +1 -0
  13. package/dist/actions/claude-settings.mjs +99 -0
  14. package/dist/actions/claude-settings.mjs.map +1 -0
  15. package/dist/actions/claude-skills.mjs +131 -0
  16. package/dist/actions/claude-skills.mjs.map +1 -0
  17. package/dist/actions/clean-docs.mjs +66 -0
  18. package/dist/actions/clean-docs.mjs.map +1 -0
  19. package/dist/actions/clean-eslint.mjs +47 -0
  20. package/dist/actions/clean-eslint.mjs.map +1 -0
  21. package/dist/actions/clean.mjs +166 -0
  22. package/dist/actions/clean.mjs.map +1 -0
  23. package/dist/actions/compile.mjs +184 -0
  24. package/dist/actions/compile.mjs.map +1 -0
  25. package/dist/actions/copy-assets.mjs +81 -0
  26. package/dist/actions/copy-assets.mjs.map +1 -0
  27. package/dist/actions/cycle.mjs +275 -0
  28. package/dist/actions/cycle.mjs.map +1 -0
  29. package/dist/actions/dead.mjs +119 -0
  30. package/dist/actions/dead.mjs.map +1 -0
  31. package/dist/actions/deplint/checkPackage/checkPackage.mjs +1556 -0
  32. package/dist/actions/deplint/checkPackage/checkPackage.mjs.map +1 -0
  33. package/dist/actions/deplint/checkPackage/checkPackageTypes.mjs +1 -0
  34. package/dist/actions/deplint/checkPackage/checkPackageTypes.mjs.map +1 -0
  35. package/dist/actions/deplint/checkPackage/getMismatchedPeerDevVersions.mjs +77 -0
  36. package/dist/actions/deplint/checkPackage/getMismatchedPeerDevVersions.mjs.map +1 -0
  37. package/dist/actions/deplint/checkPackage/getUnlistedDependencies.mjs +158 -0
  38. package/dist/actions/deplint/checkPackage/getUnlistedDependencies.mjs.map +1 -0
  39. package/dist/actions/deplint/checkPackage/getUnlistedDevDependencies.mjs +125 -0
  40. package/dist/actions/deplint/checkPackage/getUnlistedDevDependencies.mjs.map +1 -0
  41. package/dist/actions/deplint/checkPackage/getUnnecessaryPeerDependencies.mjs +207 -0
  42. package/dist/actions/deplint/checkPackage/getUnnecessaryPeerDependencies.mjs.map +1 -0
  43. package/dist/actions/deplint/checkPackage/getUnsatisfiedPeerDependencies.mjs +318 -0
  44. package/dist/actions/deplint/checkPackage/getUnsatisfiedPeerDependencies.mjs.map +1 -0
  45. package/dist/actions/deplint/checkPackage/getUnusedDependencies.mjs +163 -0
  46. package/dist/actions/deplint/checkPackage/getUnusedDependencies.mjs.map +1 -0
  47. package/dist/actions/deplint/checkPackage/getUnusedDevDependencies.mjs +408 -0
  48. package/dist/actions/deplint/checkPackage/getUnusedDevDependencies.mjs.map +1 -0
  49. package/dist/actions/deplint/checkPackage/getUnusedPeerDependencies.mjs +75 -0
  50. package/dist/actions/deplint/checkPackage/getUnusedPeerDependencies.mjs.map +1 -0
  51. package/dist/actions/deplint/checkPackage/getWorkspaceVersionProblems.mjs +128 -0
  52. package/dist/actions/deplint/checkPackage/getWorkspaceVersionProblems.mjs.map +1 -0
  53. package/dist/actions/deplint/checkPackage/index.mjs +1609 -0
  54. package/dist/actions/deplint/checkPackage/index.mjs.map +1 -0
  55. package/dist/actions/deplint/deplint.mjs +1840 -0
  56. package/dist/actions/deplint/deplint.mjs.map +1 -0
  57. package/dist/actions/deplint/engine.mjs +1736 -0
  58. package/dist/actions/deplint/engine.mjs.map +1 -0
  59. package/dist/actions/deplint/findFiles.mjs +39 -0
  60. package/dist/actions/deplint/findFiles.mjs.map +1 -0
  61. package/dist/actions/deplint/findFilesByGlob.mjs +14 -0
  62. package/dist/actions/deplint/findFilesByGlob.mjs.map +1 -0
  63. package/dist/actions/deplint/fixer.mjs +103 -0
  64. package/dist/actions/deplint/fixer.mjs.map +1 -0
  65. package/dist/actions/deplint/getBasePackageName.mjs +13 -0
  66. package/dist/actions/deplint/getBasePackageName.mjs.map +1 -0
  67. package/dist/actions/deplint/getCliReferencedPackagesFromFiles.mjs +140 -0
  68. package/dist/actions/deplint/getCliReferencedPackagesFromFiles.mjs.map +1 -0
  69. package/dist/actions/deplint/getDependenciesFromPackageJson.mjs +29 -0
  70. package/dist/actions/deplint/getDependenciesFromPackageJson.mjs.map +1 -0
  71. package/dist/actions/deplint/getExtendsFromTsconfigs.mjs +68 -0
  72. package/dist/actions/deplint/getExtendsFromTsconfigs.mjs.map +1 -0
  73. package/dist/actions/deplint/getExternalImportsFromFiles.mjs +143 -0
  74. package/dist/actions/deplint/getExternalImportsFromFiles.mjs.map +1 -0
  75. package/dist/actions/deplint/getImportsFromFile.mjs +85 -0
  76. package/dist/actions/deplint/getImportsFromFile.mjs.map +1 -0
  77. package/dist/actions/deplint/getRequiredPeerDependencies.mjs +37 -0
  78. package/dist/actions/deplint/getRequiredPeerDependencies.mjs.map +1 -0
  79. package/dist/actions/deplint/getScriptReferencedPackages.mjs +83 -0
  80. package/dist/actions/deplint/getScriptReferencedPackages.mjs.map +1 -0
  81. package/dist/actions/deplint/implicitDevDependencies.mjs +116 -0
  82. package/dist/actions/deplint/implicitDevDependencies.mjs.map +1 -0
  83. package/dist/actions/deplint/index.mjs +1848 -0
  84. package/dist/actions/deplint/index.mjs.map +1 -0
  85. package/dist/actions/deplint/packageEditor.mjs +82 -0
  86. package/dist/actions/deplint/packageEditor.mjs.map +1 -0
  87. package/dist/actions/deplint/packageJsonEditor.mjs +101 -0
  88. package/dist/actions/deplint/packageJsonEditor.mjs.map +1 -0
  89. package/dist/actions/deplint/reporters.mjs +36 -0
  90. package/dist/actions/deplint/reporters.mjs.map +1 -0
  91. package/dist/actions/deplint/rules.mjs +1223 -0
  92. package/dist/actions/deplint/rules.mjs.map +1 -0
  93. package/dist/actions/deplint/snapshot.mjs +372 -0
  94. package/dist/actions/deplint/snapshot.mjs.map +1 -0
  95. package/dist/actions/deplint/tsScriptsAliases.mjs +20 -0
  96. package/dist/actions/deplint/tsScriptsAliases.mjs.map +1 -0
  97. package/dist/actions/deplint/types.mjs +1 -0
  98. package/dist/actions/deplint/types.mjs.map +1 -0
  99. package/dist/actions/deploy.mjs +194 -0
  100. package/dist/actions/deploy.mjs.map +1 -0
  101. package/dist/actions/dupdeps.mjs +226 -0
  102. package/dist/actions/dupdeps.mjs.map +1 -0
  103. package/dist/actions/eject.mjs +142 -0
  104. package/dist/actions/eject.mjs.map +1 -0
  105. package/dist/actions/fix.mjs +359 -0
  106. package/dist/actions/fix.mjs.map +1 -0
  107. package/dist/actions/gen-docs.mjs +155 -0
  108. package/dist/actions/gen-docs.mjs.map +1 -0
  109. package/dist/actions/gitignore.mjs +159 -0
  110. package/dist/actions/gitignore.mjs.map +1 -0
  111. package/dist/actions/gitlint-fix.mjs +27 -0
  112. package/dist/actions/gitlint-fix.mjs.map +1 -0
  113. package/dist/actions/gitlint.mjs +48 -0
  114. package/dist/actions/gitlint.mjs.map +1 -0
  115. package/dist/actions/index.mjs +8259 -0
  116. package/dist/actions/index.mjs.map +1 -0
  117. package/dist/actions/knip.mjs +119 -0
  118. package/dist/actions/knip.mjs.map +1 -0
  119. package/dist/actions/license.mjs +92 -0
  120. package/dist/actions/license.mjs.map +1 -0
  121. package/dist/actions/lint-init.mjs +275 -0
  122. package/dist/actions/lint-init.mjs.map +1 -0
  123. package/dist/actions/lint.mjs +356 -0
  124. package/dist/actions/lint.mjs.map +1 -0
  125. package/dist/actions/lintNext.mjs +209 -0
  126. package/dist/actions/lintNext.mjs.map +1 -0
  127. package/dist/actions/lintlint.mjs +341 -0
  128. package/dist/actions/lintlint.mjs.map +1 -0
  129. package/dist/actions/npmignore-gen.mjs +90 -0
  130. package/dist/actions/npmignore-gen.mjs.map +1 -0
  131. package/dist/actions/orphan.mjs +110 -0
  132. package/dist/actions/orphan.mjs.map +1 -0
  133. package/dist/actions/package/clean-outputs.mjs +50 -0
  134. package/dist/actions/package/clean-outputs.mjs.map +1 -0
  135. package/dist/actions/package/clean-typescript.mjs +50 -0
  136. package/dist/actions/package/clean-typescript.mjs.map +1 -0
  137. package/dist/actions/package/clean.mjs +69 -0
  138. package/dist/actions/package/clean.mjs.map +1 -0
  139. package/dist/actions/package/compile/XyConfig.mjs +32 -0
  140. package/dist/actions/package/compile/XyConfig.mjs.map +1 -0
  141. package/dist/actions/package/compile/buildEntries.mjs +53 -0
  142. package/dist/actions/package/compile/buildEntries.mjs.map +1 -0
  143. package/dist/actions/package/compile/compile.mjs +439 -0
  144. package/dist/actions/package/compile/compile.mjs.map +1 -0
  145. package/dist/actions/package/compile/copyTypeFiles.mjs +34 -0
  146. package/dist/actions/package/compile/copyTypeFiles.mjs.map +1 -0
  147. package/dist/actions/package/compile/deepMerge.mjs +27 -0
  148. package/dist/actions/package/compile/deepMerge.mjs.map +1 -0
  149. package/dist/actions/package/compile/getCompilerOptions.mjs +12 -0
  150. package/dist/actions/package/compile/getCompilerOptions.mjs.map +1 -0
  151. package/dist/actions/package/compile/index.mjs +472 -0
  152. package/dist/actions/package/compile/index.mjs.map +1 -0
  153. package/dist/actions/package/compile/inputs.mjs +22 -0
  154. package/dist/actions/package/compile/inputs.mjs.map +1 -0
  155. package/dist/actions/package/compile/packageCompileTsc.mjs +93 -0
  156. package/dist/actions/package/compile/packageCompileTsc.mjs.map +1 -0
  157. package/dist/actions/package/compile/packageCompileTscTypes.mjs +92 -0
  158. package/dist/actions/package/compile/packageCompileTscTypes.mjs.map +1 -0
  159. package/dist/actions/package/compile/packageCompileTsup.mjs +402 -0
  160. package/dist/actions/package/compile/packageCompileTsup.mjs.map +1 -0
  161. package/dist/actions/package/copy-assets.mjs +69 -0
  162. package/dist/actions/package/copy-assets.mjs.map +1 -0
  163. package/dist/actions/package/cycle.mjs +62 -0
  164. package/dist/actions/package/cycle.mjs.map +1 -0
  165. package/dist/actions/package/gen-docs.mjs +137 -0
  166. package/dist/actions/package/gen-docs.mjs.map +1 -0
  167. package/dist/actions/package/index.mjs +1131 -0
  168. package/dist/actions/package/index.mjs.map +1 -0
  169. package/dist/actions/package/lint.mjs +87 -0
  170. package/dist/actions/package/lint.mjs.map +1 -0
  171. package/dist/actions/package/publint.mjs +336 -0
  172. package/dist/actions/package/publint.mjs.map +1 -0
  173. package/dist/actions/package/recompile.mjs +510 -0
  174. package/dist/actions/package/recompile.mjs.map +1 -0
  175. package/dist/actions/package-lint-deps.mjs +348 -0
  176. package/dist/actions/package-lint-deps.mjs.map +1 -0
  177. package/dist/actions/package-lint.mjs +774 -0
  178. package/dist/actions/package-lint.mjs.map +1 -0
  179. package/dist/actions/packman/clean.mjs +144 -0
  180. package/dist/actions/packman/clean.mjs.map +1 -0
  181. package/dist/actions/packman/convert.mjs +1331 -0
  182. package/dist/actions/packman/convert.mjs.map +1 -0
  183. package/dist/actions/packman/convertToPnpm.mjs +295 -0
  184. package/dist/actions/packman/convertToPnpm.mjs.map +1 -0
  185. package/dist/actions/packman/convertToYarn.mjs +307 -0
  186. package/dist/actions/packman/convertToYarn.mjs.map +1 -0
  187. package/dist/actions/packman/index.mjs +1493 -0
  188. package/dist/actions/packman/index.mjs.map +1 -0
  189. package/dist/actions/packman/lint.mjs +109 -0
  190. package/dist/actions/packman/lint.mjs.map +1 -0
  191. package/dist/actions/packman/rewriteScripts.mjs +52 -0
  192. package/dist/actions/packman/rewriteScripts.mjs.map +1 -0
  193. package/dist/actions/packman/rewriteSourceImports.mjs +60 -0
  194. package/dist/actions/packman/rewriteSourceImports.mjs.map +1 -0
  195. package/dist/actions/packman/swapTsScriptsDependency.mjs +57 -0
  196. package/dist/actions/packman/swapTsScriptsDependency.mjs.map +1 -0
  197. package/dist/actions/publint.mjs +748 -0
  198. package/dist/actions/publint.mjs.map +1 -0
  199. package/dist/actions/publish.mjs +208 -0
  200. package/dist/actions/publish.mjs.map +1 -0
  201. package/dist/actions/reactTest.mjs +142 -0
  202. package/dist/actions/reactTest.mjs.map +1 -0
  203. package/dist/actions/readme-gen.mjs +362 -0
  204. package/dist/actions/readme-gen.mjs.map +1 -0
  205. package/dist/actions/readme-init.mjs +89 -0
  206. package/dist/actions/readme-init.mjs.map +1 -0
  207. package/dist/actions/readme-lint.mjs +147 -0
  208. package/dist/actions/readme-lint.mjs.map +1 -0
  209. package/dist/actions/rebuild.mjs +143 -0
  210. package/dist/actions/rebuild.mjs.map +1 -0
  211. package/dist/actions/recompile.mjs +196 -0
  212. package/dist/actions/recompile.mjs.map +1 -0
  213. package/dist/actions/reinstall.mjs +283 -0
  214. package/dist/actions/reinstall.mjs.map +1 -0
  215. package/dist/actions/relint.mjs +355 -0
  216. package/dist/actions/relint.mjs.map +1 -0
  217. package/dist/actions/repo-init.mjs +217 -0
  218. package/dist/actions/repo-init.mjs.map +1 -0
  219. package/dist/actions/retest.mjs +150 -0
  220. package/dist/actions/retest.mjs.map +1 -0
  221. package/dist/actions/sitemap.mjs +121 -0
  222. package/dist/actions/sitemap.mjs.map +1 -0
  223. package/dist/actions/sonar.mjs +119 -0
  224. package/dist/actions/sonar.mjs.map +1 -0
  225. package/dist/actions/start.mjs +142 -0
  226. package/dist/actions/start.mjs.map +1 -0
  227. package/dist/actions/statics.mjs +225 -0
  228. package/dist/actions/statics.mjs.map +1 -0
  229. package/dist/actions/test.mjs +144 -0
  230. package/dist/actions/test.mjs.map +1 -0
  231. package/dist/actions/up.mjs +140 -0
  232. package/dist/actions/up.mjs.map +1 -0
  233. package/dist/actions/updo.mjs +533 -0
  234. package/dist/actions/updo.mjs.map +1 -0
  235. package/dist/actions/upplug.mjs +124 -0
  236. package/dist/actions/upplug.mjs.map +1 -0
  237. package/dist/actions/upyarn.mjs +119 -0
  238. package/dist/actions/upyarn.mjs.map +1 -0
  239. package/dist/actions/yarn3only.mjs +60 -0
  240. package/dist/actions/yarn3only.mjs.map +1 -0
  241. package/dist/bin/package/build-only.mjs +451 -0
  242. package/dist/bin/package/build-only.mjs.map +1 -0
  243. package/dist/bin/package/build.mjs +451 -0
  244. package/dist/bin/package/build.mjs.map +1 -0
  245. package/dist/bin/package/clean-outputs.mjs +50 -0
  246. package/dist/bin/package/clean-outputs.mjs.map +1 -0
  247. package/dist/bin/package/clean-typescript.mjs +50 -0
  248. package/dist/bin/package/clean-typescript.mjs.map +1 -0
  249. package/dist/bin/package/clean.mjs +75 -0
  250. package/dist/bin/package/clean.mjs.map +1 -0
  251. package/dist/bin/package/compile-only.mjs +447 -0
  252. package/dist/bin/package/compile-only.mjs.map +1 -0
  253. package/dist/bin/package/compile-tsup.mjs +409 -0
  254. package/dist/bin/package/compile-tsup.mjs.map +1 -0
  255. package/dist/bin/package/compile.mjs +451 -0
  256. package/dist/bin/package/compile.mjs.map +1 -0
  257. package/dist/bin/package/copy-assets-cjs.mjs +75 -0
  258. package/dist/bin/package/copy-assets-cjs.mjs.map +1 -0
  259. package/dist/bin/package/copy-assets-esm.mjs +75 -0
  260. package/dist/bin/package/copy-assets-esm.mjs.map +1 -0
  261. package/dist/bin/package/cycle.mjs +72 -0
  262. package/dist/bin/package/cycle.mjs.map +1 -0
  263. package/dist/bin/package/fix.mjs +97 -0
  264. package/dist/bin/package/fix.mjs.map +1 -0
  265. package/dist/bin/package/gen-docs.mjs +142 -0
  266. package/dist/bin/package/gen-docs.mjs.map +1 -0
  267. package/dist/bin/package/lint-verbose.mjs +97 -0
  268. package/dist/bin/package/lint-verbose.mjs.map +1 -0
  269. package/dist/bin/package/lint.mjs +97 -0
  270. package/dist/bin/package/lint.mjs.map +1 -0
  271. package/dist/bin/package/publint.mjs +423 -0
  272. package/dist/bin/package/publint.mjs.map +1 -0
  273. package/dist/bin/package/recompile.mjs +516 -0
  274. package/dist/bin/package/recompile.mjs.map +1 -0
  275. package/dist/bin/package/relint.mjs +97 -0
  276. package/dist/bin/package/relint.mjs.map +1 -0
  277. package/dist/bin/run-or-exec.mjs +20 -0
  278. package/dist/bin/run-or-exec.mjs.map +1 -0
  279. package/dist/bin/xy.mjs +8885 -0
  280. package/dist/bin/xy.mjs.map +1 -0
  281. package/dist/index.d.ts +1102 -0
  282. package/dist/index.mjs +9986 -0
  283. package/dist/index.mjs.map +1 -0
  284. package/dist/lib/checkResult.mjs +16 -0
  285. package/dist/lib/checkResult.mjs.map +1 -0
  286. package/dist/lib/claudeMdTemplate.mjs +69 -0
  287. package/dist/lib/claudeMdTemplate.mjs.map +1 -0
  288. package/dist/lib/concurrency.mjs +38 -0
  289. package/dist/lib/concurrency.mjs.map +1 -0
  290. package/dist/lib/createBuildConfig.mjs +55 -0
  291. package/dist/lib/createBuildConfig.mjs.map +1 -0
  292. package/dist/lib/defaultBuildConfig.mjs +23 -0
  293. package/dist/lib/defaultBuildConfig.mjs.map +1 -0
  294. package/dist/lib/deleteGlob.mjs +13 -0
  295. package/dist/lib/deleteGlob.mjs.map +1 -0
  296. package/dist/lib/dependencies/DuplicateDetector.mjs +99 -0
  297. package/dist/lib/dependencies/DuplicateDetector.mjs.map +1 -0
  298. package/dist/lib/dependencies/detectDuplicateDependencies.mjs +203 -0
  299. package/dist/lib/dependencies/detectDuplicateDependencies.mjs.map +1 -0
  300. package/dist/lib/dependencies/index.mjs +281 -0
  301. package/dist/lib/dependencies/index.mjs.map +1 -0
  302. package/dist/lib/dependencies/workspaceCycles.mjs +79 -0
  303. package/dist/lib/dependencies/workspaceCycles.mjs.map +1 -0
  304. package/dist/lib/file/ReadFileSyncOptions.mjs +6 -0
  305. package/dist/lib/file/ReadFileSyncOptions.mjs.map +1 -0
  306. package/dist/lib/file/constants.mjs +8 -0
  307. package/dist/lib/file/constants.mjs.map +1 -0
  308. package/dist/lib/file/fileLines.mjs +32 -0
  309. package/dist/lib/file/fileLines.mjs.map +1 -0
  310. package/dist/lib/file/index.mjs +42 -0
  311. package/dist/lib/file/index.mjs.map +1 -0
  312. package/dist/lib/file/tryReadFileSync.mjs +14 -0
  313. package/dist/lib/file/tryReadFileSync.mjs.map +1 -0
  314. package/dist/lib/fillTemplate.mjs +8 -0
  315. package/dist/lib/fillTemplate.mjs.map +1 -0
  316. package/dist/lib/generateIgnoreFiles.mjs +86 -0
  317. package/dist/lib/generateIgnoreFiles.mjs.map +1 -0
  318. package/dist/lib/generateReadmeFiles.mjs +323 -0
  319. package/dist/lib/generateReadmeFiles.mjs.map +1 -0
  320. package/dist/lib/gitignoreTemplate.mjs +12 -0
  321. package/dist/lib/gitignoreTemplate.mjs.map +1 -0
  322. package/dist/lib/index.mjs +1627 -0
  323. package/dist/lib/index.mjs.map +1 -0
  324. package/dist/lib/initCwd.mjs +8 -0
  325. package/dist/lib/initCwd.mjs.map +1 -0
  326. package/dist/lib/jsonFormatters.mjs +11 -0
  327. package/dist/lib/jsonFormatters.mjs.map +1 -0
  328. package/dist/lib/latestVersions.mjs +12 -0
  329. package/dist/lib/latestVersions.mjs.map +1 -0
  330. package/dist/lib/loadConfig.mjs +72 -0
  331. package/dist/lib/loadConfig.mjs.map +1 -0
  332. package/dist/lib/packageName.mjs +26 -0
  333. package/dist/lib/packageName.mjs.map +1 -0
  334. package/dist/lib/parsedPackageJSON.mjs +11 -0
  335. package/dist/lib/parsedPackageJSON.mjs.map +1 -0
  336. package/dist/lib/processEx.mjs +36 -0
  337. package/dist/lib/processEx.mjs.map +1 -0
  338. package/dist/lib/repoTemplates.mjs +34 -0
  339. package/dist/lib/repoTemplates.mjs.map +1 -0
  340. package/dist/lib/runInstall.mjs +30 -0
  341. package/dist/lib/runInstall.mjs.map +1 -0
  342. package/dist/lib/runSteps.mjs +118 -0
  343. package/dist/lib/runSteps.mjs.map +1 -0
  344. package/dist/lib/runStepsAsync.mjs +136 -0
  345. package/dist/lib/runStepsAsync.mjs.map +1 -0
  346. package/dist/lib/runXy.mjs +147 -0
  347. package/dist/lib/runXy.mjs.map +1 -0
  348. package/dist/lib/runXyWithWarning.mjs +36 -0
  349. package/dist/lib/runXyWithWarning.mjs.map +1 -0
  350. package/dist/lib/safeExit.mjs +61 -0
  351. package/dist/lib/safeExit.mjs.map +1 -0
  352. package/dist/lib/string/empty.mjs +8 -0
  353. package/dist/lib/string/empty.mjs.map +1 -0
  354. package/dist/lib/string/index.mjs +12 -0
  355. package/dist/lib/string/index.mjs.map +1 -0
  356. package/dist/lib/string/union.mjs +6 -0
  357. package/dist/lib/string/union.mjs.map +1 -0
  358. package/dist/lib/tryRunLocalScript.mjs +57 -0
  359. package/dist/lib/tryRunLocalScript.mjs.map +1 -0
  360. package/dist/lib/updo/applyUpdates.mjs +44 -0
  361. package/dist/lib/updo/applyUpdates.mjs.map +1 -0
  362. package/dist/lib/updo/collectWorkspaceDeps.mjs +48 -0
  363. package/dist/lib/updo/collectWorkspaceDeps.mjs.map +1 -0
  364. package/dist/lib/updo/fetchRegistryInfo.mjs +53 -0
  365. package/dist/lib/updo/fetchRegistryInfo.mjs.map +1 -0
  366. package/dist/lib/updo/index.mjs +594 -0
  367. package/dist/lib/updo/index.mjs.map +1 -0
  368. package/dist/lib/updo/interactiveSelect.mjs +185 -0
  369. package/dist/lib/updo/interactiveSelect.mjs.map +1 -0
  370. package/dist/lib/updo/interfaces.mjs +1 -0
  371. package/dist/lib/updo/interfaces.mjs.map +1 -0
  372. package/dist/lib/updo/renderTable.mjs +79 -0
  373. package/dist/lib/updo/renderTable.mjs.map +1 -0
  374. package/dist/lib/updo/resolveVersions.mjs +49 -0
  375. package/dist/lib/updo/resolveVersions.mjs.map +1 -0
  376. package/dist/lib/updo/runUpdo.mjs +511 -0
  377. package/dist/lib/updo/runUpdo.mjs.map +1 -0
  378. package/dist/lib/withErrnoException.mjs +13 -0
  379. package/dist/lib/withErrnoException.mjs.map +1 -0
  380. package/dist/lib/withError.mjs +8 -0
  381. package/dist/lib/withError.mjs.map +1 -0
  382. package/dist/lib/yarn/index.mjs +39 -0
  383. package/dist/lib/yarn/index.mjs.map +1 -0
  384. package/dist/lib/yarn/isYarnVersionOrGreater.mjs +18 -0
  385. package/dist/lib/yarn/isYarnVersionOrGreater.mjs.map +1 -0
  386. package/dist/lib/yarn/workspace/Workspace.mjs +1 -0
  387. package/dist/lib/yarn/workspace/Workspace.mjs.map +1 -0
  388. package/dist/lib/yarn/workspace/index.mjs +23 -0
  389. package/dist/lib/yarn/workspace/index.mjs.map +1 -0
  390. package/dist/lib/yarn/workspace/yarnWorkspace.mjs +22 -0
  391. package/dist/lib/yarn/workspace/yarnWorkspace.mjs.map +1 -0
  392. package/dist/lib/yarn/workspace/yarnWorkspaces.mjs +15 -0
  393. package/dist/lib/yarn/workspace/yarnWorkspaces.mjs.map +1 -0
  394. package/dist/lib/yarn/yarnInitCwd.mjs +8 -0
  395. package/dist/lib/yarn/yarnInitCwd.mjs.map +1 -0
  396. package/dist/loadPackageConfig.mjs +18 -0
  397. package/dist/loadPackageConfig.mjs.map +1 -0
  398. package/dist/pm/PackageManager.mjs +1 -0
  399. package/dist/pm/PackageManager.mjs.map +1 -0
  400. package/dist/pm/detectPackageManager.mjs +10 -0
  401. package/dist/pm/detectPackageManager.mjs.map +1 -0
  402. package/dist/pm/detectReact.mjs +52 -0
  403. package/dist/pm/detectReact.mjs.map +1 -0
  404. package/dist/pm/index.mjs +263 -0
  405. package/dist/pm/index.mjs.map +1 -0
  406. package/dist/pm/pnpmPackageManager.mjs +97 -0
  407. package/dist/pm/pnpmPackageManager.mjs.map +1 -0
  408. package/dist/pm/registry.mjs +27 -0
  409. package/dist/pm/registry.mjs.map +1 -0
  410. package/dist/pm/yarnPackageManager.mjs +112 -0
  411. package/dist/pm/yarnPackageManager.mjs.map +1 -0
  412. package/dist/types.d.mjs +1 -0
  413. package/dist/types.d.mjs.map +1 -0
  414. package/dist/xy/build/buildCommand.mjs +194 -0
  415. package/dist/xy/build/buildCommand.mjs.map +1 -0
  416. package/dist/xy/build/compileCommand.mjs +203 -0
  417. package/dist/xy/build/compileCommand.mjs.map +1 -0
  418. package/dist/xy/build/compileOnlyCommand.mjs +204 -0
  419. package/dist/xy/build/compileOnlyCommand.mjs.map +1 -0
  420. package/dist/xy/build/copyAssetsCommand.mjs +92 -0
  421. package/dist/xy/build/copyAssetsCommand.mjs.map +1 -0
  422. package/dist/xy/build/index.mjs +487 -0
  423. package/dist/xy/build/index.mjs.map +1 -0
  424. package/dist/xy/build/rebuildCommand.mjs +156 -0
  425. package/dist/xy/build/rebuildCommand.mjs.map +1 -0
  426. package/dist/xy/build/recompileCommand.mjs +215 -0
  427. package/dist/xy/build/recompileCommand.mjs.map +1 -0
  428. package/dist/xy/common/checkCommand.mjs +1909 -0
  429. package/dist/xy/common/checkCommand.mjs.map +1 -0
  430. package/dist/xy/common/claude/checkCommand.mjs +207 -0
  431. package/dist/xy/common/claude/checkCommand.mjs.map +1 -0
  432. package/dist/xy/common/claude/cleanCommand.mjs +78 -0
  433. package/dist/xy/common/claude/cleanCommand.mjs.map +1 -0
  434. package/dist/xy/common/claude/commandsCommand.mjs +134 -0
  435. package/dist/xy/common/claude/commandsCommand.mjs.map +1 -0
  436. package/dist/xy/common/claude/index.mjs +734 -0
  437. package/dist/xy/common/claude/index.mjs.map +1 -0
  438. package/dist/xy/common/claude/initCommand.mjs +458 -0
  439. package/dist/xy/common/claude/initCommand.mjs.map +1 -0
  440. package/dist/xy/common/claude/rulesCommand.mjs +167 -0
  441. package/dist/xy/common/claude/rulesCommand.mjs.map +1 -0
  442. package/dist/xy/common/claude/settingsCommand.mjs +115 -0
  443. package/dist/xy/common/claude/settingsCommand.mjs.map +1 -0
  444. package/dist/xy/common/claude/skillsCommand.mjs +140 -0
  445. package/dist/xy/common/claude/skillsCommand.mjs.map +1 -0
  446. package/dist/xy/common/cleanDocsCommand.mjs +74 -0
  447. package/dist/xy/common/cleanDocsCommand.mjs.map +1 -0
  448. package/dist/xy/common/deadCommand.mjs +137 -0
  449. package/dist/xy/common/deadCommand.mjs.map +1 -0
  450. package/dist/xy/common/genDocsCommand.mjs +175 -0
  451. package/dist/xy/common/genDocsCommand.mjs.map +1 -0
  452. package/dist/xy/common/gitignoreCommand.mjs +165 -0
  453. package/dist/xy/common/gitignoreCommand.mjs.map +1 -0
  454. package/dist/xy/common/gitlintCommand.mjs +89 -0
  455. package/dist/xy/common/gitlintCommand.mjs.map +1 -0
  456. package/dist/xy/common/index.mjs +4654 -0
  457. package/dist/xy/common/index.mjs.map +1 -0
  458. package/dist/xy/common/licenseCommand.mjs +108 -0
  459. package/dist/xy/common/licenseCommand.mjs.map +1 -0
  460. package/dist/xy/common/npmignoreGenCommand.mjs +100 -0
  461. package/dist/xy/common/npmignoreGenCommand.mjs.map +1 -0
  462. package/dist/xy/common/orphan/cleanCommand.mjs +102 -0
  463. package/dist/xy/common/orphan/cleanCommand.mjs.map +1 -0
  464. package/dist/xy/common/orphan/index.mjs +138 -0
  465. package/dist/xy/common/orphan/index.mjs.map +1 -0
  466. package/dist/xy/common/orphan/listCommand.mjs +100 -0
  467. package/dist/xy/common/orphan/listCommand.mjs.map +1 -0
  468. package/dist/xy/common/packmanCommand.mjs +1538 -0
  469. package/dist/xy/common/packmanCommand.mjs.map +1 -0
  470. package/dist/xy/common/readme/genCommand.mjs +395 -0
  471. package/dist/xy/common/readme/genCommand.mjs.map +1 -0
  472. package/dist/xy/common/readme/index.mjs +538 -0
  473. package/dist/xy/common/readme/index.mjs.map +1 -0
  474. package/dist/xy/common/readme/initCommand.mjs +109 -0
  475. package/dist/xy/common/readme/initCommand.mjs.map +1 -0
  476. package/dist/xy/common/readme/lintCommand.mjs +181 -0
  477. package/dist/xy/common/readme/lintCommand.mjs.map +1 -0
  478. package/dist/xy/common/repo/index.mjs +1070 -0
  479. package/dist/xy/common/repo/index.mjs.map +1 -0
  480. package/dist/xy/common/repo/initCommand.mjs +273 -0
  481. package/dist/xy/common/repo/initCommand.mjs.map +1 -0
  482. package/dist/xy/common/repo/lintCommand.mjs +789 -0
  483. package/dist/xy/common/repo/lintCommand.mjs.map +1 -0
  484. package/dist/xy/common/retestCommand.mjs +163 -0
  485. package/dist/xy/common/retestCommand.mjs.map +1 -0
  486. package/dist/xy/common/testCommand.mjs +157 -0
  487. package/dist/xy/common/testCommand.mjs.map +1 -0
  488. package/dist/xy/deploy/deployCommand.mjs +214 -0
  489. package/dist/xy/deploy/deployCommand.mjs.map +1 -0
  490. package/dist/xy/deploy/index.mjs +289 -0
  491. package/dist/xy/deploy/index.mjs.map +1 -0
  492. package/dist/xy/deploy/publishCommand.mjs +218 -0
  493. package/dist/xy/deploy/publishCommand.mjs.map +1 -0
  494. package/dist/xy/index.mjs +8887 -0
  495. package/dist/xy/index.mjs.map +1 -0
  496. package/dist/xy/install/cleanCommand.mjs +182 -0
  497. package/dist/xy/install/cleanCommand.mjs.map +1 -0
  498. package/dist/xy/install/dupdepsCommand.mjs +234 -0
  499. package/dist/xy/install/dupdepsCommand.mjs.map +1 -0
  500. package/dist/xy/install/index.mjs +1006 -0
  501. package/dist/xy/install/index.mjs.map +1 -0
  502. package/dist/xy/install/reinstallCommand.mjs +292 -0
  503. package/dist/xy/install/reinstallCommand.mjs.map +1 -0
  504. package/dist/xy/install/staticsCommand.mjs +233 -0
  505. package/dist/xy/install/staticsCommand.mjs.map +1 -0
  506. package/dist/xy/install/upCommand.mjs +150 -0
  507. package/dist/xy/install/upCommand.mjs.map +1 -0
  508. package/dist/xy/install/updoCommand.mjs +550 -0
  509. package/dist/xy/install/updoCommand.mjs.map +1 -0
  510. package/dist/xy/lint/cycleCommand.mjs +289 -0
  511. package/dist/xy/lint/cycleCommand.mjs.map +1 -0
  512. package/dist/xy/lint/deplintCommand.mjs +1897 -0
  513. package/dist/xy/lint/deplintCommand.mjs.map +1 -0
  514. package/dist/xy/lint/fixCommand.mjs +398 -0
  515. package/dist/xy/lint/fixCommand.mjs.map +1 -0
  516. package/dist/xy/lint/index.mjs +3759 -0
  517. package/dist/xy/lint/index.mjs.map +1 -0
  518. package/dist/xy/lint/knipCommand.mjs +142 -0
  519. package/dist/xy/lint/knipCommand.mjs.map +1 -0
  520. package/dist/xy/lint/lint/index.mjs +695 -0
  521. package/dist/xy/lint/lint/index.mjs.map +1 -0
  522. package/dist/xy/lint/lint/initCommand.mjs +282 -0
  523. package/dist/xy/lint/lint/initCommand.mjs.map +1 -0
  524. package/dist/xy/lint/lint/runCommand.mjs +405 -0
  525. package/dist/xy/lint/lint/runCommand.mjs.map +1 -0
  526. package/dist/xy/lint/lintCommand.mjs +695 -0
  527. package/dist/xy/lint/lintCommand.mjs.map +1 -0
  528. package/dist/xy/lint/lintlintCommand.mjs +359 -0
  529. package/dist/xy/lint/lintlintCommand.mjs.map +1 -0
  530. package/dist/xy/lint/publintCommand.mjs +778 -0
  531. package/dist/xy/lint/publintCommand.mjs.map +1 -0
  532. package/dist/xy/lint/relintCommand.mjs +381 -0
  533. package/dist/xy/lint/relintCommand.mjs.map +1 -0
  534. package/dist/xy/lint/sonarCommand.mjs +137 -0
  535. package/dist/xy/lint/sonarCommand.mjs.map +1 -0
  536. package/dist/xy/param.mjs +8 -0
  537. package/dist/xy/param.mjs.map +1 -0
  538. package/dist/xy/react/analyzeCommand.mjs +150 -0
  539. package/dist/xy/react/analyzeCommand.mjs.map +1 -0
  540. package/dist/xy/react/ejectCommand.mjs +150 -0
  541. package/dist/xy/react/ejectCommand.mjs.map +1 -0
  542. package/dist/xy/react/index.mjs +202 -0
  543. package/dist/xy/react/index.mjs.map +1 -0
  544. package/dist/xy/react/sitemapCommand.mjs +129 -0
  545. package/dist/xy/react/sitemapCommand.mjs.map +1 -0
  546. package/dist/xy/react/startCommand.mjs +150 -0
  547. package/dist/xy/react/startCommand.mjs.map +1 -0
  548. package/dist/xy/xy.mjs +8879 -0
  549. package/dist/xy/xy.mjs.map +1 -0
  550. package/dist/xy/xyParseOptions.mjs +117 -0
  551. package/dist/xy/xyParseOptions.mjs.map +1 -0
  552. package/dist/xy/yarn/index.mjs +188 -0
  553. package/dist/xy/yarn/index.mjs.map +1 -0
  554. package/dist/xy/yarn/upplugCommand.mjs +134 -0
  555. package/dist/xy/yarn/upplugCommand.mjs.map +1 -0
  556. package/dist/xy/yarn/upyarnCommand.mjs +129 -0
  557. package/dist/xy/yarn/upyarnCommand.mjs.map +1 -0
  558. package/dist/xy/yarn/yarn3OnlyCommand.mjs +70 -0
  559. package/dist/xy/yarn/yarn3OnlyCommand.mjs.map +1 -0
  560. package/package.json +119 -0
  561. package/templates/claude/CLAUDE-local.md +4 -0
  562. package/templates/claude/CLAUDE-project.md +4 -0
  563. package/templates/claude/commands/xy-build.md +7 -0
  564. package/templates/claude/commands/xy-clean.md +7 -0
  565. package/templates/claude/commands/xy-compile.md +7 -0
  566. package/templates/claude/commands/xy-cycle.md +7 -0
  567. package/templates/claude/commands/xy-dead.md +7 -0
  568. package/templates/claude/commands/xy-deplint.md +7 -0
  569. package/templates/claude/commands/xy-deps.md +24 -0
  570. package/templates/claude/commands/xy-dupdeps.md +7 -0
  571. package/templates/claude/commands/xy-fix.md +7 -0
  572. package/templates/claude/commands/xy-gen-docs.md +7 -0
  573. package/templates/claude/commands/xy-gitignore.md +7 -0
  574. package/templates/claude/commands/xy-gitlint.md +7 -0
  575. package/templates/claude/commands/xy-knip.md +7 -0
  576. package/templates/claude/commands/xy-license.md +7 -0
  577. package/templates/claude/commands/xy-lint-rules.md +44 -0
  578. package/templates/claude/commands/xy-lint.md +7 -0
  579. package/templates/claude/commands/xy-publint.md +7 -0
  580. package/templates/claude/commands/xy-rebuild.md +7 -0
  581. package/templates/claude/commands/xy-recompile.md +7 -0
  582. package/templates/claude/commands/xy-reinstall.md +7 -0
  583. package/templates/claude/commands/xy-relint.md +7 -0
  584. package/templates/claude/commands/xy-retest.md +7 -0
  585. package/templates/claude/commands/xy-sonar.md +7 -0
  586. package/templates/claude/commands/xy-test.md +7 -0
  587. package/templates/claude/commands/xy-up.md +9 -0
  588. package/templates/claude/rules/xylabs-architecture.md +8 -0
  589. package/templates/claude/rules/xylabs-git-workflow.md +7 -0
  590. package/templates/claude/rules/xylabs-naming.md +7 -0
  591. package/templates/claude/rules/xylabs-style.md +17 -0
  592. package/templates/claude/skills/xylabs-e2e-setup/SKILL.md +223 -0
  593. package/templates/claude/skills/xylabs-xy-cli/SKILL.md +236 -0
  594. package/templates/claude/skills/xylabs-xy-deplint-fix/SKILL.md +122 -0
  595. package/templates/gitignore/gitignore/template.gitignore +51 -0
  596. package/templates/gitignore/template.gitignore +51 -0
  597. package/templates/readme/README.body.md +25 -0
  598. package/templates/readme/README.template.md +22 -0
  599. package/templates/repo/cli/package/package.json.tmpl +63 -0
  600. package/templates/repo/cli/package/src/__packageName__.ts.tmpl +21 -0
  601. package/templates/repo/cli/package/src/actions/index.ts +1 -0
  602. package/templates/repo/cli/package/src/actions/printVersion.ts.tmpl +8 -0
  603. package/templates/repo/cli/package/src/bin/__packageName__.ts.tmpl +12 -0
  604. package/templates/repo/cli/package/src/commands/index.ts +1 -0
  605. package/templates/repo/cli/package/src/commands/versionCommand.ts.tmpl +11 -0
  606. package/templates/repo/cli/package/src/index.ts.tmpl +1 -0
  607. package/templates/repo/cli/package/tsconfig.build.json +25 -0
  608. package/templates/repo/cli/package/tsconfig.json +4 -0
  609. package/templates/repo/cli/package/tsup.config.ts +15 -0
  610. package/templates/repo/cli/package/xy.config.ts +3 -0
  611. package/templates/repo/cli/root/CLAUDE.md.tmpl +38 -0
  612. package/templates/repo/cli/root/cspell.json.tmpl +13 -0
  613. package/templates/repo/cli/root/eslint.config.ts +28 -0
  614. package/templates/repo/cli/root/github/workflows/build-pnpm.yml.tmpl +34 -0
  615. package/templates/repo/cli/root/github/workflows/build-yarn.yml.tmpl +32 -0
  616. package/templates/repo/cli/root/gitignore.tmpl +47 -0
  617. package/templates/repo/cli/root/knip.config.ts +16 -0
  618. package/templates/repo/cli/root/package.json.tmpl +54 -0
  619. package/templates/repo/cli/root/pnpm-workspace.yaml +2 -0
  620. package/templates/repo/cli/root/tsconfig.json +4 -0
  621. package/templates/repo/cli/root/vitest.config.ts +31 -0
  622. package/templates/repo/cli/root/xy.config.ts.tmpl +5 -0
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/actions/deplint/snapshot.ts","../../../src/actions/deplint/findFiles.ts","../../../src/actions/deplint/findFilesByGlob.ts","../../../src/actions/deplint/getDependenciesFromPackageJson.ts","../../../src/actions/deplint/getExtendsFromTsconfigs.ts","../../../src/actions/deplint/getBasePackageName.ts","../../../src/actions/deplint/getExternalImportsFromFiles.ts","../../../src/actions/deplint/getImportsFromFile.ts","../../../src/actions/deplint/getRequiredPeerDependencies.ts","../../../src/actions/deplint/checkPackage/getUnsatisfiedPeerDependencies.ts"],"sourcesContent":["import fs from 'node:fs'\n\nimport type { Workspace } from '../../pm/index.ts'\nimport { getRequiredTransitivePeers } from './checkPackage/index.ts'\nimport { findFiles } from './findFiles.ts'\nimport { getDependenciesFromPackageJson } from './getDependenciesFromPackageJson.ts'\nimport { getExtendsFromTsconfigs, getTypesFromTsconfigs } from './getExtendsFromTsconfigs.ts'\nimport { getExternalImportsFromFiles } from './getExternalImportsFromFiles.ts'\nimport type { DeplintWorkspaceContext } from './types.ts'\n\nfunction isTerminalPackage(location: string): boolean {\n try {\n const pkg = JSON.parse(fs.readFileSync(`${location}/package.json`, 'utf8')) as Record<string, unknown>\n return pkg.private === true\n } catch {\n return false\n }\n}\n\nexport function buildWorkspaceContext(\n workspace: Workspace,\n exclude?: Set<string>,\n workspaceNames?: Set<string>,\n forceDeps?: Set<string>,\n forcePeers?: Set<string>,\n): DeplintWorkspaceContext {\n const { allFiles, distFiles } = findFiles(workspace.location)\n const tsconfigExtends = getExtendsFromTsconfigs(workspace.location)\n const tsconfigTypes = getTypesFromTsconfigs(workspace.location)\n const sourceParams = getExternalImportsFromFiles({\n allFiles, distFiles, location: workspace.location, tsconfigExtends, tsconfigTypes,\n })\n const packageJsonPath = `${workspace.location}/package.json`\n const packageParams = getDependenciesFromPackageJson(packageJsonPath)\n const requiredTransitivePeers = getRequiredTransitivePeers(workspace.location, packageParams)\n\n return {\n exclude,\n fileContext: { allFiles, distFiles },\n forceDeps: forceDeps ?? new Set(),\n forcePeers: forcePeers ?? new Set(),\n isTerminalPackage: isTerminalPackage(workspace.location),\n packageJsonPath,\n packageParams,\n sourceParams,\n unusedDependencyExclude: new Set([...(exclude ?? []), ...requiredTransitivePeers]),\n workspace,\n workspaceNames,\n }\n}\n","import fs from 'node:fs'\n\nimport { findFilesByGlob } from './findFilesByGlob.ts'\n\nconst codeExtensions = '*.{ts,tsx,mts,cts,js,mjs,cjs}'\n\nfunction getWorkspaceIgnores(location: string): string[] {\n try {\n const raw = fs.readFileSync(`${location}/package.json`, 'utf8')\n const pkg = JSON.parse(raw) as Record<string, unknown>\n return (pkg.workspaces ?? []) as string[]\n } catch {\n return []\n }\n}\n\nexport function findFiles(location: string) {\n const workspaceIgnores = getWorkspaceIgnores(location).map(w => `${w}/**`)\n const ignore = ['**/node_modules/**', 'dist/**', ...workspaceIgnores]\n const allFiles = findFilesByGlob(location, `./**/${codeExtensions}`, ignore)\n const distFiles = [\n ...findFilesByGlob(location, './dist/**/*.d.ts'),\n ...findFilesByGlob(location, `./dist/**/${codeExtensions}`),\n ]\n\n return { allFiles, distFiles }\n}\n","import { globSync } from 'glob'\n\nexport function findFilesByGlob(cwd: string, pattern: string, ignore?: string[]) {\n return globSync(pattern, {\n cwd, absolute: true, ignore, nodir: true,\n })\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nexport function getDependenciesFromPackageJson(packageJsonPath: string) {\n const packageJsonFullPath = path.resolve(packageJsonPath)\n const rawContent = fs.readFileSync(packageJsonFullPath, 'utf8')\n const packageJson = JSON.parse(rawContent) as Record<string, unknown>\n\n const depsRecord = (packageJson.dependencies ?? {}) as Record<string, string>\n const devDepsRecord = (packageJson.devDependencies ?? {}) as Record<string, string>\n const peerDepsRecord = (packageJson.peerDependencies ?? {}) as Record<string, string>\n\n const dependencies = Object.keys(depsRecord)\n const devDependencies = Object.keys(devDepsRecord)\n const peerDependencies = Object.keys(peerDepsRecord)\n\n const dependencyVersions = depsRecord\n const devDependencyVersions = devDepsRecord\n const peerDependencyVersions = peerDepsRecord\n\n return {\n dependencies,\n dependencyVersions,\n devDependencies,\n devDependencyVersions,\n peerDependencies,\n peerDependencyVersions,\n }\n}\n","import fs from 'node:fs'\n\nimport { globSync } from 'glob'\n\nimport { getBasePackageName } from './getBasePackageName.ts'\n\nconst isExternalReference = (ref: string) => !ref.startsWith('.') && !ref.startsWith('/')\n\nfunction parseExtendsField(value: unknown): string[] {\n if (typeof value === 'string') return [value]\n if (Array.isArray(value)) return value.filter((v): v is string => typeof v === 'string')\n return []\n}\n\nfunction parseTypesField(value: unknown): string[] {\n if (Array.isArray(value)) return value.filter((v): v is string => typeof v === 'string')\n return []\n}\n\nfunction parseTsconfig(file: string): Record<string, unknown> {\n const content = fs.readFileSync(file, 'utf8')\n // Strip single-line comments (tsconfig allows them) and trailing commas before parsing\n const cleaned = content\n .replaceAll(/\\/\\/.*/g, '')\n .replaceAll(/,\\s*([}\\]])/g, '$1')\n return JSON.parse(cleaned) as Record<string, unknown>\n}\n\nexport function getExtendsFromTsconfigs(location: string): string[] {\n const tsconfigFiles = globSync('./tsconfig*.json', { cwd: location, absolute: true })\n const packages = new Set<string>()\n\n for (const file of tsconfigFiles) {\n try {\n const parsed = parseTsconfig(file)\n const refs = parseExtendsField(parsed.extends)\n for (const ref of refs) {\n if (isExternalReference(ref)) {\n packages.add(getBasePackageName(ref))\n }\n }\n } catch {\n // Skip files that can't be parsed\n }\n }\n\n return [...packages]\n}\n\nexport function getTypesFromTsconfigs(location: string): string[] {\n const tsconfigFiles = globSync('./tsconfig*.json', { cwd: location, absolute: true })\n const packages = new Set<string>()\n\n for (const file of tsconfigFiles) {\n try {\n const parsed = parseTsconfig(file)\n const compilerOptions = parsed.compilerOptions as Record<string, unknown> | undefined\n const refs = parseTypesField(compilerOptions?.types)\n for (const ref of refs) {\n packages.add(getBasePackageName(ref))\n }\n } catch {\n // Skip files that can't be parsed\n }\n }\n\n return [...packages]\n}\n","export function getBasePackageName(importName: string) {\n const importNameScrubbed = importName.replaceAll('\"', '').trim()\n if (importNameScrubbed.startsWith('@')) {\n const parts = importNameScrubbed.split('/')\n return parts.length >= 2 ? `${parts[0]}/${parts[1]}` : importNameScrubbed\n }\n return importNameScrubbed.split('/')[0]\n}\n","import fs from 'node:fs'\n\nimport type { CheckSourceParams } from './checkPackage/index.ts'\nimport { getImportsFromFile } from './getImportsFromFile.ts'\n\nconst internalImportPrefixes = ['.', '#', 'node:']\n\nconst removeInternalImports = (imports: string[]) => {\n return imports.filter(imp => !internalImportPrefixes.some(prefix => imp.startsWith(prefix)))\n}\n\nconst isDeclarationFile = (file: string) =>\n file.endsWith('.d.ts') || file.endsWith('.d.cts') || file.endsWith('.d.mts')\n\nfunction shipsTsconfig(location: string): boolean {\n try {\n const raw = fs.readFileSync(`${location}/package.json`, 'utf8')\n const pkg = JSON.parse(raw) as Record<string, unknown>\n const files = pkg.files as string[] | undefined\n return files?.some((f: string) => f === 'tsconfig.json' || f.includes('tsconfig')) ?? false\n } catch {\n return false\n }\n}\n\nexport function getExternalImportsFromFiles({\n allFiles, distFiles, location, tsconfigExtends = [], tsconfigTypes = [],\n}: {\n allFiles: string[]\n distFiles: string[]\n location: string\n tsconfigExtends?: string[]\n tsconfigTypes?: string[]\n}): CheckSourceParams {\n const allImportPaths: Record<string, string[]> = {}\n const distImportPaths: Record<string, string[]> = {}\n const distTypeImportPaths: Record<string, string[]> = {}\n\n for (const path of allFiles) getImportsFromFile(path, allImportPaths, allImportPaths).flat()\n\n const distTypeFiles = distFiles.filter(isDeclarationFile)\n const distCodeFiles = distFiles.filter(file => !isDeclarationFile(file))\n for (const path of distCodeFiles) getImportsFromFile(path, distImportPaths, distImportPaths).flat()\n for (const path of distTypeFiles) getImportsFromFile(path, distTypeImportPaths, distTypeImportPaths).flat()\n\n const allImports = Object.keys(allImportPaths)\n const distImports = Object.keys(distImportPaths)\n\n const externalAllImports = removeInternalImports(allImports)\n const externalDistImports = removeInternalImports(distImports)\n const externalDistTypeImports = removeInternalImports(Object.keys(distTypeImportPaths))\n\n // Tsconfig extends references count as used imports.\n // If the package ships its tsconfig.json, extends refs are dist imports\n // (consumers need them), otherwise they are build-time only (devDep).\n const isDistTsconfig = shipsTsconfig(location)\n for (const ext of tsconfigExtends) {\n if (!externalAllImports.includes(ext)) externalAllImports.push(ext)\n if (isDistTsconfig && !externalDistImports.includes(ext)) externalDistImports.push(ext)\n }\n\n // Tsconfig compilerOptions.types references count as build-time imports (devDep).\n for (const typ of tsconfigTypes) {\n if (!externalAllImports.includes(typ)) externalAllImports.push(typ)\n }\n\n return {\n allImportPaths,\n allImports,\n distImportPaths,\n distImports,\n externalAllImports,\n externalDistImports,\n externalDistTypeImports,\n tsconfigExtends: [...tsconfigExtends],\n }\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nimport ts from 'typescript'\n\nimport { getBasePackageName } from './getBasePackageName.ts'\n\nexport function isTypeOnlyImportClause(clause?: ts.ImportClause): boolean {\n if (clause === undefined) {\n return false\n }\n // Newer TS: clause.phaseModifier -> token or number\n if ('phaseModifier' in clause) {\n const mod = clause.phaseModifier\n // handle number enum or token node with .kind\n const kind: number | undefined = typeof mod === 'number' ? mod : (mod as { kind?: number } | undefined)?.kind\n return kind === ts.SyntaxKind.TypeKeyword\n }\n // Older TS fallback\n return (clause as unknown as { isTypeOnly?: boolean }).isTypeOnly ?? false\n}\n\nexport function getImportsFromFile(filePath: string, importPaths: Record<string, string[]>, typeImportPaths: Record<string, string[]>) {\n const sourceCode = fs.readFileSync(filePath, 'utf8')\n\n const isMjsFile = filePath.endsWith('.mjs')\n\n const sourceFile = ts.createSourceFile(\n path.basename(filePath),\n sourceCode,\n ts.ScriptTarget.Latest,\n true,\n isMjsFile ? ts.ScriptKind.JS : undefined,\n )\n\n const imports: string[] = []\n const typeImports: string[] = []\n\n const isDeclarationFile = filePath.endsWith('.d.ts')\n\n function visit(node: ts.Node) {\n if (ts.isImportDeclaration(node) || ts.isExportDeclaration(node)) {\n const moduleSpecifier = (node.moduleSpecifier)?.getFullText()\n const isTypeImport = ts.isImportDeclaration(node) ? isTypeOnlyImportClause(node.importClause) : false\n if (typeof moduleSpecifier === 'string') {\n const trimmed = moduleSpecifier.replaceAll(\"'\", '').replaceAll('\"', '').trim()\n // we are determining if the type import is being imported in an exported d.ts file\n if (isTypeImport || isDeclarationFile) {\n typeImports.push(trimmed)\n } else {\n imports.push(trimmed)\n }\n }\n } else if (ts.isCallExpression(node) && node.expression.kind === ts.SyntaxKind.ImportKeyword) {\n const [arg] = node.arguments\n if (ts.isStringLiteral(arg)) {\n imports.push(arg.text)\n }\n } else if (\n ts.isCallExpression(node)\n && ts.isIdentifier(node.expression)\n && node.expression.text === 'require'\n && node.arguments.length > 0\n && ts.isStringLiteral(node.arguments[0])\n ) {\n imports.push(node.arguments[0].text)\n }\n ts.forEachChild(node, visit)\n }\n\n visit(sourceFile)\n\n // Detect /// <reference types=\"package\" /> directives\n for (const ref of sourceFile.typeReferenceDirectives) {\n typeImports.push(ref.fileName)\n }\n\n const importsStartsWithExcludes = ['.', '#', 'node:']\n\n const isValidImport = (imp: string) =>\n !importsStartsWithExcludes.some(exc => imp.startsWith(exc))\n && !imp.includes('*')\n && !imp.includes('!')\n\n const cleanedImports = imports.filter(isValidImport).map(getBasePackageName)\n const cleanedTypeImports = typeImports.filter(isValidImport).map(getBasePackageName)\n\n for (const imp of cleanedImports) {\n importPaths[imp] = importPaths[imp] ?? []\n importPaths[imp].push(filePath)\n }\n\n for (const imp of cleanedTypeImports) {\n typeImportPaths[imp] = typeImportPaths[imp] ?? []\n typeImportPaths[imp].push(filePath)\n }\n\n return [cleanedImports, cleanedTypeImports]\n}\n","import fs from 'node:fs'\nimport path from 'node:path'\n\nexport function findDepPackageJson(location: string, dep: string): string | undefined {\n let dir = location\n while (true) {\n const candidate = path.join(dir, 'node_modules', dep, 'package.json')\n if (fs.existsSync(candidate)) return candidate\n const parent = path.dirname(dir)\n if (parent === dir) return undefined\n dir = parent\n }\n}\n\n/**\n * Collects the peerDependencies declared by all of a package's\n * dependencies and devDependencies. A devDependency that satisfies\n * one of these peer requirements should not be flagged as unused.\n */\nexport function getRequiredPeerDependencies(\n location: string,\n allDeps: string[],\n): Set<string> {\n const required = new Set<string>()\n for (const dep of allDeps) {\n const depPkgPath = findDepPackageJson(location, dep)\n if (!depPkgPath) continue\n try {\n const raw = fs.readFileSync(depPkgPath, 'utf8')\n const pkg = JSON.parse(raw) as Record<string, unknown>\n const peerDeps = pkg.peerDependencies as Record<string, string> | undefined\n if (peerDeps) {\n for (const peer of Object.keys(peerDeps)) {\n required.add(peer)\n }\n }\n } catch {\n // Package not readable — skip\n }\n }\n return required\n}\n","import fs from 'node:fs'\n\nimport chalk from 'chalk'\nimport semver from 'semver'\nimport sortPackageJson from 'sort-package-json'\n\nimport type { Workspace } from '../../../pm/index.ts'\nimport { findDepPackageJson } from '../getRequiredPeerDependencies.ts'\nimport type { CheckPackageParams } from './checkPackageTypes.ts'\n\nexport interface PeerSource {\n /** Dependency chain for transitive peers, e.g. ['direct-dep', 'transitive-dep'] */\n chain?: string[]\n isRuntimeDep: boolean\n requiredBy: string\n}\n\nexport interface UnsatisfiedPeer {\n hasRuntimeSource: boolean\n installedVersion?: string\n peer: string\n reason: 'missing' | 'version-mismatch'\n sources: PeerSource[]\n versionRange: string\n}\n\nfunction readDepPackageJson(location: string, dep: string): Record<string, unknown> | undefined {\n const depPkgPath = findDepPackageJson(location, dep)\n if (!depPkgPath) return undefined\n try {\n return JSON.parse(fs.readFileSync(depPkgPath, 'utf8')) as Record<string, unknown>\n } catch {\n return undefined\n }\n}\n\nfunction readPeerDeps(location: string, dep: string): string[] {\n const pkg = readDepPackageJson(location, dep)\n if (!pkg) return []\n const peers = pkg.peerDependencies as Record<string, string> | undefined\n return Object.keys(peers ?? {})\n}\n\nfunction readPeerVersionRange(location: string, dep: string, peer: string): string | undefined {\n const pkg = readDepPackageJson(location, dep)\n if (!pkg) return undefined\n const peers = pkg.peerDependencies as Record<string, string> | undefined\n return peers?.[peer]\n}\n\nfunction readInstalledVersion(location: string, dep: string): string | undefined {\n const pkg = readDepPackageJson(location, dep)\n if (!pkg) return undefined\n return pkg.version as string | undefined\n}\n\nfunction isPeerOptionalInAll(location: string, peer: string, sources: PeerSource[]): boolean {\n for (const source of sources) {\n const pkg = readDepPackageJson(location, source.requiredBy)\n if (!pkg) continue\n const meta = (pkg.peerDependenciesMeta as Record<string, { optional?: boolean }> | undefined)?.[peer]\n if (!meta?.optional) return false\n }\n return true\n}\n\nconst MAX_TRANSITIVE_DEPTH = 2\n\nfunction collectPeerSources(\n location: string,\n dependencies: string[],\n devDependencies: string[],\n): Map<string, PeerSource[]> {\n const peerSources = new Map<string, PeerSource[]>()\n const visited = new Set<string>()\n\n function addPeerSource(peer: string, source: PeerSource): void {\n const sources = peerSources.get(peer) ?? []\n sources.push(source)\n peerSources.set(peer, sources)\n }\n\n function collectFromDeps(deps: string[], isRuntime: boolean, chain: string[]): void {\n for (const dep of deps) {\n const visitKey = `${dep}:${chain.join('>')}`\n if (visited.has(visitKey)) continue\n visited.add(visitKey)\n\n for (const peer of readPeerDeps(location, dep)) {\n addPeerSource(peer, {\n chain: chain.length > 0 ? [...chain, dep] : undefined,\n isRuntimeDep: isRuntime,\n requiredBy: dep,\n })\n }\n\n // Recurse into this dep's own runtime dependencies (not devDeps)\n if (chain.length < MAX_TRANSITIVE_DEPTH) {\n const depPkg = readDepPackageJson(location, dep)\n if (depPkg) {\n const transitiveDeps = Object.keys((depPkg.dependencies as Record<string, string> | undefined) ?? {})\n collectFromDeps(transitiveDeps, isRuntime, [...chain, dep])\n }\n }\n }\n }\n\n collectFromDeps(dependencies, true, [])\n\n const devOnly = devDependencies.filter(d => !dependencies.includes(d))\n collectFromDeps(devOnly, false, [])\n\n return peerSources\n}\n\nfunction formatChain(sources: PeerSource[]): string {\n const chainsWithDepth = sources.filter(s => s.chain && s.chain.length > 0)\n if (chainsWithDepth.length === 0) return ''\n const first = chainsWithDepth[0]\n return ` (via ${chalk.dim(first.chain!.join(' → '))})`\n}\n\n/**\n * Returns the full set of peer dependency names required by all deps and devDeps.\n * Used to prevent the unused-dependency checks from removing deps that satisfy\n * transitive peer requirements.\n */\nexport function getRequiredTransitivePeers(\n location: string,\n { dependencies, devDependencies }: CheckPackageParams,\n): Set<string> {\n const peerSources = collectPeerSources(location, dependencies, devDependencies)\n return new Set(peerSources.keys())\n}\n\nfunction logUnsatisfiedPeer(name: string, unsatisfied: UnsatisfiedPeer): void {\n const {\n peer, sources, reason, hasRuntimeSource, installedVersion, versionRange,\n } = unsatisfied\n const chainInfo = formatChain(sources)\n\n if (reason === 'version-mismatch') {\n const requiredByList = sources.map(s => s.requiredBy)\n console.log(\n `[${chalk.blue(name)}] Peer dependency version mismatch ${chalk.red(peer)}`\n + ` — installed ${chalk.yellow(installedVersion ?? 'unknown')}`\n + ` does not satisfy ${chalk.cyan(versionRange)}`\n + ` (required by ${chalk.cyan(requiredByList.join(', '))})`\n + chainInfo,\n )\n } else if (hasRuntimeSource) {\n const requiredByList = sources.filter(s => s.isRuntimeDep).map(s => s.requiredBy)\n console.log(\n `[${chalk.blue(name)}] Unsatisfied peer dependency ${chalk.red(peer)}`\n + ` (required by ${chalk.cyan(requiredByList.join(', '))})`\n + chainInfo\n + ' — must be in dependencies or peerDependencies',\n )\n } else {\n const requiredByList = sources.map(s => s.requiredBy)\n console.log(\n `[${chalk.blue(name)}] Unsatisfied peer dependency ${chalk.red(peer)}`\n + ` (required by devDependency ${chalk.cyan(requiredByList.join(', '))})`\n + chainInfo\n + ' — must be in dependencies, devDependencies, or peerDependencies',\n )\n }\n}\n\nfunction resolveVersionRange(location: string, sources: PeerSource[], peer: string): string {\n for (const source of sources) {\n const range = readPeerVersionRange(location, source.requiredBy, peer)\n if (range) return range\n }\n return '*'\n}\n\nfunction checkVersionSatisfaction(location: string, peer: string, requestedRange: string): { installedVersion?: string; satisfied: boolean } {\n const installedVersion = readInstalledVersion(location, peer)\n if (!installedVersion) return { satisfied: true }\n if (requestedRange === '*') return { installedVersion, satisfied: true }\n // workspace: protocol versions resolve at install time — always satisfied\n if (requestedRange.startsWith('workspace:')) return { installedVersion, satisfied: true }\n\n try {\n const satisfied = semver.satisfies(installedVersion, requestedRange, { includePrerelease: true })\n return { installedVersion, satisfied }\n } catch {\n // Invalid semver range or version — skip version check\n return { installedVersion, satisfied: true }\n }\n}\n\nfunction findDeclaredPeerVersionMismatches(\n name: string,\n location: string,\n peerDependencies: string[],\n peerDependencyVersions: Record<string, string>,\n exclude?: Set<string>,\n): UnsatisfiedPeer[] {\n const results: UnsatisfiedPeer[] = []\n for (const peer of peerDependencies) {\n if (exclude?.has(peer) || peer === name) continue\n const declaredRange = peerDependencyVersions[peer]\n if (!declaredRange || declaredRange === '*') continue\n const { installedVersion, satisfied } = checkVersionSatisfaction(location, peer, declaredRange)\n if (!satisfied) {\n results.push({\n hasRuntimeSource: true,\n installedVersion,\n peer,\n reason: 'version-mismatch',\n sources: [{ isRuntimeDep: true, requiredBy: name }],\n versionRange: declaredRange,\n })\n }\n }\n return results\n}\n\nexport function findUnsatisfiedPeers(\n { name, location }: Workspace,\n {\n dependencies, devDependencies, peerDependencies, peerDependencyVersions,\n }: CheckPackageParams,\n exclude?: Set<string>,\n): UnsatisfiedPeer[] {\n const peerSources = collectPeerSources(location, dependencies, devDependencies)\n const depsSet = new Set(dependencies)\n const devDepsSet = new Set(devDependencies)\n const unsatisfied: UnsatisfiedPeer[] = []\n\n for (const [peer, sources] of peerSources) {\n if (exclude?.has(peer) || peer === name) continue\n if (isPeerOptionalInAll(location, peer, sources)) continue\n\n const hasRuntimeSource = sources.some(s => s.isRuntimeDep)\n // A peer is provided if it's in dependencies or devDependencies.\n // Being in peerDependencies alone only passes the requirement to consumers\n // but doesn't actually provide the package (yarn will warn \"doesn't provide\").\n const isPresent = depsSet.has(peer) || devDepsSet.has(peer)\n\n if (!isPresent) {\n const versionRange = resolveVersionRange(location, sources, peer)\n unsatisfied.push({\n hasRuntimeSource, peer, reason: 'missing', sources, versionRange,\n })\n continue\n }\n\n const versionRange = resolveVersionRange(location, sources, peer)\n const { installedVersion, satisfied } = checkVersionSatisfaction(location, peer, versionRange)\n if (!satisfied) {\n unsatisfied.push({\n hasRuntimeSource, installedVersion, peer, reason: 'version-mismatch', sources, versionRange,\n })\n }\n }\n\n return [\n ...unsatisfied,\n ...findDeclaredPeerVersionMismatches(name, location, peerDependencies, peerDependencyVersions, exclude),\n ]\n}\n\n/**\n * Checks that peerDependencies of all dependencies and devDependencies are\n * properly satisfied — both present and version-compatible.\n *\n * Rules:\n * - If a dep in `dependencies` requires peer P, then P must be in\n * `dependencies` or `peerDependencies`.\n * - If a dep in `devDependencies` requires peer P, then P can also be\n * in `devDependencies`.\n * - If multiple deps require the same peer P and at least one is a runtime\n * dependency, the runtime rule applies (P must be in deps or peerDeps).\n * - Checks peers transitively up to 2 levels deep in the dependency tree.\n * - Validates that installed versions satisfy the requested peer ranges.\n */\nexport interface CheckPeerResult {\n count: number\n unsatisfiedPeers: Set<string>\n}\n\nexport function getUnsatisfiedPeerDependencies(\n workspace: Workspace,\n packageParams: CheckPackageParams,\n exclude?: Set<string>,\n): CheckPeerResult {\n const unsatisfied = findUnsatisfiedPeers(workspace, packageParams, exclude)\n\n for (const entry of unsatisfied) {\n logUnsatisfiedPeer(workspace.name, entry)\n }\n\n if (unsatisfied.length > 0) {\n console.log(` ${chalk.yellow(`${workspace.location}/package.json`)}\\n`)\n }\n return {\n count: unsatisfied.length,\n unsatisfiedPeers: new Set(unsatisfied.map(u => u.peer)),\n }\n}\n\n/**\n * Determines if a package is \"terminal\" (an app, CLI, or website — not a library).\n * Terminal packages have their peers added to dependencies; libraries use peerDependencies.\n */\nfunction isTerminalPackage(packageJsonPath: string): boolean {\n try {\n const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')) as Record<string, unknown>\n return pkg.private === true\n } catch {\n return false\n }\n}\n\n/**\n * Fixes unsatisfied peer dependencies by adding them to package.json.\n *\n * - Terminal packages (private: true): runtime peers go to dependencies,\n * dev-only peers go to devDependencies\n * - Library packages: runtime peers go to peerDependencies,\n * dev-only peers go to devDependencies\n * - Version mismatches are reported but not auto-fixed (requires manual review)\n */\nexport interface FixPeerResult {\n addedPeers: Set<string>\n count: number\n}\n\nfunction fixVersionMismatch(\n workspaceName: string,\n entry: UnsatisfiedPeer,\n pkg: Record<string, Record<string, string>>,\n): boolean {\n const {\n installedVersion, peer, versionRange,\n } = entry\n if (!installedVersion) {\n logUnsatisfiedPeer(workspaceName, entry)\n console.log(\n ` ${chalk.dim('(version mismatch — could not resolve installed version)')}`,\n )\n return false\n }\n\n const match = /^(\\d+)\\.(\\d+)/.exec(installedVersion)\n if (!match) {\n logUnsatisfiedPeer(workspaceName, entry)\n console.log(\n ` ${chalk.dim('(version mismatch — could not resolve installed version)')}`,\n )\n return false\n }\n\n const expectedVersion = versionRange.startsWith('^')\n ? `^${match[1]}`\n : `~${match[1]}.${match[2]}`\n\n if (pkg.peerDependencies?.[peer]) {\n pkg.peerDependencies[peer] = expectedVersion\n }\n if (pkg.devDependencies?.[peer] && !pkg.devDependencies[peer].startsWith('workspace:')) {\n pkg.devDependencies[peer] = expectedVersion\n }\n\n console.log(\n `[${chalk.blue(workspaceName)}] Fixed: updated ${chalk.green(peer)}`\n + ` version to ${chalk.cyan(expectedVersion)} (was ${chalk.yellow(versionRange)})`,\n )\n return true\n}\n\nexport function fixUnsatisfiedPeerDependencies(\n workspace: Workspace,\n packageParams: CheckPackageParams,\n exclude?: Set<string>,\n): FixPeerResult {\n const unsatisfied = findUnsatisfiedPeers(workspace, packageParams, exclude)\n if (unsatisfied.length === 0) return { addedPeers: new Set(), count: 0 }\n\n const packageJsonPath = `${workspace.location}/package.json`\n const pkg = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8')) as Record<string, Record<string, string>>\n const isTerminal = isTerminalPackage(packageJsonPath)\n\n const addedPeers = new Set<string>()\n let fixedCount = 0\n for (const entry of unsatisfied) {\n const {\n hasRuntimeSource,\n peer,\n reason,\n sources,\n versionRange,\n } = entry\n\n if (reason === 'version-mismatch') {\n if (fixVersionMismatch(workspace.name, entry, pkg)) fixedCount++\n continue\n }\n\n const sections = resolvePeerTargetSections(hasRuntimeSource, isTerminal)\n for (const section of sections) {\n pkg[section] = pkg[section] ?? {}\n pkg[section][peer] = versionRange\n }\n addedPeers.add(peer)\n\n const requiredByList = sources.map(s => s.requiredBy).join(', ')\n console.log(\n `[${chalk.blue(workspace.name)}] Fixed: added ${chalk.green(peer)}@${versionRange}`\n + ` to ${chalk.cyan(sections.join(' + '))} (required by ${requiredByList})`,\n )\n fixedCount++\n }\n\n if (fixedCount > 0) {\n const sorted = sortPackageJson(JSON.stringify(pkg, null, 2))\n fs.writeFileSync(packageJsonPath, `${sorted}\\n`)\n }\n\n return { addedPeers, count: unsatisfied.length }\n}\n\n/**\n * For terminal packages (apps): runtime peers → dependencies, dev-only → devDependencies.\n * For library packages: runtime peers → peerDependencies + devDependencies (peer passes\n * the requirement to consumers, devDep satisfies it for the library's own development).\n * Dev-only peers → devDependencies only.\n */\nexport function resolvePeerTargetSections(hasRuntimeSource: boolean, isTerminal: boolean): string[] {\n if (!hasRuntimeSource) return ['devDependencies']\n if (isTerminal) return ['dependencies']\n return ['peerDependencies', 'devDependencies']\n}\n"],"mappings":"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","names":["fs","fs","fs","globSync","fs","globSync","fs","fs","path","fs","path","isDeclarationFile","fs","path","fs","path","fs","fs","fs"]}
@@ -0,0 +1,20 @@
1
+ // src/actions/deplint/tsScriptsAliases.ts
2
+ var VARIANT_MAP = {
3
+ "@xylabs/ts-scripts-yarn3": "@xylabs/ts-scripts-pnpm",
4
+ "@xylabs/ts-scripts-pnpm": "@xylabs/ts-scripts-yarn3",
5
+ "@xylabs/ts-scripts-react-yarn3": "@xylabs/ts-scripts-react-pnpm",
6
+ "@xylabs/ts-scripts-react-pnpm": "@xylabs/ts-scripts-react-yarn3"
7
+ };
8
+ function isSatisfiedByTsScriptsVariant(imp, allDeps) {
9
+ const variant = VARIANT_MAP[imp];
10
+ return variant !== void 0 && allDeps.includes(variant);
11
+ }
12
+ function isUsedViaTsScriptsVariant(dep, imports) {
13
+ const variant = VARIANT_MAP[dep];
14
+ return variant !== void 0 && imports.includes(variant);
15
+ }
16
+ export {
17
+ isSatisfiedByTsScriptsVariant,
18
+ isUsedViaTsScriptsVariant
19
+ };
20
+ //# sourceMappingURL=tsScriptsAliases.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/actions/deplint/tsScriptsAliases.ts"],"sourcesContent":["/**\n * After a packman convert, source files may still import from the old\n * ts-scripts variant (e.g. yarn3 → pnpm). Deplint should not flag\n * these as missing when the correct PM variant is installed.\n *\n * Maps each ts-scripts package to the variant it can be satisfied by.\n */\nconst VARIANT_MAP: Record<string, string> = {\n '@xylabs/ts-scripts-yarn3': '@xylabs/ts-scripts-pnpm',\n '@xylabs/ts-scripts-pnpm': '@xylabs/ts-scripts-yarn3',\n '@xylabs/ts-scripts-react-yarn3': '@xylabs/ts-scripts-react-pnpm',\n '@xylabs/ts-scripts-react-pnpm': '@xylabs/ts-scripts-react-yarn3',\n}\n\n/**\n * Returns true if `imp` is a ts-scripts import whose other PM variant\n * is present in the dependency lists, meaning the import is satisfied.\n */\nexport function isSatisfiedByTsScriptsVariant(\n imp: string,\n allDeps: string[],\n): boolean {\n const variant = VARIANT_MAP[imp]\n return variant !== undefined && allDeps.includes(variant)\n}\n\n/**\n * Returns true if `dep` is a ts-scripts package whose other PM variant\n * appears in the import list, meaning the dep is effectively used.\n */\nexport function isUsedViaTsScriptsVariant(\n dep: string,\n imports: string[],\n): boolean {\n const variant = VARIANT_MAP[dep]\n return variant !== undefined && imports.includes(variant)\n}\n"],"mappings":";AAOA,IAAM,cAAsC;AAAA,EAC1C,4BAA4B;AAAA,EAC5B,2BAA2B;AAAA,EAC3B,kCAAkC;AAAA,EAClC,iCAAiC;AACnC;AAMO,SAAS,8BACd,KACA,SACS;AACT,QAAM,UAAU,YAAY,GAAG;AAC/B,SAAO,YAAY,UAAa,QAAQ,SAAS,OAAO;AAC1D;AAMO,SAAS,0BACd,KACA,SACS;AACT,QAAM,UAAU,YAAY,GAAG;AAC/B,SAAO,YAAY,UAAa,QAAQ,SAAS,OAAO;AAC1D;","names":[]}
@@ -0,0 +1 @@
1
+ //# sourceMappingURL=types.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":[],"sourcesContent":[],"mappings":"","names":[]}
@@ -0,0 +1,194 @@
1
+ // src/actions/deploy.ts
2
+ import { readFileSync as readFileSync3 } from "fs";
3
+
4
+ // src/lib/checkResult.ts
5
+ import chalk from "chalk";
6
+ var checkResult = (name, result, level = "error", exitOnFail = false) => {
7
+ if (result) {
8
+ const exiting = exitOnFail ? "[Exiting Process]" : "[Continuing]";
9
+ const chalkFunc = level === "error" ? chalk.red : chalk.yellow;
10
+ console[level](chalkFunc(`${name} had ${result} failures ${exiting}`));
11
+ if (exitOnFail) {
12
+ process.exit(result);
13
+ }
14
+ }
15
+ };
16
+
17
+ // src/pm/detectPackageManager.ts
18
+ import { existsSync } from "fs";
19
+ function detectPackageManager() {
20
+ if (existsSync("pnpm-lock.yaml") || existsSync("pnpm-workspace.yaml")) return "pnpm";
21
+ return "yarn";
22
+ }
23
+
24
+ // src/pm/registry.ts
25
+ var implementations = /* @__PURE__ */ new Map();
26
+ function getPackageManager(name) {
27
+ const pmName = name ?? detectPackageManager();
28
+ const pm = implementations.get(pmName);
29
+ if (!pm) {
30
+ throw new Error(
31
+ `No package manager implementation registered for "${pmName}". Ensure registerPackageManager() has been called before getPackageManager().`
32
+ );
33
+ }
34
+ return pm;
35
+ }
36
+
37
+ // src/lib/processEx.ts
38
+ import chalk2 from "chalk";
39
+
40
+ // src/lib/withError.ts
41
+ var withError = (ex, closure, predicate = (ex2) => !!ex2.name && !!ex2.message) => {
42
+ return predicate(ex) ? closure(ex) : void 0;
43
+ };
44
+
45
+ // src/lib/withErrnoException.ts
46
+ var withErrnoException = (ex, closure) => {
47
+ return withError(ex, closure, (ex2) => ex2.errno !== void 0);
48
+ };
49
+
50
+ // src/lib/processEx.ts
51
+ var processEx = (ex) => {
52
+ const error = typeof ex === "string" ? new Error(ex) : ex;
53
+ const exitCode = withErrnoException(error, (error2) => {
54
+ if (error2.code === "ENOENT") {
55
+ console.error(chalk2.red(`'${error2.path}' not found.`));
56
+ } else {
57
+ console.error(chalk2.red(`Errno: ${error2.code}`));
58
+ }
59
+ return error2.errno ?? -1;
60
+ }) ?? withError(error, (error2) => {
61
+ console.error(chalk2.red(`${error2.name}: ${error2.message}`));
62
+ return -1;
63
+ }) ?? (() => {
64
+ console.error(chalk2.red(`Unexpected Error: ${JSON.stringify(ex, null, 2)}`));
65
+ return -1;
66
+ })();
67
+ process.exit(process.exitCode ?? exitCode);
68
+ };
69
+
70
+ // src/lib/safeExit.ts
71
+ var safeExit = (func, exitOnFail = true) => {
72
+ try {
73
+ const result = func();
74
+ if (result && exitOnFail) {
75
+ process.exit(result);
76
+ }
77
+ return result;
78
+ } catch (ex) {
79
+ return processEx(ex);
80
+ }
81
+ };
82
+
83
+ // src/lib/initCwd.ts
84
+ function INIT_CWD() {
85
+ return process.env.INIT_CWD ?? process.cwd();
86
+ }
87
+
88
+ // src/lib/packageName.ts
89
+ import { readFileSync } from "fs";
90
+ import path from "path";
91
+ function packageName() {
92
+ if (process.env.npm_package_name) {
93
+ return process.env.npm_package_name;
94
+ }
95
+ try {
96
+ const pkgPath = path.join(INIT_CWD(), "package.json");
97
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
98
+ return pkg.name;
99
+ } catch {
100
+ return void 0;
101
+ }
102
+ }
103
+
104
+ // src/lib/runSteps.ts
105
+ import { spawnSync } from "child_process";
106
+ import { existsSync as existsSync2 } from "fs";
107
+ import chalk3 from "chalk";
108
+ var runSteps = (name, steps, exitOnFail = true, messages) => {
109
+ return safeExit(() => {
110
+ const pkgName = packageName();
111
+ console.log(chalk3.green(`${name} [${pkgName}]`));
112
+ let totalStatus = 0;
113
+ for (const [i, [command, args, config]] of steps.entries()) {
114
+ if (messages?.[i]) {
115
+ console.log(chalk3.gray(messages?.[i]));
116
+ }
117
+ const argList = Array.isArray(args) ? args : args.split(" ");
118
+ if (command === "node" && !existsSync2(argList[0])) {
119
+ throw new Error(`File not found [${argList[0]}]`);
120
+ }
121
+ const status = spawnSync(command, Array.isArray(args) ? args : args.split(" "), {
122
+ ...config,
123
+ encoding: "utf8",
124
+ env: { FORCE_COLOR: "3", ...process.env },
125
+ shell: true,
126
+ stdio: "inherit"
127
+ }).status ?? 0;
128
+ checkResult(name, status, "error", exitOnFail);
129
+ totalStatus += status ?? 0;
130
+ }
131
+ return totalStatus;
132
+ }, !!exitOnFail);
133
+ };
134
+
135
+ // src/actions/package-lint-deps.ts
136
+ import { readFileSync as readFileSync2, writeFileSync } from "fs";
137
+ import PATH from "path";
138
+ import chalk4 from "chalk";
139
+ import semver from "semver";
140
+ function readWorkspacePackageJson(cwd, location) {
141
+ const pkgPath = PATH.resolve(cwd, location, "package.json");
142
+ try {
143
+ return JSON.parse(readFileSync2(pkgPath, "utf8"));
144
+ } catch {
145
+ return void 0;
146
+ }
147
+ }
148
+ function logMonorepoVersion() {
149
+ const cwd = INIT_CWD();
150
+ const workspaces = getPackageManager().listWorkspaces();
151
+ for (const { location } of workspaces) {
152
+ if (location === ".") continue;
153
+ const pkg = readWorkspacePackageJson(cwd, location);
154
+ if (!pkg) continue;
155
+ const version = pkg.version;
156
+ if (version) {
157
+ console.log(chalk4.green(`
158
+ Deployed version: ${chalk4.bold(version)}`));
159
+ return;
160
+ }
161
+ }
162
+ }
163
+
164
+ // src/actions/deploy.ts
165
+ var privatePackageExcludeList = () => {
166
+ const pm = getPackageManager();
167
+ const possibleDeployablePackages = pm.listWorkspaces().map((workspace) => [
168
+ workspace,
169
+ JSON.parse(readFileSync3(`${workspace.location}/package.json`, { encoding: "utf8" }))
170
+ ]);
171
+ const privatePackages = possibleDeployablePackages.filter(([_, pkg]) => pkg.private).map(([workspace]) => workspace);
172
+ const excludeList = privatePackages.map((workspace) => `--exclude ${workspace.name}`);
173
+ return excludeList;
174
+ };
175
+ function deploy(level = "patch") {
176
+ const excludeList = privatePackageExcludeList();
177
+ if (excludeList.length > 0) {
178
+ console.log("Excluding private packages from deployment:", excludeList);
179
+ }
180
+ const label = level === "prerelease" ? "Next" : level.charAt(0).toUpperCase() + level.slice(1);
181
+ const pm = getPackageManager();
182
+ const result = runSteps(`Deploy [${label}]`, [
183
+ ...pm.versionBump(level),
184
+ pm.runXy(["clean"]),
185
+ pm.runXy(["build"]),
186
+ pm.versionApply()
187
+ ]);
188
+ logMonorepoVersion();
189
+ return result;
190
+ }
191
+ export {
192
+ deploy
193
+ };
194
+ //# sourceMappingURL=deploy.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/actions/deploy.ts","../../src/lib/checkResult.ts","../../src/pm/detectPackageManager.ts","../../src/pm/registry.ts","../../src/lib/processEx.ts","../../src/lib/withError.ts","../../src/lib/withErrnoException.ts","../../src/lib/safeExit.ts","../../src/lib/initCwd.ts","../../src/lib/packageName.ts","../../src/lib/runSteps.ts","../../src/actions/package-lint-deps.ts"],"sourcesContent":["import { readFileSync } from 'node:fs'\n\nimport { runSteps } from '../lib/index.ts'\nimport type { Workspace } from '../pm/index.ts'\nimport { getPackageManager } from '../pm/index.ts'\nimport { logMonorepoVersion } from './package-lint-deps.ts'\n\nexport type DeployLevel = 'major' | 'minor' | 'patch' | 'prerelease'\n\nconst privatePackageExcludeList = () => {\n const pm = getPackageManager()\n const possibleDeployablePackages: [Workspace, { private?: boolean }][] = pm.listWorkspaces().map(workspace => [workspace,\n JSON.parse(readFileSync(`${workspace.location}/package.json`, { encoding: 'utf8' })) as object])\n\n const privatePackages = possibleDeployablePackages.filter(([_, pkg]) => pkg.private).map(([workspace]) => workspace)\n const excludeList = privatePackages.map(workspace => `--exclude ${workspace.name}`)\n return excludeList\n}\n\nexport function deploy(level: DeployLevel = 'patch'): number {\n const excludeList = privatePackageExcludeList()\n if (excludeList.length > 0) {\n console.log('Excluding private packages from deployment:', excludeList)\n }\n\n const label = level === 'prerelease' ? 'Next' : level.charAt(0).toUpperCase() + level.slice(1)\n const pm = getPackageManager()\n const result = runSteps(`Deploy [${label}]`, [\n ...pm.versionBump(level),\n pm.runXy(['clean']),\n pm.runXy(['build']),\n pm.versionApply(),\n ])\n logMonorepoVersion()\n return result\n}\n","import chalk from 'chalk'\n\nexport const checkResult = (name: string, result: number, level: 'error' | 'warn' = 'error', exitOnFail = false) => {\n if (result) {\n const exiting = exitOnFail ? '[Exiting Process]' : '[Continuing]'\n const chalkFunc = level === 'error' ? chalk.red : chalk.yellow\n console[level](chalkFunc(`${name} had ${result} failures ${exiting}`))\n if (exitOnFail) {\n process.exit(result)\n }\n }\n}\n","import { existsSync } from 'node:fs'\n\nexport type PackageManagerName = 'pnpm' | 'yarn'\n\nexport function detectPackageManager(): PackageManagerName {\n if (existsSync('pnpm-lock.yaml') || existsSync('pnpm-workspace.yaml')) return 'pnpm'\n return 'yarn'\n}\n","import type { PackageManagerName } from './detectPackageManager.ts'\nimport { detectPackageManager } from './detectPackageManager.ts'\nimport type { PackageManager } from './PackageManager.ts'\n\nconst implementations = new Map<PackageManagerName, PackageManager>()\n\nexport function registerPackageManager(pm: PackageManager): void {\n implementations.set(pm.name, pm)\n}\n\nexport function getPackageManager(name?: PackageManagerName): PackageManager {\n const pmName = name ?? detectPackageManager()\n const pm = implementations.get(pmName)\n if (!pm) {\n throw new Error(\n `No package manager implementation registered for \"${pmName}\". `\n + 'Ensure registerPackageManager() has been called before getPackageManager().',\n )\n }\n return pm\n}\n","import chalk from 'chalk'\n\nimport { withErrnoException } from './withErrnoException.ts'\nimport { withError } from './withError.ts'\n\nexport const processEx = (ex: unknown) => {\n const error = typeof ex === 'string' ? new Error(ex) : ex\n const exitCode\n = withErrnoException(error, (error) => {\n if (error.code === 'ENOENT') {\n console.error(chalk.red(`'${error.path}' not found.`))\n } else {\n console.error(chalk.red(`Errno: ${error.code}`))\n }\n return error.errno ?? -1\n })\n ?? withError(error, (error) => {\n console.error(chalk.red(`${error.name}: ${error.message}`))\n return -1\n })\n ?? (() => {\n console.error(chalk.red(`Unexpected Error: ${JSON.stringify(ex, null, 2)}`))\n return -1\n })()\n // This allows us to use a previously set exit code\n process.exit(process.exitCode ?? exitCode)\n}\n","export const withError = <T extends Error = Error>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ex: any,\n closure: (error: T) => number,\n predicate = (ex: T) => (!!ex.name && !!ex.message),\n) => {\n return predicate(ex as T) ? closure(ex as T) : undefined\n}\n","import { withError } from './withError.ts'\n\nexport const withErrnoException = <T extends NodeJS.ErrnoException = NodeJS.ErrnoException>(\n ex: unknown, closure: (error: T) => number,\n) => {\n return withError<T>(ex, closure, (ex: unknown) => (ex as NodeJS.ErrnoException).errno !== undefined)\n}\n","/** Catch child process a crash and returns the code */\n\nimport { processEx } from './processEx.ts'\n\nconst safeExit = (func: () => number, exitOnFail = true): number => {\n try {\n const result = func()\n if (result && exitOnFail) {\n process.exit(result)\n }\n return result\n } catch (ex) {\n return processEx(ex)\n }\n}\n\nconst safeExitAsync = async (func: () => Promise<number>, exitOnFail = true): Promise<number> => {\n try {\n const result = await func()\n if (result && exitOnFail) {\n process.exit(result)\n }\n return result\n } catch (ex) {\n return processEx(ex)\n }\n}\n\nexport { safeExit, safeExitAsync }\n","export function INIT_CWD(): string {\n return process.env.INIT_CWD ?? process.cwd()\n}\n","import { readFileSync } from 'node:fs'\nimport path from 'node:path'\n\nimport { INIT_CWD } from './initCwd.ts'\n\nexport function packageName(): string | undefined {\n if (process.env.npm_package_name) {\n return process.env.npm_package_name\n }\n try {\n const pkgPath = path.join(INIT_CWD(), 'package.json')\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as Record<string, unknown>\n return pkg.name as string | undefined\n } catch {\n return undefined\n }\n}\n","import { spawnSync } from 'node:child_process'\nimport { existsSync } from 'node:fs'\n\nimport chalk from 'chalk'\n\nimport type { ScriptStep } from '../pm/index.ts'\nimport { checkResult } from './checkResult.ts'\nimport { packageName } from './packageName.ts'\nimport { safeExit } from './safeExit.ts'\n\nexport const runSteps = (name: string, steps: ScriptStep[], exitOnFail = true, messages?: string[]): number => {\n return safeExit(() => {\n const pkgName = packageName()\n console.log(chalk.green(`${name} [${pkgName}]`))\n let totalStatus = 0\n for (const [i, [command, args, config]] of steps.entries()) {\n if (messages?.[i]) {\n console.log(chalk.gray(messages?.[i]))\n }\n const argList = Array.isArray(args) ? args : args.split(' ')\n if (command === 'node' && !existsSync(argList[0])) {\n throw new Error(`File not found [${argList[0]}]`)\n }\n const status\n = spawnSync(command, Array.isArray(args) ? args : args.split(' '), {\n ...config,\n encoding: 'utf8',\n env: { FORCE_COLOR: '3', ...process.env },\n shell: true,\n stdio: 'inherit',\n }).status ?? 0\n checkResult(name, status, 'error', exitOnFail)\n totalStatus += status ?? 0\n }\n return totalStatus\n }, !!exitOnFail)\n}\n","import { readFileSync, writeFileSync } from 'node:fs'\nimport PATH from 'node:path'\n\nimport chalk from 'chalk'\nimport semver from 'semver'\n\nimport { INIT_CWD } from '../lib/index.ts'\nimport { getPackageManager } from '../pm/index.ts'\nimport type { LintResult } from './package-lint.ts'\n\nfunction readWorkspacePackageJson(cwd: string, location: string): Record<string, unknown> | undefined {\n const pkgPath = PATH.resolve(cwd, location, 'package.json')\n try {\n return JSON.parse(readFileSync(pkgPath, 'utf8')) as Record<string, unknown>\n } catch {\n return undefined\n }\n}\n\nfunction writeWorkspacePackageJson(cwd: string, location: string, pkg: Record<string, unknown>) {\n const pkgPath = PATH.resolve(cwd, location, 'package.json')\n writeFileSync(pkgPath, `${JSON.stringify(pkg, null, 2)}\\n`, 'utf8')\n}\n\nfunction buildWorkspaceVersionMap(\n cwd: string,\n workspaces: { location: string; name: string }[],\n): Map<string, string> {\n const map = new Map<string, string>()\n for (const { location, name } of workspaces) {\n if (location === '.') continue\n const pkg = readWorkspacePackageJson(cwd, location)\n if (!pkg) continue\n const version = pkg.version as string | undefined\n if (version) map.set(name, version)\n }\n return map\n}\n\n/**\n * Derives the expected peerDep range from the workspace protocol used in\n * the matching devDependency and the current version of the target package.\n *\n * workspace:~ + version 7.6.21 → ~7.6\n * workspace:^ + version 7.6.21 → ^7\n *\n * Falls back to ~major.minor if no matching devDep is found.\n */\nfunction expectedPeerRange(devDepVersion: string | undefined, targetVersion: string): string {\n const parsed = semver.parse(targetVersion)\n if (!parsed) return `~${targetVersion}`\n\n if (devDepVersion === 'workspace:^') {\n return `^${parsed.major}`\n }\n return `~${parsed.major}.${parsed.minor}`\n}\n\n// --- Version consistency checks ---\n\nexport function checkVersionConsistency(\n cwd: string,\n rootPkg: Record<string, unknown>,\n workspaces: { location: string; name: string }[],\n): LintResult {\n const result: LintResult = {\n errors: [], fixable: [], warnings: [],\n }\n\n if (rootPkg.version !== undefined) {\n result.fixable.push('Root package.json should not have a \"version\" field in a monorepo')\n }\n\n const versions = new Map<string, string>()\n for (const { location, name } of workspaces) {\n if (location === '.') continue\n const pkg = readWorkspacePackageJson(cwd, location)\n if (!pkg) continue\n const version = pkg.version as string | undefined\n if (version) {\n versions.set(name, version)\n } else {\n result.errors.push(`${name} (${location}) is missing a \"version\" field`)\n }\n }\n\n const uniqueVersions = new Set(versions.values())\n if (uniqueVersions.size > 1) {\n const versionList = [...uniqueVersions].toSorted(semver.rcompare)\n for (const [name, version] of versions) {\n if (version !== versionList[0]) {\n result.fixable.push(`${name} has version ${version} (expected ${versionList[0]})`)\n }\n }\n }\n\n return result\n}\n\nexport function fixVersionConsistency(\n cwd: string,\n rootPkg: Record<string, unknown>,\n writeRootPackageJson: (cwd: string, pkg: Record<string, unknown>) => void,\n workspaces: { location: string; name: string }[],\n): void {\n if (rootPkg.version !== undefined) {\n delete rootPkg.version\n writeRootPackageJson(cwd, rootPkg)\n console.log(chalk.green(' ✔ Fixed: removed \"version\" from root package.json'))\n }\n\n const versions: string[] = []\n for (const { location } of workspaces) {\n if (location === '.') continue\n const pkg = readWorkspacePackageJson(cwd, location)\n if (!pkg) continue\n const version = pkg.version as string | undefined\n if (version && semver.valid(version)) {\n versions.push(version)\n }\n }\n\n if (versions.length === 0) return\n\n const highest = versions.toSorted(semver.rcompare)[0]\n\n for (const { location, name } of workspaces) {\n if (location === '.') continue\n const pkg = readWorkspacePackageJson(cwd, location)\n if (!pkg) continue\n if (pkg.version !== highest) {\n pkg.version = highest\n writeWorkspacePackageJson(cwd, location, pkg)\n console.log(chalk.green(` ✔ Fixed: set version to ${highest} in ${name} (${location})`))\n }\n }\n}\n\n// --- Internal dependency version checks (dependencies and devDependencies only) ---\n\nfunction expectedDepVersion(targetVersion: string): string {\n const parsed = semver.parse(targetVersion)\n if (!parsed) return `~${targetVersion}`\n return `~${targetVersion}`\n}\n\nexport function checkInternalDepVersions(\n cwd: string,\n workspaces: { location: string; name: string }[],\n): LintResult {\n const result: LintResult = {\n errors: [], fixable: [], warnings: [],\n }\n const workspaceVersions = buildWorkspaceVersionMap(cwd, workspaces)\n\n for (const { location, name } of workspaces) {\n const pkg = readWorkspacePackageJson(cwd, location)\n if (!pkg) continue\n\n for (const depField of ['dependencies', 'devDependencies'] as const) {\n const deps = pkg[depField] as Record<string, string> | undefined\n if (!deps) continue\n for (const [dep, version] of Object.entries(deps)) {\n const targetVersion = workspaceVersions.get(dep)\n if (!targetVersion) continue\n const expected = expectedDepVersion(targetVersion)\n if (version.startsWith('workspace:')) {\n result.fixable.push(\n `${name} (${location}) ${depField}.${dep} is \"${version}\" — should be \"${expected}\" (not workspace: protocol)`,\n )\n } else if (version !== expected) {\n result.fixable.push(\n `${name} (${location}) ${depField}.${dep} is \"${version}\" — should be \"${expected}\"`,\n )\n }\n }\n }\n }\n\n return result\n}\n\nexport function fixInternalDepVersions(\n cwd: string,\n workspaces: { location: string; name: string }[],\n): void {\n const workspaceVersions = buildWorkspaceVersionMap(cwd, workspaces)\n\n for (const { location, name } of workspaces) {\n const pkg = readWorkspacePackageJson(cwd, location)\n if (!pkg) continue\n let modified = false\n\n for (const depField of ['dependencies', 'devDependencies'] as const) {\n const deps = pkg[depField] as Record<string, string> | undefined\n if (!deps) continue\n for (const [dep, version] of Object.entries(deps)) {\n const targetVersion = workspaceVersions.get(dep)\n if (!targetVersion) continue\n const expected = expectedDepVersion(targetVersion)\n if (version !== expected) {\n deps[dep] = expected\n console.log(chalk.green(` ✔ Fixed: set ${depField}.${dep} to \"${expected}\" in ${name} (${location})`))\n modified = true\n }\n }\n }\n\n if (modified) {\n writeWorkspacePackageJson(cwd, location, pkg)\n }\n }\n}\n\n// --- Workspace protocol checks (pnpm — dependencies and devDependencies only) ---\n\nexport function checkWorkspaceProtocol(\n cwd: string,\n workspaces: { location: string; name: string }[],\n): LintResult {\n const result: LintResult = {\n errors: [], fixable: [], warnings: [],\n }\n const workspaceNames = new Set(workspaces.map(w => w.name))\n\n for (const { location, name } of workspaces) {\n const pkg = readWorkspacePackageJson(cwd, location)\n if (!pkg) continue\n\n for (const depField of ['dependencies', 'devDependencies'] as const) {\n const deps = pkg[depField] as Record<string, string> | undefined\n if (!deps) continue\n for (const [dep, version] of Object.entries(deps)) {\n if (!workspaceNames.has(dep)) continue\n if (!version.startsWith('workspace:')) {\n result.fixable.push(\n `${name} (${location}) ${depField}.${dep} is \"${version}\" — should use workspace: protocol`,\n )\n }\n }\n }\n }\n\n return result\n}\n\nexport function fixWorkspaceProtocol(\n cwd: string,\n workspaces: { location: string; name: string }[],\n): void {\n const workspaceNames = new Set(workspaces.map(w => w.name))\n\n for (const { location, name } of workspaces) {\n const pkg = readWorkspacePackageJson(cwd, location)\n if (!pkg) continue\n let modified = false\n\n for (const depField of ['dependencies', 'devDependencies'] as const) {\n const deps = pkg[depField] as Record<string, string> | undefined\n if (!deps) continue\n for (const [dep, version] of Object.entries(deps)) {\n if (!workspaceNames.has(dep)) continue\n if (!version.startsWith('workspace:')) {\n deps[dep] = 'workspace:~'\n console.log(chalk.green(` ✔ Fixed: set ${depField}.${dep} to \"workspace:~\" in ${name} (${location})`))\n modified = true\n }\n }\n }\n\n if (modified) {\n writeWorkspacePackageJson(cwd, location, pkg)\n }\n }\n}\n\n// --- Internal peerDependency version checks ---\n\nexport function checkInternalPeerVersions(\n cwd: string,\n workspaces: { location: string; name: string }[],\n): LintResult {\n const result: LintResult = {\n errors: [], fixable: [], warnings: [],\n }\n const workspaceVersions = buildWorkspaceVersionMap(cwd, workspaces)\n\n for (const { location, name } of workspaces) {\n const pkg = readWorkspacePackageJson(cwd, location)\n if (!pkg) continue\n\n const peerDeps = pkg.peerDependencies as Record<string, string> | undefined\n if (!peerDeps) continue\n const devDeps = pkg.devDependencies as Record<string, string> | undefined\n\n for (const [dep, version] of Object.entries(peerDeps)) {\n const targetVersion = workspaceVersions.get(dep)\n if (!targetVersion) continue\n\n if (version.startsWith('workspace:')) {\n const expected = expectedPeerRange(devDeps?.[dep], targetVersion)\n result.fixable.push(\n `${name} (${location}) peerDependencies.${dep} uses workspace: protocol — should be \"${expected}\"`,\n )\n continue\n }\n\n const expected = expectedPeerRange(devDeps?.[dep], targetVersion)\n if (version !== expected && !semver.satisfies(targetVersion, version)) {\n result.fixable.push(\n `${name} (${location}) peerDependencies.${dep} is \"${version}\" — current version ${targetVersion} is not satisfied; expected \"${expected}\"`,\n )\n }\n }\n }\n\n return result\n}\n\nexport function fixInternalPeerVersions(\n cwd: string,\n workspaces: { location: string; name: string }[],\n): void {\n const workspaceVersions = buildWorkspaceVersionMap(cwd, workspaces)\n\n for (const { location, name } of workspaces) {\n const pkg = readWorkspacePackageJson(cwd, location)\n if (!pkg) continue\n\n const peerDeps = pkg.peerDependencies as Record<string, string> | undefined\n if (!peerDeps) continue\n const devDeps = pkg.devDependencies as Record<string, string> | undefined\n let modified = false\n\n for (const [dep, version] of Object.entries(peerDeps)) {\n const targetVersion = workspaceVersions.get(dep)\n if (!targetVersion) continue\n\n const expected = expectedPeerRange(devDeps?.[dep], targetVersion)\n if (version !== expected) {\n peerDeps[dep] = expected\n console.log(chalk.green(` ✔ Fixed: set peerDependencies.${dep} to \"${expected}\" in ${name} (${location})`))\n modified = true\n }\n }\n\n if (modified) {\n writeWorkspacePackageJson(cwd, location, pkg)\n }\n }\n}\n\n/**\n * Syncs all internal peerDependency versions to match current workspace versions.\n * Called by xy publish to ensure peerDeps are correct before publishing.\n */\nexport function syncInternalPeerVersions(): number {\n const cwd = INIT_CWD()\n const workspaces = getPackageManager().listWorkspaces()\n const workspaceVersions = buildWorkspaceVersionMap(cwd, workspaces)\n let updated = 0\n\n for (const { location, name } of workspaces) {\n const pkg = readWorkspacePackageJson(cwd, location)\n if (!pkg) continue\n\n const peerDeps = pkg.peerDependencies as Record<string, string> | undefined\n if (!peerDeps) continue\n const devDeps = pkg.devDependencies as Record<string, string> | undefined\n let modified = false\n\n for (const [dep, version] of Object.entries(peerDeps)) {\n const targetVersion = workspaceVersions.get(dep)\n if (!targetVersion) continue\n\n const expected = expectedPeerRange(devDeps?.[dep], targetVersion)\n if (version !== expected) {\n peerDeps[dep] = expected\n console.log(chalk.green(`Publish: updated ${name} peerDependencies.${dep} to \"${expected}\"`))\n modified = true\n updated++\n }\n }\n\n if (modified) {\n writeWorkspacePackageJson(cwd, location, pkg)\n }\n }\n\n return updated\n}\n\n/**\n * Reads the shared monorepo version from the first non-root workspace\n * and logs it. Call at the end of deploy to report the new version.\n */\nexport function logMonorepoVersion(): void {\n const cwd = INIT_CWD()\n const workspaces = getPackageManager().listWorkspaces()\n\n for (const { location } of workspaces) {\n if (location === '.') continue\n const pkg = readWorkspacePackageJson(cwd, location)\n if (!pkg) continue\n const version = pkg.version as string | undefined\n if (version) {\n console.log(chalk.green(`\\nDeployed version: ${chalk.bold(version)}`))\n return\n }\n }\n}\n"],"mappings":"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","names":["readFileSync","chalk","ex","ex","error","chalk","existsSync","chalk","chalk","existsSync","readFileSync","chalk","readFileSync","chalk","readFileSync"]}
@@ -0,0 +1,226 @@
1
+ // src/actions/dupdeps.ts
2
+ import chalk3 from "chalk";
3
+
4
+ // src/lib/dependencies/detectDuplicateDependencies.ts
5
+ import { execSync } from "child_process";
6
+
7
+ // src/pm/detectPackageManager.ts
8
+ import { existsSync } from "fs";
9
+ function detectPackageManager() {
10
+ if (existsSync("pnpm-lock.yaml") || existsSync("pnpm-workspace.yaml")) return "pnpm";
11
+ return "yarn";
12
+ }
13
+
14
+ // src/pm/registry.ts
15
+ var implementations = /* @__PURE__ */ new Map();
16
+ function getPackageManager(name) {
17
+ const pmName = name ?? detectPackageManager();
18
+ const pm = implementations.get(pmName);
19
+ if (!pm) {
20
+ throw new Error(
21
+ `No package manager implementation registered for "${pmName}". Ensure registerPackageManager() has been called before getPackageManager().`
22
+ );
23
+ }
24
+ return pm;
25
+ }
26
+
27
+ // src/lib/processEx.ts
28
+ import chalk from "chalk";
29
+
30
+ // src/lib/withError.ts
31
+ var withError = (ex, closure, predicate = (ex2) => !!ex2.name && !!ex2.message) => {
32
+ return predicate(ex) ? closure(ex) : void 0;
33
+ };
34
+
35
+ // src/lib/withErrnoException.ts
36
+ var withErrnoException = (ex, closure) => {
37
+ return withError(ex, closure, (ex2) => ex2.errno !== void 0);
38
+ };
39
+
40
+ // src/lib/processEx.ts
41
+ var processEx = (ex) => {
42
+ const error = typeof ex === "string" ? new Error(ex) : ex;
43
+ const exitCode = withErrnoException(error, (error2) => {
44
+ if (error2.code === "ENOENT") {
45
+ console.error(chalk.red(`'${error2.path}' not found.`));
46
+ } else {
47
+ console.error(chalk.red(`Errno: ${error2.code}`));
48
+ }
49
+ return error2.errno ?? -1;
50
+ }) ?? withError(error, (error2) => {
51
+ console.error(chalk.red(`${error2.name}: ${error2.message}`));
52
+ return -1;
53
+ }) ?? (() => {
54
+ console.error(chalk.red(`Unexpected Error: ${JSON.stringify(ex, null, 2)}`));
55
+ return -1;
56
+ })();
57
+ process.exit(process.exitCode ?? exitCode);
58
+ };
59
+
60
+ // src/lib/safeExit.ts
61
+ var safeExit = (func, exitOnFail = true) => {
62
+ try {
63
+ const result = func();
64
+ if (result && exitOnFail) {
65
+ process.exit(result);
66
+ }
67
+ return result;
68
+ } catch (ex) {
69
+ return processEx(ex);
70
+ }
71
+ };
72
+
73
+ // src/lib/dependencies/DuplicateDetector.ts
74
+ import { EOL } from "os";
75
+ import chalk2 from "chalk";
76
+
77
+ // src/lib/jsonFormatters.ts
78
+ var multiLineToJSONArray = (output) => {
79
+ const withCommas = output.replaceAll("\r\n", "").replaceAll("\n", ",");
80
+ const cleanCollection = withCommas.slice(0, Math.max(0, withCommas.length - 1));
81
+ const collection = `[${cleanCollection}]`;
82
+ return JSON.parse(collection);
83
+ };
84
+
85
+ // src/lib/dependencies/DuplicateDetector.ts
86
+ var trimVirtualMeta = (value) => {
87
+ const virtualParts = value.split("virtual:");
88
+ if (virtualParts.length > 1) {
89
+ const hashParts = virtualParts[1].split("#");
90
+ return virtualParts[0] + hashParts[1];
91
+ } else {
92
+ return value;
93
+ }
94
+ };
95
+ var trimObjectDependencyVirtualMeta = (obj) => {
96
+ const resultObj = {};
97
+ for (const [key, value] of Object.entries(obj)) {
98
+ resultObj[trimVirtualMeta(key)] = {
99
+ descriptor: trimVirtualMeta(value.descriptor),
100
+ locator: trimVirtualMeta(value.locator)
101
+ };
102
+ }
103
+ return resultObj;
104
+ };
105
+ var trimDependencyVirtualMeta = (dependencies) => {
106
+ return dependencies.map((dependency) => {
107
+ return { children: trimObjectDependencyVirtualMeta(dependency.children), value: trimVirtualMeta(dependency.value) };
108
+ });
109
+ };
110
+ function extractPnpmVersions(data, depName) {
111
+ const versions = /* @__PURE__ */ new Set();
112
+ function walk(obj) {
113
+ if (Array.isArray(obj)) {
114
+ for (const item of obj) walk(item);
115
+ } else if (obj && typeof obj === "object") {
116
+ const record = obj;
117
+ if (typeof record.version === "string" && typeof record.from === "string" && record.from === depName) {
118
+ versions.add(record.version);
119
+ }
120
+ for (const val of Object.values(record)) walk(val);
121
+ }
122
+ }
123
+ walk(data);
124
+ return [...versions];
125
+ }
126
+ var DuplicateDetector = class {
127
+ dependency;
128
+ duplicateVersions;
129
+ constructor(output, dependency) {
130
+ this.dependency = dependency;
131
+ this.duplicateVersions = this.parseVersions(output, dependency);
132
+ }
133
+ detect() {
134
+ if (this.duplicateVersions.length > 1) {
135
+ console.log(chalk2.yellow(`${EOL}Duplicates found for: ${this.dependency}`));
136
+ const duplicateVersions = this.duplicateVersions.join(`${EOL} `);
137
+ console.log(chalk2.grey(` ${duplicateVersions}`, EOL));
138
+ return 1;
139
+ } else {
140
+ console.log(`${this.dependency} - OK`);
141
+ return 0;
142
+ }
143
+ }
144
+ parseVersions(output, dependency) {
145
+ try {
146
+ const parsed = JSON.parse(output);
147
+ if (Array.isArray(parsed)) {
148
+ return extractPnpmVersions(parsed, dependency);
149
+ }
150
+ } catch {
151
+ }
152
+ try {
153
+ const entries = trimDependencyVirtualMeta(multiLineToJSONArray(output));
154
+ const versions = /* @__PURE__ */ new Set();
155
+ for (const entry of entries) {
156
+ for (const key of Object.keys(entry.children)) {
157
+ const version = key.includes("@virtual:") ? void 0 : key;
158
+ if (version) versions.add(version);
159
+ }
160
+ }
161
+ return [...versions];
162
+ } catch {
163
+ console.warn(chalk2.yellow(`Could not parse dependency output for ${dependency}`));
164
+ return [];
165
+ }
166
+ }
167
+ };
168
+
169
+ // src/lib/dependencies/detectDuplicateDependencies.ts
170
+ var detectDuplicateDependencies = (depsFromPackageJSON, DefaultDependencies) => {
171
+ let exitCode = 0;
172
+ const dependencies = depsFromPackageJSON?.length ? depsFromPackageJSON : DefaultDependencies;
173
+ return safeExit(() => {
174
+ if (dependencies) {
175
+ for (const dependency of dependencies) {
176
+ let output;
177
+ try {
178
+ const pm = getPackageManager();
179
+ const cmd = `${pm.command} why ${dependency} --json`;
180
+ output = execSync(cmd, { maxBuffer: 64 * 1024 * 1024 }).toString();
181
+ } catch (e) {
182
+ console.error(`Error running dependency check: ${String(e)}`);
183
+ exitCode = 1;
184
+ continue;
185
+ }
186
+ if (output) {
187
+ exitCode = new DuplicateDetector(output, dependency).detect();
188
+ } else {
189
+ console.log(`${dependency} - N/A`);
190
+ if (depsFromPackageJSON) {
191
+ exitCode = 1;
192
+ console.log(`\u{1F6A8} Library ${dependency} was requested in package.json but not found`);
193
+ }
194
+ }
195
+ }
196
+ return exitCode;
197
+ } else {
198
+ console.log("\u{1F6A8} No dependencies where passed");
199
+ return exitCode;
200
+ }
201
+ });
202
+ };
203
+
204
+ // src/lib/parsedPackageJSON.ts
205
+ import { readFileSync } from "fs";
206
+ var parsedPackageJSON = (path) => {
207
+ const pathToPackageJSON = path ?? process.env.npm_package_json ?? "";
208
+ const packageJSON = readFileSync(pathToPackageJSON).toString();
209
+ return JSON.parse(packageJSON);
210
+ };
211
+
212
+ // src/actions/dupdeps.ts
213
+ var dupdeps = () => {
214
+ console.log(chalk3.green("Checking all Dependencies for Duplicates"));
215
+ const pkg = parsedPackageJSON();
216
+ const allDependencies = {
217
+ ...pkg?.dependencies,
218
+ ...pkg?.devDependencies
219
+ };
220
+ const dependencies = Object.keys(allDependencies);
221
+ return detectDuplicateDependencies(dependencies);
222
+ };
223
+ export {
224
+ dupdeps
225
+ };
226
+ //# sourceMappingURL=dupdeps.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/actions/dupdeps.ts","../../src/lib/dependencies/detectDuplicateDependencies.ts","../../src/pm/detectPackageManager.ts","../../src/pm/registry.ts","../../src/lib/processEx.ts","../../src/lib/withError.ts","../../src/lib/withErrnoException.ts","../../src/lib/safeExit.ts","../../src/lib/dependencies/DuplicateDetector.ts","../../src/lib/jsonFormatters.ts","../../src/lib/parsedPackageJSON.ts"],"sourcesContent":["import chalk from 'chalk'\n\nimport { detectDuplicateDependencies, parsedPackageJSON } from '../lib/index.ts'\n\nexport const dupdeps = () => {\n console.log(chalk.green('Checking all Dependencies for Duplicates'))\n\n const pkg = parsedPackageJSON()\n const allDependencies = {\n ...(pkg?.dependencies as Record<string, string> | undefined),\n ...(pkg?.devDependencies as Record<string, string> | undefined),\n }\n const dependencies = Object.keys(allDependencies)\n\n return detectDuplicateDependencies(dependencies)\n}\n","import { execSync } from 'node:child_process'\n\nimport { getPackageManager } from '../../pm/index.ts'\nimport { safeExit } from '../safeExit.ts'\nimport { DuplicateDetector } from './DuplicateDetector.ts'\n\nexport const detectDuplicateDependencies = (depsFromPackageJSON?: string[], DefaultDependencies?: string[]) => {\n let exitCode = 0\n\n const dependencies = depsFromPackageJSON?.length ? depsFromPackageJSON : DefaultDependencies\n\n return safeExit(() => {\n if (dependencies) {\n for (const dependency of dependencies) {\n let output: string\n\n try {\n const pm = getPackageManager()\n const cmd = `${pm.command} why ${dependency} --json`\n output = execSync(cmd, { maxBuffer: 64 * 1024 * 1024 }).toString()\n } catch (e) {\n console.error(`Error running dependency check: ${String(e)}`)\n exitCode = 1\n continue\n }\n\n if (output) {\n exitCode = new DuplicateDetector(output, dependency).detect()\n } else {\n console.log(`${dependency} - N/A`)\n if (depsFromPackageJSON) {\n exitCode = 1\n console.log(`🚨 Library ${dependency} was requested in package.json but not found`)\n }\n }\n }\n return exitCode\n } else {\n console.log('🚨 No dependencies where passed')\n return exitCode\n }\n })\n}\n","import { existsSync } from 'node:fs'\n\nexport type PackageManagerName = 'pnpm' | 'yarn'\n\nexport function detectPackageManager(): PackageManagerName {\n if (existsSync('pnpm-lock.yaml') || existsSync('pnpm-workspace.yaml')) return 'pnpm'\n return 'yarn'\n}\n","import type { PackageManagerName } from './detectPackageManager.ts'\nimport { detectPackageManager } from './detectPackageManager.ts'\nimport type { PackageManager } from './PackageManager.ts'\n\nconst implementations = new Map<PackageManagerName, PackageManager>()\n\nexport function registerPackageManager(pm: PackageManager): void {\n implementations.set(pm.name, pm)\n}\n\nexport function getPackageManager(name?: PackageManagerName): PackageManager {\n const pmName = name ?? detectPackageManager()\n const pm = implementations.get(pmName)\n if (!pm) {\n throw new Error(\n `No package manager implementation registered for \"${pmName}\". `\n + 'Ensure registerPackageManager() has been called before getPackageManager().',\n )\n }\n return pm\n}\n","import chalk from 'chalk'\n\nimport { withErrnoException } from './withErrnoException.ts'\nimport { withError } from './withError.ts'\n\nexport const processEx = (ex: unknown) => {\n const error = typeof ex === 'string' ? new Error(ex) : ex\n const exitCode\n = withErrnoException(error, (error) => {\n if (error.code === 'ENOENT') {\n console.error(chalk.red(`'${error.path}' not found.`))\n } else {\n console.error(chalk.red(`Errno: ${error.code}`))\n }\n return error.errno ?? -1\n })\n ?? withError(error, (error) => {\n console.error(chalk.red(`${error.name}: ${error.message}`))\n return -1\n })\n ?? (() => {\n console.error(chalk.red(`Unexpected Error: ${JSON.stringify(ex, null, 2)}`))\n return -1\n })()\n // This allows us to use a previously set exit code\n process.exit(process.exitCode ?? exitCode)\n}\n","export const withError = <T extends Error = Error>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ex: any,\n closure: (error: T) => number,\n predicate = (ex: T) => (!!ex.name && !!ex.message),\n) => {\n return predicate(ex as T) ? closure(ex as T) : undefined\n}\n","import { withError } from './withError.ts'\n\nexport const withErrnoException = <T extends NodeJS.ErrnoException = NodeJS.ErrnoException>(\n ex: unknown, closure: (error: T) => number,\n) => {\n return withError<T>(ex, closure, (ex: unknown) => (ex as NodeJS.ErrnoException).errno !== undefined)\n}\n","/** Catch child process a crash and returns the code */\n\nimport { processEx } from './processEx.ts'\n\nconst safeExit = (func: () => number, exitOnFail = true): number => {\n try {\n const result = func()\n if (result && exitOnFail) {\n process.exit(result)\n }\n return result\n } catch (ex) {\n return processEx(ex)\n }\n}\n\nconst safeExitAsync = async (func: () => Promise<number>, exitOnFail = true): Promise<number> => {\n try {\n const result = await func()\n if (result && exitOnFail) {\n process.exit(result)\n }\n return result\n } catch (ex) {\n return processEx(ex)\n }\n}\n\nexport { safeExit, safeExitAsync }\n","import { EOL } from 'node:os'\n\nimport chalk from 'chalk'\n\nimport { multiLineToJSONArray } from '../jsonFormatters.ts'\n\ninterface ChildFields {\n descriptor: string\n locator: string\n}\n\nconst trimVirtualMeta = (value: string): string => {\n const virtualParts = value.split('virtual:')\n if (virtualParts.length > 1) {\n const hashParts = virtualParts[1].split('#')\n return virtualParts[0] + hashParts[1]\n } else {\n return value\n }\n}\n\nconst trimObjectDependencyVirtualMeta = (obj: Record<string, ChildFields>): Record<string, ChildFields> => {\n const resultObj: Record<string, ChildFields> = {}\n for (const [key, value] of Object.entries(obj)) {\n resultObj[trimVirtualMeta(key)] = {\n descriptor: trimVirtualMeta(value.descriptor),\n locator: trimVirtualMeta(value.locator),\n }\n }\n return resultObj\n}\n\nconst trimDependencyVirtualMeta = (dependencies: DependencyEntries): DependencyEntries => {\n return dependencies.map((dependency) => {\n return { children: trimObjectDependencyVirtualMeta(dependency.children), value: trimVirtualMeta(dependency.value) }\n })\n}\n\ninterface DependencyEntry {\n children: Record<string, ChildFields>\n value: string\n}\n\ntype DependencyEntries = DependencyEntry[]\n\n/**\n * Extracts all versions of a named dependency from pnpm's `why --json` output.\n * The output is a JSON array of workspace packages, each containing nested\n * dependency trees with `version` fields.\n */\nfunction extractPnpmVersions(data: unknown, depName: string): string[] {\n const versions = new Set<string>()\n function walk(obj: unknown): void {\n if (Array.isArray(obj)) {\n for (const item of obj) walk(item)\n } else if (obj && typeof obj === 'object') {\n const record = obj as Record<string, unknown>\n if (typeof record.version === 'string' && typeof record.from === 'string' && record.from === depName) {\n versions.add(record.version)\n }\n for (const val of Object.values(record)) walk(val)\n }\n }\n walk(data)\n return [...versions]\n}\n\nexport class DuplicateDetector {\n private dependency: string\n private duplicateVersions: string[]\n\n constructor(output: string, dependency: string) {\n this.dependency = dependency\n this.duplicateVersions = this.parseVersions(output, dependency)\n }\n\n detect(): number {\n if (this.duplicateVersions.length > 1) {\n console.log(chalk.yellow(`${EOL}Duplicates found for: ${this.dependency}`))\n const duplicateVersions = this.duplicateVersions.join(`${EOL} `)\n console.log(chalk.grey(` ${duplicateVersions}`, EOL))\n return 1\n } else {\n console.log(`${this.dependency} - OK`)\n return 0\n }\n }\n\n private parseVersions(output: string, dependency: string): string[] {\n // Try pnpm format first (valid JSON array)\n try {\n const parsed: unknown = JSON.parse(output)\n if (Array.isArray(parsed)) {\n return extractPnpmVersions(parsed, dependency)\n }\n } catch {\n // Not pnpm format, try yarn NDJSON format\n }\n\n try {\n const entries: DependencyEntries = trimDependencyVirtualMeta(multiLineToJSONArray(output) as DependencyEntries)\n const versions = new Set<string>()\n for (const entry of entries) {\n for (const key of Object.keys(entry.children)) {\n const version = key.includes('@virtual:') ? undefined : key\n if (version) versions.add(version)\n }\n }\n return [...versions]\n } catch {\n console.warn(chalk.yellow(`Could not parse dependency output for ${dependency}`))\n return []\n }\n }\n}\n","export const multiLineToJSONArray = (output: string): unknown[] => {\n const withCommas = output.replaceAll('\\r\\n', '').replaceAll('\\n', ',')\n const cleanCollection = withCommas.slice(0, Math.max(0, withCommas.length - 1))\n const collection = `[${cleanCollection}]`\n return JSON.parse(collection) as unknown[]\n}\n","import { readFileSync } from 'node:fs'\n\nexport const parsedPackageJSON = (path?: string): Record<string, unknown> => {\n const pathToPackageJSON = path ?? process.env.npm_package_json ?? ''\n const packageJSON = readFileSync(pathToPackageJSON).toString()\n return JSON.parse(packageJSON) as Record<string, unknown>\n}\n"],"mappings":"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","names":["chalk","ex","ex","error","chalk","chalk","chalk"]}