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