@xylabs/ts-scripts-common 7.5.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 (408) hide show
  1. package/dist/actions/build.mjs +161 -0
  2. package/dist/actions/build.mjs.map +1 -0
  3. package/dist/actions/claude-clean.mjs +71 -0
  4. package/dist/actions/claude-clean.mjs.map +1 -0
  5. package/dist/actions/claude-commands.mjs +112 -0
  6. package/dist/actions/claude-commands.mjs.map +1 -0
  7. package/dist/actions/claude-rules.mjs +137 -0
  8. package/dist/actions/claude-rules.mjs.map +1 -0
  9. package/dist/actions/claude-settings.mjs +85 -0
  10. package/dist/actions/claude-settings.mjs.map +1 -0
  11. package/dist/actions/claude-skills.mjs +120 -0
  12. package/dist/actions/claude-skills.mjs.map +1 -0
  13. package/dist/actions/clean-docs.mjs +45 -0
  14. package/dist/actions/clean-docs.mjs.map +1 -0
  15. package/dist/actions/clean-eslint.mjs +26 -0
  16. package/dist/actions/clean-eslint.mjs.map +1 -0
  17. package/dist/actions/clean.mjs +145 -0
  18. package/dist/actions/clean.mjs.map +1 -0
  19. package/dist/actions/compile.mjs +172 -0
  20. package/dist/actions/compile.mjs.map +1 -0
  21. package/dist/actions/copy-assets.mjs +81 -0
  22. package/dist/actions/copy-assets.mjs.map +1 -0
  23. package/dist/actions/cycle.mjs +165 -0
  24. package/dist/actions/cycle.mjs.map +1 -0
  25. package/dist/actions/dead.mjs +98 -0
  26. package/dist/actions/dead.mjs.map +1 -0
  27. package/dist/actions/deplint/checkPackage/checkPackage.mjs +672 -0
  28. package/dist/actions/deplint/checkPackage/checkPackage.mjs.map +1 -0
  29. package/dist/actions/deplint/checkPackage/checkPackageTypes.mjs +1 -0
  30. package/dist/actions/deplint/checkPackage/checkPackageTypes.mjs.map +1 -0
  31. package/dist/actions/deplint/checkPackage/getUnlistedDependencies.mjs +48 -0
  32. package/dist/actions/deplint/checkPackage/getUnlistedDependencies.mjs.map +1 -0
  33. package/dist/actions/deplint/checkPackage/getUnlistedDevDependencies.mjs +33 -0
  34. package/dist/actions/deplint/checkPackage/getUnlistedDevDependencies.mjs.map +1 -0
  35. package/dist/actions/deplint/checkPackage/getUnusedDependencies.mjs +30 -0
  36. package/dist/actions/deplint/checkPackage/getUnusedDependencies.mjs.map +1 -0
  37. package/dist/actions/deplint/checkPackage/getUnusedDevDependencies.mjs +309 -0
  38. package/dist/actions/deplint/checkPackage/getUnusedDevDependencies.mjs.map +1 -0
  39. package/dist/actions/deplint/checkPackage/getUnusedPeerDependencies.mjs +26 -0
  40. package/dist/actions/deplint/checkPackage/getUnusedPeerDependencies.mjs.map +1 -0
  41. package/dist/actions/deplint/checkPackage/index.mjs +672 -0
  42. package/dist/actions/deplint/checkPackage/index.mjs.map +1 -0
  43. package/dist/actions/deplint/deplint.mjs +770 -0
  44. package/dist/actions/deplint/deplint.mjs.map +1 -0
  45. package/dist/actions/deplint/findFiles.mjs +39 -0
  46. package/dist/actions/deplint/findFiles.mjs.map +1 -0
  47. package/dist/actions/deplint/findFilesByGlob.mjs +14 -0
  48. package/dist/actions/deplint/findFilesByGlob.mjs.map +1 -0
  49. package/dist/actions/deplint/getBasePackageName.mjs +13 -0
  50. package/dist/actions/deplint/getBasePackageName.mjs.map +1 -0
  51. package/dist/actions/deplint/getCliReferencedPackagesFromFiles.mjs +140 -0
  52. package/dist/actions/deplint/getCliReferencedPackagesFromFiles.mjs.map +1 -0
  53. package/dist/actions/deplint/getDependenciesFromPackageJson.mjs +20 -0
  54. package/dist/actions/deplint/getDependenciesFromPackageJson.mjs.map +1 -0
  55. package/dist/actions/deplint/getExtendsFromTsconfigs.mjs +44 -0
  56. package/dist/actions/deplint/getExtendsFromTsconfigs.mjs.map +1 -0
  57. package/dist/actions/deplint/getExternalImportsFromFiles.mjs +122 -0
  58. package/dist/actions/deplint/getExternalImportsFromFiles.mjs.map +1 -0
  59. package/dist/actions/deplint/getImportsFromFile.mjs +85 -0
  60. package/dist/actions/deplint/getImportsFromFile.mjs.map +1 -0
  61. package/dist/actions/deplint/getRequiredPeerDependencies.mjs +36 -0
  62. package/dist/actions/deplint/getRequiredPeerDependencies.mjs.map +1 -0
  63. package/dist/actions/deplint/getScriptReferencedPackages.mjs +83 -0
  64. package/dist/actions/deplint/getScriptReferencedPackages.mjs.map +1 -0
  65. package/dist/actions/deplint/implicitDevDependencies.mjs +80 -0
  66. package/dist/actions/deplint/implicitDevDependencies.mjs.map +1 -0
  67. package/dist/actions/deplint/index.mjs +770 -0
  68. package/dist/actions/deplint/index.mjs.map +1 -0
  69. package/dist/actions/dupdeps.mjs +205 -0
  70. package/dist/actions/dupdeps.mjs.map +1 -0
  71. package/dist/actions/fix.mjs +163 -0
  72. package/dist/actions/fix.mjs.map +1 -0
  73. package/dist/actions/gen-docs.mjs +130 -0
  74. package/dist/actions/gen-docs.mjs.map +1 -0
  75. package/dist/actions/gitignore.mjs +160 -0
  76. package/dist/actions/gitignore.mjs.map +1 -0
  77. package/dist/actions/gitlint-fix.mjs +27 -0
  78. package/dist/actions/gitlint-fix.mjs.map +1 -0
  79. package/dist/actions/gitlint.mjs +48 -0
  80. package/dist/actions/gitlint.mjs.map +1 -0
  81. package/dist/actions/index.mjs +4129 -0
  82. package/dist/actions/index.mjs.map +1 -0
  83. package/dist/actions/knip.mjs +98 -0
  84. package/dist/actions/knip.mjs.map +1 -0
  85. package/dist/actions/license.mjs +92 -0
  86. package/dist/actions/license.mjs.map +1 -0
  87. package/dist/actions/lint.mjs +160 -0
  88. package/dist/actions/lint.mjs.map +1 -0
  89. package/dist/actions/lintlint.mjs +230 -0
  90. package/dist/actions/lintlint.mjs.map +1 -0
  91. package/dist/actions/npmignore-gen.mjs +91 -0
  92. package/dist/actions/npmignore-gen.mjs.map +1 -0
  93. package/dist/actions/package/clean-outputs.mjs +29 -0
  94. package/dist/actions/package/clean-outputs.mjs.map +1 -0
  95. package/dist/actions/package/clean-typescript.mjs +29 -0
  96. package/dist/actions/package/clean-typescript.mjs.map +1 -0
  97. package/dist/actions/package/clean.mjs +48 -0
  98. package/dist/actions/package/clean.mjs.map +1 -0
  99. package/dist/actions/package/compile/XyConfig.mjs +1 -0
  100. package/dist/actions/package/compile/XyConfig.mjs.map +1 -0
  101. package/dist/actions/package/compile/buildEntries.mjs +53 -0
  102. package/dist/actions/package/compile/buildEntries.mjs.map +1 -0
  103. package/dist/actions/package/compile/compile.mjs +433 -0
  104. package/dist/actions/package/compile/compile.mjs.map +1 -0
  105. package/dist/actions/package/compile/copyTypeFiles.mjs +34 -0
  106. package/dist/actions/package/compile/copyTypeFiles.mjs.map +1 -0
  107. package/dist/actions/package/compile/deepMerge.mjs +26 -0
  108. package/dist/actions/package/compile/deepMerge.mjs.map +1 -0
  109. package/dist/actions/package/compile/getCompilerOptions.mjs +12 -0
  110. package/dist/actions/package/compile/getCompilerOptions.mjs.map +1 -0
  111. package/dist/actions/package/compile/index.mjs +436 -0
  112. package/dist/actions/package/compile/index.mjs.map +1 -0
  113. package/dist/actions/package/compile/inputs.mjs +22 -0
  114. package/dist/actions/package/compile/inputs.mjs.map +1 -0
  115. package/dist/actions/package/compile/packageCompileTsc.mjs +94 -0
  116. package/dist/actions/package/compile/packageCompileTsc.mjs.map +1 -0
  117. package/dist/actions/package/compile/packageCompileTscTypes.mjs +92 -0
  118. package/dist/actions/package/compile/packageCompileTscTypes.mjs.map +1 -0
  119. package/dist/actions/package/compile/packageCompileTsup.mjs +402 -0
  120. package/dist/actions/package/compile/packageCompileTsup.mjs.map +1 -0
  121. package/dist/actions/package/copy-assets.mjs +46 -0
  122. package/dist/actions/package/copy-assets.mjs.map +1 -0
  123. package/dist/actions/package/cycle.mjs +39 -0
  124. package/dist/actions/package/cycle.mjs.map +1 -0
  125. package/dist/actions/package/gen-docs.mjs +114 -0
  126. package/dist/actions/package/gen-docs.mjs.map +1 -0
  127. package/dist/actions/package/index.mjs +825 -0
  128. package/dist/actions/package/index.mjs.map +1 -0
  129. package/dist/actions/package/lint.mjs +80 -0
  130. package/dist/actions/package/lint.mjs.map +1 -0
  131. package/dist/actions/package/publint.mjs +66 -0
  132. package/dist/actions/package/publint.mjs.map +1 -0
  133. package/dist/actions/package/recompile.mjs +483 -0
  134. package/dist/actions/package/recompile.mjs.map +1 -0
  135. package/dist/actions/package-lint.mjs +186 -0
  136. package/dist/actions/package-lint.mjs.map +1 -0
  137. package/dist/actions/packman/convert.mjs +387 -0
  138. package/dist/actions/packman/convert.mjs.map +1 -0
  139. package/dist/actions/packman/convertToPnpm.mjs +149 -0
  140. package/dist/actions/packman/convertToPnpm.mjs.map +1 -0
  141. package/dist/actions/packman/convertToYarn.mjs +171 -0
  142. package/dist/actions/packman/convertToYarn.mjs.map +1 -0
  143. package/dist/actions/packman/index.mjs +389 -0
  144. package/dist/actions/packman/index.mjs.map +1 -0
  145. package/dist/actions/packman/rewriteScripts.mjs +52 -0
  146. package/dist/actions/packman/rewriteScripts.mjs.map +1 -0
  147. package/dist/actions/publint.mjs +187 -0
  148. package/dist/actions/publint.mjs.map +1 -0
  149. package/dist/actions/readme-gen.mjs +292 -0
  150. package/dist/actions/readme-gen.mjs.map +1 -0
  151. package/dist/actions/readme-init.mjs +83 -0
  152. package/dist/actions/readme-init.mjs.map +1 -0
  153. package/dist/actions/rebuild.mjs +122 -0
  154. package/dist/actions/rebuild.mjs.map +1 -0
  155. package/dist/actions/recompile.mjs +188 -0
  156. package/dist/actions/recompile.mjs.map +1 -0
  157. package/dist/actions/relint.mjs +160 -0
  158. package/dist/actions/relint.mjs.map +1 -0
  159. package/dist/actions/retest.mjs +129 -0
  160. package/dist/actions/retest.mjs.map +1 -0
  161. package/dist/actions/sonar.mjs +98 -0
  162. package/dist/actions/sonar.mjs.map +1 -0
  163. package/dist/actions/statics.mjs +204 -0
  164. package/dist/actions/statics.mjs.map +1 -0
  165. package/dist/actions/test.mjs +123 -0
  166. package/dist/actions/test.mjs.map +1 -0
  167. package/dist/bin/package/build-only.mjs +445 -0
  168. package/dist/bin/package/build-only.mjs.map +1 -0
  169. package/dist/bin/package/build.mjs +445 -0
  170. package/dist/bin/package/build.mjs.map +1 -0
  171. package/dist/bin/package/clean-outputs.mjs +29 -0
  172. package/dist/bin/package/clean-outputs.mjs.map +1 -0
  173. package/dist/bin/package/clean-typescript.mjs +29 -0
  174. package/dist/bin/package/clean-typescript.mjs.map +1 -0
  175. package/dist/bin/package/clean.mjs +53 -0
  176. package/dist/bin/package/clean.mjs.map +1 -0
  177. package/dist/bin/package/compile-only.mjs +441 -0
  178. package/dist/bin/package/compile-only.mjs.map +1 -0
  179. package/dist/bin/package/compile-tsup.mjs +409 -0
  180. package/dist/bin/package/compile-tsup.mjs.map +1 -0
  181. package/dist/bin/package/compile.mjs +445 -0
  182. package/dist/bin/package/compile.mjs.map +1 -0
  183. package/dist/bin/package/copy-assets-cjs.mjs +54 -0
  184. package/dist/bin/package/copy-assets-cjs.mjs.map +1 -0
  185. package/dist/bin/package/copy-assets-esm.mjs +54 -0
  186. package/dist/bin/package/copy-assets-esm.mjs.map +1 -0
  187. package/dist/bin/package/cycle.mjs +51 -0
  188. package/dist/bin/package/cycle.mjs.map +1 -0
  189. package/dist/bin/package/fix.mjs +92 -0
  190. package/dist/bin/package/fix.mjs.map +1 -0
  191. package/dist/bin/package/gen-docs.mjs +121 -0
  192. package/dist/bin/package/gen-docs.mjs.map +1 -0
  193. package/dist/bin/package/lint-verbose.mjs +92 -0
  194. package/dist/bin/package/lint-verbose.mjs.map +1 -0
  195. package/dist/bin/package/lint.mjs +92 -0
  196. package/dist/bin/package/lint.mjs.map +1 -0
  197. package/dist/bin/package/publint.mjs +75 -0
  198. package/dist/bin/package/publint.mjs.map +1 -0
  199. package/dist/bin/package/recompile.mjs +489 -0
  200. package/dist/bin/package/recompile.mjs.map +1 -0
  201. package/dist/bin/package/relint.mjs +92 -0
  202. package/dist/bin/package/relint.mjs.map +1 -0
  203. package/dist/bin/xy.mjs +3826 -0
  204. package/dist/bin/xy.mjs.map +1 -0
  205. package/dist/index.d.ts +564 -0
  206. package/dist/index.mjs +4979 -0
  207. package/dist/index.mjs.map +1 -0
  208. package/dist/lib/checkResult.mjs +16 -0
  209. package/dist/lib/checkResult.mjs.map +1 -0
  210. package/dist/lib/claudeMdTemplate.mjs +65 -0
  211. package/dist/lib/claudeMdTemplate.mjs.map +1 -0
  212. package/dist/lib/createBuildConfig.mjs +55 -0
  213. package/dist/lib/createBuildConfig.mjs.map +1 -0
  214. package/dist/lib/defaultBuildConfig.mjs +23 -0
  215. package/dist/lib/defaultBuildConfig.mjs.map +1 -0
  216. package/dist/lib/deleteGlob.mjs +13 -0
  217. package/dist/lib/deleteGlob.mjs.map +1 -0
  218. package/dist/lib/dependencies/DuplicateDetector.mjs +81 -0
  219. package/dist/lib/dependencies/DuplicateDetector.mjs.map +1 -0
  220. package/dist/lib/dependencies/detectDuplicateDependencies.mjs +185 -0
  221. package/dist/lib/dependencies/detectDuplicateDependencies.mjs.map +1 -0
  222. package/dist/lib/dependencies/index.mjs +186 -0
  223. package/dist/lib/dependencies/index.mjs.map +1 -0
  224. package/dist/lib/file/ReadFileSyncOptions.mjs +6 -0
  225. package/dist/lib/file/ReadFileSyncOptions.mjs.map +1 -0
  226. package/dist/lib/file/constants.mjs +8 -0
  227. package/dist/lib/file/constants.mjs.map +1 -0
  228. package/dist/lib/file/fileLines.mjs +32 -0
  229. package/dist/lib/file/fileLines.mjs.map +1 -0
  230. package/dist/lib/file/index.mjs +42 -0
  231. package/dist/lib/file/index.mjs.map +1 -0
  232. package/dist/lib/file/tryReadFileSync.mjs +14 -0
  233. package/dist/lib/file/tryReadFileSync.mjs.map +1 -0
  234. package/dist/lib/generateIgnoreFiles.mjs +87 -0
  235. package/dist/lib/generateIgnoreFiles.mjs.map +1 -0
  236. package/dist/lib/generateReadmeFiles.mjs +260 -0
  237. package/dist/lib/generateReadmeFiles.mjs.map +1 -0
  238. package/dist/lib/gitignoreTemplate.mjs +12 -0
  239. package/dist/lib/gitignoreTemplate.mjs.map +1 -0
  240. package/dist/lib/index.mjs +834 -0
  241. package/dist/lib/index.mjs.map +1 -0
  242. package/dist/lib/initCwd.mjs +9 -0
  243. package/dist/lib/initCwd.mjs.map +1 -0
  244. package/dist/lib/jsonFormatters.mjs +11 -0
  245. package/dist/lib/jsonFormatters.mjs.map +1 -0
  246. package/dist/lib/loadConfig.mjs +24 -0
  247. package/dist/lib/loadConfig.mjs.map +1 -0
  248. package/dist/lib/parsedPackageJSON.mjs +11 -0
  249. package/dist/lib/parsedPackageJSON.mjs.map +1 -0
  250. package/dist/lib/processEx.mjs +36 -0
  251. package/dist/lib/processEx.mjs.map +1 -0
  252. package/dist/lib/runSteps.mjs +95 -0
  253. package/dist/lib/runSteps.mjs.map +1 -0
  254. package/dist/lib/runStepsAsync.mjs +113 -0
  255. package/dist/lib/runStepsAsync.mjs.map +1 -0
  256. package/dist/lib/runXy.mjs +124 -0
  257. package/dist/lib/runXy.mjs.map +1 -0
  258. package/dist/lib/runXyWithWarning.mjs +36 -0
  259. package/dist/lib/runXyWithWarning.mjs.map +1 -0
  260. package/dist/lib/safeExit.mjs +61 -0
  261. package/dist/lib/safeExit.mjs.map +1 -0
  262. package/dist/lib/string/empty.mjs +8 -0
  263. package/dist/lib/string/empty.mjs.map +1 -0
  264. package/dist/lib/string/index.mjs +12 -0
  265. package/dist/lib/string/index.mjs.map +1 -0
  266. package/dist/lib/string/union.mjs +6 -0
  267. package/dist/lib/string/union.mjs.map +1 -0
  268. package/dist/lib/tryRunLocalScript.mjs +56 -0
  269. package/dist/lib/tryRunLocalScript.mjs.map +1 -0
  270. package/dist/lib/withErrnoException.mjs +13 -0
  271. package/dist/lib/withErrnoException.mjs.map +1 -0
  272. package/dist/lib/withError.mjs +8 -0
  273. package/dist/lib/withError.mjs.map +1 -0
  274. package/dist/loadPackageConfig.mjs +11 -0
  275. package/dist/loadPackageConfig.mjs.map +1 -0
  276. package/dist/pm/PackageManager.mjs +1 -0
  277. package/dist/pm/PackageManager.mjs.map +1 -0
  278. package/dist/pm/detectPackageManager.mjs +10 -0
  279. package/dist/pm/detectPackageManager.mjs.map +1 -0
  280. package/dist/pm/index.mjs +28 -0
  281. package/dist/pm/index.mjs.map +1 -0
  282. package/dist/pm/registry.mjs +27 -0
  283. package/dist/pm/registry.mjs.map +1 -0
  284. package/dist/types.d.mjs +1 -0
  285. package/dist/types.d.mjs.map +1 -0
  286. package/dist/xy/build/buildCommand.mjs +182 -0
  287. package/dist/xy/build/buildCommand.mjs.map +1 -0
  288. package/dist/xy/build/compileCommand.mjs +189 -0
  289. package/dist/xy/build/compileCommand.mjs.map +1 -0
  290. package/dist/xy/build/compileOnlyCommand.mjs +190 -0
  291. package/dist/xy/build/compileOnlyCommand.mjs.map +1 -0
  292. package/dist/xy/build/copyAssetsCommand.mjs +92 -0
  293. package/dist/xy/build/copyAssetsCommand.mjs.map +1 -0
  294. package/dist/xy/build/index.mjs +493 -0
  295. package/dist/xy/build/index.mjs.map +1 -0
  296. package/dist/xy/build/rebuildCommand.mjs +135 -0
  297. package/dist/xy/build/rebuildCommand.mjs.map +1 -0
  298. package/dist/xy/build/recompileCommand.mjs +205 -0
  299. package/dist/xy/build/recompileCommand.mjs.map +1 -0
  300. package/dist/xy/common/claude/cleanCommand.mjs +79 -0
  301. package/dist/xy/common/claude/cleanCommand.mjs.map +1 -0
  302. package/dist/xy/common/claude/commandsCommand.mjs +120 -0
  303. package/dist/xy/common/claude/commandsCommand.mjs.map +1 -0
  304. package/dist/xy/common/claude/index.mjs +546 -0
  305. package/dist/xy/common/claude/index.mjs.map +1 -0
  306. package/dist/xy/common/claude/initCommand.mjs +319 -0
  307. package/dist/xy/common/claude/initCommand.mjs.map +1 -0
  308. package/dist/xy/common/claude/rulesCommand.mjs +153 -0
  309. package/dist/xy/common/claude/rulesCommand.mjs.map +1 -0
  310. package/dist/xy/common/claude/settingsCommand.mjs +93 -0
  311. package/dist/xy/common/claude/settingsCommand.mjs.map +1 -0
  312. package/dist/xy/common/claude/skillsCommand.mjs +129 -0
  313. package/dist/xy/common/claude/skillsCommand.mjs.map +1 -0
  314. package/dist/xy/common/cleanDocsCommand.mjs +53 -0
  315. package/dist/xy/common/cleanDocsCommand.mjs.map +1 -0
  316. package/dist/xy/common/deadCommand.mjs +116 -0
  317. package/dist/xy/common/deadCommand.mjs.map +1 -0
  318. package/dist/xy/common/genDocsCommand.mjs +146 -0
  319. package/dist/xy/common/genDocsCommand.mjs.map +1 -0
  320. package/dist/xy/common/gitignoreCommand.mjs +166 -0
  321. package/dist/xy/common/gitignoreCommand.mjs.map +1 -0
  322. package/dist/xy/common/gitlintCommand.mjs +82 -0
  323. package/dist/xy/common/gitlintCommand.mjs.map +1 -0
  324. package/dist/xy/common/index.mjs +1874 -0
  325. package/dist/xy/common/index.mjs.map +1 -0
  326. package/dist/xy/common/licenseCommand.mjs +108 -0
  327. package/dist/xy/common/licenseCommand.mjs.map +1 -0
  328. package/dist/xy/common/npmignoreGenCommand.mjs +101 -0
  329. package/dist/xy/common/npmignoreGenCommand.mjs.map +1 -0
  330. package/dist/xy/common/packmanCommand.mjs +415 -0
  331. package/dist/xy/common/packmanCommand.mjs.map +1 -0
  332. package/dist/xy/common/readme/genCommand.mjs +324 -0
  333. package/dist/xy/common/readme/genCommand.mjs.map +1 -0
  334. package/dist/xy/common/readme/index.mjs +364 -0
  335. package/dist/xy/common/readme/index.mjs.map +1 -0
  336. package/dist/xy/common/readme/initCommand.mjs +103 -0
  337. package/dist/xy/common/readme/initCommand.mjs.map +1 -0
  338. package/dist/xy/common/retestCommand.mjs +142 -0
  339. package/dist/xy/common/retestCommand.mjs.map +1 -0
  340. package/dist/xy/common/testCommand.mjs +136 -0
  341. package/dist/xy/common/testCommand.mjs.map +1 -0
  342. package/dist/xy/index.mjs +3823 -0
  343. package/dist/xy/index.mjs.map +1 -0
  344. package/dist/xy/lint/cycleCommand.mjs +184 -0
  345. package/dist/xy/lint/cycleCommand.mjs.map +1 -0
  346. package/dist/xy/lint/deplintCommand.mjs +820 -0
  347. package/dist/xy/lint/deplintCommand.mjs.map +1 -0
  348. package/dist/xy/lint/fixCommand.mjs +184 -0
  349. package/dist/xy/lint/fixCommand.mjs.map +1 -0
  350. package/dist/xy/lint/index.mjs +1691 -0
  351. package/dist/xy/lint/index.mjs.map +1 -0
  352. package/dist/xy/lint/knipCommand.mjs +121 -0
  353. package/dist/xy/lint/knipCommand.mjs.map +1 -0
  354. package/dist/xy/lint/lintCommand.mjs +202 -0
  355. package/dist/xy/lint/lintCommand.mjs.map +1 -0
  356. package/dist/xy/lint/lintlintCommand.mjs +250 -0
  357. package/dist/xy/lint/lintlintCommand.mjs.map +1 -0
  358. package/dist/xy/lint/packageLintCommand.mjs +201 -0
  359. package/dist/xy/lint/packageLintCommand.mjs.map +1 -0
  360. package/dist/xy/lint/publintCommand.mjs +208 -0
  361. package/dist/xy/lint/publintCommand.mjs.map +1 -0
  362. package/dist/xy/lint/relintCommand.mjs +179 -0
  363. package/dist/xy/lint/relintCommand.mjs.map +1 -0
  364. package/dist/xy/lint/sonarCommand.mjs +121 -0
  365. package/dist/xy/lint/sonarCommand.mjs.map +1 -0
  366. package/dist/xy/param.mjs +8 -0
  367. package/dist/xy/param.mjs.map +1 -0
  368. package/dist/xy/xy.mjs +3819 -0
  369. package/dist/xy/xy.mjs.map +1 -0
  370. package/dist/xy/xyParseOptions.mjs +91 -0
  371. package/dist/xy/xyParseOptions.mjs.map +1 -0
  372. package/package.json +108 -0
  373. package/templates/claude/CLAUDE-local.md +4 -0
  374. package/templates/claude/CLAUDE-project.md +4 -0
  375. package/templates/claude/commands/xy-build.md +5 -0
  376. package/templates/claude/commands/xy-clean.md +5 -0
  377. package/templates/claude/commands/xy-compile.md +5 -0
  378. package/templates/claude/commands/xy-cycle.md +5 -0
  379. package/templates/claude/commands/xy-dead.md +5 -0
  380. package/templates/claude/commands/xy-deplint.md +5 -0
  381. package/templates/claude/commands/xy-deps.md +24 -0
  382. package/templates/claude/commands/xy-dupdeps.md +5 -0
  383. package/templates/claude/commands/xy-fix.md +5 -0
  384. package/templates/claude/commands/xy-gen-docs.md +5 -0
  385. package/templates/claude/commands/xy-gitignore.md +5 -0
  386. package/templates/claude/commands/xy-gitlint.md +5 -0
  387. package/templates/claude/commands/xy-knip.md +5 -0
  388. package/templates/claude/commands/xy-license.md +5 -0
  389. package/templates/claude/commands/xy-lint-rules.md +44 -0
  390. package/templates/claude/commands/xy-lint.md +5 -0
  391. package/templates/claude/commands/xy-publint.md +5 -0
  392. package/templates/claude/commands/xy-rebuild.md +5 -0
  393. package/templates/claude/commands/xy-recompile.md +5 -0
  394. package/templates/claude/commands/xy-reinstall.md +5 -0
  395. package/templates/claude/commands/xy-relint.md +5 -0
  396. package/templates/claude/commands/xy-retest.md +5 -0
  397. package/templates/claude/commands/xy-sonar.md +5 -0
  398. package/templates/claude/commands/xy-test.md +5 -0
  399. package/templates/claude/commands/xy-up.md +7 -0
  400. package/templates/claude/rules/xylabs-architecture.md +8 -0
  401. package/templates/claude/rules/xylabs-build.md +9 -0
  402. package/templates/claude/rules/xylabs-git-workflow.md +7 -0
  403. package/templates/claude/rules/xylabs-naming.md +7 -0
  404. package/templates/claude/rules/xylabs-style.md +17 -0
  405. package/templates/claude/skills/xylabs-e2e-setup/SKILL.md +223 -0
  406. package/templates/gitignore/template.gitignore +51 -0
  407. package/templates/readme/README.body.md +11 -0
  408. package/templates/readme/README.template.md +22 -0
@@ -0,0 +1,1691 @@
1
+ // src/xy/lint/cycleCommand.ts
2
+ import chalk16 from "chalk";
3
+
4
+ // src/lib/checkResult.ts
5
+ import chalk from "chalk";
6
+ var checkResult = (name, result, level = "error", exitOnFail = false) => {
7
+ if (result) {
8
+ const exiting = exitOnFail ? "[Exiting Process]" : "[Continuing]";
9
+ const chalkFunc = level === "error" ? chalk.red : chalk.yellow;
10
+ console[level](chalkFunc(`${name} had ${result} failures ${exiting}`));
11
+ if (exitOnFail) {
12
+ process.exit(result);
13
+ }
14
+ }
15
+ };
16
+
17
+ // src/pm/detectPackageManager.ts
18
+ import { existsSync } from "fs";
19
+ function detectPackageManager() {
20
+ if (existsSync("pnpm-lock.yaml") || existsSync("pnpm-workspace.yaml")) return "pnpm";
21
+ return "yarn";
22
+ }
23
+
24
+ // src/pm/registry.ts
25
+ var implementations = /* @__PURE__ */ new Map();
26
+ function getPackageManager(name) {
27
+ const pmName = name ?? detectPackageManager();
28
+ const pm = implementations.get(pmName);
29
+ if (!pm) {
30
+ throw new Error(
31
+ `No package manager implementation registered for "${pmName}". Install @xylabs/ts-scripts-${pmName === "yarn" ? "yarn3" : pmName} and ensure it is imported.`
32
+ );
33
+ }
34
+ return pm;
35
+ }
36
+
37
+ // src/lib/processEx.ts
38
+ import chalk2 from "chalk";
39
+
40
+ // src/lib/withError.ts
41
+ var withError = (ex, closure, predicate = (ex2) => !!ex2.name && !!ex2.message) => {
42
+ return predicate(ex) ? closure(ex) : void 0;
43
+ };
44
+
45
+ // src/lib/withErrnoException.ts
46
+ var withErrnoException = (ex, closure) => {
47
+ return withError(ex, closure, (ex2) => ex2.errno !== void 0);
48
+ };
49
+
50
+ // src/lib/processEx.ts
51
+ var processEx = (ex) => {
52
+ const error = typeof ex === "string" ? new Error(ex) : ex;
53
+ const exitCode = withErrnoException(error, (error2) => {
54
+ if (error2.code === "ENOENT") {
55
+ console.error(chalk2.red(`'${error2.path}' not found.`));
56
+ } else {
57
+ console.error(chalk2.red(`Errno: ${error2.code}`));
58
+ }
59
+ return error2.errno ?? -1;
60
+ }) ?? withError(error, (error2) => {
61
+ console.error(chalk2.red(`${error2.name}: ${error2.message}`));
62
+ return -1;
63
+ }) ?? (() => {
64
+ console.error(chalk2.red(`Unexpected Error: ${JSON.stringify(ex, null, 2)}`));
65
+ return -1;
66
+ })();
67
+ process.exit(process.exitCode ?? exitCode);
68
+ };
69
+
70
+ // src/lib/safeExit.ts
71
+ var safeExit = (func, exitOnFail = true) => {
72
+ try {
73
+ const result = func();
74
+ if (result && exitOnFail) {
75
+ process.exit(result);
76
+ }
77
+ return result;
78
+ } catch (ex) {
79
+ return processEx(ex);
80
+ }
81
+ };
82
+ var safeExitAsync = async (func, exitOnFail = true) => {
83
+ try {
84
+ const result = await func();
85
+ if (result && exitOnFail) {
86
+ process.exit(result);
87
+ }
88
+ return result;
89
+ } catch (ex) {
90
+ return processEx(ex);
91
+ }
92
+ };
93
+
94
+ // src/lib/initCwd.ts
95
+ function INIT_CWD() {
96
+ if (!process.env.INIT_CWD) console.error("Missing INIT_CWD");
97
+ return process.env.INIT_CWD;
98
+ }
99
+
100
+ // src/lib/loadConfig.ts
101
+ import chalk3 from "chalk";
102
+ import { cosmiconfig } from "cosmiconfig";
103
+ import { TypeScriptLoader } from "cosmiconfig-typescript-loader";
104
+ import deepmerge from "deepmerge";
105
+ var config;
106
+ var loadConfig = async (params) => {
107
+ if (config === void 0) {
108
+ const cosmicConfigResult = await cosmiconfig("xy", { cache: true, loaders: { ".ts": TypeScriptLoader() } }).search();
109
+ config = cosmicConfigResult?.config;
110
+ const configFilePath = cosmicConfigResult?.filepath;
111
+ if (configFilePath !== void 0) {
112
+ console.log(chalk3.green(`Loaded config from ${configFilePath}`));
113
+ if (config.verbose) {
114
+ console.log(chalk3.gray(`${JSON.stringify(config, null, 2)}`));
115
+ }
116
+ }
117
+ }
118
+ return deepmerge(config, params ?? {});
119
+ };
120
+
121
+ // src/lib/runSteps.ts
122
+ import { spawnSync } from "child_process";
123
+ import { existsSync as existsSync2 } from "fs";
124
+ import chalk4 from "chalk";
125
+ var runSteps = (name, steps, exitOnFail = true, messages) => {
126
+ return safeExit(() => {
127
+ const pkgName = process.env.npm_package_name;
128
+ console.log(chalk4.green(`${name} [${pkgName}]`));
129
+ let totalStatus = 0;
130
+ for (const [i, [command, args, config2]] of steps.entries()) {
131
+ if (messages?.[i]) {
132
+ console.log(chalk4.gray(messages?.[i]));
133
+ }
134
+ const argList = Array.isArray(args) ? args : args.split(" ");
135
+ if (command === "node" && !existsSync2(argList[0])) {
136
+ throw new Error(`File not found [${argList[0]}]`);
137
+ }
138
+ const status = spawnSync(command, Array.isArray(args) ? args : args.split(" "), {
139
+ ...config2,
140
+ encoding: "utf8",
141
+ env: { FORCE_COLOR: "3", ...process.env },
142
+ shell: true,
143
+ stdio: "inherit"
144
+ }).status ?? 0;
145
+ checkResult(name, status, "error", exitOnFail);
146
+ totalStatus += status ?? 0;
147
+ }
148
+ return totalStatus;
149
+ }, !!exitOnFail);
150
+ };
151
+
152
+ // src/lib/runStepsAsync.ts
153
+ import { spawn } from "child_process";
154
+ import { existsSync as existsSync3 } from "fs";
155
+ import chalk5 from "chalk";
156
+ var runStepAsync = (name, step, exitOnFail = true, message) => {
157
+ return new Promise((resolve) => {
158
+ const [command, args, config2] = step;
159
+ if (message) {
160
+ console.log(chalk5.gray(message));
161
+ }
162
+ const argList = Array.isArray(args) ? args : args.split(" ");
163
+ if (command === "node" && !existsSync3(argList[0])) {
164
+ throw new Error(`File not found [${argList[0]}]`);
165
+ }
166
+ spawn(command, Array.isArray(args) ? args : args.split(" "), {
167
+ ...config2,
168
+ env: { FORCE_COLOR: "3", ...process.env },
169
+ shell: true,
170
+ stdio: "inherit"
171
+ }).on("close", (code) => {
172
+ if (code) {
173
+ console.error(
174
+ chalk5.red(
175
+ `Command Exited With Non-Zero Result [${chalk5.gray(code)}] | ${chalk5.yellow(command)} ${chalk5.white(
176
+ Array.isArray(args) ? args.join(" ") : args
177
+ )}`
178
+ )
179
+ );
180
+ checkResult(name, code, "error", exitOnFail);
181
+ resolve(code);
182
+ } else {
183
+ resolve(0);
184
+ }
185
+ });
186
+ });
187
+ };
188
+ var runStepsAsync = async (name, steps, exitOnFail = true, messages) => {
189
+ return await safeExitAsync(async () => {
190
+ const pkgName = process.env.npm_package_name;
191
+ console.log(chalk5.green(`${name} [${pkgName}]`));
192
+ let result = 0;
193
+ for (const [i, step] of steps.entries()) {
194
+ result += await runStepAsync(name, step, exitOnFail, messages?.[i]);
195
+ }
196
+ return result;
197
+ });
198
+ };
199
+
200
+ // src/actions/cycle.ts
201
+ import { cruise } from "dependency-cruiser";
202
+ var cycle = async ({ verbose, pkg } = {}) => {
203
+ return pkg ? cyclePackage({ pkg, verbose }) : await cycleAll({ verbose });
204
+ };
205
+ var cyclePackage = ({ pkg, verbose }) => {
206
+ const pm = getPackageManager();
207
+ const verboseOptions = verbose ? ["--verbose"] : ["--no-verbose"];
208
+ return runSteps(
209
+ `Cycle [${pkg}]`,
210
+ [pm.runInWorkspace(pkg, "package-cycle", verboseOptions)]
211
+ );
212
+ };
213
+ var cycleAll = async ({ verbose = false }) => {
214
+ const pkgName = process.env.npm_package_name;
215
+ const cruiseOptions = {
216
+ ruleSet: {
217
+ forbidden: [
218
+ {
219
+ name: "no-circular",
220
+ severity: "error",
221
+ comment: "This dependency creates a circular reference",
222
+ from: {},
223
+ to: { circular: true }
224
+ }
225
+ ]
226
+ },
227
+ exclude: "node_modules|packages/.*/packages",
228
+ validate: true,
229
+ doNotFollow: { path: "node_modules|packages/.*/packages" },
230
+ tsPreCompilationDeps: false,
231
+ combinedDependencies: true,
232
+ outputType: verbose ? "text" : "err"
233
+ };
234
+ const target = "**/packages/*/src";
235
+ console.log(`Checking for circular dependencies in ${target}...`);
236
+ const result = await cruise([target], cruiseOptions);
237
+ if (result.output) {
238
+ console.log(result.output);
239
+ }
240
+ if (result.exitCode === 0) {
241
+ console.log(`${pkgName} \u2705 No dependency violations`);
242
+ } else {
243
+ console.error(`${pkgName} \u274C Dependency violations found`);
244
+ }
245
+ return result.exitCode;
246
+ };
247
+
248
+ // src/actions/deplint/deplint.ts
249
+ import chalk11 from "chalk";
250
+
251
+ // src/actions/deplint/findFiles.ts
252
+ import fs from "fs";
253
+
254
+ // src/actions/deplint/findFilesByGlob.ts
255
+ import { globSync } from "glob";
256
+ function findFilesByGlob(cwd, pattern, ignore) {
257
+ return globSync(pattern, {
258
+ cwd,
259
+ absolute: true,
260
+ ignore,
261
+ nodir: true
262
+ });
263
+ }
264
+
265
+ // src/actions/deplint/findFiles.ts
266
+ var codeExtensions = "*.{ts,tsx,mts,cts,js,mjs,cjs}";
267
+ function getWorkspaceIgnores(location) {
268
+ try {
269
+ const raw = fs.readFileSync(`${location}/package.json`, "utf8");
270
+ const pkg = JSON.parse(raw);
271
+ return pkg.workspaces ?? [];
272
+ } catch {
273
+ return [];
274
+ }
275
+ }
276
+ function findFiles(location) {
277
+ const workspaceIgnores = getWorkspaceIgnores(location).map((w) => `${w}/**`);
278
+ const ignore = ["**/node_modules/**", "dist/**", ...workspaceIgnores];
279
+ const allFiles = findFilesByGlob(location, `./**/${codeExtensions}`, ignore);
280
+ const distFiles = [
281
+ ...findFilesByGlob(location, "./dist/**/*.d.ts"),
282
+ ...findFilesByGlob(location, `./dist/**/${codeExtensions}`)
283
+ ];
284
+ return { allFiles, distFiles };
285
+ }
286
+
287
+ // src/actions/deplint/getDependenciesFromPackageJson.ts
288
+ import fs2 from "fs";
289
+ import path from "path";
290
+ function getDependenciesFromPackageJson(packageJsonPath) {
291
+ const packageJsonFullPath = path.resolve(packageJsonPath);
292
+ const rawContent = fs2.readFileSync(packageJsonFullPath, "utf8");
293
+ const packageJson = JSON.parse(rawContent);
294
+ const dependencies = packageJson.dependencies ? Object.keys(packageJson.dependencies) : [];
295
+ const devDependencies = packageJson.devDependencies ? Object.keys(packageJson.devDependencies) : [];
296
+ const peerDependencies = packageJson.peerDependencies ? Object.keys(packageJson.peerDependencies) : [];
297
+ return {
298
+ dependencies,
299
+ devDependencies,
300
+ peerDependencies
301
+ };
302
+ }
303
+
304
+ // src/actions/deplint/getExtendsFromTsconfigs.ts
305
+ import fs3 from "fs";
306
+ import { globSync as globSync2 } from "glob";
307
+
308
+ // src/actions/deplint/getBasePackageName.ts
309
+ function getBasePackageName(importName) {
310
+ const importNameScrubbed = importName.replaceAll('"', "").trim();
311
+ if (importNameScrubbed.startsWith("@")) {
312
+ const parts = importNameScrubbed.split("/");
313
+ return parts.length >= 2 ? `${parts[0]}/${parts[1]}` : importNameScrubbed;
314
+ }
315
+ return importNameScrubbed.split("/")[0];
316
+ }
317
+
318
+ // src/actions/deplint/getExtendsFromTsconfigs.ts
319
+ var isExternalReference = (ref) => !ref.startsWith(".") && !ref.startsWith("/");
320
+ function parseExtendsField(value) {
321
+ if (typeof value === "string") return [value];
322
+ if (Array.isArray(value)) return value.filter((v) => typeof v === "string");
323
+ return [];
324
+ }
325
+ function getExtendsFromTsconfigs(location) {
326
+ const tsconfigFiles = globSync2("./tsconfig*.json", { cwd: location, absolute: true });
327
+ const packages = /* @__PURE__ */ new Set();
328
+ for (const file of tsconfigFiles) {
329
+ try {
330
+ const content = fs3.readFileSync(file, "utf8");
331
+ const cleaned = content.replaceAll(/\/\/.*/g, "").replaceAll(/,\s*([}\]])/g, "$1");
332
+ const parsed = JSON.parse(cleaned);
333
+ const refs = parseExtendsField(parsed.extends);
334
+ for (const ref of refs) {
335
+ if (isExternalReference(ref)) {
336
+ packages.add(getBasePackageName(ref));
337
+ }
338
+ }
339
+ } catch {
340
+ }
341
+ }
342
+ return [...packages];
343
+ }
344
+
345
+ // src/actions/deplint/getImportsFromFile.ts
346
+ import fs4 from "fs";
347
+ import path2 from "path";
348
+ import ts from "typescript";
349
+ function isTypeOnlyImportClause(clause) {
350
+ if (clause === void 0) {
351
+ return false;
352
+ }
353
+ if ("phaseModifier" in clause) {
354
+ const mod = clause.phaseModifier;
355
+ const kind = typeof mod === "number" ? mod : mod?.kind;
356
+ return kind === ts.SyntaxKind.TypeKeyword;
357
+ }
358
+ return clause.isTypeOnly;
359
+ }
360
+ function getImportsFromFile(filePath, importPaths, typeImportPaths) {
361
+ const sourceCode = fs4.readFileSync(filePath, "utf8");
362
+ const isMjsFile = filePath.endsWith(".mjs");
363
+ const sourceFile = ts.createSourceFile(
364
+ path2.basename(filePath),
365
+ sourceCode,
366
+ ts.ScriptTarget.Latest,
367
+ true,
368
+ isMjsFile ? ts.ScriptKind.JS : void 0
369
+ );
370
+ const imports = [];
371
+ const typeImports = [];
372
+ const isDeclarationFile2 = filePath.endsWith(".d.ts");
373
+ function visit(node) {
374
+ if (ts.isImportDeclaration(node) || ts.isExportDeclaration(node)) {
375
+ const moduleSpecifier = node.moduleSpecifier?.getFullText();
376
+ const isTypeImport = ts.isImportDeclaration(node) ? isTypeOnlyImportClause(node.importClause) : false;
377
+ if (typeof moduleSpecifier === "string") {
378
+ const trimmed = moduleSpecifier.replaceAll("'", "").replaceAll('"', "").trim();
379
+ if (isTypeImport || isDeclarationFile2) {
380
+ typeImports.push(trimmed);
381
+ } else {
382
+ imports.push(trimmed);
383
+ }
384
+ }
385
+ } else if (ts.isCallExpression(node) && node.expression.kind === ts.SyntaxKind.ImportKeyword) {
386
+ const [arg] = node.arguments;
387
+ if (ts.isStringLiteral(arg)) {
388
+ imports.push(arg.text);
389
+ }
390
+ } else if (ts.isCallExpression(node) && ts.isIdentifier(node.expression) && node.expression.text === "require" && node.arguments.length > 0 && ts.isStringLiteral(node.arguments[0])) {
391
+ imports.push(node.arguments[0].text);
392
+ }
393
+ ts.forEachChild(node, visit);
394
+ }
395
+ visit(sourceFile);
396
+ for (const ref of sourceFile.typeReferenceDirectives) {
397
+ typeImports.push(ref.fileName);
398
+ }
399
+ const importsStartsWithExcludes = [".", "#", "node:"];
400
+ const isValidImport = (imp) => !importsStartsWithExcludes.some((exc) => imp.startsWith(exc)) && !imp.includes("*") && !imp.includes("!");
401
+ const cleanedImports = imports.filter(isValidImport).map(getBasePackageName);
402
+ const cleanedTypeImports = typeImports.filter(isValidImport).map(getBasePackageName);
403
+ for (const imp of cleanedImports) {
404
+ importPaths[imp] = importPaths[imp] ?? [];
405
+ importPaths[imp].push(filePath);
406
+ }
407
+ for (const imp of cleanedTypeImports) {
408
+ typeImportPaths[imp] = typeImportPaths[imp] ?? [];
409
+ typeImportPaths[imp].push(filePath);
410
+ }
411
+ return [cleanedImports, cleanedTypeImports];
412
+ }
413
+
414
+ // src/actions/deplint/getExternalImportsFromFiles.ts
415
+ var internalImportPrefixes = [".", "#", "node:"];
416
+ var removeInternalImports = (imports) => {
417
+ return imports.filter((imp) => !internalImportPrefixes.some((prefix) => imp.startsWith(prefix)));
418
+ };
419
+ var isDeclarationFile = (file) => file.endsWith(".d.ts") || file.endsWith(".d.cts") || file.endsWith(".d.mts");
420
+ function getExternalImportsFromFiles({
421
+ allFiles,
422
+ distFiles,
423
+ tsconfigExtends = []
424
+ }) {
425
+ const allImportPaths = {};
426
+ const distImportPaths = {};
427
+ const distTypeImportPaths = {};
428
+ for (const path6 of allFiles) getImportsFromFile(path6, allImportPaths, allImportPaths).flat();
429
+ const distTypeFiles = distFiles.filter(isDeclarationFile);
430
+ const distCodeFiles = distFiles.filter((file) => !isDeclarationFile(file));
431
+ for (const path6 of distCodeFiles) getImportsFromFile(path6, distImportPaths, distImportPaths).flat();
432
+ for (const path6 of distTypeFiles) getImportsFromFile(path6, distTypeImportPaths, distTypeImportPaths).flat();
433
+ const allImports = Object.keys(allImportPaths);
434
+ const distImports = Object.keys(distImportPaths);
435
+ const externalAllImports = removeInternalImports(allImports);
436
+ const externalDistImports = removeInternalImports(distImports);
437
+ const externalDistTypeImports = removeInternalImports(Object.keys(distTypeImportPaths));
438
+ for (const ext of tsconfigExtends) {
439
+ if (!externalAllImports.includes(ext)) externalAllImports.push(ext);
440
+ }
441
+ return {
442
+ allImportPaths,
443
+ allImports,
444
+ distImportPaths,
445
+ distImports,
446
+ externalAllImports,
447
+ externalDistImports,
448
+ externalDistTypeImports
449
+ };
450
+ }
451
+
452
+ // src/actions/deplint/checkPackage/getUnlistedDependencies.ts
453
+ import { builtinModules } from "module";
454
+ import chalk6 from "chalk";
455
+ function isRuntimeImportListed(imp, name, dependencies, peerDependencies) {
456
+ return dependencies.includes(imp) || imp === name || peerDependencies.includes(imp) || builtinModules.includes(imp);
457
+ }
458
+ function isTypeImportListed(imp, name, dependencies, devDependencies, peerDependencies) {
459
+ return dependencies.includes(imp) || imp === name || dependencies.includes(`@types/${imp}`) || peerDependencies.includes(imp) || peerDependencies.includes(`@types/${imp}`) || devDependencies.includes(`@types/${imp}`) || builtinModules.includes(imp);
460
+ }
461
+ function logMissing(name, imp, importPaths) {
462
+ console.log(`[${chalk6.blue(name)}] Missing dependency in package.json: ${chalk6.red(imp)}`);
463
+ if (importPaths[imp]) {
464
+ console.log(` ${importPaths[imp].join("\n ")}`);
465
+ }
466
+ }
467
+ function getUnlistedDependencies({ name, location }, {
468
+ dependencies,
469
+ devDependencies,
470
+ peerDependencies
471
+ }, {
472
+ externalDistImports,
473
+ externalDistTypeImports,
474
+ distImportPaths
475
+ }) {
476
+ let unlistedDependencies = 0;
477
+ for (const imp of externalDistImports) {
478
+ if (!isRuntimeImportListed(imp, name, dependencies, peerDependencies)) {
479
+ unlistedDependencies++;
480
+ logMissing(name, imp, distImportPaths);
481
+ }
482
+ }
483
+ for (const imp of externalDistTypeImports) {
484
+ if (!isTypeImportListed(imp, name, dependencies, devDependencies, peerDependencies)) {
485
+ unlistedDependencies++;
486
+ logMissing(name, imp, distImportPaths);
487
+ }
488
+ }
489
+ if (unlistedDependencies > 0) {
490
+ const packageLocation = `${location}/package.json`;
491
+ console.log(` ${chalk6.yellow(packageLocation)}
492
+ `);
493
+ }
494
+ return unlistedDependencies;
495
+ }
496
+
497
+ // src/actions/deplint/checkPackage/getUnlistedDevDependencies.ts
498
+ import { builtinModules as builtinModules2 } from "module";
499
+ import chalk7 from "chalk";
500
+ function getUnlistedDevDependencies({ name, location }, {
501
+ devDependencies,
502
+ dependencies,
503
+ peerDependencies
504
+ }, {
505
+ allImportPaths,
506
+ externalAllImports,
507
+ distImports
508
+ }) {
509
+ let unlistedDevDependencies = 0;
510
+ for (const imp of externalAllImports) {
511
+ if (!distImports.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)) {
512
+ unlistedDevDependencies++;
513
+ console.log(`[${chalk7.blue(name)}] Missing devDependency in package.json: ${chalk7.red(imp)}`);
514
+ if (allImportPaths[imp]) {
515
+ console.log(` ${allImportPaths[imp].join("\n ")}`);
516
+ }
517
+ }
518
+ }
519
+ if (unlistedDevDependencies > 0) {
520
+ const packageLocation = `${location}/package.json`;
521
+ console.log(` ${chalk7.yellow(packageLocation)}
522
+ `);
523
+ }
524
+ return unlistedDevDependencies;
525
+ }
526
+
527
+ // src/actions/deplint/checkPackage/getUnusedDependencies.ts
528
+ import chalk8 from "chalk";
529
+ function getUnusedDependencies({ name, location }, { dependencies }, {
530
+ externalDistImports,
531
+ externalDistTypeImports,
532
+ externalAllImports
533
+ }, exclude) {
534
+ let unusedDependencies = 0;
535
+ for (const dep of dependencies) {
536
+ if (exclude?.has(dep)) continue;
537
+ if (!externalDistImports.includes(dep) && !externalDistImports.includes(dep.replace(/^@types\//, "")) && !externalDistTypeImports.includes(dep) && !externalDistTypeImports.includes(dep.replace(/^@types\//, ""))) {
538
+ unusedDependencies++;
539
+ if (externalAllImports.includes(dep)) {
540
+ console.log(`[${chalk8.blue(name)}] dependency should be devDependency in package.json: ${chalk8.red(dep)}`);
541
+ } else {
542
+ console.log(`[${chalk8.blue(name)}] Unused dependency in package.json: ${chalk8.red(dep)}`);
543
+ }
544
+ }
545
+ }
546
+ if (unusedDependencies > 0) {
547
+ const packageLocation = `${location}/package.json`;
548
+ console.log(` ${chalk8.yellow(packageLocation)}
549
+ `);
550
+ }
551
+ return unusedDependencies;
552
+ }
553
+
554
+ // src/actions/deplint/checkPackage/getUnusedDevDependencies.ts
555
+ import chalk9 from "chalk";
556
+
557
+ // src/actions/deplint/getCliReferencedPackagesFromFiles.ts
558
+ import fs7 from "fs";
559
+ import path5 from "path";
560
+ import ts2 from "typescript";
561
+
562
+ // src/actions/deplint/getScriptReferencedPackages.ts
563
+ import fs6 from "fs";
564
+ import path4 from "path";
565
+
566
+ // src/actions/deplint/getRequiredPeerDependencies.ts
567
+ import fs5 from "fs";
568
+ import path3 from "path";
569
+ function findDepPackageJson(location, dep) {
570
+ let dir = location;
571
+ while (true) {
572
+ const candidate = path3.join(dir, "node_modules", dep, "package.json");
573
+ if (fs5.existsSync(candidate)) return candidate;
574
+ const parent = path3.dirname(dir);
575
+ if (parent === dir) return void 0;
576
+ dir = parent;
577
+ }
578
+ }
579
+ function getRequiredPeerDependencies(location, allDeps) {
580
+ const required = /* @__PURE__ */ new Set();
581
+ for (const dep of allDeps) {
582
+ const depPkgPath = findDepPackageJson(location, dep);
583
+ if (!depPkgPath) continue;
584
+ try {
585
+ const raw = fs5.readFileSync(depPkgPath, "utf8");
586
+ const pkg = JSON.parse(raw);
587
+ if (pkg.peerDependencies) {
588
+ for (const peer of Object.keys(pkg.peerDependencies)) {
589
+ required.add(peer);
590
+ }
591
+ }
592
+ } catch {
593
+ }
594
+ }
595
+ return required;
596
+ }
597
+
598
+ // src/actions/deplint/getScriptReferencedPackages.ts
599
+ function getBinNames(location, dep) {
600
+ const depPkgPath = findDepPackageJson(location, dep);
601
+ if (!depPkgPath) return [];
602
+ try {
603
+ const raw = fs6.readFileSync(depPkgPath, "utf8");
604
+ const pkg = JSON.parse(raw);
605
+ if (!pkg.bin) return [];
606
+ if (typeof pkg.bin === "string") return [pkg.name?.split("/").pop() ?? dep];
607
+ return Object.keys(pkg.bin);
608
+ } catch {
609
+ return [];
610
+ }
611
+ }
612
+ function tokenizeScript(script) {
613
+ return script.split(/[&|;$()"`\s]+/).map((t) => t.trim()).filter(Boolean);
614
+ }
615
+ function getScriptReferencedPackages(location, allDeps) {
616
+ const pkgPath = path4.join(location, "package.json");
617
+ let scripts = {};
618
+ try {
619
+ const raw = fs6.readFileSync(pkgPath, "utf8");
620
+ const pkg = JSON.parse(raw);
621
+ scripts = pkg.scripts ?? {};
622
+ } catch {
623
+ return /* @__PURE__ */ new Set();
624
+ }
625
+ const scriptText = Object.values(scripts).join(" ");
626
+ const tokens = new Set(tokenizeScript(scriptText));
627
+ const binToPackage = /* @__PURE__ */ new Map();
628
+ for (const dep of allDeps) {
629
+ const bins = getBinNames(location, dep);
630
+ for (const bin of bins) {
631
+ binToPackage.set(bin, dep);
632
+ }
633
+ }
634
+ const referenced = /* @__PURE__ */ new Set();
635
+ for (const token of tokens) {
636
+ const baseName = getBasePackageName(token);
637
+ if (allDeps.includes(baseName)) {
638
+ referenced.add(baseName);
639
+ }
640
+ const pkg = binToPackage.get(token);
641
+ if (pkg) {
642
+ referenced.add(pkg);
643
+ }
644
+ }
645
+ return referenced;
646
+ }
647
+
648
+ // src/actions/deplint/getCliReferencedPackagesFromFiles.ts
649
+ var shellCommandFunctions = /* @__PURE__ */ new Set(["execSync", "exec"]);
650
+ var directExecFunctions = /* @__PURE__ */ new Set(["spawn", "spawnSync", "execFile", "execFileSync"]);
651
+ var allExecFunctions = /* @__PURE__ */ new Set([...shellCommandFunctions, ...directExecFunctions]);
652
+ function getCommandTokensFromFile(filePath) {
653
+ const tokens = /* @__PURE__ */ new Set();
654
+ let sourceCode;
655
+ try {
656
+ sourceCode = fs7.readFileSync(filePath, "utf8");
657
+ } catch {
658
+ return tokens;
659
+ }
660
+ const isMjsFile = filePath.endsWith(".mjs");
661
+ const sourceFile = ts2.createSourceFile(
662
+ path5.basename(filePath),
663
+ sourceCode,
664
+ ts2.ScriptTarget.Latest,
665
+ true,
666
+ isMjsFile ? ts2.ScriptKind.JS : void 0
667
+ );
668
+ function visit(node) {
669
+ if (ts2.isCallExpression(node) && node.arguments.length > 0) {
670
+ const fnName = getFunctionName(node.expression);
671
+ if (fnName && allExecFunctions.has(fnName)) {
672
+ const firstArg = node.arguments[0];
673
+ if (ts2.isStringLiteral(firstArg) || ts2.isNoSubstitutionTemplateLiteral(firstArg)) {
674
+ const value = firstArg.text;
675
+ if (shellCommandFunctions.has(fnName)) {
676
+ for (const token of tokenizeScript(value)) {
677
+ tokens.add(token);
678
+ }
679
+ } else {
680
+ tokens.add(value);
681
+ }
682
+ } else if (ts2.isTemplateExpression(firstArg)) {
683
+ const head = firstArg.head.text;
684
+ if (head) {
685
+ for (const token of tokenizeScript(head)) {
686
+ tokens.add(token);
687
+ }
688
+ }
689
+ }
690
+ }
691
+ }
692
+ ts2.forEachChild(node, visit);
693
+ }
694
+ visit(sourceFile);
695
+ return tokens;
696
+ }
697
+ function getFunctionName(expr) {
698
+ if (ts2.isIdentifier(expr)) {
699
+ return expr.text;
700
+ }
701
+ if (ts2.isPropertyAccessExpression(expr) && ts2.isIdentifier(expr.name)) {
702
+ return expr.name.text;
703
+ }
704
+ return void 0;
705
+ }
706
+ function getCliReferencedPackagesFromFiles(allFiles, location, allDeps) {
707
+ const allTokens = /* @__PURE__ */ new Set();
708
+ for (const file of allFiles) {
709
+ for (const token of getCommandTokensFromFile(file)) {
710
+ allTokens.add(token);
711
+ }
712
+ }
713
+ if (allTokens.size === 0) return /* @__PURE__ */ new Set();
714
+ const binToPackage = /* @__PURE__ */ new Map();
715
+ for (const dep of allDeps) {
716
+ for (const bin of getBinNames(location, dep)) {
717
+ binToPackage.set(bin, dep);
718
+ }
719
+ }
720
+ const referenced = /* @__PURE__ */ new Set();
721
+ for (const token of allTokens) {
722
+ const baseName = getBasePackageName(token);
723
+ if (allDeps.includes(baseName)) {
724
+ referenced.add(baseName);
725
+ }
726
+ const pkg = binToPackage.get(token);
727
+ if (pkg) {
728
+ referenced.add(pkg);
729
+ }
730
+ }
731
+ return referenced;
732
+ }
733
+
734
+ // src/actions/deplint/implicitDevDependencies.ts
735
+ import fs8 from "fs";
736
+ var hasFileWithExtension = (files, extensions) => files.some((f) => extensions.some((ext) => f.endsWith(ext)));
737
+ var tsExtensions = [".ts", ".tsx", ".mts", ".cts"];
738
+ var hasTypescriptFiles = ({ allFiles }) => hasFileWithExtension(allFiles, tsExtensions);
739
+ var decoratorPattern = /^\s*@[a-zA-Z]\w*/m;
740
+ var hasDecorators = ({ allFiles }) => allFiles.filter((f) => tsExtensions.some((ext) => f.endsWith(ext))).some((file) => {
741
+ try {
742
+ const content = fs8.readFileSync(file, "utf8");
743
+ return decoratorPattern.test(content);
744
+ } catch {
745
+ return false;
746
+ }
747
+ });
748
+ var importPlugins = /* @__PURE__ */ new Set(["eslint-plugin-import-x", "eslint-plugin-import"]);
749
+ function hasImportPlugin({ location, allDependencies }) {
750
+ if (allDependencies.some((d) => importPlugins.has(d))) return true;
751
+ for (const dep of allDependencies) {
752
+ const pkgPath = findDepPackageJson(location, dep);
753
+ if (!pkgPath) continue;
754
+ try {
755
+ const pkg = JSON.parse(fs8.readFileSync(pkgPath, "utf8"));
756
+ const transitiveDeps = [
757
+ ...Object.keys(pkg.dependencies ?? {}),
758
+ ...Object.keys(pkg.peerDependencies ?? {})
759
+ ];
760
+ if (transitiveDeps.some((d) => importPlugins.has(d))) return true;
761
+ } catch {
762
+ }
763
+ }
764
+ return false;
765
+ }
766
+ var hasVitest = ({ allDependencies }) => allDependencies.includes("vitest");
767
+ var rules = [
768
+ {
769
+ package: "typescript",
770
+ isNeeded: hasTypescriptFiles
771
+ },
772
+ {
773
+ package: "eslint-import-resolver-typescript",
774
+ isNeeded: (context) => hasTypescriptFiles(context) && context.allDependencies.includes("eslint") && hasImportPlugin(context)
775
+ },
776
+ {
777
+ package: "tslib",
778
+ isNeeded: hasDecorators
779
+ },
780
+ {
781
+ package: "@vitest/coverage-v8",
782
+ isNeeded: hasVitest
783
+ }
784
+ ];
785
+ function getImplicitDevDependencies(context) {
786
+ const implicit = /* @__PURE__ */ new Set();
787
+ for (const rule of rules) {
788
+ if (rule.isNeeded(context)) {
789
+ implicit.add(rule.package);
790
+ }
791
+ }
792
+ return implicit;
793
+ }
794
+
795
+ // src/actions/deplint/checkPackage/getUnusedDevDependencies.ts
796
+ var allExternalImports = ({
797
+ externalAllImports,
798
+ externalDistImports,
799
+ externalDistTypeImports
800
+ }) => {
801
+ return /* @__PURE__ */ new Set([
802
+ ...externalAllImports,
803
+ ...externalDistImports,
804
+ ...externalDistTypeImports
805
+ ]);
806
+ };
807
+ function isDevDepUsed(dep, allImports, implicitDeps, requiredPeers, scriptRefs, cliRefs) {
808
+ if (implicitDeps.has(dep)) return true;
809
+ if (requiredPeers.has(dep)) return true;
810
+ if (scriptRefs.has(dep)) return true;
811
+ if (cliRefs.has(dep)) return true;
812
+ if (dep.startsWith("@types/")) {
813
+ const baseName = dep.replace(/^@types\//, "");
814
+ return allImports.has(baseName) || allImports.has(dep) || implicitDeps.has(baseName);
815
+ }
816
+ return allImports.has(dep);
817
+ }
818
+ function getUnusedDevDependencies({ name, location }, {
819
+ devDependencies,
820
+ dependencies,
821
+ peerDependencies
822
+ }, sourceParams, fileContext, exclude) {
823
+ const allImports = allExternalImports(sourceParams);
824
+ const allDeps = [...dependencies, ...devDependencies, ...peerDependencies];
825
+ const implicitDeps = getImplicitDevDependencies({
826
+ ...fileContext,
827
+ allDependencies: allDeps,
828
+ location
829
+ });
830
+ const requiredPeers = getRequiredPeerDependencies(location, allDeps);
831
+ const scriptRefs = getScriptReferencedPackages(location, allDeps);
832
+ const cliRefs = getCliReferencedPackagesFromFiles(fileContext.allFiles, location, allDeps);
833
+ let unusedDevDependencies = 0;
834
+ for (const dep of devDependencies) {
835
+ if (exclude?.has(dep)) continue;
836
+ if (dependencies.includes(dep) || peerDependencies.includes(dep)) continue;
837
+ if (!isDevDepUsed(dep, allImports, implicitDeps, requiredPeers, scriptRefs, cliRefs)) {
838
+ unusedDevDependencies++;
839
+ console.log(`[${chalk9.blue(name)}] Unused devDependency in package.json: ${chalk9.red(dep)}`);
840
+ }
841
+ }
842
+ if (unusedDevDependencies > 0) {
843
+ const packageLocation = `${location}/package.json`;
844
+ console.log(` ${chalk9.yellow(packageLocation)}
845
+ `);
846
+ }
847
+ return unusedDevDependencies;
848
+ }
849
+
850
+ // src/actions/deplint/checkPackage/getUnusedPeerDependencies.ts
851
+ import chalk10 from "chalk";
852
+ function getUnusedPeerDependencies({ name, location }, { peerDependencies, dependencies }, { externalDistImports, externalDistTypeImports }, exclude) {
853
+ let unusedDependencies = 0;
854
+ for (const dep of peerDependencies) {
855
+ if (exclude?.has(dep)) continue;
856
+ if (!externalDistImports.includes(dep) && !externalDistImports.includes(dep.replace(/^@types\//, "")) && !externalDistTypeImports.includes(dep) && !externalDistTypeImports.includes(dep.replace(/^@types\//, ""))) {
857
+ unusedDependencies++;
858
+ if (dependencies.includes(dep)) {
859
+ console.log(`[${chalk10.blue(name)}] Unused peerDependency [already a dependency] in package.json: ${chalk10.red(dep)}`);
860
+ } else {
861
+ console.log(`[${chalk10.blue(name)}] Unused peerDependency in package.json: ${chalk10.red(dep)}`);
862
+ }
863
+ }
864
+ }
865
+ if (unusedDependencies > 0) {
866
+ const packageLocation = `${location}/package.json`;
867
+ console.log(` ${chalk10.yellow(packageLocation)}
868
+ `);
869
+ }
870
+ return unusedDependencies;
871
+ }
872
+
873
+ // src/actions/deplint/checkPackage/checkPackage.ts
874
+ function logVerbose(name, location, allFiles, distFiles, tsconfigExtends) {
875
+ console.info(`Checking package: ${name} at ${location}`);
876
+ console.info(`All files: ${allFiles.length}, Distribution files: ${distFiles.length}`);
877
+ for (const file of allFiles) {
878
+ console.info(`File: ${file}`);
879
+ }
880
+ for (const file of distFiles) {
881
+ console.info(`Distribution file: ${file}`);
882
+ }
883
+ for (const ext of tsconfigExtends) {
884
+ console.info(`Tsconfig extends: ${ext}`);
885
+ }
886
+ }
887
+ function checkPackage({
888
+ name,
889
+ location,
890
+ deps = false,
891
+ devDeps = false,
892
+ exclude,
893
+ peerDeps = false,
894
+ verbose = false
895
+ }) {
896
+ const { allFiles, distFiles } = findFiles(location);
897
+ const tsconfigExtends = getExtendsFromTsconfigs(location);
898
+ if (verbose) {
899
+ logVerbose(name, location, allFiles, distFiles, tsconfigExtends);
900
+ }
901
+ const checkDeps = deps || !(deps || devDeps || peerDeps);
902
+ const checkDevDeps = devDeps || !(deps || devDeps || peerDeps);
903
+ const checkPeerDeps = peerDeps;
904
+ const sourceParams = getExternalImportsFromFiles({
905
+ allFiles,
906
+ distFiles,
907
+ tsconfigExtends
908
+ });
909
+ const packageParams = getDependenciesFromPackageJson(`${location}/package.json`);
910
+ const unlistedDependencies = checkDeps ? getUnlistedDependencies({ name, location }, packageParams, sourceParams) : 0;
911
+ const unusedDependencies = checkDeps ? getUnusedDependencies({ name, location }, packageParams, sourceParams, exclude) : 0;
912
+ const unlistedDevDependencies = checkDevDeps ? getUnlistedDevDependencies({ name, location }, packageParams, sourceParams) : 0;
913
+ const fileContext = { allFiles, distFiles };
914
+ const unusedDevDependencies = checkDevDeps ? getUnusedDevDependencies({ name, location }, packageParams, sourceParams, fileContext, exclude) : 0;
915
+ const unusedPeerDependencies = checkPeerDeps ? getUnusedPeerDependencies({ name, location }, packageParams, sourceParams, exclude) : 0;
916
+ const totalErrors = unlistedDependencies + unlistedDevDependencies + unusedDependencies + unusedDevDependencies + unusedPeerDependencies;
917
+ return totalErrors;
918
+ }
919
+
920
+ // src/actions/deplint/deplint.ts
921
+ var deplint = async ({
922
+ pkg,
923
+ deps,
924
+ devDeps,
925
+ peerDeps,
926
+ verbose,
927
+ cliExclude
928
+ }) => {
929
+ const config2 = await loadConfig();
930
+ const exclude = /* @__PURE__ */ new Set([
931
+ ...config2.deplint?.exclude ?? [],
932
+ ...cliExclude ?? []
933
+ ]);
934
+ let totalErrors = 0;
935
+ if (pkg === void 0) {
936
+ const workspaces = getPackageManager().listWorkspaces();
937
+ console.info("Deplint Started...");
938
+ for (const workspace of workspaces) {
939
+ totalErrors += checkPackage({
940
+ ...workspace,
941
+ deps,
942
+ devDeps,
943
+ exclude,
944
+ peerDeps,
945
+ verbose
946
+ });
947
+ }
948
+ } else {
949
+ const workspace = getPackageManager().findWorkspace(pkg);
950
+ if (!workspace) {
951
+ console.error(chalk11.red(`Workspace not found: ${pkg}`));
952
+ return 1;
953
+ }
954
+ const { location, name } = workspace;
955
+ console.info(`Running Deplint for ${name}`);
956
+ totalErrors += checkPackage({
957
+ name,
958
+ location,
959
+ devDeps,
960
+ deps,
961
+ exclude,
962
+ peerDeps,
963
+ verbose
964
+ });
965
+ }
966
+ if (totalErrors > 0) {
967
+ console.warn(`Deplint: Found ${chalk11.red(totalErrors)} dependency problems. ${chalk11.red("\u2716")}`);
968
+ } else {
969
+ console.info(`Deplint: Found no dependency problems. ${chalk11.green("\u2714")}`);
970
+ }
971
+ return 0;
972
+ };
973
+
974
+ // src/actions/lint.ts
975
+ import chalk12 from "chalk";
976
+ var lintPackage = ({
977
+ pkg,
978
+ fix: fix2,
979
+ verbose
980
+ }) => {
981
+ console.log(chalk12.gray(`${fix2 ? "Fix" : "Lint"} [${pkg}]`));
982
+ const start = Date.now();
983
+ const pm = getPackageManager();
984
+ const result = runSteps(`${fix2 ? "Fix" : "Lint"} [${pkg}]`, [
985
+ pm.runInWorkspace(pkg, fix2 ? "package-fix" : verbose ? "package-lint-verbose" : "package-lint")
986
+ ]);
987
+ console.log(chalk12.gray(`${fix2 ? "Fixed in" : "Linted in"} [${chalk12.magenta(((Date.now() - start) / 1e3).toFixed(2))}] ${chalk12.gray("seconds")}`));
988
+ return result;
989
+ };
990
+ var lint = ({
991
+ pkg,
992
+ verbose,
993
+ incremental,
994
+ fix: fix2
995
+ } = {}) => {
996
+ return pkg === void 0 ? lintAllPackages({
997
+ verbose,
998
+ incremental,
999
+ fix: fix2
1000
+ }) : lintPackage({
1001
+ pkg,
1002
+ fix: fix2,
1003
+ verbose
1004
+ });
1005
+ };
1006
+ var lintAllPackages = ({ fix: fix2 = false } = {}) => {
1007
+ console.log(chalk12.gray(`${fix2 ? "Fix" : "Lint"} [All-Packages]`));
1008
+ const start = Date.now();
1009
+ const fixOptions = fix2 ? ["--fix"] : [];
1010
+ const result = runSteps(`${fix2 ? "Fix" : "Lint"} [All-Packages]`, [
1011
+ ["eslint", ["--cache", "--cache-location", ".eslintcache", "--cache-strategy", "content", ...fixOptions]]
1012
+ ]);
1013
+ console.log(chalk12.gray(`${fix2 ? "Fixed in" : "Linted in"} [${chalk12.magenta(((Date.now() - start) / 1e3).toFixed(2))}] ${chalk12.gray("seconds")}`));
1014
+ return result;
1015
+ };
1016
+
1017
+ // src/actions/fix.ts
1018
+ var fix = (params) => {
1019
+ return lint({ ...params, fix: true });
1020
+ };
1021
+
1022
+ // src/actions/knip.ts
1023
+ var knip = () => {
1024
+ return runSteps("Knip", [["knip", ["--dependencies", "--no-exit-code"]]]);
1025
+ };
1026
+
1027
+ // src/actions/lintlint.ts
1028
+ import { readFileSync, writeFileSync } from "fs";
1029
+ import PATH from "path";
1030
+ import chalk13 from "chalk";
1031
+ import { findUp } from "find-up";
1032
+ function parseRuleValue(value) {
1033
+ if (typeof value === "string") {
1034
+ return { level: value };
1035
+ }
1036
+ if (typeof value === "number") {
1037
+ return { level: String(value) };
1038
+ }
1039
+ if (Array.isArray(value) && value.length > 0) {
1040
+ return {
1041
+ level: String(value[0]),
1042
+ options: value.length > 1 ? value.slice(1) : void 0
1043
+ };
1044
+ }
1045
+ return void 0;
1046
+ }
1047
+ function normalizeLevel(level) {
1048
+ if (level === "0" || level === "off") return "off";
1049
+ if (level === "1" || level === "warn") return "warn";
1050
+ if (level === "2" || level === "error") return "error";
1051
+ return level;
1052
+ }
1053
+ function rulesMatch(a, b) {
1054
+ if (normalizeLevel(a.level) !== normalizeLevel(b.level)) return false;
1055
+ return JSON.stringify(a.options) === JSON.stringify(b.options);
1056
+ }
1057
+ function formatRule(entry) {
1058
+ if (entry.options) {
1059
+ return JSON.stringify([entry.level, ...entry.options]);
1060
+ }
1061
+ return JSON.stringify([entry.level]);
1062
+ }
1063
+ function mergeRulesFromBlocks(blocks) {
1064
+ const merged = /* @__PURE__ */ new Map();
1065
+ for (const block of blocks) {
1066
+ if (!block.rules) continue;
1067
+ for (const [name, value] of Object.entries(block.rules)) {
1068
+ const parsed = parseRuleValue(value);
1069
+ if (parsed) merged.set(name, parsed);
1070
+ }
1071
+ }
1072
+ return merged;
1073
+ }
1074
+ function detectSharedPackage(source) {
1075
+ if (source.includes("@xylabs/eslint-config-react-flat")) return "@xylabs/eslint-config-react-flat";
1076
+ if (source.includes("@xylabs/eslint-config-flat")) return "@xylabs/eslint-config-flat";
1077
+ return void 0;
1078
+ }
1079
+ function extractLocalRuleBlocks(source) {
1080
+ const blocks = [];
1081
+ const ruleBlockRegex = /\{\s*(?:files\s*:\s*\[.*?\]\s*,\s*)?rules\s*:\s*\{([^}]*(?:\{[^}]*\}[^}]*)*)\}/g;
1082
+ let match;
1083
+ while ((match = ruleBlockRegex.exec(source)) !== null) {
1084
+ blocks.push(match[1]);
1085
+ }
1086
+ return blocks;
1087
+ }
1088
+ function extractRulesFromSourceBlocks(blocks) {
1089
+ const rules2 = /* @__PURE__ */ new Map();
1090
+ for (const block of blocks) {
1091
+ const ruleRegex = /['"]([^'"]+)['"]\s*:\s*(\[[\s\S]*?\](?=\s*,|\s*$))/gm;
1092
+ let match;
1093
+ while ((match = ruleRegex.exec(block)) !== null) {
1094
+ rules2.set(match[1], match[2]);
1095
+ }
1096
+ }
1097
+ return rules2;
1098
+ }
1099
+ async function resolveSharedConfig(configDir, sharedPkg) {
1100
+ try {
1101
+ const sharedModule = await import(sharedPkg);
1102
+ const config2 = sharedModule.config ?? sharedModule.default;
1103
+ if (Array.isArray(config2)) return config2;
1104
+ return [];
1105
+ } catch {
1106
+ const distPath = PATH.resolve(configDir, "node_modules", sharedPkg, "dist", "node", "index.mjs");
1107
+ try {
1108
+ const sharedModule = await import(distPath);
1109
+ const config2 = sharedModule.config ?? sharedModule.default;
1110
+ if (Array.isArray(config2)) return config2;
1111
+ } catch {
1112
+ const neutralPath = PATH.resolve(configDir, "node_modules", sharedPkg, "dist", "neutral", "index.mjs");
1113
+ const sharedModule = await import(neutralPath);
1114
+ const config2 = sharedModule.config ?? sharedModule.default;
1115
+ if (Array.isArray(config2)) return config2;
1116
+ }
1117
+ return [];
1118
+ }
1119
+ }
1120
+ async function loadSharedRules(configDir, sharedPkg, verbose) {
1121
+ const sharedBlocks = await resolveSharedConfig(configDir, sharedPkg);
1122
+ const sharedRules = mergeRulesFromBlocks(sharedBlocks);
1123
+ if (verbose) {
1124
+ console.log(chalk13.gray(`Shared config defines ${sharedRules.size} rules`));
1125
+ }
1126
+ if (sharedRules.size === 0) {
1127
+ console.error(chalk13.red("Could not load rules from shared config. Is it installed and built?"));
1128
+ return void 0;
1129
+ }
1130
+ return sharedRules;
1131
+ }
1132
+ async function loadLocalRules(eslintConfigPath, source, verbose) {
1133
+ const localModule = await import(eslintConfigPath);
1134
+ const localConfig = localModule.default ?? localModule;
1135
+ const localBlocks = Array.isArray(localConfig) ? localConfig : [localConfig];
1136
+ const resolved = mergeRulesFromBlocks(localBlocks);
1137
+ const localRuleBlocks = extractLocalRuleBlocks(source);
1138
+ const explicit = extractRulesFromSourceBlocks(localRuleBlocks);
1139
+ if (verbose) {
1140
+ console.log(chalk13.gray(`Local config has ${explicit.size} explicit rule setting(s)`));
1141
+ }
1142
+ return { explicit, resolved };
1143
+ }
1144
+ function compareRules(explicitRuleNames, allResolvedRules, sharedRules) {
1145
+ const redundant = [];
1146
+ const overrides = [];
1147
+ const additions = [];
1148
+ for (const ruleName of explicitRuleNames.keys()) {
1149
+ const resolvedEntry = allResolvedRules.get(ruleName);
1150
+ const sharedEntry = sharedRules.get(ruleName);
1151
+ if (!resolvedEntry) continue;
1152
+ if (!sharedEntry) {
1153
+ additions.push({ local: resolvedEntry, rule: ruleName });
1154
+ } else if (rulesMatch(resolvedEntry, sharedEntry)) {
1155
+ redundant.push({
1156
+ local: resolvedEntry,
1157
+ rule: ruleName,
1158
+ shared: sharedEntry
1159
+ });
1160
+ } else {
1161
+ overrides.push({
1162
+ local: resolvedEntry,
1163
+ rule: ruleName,
1164
+ shared: sharedEntry
1165
+ });
1166
+ }
1167
+ }
1168
+ return {
1169
+ additions,
1170
+ overrides,
1171
+ redundant
1172
+ };
1173
+ }
1174
+ function reportResults({
1175
+ additions,
1176
+ overrides,
1177
+ redundant
1178
+ }, verbose) {
1179
+ if (redundant.length > 0) {
1180
+ console.log(chalk13.yellow(`
1181
+ ${redundant.length} redundant rule(s) (same as shared config \u2014 can be removed):`));
1182
+ for (const { rule, local } of redundant) {
1183
+ console.log(chalk13.yellow(` ${rule}: ${formatRule(local)}`));
1184
+ }
1185
+ }
1186
+ if (overrides.length > 0) {
1187
+ console.log(chalk13.cyan(`
1188
+ ${overrides.length} rule override(s) (different from shared config):`));
1189
+ for (const {
1190
+ rule,
1191
+ local,
1192
+ shared
1193
+ } of overrides) {
1194
+ console.log(chalk13.cyan(` ${rule}:`));
1195
+ console.log(chalk13.gray(` shared: ${formatRule(shared)}`));
1196
+ console.log(chalk13.white(` local: ${formatRule(local)}`));
1197
+ }
1198
+ }
1199
+ if (additions.length > 0 && verbose) {
1200
+ console.log(chalk13.gray(`
1201
+ ${additions.length} local addition(s) (not in shared config):`));
1202
+ for (const { rule, local } of additions) {
1203
+ console.log(chalk13.gray(` ${rule}: ${formatRule(local)}`));
1204
+ }
1205
+ }
1206
+ if (redundant.length === 0 && overrides.length === 0) {
1207
+ console.log(chalk13.green("No redundant or overridden rules found"));
1208
+ }
1209
+ }
1210
+ function fixRedundantRules(eslintConfigPath, source, redundant) {
1211
+ let updated = source;
1212
+ for (const { rule } of redundant) {
1213
+ const escaped = rule.replaceAll("/", String.raw`\/`);
1214
+ const pattern = new RegExp(String.raw`[ \t]*['"]${escaped}['"]\s*:\s*\[[^\]]*\],?[ \t]*\n?`, "g");
1215
+ updated = updated.replace(pattern, "");
1216
+ }
1217
+ updated = updated.replaceAll(/\n{3,}/g, "\n\n");
1218
+ if (updated !== source) {
1219
+ writeFileSync(eslintConfigPath, updated, "utf8");
1220
+ console.log(chalk13.green(`
1221
+ Fixed: removed ${redundant.length} redundant rule(s)`));
1222
+ }
1223
+ }
1224
+ async function lintlint({ fix: fix2, verbose } = {}) {
1225
+ const eslintConfigPath = await findUp("eslint.config.mjs");
1226
+ if (!eslintConfigPath) {
1227
+ console.error(chalk13.red("No eslint.config.mjs found"));
1228
+ return 1;
1229
+ }
1230
+ const configDir = PATH.dirname(eslintConfigPath);
1231
+ if (verbose) {
1232
+ console.log(chalk13.gray(`Found config: ${eslintConfigPath}`));
1233
+ }
1234
+ const source = readFileSync(eslintConfigPath, "utf8");
1235
+ const sharedPkg = detectSharedPackage(source);
1236
+ if (!sharedPkg) {
1237
+ console.log(chalk13.yellow("No @xylabs/eslint-config-flat or @xylabs/eslint-config-react-flat imports found"));
1238
+ return 0;
1239
+ }
1240
+ if (verbose) {
1241
+ console.log(chalk13.gray(`Shared package: ${sharedPkg}`));
1242
+ }
1243
+ const sharedRules = await loadSharedRules(configDir, sharedPkg, !!verbose);
1244
+ if (!sharedRules) return 1;
1245
+ const { explicit, resolved } = await loadLocalRules(eslintConfigPath, source, !!verbose);
1246
+ const results = compareRules(explicit, resolved, sharedRules);
1247
+ reportResults(results, !!verbose);
1248
+ if (results.redundant.length > 0 && fix2) {
1249
+ fixRedundantRules(eslintConfigPath, source, results.redundant);
1250
+ }
1251
+ return results.redundant.length > 0 && !fix2 ? 1 : 0;
1252
+ }
1253
+
1254
+ // src/actions/package-lint.ts
1255
+ import { readFileSync as readFileSync2, writeFileSync as writeFileSync2 } from "fs";
1256
+ import PATH2 from "path";
1257
+ import chalk14 from "chalk";
1258
+ import picomatch from "picomatch";
1259
+ function emptyResult() {
1260
+ return {
1261
+ errors: [],
1262
+ fixable: [],
1263
+ warnings: []
1264
+ };
1265
+ }
1266
+ function readRootPackageJson(cwd) {
1267
+ const raw = readFileSync2(PATH2.resolve(cwd, "package.json"), "utf8");
1268
+ return JSON.parse(raw);
1269
+ }
1270
+ function writeRootPackageJson(cwd, pkg) {
1271
+ const path6 = PATH2.resolve(cwd, "package.json");
1272
+ writeFileSync2(path6, `${JSON.stringify(pkg, null, 2)}
1273
+ `, "utf8");
1274
+ }
1275
+ function isMonorepo(pkg) {
1276
+ const workspaces = pkg.workspaces;
1277
+ return Array.isArray(workspaces) && workspaces.length > 0;
1278
+ }
1279
+ function checkPackagesFolder(workspaces) {
1280
+ const result = emptyResult();
1281
+ for (const { location, name } of workspaces) {
1282
+ if (location === ".") continue;
1283
+ if (!location.startsWith("packages/") && !location.startsWith("packages\\")) {
1284
+ result.errors.push(`${name} (${location}) is not inside a packages/ folder`);
1285
+ }
1286
+ }
1287
+ return result;
1288
+ }
1289
+ function checkRootPrivate(pkg) {
1290
+ const result = emptyResult();
1291
+ if (!pkg.private) {
1292
+ result.fixable.push("Root package.json must be private to prevent accidental publishing");
1293
+ }
1294
+ return result;
1295
+ }
1296
+ function fixRootPrivate(cwd, pkg) {
1297
+ pkg.private = true;
1298
+ writeRootPackageJson(cwd, pkg);
1299
+ console.log(chalk14.green(' \u2714 Fixed: set "private": true in root package.json'));
1300
+ }
1301
+ function checkNoPublishConfigOnPrivate(pkg) {
1302
+ const result = emptyResult();
1303
+ if (pkg.private && pkg.publishConfig) {
1304
+ result.fixable.push("Root package.json has publishConfig but is private \u2014 publishConfig is unnecessary");
1305
+ }
1306
+ return result;
1307
+ }
1308
+ function fixNoPublishConfigOnPrivate(cwd, pkg) {
1309
+ delete pkg.publishConfig;
1310
+ writeRootPackageJson(cwd, pkg);
1311
+ console.log(chalk14.green(" \u2714 Fixed: removed publishConfig from private root package.json"));
1312
+ }
1313
+ function checkDiscoverable(pkg, workspaces) {
1314
+ const result = emptyResult();
1315
+ const globs = pkg.workspaces;
1316
+ const matchers = globs.map((glob) => picomatch(glob));
1317
+ const isMatch = (location) => matchers.some((m) => m(location));
1318
+ for (const { location, name } of workspaces) {
1319
+ if (location === ".") continue;
1320
+ if (!isMatch(location)) {
1321
+ result.errors.push(`${name} (${location}) is not matched by any workspace glob in package.json`);
1322
+ }
1323
+ }
1324
+ return result;
1325
+ }
1326
+ function logResults(label, result, fix2) {
1327
+ let errors = 0;
1328
+ let fixed = 0;
1329
+ for (const error of result.errors) {
1330
+ console.log(chalk14.red(` \u2717 ${error}`));
1331
+ errors++;
1332
+ }
1333
+ for (const fixable of result.fixable) {
1334
+ if (fix2) {
1335
+ fixed++;
1336
+ } else {
1337
+ console.log(chalk14.red(` \u2717 ${fixable} (fixable)`));
1338
+ errors++;
1339
+ }
1340
+ }
1341
+ for (const warning of result.warnings) {
1342
+ console.log(chalk14.yellow(` \u26A0 ${warning}`));
1343
+ }
1344
+ if (errors === 0 && fixed === 0 && result.warnings.length === 0) {
1345
+ console.log(chalk14.green(` \u2713 ${label}`));
1346
+ }
1347
+ return { errors, fixed };
1348
+ }
1349
+ function runChecks(entries, cwd, pkg, fix2) {
1350
+ let totalErrors = 0;
1351
+ let totalFixed = 0;
1352
+ for (const entry of entries) {
1353
+ const result = entry.check();
1354
+ const log = logResults(entry.label, result, fix2);
1355
+ if (fix2 && entry.fix && result.fixable.length > 0) {
1356
+ entry.fix(cwd, pkg);
1357
+ }
1358
+ totalErrors += log.errors;
1359
+ totalFixed += log.fixed;
1360
+ }
1361
+ return { errors: totalErrors, fixed: totalFixed };
1362
+ }
1363
+ function logSummary(errors, fixed) {
1364
+ if (fixed > 0) {
1365
+ console.log(chalk14.green(`
1366
+ Fixed ${fixed} issue(s)`));
1367
+ }
1368
+ if (errors > 0) {
1369
+ console.log(chalk14.red(`
1370
+ ${errors} error(s) found`));
1371
+ } else if (fixed === 0) {
1372
+ console.log(chalk14.green("\n All checks passed"));
1373
+ }
1374
+ }
1375
+ function packageLintMonorepo(fix2 = false) {
1376
+ const cwd = INIT_CWD() ?? process.cwd();
1377
+ let pkg;
1378
+ try {
1379
+ pkg = readRootPackageJson(cwd);
1380
+ } catch {
1381
+ console.error(chalk14.red("Could not read package.json"));
1382
+ return 1;
1383
+ }
1384
+ if (!isMonorepo(pkg)) {
1385
+ console.log(chalk14.gray("Not a monorepo \u2014 skipping package-lint checks"));
1386
+ return 0;
1387
+ }
1388
+ console.log(chalk14.green("Package Lint"));
1389
+ const workspaces = getPackageManager().listWorkspaces();
1390
+ const checks = [
1391
+ {
1392
+ check: () => checkRootPrivate(pkg),
1393
+ fix: fixRootPrivate,
1394
+ label: "Root package is private"
1395
+ },
1396
+ {
1397
+ check: () => checkNoPublishConfigOnPrivate(pkg),
1398
+ fix: fixNoPublishConfigOnPrivate,
1399
+ label: "No publishConfig on private root"
1400
+ },
1401
+ { check: () => checkPackagesFolder(workspaces), label: "All packages are in packages/ folder" },
1402
+ { check: () => checkDiscoverable(pkg, workspaces), label: "All packages are discoverable from workspace globs" }
1403
+ ];
1404
+ const { errors, fixed } = runChecks(checks, cwd, pkg, fix2);
1405
+ logSummary(errors, fixed);
1406
+ return errors > 0 ? 1 : 0;
1407
+ }
1408
+
1409
+ // src/actions/publint.ts
1410
+ var publint = async ({ verbose, pkg }) => {
1411
+ return pkg === void 0 ? publintAll({ verbose }) : await publintPackage({ pkg, verbose });
1412
+ };
1413
+ var publintPackage = ({ pkg }) => {
1414
+ const pm = getPackageManager();
1415
+ return runStepsAsync(`Publint [${pkg}]`, [pm.runInWorkspace(pkg, "package-publint")]);
1416
+ };
1417
+ var publintAll = ({ verbose }) => {
1418
+ const pm = getPackageManager();
1419
+ return runSteps("Publint", [pm.foreachWorkspace("package-publint", [], { verbose })]);
1420
+ };
1421
+
1422
+ // src/actions/relint.ts
1423
+ import chalk15 from "chalk";
1424
+ var relintPackage = ({
1425
+ pkg,
1426
+ fix: fix2,
1427
+ verbose
1428
+ }) => {
1429
+ console.log(chalk15.gray(`${fix2 ? "Fix" : "Lint"} [${pkg}]`));
1430
+ const start = Date.now();
1431
+ const pm = getPackageManager();
1432
+ const result = runSteps(`${fix2 ? "Fix" : "Lint"} [${pkg}]`, [
1433
+ pm.runInWorkspace(pkg, fix2 ? "package-fix" : verbose ? "package-lint-verbose" : "package-lint")
1434
+ ]);
1435
+ console.log(chalk15.gray(`${fix2 ? "Fixed in" : "Linted in"} [${chalk15.magenta(((Date.now() - start) / 1e3).toFixed(2))}] ${chalk15.gray("seconds")}`));
1436
+ return result;
1437
+ };
1438
+ var relint = ({
1439
+ pkg,
1440
+ verbose,
1441
+ incremental,
1442
+ fix: fix2
1443
+ } = {}) => {
1444
+ return pkg === void 0 ? relintAllPackages({
1445
+ verbose,
1446
+ incremental,
1447
+ fix: fix2
1448
+ }) : relintPackage({
1449
+ pkg,
1450
+ fix: fix2,
1451
+ verbose
1452
+ });
1453
+ };
1454
+ var relintAllPackages = ({ fix: fix2 = false } = {}) => {
1455
+ console.log(chalk15.gray(`${fix2 ? "Fix" : "Lint"} [All-Packages]`));
1456
+ const start = Date.now();
1457
+ const fixOptions = fix2 ? ["--fix"] : [];
1458
+ const result = runSteps(`${fix2 ? "Fix" : "Lint"} [All-Packages]`, [
1459
+ ["eslint", fixOptions]
1460
+ ]);
1461
+ console.log(chalk15.gray(`${fix2 ? "Fixed in" : "Linted in"} [${chalk15.magenta(((Date.now() - start) / 1e3).toFixed(2))}] ${chalk15.gray("seconds")}`));
1462
+ return result;
1463
+ };
1464
+
1465
+ // src/actions/sonar.ts
1466
+ var sonar = () => {
1467
+ return runSteps("Sonar", [["eslint", ["-c", "sonar.eslintrc", "."]]]);
1468
+ };
1469
+
1470
+ // src/xy/param.ts
1471
+ var packagePositionalParam = (yargs) => {
1472
+ return yargs.positional("package", { describe: "Specific package to target", type: "string" });
1473
+ };
1474
+
1475
+ // src/xy/lint/cycleCommand.ts
1476
+ var cycleCommand = {
1477
+ command: "cycle [package]",
1478
+ describe: "Cycle - Check for dependency cycles",
1479
+ builder: (yargs) => {
1480
+ return packagePositionalParam(yargs);
1481
+ },
1482
+ handler: async (argv) => {
1483
+ const start = Date.now();
1484
+ if (argv.verbose) console.log("Cycle");
1485
+ process.exitCode = await cycle({ pkg: argv.package });
1486
+ console.log(chalk16.blue(`Finished in ${Date.now() - start}ms`));
1487
+ }
1488
+ };
1489
+
1490
+ // src/xy/lint/deplintCommand.ts
1491
+ import chalk17 from "chalk";
1492
+ var deplintCommand = {
1493
+ command: "deplint [package]",
1494
+ describe: "Deplint - Run Deplint",
1495
+ builder: (yargs) => {
1496
+ return packagePositionalParam(yargs).option("deps", {
1497
+ alias: "d",
1498
+ default: false,
1499
+ description: "Check dependencies",
1500
+ type: "boolean"
1501
+ }).option("devDeps", {
1502
+ alias: "v",
1503
+ default: false,
1504
+ description: "Check devDependencies",
1505
+ type: "boolean"
1506
+ }).option("peerDeps", {
1507
+ alias: "p",
1508
+ default: false,
1509
+ description: "Check peerDependencies",
1510
+ type: "boolean"
1511
+ }).option("exclude", {
1512
+ alias: "e",
1513
+ description: "Package names to exclude from unused checks (comma-separated or repeated)",
1514
+ type: "array"
1515
+ });
1516
+ },
1517
+ handler: async (argv) => {
1518
+ if (argv.verbose) console.log("Deplint");
1519
+ const start = Date.now();
1520
+ const cliExclude = argv.exclude?.flatMap((v) => String(v).split(",")).map((v) => v.trim()).filter(Boolean);
1521
+ process.exitCode = await deplint({
1522
+ cliExclude,
1523
+ pkg: argv.package,
1524
+ deps: !!argv.deps,
1525
+ devDeps: !!argv.devDeps,
1526
+ peerDeps: !!argv.peerDeps,
1527
+ verbose: !!argv.verbose
1528
+ });
1529
+ console.log(chalk17.blue(`Finished in ${Date.now() - start}ms`));
1530
+ }
1531
+ };
1532
+
1533
+ // src/xy/lint/fixCommand.ts
1534
+ import chalk18 from "chalk";
1535
+ var fixCommand = {
1536
+ command: "fix [package]",
1537
+ describe: "Fix - Run Eslint w/fix",
1538
+ builder: (yargs) => {
1539
+ return packagePositionalParam(yargs);
1540
+ },
1541
+ handler: (argv) => {
1542
+ const start = Date.now();
1543
+ if (argv.verbose) console.log("Fix");
1544
+ process.exitCode = fix();
1545
+ console.log(chalk18.blue(`Finished in ${Date.now() - start}ms`));
1546
+ }
1547
+ };
1548
+
1549
+ // src/xy/lint/knipCommand.ts
1550
+ import chalk19 from "chalk";
1551
+ var knipCommand = {
1552
+ command: "knip",
1553
+ describe: "Knip - Run Knip",
1554
+ builder: (yargs) => {
1555
+ return packagePositionalParam(yargs);
1556
+ },
1557
+ handler: (argv) => {
1558
+ if (argv.verbose) console.log("Knip");
1559
+ const start = Date.now();
1560
+ process.exitCode = knip();
1561
+ console.log(chalk19.blue(`Knip finished in ${Date.now() - start}ms`));
1562
+ }
1563
+ };
1564
+
1565
+ // src/xy/lint/lintCommand.ts
1566
+ import chalk20 from "chalk";
1567
+ var lintCommand = {
1568
+ command: "lint [package]",
1569
+ describe: "Lint - Run Eslint",
1570
+ builder: (yargs) => {
1571
+ return packagePositionalParam(yargs).option("fix", {
1572
+ alias: "f",
1573
+ default: false,
1574
+ description: "Fix fixable issues",
1575
+ type: "boolean"
1576
+ }).option("cache", {
1577
+ alias: "c",
1578
+ default: false,
1579
+ description: "Use caching for performance",
1580
+ type: "boolean"
1581
+ });
1582
+ },
1583
+ handler: (argv) => {
1584
+ if (argv.verbose) console.log("Lint");
1585
+ const start = Date.now();
1586
+ process.exitCode = argv.fix ? fix({
1587
+ pkg: argv.package,
1588
+ cache: argv.cache,
1589
+ verbose: !!argv.verbose
1590
+ }) : lint({
1591
+ pkg: argv.package,
1592
+ cache: argv.cache,
1593
+ verbose: !!argv.verbose
1594
+ });
1595
+ console.log(chalk20.blue(`Finished in ${Date.now() - start}ms`));
1596
+ }
1597
+ };
1598
+
1599
+ // src/xy/lint/lintlintCommand.ts
1600
+ var lintlintCommand = {
1601
+ command: "lintlint",
1602
+ describe: "Lint Lint - Check for redundant or overridden ESLint rules vs shared config",
1603
+ builder: (yargs) => {
1604
+ return yargs.option("fix", {
1605
+ default: false,
1606
+ description: "Remove redundant rules from local config",
1607
+ type: "boolean"
1608
+ });
1609
+ },
1610
+ handler: async (argv) => {
1611
+ if (argv.verbose) console.log("Lint Lint");
1612
+ process.exitCode = await lintlint({
1613
+ fix: argv.fix,
1614
+ verbose: !!argv.verbose
1615
+ });
1616
+ }
1617
+ };
1618
+
1619
+ // src/xy/lint/packageLintCommand.ts
1620
+ var packageLintCommand = {
1621
+ builder: (yargs) => {
1622
+ return yargs.option("fix", {
1623
+ default: false,
1624
+ description: "Auto-fix fixable issues",
1625
+ type: "boolean"
1626
+ });
1627
+ },
1628
+ command: "package-lint",
1629
+ describe: "Package Lint - Check monorepo package structure",
1630
+ handler: (argv) => {
1631
+ if (argv.verbose) console.log("Package Lint");
1632
+ process.exitCode = packageLintMonorepo(!!argv.fix);
1633
+ }
1634
+ };
1635
+
1636
+ // src/xy/lint/publintCommand.ts
1637
+ import chalk21 from "chalk";
1638
+ var publintCommand = {
1639
+ command: "publint [package]",
1640
+ describe: "Publint - Run Publint",
1641
+ builder: (yargs) => {
1642
+ return packagePositionalParam(yargs);
1643
+ },
1644
+ handler: async (argv) => {
1645
+ if (argv.verbose) console.log("Publint");
1646
+ const start = Date.now();
1647
+ process.exitCode = await publint({ pkg: argv.package, verbose: !!argv.verbose });
1648
+ console.log(chalk21.blue(`Finished in ${Date.now() - start}ms`));
1649
+ }
1650
+ };
1651
+
1652
+ // src/xy/lint/relintCommand.ts
1653
+ import chalk22 from "chalk";
1654
+ var relintCommand = {
1655
+ command: "relint [package]",
1656
+ describe: "Relint - Clean & Lint",
1657
+ builder: (yargs) => {
1658
+ return packagePositionalParam(yargs);
1659
+ },
1660
+ handler: (argv) => {
1661
+ if (argv.verbose) console.log("Relinting");
1662
+ const start = Date.now();
1663
+ process.exitCode = relint();
1664
+ console.log(chalk22.blue(`Finished in ${Date.now() - start}ms`));
1665
+ }
1666
+ };
1667
+
1668
+ // src/xy/lint/sonarCommand.ts
1669
+ import chalk23 from "chalk";
1670
+ var sonarCommand = {
1671
+ command: "sonar",
1672
+ describe: "Sonar - Run Sonar Check",
1673
+ builder: (yargs) => {
1674
+ return packagePositionalParam(yargs);
1675
+ },
1676
+ handler: (argv) => {
1677
+ const start = Date.now();
1678
+ if (argv.verbose) console.log("Sonar Check");
1679
+ process.exitCode = sonar();
1680
+ console.log(chalk23.blue(`Finished in ${Date.now() - start}ms`));
1681
+ }
1682
+ };
1683
+
1684
+ // src/xy/lint/index.ts
1685
+ var xyLintCommands = (args) => {
1686
+ return args.command(cycleCommand).command(lintCommand).command(lintlintCommand).command(deplintCommand).command(fixCommand).command(relintCommand).command(publintCommand).command(knipCommand).command(packageLintCommand).command(sonarCommand);
1687
+ };
1688
+ export {
1689
+ xyLintCommands
1690
+ };
1691
+ //# sourceMappingURL=index.mjs.map