@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,1556 @@
1
+ // src/actions/deplint/findFiles.ts
2
+ import fs from "fs";
3
+
4
+ // src/actions/deplint/findFilesByGlob.ts
5
+ import { globSync } from "glob";
6
+ function findFilesByGlob(cwd, pattern, ignore) {
7
+ return globSync(pattern, {
8
+ cwd,
9
+ absolute: true,
10
+ ignore,
11
+ nodir: true
12
+ });
13
+ }
14
+
15
+ // src/actions/deplint/findFiles.ts
16
+ var codeExtensions = "*.{ts,tsx,mts,cts,js,mjs,cjs}";
17
+ function getWorkspaceIgnores(location) {
18
+ try {
19
+ const raw = fs.readFileSync(`${location}/package.json`, "utf8");
20
+ const pkg = JSON.parse(raw);
21
+ return pkg.workspaces ?? [];
22
+ } catch {
23
+ return [];
24
+ }
25
+ }
26
+ function findFiles(location) {
27
+ const workspaceIgnores = getWorkspaceIgnores(location).map((w) => `${w}/**`);
28
+ const ignore = ["**/node_modules/**", "dist/**", ...workspaceIgnores];
29
+ const allFiles = findFilesByGlob(location, `./**/${codeExtensions}`, ignore);
30
+ const distFiles = [
31
+ ...findFilesByGlob(location, "./dist/**/*.d.ts"),
32
+ ...findFilesByGlob(location, `./dist/**/${codeExtensions}`)
33
+ ];
34
+ return { allFiles, distFiles };
35
+ }
36
+
37
+ // src/actions/deplint/getDependenciesFromPackageJson.ts
38
+ import fs2 from "fs";
39
+ import path from "path";
40
+ function getDependenciesFromPackageJson(packageJsonPath) {
41
+ const packageJsonFullPath = path.resolve(packageJsonPath);
42
+ const rawContent = fs2.readFileSync(packageJsonFullPath, "utf8");
43
+ const packageJson = JSON.parse(rawContent);
44
+ const depsRecord = packageJson.dependencies ?? {};
45
+ const devDepsRecord = packageJson.devDependencies ?? {};
46
+ const peerDepsRecord = packageJson.peerDependencies ?? {};
47
+ const dependencies = Object.keys(depsRecord);
48
+ const devDependencies = Object.keys(devDepsRecord);
49
+ const peerDependencies = Object.keys(peerDepsRecord);
50
+ const dependencyVersions = depsRecord;
51
+ const devDependencyVersions = devDepsRecord;
52
+ const peerDependencyVersions = peerDepsRecord;
53
+ return {
54
+ dependencies,
55
+ dependencyVersions,
56
+ devDependencies,
57
+ devDependencyVersions,
58
+ peerDependencies,
59
+ peerDependencyVersions
60
+ };
61
+ }
62
+
63
+ // src/actions/deplint/getExtendsFromTsconfigs.ts
64
+ import fs3 from "fs";
65
+ import { globSync as globSync2 } from "glob";
66
+
67
+ // src/actions/deplint/getBasePackageName.ts
68
+ function getBasePackageName(importName) {
69
+ const importNameScrubbed = importName.replaceAll('"', "").trim();
70
+ if (importNameScrubbed.startsWith("@")) {
71
+ const parts = importNameScrubbed.split("/");
72
+ return parts.length >= 2 ? `${parts[0]}/${parts[1]}` : importNameScrubbed;
73
+ }
74
+ return importNameScrubbed.split("/")[0];
75
+ }
76
+
77
+ // src/actions/deplint/getExtendsFromTsconfigs.ts
78
+ var isExternalReference = (ref) => !ref.startsWith(".") && !ref.startsWith("/");
79
+ function parseExtendsField(value) {
80
+ if (typeof value === "string") return [value];
81
+ if (Array.isArray(value)) return value.filter((v) => typeof v === "string");
82
+ return [];
83
+ }
84
+ function parseTsconfig(file) {
85
+ const content = fs3.readFileSync(file, "utf8");
86
+ const cleaned = content.replaceAll(/\/\/.*/g, "").replaceAll(/,\s*([}\]])/g, "$1");
87
+ return JSON.parse(cleaned);
88
+ }
89
+ function getExtendsFromTsconfigs(location) {
90
+ const tsconfigFiles = globSync2("./tsconfig*.json", { cwd: location, absolute: true });
91
+ const packages = /* @__PURE__ */ new Set();
92
+ for (const file of tsconfigFiles) {
93
+ try {
94
+ const parsed = parseTsconfig(file);
95
+ const refs = parseExtendsField(parsed.extends);
96
+ for (const ref of refs) {
97
+ if (isExternalReference(ref)) {
98
+ packages.add(getBasePackageName(ref));
99
+ }
100
+ }
101
+ } catch {
102
+ }
103
+ }
104
+ return [...packages];
105
+ }
106
+
107
+ // src/actions/deplint/getExternalImportsFromFiles.ts
108
+ import fs5 from "fs";
109
+
110
+ // src/actions/deplint/getImportsFromFile.ts
111
+ import fs4 from "fs";
112
+ import path2 from "path";
113
+ import ts from "typescript";
114
+ function isTypeOnlyImportClause(clause) {
115
+ if (clause === void 0) {
116
+ return false;
117
+ }
118
+ if ("phaseModifier" in clause) {
119
+ const mod = clause.phaseModifier;
120
+ const kind = typeof mod === "number" ? mod : mod?.kind;
121
+ return kind === ts.SyntaxKind.TypeKeyword;
122
+ }
123
+ return clause.isTypeOnly ?? false;
124
+ }
125
+ function getImportsFromFile(filePath, importPaths, typeImportPaths) {
126
+ const sourceCode = fs4.readFileSync(filePath, "utf8");
127
+ const isMjsFile = filePath.endsWith(".mjs");
128
+ const sourceFile = ts.createSourceFile(
129
+ path2.basename(filePath),
130
+ sourceCode,
131
+ ts.ScriptTarget.Latest,
132
+ true,
133
+ isMjsFile ? ts.ScriptKind.JS : void 0
134
+ );
135
+ const imports = [];
136
+ const typeImports = [];
137
+ const isDeclarationFile2 = filePath.endsWith(".d.ts");
138
+ function visit(node) {
139
+ if (ts.isImportDeclaration(node) || ts.isExportDeclaration(node)) {
140
+ const moduleSpecifier = node.moduleSpecifier?.getFullText();
141
+ const isTypeImport = ts.isImportDeclaration(node) ? isTypeOnlyImportClause(node.importClause) : false;
142
+ if (typeof moduleSpecifier === "string") {
143
+ const trimmed = moduleSpecifier.replaceAll("'", "").replaceAll('"', "").trim();
144
+ if (isTypeImport || isDeclarationFile2) {
145
+ typeImports.push(trimmed);
146
+ } else {
147
+ imports.push(trimmed);
148
+ }
149
+ }
150
+ } else if (ts.isCallExpression(node) && node.expression.kind === ts.SyntaxKind.ImportKeyword) {
151
+ const [arg] = node.arguments;
152
+ if (ts.isStringLiteral(arg)) {
153
+ imports.push(arg.text);
154
+ }
155
+ } else if (ts.isCallExpression(node) && ts.isIdentifier(node.expression) && node.expression.text === "require" && node.arguments.length > 0 && ts.isStringLiteral(node.arguments[0])) {
156
+ imports.push(node.arguments[0].text);
157
+ }
158
+ ts.forEachChild(node, visit);
159
+ }
160
+ visit(sourceFile);
161
+ for (const ref of sourceFile.typeReferenceDirectives) {
162
+ typeImports.push(ref.fileName);
163
+ }
164
+ const importsStartsWithExcludes = [".", "#", "node:"];
165
+ const isValidImport = (imp) => !importsStartsWithExcludes.some((exc) => imp.startsWith(exc)) && !imp.includes("*") && !imp.includes("!");
166
+ const cleanedImports = imports.filter(isValidImport).map(getBasePackageName);
167
+ const cleanedTypeImports = typeImports.filter(isValidImport).map(getBasePackageName);
168
+ for (const imp of cleanedImports) {
169
+ importPaths[imp] = importPaths[imp] ?? [];
170
+ importPaths[imp].push(filePath);
171
+ }
172
+ for (const imp of cleanedTypeImports) {
173
+ typeImportPaths[imp] = typeImportPaths[imp] ?? [];
174
+ typeImportPaths[imp].push(filePath);
175
+ }
176
+ return [cleanedImports, cleanedTypeImports];
177
+ }
178
+
179
+ // src/actions/deplint/getExternalImportsFromFiles.ts
180
+ var internalImportPrefixes = [".", "#", "node:"];
181
+ var removeInternalImports = (imports) => {
182
+ return imports.filter((imp) => !internalImportPrefixes.some((prefix) => imp.startsWith(prefix)));
183
+ };
184
+ var isDeclarationFile = (file) => file.endsWith(".d.ts") || file.endsWith(".d.cts") || file.endsWith(".d.mts");
185
+ function shipsTsconfig(location) {
186
+ try {
187
+ const raw = fs5.readFileSync(`${location}/package.json`, "utf8");
188
+ const pkg = JSON.parse(raw);
189
+ const files = pkg.files;
190
+ return files?.some((f) => f === "tsconfig.json" || f.includes("tsconfig")) ?? false;
191
+ } catch {
192
+ return false;
193
+ }
194
+ }
195
+ function getExternalImportsFromFiles({
196
+ allFiles,
197
+ distFiles,
198
+ location,
199
+ tsconfigExtends = [],
200
+ tsconfigTypes = []
201
+ }) {
202
+ const allImportPaths = {};
203
+ const distImportPaths = {};
204
+ const distTypeImportPaths = {};
205
+ for (const path6 of allFiles) getImportsFromFile(path6, allImportPaths, allImportPaths).flat();
206
+ const distTypeFiles = distFiles.filter(isDeclarationFile);
207
+ const distCodeFiles = distFiles.filter((file) => !isDeclarationFile(file));
208
+ for (const path6 of distCodeFiles) getImportsFromFile(path6, distImportPaths, distImportPaths).flat();
209
+ for (const path6 of distTypeFiles) getImportsFromFile(path6, distTypeImportPaths, distTypeImportPaths).flat();
210
+ const allImports = Object.keys(allImportPaths);
211
+ const distImports = Object.keys(distImportPaths);
212
+ const externalAllImports = removeInternalImports(allImports);
213
+ const externalDistImports = removeInternalImports(distImports);
214
+ const externalDistTypeImports = removeInternalImports(Object.keys(distTypeImportPaths));
215
+ const isDistTsconfig = shipsTsconfig(location);
216
+ for (const ext of tsconfigExtends) {
217
+ if (!externalAllImports.includes(ext)) externalAllImports.push(ext);
218
+ if (isDistTsconfig && !externalDistImports.includes(ext)) externalDistImports.push(ext);
219
+ }
220
+ for (const typ of tsconfigTypes) {
221
+ if (!externalAllImports.includes(typ)) externalAllImports.push(typ);
222
+ }
223
+ return {
224
+ allImportPaths,
225
+ allImports,
226
+ distImportPaths,
227
+ distImports,
228
+ externalAllImports,
229
+ externalDistImports,
230
+ externalDistTypeImports,
231
+ tsconfigExtends: [...tsconfigExtends]
232
+ };
233
+ }
234
+
235
+ // src/actions/deplint/checkPackage/getMismatchedPeerDevVersions.ts
236
+ import chalk2 from "chalk";
237
+ import semver from "semver";
238
+
239
+ // src/actions/deplint/packageJsonEditor.ts
240
+ import fs7 from "fs";
241
+ import chalk from "chalk";
242
+ import sortPackageJson from "sort-package-json";
243
+
244
+ // src/actions/deplint/getRequiredPeerDependencies.ts
245
+ import fs6 from "fs";
246
+ import path3 from "path";
247
+ function findDepPackageJson(location, dep) {
248
+ let dir = location;
249
+ while (true) {
250
+ const candidate = path3.join(dir, "node_modules", dep, "package.json");
251
+ if (fs6.existsSync(candidate)) return candidate;
252
+ const parent = path3.dirname(dir);
253
+ if (parent === dir) return void 0;
254
+ dir = parent;
255
+ }
256
+ }
257
+ function getRequiredPeerDependencies(location, allDeps) {
258
+ const required = /* @__PURE__ */ new Set();
259
+ for (const dep of allDeps) {
260
+ const depPkgPath = findDepPackageJson(location, dep);
261
+ if (!depPkgPath) continue;
262
+ try {
263
+ const raw = fs6.readFileSync(depPkgPath, "utf8");
264
+ const pkg = JSON.parse(raw);
265
+ const peerDeps = pkg.peerDependencies;
266
+ if (peerDeps) {
267
+ for (const peer of Object.keys(peerDeps)) {
268
+ required.add(peer);
269
+ }
270
+ }
271
+ } catch {
272
+ }
273
+ }
274
+ return required;
275
+ }
276
+
277
+ // src/actions/deplint/packageJsonEditor.ts
278
+ function readPackageJson(location) {
279
+ return JSON.parse(fs7.readFileSync(`${location}/package.json`, "utf8"));
280
+ }
281
+ function writePackageJson(location, pkg) {
282
+ const sorted = sortPackageJson(JSON.stringify(pkg, null, 2));
283
+ fs7.writeFileSync(`${location}/package.json`, `${sorted}
284
+ `);
285
+ }
286
+ function moveDep(pkg, dep, from, to) {
287
+ const fromSection = pkg[from];
288
+ if (!fromSection?.[dep]) return;
289
+ const version = fromSection[dep];
290
+ delete fromSection[dep];
291
+ if (Object.keys(fromSection).length === 0) {
292
+ delete pkg[from];
293
+ }
294
+ const toSection = pkg[to] ?? {};
295
+ toSection[dep] = version;
296
+ pkg[to] = toSection;
297
+ }
298
+ function removeDep(pkg, dep, section) {
299
+ const sectionObj = pkg[section];
300
+ if (!sectionObj?.[dep]) return;
301
+ delete sectionObj[dep];
302
+ if (Object.keys(sectionObj).length === 0) {
303
+ delete pkg[section];
304
+ }
305
+ }
306
+ function addDep(pkg, dep, version, section) {
307
+ const sectionObj = pkg[section] ?? {};
308
+ sectionObj[dep] = version;
309
+ pkg[section] = sectionObj;
310
+ }
311
+ function resolveDepVersion(location, dep) {
312
+ const depPkgPath = findDepPackageJson(location, dep);
313
+ if (depPkgPath) {
314
+ try {
315
+ const depPkg = JSON.parse(fs7.readFileSync(depPkgPath, "utf8"));
316
+ const version = depPkg.version;
317
+ if (version) return `~${version}`;
318
+ } catch {
319
+ }
320
+ }
321
+ return "*";
322
+ }
323
+ function logFix(workspace, action, dep, detail) {
324
+ const detailStr = detail ? ` (${detail})` : "";
325
+ console.log(`[${chalk.blue(workspace.name)}] Fixed: ${action} ${chalk.green(dep)}${detailStr}`);
326
+ }
327
+
328
+ // src/actions/deplint/checkPackage/getMismatchedPeerDevVersions.ts
329
+ function findMismatchedPeerDevVersions({
330
+ peerDependencies,
331
+ peerDependencyVersions,
332
+ devDependencyVersions
333
+ }, exclude) {
334
+ const mismatches = [];
335
+ for (const dep of peerDependencies) {
336
+ if (exclude?.has(dep)) continue;
337
+ const peerVersion = peerDependencyVersions[dep];
338
+ const devVersion = devDependencyVersions[dep];
339
+ const hasWorkspaceProtocol = devVersion?.startsWith("workspace:") || peerVersion?.startsWith("workspace:");
340
+ if (devVersion && peerVersion !== devVersion && !hasWorkspaceProtocol && !semver.subset(devVersion, peerVersion)) {
341
+ mismatches.push({
342
+ dep,
343
+ devVersion,
344
+ peerVersion
345
+ });
346
+ }
347
+ }
348
+ return mismatches;
349
+ }
350
+ function getMismatchedPeerDevVersions({ name, location }, packageParams, exclude) {
351
+ const mismatches = findMismatchedPeerDevVersions(packageParams, exclude);
352
+ for (const {
353
+ dep,
354
+ peerVersion,
355
+ devVersion
356
+ } of mismatches) {
357
+ console.log(
358
+ `[${chalk2.blue(name)}] Peer/dev version mismatch ${chalk2.red(dep)} \u2014 peer: ${chalk2.yellow(peerVersion)}, dev: ${chalk2.cyan(devVersion)}`
359
+ );
360
+ }
361
+ if (mismatches.length > 0) {
362
+ console.log(` ${chalk2.yellow(`${location}/package.json`)}
363
+ `);
364
+ }
365
+ return mismatches.length;
366
+ }
367
+ function fixMismatchedPeerDevVersions(workspace, packageParams, exclude) {
368
+ const mismatches = findMismatchedPeerDevVersions(packageParams, exclude);
369
+ if (mismatches.length === 0) return 0;
370
+ const pkg = readPackageJson(workspace.location);
371
+ for (const { dep, devVersion } of mismatches) {
372
+ if (pkg.peerDependencies?.[dep]) {
373
+ pkg.peerDependencies[dep] = devVersion;
374
+ console.log(
375
+ `[${chalk2.blue(workspace.name)}] Fixed: synced peerDependency ${chalk2.green(dep)} to devDependency version ${chalk2.cyan(devVersion)}`
376
+ );
377
+ }
378
+ }
379
+ writePackageJson(workspace.location, pkg);
380
+ return mismatches.length;
381
+ }
382
+
383
+ // src/actions/deplint/checkPackage/getUnlistedDependencies.ts
384
+ import fs8 from "fs";
385
+ import { builtinModules } from "module";
386
+ import chalk3 from "chalk";
387
+
388
+ // src/actions/deplint/tsScriptsAliases.ts
389
+ var VARIANT_MAP = {
390
+ "@xylabs/ts-scripts-yarn3": "@xylabs/ts-scripts-pnpm",
391
+ "@xylabs/ts-scripts-pnpm": "@xylabs/ts-scripts-yarn3",
392
+ "@xylabs/ts-scripts-react-yarn3": "@xylabs/ts-scripts-react-pnpm",
393
+ "@xylabs/ts-scripts-react-pnpm": "@xylabs/ts-scripts-react-yarn3"
394
+ };
395
+ function isSatisfiedByTsScriptsVariant(imp, allDeps) {
396
+ const variant = VARIANT_MAP[imp];
397
+ return variant !== void 0 && allDeps.includes(variant);
398
+ }
399
+ function isUsedViaTsScriptsVariant(dep, imports) {
400
+ const variant = VARIANT_MAP[dep];
401
+ return variant !== void 0 && imports.includes(variant);
402
+ }
403
+
404
+ // src/actions/deplint/checkPackage/getUnlistedDependencies.ts
405
+ function isRuntimeImportListed(imp, name, dependencies, peerDependencies) {
406
+ return dependencies.includes(imp) || imp === name || peerDependencies.includes(imp) || builtinModules.includes(imp);
407
+ }
408
+ function isDistTypeImportListed(imp, name, dependencies, devDependencies, peerDependencies) {
409
+ return dependencies.includes(imp) || imp === name || dependencies.includes(`@types/${imp}`) || devDependencies.includes(`@types/${imp}`) || peerDependencies.includes(imp) || peerDependencies.includes(`@types/${imp}`) || builtinModules.includes(imp);
410
+ }
411
+ function logMissing(name, imp, importPaths) {
412
+ console.log(`[${chalk3.blue(name)}] Missing dependency in package.json: ${chalk3.red(imp)}`);
413
+ if (importPaths[imp]) {
414
+ console.log(` ${importPaths[imp].join("\n ")}`);
415
+ }
416
+ }
417
+ function shouldBePeerDependency(imp, location, currentPeers, distImports) {
418
+ if (currentPeers.length === 0) return false;
419
+ const depPkgPath = findDepPackageJson(location, imp);
420
+ if (!depPkgPath) return false;
421
+ try {
422
+ const pkg = JSON.parse(fs8.readFileSync(depPkgPath, "utf8"));
423
+ const importPeers = Object.keys(pkg.peerDependencies ?? {});
424
+ return importPeers.length > 0 && importPeers.every(
425
+ (peer) => currentPeers.includes(peer) && distImports.includes(peer)
426
+ );
427
+ } catch {
428
+ return false;
429
+ }
430
+ }
431
+ function findUnlistedDependencies(name, dependencies, devDependencies, peerDependencies, externalDistImports, externalDistTypeImports) {
432
+ const allDeps = [...dependencies, ...devDependencies, ...peerDependencies];
433
+ const results = [];
434
+ for (const imp of externalDistImports) {
435
+ if (!isRuntimeImportListed(imp, name, dependencies, peerDependencies) && !isSatisfiedByTsScriptsVariant(imp, allDeps)) {
436
+ results.push({ imp, section: "dependencies" });
437
+ }
438
+ }
439
+ for (const imp of externalDistTypeImports) {
440
+ if (!isDistTypeImportListed(imp, name, dependencies, devDependencies, peerDependencies) && !isSatisfiedByTsScriptsVariant(imp, allDeps)) {
441
+ results.push({ imp, section: "dependencies" });
442
+ }
443
+ }
444
+ return results;
445
+ }
446
+ function getUnlistedDependencies({ name, location }, {
447
+ dependencies,
448
+ devDependencies,
449
+ peerDependencies
450
+ }, {
451
+ externalDistImports,
452
+ externalDistTypeImports,
453
+ distImportPaths
454
+ }) {
455
+ const unlisted = findUnlistedDependencies(name, dependencies, devDependencies, peerDependencies, externalDistImports, externalDistTypeImports);
456
+ for (const { imp } of unlisted) {
457
+ logMissing(name, imp, distImportPaths);
458
+ }
459
+ if (unlisted.length > 0) {
460
+ console.log(` ${chalk3.yellow(`${location}/package.json`)}
461
+ `);
462
+ }
463
+ return unlisted.length;
464
+ }
465
+ function fixUnlistedDependencies(workspace, {
466
+ dependencies,
467
+ devDependencies,
468
+ peerDependencies
469
+ }, { externalDistImports, externalDistTypeImports }) {
470
+ const unlisted = findUnlistedDependencies(workspace.name, dependencies, devDependencies, peerDependencies, externalDistImports, externalDistTypeImports);
471
+ if (unlisted.length === 0) return 0;
472
+ const pkg = readPackageJson(workspace.location);
473
+ const isTerminal = pkg.private === true;
474
+ for (const { imp, section } of unlisted) {
475
+ const version = resolveDepVersion(workspace.location, imp);
476
+ const isPeer = !isTerminal && section === "dependencies" && shouldBePeerDependency(imp, workspace.location, peerDependencies, externalDistImports);
477
+ if (isPeer) {
478
+ addDep(pkg, imp, version, "peerDependencies");
479
+ logFix(workspace, "added to peerDependencies", imp, version);
480
+ addDep(pkg, imp, version, "devDependencies");
481
+ logFix(workspace, "added to devDependencies", imp, version);
482
+ } else {
483
+ addDep(pkg, imp, version, section);
484
+ logFix(workspace, `added to ${section}`, imp, version);
485
+ }
486
+ }
487
+ writePackageJson(workspace.location, pkg);
488
+ return unlisted.length;
489
+ }
490
+
491
+ // src/actions/deplint/checkPackage/getUnlistedDevDependencies.ts
492
+ import { builtinModules as builtinModules2 } from "module";
493
+ import chalk4 from "chalk";
494
+ function findUnlistedDevDeps(name, dependencies, devDependencies, peerDependencies, externalAllImports, distImports, externalDistTypeImports) {
495
+ const results = [];
496
+ for (const imp of externalAllImports) {
497
+ if (!distImports.includes(imp) && !externalDistTypeImports.includes(imp) && imp !== name && !dependencies.includes(imp) && !dependencies.includes(`@types/${imp}`) && !peerDependencies.includes(imp) && !peerDependencies.includes(`@types/${imp}`) && !devDependencies.includes(imp) && !devDependencies.includes(`@types/${imp}`) && !builtinModules2.includes(imp) && !isSatisfiedByTsScriptsVariant(imp, [...dependencies, ...devDependencies, ...peerDependencies])) {
498
+ results.push(imp);
499
+ }
500
+ }
501
+ return results;
502
+ }
503
+ function getUnlistedDevDependencies({ name, location }, {
504
+ devDependencies,
505
+ dependencies,
506
+ peerDependencies
507
+ }, {
508
+ allImportPaths,
509
+ externalAllImports,
510
+ distImports,
511
+ externalDistTypeImports
512
+ }) {
513
+ const unlisted = findUnlistedDevDeps(name, dependencies, devDependencies, peerDependencies, externalAllImports, distImports, externalDistTypeImports);
514
+ for (const imp of unlisted) {
515
+ console.log(`[${chalk4.blue(name)}] Missing devDependency in package.json: ${chalk4.red(imp)}`);
516
+ if (allImportPaths[imp]) {
517
+ console.log(` ${allImportPaths[imp].join("\n ")}`);
518
+ }
519
+ }
520
+ if (unlisted.length > 0) {
521
+ console.log(` ${chalk4.yellow(`${location}/package.json`)}
522
+ `);
523
+ }
524
+ return unlisted.length;
525
+ }
526
+ function fixUnlistedDevDependencies(workspace, {
527
+ devDependencies,
528
+ dependencies,
529
+ peerDependencies
530
+ }, {
531
+ externalAllImports,
532
+ distImports,
533
+ externalDistTypeImports
534
+ }) {
535
+ const unlisted = findUnlistedDevDeps(workspace.name, dependencies, devDependencies, peerDependencies, externalAllImports, distImports, externalDistTypeImports);
536
+ if (unlisted.length === 0) return 0;
537
+ const pkg = readPackageJson(workspace.location);
538
+ for (const imp of unlisted) {
539
+ const version = resolveDepVersion(workspace.location, imp);
540
+ addDep(pkg, imp, version, "devDependencies");
541
+ logFix(workspace, "added to devDependencies", imp, version);
542
+ }
543
+ writePackageJson(workspace.location, pkg);
544
+ return unlisted.length;
545
+ }
546
+
547
+ // src/actions/deplint/checkPackage/getUnnecessaryPeerDependencies.ts
548
+ import fs10 from "fs";
549
+ import chalk6 from "chalk";
550
+
551
+ // src/actions/deplint/checkPackage/getUnsatisfiedPeerDependencies.ts
552
+ import fs9 from "fs";
553
+ import chalk5 from "chalk";
554
+ import semver2 from "semver";
555
+ import sortPackageJson2 from "sort-package-json";
556
+ function readDepPackageJson(location, dep) {
557
+ const depPkgPath = findDepPackageJson(location, dep);
558
+ if (!depPkgPath) return void 0;
559
+ try {
560
+ return JSON.parse(fs9.readFileSync(depPkgPath, "utf8"));
561
+ } catch {
562
+ return void 0;
563
+ }
564
+ }
565
+ function readPeerDeps(location, dep) {
566
+ const pkg = readDepPackageJson(location, dep);
567
+ if (!pkg) return [];
568
+ const peers = pkg.peerDependencies;
569
+ return Object.keys(peers ?? {});
570
+ }
571
+ function readPeerVersionRange(location, dep, peer) {
572
+ const pkg = readDepPackageJson(location, dep);
573
+ if (!pkg) return void 0;
574
+ const peers = pkg.peerDependencies;
575
+ return peers?.[peer];
576
+ }
577
+ function readInstalledVersion(location, dep) {
578
+ const pkg = readDepPackageJson(location, dep);
579
+ if (!pkg) return void 0;
580
+ return pkg.version;
581
+ }
582
+ function isPeerOptionalInAll(location, peer, sources) {
583
+ for (const source of sources) {
584
+ const pkg = readDepPackageJson(location, source.requiredBy);
585
+ if (!pkg) continue;
586
+ const meta = pkg.peerDependenciesMeta?.[peer];
587
+ if (!meta?.optional) return false;
588
+ }
589
+ return true;
590
+ }
591
+ var MAX_TRANSITIVE_DEPTH = 2;
592
+ function collectPeerSources(location, dependencies, devDependencies) {
593
+ const peerSources = /* @__PURE__ */ new Map();
594
+ const visited = /* @__PURE__ */ new Set();
595
+ function addPeerSource(peer, source) {
596
+ const sources = peerSources.get(peer) ?? [];
597
+ sources.push(source);
598
+ peerSources.set(peer, sources);
599
+ }
600
+ function collectFromDeps(deps, isRuntime, chain) {
601
+ for (const dep of deps) {
602
+ const visitKey = `${dep}:${chain.join(">")}`;
603
+ if (visited.has(visitKey)) continue;
604
+ visited.add(visitKey);
605
+ for (const peer of readPeerDeps(location, dep)) {
606
+ addPeerSource(peer, {
607
+ chain: chain.length > 0 ? [...chain, dep] : void 0,
608
+ isRuntimeDep: isRuntime,
609
+ requiredBy: dep
610
+ });
611
+ }
612
+ if (chain.length < MAX_TRANSITIVE_DEPTH) {
613
+ const depPkg = readDepPackageJson(location, dep);
614
+ if (depPkg) {
615
+ const transitiveDeps = Object.keys(depPkg.dependencies ?? {});
616
+ collectFromDeps(transitiveDeps, isRuntime, [...chain, dep]);
617
+ }
618
+ }
619
+ }
620
+ }
621
+ collectFromDeps(dependencies, true, []);
622
+ const devOnly = devDependencies.filter((d) => !dependencies.includes(d));
623
+ collectFromDeps(devOnly, false, []);
624
+ return peerSources;
625
+ }
626
+ function formatChain(sources) {
627
+ const chainsWithDepth = sources.filter((s) => s.chain && s.chain.length > 0);
628
+ if (chainsWithDepth.length === 0) return "";
629
+ const first = chainsWithDepth[0];
630
+ return ` (via ${chalk5.dim(first.chain.join(" \u2192 "))})`;
631
+ }
632
+ function getRequiredTransitivePeers(location, { dependencies, devDependencies }) {
633
+ const peerSources = collectPeerSources(location, dependencies, devDependencies);
634
+ return new Set(peerSources.keys());
635
+ }
636
+ function logUnsatisfiedPeer(name, unsatisfied) {
637
+ const {
638
+ peer,
639
+ sources,
640
+ reason,
641
+ hasRuntimeSource,
642
+ installedVersion,
643
+ versionRange
644
+ } = unsatisfied;
645
+ const chainInfo = formatChain(sources);
646
+ if (reason === "version-mismatch") {
647
+ const requiredByList = sources.map((s) => s.requiredBy);
648
+ console.log(
649
+ `[${chalk5.blue(name)}] Peer dependency version mismatch ${chalk5.red(peer)} \u2014 installed ${chalk5.yellow(installedVersion ?? "unknown")} does not satisfy ${chalk5.cyan(versionRange)} (required by ${chalk5.cyan(requiredByList.join(", "))})` + chainInfo
650
+ );
651
+ } else if (hasRuntimeSource) {
652
+ const requiredByList = sources.filter((s) => s.isRuntimeDep).map((s) => s.requiredBy);
653
+ console.log(
654
+ `[${chalk5.blue(name)}] Unsatisfied peer dependency ${chalk5.red(peer)} (required by ${chalk5.cyan(requiredByList.join(", "))})` + chainInfo + " \u2014 must be in dependencies or peerDependencies"
655
+ );
656
+ } else {
657
+ const requiredByList = sources.map((s) => s.requiredBy);
658
+ console.log(
659
+ `[${chalk5.blue(name)}] Unsatisfied peer dependency ${chalk5.red(peer)} (required by devDependency ${chalk5.cyan(requiredByList.join(", "))})` + chainInfo + " \u2014 must be in dependencies, devDependencies, or peerDependencies"
660
+ );
661
+ }
662
+ }
663
+ function resolveVersionRange(location, sources, peer) {
664
+ for (const source of sources) {
665
+ const range = readPeerVersionRange(location, source.requiredBy, peer);
666
+ if (range) return range;
667
+ }
668
+ return "*";
669
+ }
670
+ function checkVersionSatisfaction(location, peer, requestedRange) {
671
+ const installedVersion = readInstalledVersion(location, peer);
672
+ if (!installedVersion) return { satisfied: true };
673
+ if (requestedRange === "*") return { installedVersion, satisfied: true };
674
+ if (requestedRange.startsWith("workspace:")) return { installedVersion, satisfied: true };
675
+ try {
676
+ const satisfied = semver2.satisfies(installedVersion, requestedRange, { includePrerelease: true });
677
+ return { installedVersion, satisfied };
678
+ } catch {
679
+ return { installedVersion, satisfied: true };
680
+ }
681
+ }
682
+ function findDeclaredPeerVersionMismatches(name, location, peerDependencies, peerDependencyVersions, exclude) {
683
+ const results = [];
684
+ for (const peer of peerDependencies) {
685
+ if (exclude?.has(peer) || peer === name) continue;
686
+ const declaredRange = peerDependencyVersions[peer];
687
+ if (!declaredRange || declaredRange === "*") continue;
688
+ const { installedVersion, satisfied } = checkVersionSatisfaction(location, peer, declaredRange);
689
+ if (!satisfied) {
690
+ results.push({
691
+ hasRuntimeSource: true,
692
+ installedVersion,
693
+ peer,
694
+ reason: "version-mismatch",
695
+ sources: [{ isRuntimeDep: true, requiredBy: name }],
696
+ versionRange: declaredRange
697
+ });
698
+ }
699
+ }
700
+ return results;
701
+ }
702
+ function findUnsatisfiedPeers({ name, location }, {
703
+ dependencies,
704
+ devDependencies,
705
+ peerDependencies,
706
+ peerDependencyVersions
707
+ }, exclude) {
708
+ const peerSources = collectPeerSources(location, dependencies, devDependencies);
709
+ const depsSet = new Set(dependencies);
710
+ const devDepsSet = new Set(devDependencies);
711
+ const unsatisfied = [];
712
+ for (const [peer, sources] of peerSources) {
713
+ if (exclude?.has(peer) || peer === name) continue;
714
+ if (isPeerOptionalInAll(location, peer, sources)) continue;
715
+ const hasRuntimeSource = sources.some((s) => s.isRuntimeDep);
716
+ const isPresent = depsSet.has(peer) || devDepsSet.has(peer);
717
+ if (!isPresent) {
718
+ const versionRange2 = resolveVersionRange(location, sources, peer);
719
+ unsatisfied.push({
720
+ hasRuntimeSource,
721
+ peer,
722
+ reason: "missing",
723
+ sources,
724
+ versionRange: versionRange2
725
+ });
726
+ continue;
727
+ }
728
+ const versionRange = resolveVersionRange(location, sources, peer);
729
+ const { installedVersion, satisfied } = checkVersionSatisfaction(location, peer, versionRange);
730
+ if (!satisfied) {
731
+ unsatisfied.push({
732
+ hasRuntimeSource,
733
+ installedVersion,
734
+ peer,
735
+ reason: "version-mismatch",
736
+ sources,
737
+ versionRange
738
+ });
739
+ }
740
+ }
741
+ return [
742
+ ...unsatisfied,
743
+ ...findDeclaredPeerVersionMismatches(name, location, peerDependencies, peerDependencyVersions, exclude)
744
+ ];
745
+ }
746
+ function getUnsatisfiedPeerDependencies(workspace, packageParams, exclude) {
747
+ const unsatisfied = findUnsatisfiedPeers(workspace, packageParams, exclude);
748
+ for (const entry of unsatisfied) {
749
+ logUnsatisfiedPeer(workspace.name, entry);
750
+ }
751
+ if (unsatisfied.length > 0) {
752
+ console.log(` ${chalk5.yellow(`${workspace.location}/package.json`)}
753
+ `);
754
+ }
755
+ return {
756
+ count: unsatisfied.length,
757
+ unsatisfiedPeers: new Set(unsatisfied.map((u) => u.peer))
758
+ };
759
+ }
760
+ function isTerminalPackage(packageJsonPath) {
761
+ try {
762
+ const pkg = JSON.parse(fs9.readFileSync(packageJsonPath, "utf8"));
763
+ return pkg.private === true;
764
+ } catch {
765
+ return false;
766
+ }
767
+ }
768
+ function fixVersionMismatch(workspaceName, entry, pkg) {
769
+ const {
770
+ installedVersion,
771
+ peer,
772
+ versionRange
773
+ } = entry;
774
+ if (!installedVersion) {
775
+ logUnsatisfiedPeer(workspaceName, entry);
776
+ console.log(
777
+ ` ${chalk5.dim("(version mismatch \u2014 could not resolve installed version)")}`
778
+ );
779
+ return false;
780
+ }
781
+ const match = /^(\d+)\.(\d+)/.exec(installedVersion);
782
+ if (!match) {
783
+ logUnsatisfiedPeer(workspaceName, entry);
784
+ console.log(
785
+ ` ${chalk5.dim("(version mismatch \u2014 could not resolve installed version)")}`
786
+ );
787
+ return false;
788
+ }
789
+ const expectedVersion = versionRange.startsWith("^") ? `^${match[1]}` : `~${match[1]}.${match[2]}`;
790
+ if (pkg.peerDependencies?.[peer]) {
791
+ pkg.peerDependencies[peer] = expectedVersion;
792
+ }
793
+ if (pkg.devDependencies?.[peer] && !pkg.devDependencies[peer].startsWith("workspace:")) {
794
+ pkg.devDependencies[peer] = expectedVersion;
795
+ }
796
+ console.log(
797
+ `[${chalk5.blue(workspaceName)}] Fixed: updated ${chalk5.green(peer)} version to ${chalk5.cyan(expectedVersion)} (was ${chalk5.yellow(versionRange)})`
798
+ );
799
+ return true;
800
+ }
801
+ function fixUnsatisfiedPeerDependencies(workspace, packageParams, exclude) {
802
+ const unsatisfied = findUnsatisfiedPeers(workspace, packageParams, exclude);
803
+ if (unsatisfied.length === 0) return { addedPeers: /* @__PURE__ */ new Set(), count: 0 };
804
+ const packageJsonPath = `${workspace.location}/package.json`;
805
+ const pkg = JSON.parse(fs9.readFileSync(packageJsonPath, "utf8"));
806
+ const isTerminal = isTerminalPackage(packageJsonPath);
807
+ const addedPeers = /* @__PURE__ */ new Set();
808
+ let fixedCount = 0;
809
+ for (const entry of unsatisfied) {
810
+ const {
811
+ hasRuntimeSource,
812
+ peer,
813
+ reason,
814
+ sources,
815
+ versionRange
816
+ } = entry;
817
+ if (reason === "version-mismatch") {
818
+ if (fixVersionMismatch(workspace.name, entry, pkg)) fixedCount++;
819
+ continue;
820
+ }
821
+ const sections = resolvePeerTargetSections(hasRuntimeSource, isTerminal);
822
+ for (const section of sections) {
823
+ pkg[section] = pkg[section] ?? {};
824
+ pkg[section][peer] = versionRange;
825
+ }
826
+ addedPeers.add(peer);
827
+ const requiredByList = sources.map((s) => s.requiredBy).join(", ");
828
+ console.log(
829
+ `[${chalk5.blue(workspace.name)}] Fixed: added ${chalk5.green(peer)}@${versionRange} to ${chalk5.cyan(sections.join(" + "))} (required by ${requiredByList})`
830
+ );
831
+ fixedCount++;
832
+ }
833
+ if (fixedCount > 0) {
834
+ const sorted = sortPackageJson2(JSON.stringify(pkg, null, 2));
835
+ fs9.writeFileSync(packageJsonPath, `${sorted}
836
+ `);
837
+ }
838
+ return { addedPeers, count: unsatisfied.length };
839
+ }
840
+ function resolvePeerTargetSections(hasRuntimeSource, isTerminal) {
841
+ if (!hasRuntimeSource) return ["devDependencies"];
842
+ if (isTerminal) return ["dependencies"];
843
+ return ["peerDependencies", "devDependencies"];
844
+ }
845
+
846
+ // src/actions/deplint/checkPackage/getUnnecessaryPeerDependencies.ts
847
+ function isPeerImportedInDist(dep, externalDistImports, externalDistTypeImports) {
848
+ const baseName = dep.replace(/^@types\//, "");
849
+ return externalDistImports.includes(dep) || externalDistImports.includes(baseName) || externalDistTypeImports.includes(dep) || externalDistTypeImports.includes(baseName);
850
+ }
851
+ function findUnrequestedPeerDeps(location, packageParams, { externalDistImports, externalDistTypeImports }, exclude) {
852
+ const requiredPeers = getRequiredTransitivePeers(location, packageParams);
853
+ const unrequested = [];
854
+ for (const dep of packageParams.peerDependencies) {
855
+ if (exclude?.has(dep)) continue;
856
+ if (packageParams.dependencies.includes(dep)) continue;
857
+ if (!isPeerImportedInDist(dep, externalDistImports, externalDistTypeImports)) continue;
858
+ if (!requiredPeers.has(dep)) {
859
+ unrequested.push(dep);
860
+ }
861
+ }
862
+ return unrequested;
863
+ }
864
+ function getUnrequestedPeerDependencies({ name, location }, packageParams, sourceParams, exclude) {
865
+ if (!isTerminalPackage2(location)) return 0;
866
+ const unrequested = findUnrequestedPeerDeps(location, packageParams, sourceParams, exclude);
867
+ for (const dep of unrequested) {
868
+ console.log(
869
+ `[${chalk6.blue(name)}] Unnecessary peerDependency ${chalk6.red(dep)} \u2014 imported in dist but no dependency requires it as a peer; should be a dependency`
870
+ );
871
+ }
872
+ if (unrequested.length > 0) {
873
+ console.log(` ${chalk6.yellow(`${location}/package.json`)}
874
+ `);
875
+ }
876
+ return unrequested.length;
877
+ }
878
+ function isTerminalPackage2(location) {
879
+ try {
880
+ const pkg = JSON.parse(fs10.readFileSync(`${location}/package.json`, "utf8"));
881
+ return pkg.private === true;
882
+ } catch {
883
+ return false;
884
+ }
885
+ }
886
+ function fixUnrequestedPeerDependencies(workspace, packageParams, sourceParams, exclude) {
887
+ const unrequested = findUnrequestedPeerDeps(workspace.location, packageParams, sourceParams, exclude);
888
+ if (unrequested.length === 0) return 0;
889
+ const isTerminal = isTerminalPackage2(workspace.location);
890
+ const tsconfigExtendsSet = new Set(sourceParams.tsconfigExtends);
891
+ const fixable = isTerminal ? unrequested : unrequested.filter((dep) => tsconfigExtendsSet.has(dep));
892
+ if (fixable.length === 0) return 0;
893
+ const pkg = readPackageJson(workspace.location);
894
+ for (const dep of fixable) {
895
+ const version = packageParams.peerDependencyVersions[dep] ?? "*";
896
+ removeDep(pkg, dep, "peerDependencies");
897
+ pkg.dependencies = pkg.dependencies ?? {};
898
+ pkg.dependencies[dep] = version;
899
+ logFix(workspace, "moved from peerDependencies to dependencies", dep);
900
+ }
901
+ writePackageJson(workspace.location, pkg);
902
+ return fixable.length;
903
+ }
904
+ function findRedundantPeerDeps({ peerDependencies, dependencies }, exclude) {
905
+ const depsSet = new Set(dependencies);
906
+ const redundant = [];
907
+ for (const dep of peerDependencies) {
908
+ if (exclude?.has(dep)) continue;
909
+ if (depsSet.has(dep)) {
910
+ redundant.push(dep);
911
+ }
912
+ }
913
+ return redundant;
914
+ }
915
+ function getRedundantPeerDependencies({ name, location }, packageParams, exclude) {
916
+ const redundant = findRedundantPeerDeps(packageParams, exclude);
917
+ for (const dep of redundant) {
918
+ console.log(
919
+ `[${chalk6.blue(name)}] Redundant peerDependency ${chalk6.red(dep)} \u2014 already listed in dependencies`
920
+ );
921
+ }
922
+ if (redundant.length > 0) {
923
+ console.log(` ${chalk6.yellow(`${location}/package.json`)}
924
+ `);
925
+ }
926
+ return redundant.length;
927
+ }
928
+ function fixRedundantPeerDependencies(workspace, packageParams, exclude) {
929
+ const redundant = findRedundantPeerDeps(packageParams, exclude);
930
+ if (redundant.length === 0) return 0;
931
+ const pkg = readPackageJson(workspace.location);
932
+ for (const dep of redundant) {
933
+ removeDep(pkg, dep, "peerDependencies");
934
+ logFix(workspace, "removed redundant peerDependency (kept in dependencies)", dep);
935
+ }
936
+ writePackageJson(workspace.location, pkg);
937
+ return redundant.length;
938
+ }
939
+
940
+ // src/actions/deplint/checkPackage/getUnusedDependencies.ts
941
+ import chalk7 from "chalk";
942
+ function isDepImported(dep, distImports, distTypeImports) {
943
+ const baseName = dep.replace(/^@types\//, "");
944
+ return distImports.includes(dep) || distImports.includes(baseName) || distTypeImports.includes(dep) || distTypeImports.includes(baseName);
945
+ }
946
+ function findUnusedDependencies(location, dependencies, devDependencies, externalDistImports, externalDistTypeImports, externalAllImports, exclude) {
947
+ const runtimeRequiredPeers = getRequiredPeerDependencies(location, dependencies);
948
+ const devRequiredPeers = getRequiredPeerDependencies(location, devDependencies);
949
+ const results = [];
950
+ for (const dep of dependencies) {
951
+ if (exclude?.has(dep)) continue;
952
+ if (runtimeRequiredPeers.has(dep)) continue;
953
+ const isImported = isDepImported(dep, externalDistImports, externalDistTypeImports);
954
+ if (isImported || isUsedViaTsScriptsVariant(dep, [...externalDistImports, ...externalDistTypeImports])) continue;
955
+ if (devRequiredPeers.has(dep)) {
956
+ results.push({
957
+ dep,
958
+ kind: "move-to-dev",
959
+ reason: "only needed as peer of devDependencies"
960
+ });
961
+ } else if (externalAllImports.includes(dep)) {
962
+ results.push({ dep, kind: "move-to-dev" });
963
+ } else {
964
+ results.push({ dep, kind: "remove" });
965
+ }
966
+ }
967
+ return results;
968
+ }
969
+ function getUnusedDependencies({ name, location }, { dependencies, devDependencies }, {
970
+ externalDistImports,
971
+ externalDistTypeImports,
972
+ externalAllImports
973
+ }, exclude) {
974
+ const unused = findUnusedDependencies(location, dependencies, devDependencies, externalDistImports, externalDistTypeImports, externalAllImports, exclude);
975
+ for (const {
976
+ dep,
977
+ kind,
978
+ reason
979
+ } of unused) {
980
+ const reasonStr = reason ? ` (${reason})` : "";
981
+ if (kind === "move-to-dev") {
982
+ console.log(`[${chalk7.blue(name)}] dependency should be devDependency in package.json: ${chalk7.red(dep)}${reasonStr}`);
983
+ } else {
984
+ console.log(`[${chalk7.blue(name)}] Unused dependency in package.json: ${chalk7.red(dep)}`);
985
+ }
986
+ }
987
+ if (unused.length > 0) {
988
+ console.log(` ${chalk7.yellow(`${location}/package.json`)}
989
+ `);
990
+ }
991
+ return unused.length;
992
+ }
993
+ function fixUnusedDependencies(workspace, { dependencies, devDependencies }, {
994
+ externalDistImports,
995
+ externalDistTypeImports,
996
+ externalAllImports
997
+ }, exclude) {
998
+ const unused = findUnusedDependencies(workspace.location, dependencies, devDependencies, externalDistImports, externalDistTypeImports, externalAllImports, exclude);
999
+ if (unused.length === 0) return 0;
1000
+ const pkg = readPackageJson(workspace.location);
1001
+ for (const { dep, kind } of unused) {
1002
+ if (kind === "move-to-dev") {
1003
+ moveDep(pkg, dep, "dependencies", "devDependencies");
1004
+ logFix(workspace, "moved to devDependencies", dep);
1005
+ } else {
1006
+ removeDep(pkg, dep, "dependencies");
1007
+ logFix(workspace, "removed from dependencies", dep);
1008
+ }
1009
+ }
1010
+ writePackageJson(workspace.location, pkg);
1011
+ return unused.length;
1012
+ }
1013
+
1014
+ // src/actions/deplint/checkPackage/getUnusedDevDependencies.ts
1015
+ import chalk8 from "chalk";
1016
+
1017
+ // src/actions/deplint/getCliReferencedPackagesFromFiles.ts
1018
+ import fs12 from "fs";
1019
+ import path5 from "path";
1020
+ import ts2 from "typescript";
1021
+
1022
+ // src/actions/deplint/getScriptReferencedPackages.ts
1023
+ import fs11 from "fs";
1024
+ import path4 from "path";
1025
+ function getBinNames(location, dep) {
1026
+ const depPkgPath = findDepPackageJson(location, dep);
1027
+ if (!depPkgPath) return [];
1028
+ try {
1029
+ const raw = fs11.readFileSync(depPkgPath, "utf8");
1030
+ const pkg = JSON.parse(raw);
1031
+ if (!pkg.bin) return [];
1032
+ if (typeof pkg.bin === "string") return [pkg.name?.split("/").pop() ?? dep];
1033
+ return Object.keys(pkg.bin);
1034
+ } catch {
1035
+ return [];
1036
+ }
1037
+ }
1038
+ function tokenizeScript(script) {
1039
+ return script.split(/[&|;$()"`\s]+/).map((t) => t.trim()).filter(Boolean);
1040
+ }
1041
+ function getScriptReferencedPackages(location, allDeps) {
1042
+ const pkgPath = path4.join(location, "package.json");
1043
+ let scripts;
1044
+ try {
1045
+ const raw = fs11.readFileSync(pkgPath, "utf8");
1046
+ const pkg = JSON.parse(raw);
1047
+ scripts = pkg.scripts ?? {};
1048
+ } catch {
1049
+ return /* @__PURE__ */ new Set();
1050
+ }
1051
+ const scriptText = Object.values(scripts).join(" ");
1052
+ const tokens = new Set(tokenizeScript(scriptText));
1053
+ const binToPackage = /* @__PURE__ */ new Map();
1054
+ for (const dep of allDeps) {
1055
+ const bins = getBinNames(location, dep);
1056
+ for (const bin of bins) {
1057
+ binToPackage.set(bin, dep);
1058
+ }
1059
+ }
1060
+ const referenced = /* @__PURE__ */ new Set();
1061
+ for (const token of tokens) {
1062
+ const baseName = getBasePackageName(token);
1063
+ if (allDeps.includes(baseName)) {
1064
+ referenced.add(baseName);
1065
+ }
1066
+ const pkg = binToPackage.get(token);
1067
+ if (pkg) {
1068
+ referenced.add(pkg);
1069
+ }
1070
+ }
1071
+ return referenced;
1072
+ }
1073
+
1074
+ // src/actions/deplint/getCliReferencedPackagesFromFiles.ts
1075
+ var shellCommandFunctions = /* @__PURE__ */ new Set(["execSync", "exec"]);
1076
+ var directExecFunctions = /* @__PURE__ */ new Set(["spawn", "spawnSync", "execFile", "execFileSync"]);
1077
+ var allExecFunctions = /* @__PURE__ */ new Set([...shellCommandFunctions, ...directExecFunctions]);
1078
+ function getCommandTokensFromFile(filePath) {
1079
+ const tokens = /* @__PURE__ */ new Set();
1080
+ let sourceCode;
1081
+ try {
1082
+ sourceCode = fs12.readFileSync(filePath, "utf8");
1083
+ } catch {
1084
+ return tokens;
1085
+ }
1086
+ const isMjsFile = filePath.endsWith(".mjs");
1087
+ const sourceFile = ts2.createSourceFile(
1088
+ path5.basename(filePath),
1089
+ sourceCode,
1090
+ ts2.ScriptTarget.Latest,
1091
+ true,
1092
+ isMjsFile ? ts2.ScriptKind.JS : void 0
1093
+ );
1094
+ function visit(node) {
1095
+ if (ts2.isCallExpression(node) && node.arguments.length > 0) {
1096
+ const fnName = getFunctionName(node.expression);
1097
+ if (fnName && allExecFunctions.has(fnName)) {
1098
+ const firstArg = node.arguments[0];
1099
+ if (ts2.isStringLiteral(firstArg) || ts2.isNoSubstitutionTemplateLiteral(firstArg)) {
1100
+ const value = firstArg.text;
1101
+ if (shellCommandFunctions.has(fnName)) {
1102
+ for (const token of tokenizeScript(value)) {
1103
+ tokens.add(token);
1104
+ }
1105
+ } else {
1106
+ tokens.add(value);
1107
+ }
1108
+ } else if (ts2.isTemplateExpression(firstArg)) {
1109
+ const head = firstArg.head.text;
1110
+ if (head) {
1111
+ for (const token of tokenizeScript(head)) {
1112
+ tokens.add(token);
1113
+ }
1114
+ }
1115
+ }
1116
+ }
1117
+ }
1118
+ ts2.forEachChild(node, visit);
1119
+ }
1120
+ visit(sourceFile);
1121
+ return tokens;
1122
+ }
1123
+ function getFunctionName(expr) {
1124
+ if (ts2.isIdentifier(expr)) {
1125
+ return expr.text;
1126
+ }
1127
+ if (ts2.isPropertyAccessExpression(expr) && ts2.isIdentifier(expr.name)) {
1128
+ return expr.name.text;
1129
+ }
1130
+ return void 0;
1131
+ }
1132
+ function getCliReferencedPackagesFromFiles(allFiles, location, allDeps) {
1133
+ const allTokens = /* @__PURE__ */ new Set();
1134
+ for (const file of allFiles) {
1135
+ for (const token of getCommandTokensFromFile(file)) {
1136
+ allTokens.add(token);
1137
+ }
1138
+ }
1139
+ if (allTokens.size === 0) return /* @__PURE__ */ new Set();
1140
+ const binToPackage = /* @__PURE__ */ new Map();
1141
+ for (const dep of allDeps) {
1142
+ for (const bin of getBinNames(location, dep)) {
1143
+ binToPackage.set(bin, dep);
1144
+ }
1145
+ }
1146
+ const referenced = /* @__PURE__ */ new Set();
1147
+ for (const token of allTokens) {
1148
+ const baseName = getBasePackageName(token);
1149
+ if (allDeps.includes(baseName)) {
1150
+ referenced.add(baseName);
1151
+ }
1152
+ const pkg = binToPackage.get(token);
1153
+ if (pkg) {
1154
+ referenced.add(pkg);
1155
+ }
1156
+ }
1157
+ return referenced;
1158
+ }
1159
+
1160
+ // src/actions/deplint/implicitDevDependencies.ts
1161
+ import fs13 from "fs";
1162
+
1163
+ // src/pm/detectPackageManager.ts
1164
+ import { existsSync } from "fs";
1165
+ function detectPackageManager() {
1166
+ if (existsSync("pnpm-lock.yaml") || existsSync("pnpm-workspace.yaml")) return "pnpm";
1167
+ return "yarn";
1168
+ }
1169
+
1170
+ // src/actions/deplint/implicitDevDependencies.ts
1171
+ var hasFileWithExtension = (files, extensions) => files.some((f) => extensions.some((ext) => f.endsWith(ext)));
1172
+ var tsExtensions = [".ts", ".tsx", ".mts", ".cts"];
1173
+ var hasTypescriptFiles = ({ allFiles }) => hasFileWithExtension(allFiles, tsExtensions);
1174
+ var decoratorPattern = /^\s*@[a-zA-Z]\w*/m;
1175
+ var hasDecorators = ({ allFiles }) => allFiles.filter((f) => tsExtensions.some((ext) => f.endsWith(ext))).some((file) => {
1176
+ try {
1177
+ const content = fs13.readFileSync(file, "utf8");
1178
+ return decoratorPattern.test(content);
1179
+ } catch {
1180
+ return false;
1181
+ }
1182
+ });
1183
+ var hasDependencyRequiringTslib = ({ location, allDependencies }) => allDependencies.some((dep) => {
1184
+ const pkgPath = findDepPackageJson(location, dep);
1185
+ if (!pkgPath) return false;
1186
+ try {
1187
+ const pkg = JSON.parse(fs13.readFileSync(pkgPath, "utf8"));
1188
+ const peers = pkg.peerDependencies;
1189
+ return peers !== void 0 && "tslib" in peers;
1190
+ } catch {
1191
+ return false;
1192
+ }
1193
+ });
1194
+ var importPlugins = /* @__PURE__ */ new Set(["eslint-plugin-import-x", "eslint-plugin-import"]);
1195
+ function hasImportPlugin({ location, allDependencies }) {
1196
+ if (allDependencies.some((d) => importPlugins.has(d))) return true;
1197
+ for (const dep of allDependencies) {
1198
+ const pkgPath = findDepPackageJson(location, dep);
1199
+ if (!pkgPath) continue;
1200
+ try {
1201
+ const pkg = JSON.parse(fs13.readFileSync(pkgPath, "utf8"));
1202
+ const transitiveDeps = [
1203
+ ...Object.keys(pkg.dependencies ?? {}),
1204
+ ...Object.keys(pkg.peerDependencies ?? {})
1205
+ ];
1206
+ if (transitiveDeps.some((d) => importPlugins.has(d))) return true;
1207
+ } catch {
1208
+ }
1209
+ }
1210
+ return false;
1211
+ }
1212
+ var hasVitest = ({ allDependencies }) => allDependencies.includes("vitest");
1213
+ var isYarnRepo = () => detectPackageManager() === "yarn";
1214
+ var isPnpmRepo = () => detectPackageManager() === "pnpm";
1215
+ var rules = [
1216
+ {
1217
+ package: "typescript",
1218
+ isNeeded: hasTypescriptFiles
1219
+ },
1220
+ {
1221
+ package: "eslint-import-resolver-typescript",
1222
+ isNeeded: (context) => hasTypescriptFiles(context) && context.allDependencies.includes("eslint") && hasImportPlugin(context)
1223
+ },
1224
+ {
1225
+ package: "tslib",
1226
+ isNeeded: (context) => hasDecorators(context) || hasDependencyRequiringTslib(context)
1227
+ },
1228
+ {
1229
+ package: "@vitest/coverage-v8",
1230
+ isNeeded: hasVitest
1231
+ },
1232
+ {
1233
+ package: "@xylabs/ts-scripts-yarn3",
1234
+ isNeeded: isYarnRepo
1235
+ },
1236
+ {
1237
+ package: "@xylabs/ts-scripts-react-yarn3",
1238
+ isNeeded: isYarnRepo
1239
+ },
1240
+ {
1241
+ package: "@xylabs/ts-scripts-pnpm",
1242
+ isNeeded: isPnpmRepo
1243
+ },
1244
+ {
1245
+ package: "@xylabs/ts-scripts-react-pnpm",
1246
+ isNeeded: isPnpmRepo
1247
+ }
1248
+ ];
1249
+ function getImplicitDevDependencies(context) {
1250
+ const implicit = /* @__PURE__ */ new Set();
1251
+ for (const rule of rules) {
1252
+ if (rule.isNeeded(context)) {
1253
+ implicit.add(rule.package);
1254
+ }
1255
+ }
1256
+ return implicit;
1257
+ }
1258
+
1259
+ // src/actions/deplint/checkPackage/getUnusedDevDependencies.ts
1260
+ var allExternalImports = ({
1261
+ externalAllImports,
1262
+ externalDistImports,
1263
+ externalDistTypeImports
1264
+ }) => {
1265
+ return /* @__PURE__ */ new Set([
1266
+ ...externalAllImports,
1267
+ ...externalDistImports,
1268
+ ...externalDistTypeImports
1269
+ ]);
1270
+ };
1271
+ function isDevDepUsed(dep, allImports, implicitDeps, requiredPeers, scriptRefs, cliRefs) {
1272
+ if (implicitDeps.has(dep)) return true;
1273
+ if (requiredPeers.has(dep)) return true;
1274
+ if (scriptRefs.has(dep)) return true;
1275
+ if (cliRefs.has(dep)) return true;
1276
+ if (dep.startsWith("@types/")) {
1277
+ const baseName = dep.replace(/^@types\//, "");
1278
+ return allImports.has(baseName) || allImports.has(dep) || implicitDeps.has(baseName);
1279
+ }
1280
+ if (allImports.has(dep)) return true;
1281
+ return isUsedViaTsScriptsVariant(dep, [...allImports]);
1282
+ }
1283
+ function findUnusedDevDeps(location, dependencies, devDependencies, peerDependencies, sourceParams, fileContext, exclude) {
1284
+ const allImports = allExternalImports(sourceParams);
1285
+ const allDeps = [...dependencies, ...devDependencies, ...peerDependencies];
1286
+ const implicitDeps = getImplicitDevDependencies({
1287
+ ...fileContext,
1288
+ allDependencies: allDeps,
1289
+ location
1290
+ });
1291
+ const requiredPeers = getRequiredPeerDependencies(location, allDeps);
1292
+ const scriptRefs = getScriptReferencedPackages(location, allDeps);
1293
+ const cliRefs = getCliReferencedPackagesFromFiles(fileContext.allFiles, location, allDeps);
1294
+ const unused = [];
1295
+ for (const dep of devDependencies) {
1296
+ if (exclude?.has(dep)) continue;
1297
+ if (dependencies.includes(dep) || peerDependencies.includes(dep)) continue;
1298
+ if (!isDevDepUsed(dep, allImports, implicitDeps, requiredPeers, scriptRefs, cliRefs)) {
1299
+ unused.push(dep);
1300
+ }
1301
+ }
1302
+ return unused;
1303
+ }
1304
+ function getUnusedDevDependencies({ name, location }, {
1305
+ devDependencies,
1306
+ dependencies,
1307
+ peerDependencies
1308
+ }, sourceParams, fileContext, exclude) {
1309
+ const unused = findUnusedDevDeps(location, dependencies, devDependencies, peerDependencies, sourceParams, fileContext, exclude);
1310
+ for (const dep of unused) {
1311
+ console.log(`[${chalk8.blue(name)}] Unused devDependency in package.json: ${chalk8.red(dep)}`);
1312
+ }
1313
+ if (unused.length > 0) {
1314
+ console.log(` ${chalk8.yellow(`${location}/package.json`)}
1315
+ `);
1316
+ }
1317
+ return unused.length;
1318
+ }
1319
+ function fixUnusedDevDependencies(workspace, {
1320
+ devDependencies,
1321
+ dependencies,
1322
+ peerDependencies
1323
+ }, sourceParams, fileContext, exclude) {
1324
+ const unused = findUnusedDevDeps(workspace.location, dependencies, devDependencies, peerDependencies, sourceParams, fileContext, exclude);
1325
+ if (unused.length === 0) return 0;
1326
+ const pkg = readPackageJson(workspace.location);
1327
+ for (const dep of unused) {
1328
+ removeDep(pkg, dep, "devDependencies");
1329
+ logFix(workspace, "removed from devDependencies", dep);
1330
+ }
1331
+ writePackageJson(workspace.location, pkg);
1332
+ return unused.length;
1333
+ }
1334
+
1335
+ // src/actions/deplint/checkPackage/getUnusedPeerDependencies.ts
1336
+ import chalk9 from "chalk";
1337
+ function isPeerUsed(dep, externalDistImports, externalDistTypeImports) {
1338
+ const baseName = dep.replace(/^@types\//, "");
1339
+ return externalDistImports.includes(dep) || externalDistImports.includes(baseName) || externalDistTypeImports.includes(dep) || externalDistTypeImports.includes(baseName);
1340
+ }
1341
+ function findUnusedPeerDeps(peerDependencies, externalDistImports, externalDistTypeImports, exclude) {
1342
+ const unused = [];
1343
+ for (const dep of peerDependencies) {
1344
+ if (exclude?.has(dep)) continue;
1345
+ if (!isPeerUsed(dep, externalDistImports, externalDistTypeImports)) {
1346
+ unused.push(dep);
1347
+ }
1348
+ }
1349
+ return unused;
1350
+ }
1351
+ function getUnusedPeerDependencies({ name, location }, { peerDependencies, dependencies }, { externalDistImports, externalDistTypeImports }, exclude) {
1352
+ const unused = findUnusedPeerDeps(peerDependencies, externalDistImports, externalDistTypeImports, exclude);
1353
+ for (const dep of unused) {
1354
+ if (dependencies.includes(dep)) {
1355
+ console.log(`[${chalk9.blue(name)}] Unused peerDependency [already a dependency] in package.json: ${chalk9.red(dep)}`);
1356
+ } else {
1357
+ console.log(`[${chalk9.blue(name)}] Unused peerDependency in package.json: ${chalk9.red(dep)}`);
1358
+ }
1359
+ }
1360
+ if (unused.length > 0) {
1361
+ console.log(` ${chalk9.yellow(`${location}/package.json`)}
1362
+ `);
1363
+ }
1364
+ return unused.length;
1365
+ }
1366
+ function fixUnusedPeerDependencies(workspace, { peerDependencies }, { externalDistImports, externalDistTypeImports }, exclude) {
1367
+ const unused = findUnusedPeerDeps(peerDependencies, externalDistImports, externalDistTypeImports, exclude);
1368
+ if (unused.length === 0) return 0;
1369
+ const pkg = readPackageJson(workspace.location);
1370
+ for (const dep of unused) {
1371
+ removeDep(pkg, dep, "peerDependencies");
1372
+ logFix(workspace, "removed from peerDependencies", dep);
1373
+ }
1374
+ writePackageJson(workspace.location, pkg);
1375
+ return unused.length;
1376
+ }
1377
+
1378
+ // src/actions/deplint/checkPackage/getWorkspaceVersionProblems.ts
1379
+ import chalk10 from "chalk";
1380
+ import semver3 from "semver";
1381
+ function checkSection(deps, versions, section, workspaceNames, problems) {
1382
+ for (const dep of deps) {
1383
+ if (!workspaceNames.has(dep)) continue;
1384
+ const version = versions[dep];
1385
+ if (version && !version.startsWith("workspace:")) {
1386
+ problems.push({
1387
+ dep,
1388
+ section,
1389
+ version
1390
+ });
1391
+ }
1392
+ }
1393
+ }
1394
+ function findWorkspaceVersionProblems(packageParams, workspaceNames) {
1395
+ const problems = [];
1396
+ checkSection(packageParams.dependencies, packageParams.dependencyVersions, "dependencies", workspaceNames, problems);
1397
+ checkSection(packageParams.devDependencies, packageParams.devDependencyVersions, "devDependencies", workspaceNames, problems);
1398
+ return problems;
1399
+ }
1400
+ function getWorkspaceVersionProblems({ name, location }, packageParams, workspaceNames) {
1401
+ const problems = findWorkspaceVersionProblems(packageParams, workspaceNames);
1402
+ for (const {
1403
+ dep,
1404
+ section,
1405
+ version
1406
+ } of problems) {
1407
+ console.log(
1408
+ `[${chalk10.blue(name)}] Workspace dependency ${chalk10.red(dep)} in ${chalk10.cyan(section)} should use workspace: protocol \u2014 found ${chalk10.yellow(version)}`
1409
+ );
1410
+ }
1411
+ if (problems.length > 0) {
1412
+ console.log(` ${chalk10.yellow(`${location}/package.json`)}
1413
+ `);
1414
+ }
1415
+ return problems.length;
1416
+ }
1417
+ function fixWorkspaceVersionProblems(workspace, packageParams, workspaceNames) {
1418
+ const problems = findWorkspaceVersionProblems(packageParams, workspaceNames);
1419
+ if (problems.length === 0) return 0;
1420
+ const pkg = readPackageJson(workspace.location);
1421
+ for (const { dep, section } of problems) {
1422
+ addDep(pkg, dep, "workspace:~", section);
1423
+ logFix(workspace, `set workspace:~ for ${section}`, dep);
1424
+ }
1425
+ writePackageJson(workspace.location, pkg);
1426
+ return problems.length;
1427
+ }
1428
+
1429
+ // src/actions/deplint/checkPackage/checkPackage.ts
1430
+ function logVerbose(name, location, allFiles, distFiles, tsconfigExtends) {
1431
+ console.info(`Checking package: ${name} at ${location}`);
1432
+ console.info(`All files: ${allFiles.length}, Distribution files: ${distFiles.length}`);
1433
+ for (const file of allFiles) {
1434
+ console.info(`File: ${file}`);
1435
+ }
1436
+ for (const file of distFiles) {
1437
+ console.info(`Distribution file: ${file}`);
1438
+ }
1439
+ for (const ext of tsconfigExtends) {
1440
+ console.info(`Tsconfig extends: ${ext}`);
1441
+ }
1442
+ }
1443
+ function resolveCheckFlags(deps, devDeps, peerDeps) {
1444
+ const noneExplicit = !(deps || devDeps || peerDeps);
1445
+ return {
1446
+ checkDeps: deps || noneExplicit,
1447
+ checkDevDeps: devDeps || noneExplicit,
1448
+ checkPeerDeps: peerDeps || noneExplicit
1449
+ };
1450
+ }
1451
+ function checkPackage({
1452
+ name,
1453
+ location,
1454
+ deps = false,
1455
+ devDeps = false,
1456
+ exclude,
1457
+ fix = false,
1458
+ peerDeps = false,
1459
+ verbose = false,
1460
+ workspaceNames
1461
+ }) {
1462
+ const { allFiles, distFiles } = findFiles(location);
1463
+ const tsconfigExtends = getExtendsFromTsconfigs(location);
1464
+ if (verbose) {
1465
+ logVerbose(name, location, allFiles, distFiles, tsconfigExtends);
1466
+ }
1467
+ const {
1468
+ checkDeps,
1469
+ checkDevDeps,
1470
+ checkPeerDeps
1471
+ } = resolveCheckFlags(deps, devDeps, peerDeps);
1472
+ const sourceParams = getExternalImportsFromFiles({
1473
+ allFiles,
1474
+ distFiles,
1475
+ location,
1476
+ tsconfigExtends
1477
+ });
1478
+ const packageJsonPath = `${location}/package.json`;
1479
+ const packageParams = getDependenciesFromPackageJson(packageJsonPath);
1480
+ const workspace = { name, location };
1481
+ const fileContext = { allFiles, distFiles };
1482
+ if (fix) {
1483
+ return fixPackage(workspace, packageParams, sourceParams, fileContext, checkDeps, checkDevDeps, checkPeerDeps, exclude, packageJsonPath, workspaceNames);
1484
+ }
1485
+ return checkPackageProblems(workspace, packageParams, sourceParams, fileContext, checkDeps, checkDevDeps, checkPeerDeps, exclude, workspaceNames);
1486
+ }
1487
+ function checkPackageProblems(workspace, packageParams, sourceParams, fileContext, checkDeps, checkDevDeps, checkPeerDeps, exclude, workspaceNames) {
1488
+ const allRequiredPeers = checkDeps || checkDevDeps ? getRequiredTransitivePeers(workspace.location, packageParams) : /* @__PURE__ */ new Set();
1489
+ const peerExclude = /* @__PURE__ */ new Set([...exclude ?? [], ...allRequiredPeers]);
1490
+ const { count: unsatisfiedPeerDependencies } = checkDeps || checkDevDeps ? getUnsatisfiedPeerDependencies(workspace, packageParams, exclude) : { count: 0 };
1491
+ const unlistedDependencies = checkDeps ? getUnlistedDependencies(workspace, packageParams, sourceParams) : 0;
1492
+ const unusedDependencies = checkDeps ? getUnusedDependencies(workspace, packageParams, sourceParams, peerExclude) : 0;
1493
+ const unlistedDevDependencies = checkDevDeps ? getUnlistedDevDependencies(workspace, packageParams, sourceParams) : 0;
1494
+ const unusedDevDependencies = checkDevDeps ? getUnusedDevDependencies(workspace, packageParams, sourceParams, fileContext, peerExclude) : 0;
1495
+ const unusedPeerDependencies = checkPeerDeps ? getUnusedPeerDependencies(workspace, packageParams, sourceParams, exclude) : 0;
1496
+ const unrequestedPeerDependencies = checkPeerDeps ? getUnrequestedPeerDependencies(workspace, packageParams, sourceParams, exclude) : 0;
1497
+ const redundantPeerDependencies = checkPeerDeps ? getRedundantPeerDependencies(workspace, packageParams, exclude) : 0;
1498
+ const mismatchedPeerDevVersions = checkPeerDeps ? getMismatchedPeerDevVersions(workspace, packageParams, exclude) : 0;
1499
+ const workspaceVersionProblems = workspaceNames ? getWorkspaceVersionProblems(workspace, packageParams, workspaceNames) : 0;
1500
+ return unlistedDependencies + unlistedDevDependencies + unusedDependencies + unusedDevDependencies + unusedPeerDependencies + unrequestedPeerDependencies + redundantPeerDependencies + unsatisfiedPeerDependencies + mismatchedPeerDevVersions + workspaceVersionProblems;
1501
+ }
1502
+ function fixPhase1AddMissing(ctx, packageParams) {
1503
+ let total = 0;
1504
+ total += ctx.checkDeps ? fixUnlistedDependencies(ctx.workspace, packageParams, ctx.sourceParams) : 0;
1505
+ const afterDepsParams = total > 0 ? getDependenciesFromPackageJson(ctx.packageJsonPath) : packageParams;
1506
+ total += ctx.checkDevDeps ? fixUnlistedDevDependencies(ctx.workspace, afterDepsParams, ctx.sourceParams) : 0;
1507
+ const beforePeersParams = total > 0 ? getDependenciesFromPackageJson(ctx.packageJsonPath) : afterDepsParams;
1508
+ const peerResult = ctx.checkDeps || ctx.checkDevDeps ? fixUnsatisfiedPeerDependencies(ctx.workspace, beforePeersParams, ctx.exclude) : { addedPeers: /* @__PURE__ */ new Set(), count: 0 };
1509
+ total += peerResult.count;
1510
+ return { addedPeers: peerResult.addedPeers, total };
1511
+ }
1512
+ function fixPhase2RemoveUnused(ctx, addedPeers, prevTotal) {
1513
+ let total = 0;
1514
+ const updatedParams = getDependenciesFromPackageJson(ctx.packageJsonPath);
1515
+ const allRequiredPeers = ctx.checkDeps || ctx.checkDevDeps ? getRequiredTransitivePeers(ctx.workspace.location, updatedParams) : /* @__PURE__ */ new Set();
1516
+ const peerExclude = /* @__PURE__ */ new Set([...ctx.exclude ?? [], ...addedPeers, ...allRequiredPeers]);
1517
+ total += ctx.checkPeerDeps ? fixUnrequestedPeerDependencies(ctx.workspace, updatedParams, ctx.sourceParams, ctx.exclude) : 0;
1518
+ const afterMoveParams = ctx.checkPeerDeps && total + prevTotal > 0 ? getDependenciesFromPackageJson(ctx.packageJsonPath) : updatedParams;
1519
+ total += ctx.checkDeps ? fixUnusedDependencies(ctx.workspace, afterMoveParams, ctx.sourceParams, peerExclude) : 0;
1520
+ total += ctx.checkDevDeps ? fixUnusedDevDependencies(ctx.workspace, afterMoveParams, ctx.sourceParams, ctx.fileContext, peerExclude) : 0;
1521
+ total += ctx.checkPeerDeps ? fixUnusedPeerDependencies(ctx.workspace, afterMoveParams, ctx.sourceParams, ctx.exclude) : 0;
1522
+ total += ctx.checkPeerDeps ? fixRedundantPeerDependencies(ctx.workspace, afterMoveParams, ctx.exclude) : 0;
1523
+ return total;
1524
+ }
1525
+ function fixPhase3SyncVersions(ctx) {
1526
+ let total = 0;
1527
+ const finalParams = getDependenciesFromPackageJson(ctx.packageJsonPath);
1528
+ if (ctx.checkPeerDeps) {
1529
+ total += fixMismatchedPeerDevVersions(ctx.workspace, finalParams, ctx.exclude);
1530
+ }
1531
+ if (ctx.workspaceNames) {
1532
+ total += fixWorkspaceVersionProblems(ctx.workspace, finalParams, ctx.workspaceNames);
1533
+ }
1534
+ return total;
1535
+ }
1536
+ function fixPackage(workspace, packageParams, sourceParams, fileContext, checkDeps, checkDevDeps, checkPeerDeps, exclude, packageJsonPath, workspaceNames) {
1537
+ const ctx = {
1538
+ checkDeps,
1539
+ checkDevDeps,
1540
+ checkPeerDeps,
1541
+ exclude,
1542
+ fileContext,
1543
+ packageJsonPath,
1544
+ sourceParams,
1545
+ workspace,
1546
+ workspaceNames
1547
+ };
1548
+ const { addedPeers, total: phase1Total } = fixPhase1AddMissing(ctx, packageParams);
1549
+ const phase2Total = fixPhase2RemoveUnused(ctx, addedPeers, phase1Total);
1550
+ const phase3Total = fixPhase3SyncVersions(ctx);
1551
+ return phase1Total + phase2Total + phase3Total;
1552
+ }
1553
+ export {
1554
+ checkPackage
1555
+ };
1556
+ //# sourceMappingURL=checkPackage.mjs.map