@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,281 @@
1
+ // src/lib/dependencies/detectDuplicateDependencies.ts
2
+ import { execSync } from "child_process";
3
+
4
+ // src/pm/detectPackageManager.ts
5
+ import { existsSync } from "fs";
6
+ function detectPackageManager() {
7
+ if (existsSync("pnpm-lock.yaml") || existsSync("pnpm-workspace.yaml")) return "pnpm";
8
+ return "yarn";
9
+ }
10
+
11
+ // src/pm/registry.ts
12
+ var implementations = /* @__PURE__ */ new Map();
13
+ function getPackageManager(name) {
14
+ const pmName = name ?? detectPackageManager();
15
+ const pm = implementations.get(pmName);
16
+ if (!pm) {
17
+ throw new Error(
18
+ `No package manager implementation registered for "${pmName}". Ensure registerPackageManager() has been called before getPackageManager().`
19
+ );
20
+ }
21
+ return pm;
22
+ }
23
+
24
+ // src/lib/processEx.ts
25
+ import chalk from "chalk";
26
+
27
+ // src/lib/withError.ts
28
+ var withError = (ex, closure, predicate = (ex2) => !!ex2.name && !!ex2.message) => {
29
+ return predicate(ex) ? closure(ex) : void 0;
30
+ };
31
+
32
+ // src/lib/withErrnoException.ts
33
+ var withErrnoException = (ex, closure) => {
34
+ return withError(ex, closure, (ex2) => ex2.errno !== void 0);
35
+ };
36
+
37
+ // src/lib/processEx.ts
38
+ var processEx = (ex) => {
39
+ const error = typeof ex === "string" ? new Error(ex) : ex;
40
+ const exitCode = withErrnoException(error, (error2) => {
41
+ if (error2.code === "ENOENT") {
42
+ console.error(chalk.red(`'${error2.path}' not found.`));
43
+ } else {
44
+ console.error(chalk.red(`Errno: ${error2.code}`));
45
+ }
46
+ return error2.errno ?? -1;
47
+ }) ?? withError(error, (error2) => {
48
+ console.error(chalk.red(`${error2.name}: ${error2.message}`));
49
+ return -1;
50
+ }) ?? (() => {
51
+ console.error(chalk.red(`Unexpected Error: ${JSON.stringify(ex, null, 2)}`));
52
+ return -1;
53
+ })();
54
+ process.exit(process.exitCode ?? exitCode);
55
+ };
56
+
57
+ // src/lib/safeExit.ts
58
+ var safeExit = (func, exitOnFail = true) => {
59
+ try {
60
+ const result = func();
61
+ if (result && exitOnFail) {
62
+ process.exit(result);
63
+ }
64
+ return result;
65
+ } catch (ex) {
66
+ return processEx(ex);
67
+ }
68
+ };
69
+
70
+ // src/lib/dependencies/DuplicateDetector.ts
71
+ import { EOL } from "os";
72
+ import chalk2 from "chalk";
73
+
74
+ // src/lib/jsonFormatters.ts
75
+ var multiLineToJSONArray = (output) => {
76
+ const withCommas = output.replaceAll("\r\n", "").replaceAll("\n", ",");
77
+ const cleanCollection = withCommas.slice(0, Math.max(0, withCommas.length - 1));
78
+ const collection = `[${cleanCollection}]`;
79
+ return JSON.parse(collection);
80
+ };
81
+
82
+ // src/lib/dependencies/DuplicateDetector.ts
83
+ var trimVirtualMeta = (value) => {
84
+ const virtualParts = value.split("virtual:");
85
+ if (virtualParts.length > 1) {
86
+ const hashParts = virtualParts[1].split("#");
87
+ return virtualParts[0] + hashParts[1];
88
+ } else {
89
+ return value;
90
+ }
91
+ };
92
+ var trimObjectDependencyVirtualMeta = (obj) => {
93
+ const resultObj = {};
94
+ for (const [key, value] of Object.entries(obj)) {
95
+ resultObj[trimVirtualMeta(key)] = {
96
+ descriptor: trimVirtualMeta(value.descriptor),
97
+ locator: trimVirtualMeta(value.locator)
98
+ };
99
+ }
100
+ return resultObj;
101
+ };
102
+ var trimDependencyVirtualMeta = (dependencies) => {
103
+ return dependencies.map((dependency) => {
104
+ return { children: trimObjectDependencyVirtualMeta(dependency.children), value: trimVirtualMeta(dependency.value) };
105
+ });
106
+ };
107
+ function extractPnpmVersions(data, depName) {
108
+ const versions = /* @__PURE__ */ new Set();
109
+ function walk(obj) {
110
+ if (Array.isArray(obj)) {
111
+ for (const item of obj) walk(item);
112
+ } else if (obj && typeof obj === "object") {
113
+ const record = obj;
114
+ if (typeof record.version === "string" && typeof record.from === "string" && record.from === depName) {
115
+ versions.add(record.version);
116
+ }
117
+ for (const val of Object.values(record)) walk(val);
118
+ }
119
+ }
120
+ walk(data);
121
+ return [...versions];
122
+ }
123
+ var DuplicateDetector = class {
124
+ dependency;
125
+ duplicateVersions;
126
+ constructor(output, dependency) {
127
+ this.dependency = dependency;
128
+ this.duplicateVersions = this.parseVersions(output, dependency);
129
+ }
130
+ detect() {
131
+ if (this.duplicateVersions.length > 1) {
132
+ console.log(chalk2.yellow(`${EOL}Duplicates found for: ${this.dependency}`));
133
+ const duplicateVersions = this.duplicateVersions.join(`${EOL} `);
134
+ console.log(chalk2.grey(` ${duplicateVersions}`, EOL));
135
+ return 1;
136
+ } else {
137
+ console.log(`${this.dependency} - OK`);
138
+ return 0;
139
+ }
140
+ }
141
+ parseVersions(output, dependency) {
142
+ try {
143
+ const parsed = JSON.parse(output);
144
+ if (Array.isArray(parsed)) {
145
+ return extractPnpmVersions(parsed, dependency);
146
+ }
147
+ } catch {
148
+ }
149
+ try {
150
+ const entries = trimDependencyVirtualMeta(multiLineToJSONArray(output));
151
+ const versions = /* @__PURE__ */ new Set();
152
+ for (const entry of entries) {
153
+ for (const key of Object.keys(entry.children)) {
154
+ const version = key.includes("@virtual:") ? void 0 : key;
155
+ if (version) versions.add(version);
156
+ }
157
+ }
158
+ return [...versions];
159
+ } catch {
160
+ console.warn(chalk2.yellow(`Could not parse dependency output for ${dependency}`));
161
+ return [];
162
+ }
163
+ }
164
+ };
165
+
166
+ // src/lib/dependencies/detectDuplicateDependencies.ts
167
+ var detectDuplicateDependencies = (depsFromPackageJSON, DefaultDependencies) => {
168
+ let exitCode = 0;
169
+ const dependencies = depsFromPackageJSON?.length ? depsFromPackageJSON : DefaultDependencies;
170
+ return safeExit(() => {
171
+ if (dependencies) {
172
+ for (const dependency of dependencies) {
173
+ let output;
174
+ try {
175
+ const pm = getPackageManager();
176
+ const cmd = `${pm.command} why ${dependency} --json`;
177
+ output = execSync(cmd, { maxBuffer: 64 * 1024 * 1024 }).toString();
178
+ } catch (e) {
179
+ console.error(`Error running dependency check: ${String(e)}`);
180
+ exitCode = 1;
181
+ continue;
182
+ }
183
+ if (output) {
184
+ exitCode = new DuplicateDetector(output, dependency).detect();
185
+ } else {
186
+ console.log(`${dependency} - N/A`);
187
+ if (depsFromPackageJSON) {
188
+ exitCode = 1;
189
+ console.log(`\u{1F6A8} Library ${dependency} was requested in package.json but not found`);
190
+ }
191
+ }
192
+ }
193
+ return exitCode;
194
+ } else {
195
+ console.log("\u{1F6A8} No dependencies where passed");
196
+ return exitCode;
197
+ }
198
+ });
199
+ };
200
+
201
+ // src/lib/dependencies/workspaceCycles.ts
202
+ import { readFileSync } from "fs";
203
+ import PATH from "path";
204
+ import chalk3 from "chalk";
205
+ function detectWorkspaceCycles(workspaces) {
206
+ const workspaceNames = new Set(workspaces.map((ws) => ws.name));
207
+ const graph = /* @__PURE__ */ new Map();
208
+ for (const ws of workspaces) {
209
+ const pkgPath = PATH.join(ws.location, "package.json");
210
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
211
+ const deps = pkg.dependencies ?? {};
212
+ const devDeps = pkg.devDependencies ?? {};
213
+ const edges = [];
214
+ for (const dep of Object.keys(deps)) {
215
+ if (workspaceNames.has(dep)) edges.push({ name: dep, type: "dep" });
216
+ }
217
+ for (const dep of Object.keys(devDeps)) {
218
+ if (workspaceNames.has(dep)) edges.push({ name: dep, type: "devDep" });
219
+ }
220
+ graph.set(ws.name, edges);
221
+ }
222
+ const WHITE = 0;
223
+ const GRAY = 1;
224
+ const BLACK = 2;
225
+ const color = /* @__PURE__ */ new Map();
226
+ const cycles = [];
227
+ const path = [];
228
+ const onPath = /* @__PURE__ */ new Set();
229
+ for (const name of workspaceNames) color.set(name, WHITE);
230
+ function dfs(u, incomingEdgeType) {
231
+ color.set(u, GRAY);
232
+ onPath.add(u);
233
+ path.push({ name: u, edgeType: incomingEdgeType });
234
+ for (const edge of graph.get(u) ?? []) {
235
+ const v = edge.name;
236
+ if (onPath.has(v)) {
237
+ const cycleEdges = [];
238
+ const startIdx = path.findIndex((p) => p.name === v);
239
+ for (let i = startIdx; i < path.length - 1; i++) {
240
+ const nextEdgeType = path[i + 1].edgeType ?? "dep";
241
+ cycleEdges.push({
242
+ from: path[i].name,
243
+ to: path[i + 1].name,
244
+ type: nextEdgeType
245
+ });
246
+ }
247
+ cycleEdges.push({
248
+ from: u,
249
+ to: v,
250
+ type: edge.type
251
+ });
252
+ cycles.push(cycleEdges);
253
+ } else if (color.get(v) === WHITE) {
254
+ dfs(v, edge.type);
255
+ }
256
+ }
257
+ path.pop();
258
+ onPath.delete(u);
259
+ color.set(u, BLACK);
260
+ }
261
+ for (const name of workspaceNames) {
262
+ if (color.get(name) === WHITE) dfs(name);
263
+ }
264
+ return cycles;
265
+ }
266
+ function printWorkspaceCycles(cycles) {
267
+ for (const cycle of cycles) {
268
+ console.error(chalk3.red(" Workspace dependency cycle:"));
269
+ for (const edge of cycle) {
270
+ const edgeLabel = edge.type === "devDep" ? chalk3.yellow("devDep") : chalk3.cyan("dep");
271
+ console.error(` ${chalk3.white(edge.from)} --(${edgeLabel})--> ${chalk3.white(edge.to)}`);
272
+ }
273
+ }
274
+ }
275
+ export {
276
+ DuplicateDetector,
277
+ detectDuplicateDependencies,
278
+ detectWorkspaceCycles,
279
+ printWorkspaceCycles
280
+ };
281
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/dependencies/detectDuplicateDependencies.ts","../../../src/pm/detectPackageManager.ts","../../../src/pm/registry.ts","../../../src/lib/processEx.ts","../../../src/lib/withError.ts","../../../src/lib/withErrnoException.ts","../../../src/lib/safeExit.ts","../../../src/lib/dependencies/DuplicateDetector.ts","../../../src/lib/jsonFormatters.ts","../../../src/lib/dependencies/workspaceCycles.ts"],"sourcesContent":["import { execSync } from 'node:child_process'\n\nimport { getPackageManager } from '../../pm/index.ts'\nimport { safeExit } from '../safeExit.ts'\nimport { DuplicateDetector } from './DuplicateDetector.ts'\n\nexport const detectDuplicateDependencies = (depsFromPackageJSON?: string[], DefaultDependencies?: string[]) => {\n let exitCode = 0\n\n const dependencies = depsFromPackageJSON?.length ? depsFromPackageJSON : DefaultDependencies\n\n return safeExit(() => {\n if (dependencies) {\n for (const dependency of dependencies) {\n let output: string\n\n try {\n const pm = getPackageManager()\n const cmd = `${pm.command} why ${dependency} --json`\n output = execSync(cmd, { maxBuffer: 64 * 1024 * 1024 }).toString()\n } catch (e) {\n console.error(`Error running dependency check: ${String(e)}`)\n exitCode = 1\n continue\n }\n\n if (output) {\n exitCode = new DuplicateDetector(output, dependency).detect()\n } else {\n console.log(`${dependency} - N/A`)\n if (depsFromPackageJSON) {\n exitCode = 1\n console.log(`🚨 Library ${dependency} was requested in package.json but not found`)\n }\n }\n }\n return exitCode\n } else {\n console.log('🚨 No dependencies where passed')\n return exitCode\n }\n })\n}\n","import { existsSync } from 'node:fs'\n\nexport type PackageManagerName = 'pnpm' | 'yarn'\n\nexport function detectPackageManager(): PackageManagerName {\n if (existsSync('pnpm-lock.yaml') || existsSync('pnpm-workspace.yaml')) return 'pnpm'\n return 'yarn'\n}\n","import type { PackageManagerName } from './detectPackageManager.ts'\nimport { detectPackageManager } from './detectPackageManager.ts'\nimport type { PackageManager } from './PackageManager.ts'\n\nconst implementations = new Map<PackageManagerName, PackageManager>()\n\nexport function registerPackageManager(pm: PackageManager): void {\n implementations.set(pm.name, pm)\n}\n\nexport function getPackageManager(name?: PackageManagerName): PackageManager {\n const pmName = name ?? detectPackageManager()\n const pm = implementations.get(pmName)\n if (!pm) {\n throw new Error(\n `No package manager implementation registered for \"${pmName}\". `\n + 'Ensure registerPackageManager() has been called before getPackageManager().',\n )\n }\n return pm\n}\n","import chalk from 'chalk'\n\nimport { withErrnoException } from './withErrnoException.ts'\nimport { withError } from './withError.ts'\n\nexport const processEx = (ex: unknown) => {\n const error = typeof ex === 'string' ? new Error(ex) : ex\n const exitCode\n = withErrnoException(error, (error) => {\n if (error.code === 'ENOENT') {\n console.error(chalk.red(`'${error.path}' not found.`))\n } else {\n console.error(chalk.red(`Errno: ${error.code}`))\n }\n return error.errno ?? -1\n })\n ?? withError(error, (error) => {\n console.error(chalk.red(`${error.name}: ${error.message}`))\n return -1\n })\n ?? (() => {\n console.error(chalk.red(`Unexpected Error: ${JSON.stringify(ex, null, 2)}`))\n return -1\n })()\n // This allows us to use a previously set exit code\n process.exit(process.exitCode ?? exitCode)\n}\n","export const withError = <T extends Error = Error>(\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n ex: any,\n closure: (error: T) => number,\n predicate = (ex: T) => (!!ex.name && !!ex.message),\n) => {\n return predicate(ex as T) ? closure(ex as T) : undefined\n}\n","import { withError } from './withError.ts'\n\nexport const withErrnoException = <T extends NodeJS.ErrnoException = NodeJS.ErrnoException>(\n ex: unknown, closure: (error: T) => number,\n) => {\n return withError<T>(ex, closure, (ex: unknown) => (ex as NodeJS.ErrnoException).errno !== undefined)\n}\n","/** Catch child process a crash and returns the code */\n\nimport { processEx } from './processEx.ts'\n\nconst safeExit = (func: () => number, exitOnFail = true): number => {\n try {\n const result = func()\n if (result && exitOnFail) {\n process.exit(result)\n }\n return result\n } catch (ex) {\n return processEx(ex)\n }\n}\n\nconst safeExitAsync = async (func: () => Promise<number>, exitOnFail = true): Promise<number> => {\n try {\n const result = await func()\n if (result && exitOnFail) {\n process.exit(result)\n }\n return result\n } catch (ex) {\n return processEx(ex)\n }\n}\n\nexport { safeExit, safeExitAsync }\n","import { EOL } from 'node:os'\n\nimport chalk from 'chalk'\n\nimport { multiLineToJSONArray } from '../jsonFormatters.ts'\n\ninterface ChildFields {\n descriptor: string\n locator: string\n}\n\nconst trimVirtualMeta = (value: string): string => {\n const virtualParts = value.split('virtual:')\n if (virtualParts.length > 1) {\n const hashParts = virtualParts[1].split('#')\n return virtualParts[0] + hashParts[1]\n } else {\n return value\n }\n}\n\nconst trimObjectDependencyVirtualMeta = (obj: Record<string, ChildFields>): Record<string, ChildFields> => {\n const resultObj: Record<string, ChildFields> = {}\n for (const [key, value] of Object.entries(obj)) {\n resultObj[trimVirtualMeta(key)] = {\n descriptor: trimVirtualMeta(value.descriptor),\n locator: trimVirtualMeta(value.locator),\n }\n }\n return resultObj\n}\n\nconst trimDependencyVirtualMeta = (dependencies: DependencyEntries): DependencyEntries => {\n return dependencies.map((dependency) => {\n return { children: trimObjectDependencyVirtualMeta(dependency.children), value: trimVirtualMeta(dependency.value) }\n })\n}\n\ninterface DependencyEntry {\n children: Record<string, ChildFields>\n value: string\n}\n\ntype DependencyEntries = DependencyEntry[]\n\n/**\n * Extracts all versions of a named dependency from pnpm's `why --json` output.\n * The output is a JSON array of workspace packages, each containing nested\n * dependency trees with `version` fields.\n */\nfunction extractPnpmVersions(data: unknown, depName: string): string[] {\n const versions = new Set<string>()\n function walk(obj: unknown): void {\n if (Array.isArray(obj)) {\n for (const item of obj) walk(item)\n } else if (obj && typeof obj === 'object') {\n const record = obj as Record<string, unknown>\n if (typeof record.version === 'string' && typeof record.from === 'string' && record.from === depName) {\n versions.add(record.version)\n }\n for (const val of Object.values(record)) walk(val)\n }\n }\n walk(data)\n return [...versions]\n}\n\nexport class DuplicateDetector {\n private dependency: string\n private duplicateVersions: string[]\n\n constructor(output: string, dependency: string) {\n this.dependency = dependency\n this.duplicateVersions = this.parseVersions(output, dependency)\n }\n\n detect(): number {\n if (this.duplicateVersions.length > 1) {\n console.log(chalk.yellow(`${EOL}Duplicates found for: ${this.dependency}`))\n const duplicateVersions = this.duplicateVersions.join(`${EOL} `)\n console.log(chalk.grey(` ${duplicateVersions}`, EOL))\n return 1\n } else {\n console.log(`${this.dependency} - OK`)\n return 0\n }\n }\n\n private parseVersions(output: string, dependency: string): string[] {\n // Try pnpm format first (valid JSON array)\n try {\n const parsed: unknown = JSON.parse(output)\n if (Array.isArray(parsed)) {\n return extractPnpmVersions(parsed, dependency)\n }\n } catch {\n // Not pnpm format, try yarn NDJSON format\n }\n\n try {\n const entries: DependencyEntries = trimDependencyVirtualMeta(multiLineToJSONArray(output) as DependencyEntries)\n const versions = new Set<string>()\n for (const entry of entries) {\n for (const key of Object.keys(entry.children)) {\n const version = key.includes('@virtual:') ? undefined : key\n if (version) versions.add(version)\n }\n }\n return [...versions]\n } catch {\n console.warn(chalk.yellow(`Could not parse dependency output for ${dependency}`))\n return []\n }\n }\n}\n","export const multiLineToJSONArray = (output: string): unknown[] => {\n const withCommas = output.replaceAll('\\r\\n', '').replaceAll('\\n', ',')\n const cleanCollection = withCommas.slice(0, Math.max(0, withCommas.length - 1))\n const collection = `[${cleanCollection}]`\n return JSON.parse(collection) as unknown[]\n}\n","import { readFileSync } from 'node:fs'\nimport PATH from 'node:path'\n\nimport chalk from 'chalk'\n\nimport type { Workspace } from '../../pm/index.ts'\n\ninterface WorkspaceEdge {\n name: string\n type: 'dep' | 'devDep'\n}\n\nexport interface CycleEdge {\n from: string\n to: string\n type: 'dep' | 'devDep'\n}\n\n/**\n * Detects cycles in the workspace dependency graph (including devDependencies).\n * This catches cycles that break `yarn workspaces foreach --topological-dev`\n * but are invisible to source-level import analysis.\n * @returns An array of cycle paths, each represented as an array of edges. Empty if no cycles.\n */\nexport function detectWorkspaceCycles(workspaces: Workspace[]): CycleEdge[][] {\n const workspaceNames = new Set(workspaces.map(ws => ws.name))\n\n // Build adjacency list: edges from deps + devDeps to other workspace packages\n const graph = new Map<string, WorkspaceEdge[]>()\n for (const ws of workspaces) {\n const pkgPath = PATH.join(ws.location, 'package.json')\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as Record<string, unknown>\n const deps: Record<string, string> = (pkg.dependencies ?? {}) as Record<string, string>\n const devDeps: Record<string, string> = (pkg.devDependencies ?? {}) as Record<string, string>\n const edges: WorkspaceEdge[] = []\n for (const dep of Object.keys(deps)) {\n if (workspaceNames.has(dep)) edges.push({ name: dep, type: 'dep' })\n }\n for (const dep of Object.keys(devDeps)) {\n if (workspaceNames.has(dep)) edges.push({ name: dep, type: 'devDep' })\n }\n graph.set(ws.name, edges)\n }\n\n // DFS with explicit path stack to correctly extract cycles\n const WHITE = 0\n const GRAY = 1\n const BLACK = 2\n const color = new Map<string, number>()\n const cycles: CycleEdge[][] = []\n // path tracks the current DFS recursion stack as [nodeName, edgeType used to reach it]\n const path: { edgeType?: 'dep' | 'devDep'; name: string }[] = []\n const onPath = new Set<string>()\n\n for (const name of workspaceNames) color.set(name, WHITE)\n\n function dfs(u: string, incomingEdgeType?: 'dep' | 'devDep'): void {\n color.set(u, GRAY)\n onPath.add(u)\n path.push({ name: u, edgeType: incomingEdgeType })\n\n for (const edge of graph.get(u) ?? []) {\n const v = edge.name\n if (onPath.has(v)) {\n // Found a cycle — extract from path\n const cycleEdges: CycleEdge[] = []\n const startIdx = path.findIndex(p => p.name === v)\n for (let i = startIdx; i < path.length - 1; i++) {\n const nextEdgeType = path[i + 1].edgeType ?? 'dep'\n cycleEdges.push({\n from: path[i].name, to: path[i + 1].name, type: nextEdgeType,\n })\n }\n // Close: last node back to v\n cycleEdges.push({\n from: u, to: v, type: edge.type,\n })\n cycles.push(cycleEdges)\n } else if (color.get(v) === WHITE) {\n dfs(v, edge.type)\n }\n }\n\n path.pop()\n onPath.delete(u)\n color.set(u, BLACK)\n }\n\n for (const name of workspaceNames) {\n if (color.get(name) === WHITE) dfs(name)\n }\n\n return cycles\n}\n\nexport function printWorkspaceCycles(cycles: CycleEdge[][]): void {\n for (const cycle of cycles) {\n console.error(chalk.red(' Workspace dependency cycle:'))\n for (const edge of cycle) {\n const edgeLabel = edge.type === 'devDep' ? chalk.yellow('devDep') : chalk.cyan('dep')\n console.error(` ${chalk.white(edge.from)} --(${edgeLabel})--> ${chalk.white(edge.to)}`)\n }\n }\n}\n"],"mappings":"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","names":["ex","ex","error","chalk","chalk","chalk"]}
@@ -0,0 +1,79 @@
1
+ // src/lib/dependencies/workspaceCycles.ts
2
+ import { readFileSync } from "fs";
3
+ import PATH from "path";
4
+ import chalk from "chalk";
5
+ function detectWorkspaceCycles(workspaces) {
6
+ const workspaceNames = new Set(workspaces.map((ws) => ws.name));
7
+ const graph = /* @__PURE__ */ new Map();
8
+ for (const ws of workspaces) {
9
+ const pkgPath = PATH.join(ws.location, "package.json");
10
+ const pkg = JSON.parse(readFileSync(pkgPath, "utf8"));
11
+ const deps = pkg.dependencies ?? {};
12
+ const devDeps = pkg.devDependencies ?? {};
13
+ const edges = [];
14
+ for (const dep of Object.keys(deps)) {
15
+ if (workspaceNames.has(dep)) edges.push({ name: dep, type: "dep" });
16
+ }
17
+ for (const dep of Object.keys(devDeps)) {
18
+ if (workspaceNames.has(dep)) edges.push({ name: dep, type: "devDep" });
19
+ }
20
+ graph.set(ws.name, edges);
21
+ }
22
+ const WHITE = 0;
23
+ const GRAY = 1;
24
+ const BLACK = 2;
25
+ const color = /* @__PURE__ */ new Map();
26
+ const cycles = [];
27
+ const path = [];
28
+ const onPath = /* @__PURE__ */ new Set();
29
+ for (const name of workspaceNames) color.set(name, WHITE);
30
+ function dfs(u, incomingEdgeType) {
31
+ color.set(u, GRAY);
32
+ onPath.add(u);
33
+ path.push({ name: u, edgeType: incomingEdgeType });
34
+ for (const edge of graph.get(u) ?? []) {
35
+ const v = edge.name;
36
+ if (onPath.has(v)) {
37
+ const cycleEdges = [];
38
+ const startIdx = path.findIndex((p) => p.name === v);
39
+ for (let i = startIdx; i < path.length - 1; i++) {
40
+ const nextEdgeType = path[i + 1].edgeType ?? "dep";
41
+ cycleEdges.push({
42
+ from: path[i].name,
43
+ to: path[i + 1].name,
44
+ type: nextEdgeType
45
+ });
46
+ }
47
+ cycleEdges.push({
48
+ from: u,
49
+ to: v,
50
+ type: edge.type
51
+ });
52
+ cycles.push(cycleEdges);
53
+ } else if (color.get(v) === WHITE) {
54
+ dfs(v, edge.type);
55
+ }
56
+ }
57
+ path.pop();
58
+ onPath.delete(u);
59
+ color.set(u, BLACK);
60
+ }
61
+ for (const name of workspaceNames) {
62
+ if (color.get(name) === WHITE) dfs(name);
63
+ }
64
+ return cycles;
65
+ }
66
+ function printWorkspaceCycles(cycles) {
67
+ for (const cycle of cycles) {
68
+ console.error(chalk.red(" Workspace dependency cycle:"));
69
+ for (const edge of cycle) {
70
+ const edgeLabel = edge.type === "devDep" ? chalk.yellow("devDep") : chalk.cyan("dep");
71
+ console.error(` ${chalk.white(edge.from)} --(${edgeLabel})--> ${chalk.white(edge.to)}`);
72
+ }
73
+ }
74
+ }
75
+ export {
76
+ detectWorkspaceCycles,
77
+ printWorkspaceCycles
78
+ };
79
+ //# sourceMappingURL=workspaceCycles.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/dependencies/workspaceCycles.ts"],"sourcesContent":["import { readFileSync } from 'node:fs'\nimport PATH from 'node:path'\n\nimport chalk from 'chalk'\n\nimport type { Workspace } from '../../pm/index.ts'\n\ninterface WorkspaceEdge {\n name: string\n type: 'dep' | 'devDep'\n}\n\nexport interface CycleEdge {\n from: string\n to: string\n type: 'dep' | 'devDep'\n}\n\n/**\n * Detects cycles in the workspace dependency graph (including devDependencies).\n * This catches cycles that break `yarn workspaces foreach --topological-dev`\n * but are invisible to source-level import analysis.\n * @returns An array of cycle paths, each represented as an array of edges. Empty if no cycles.\n */\nexport function detectWorkspaceCycles(workspaces: Workspace[]): CycleEdge[][] {\n const workspaceNames = new Set(workspaces.map(ws => ws.name))\n\n // Build adjacency list: edges from deps + devDeps to other workspace packages\n const graph = new Map<string, WorkspaceEdge[]>()\n for (const ws of workspaces) {\n const pkgPath = PATH.join(ws.location, 'package.json')\n const pkg = JSON.parse(readFileSync(pkgPath, 'utf8')) as Record<string, unknown>\n const deps: Record<string, string> = (pkg.dependencies ?? {}) as Record<string, string>\n const devDeps: Record<string, string> = (pkg.devDependencies ?? {}) as Record<string, string>\n const edges: WorkspaceEdge[] = []\n for (const dep of Object.keys(deps)) {\n if (workspaceNames.has(dep)) edges.push({ name: dep, type: 'dep' })\n }\n for (const dep of Object.keys(devDeps)) {\n if (workspaceNames.has(dep)) edges.push({ name: dep, type: 'devDep' })\n }\n graph.set(ws.name, edges)\n }\n\n // DFS with explicit path stack to correctly extract cycles\n const WHITE = 0\n const GRAY = 1\n const BLACK = 2\n const color = new Map<string, number>()\n const cycles: CycleEdge[][] = []\n // path tracks the current DFS recursion stack as [nodeName, edgeType used to reach it]\n const path: { edgeType?: 'dep' | 'devDep'; name: string }[] = []\n const onPath = new Set<string>()\n\n for (const name of workspaceNames) color.set(name, WHITE)\n\n function dfs(u: string, incomingEdgeType?: 'dep' | 'devDep'): void {\n color.set(u, GRAY)\n onPath.add(u)\n path.push({ name: u, edgeType: incomingEdgeType })\n\n for (const edge of graph.get(u) ?? []) {\n const v = edge.name\n if (onPath.has(v)) {\n // Found a cycle — extract from path\n const cycleEdges: CycleEdge[] = []\n const startIdx = path.findIndex(p => p.name === v)\n for (let i = startIdx; i < path.length - 1; i++) {\n const nextEdgeType = path[i + 1].edgeType ?? 'dep'\n cycleEdges.push({\n from: path[i].name, to: path[i + 1].name, type: nextEdgeType,\n })\n }\n // Close: last node back to v\n cycleEdges.push({\n from: u, to: v, type: edge.type,\n })\n cycles.push(cycleEdges)\n } else if (color.get(v) === WHITE) {\n dfs(v, edge.type)\n }\n }\n\n path.pop()\n onPath.delete(u)\n color.set(u, BLACK)\n }\n\n for (const name of workspaceNames) {\n if (color.get(name) === WHITE) dfs(name)\n }\n\n return cycles\n}\n\nexport function printWorkspaceCycles(cycles: CycleEdge[][]): void {\n for (const cycle of cycles) {\n console.error(chalk.red(' Workspace dependency cycle:'))\n for (const edge of cycle) {\n const edgeLabel = edge.type === 'devDep' ? chalk.yellow('devDep') : chalk.cyan('dep')\n console.error(` ${chalk.white(edge.from)} --(${edgeLabel})--> ${chalk.white(edge.to)}`)\n }\n }\n}\n"],"mappings":";AAAA,SAAS,oBAAoB;AAC7B,OAAO,UAAU;AAEjB,OAAO,WAAW;AAqBX,SAAS,sBAAsB,YAAwC;AAC5E,QAAM,iBAAiB,IAAI,IAAI,WAAW,IAAI,QAAM,GAAG,IAAI,CAAC;AAG5D,QAAM,QAAQ,oBAAI,IAA6B;AAC/C,aAAW,MAAM,YAAY;AAC3B,UAAM,UAAU,KAAK,KAAK,GAAG,UAAU,cAAc;AACrD,UAAM,MAAM,KAAK,MAAM,aAAa,SAAS,MAAM,CAAC;AACpD,UAAM,OAAgC,IAAI,gBAAgB,CAAC;AAC3D,UAAM,UAAmC,IAAI,mBAAmB,CAAC;AACjE,UAAM,QAAyB,CAAC;AAChC,eAAW,OAAO,OAAO,KAAK,IAAI,GAAG;AACnC,UAAI,eAAe,IAAI,GAAG,EAAG,OAAM,KAAK,EAAE,MAAM,KAAK,MAAM,MAAM,CAAC;AAAA,IACpE;AACA,eAAW,OAAO,OAAO,KAAK,OAAO,GAAG;AACtC,UAAI,eAAe,IAAI,GAAG,EAAG,OAAM,KAAK,EAAE,MAAM,KAAK,MAAM,SAAS,CAAC;AAAA,IACvE;AACA,UAAM,IAAI,GAAG,MAAM,KAAK;AAAA,EAC1B;AAGA,QAAM,QAAQ;AACd,QAAM,OAAO;AACb,QAAM,QAAQ;AACd,QAAM,QAAQ,oBAAI,IAAoB;AACtC,QAAM,SAAwB,CAAC;AAE/B,QAAM,OAAwD,CAAC;AAC/D,QAAM,SAAS,oBAAI,IAAY;AAE/B,aAAW,QAAQ,eAAgB,OAAM,IAAI,MAAM,KAAK;AAExD,WAAS,IAAI,GAAW,kBAA2C;AACjE,UAAM,IAAI,GAAG,IAAI;AACjB,WAAO,IAAI,CAAC;AACZ,SAAK,KAAK,EAAE,MAAM,GAAG,UAAU,iBAAiB,CAAC;AAEjD,eAAW,QAAQ,MAAM,IAAI,CAAC,KAAK,CAAC,GAAG;AACrC,YAAM,IAAI,KAAK;AACf,UAAI,OAAO,IAAI,CAAC,GAAG;AAEjB,cAAM,aAA0B,CAAC;AACjC,cAAM,WAAW,KAAK,UAAU,OAAK,EAAE,SAAS,CAAC;AACjD,iBAAS,IAAI,UAAU,IAAI,KAAK,SAAS,GAAG,KAAK;AAC/C,gBAAM,eAAe,KAAK,IAAI,CAAC,EAAE,YAAY;AAC7C,qBAAW,KAAK;AAAA,YACd,MAAM,KAAK,CAAC,EAAE;AAAA,YAAM,IAAI,KAAK,IAAI,CAAC,EAAE;AAAA,YAAM,MAAM;AAAA,UAClD,CAAC;AAAA,QACH;AAEA,mBAAW,KAAK;AAAA,UACd,MAAM;AAAA,UAAG,IAAI;AAAA,UAAG,MAAM,KAAK;AAAA,QAC7B,CAAC;AACD,eAAO,KAAK,UAAU;AAAA,MACxB,WAAW,MAAM,IAAI,CAAC,MAAM,OAAO;AACjC,YAAI,GAAG,KAAK,IAAI;AAAA,MAClB;AAAA,IACF;AAEA,SAAK,IAAI;AACT,WAAO,OAAO,CAAC;AACf,UAAM,IAAI,GAAG,KAAK;AAAA,EACpB;AAEA,aAAW,QAAQ,gBAAgB;AACjC,QAAI,MAAM,IAAI,IAAI,MAAM,MAAO,KAAI,IAAI;AAAA,EACzC;AAEA,SAAO;AACT;AAEO,SAAS,qBAAqB,QAA6B;AAChE,aAAW,SAAS,QAAQ;AAC1B,YAAQ,MAAM,MAAM,IAAI,+BAA+B,CAAC;AACxD,eAAW,QAAQ,OAAO;AACxB,YAAM,YAAY,KAAK,SAAS,WAAW,MAAM,OAAO,QAAQ,IAAI,MAAM,KAAK,KAAK;AACpF,cAAQ,MAAM,OAAO,MAAM,MAAM,KAAK,IAAI,CAAC,OAAO,SAAS,QAAQ,MAAM,MAAM,KAAK,EAAE,CAAC,EAAE;AAAA,IAC3F;AAAA,EACF;AACF;","names":[]}
@@ -0,0 +1,6 @@
1
+ // src/lib/file/ReadFileSyncOptions.ts
2
+ var defaultReadFileSyncOptions = { encoding: "utf8" };
3
+ export {
4
+ defaultReadFileSyncOptions
5
+ };
6
+ //# sourceMappingURL=ReadFileSyncOptions.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/file/ReadFileSyncOptions.ts"],"sourcesContent":["export type ReadFileSyncOptions = BufferEncoding | {\n encoding: BufferEncoding\n flags?: string\n}\n\nexport const defaultReadFileSyncOptions: ReadFileSyncOptions = { encoding: 'utf8' }\n"],"mappings":";AAKO,IAAM,6BAAkD,EAAE,UAAU,OAAO;","names":[]}
@@ -0,0 +1,8 @@
1
+ // src/lib/file/constants.ts
2
+ var WINDOWS_NEWLINE_REGEX = /\r\n/g;
3
+ var CROSS_PLATFORM_NEWLINE = "\n";
4
+ export {
5
+ CROSS_PLATFORM_NEWLINE,
6
+ WINDOWS_NEWLINE_REGEX
7
+ };
8
+ //# sourceMappingURL=constants.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/file/constants.ts"],"sourcesContent":["export const WINDOWS_NEWLINE_REGEX = /\\r\\n/g\nexport const CROSS_PLATFORM_NEWLINE = '\\n'\n"],"mappings":";AAAO,IAAM,wBAAwB;AAC9B,IAAM,yBAAyB;","names":[]}
@@ -0,0 +1,32 @@
1
+ // src/lib/file/fileLines.ts
2
+ import {
3
+ existsSync,
4
+ readFileSync,
5
+ writeFileSync
6
+ } from "fs";
7
+
8
+ // src/lib/string/empty.ts
9
+ var empty = (value) => value?.trim().length === 0;
10
+ var notEmpty = (value) => !empty(value);
11
+
12
+ // src/lib/file/constants.ts
13
+ var WINDOWS_NEWLINE_REGEX = /\r\n/g;
14
+ var CROSS_PLATFORM_NEWLINE = "\n";
15
+
16
+ // src/lib/file/ReadFileSyncOptions.ts
17
+ var defaultReadFileSyncOptions = { encoding: "utf8" };
18
+
19
+ // src/lib/file/fileLines.ts
20
+ var readLines = (uri, options = defaultReadFileSyncOptions) => existsSync(uri) ? readFileSync(uri, options).replace(WINDOWS_NEWLINE_REGEX, CROSS_PLATFORM_NEWLINE).split(CROSS_PLATFORM_NEWLINE) : [];
21
+ var readNonEmptyLines = (uri, options = defaultReadFileSyncOptions) => readLines(uri, options).filter(notEmpty);
22
+ var writeLines = (uri, lines, options = defaultReadFileSyncOptions) => {
23
+ const existing = existsSync(uri) ? readFileSync(uri, options) : void 0;
24
+ const desired = lines.join(CROSS_PLATFORM_NEWLINE);
25
+ if (existing !== desired) writeFileSync(uri, desired, options);
26
+ };
27
+ export {
28
+ readLines,
29
+ readNonEmptyLines,
30
+ writeLines
31
+ };
32
+ //# sourceMappingURL=fileLines.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/file/fileLines.ts","../../../src/lib/string/empty.ts","../../../src/lib/file/constants.ts","../../../src/lib/file/ReadFileSyncOptions.ts"],"sourcesContent":["import type { PathLike, WriteFileOptions } from 'node:fs'\nimport {\n existsSync, readFileSync,\n writeFileSync,\n} from 'node:fs'\n\nimport { notEmpty } from '../string/index.ts'\nimport { CROSS_PLATFORM_NEWLINE, WINDOWS_NEWLINE_REGEX } from './constants.ts'\nimport type { ReadFileSyncOptions } from './ReadFileSyncOptions.ts'\nimport { defaultReadFileSyncOptions } from './ReadFileSyncOptions.ts'\n\nexport const readLines = (uri: PathLike, options: ReadFileSyncOptions = defaultReadFileSyncOptions): string[] =>\n existsSync(uri)\n ? readFileSync(uri, options).replace(WINDOWS_NEWLINE_REGEX, CROSS_PLATFORM_NEWLINE).split(CROSS_PLATFORM_NEWLINE)\n : []\n\nexport const readNonEmptyLines = (uri: PathLike, options: ReadFileSyncOptions = defaultReadFileSyncOptions): string[] =>\n readLines(uri, options).filter(notEmpty)\n\nexport const writeLines = (uri: PathLike, lines: string[], options: WriteFileOptions = defaultReadFileSyncOptions) => {\n const existing = existsSync(uri) ? readFileSync(uri, options) : undefined\n const desired = lines.join(CROSS_PLATFORM_NEWLINE)\n // Check if the file is different before writing\n if (existing !== desired) writeFileSync(uri, desired, options)\n}\n","export const empty = (value?: string): boolean => value?.trim().length === 0\nexport const notEmpty = (value?: string): boolean => !empty(value)\n","export const WINDOWS_NEWLINE_REGEX = /\\r\\n/g\nexport const CROSS_PLATFORM_NEWLINE = '\\n'\n","export type ReadFileSyncOptions = BufferEncoding | {\n encoding: BufferEncoding\n flags?: string\n}\n\nexport const defaultReadFileSyncOptions: ReadFileSyncOptions = { encoding: 'utf8' }\n"],"mappings":";AACA;AAAA,EACE;AAAA,EAAY;AAAA,EACZ;AAAA,OACK;;;ACJA,IAAM,QAAQ,CAAC,UAA4B,OAAO,KAAK,EAAE,WAAW;AACpE,IAAM,WAAW,CAAC,UAA4B,CAAC,MAAM,KAAK;;;ACD1D,IAAM,wBAAwB;AAC9B,IAAM,yBAAyB;;;ACI/B,IAAM,6BAAkD,EAAE,UAAU,OAAO;;;AHM3E,IAAM,YAAY,CAAC,KAAe,UAA+B,+BACtE,WAAW,GAAG,IACV,aAAa,KAAK,OAAO,EAAE,QAAQ,uBAAuB,sBAAsB,EAAE,MAAM,sBAAsB,IAC9G,CAAC;AAEA,IAAM,oBAAoB,CAAC,KAAe,UAA+B,+BAC9E,UAAU,KAAK,OAAO,EAAE,OAAO,QAAQ;AAElC,IAAM,aAAa,CAAC,KAAe,OAAiB,UAA4B,+BAA+B;AACpH,QAAM,WAAW,WAAW,GAAG,IAAI,aAAa,KAAK,OAAO,IAAI;AAChE,QAAM,UAAU,MAAM,KAAK,sBAAsB;AAEjD,MAAI,aAAa,QAAS,eAAc,KAAK,SAAS,OAAO;AAC/D;","names":[]}
@@ -0,0 +1,42 @@
1
+ // src/lib/file/constants.ts
2
+ var WINDOWS_NEWLINE_REGEX = /\r\n/g;
3
+ var CROSS_PLATFORM_NEWLINE = "\n";
4
+
5
+ // src/lib/file/fileLines.ts
6
+ import {
7
+ existsSync,
8
+ readFileSync,
9
+ writeFileSync
10
+ } from "fs";
11
+
12
+ // src/lib/string/empty.ts
13
+ var empty = (value) => value?.trim().length === 0;
14
+ var notEmpty = (value) => !empty(value);
15
+
16
+ // src/lib/file/ReadFileSyncOptions.ts
17
+ var defaultReadFileSyncOptions = { encoding: "utf8" };
18
+
19
+ // src/lib/file/fileLines.ts
20
+ var readLines = (uri, options = defaultReadFileSyncOptions) => existsSync(uri) ? readFileSync(uri, options).replace(WINDOWS_NEWLINE_REGEX, CROSS_PLATFORM_NEWLINE).split(CROSS_PLATFORM_NEWLINE) : [];
21
+ var readNonEmptyLines = (uri, options = defaultReadFileSyncOptions) => readLines(uri, options).filter(notEmpty);
22
+ var writeLines = (uri, lines, options = defaultReadFileSyncOptions) => {
23
+ const existing = existsSync(uri) ? readFileSync(uri, options) : void 0;
24
+ const desired = lines.join(CROSS_PLATFORM_NEWLINE);
25
+ if (existing !== desired) writeFileSync(uri, desired, options);
26
+ };
27
+
28
+ // src/lib/file/tryReadFileSync.ts
29
+ import { existsSync as existsSync2, readFileSync as readFileSync2 } from "fs";
30
+ var tryReadFileSync = (uri, options = defaultReadFileSyncOptions) => {
31
+ return existsSync2(uri) ? readFileSync2(uri, options) : void 0;
32
+ };
33
+ export {
34
+ CROSS_PLATFORM_NEWLINE,
35
+ WINDOWS_NEWLINE_REGEX,
36
+ defaultReadFileSyncOptions,
37
+ readLines,
38
+ readNonEmptyLines,
39
+ tryReadFileSync,
40
+ writeLines
41
+ };
42
+ //# sourceMappingURL=index.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/file/constants.ts","../../../src/lib/file/fileLines.ts","../../../src/lib/string/empty.ts","../../../src/lib/file/ReadFileSyncOptions.ts","../../../src/lib/file/tryReadFileSync.ts"],"sourcesContent":["export const WINDOWS_NEWLINE_REGEX = /\\r\\n/g\nexport const CROSS_PLATFORM_NEWLINE = '\\n'\n","import type { PathLike, WriteFileOptions } from 'node:fs'\nimport {\n existsSync, readFileSync,\n writeFileSync,\n} from 'node:fs'\n\nimport { notEmpty } from '../string/index.ts'\nimport { CROSS_PLATFORM_NEWLINE, WINDOWS_NEWLINE_REGEX } from './constants.ts'\nimport type { ReadFileSyncOptions } from './ReadFileSyncOptions.ts'\nimport { defaultReadFileSyncOptions } from './ReadFileSyncOptions.ts'\n\nexport const readLines = (uri: PathLike, options: ReadFileSyncOptions = defaultReadFileSyncOptions): string[] =>\n existsSync(uri)\n ? readFileSync(uri, options).replace(WINDOWS_NEWLINE_REGEX, CROSS_PLATFORM_NEWLINE).split(CROSS_PLATFORM_NEWLINE)\n : []\n\nexport const readNonEmptyLines = (uri: PathLike, options: ReadFileSyncOptions = defaultReadFileSyncOptions): string[] =>\n readLines(uri, options).filter(notEmpty)\n\nexport const writeLines = (uri: PathLike, lines: string[], options: WriteFileOptions = defaultReadFileSyncOptions) => {\n const existing = existsSync(uri) ? readFileSync(uri, options) : undefined\n const desired = lines.join(CROSS_PLATFORM_NEWLINE)\n // Check if the file is different before writing\n if (existing !== desired) writeFileSync(uri, desired, options)\n}\n","export const empty = (value?: string): boolean => value?.trim().length === 0\nexport const notEmpty = (value?: string): boolean => !empty(value)\n","export type ReadFileSyncOptions = BufferEncoding | {\n encoding: BufferEncoding\n flags?: string\n}\n\nexport const defaultReadFileSyncOptions: ReadFileSyncOptions = { encoding: 'utf8' }\n","import type { PathLike } from 'node:fs'\nimport { existsSync, readFileSync } from 'node:fs'\n\nimport type { ReadFileSyncOptions } from './ReadFileSyncOptions.ts'\nimport { defaultReadFileSyncOptions } from './ReadFileSyncOptions.ts'\n\nexport const tryReadFileSync = (uri: PathLike, options: ReadFileSyncOptions = defaultReadFileSyncOptions): string | undefined => {\n return existsSync(uri) ? readFileSync(uri, options) : undefined\n}\n"],"mappings":";AAAO,IAAM,wBAAwB;AAC9B,IAAM,yBAAyB;;;ACAtC;AAAA,EACE;AAAA,EAAY;AAAA,EACZ;AAAA,OACK;;;ACJA,IAAM,QAAQ,CAAC,UAA4B,OAAO,KAAK,EAAE,WAAW;AACpE,IAAM,WAAW,CAAC,UAA4B,CAAC,MAAM,KAAK;;;ACI1D,IAAM,6BAAkD,EAAE,UAAU,OAAO;;;AFM3E,IAAM,YAAY,CAAC,KAAe,UAA+B,+BACtE,WAAW,GAAG,IACV,aAAa,KAAK,OAAO,EAAE,QAAQ,uBAAuB,sBAAsB,EAAE,MAAM,sBAAsB,IAC9G,CAAC;AAEA,IAAM,oBAAoB,CAAC,KAAe,UAA+B,+BAC9E,UAAU,KAAK,OAAO,EAAE,OAAO,QAAQ;AAElC,IAAM,aAAa,CAAC,KAAe,OAAiB,UAA4B,+BAA+B;AACpH,QAAM,WAAW,WAAW,GAAG,IAAI,aAAa,KAAK,OAAO,IAAI;AAChE,QAAM,UAAU,MAAM,KAAK,sBAAsB;AAEjD,MAAI,aAAa,QAAS,eAAc,KAAK,SAAS,OAAO;AAC/D;;;AGvBA,SAAS,cAAAA,aAAY,gBAAAC,qBAAoB;AAKlC,IAAM,kBAAkB,CAAC,KAAe,UAA+B,+BAAmD;AAC/H,SAAOC,YAAW,GAAG,IAAIC,cAAa,KAAK,OAAO,IAAI;AACxD;","names":["existsSync","readFileSync","existsSync","readFileSync"]}
@@ -0,0 +1,14 @@
1
+ // src/lib/file/tryReadFileSync.ts
2
+ import { existsSync, readFileSync } from "fs";
3
+
4
+ // src/lib/file/ReadFileSyncOptions.ts
5
+ var defaultReadFileSyncOptions = { encoding: "utf8" };
6
+
7
+ // src/lib/file/tryReadFileSync.ts
8
+ var tryReadFileSync = (uri, options = defaultReadFileSyncOptions) => {
9
+ return existsSync(uri) ? readFileSync(uri, options) : void 0;
10
+ };
11
+ export {
12
+ tryReadFileSync
13
+ };
14
+ //# sourceMappingURL=tryReadFileSync.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../src/lib/file/tryReadFileSync.ts","../../../src/lib/file/ReadFileSyncOptions.ts"],"sourcesContent":["import type { PathLike } from 'node:fs'\nimport { existsSync, readFileSync } from 'node:fs'\n\nimport type { ReadFileSyncOptions } from './ReadFileSyncOptions.ts'\nimport { defaultReadFileSyncOptions } from './ReadFileSyncOptions.ts'\n\nexport const tryReadFileSync = (uri: PathLike, options: ReadFileSyncOptions = defaultReadFileSyncOptions): string | undefined => {\n return existsSync(uri) ? readFileSync(uri, options) : undefined\n}\n","export type ReadFileSyncOptions = BufferEncoding | {\n encoding: BufferEncoding\n flags?: string\n}\n\nexport const defaultReadFileSyncOptions: ReadFileSyncOptions = { encoding: 'utf8' }\n"],"mappings":";AACA,SAAS,YAAY,oBAAoB;;;ACIlC,IAAM,6BAAkD,EAAE,UAAU,OAAO;;;ADC3E,IAAM,kBAAkB,CAAC,KAAe,UAA+B,+BAAmD;AAC/H,SAAO,WAAW,GAAG,IAAI,aAAa,KAAK,OAAO,IAAI;AACxD;","names":[]}
@@ -0,0 +1,8 @@
1
+ // src/lib/fillTemplate.ts
2
+ function fillTemplate(template, data) {
3
+ return template.replaceAll(/\{\{(.*?)\}\}/g, (_, key) => data[key.trim()] ?? "");
4
+ }
5
+ export {
6
+ fillTemplate
7
+ };
8
+ //# sourceMappingURL=fillTemplate.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../src/lib/fillTemplate.ts"],"sourcesContent":["export function fillTemplate(template: string, data: Record<string, string>): string {\n return template.replaceAll(/\\{\\{(.*?)\\}\\}/g, (_, key: string) => data[key.trim()] ?? '')\n}\n"],"mappings":";AAAO,SAAS,aAAa,UAAkB,MAAsC;AACnF,SAAO,SAAS,WAAW,kBAAkB,CAAC,GAAG,QAAgB,KAAK,IAAI,KAAK,CAAC,KAAK,EAAE;AACzF;","names":[]}
@@ -0,0 +1,86 @@
1
+ // src/lib/generateIgnoreFiles.ts
2
+ import chalk from "chalk";
3
+
4
+ // src/pm/detectPackageManager.ts
5
+ import { existsSync } from "fs";
6
+ function detectPackageManager() {
7
+ if (existsSync("pnpm-lock.yaml") || existsSync("pnpm-workspace.yaml")) return "pnpm";
8
+ return "yarn";
9
+ }
10
+
11
+ // src/pm/registry.ts
12
+ var implementations = /* @__PURE__ */ new Map();
13
+ function getPackageManager(name) {
14
+ const pmName = name ?? detectPackageManager();
15
+ const pm = implementations.get(pmName);
16
+ if (!pm) {
17
+ throw new Error(
18
+ `No package manager implementation registered for "${pmName}". Ensure registerPackageManager() has been called before getPackageManager().`
19
+ );
20
+ }
21
+ return pm;
22
+ }
23
+
24
+ // src/lib/file/constants.ts
25
+ var WINDOWS_NEWLINE_REGEX = /\r\n/g;
26
+ var CROSS_PLATFORM_NEWLINE = "\n";
27
+
28
+ // src/lib/file/fileLines.ts
29
+ import {
30
+ existsSync as existsSync2,
31
+ readFileSync,
32
+ writeFileSync
33
+ } from "fs";
34
+
35
+ // src/lib/string/empty.ts
36
+ var empty = (value) => value?.trim().length === 0;
37
+ var notEmpty = (value) => !empty(value);
38
+
39
+ // src/lib/string/union.ts
40
+ var union = (a, b) => /* @__PURE__ */ new Set([...new Set(a), ...new Set(b)]);
41
+
42
+ // src/lib/file/ReadFileSyncOptions.ts
43
+ var defaultReadFileSyncOptions = { encoding: "utf8" };
44
+
45
+ // src/lib/file/fileLines.ts
46
+ var readLines = (uri, options = defaultReadFileSyncOptions) => existsSync2(uri) ? readFileSync(uri, options).replace(WINDOWS_NEWLINE_REGEX, CROSS_PLATFORM_NEWLINE).split(CROSS_PLATFORM_NEWLINE) : [];
47
+ var readNonEmptyLines = (uri, options = defaultReadFileSyncOptions) => readLines(uri, options).filter(notEmpty);
48
+ var writeLines = (uri, lines, options = defaultReadFileSyncOptions) => {
49
+ const existing = existsSync2(uri) ? readFileSync(uri, options) : void 0;
50
+ const desired = lines.join(CROSS_PLATFORM_NEWLINE);
51
+ if (existing !== desired) writeFileSync(uri, desired, options);
52
+ };
53
+
54
+ // src/lib/initCwd.ts
55
+ function INIT_CWD() {
56
+ return process.env.INIT_CWD ?? process.cwd();
57
+ }
58
+
59
+ // src/lib/generateIgnoreFiles.ts
60
+ var localeCompare = (a, b) => a.localeCompare(b);
61
+ var mergeEntries = (a, b) => [...union(a, b)].toSorted(localeCompare);
62
+ var generateIgnoreFiles = (filename, pkg) => {
63
+ console.log(chalk.green(`Generate ${filename} Files`));
64
+ const cwd = INIT_CWD();
65
+ const pm = getPackageManager();
66
+ const singleWorkspace = pkg ? pm.findWorkspace(pkg) : void 0;
67
+ const workspaces = singleWorkspace ? [singleWorkspace] : pm.listWorkspaces();
68
+ const readEntries = (location) => readNonEmptyLines(`${location}/${filename}`);
69
+ const writeEntries = (location, entries) => writeLines(`${location}/${filename}`, entries);
70
+ const results = workspaces.map(({ location, name }) => {
71
+ try {
72
+ writeEntries(location, mergeEntries(readEntries(cwd), readEntries(location)));
73
+ return 0;
74
+ } catch (ex) {
75
+ const error = ex;
76
+ console.error(`Generate ${filename} Files [${name}] [${error.message}]`);
77
+ return 1;
78
+ }
79
+ });
80
+ const succeeded = results.every((result) => result === 0);
81
+ return succeeded ? 0 : 1;
82
+ };
83
+ export {
84
+ generateIgnoreFiles
85
+ };
86
+ //# sourceMappingURL=generateIgnoreFiles.mjs.map