@next-vibe/checker 1.0.11 → 1.0.13

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 (400) hide show
  1. package/.dist/bin/vibe-runtime.js +26 -22
  2. package/.dist/bin/vibe-runtime.js.map +5 -5
  3. package/.dist/oxlint-plugins/i18n.js +4 -0
  4. package/.dist/oxlint-plugins/i18n.js.map +1 -0
  5. package/.dist/oxlint-plugins/jsx-capitalization.js +4 -0
  6. package/.dist/oxlint-plugins/jsx-capitalization.js.map +1 -0
  7. package/.dist/oxlint-plugins/restricted-syntax.js +4 -0
  8. package/.dist/oxlint-plugins/restricted-syntax.js.map +1 -0
  9. package/check.config.ts +4 -12
  10. package/package.json +2 -9
  11. package/src/app/api/[locale]/LICENSE +674 -0
  12. package/src/app/api/[locale]/i18n/de/index.ts +13 -0
  13. package/src/app/api/[locale]/i18n/en/index.ts +12 -0
  14. package/src/app/api/[locale]/i18n/pl/index.ts +11 -0
  15. package/src/app/api/[locale]/shared/i18n/de/index.ts +85 -0
  16. package/src/app/api/[locale]/shared/i18n/en/index.ts +83 -0
  17. package/src/app/api/[locale]/shared/i18n/pl/index.ts +85 -0
  18. package/src/app/api/[locale]/shared/stats-filtering.ts +202 -0
  19. package/src/app/api/[locale]/shared/types/common.schema.ts +55 -0
  20. package/src/app/api/[locale]/shared/types/response.schema.ts +372 -0
  21. package/src/app/api/[locale]/shared/types/stats-filtering.schema.ts +375 -0
  22. package/src/app/api/[locale]/shared/types/utils.ts +190 -0
  23. package/src/app/api/[locale]/shared/utils/base64.ts +49 -0
  24. package/src/app/api/[locale]/shared/utils/env-util.ts +40 -0
  25. package/src/app/api/[locale]/shared/utils/i18n/de/index.ts +21 -0
  26. package/src/app/api/[locale]/shared/utils/i18n/en/index.ts +19 -0
  27. package/src/app/api/[locale]/shared/utils/i18n/pl/index.ts +21 -0
  28. package/src/app/api/[locale]/shared/utils/index.ts +11 -0
  29. package/src/app/api/[locale]/shared/utils/object-path.ts +41 -0
  30. package/src/app/api/[locale]/shared/utils/object.test.ts +82 -0
  31. package/src/app/api/[locale]/shared/utils/object.ts +75 -0
  32. package/src/app/api/[locale]/shared/utils/parse-error.ts +134 -0
  33. package/src/app/api/[locale]/shared/utils/parse-json.ts +70 -0
  34. package/src/app/api/[locale]/shared/utils/time.ts +53 -0
  35. package/src/app/api/[locale]/shared/utils/validation.ts +127 -0
  36. package/src/app/api/[locale]/shared/utils/zod-required-fields.ts +116 -0
  37. package/src/app/api/[locale]/system/builder/definition.ts +1942 -0
  38. package/src/app/api/[locale]/system/builder/enum.ts +78 -0
  39. package/src/app/api/[locale]/system/builder/i18n/de/index.ts +677 -0
  40. package/src/app/api/[locale]/system/builder/i18n/en/index.ts +665 -0
  41. package/src/app/api/[locale]/system/builder/i18n/pl/index.ts +668 -0
  42. package/src/app/api/[locale]/system/builder/repository/build-executor.test.ts +182 -0
  43. package/src/app/api/[locale]/system/builder/repository/build-executor.ts +583 -0
  44. package/src/app/api/[locale]/system/builder/repository/bun-compiler.ts +261 -0
  45. package/src/app/api/[locale]/system/builder/repository/bundle-analyzer.ts +197 -0
  46. package/src/app/api/[locale]/system/builder/repository/config-loader.ts +159 -0
  47. package/src/app/api/[locale]/system/builder/repository/config-validator.ts +97 -0
  48. package/src/app/api/[locale]/system/builder/repository/constants.ts +125 -0
  49. package/src/app/api/[locale]/system/builder/repository/error-suggester.ts +75 -0
  50. package/src/app/api/[locale]/system/builder/repository/file-copier.ts +98 -0
  51. package/src/app/api/[locale]/system/builder/repository/folder-cleaner.ts +80 -0
  52. package/src/app/api/[locale]/system/builder/repository/index.ts +2 -0
  53. package/src/app/api/[locale]/system/builder/repository/npm-package-generator.ts +146 -0
  54. package/src/app/api/[locale]/system/builder/repository/output-formatter.ts +104 -0
  55. package/src/app/api/[locale]/system/builder/repository/profile-service.ts +79 -0
  56. package/src/app/api/[locale]/system/builder/repository/report-generator.ts +125 -0
  57. package/src/app/api/[locale]/system/builder/repository/vite-compiler.ts +291 -0
  58. package/src/app/api/[locale]/system/builder/route.ts +21 -0
  59. package/src/app/api/[locale]/system/builder/test-files/file1.ts +2 -0
  60. package/src/app/api/[locale]/system/builder/test-files/file2.tsx +10 -0
  61. package/src/app/api/[locale]/system/builder/test-files/file3.tsx +16 -0
  62. package/src/app/api/[locale]/system/builder/test-files/folderToCopy/fileInFolder.ts +2 -0
  63. package/src/app/api/[locale]/system/builder/test-files/test-config.ts +38 -0
  64. package/src/app/api/[locale]/system/builder/test-files/test-delete-config.ts +8 -0
  65. package/src/app/api/[locale]/system/builder/test-files/test-project/package.json +24 -0
  66. package/src/app/api/[locale]/system/builder/test-files/test-project/src/constants.ts +6 -0
  67. package/src/app/api/[locale]/system/builder/test-files/test-project/src/greet.ts +18 -0
  68. package/src/app/api/[locale]/system/builder/test-files/test-project/src/index.ts +7 -0
  69. package/src/app/api/[locale]/system/builder/test-files/test-project/src/utils/calculate.ts +27 -0
  70. package/src/app/api/[locale]/system/builder/test-files/test-project/tsconfig.json +19 -0
  71. package/src/app/api/[locale]/system/builder/test-files/test-project/tsconfig.tsbuildinfo +1 -0
  72. package/src/app/api/[locale]/system/builder/test-files/test3.css +1 -0
  73. package/src/app/api/[locale]/system/check/config/repository.ts +886 -0
  74. package/src/app/api/[locale]/system/check/config/shared.ts +396 -0
  75. package/src/app/api/[locale]/system/check/config/types.ts +616 -0
  76. package/src/app/api/[locale]/system/check/config/utils.ts +171 -0
  77. package/src/app/api/[locale]/system/check/i18n/de/index.ts +15 -0
  78. package/src/app/api/[locale]/system/check/i18n/en/index.ts +14 -0
  79. package/src/app/api/[locale]/system/check/i18n/pl/index.ts +15 -0
  80. package/src/app/api/[locale]/system/check/lint/definition.ts +414 -0
  81. package/src/app/api/[locale]/system/check/lint/enum.ts +37 -0
  82. package/src/app/api/[locale]/system/check/lint/i18n/de/index.ts +164 -0
  83. package/src/app/api/[locale]/system/check/lint/i18n/en/index.ts +162 -0
  84. package/src/app/api/[locale]/system/check/lint/i18n/pl/index.ts +164 -0
  85. package/src/app/api/[locale]/system/check/lint/repository.ts +753 -0
  86. package/src/app/api/[locale]/system/check/lint/route.ts +21 -0
  87. package/src/app/api/[locale]/system/check/oxlint/README.md +190 -0
  88. package/src/app/api/[locale]/system/check/oxlint/definition.ts +414 -0
  89. package/src/app/api/[locale]/system/check/oxlint/enum.ts +37 -0
  90. package/src/app/api/[locale]/system/check/oxlint/i18n/de/index.ts +171 -0
  91. package/src/app/api/[locale]/system/check/oxlint/i18n/en/index.ts +168 -0
  92. package/src/app/api/[locale]/system/check/oxlint/i18n/pl/index.ts +172 -0
  93. package/src/app/api/[locale]/system/check/oxlint/plugins/i18n/src/index.ts +372 -0
  94. package/src/app/api/[locale]/system/check/oxlint/plugins/jsx-capitalization/README.md +246 -0
  95. package/src/app/api/[locale]/system/check/oxlint/plugins/jsx-capitalization/src/index.ts +583 -0
  96. package/src/app/api/[locale]/system/check/oxlint/plugins/restricted-syntax/src/index.ts +500 -0
  97. package/src/app/api/[locale]/system/check/oxlint/plugins/restricted-syntax/test.tsx +74 -0
  98. package/src/app/api/[locale]/system/check/oxlint/plugins/shared/config-loader.ts +305 -0
  99. package/src/app/api/[locale]/system/check/oxlint/repository.ts +959 -0
  100. package/src/app/api/[locale]/system/check/oxlint/route.ts +21 -0
  101. package/src/app/api/[locale]/system/check/oxlint/types.ts +193 -0
  102. package/src/app/api/[locale]/system/check/test-project/bun.lock +532 -0
  103. package/src/app/api/[locale]/system/check/test-project/check.config.ts +981 -0
  104. package/src/app/api/[locale]/system/check/test-project/package.json +12 -0
  105. package/src/app/api/[locale]/system/check/test-project/src/constants.ts +6 -0
  106. package/src/app/api/[locale]/system/check/test-project/src/greet.ts +18 -0
  107. package/src/app/api/[locale]/system/check/test-project/src/test-issues/a11y-issues.tsx +107 -0
  108. package/src/app/api/[locale]/system/check/test-project/src/test-issues/eslint-issues.tsx +37 -0
  109. package/src/app/api/[locale]/system/check/test-project/src/test-issues/general-issues.ts +137 -0
  110. package/src/app/api/[locale]/system/check/test-project/src/test-issues/i18n-issues.tsx +129 -0
  111. package/src/app/api/[locale]/system/check/test-project/src/test-issues/jsx-capitalization-issues.tsx +131 -0
  112. package/src/app/api/[locale]/system/check/test-project/src/test-issues/nextjs-issues.tsx +95 -0
  113. package/src/app/api/[locale]/system/check/test-project/src/test-issues/promise-issues.ts +76 -0
  114. package/src/app/api/[locale]/system/check/test-project/src/test-issues/react-issues.tsx +95 -0
  115. package/src/app/api/[locale]/system/check/test-project/src/test-issues/restricted-syntax-issues.tsx +61 -0
  116. package/src/app/api/[locale]/system/check/test-project/src/test-issues/typescript-issues.ts +80 -0
  117. package/src/app/api/[locale]/system/check/test-project/src/utils/calculate.ts +27 -0
  118. package/src/app/api/[locale]/system/check/test-project/tsconfig.json +34 -0
  119. package/src/app/api/[locale]/system/check/test-project/tsconfig.tsbuildinfo +1 -0
  120. package/src/app/api/[locale]/system/check/typecheck/definition.ts +369 -0
  121. package/src/app/api/[locale]/system/check/typecheck/enum.ts +37 -0
  122. package/src/app/api/[locale]/system/check/typecheck/i18n/de/index.ts +159 -0
  123. package/src/app/api/[locale]/system/check/typecheck/i18n/en/index.ts +150 -0
  124. package/src/app/api/[locale]/system/check/typecheck/i18n/pl/index.ts +155 -0
  125. package/src/app/api/[locale]/system/check/typecheck/repository.ts +919 -0
  126. package/src/app/api/[locale]/system/check/typecheck/route.ts +22 -0
  127. package/src/app/api/[locale]/system/check/typecheck/utils.ts +168 -0
  128. package/src/app/api/[locale]/system/check/vibe-check/definition.ts +568 -0
  129. package/src/app/api/[locale]/system/check/vibe-check/enum.ts +69 -0
  130. package/src/app/api/[locale]/system/check/vibe-check/i18n/de/index.ts +192 -0
  131. package/src/app/api/[locale]/system/check/vibe-check/i18n/en/index.ts +189 -0
  132. package/src/app/api/[locale]/system/check/vibe-check/i18n/pl/index.ts +192 -0
  133. package/src/app/api/[locale]/system/check/vibe-check/repository.ts +545 -0
  134. package/src/app/api/[locale]/system/check/vibe-check/route.test.ts +1142 -0
  135. package/src/app/api/[locale]/system/check/vibe-check/route.ts +21 -0
  136. package/src/app/api/[locale]/system/generated/endpoint.ts +313 -0
  137. package/src/app/api/[locale]/system/generated/endpoints.ts +156 -0
  138. package/src/app/api/[locale]/system/generated/route-handlers.ts +224 -0
  139. package/src/app/api/[locale]/system/generators/endpoint/definition.ts +193 -0
  140. package/src/app/api/[locale]/system/generators/endpoint/i18n/de/index.ts +48 -0
  141. package/src/app/api/[locale]/system/generators/endpoint/i18n/en/index.ts +48 -0
  142. package/src/app/api/[locale]/system/generators/endpoint/i18n/pl/index.ts +50 -0
  143. package/src/app/api/[locale]/system/generators/endpoint/repository.ts +291 -0
  144. package/src/app/api/[locale]/system/generators/endpoint/route.ts +21 -0
  145. package/src/app/api/[locale]/system/generators/endpoints/definition.ts +246 -0
  146. package/src/app/api/[locale]/system/generators/endpoints/i18n/de/index.ts +54 -0
  147. package/src/app/api/[locale]/system/generators/endpoints/i18n/en/index.ts +52 -0
  148. package/src/app/api/[locale]/system/generators/endpoints/i18n/pl/index.ts +54 -0
  149. package/src/app/api/[locale]/system/generators/endpoints/options-repository.ts +463 -0
  150. package/src/app/api/[locale]/system/generators/endpoints/repository.ts +383 -0
  151. package/src/app/api/[locale]/system/generators/endpoints/route.ts +18 -0
  152. package/src/app/api/[locale]/system/generators/endpoints-index/definition.ts +194 -0
  153. package/src/app/api/[locale]/system/generators/endpoints-index/i18n/de/index.ts +71 -0
  154. package/src/app/api/[locale]/system/generators/endpoints-index/i18n/en/index.ts +69 -0
  155. package/src/app/api/[locale]/system/generators/endpoints-index/i18n/pl/index.ts +71 -0
  156. package/src/app/api/[locale]/system/generators/endpoints-index/repository.ts +294 -0
  157. package/src/app/api/[locale]/system/generators/endpoints-index/route.ts +18 -0
  158. package/src/app/api/[locale]/system/generators/generate-all/definition.ts +355 -0
  159. package/src/app/api/[locale]/system/generators/generate-all/i18n/de/index.ts +96 -0
  160. package/src/app/api/[locale]/system/generators/generate-all/i18n/en/index.ts +94 -0
  161. package/src/app/api/[locale]/system/generators/generate-all/i18n/pl/index.ts +96 -0
  162. package/src/app/api/[locale]/system/generators/generate-all/repository.ts +257 -0
  163. package/src/app/api/[locale]/system/generators/generate-all/route.ts +20 -0
  164. package/src/app/api/[locale]/system/generators/i18n/de/index.ts +15 -0
  165. package/src/app/api/[locale]/system/generators/i18n/en/index.ts +14 -0
  166. package/src/app/api/[locale]/system/generators/i18n/pl/index.ts +15 -0
  167. package/src/app/api/[locale]/system/generators/route-handlers/definition.ts +198 -0
  168. package/src/app/api/[locale]/system/generators/route-handlers/i18n/de/index.ts +48 -0
  169. package/src/app/api/[locale]/system/generators/route-handlers/i18n/en/index.ts +48 -0
  170. package/src/app/api/[locale]/system/generators/route-handlers/i18n/pl/index.ts +50 -0
  171. package/src/app/api/[locale]/system/generators/route-handlers/repository.ts +277 -0
  172. package/src/app/api/[locale]/system/generators/route-handlers/route.ts +17 -0
  173. package/src/app/api/[locale]/system/generators/shared/utils.ts +233 -0
  174. package/src/app/api/[locale]/system/help/definition.ts +445 -0
  175. package/src/app/api/[locale]/system/help/i18n/de/index.ts +267 -0
  176. package/src/app/api/[locale]/system/help/i18n/en/index.ts +262 -0
  177. package/src/app/api/[locale]/system/help/i18n/pl/index.ts +265 -0
  178. package/src/app/api/[locale]/system/help/interactive/definition.ts +125 -0
  179. package/src/app/api/[locale]/system/help/interactive/i18n/de/index.ts +22 -0
  180. package/src/app/api/[locale]/system/help/interactive/i18n/en/index.ts +19 -0
  181. package/src/app/api/[locale]/system/help/interactive/i18n/pl/index.ts +22 -0
  182. package/src/app/api/[locale]/system/help/interactive/repository.ts +1025 -0
  183. package/src/app/api/[locale]/system/help/interactive/route.ts +53 -0
  184. package/src/app/api/[locale]/system/help/list/definition.ts +372 -0
  185. package/src/app/api/[locale]/system/help/list/repository.ts +110 -0
  186. package/src/app/api/[locale]/system/help/list/route.ts +21 -0
  187. package/src/app/api/[locale]/system/help/repository.ts +212 -0
  188. package/src/app/api/[locale]/system/help/route.ts +16 -0
  189. package/src/app/api/[locale]/system/i18n/de/index.ts +68 -0
  190. package/src/app/api/[locale]/system/i18n/en/index.ts +65 -0
  191. package/src/app/api/[locale]/system/i18n/pl/index.ts +66 -0
  192. package/src/app/api/[locale]/system/release-tool/definition.ts +3104 -0
  193. package/src/app/api/[locale]/system/release-tool/i18n/de/index.ts +813 -0
  194. package/src/app/api/[locale]/system/release-tool/i18n/en/index.ts +797 -0
  195. package/src/app/api/[locale]/system/release-tool/i18n/pl/index.ts +810 -0
  196. package/src/app/api/[locale]/system/release-tool/repository/asset-zipper.ts +128 -0
  197. package/src/app/api/[locale]/system/release-tool/repository/changelog-generator.ts +212 -0
  198. package/src/app/api/[locale]/system/release-tool/repository/ci-detector.ts +566 -0
  199. package/src/app/api/[locale]/system/release-tool/repository/config.ts +113 -0
  200. package/src/app/api/[locale]/system/release-tool/repository/constants.ts +407 -0
  201. package/src/app/api/[locale]/system/release-tool/repository/dependency-manager.ts +527 -0
  202. package/src/app/api/[locale]/system/release-tool/repository/git-service.ts +403 -0
  203. package/src/app/api/[locale]/system/release-tool/repository/hook-runner.ts +100 -0
  204. package/src/app/api/[locale]/system/release-tool/repository/index.ts +1 -0
  205. package/src/app/api/[locale]/system/release-tool/repository/notification-service.ts +638 -0
  206. package/src/app/api/[locale]/system/release-tool/repository/package-service.ts +169 -0
  207. package/src/app/api/[locale]/system/release-tool/repository/publisher.ts +253 -0
  208. package/src/app/api/[locale]/system/release-tool/repository/quality-runner.ts +428 -0
  209. package/src/app/api/[locale]/system/release-tool/repository/release-creator.ts +293 -0
  210. package/src/app/api/[locale]/system/release-tool/repository/release-executor.ts +1198 -0
  211. package/src/app/api/[locale]/system/release-tool/repository/snyk-service.ts +136 -0
  212. package/src/app/api/[locale]/system/release-tool/repository/utils.ts +642 -0
  213. package/src/app/api/[locale]/system/release-tool/repository/validation.ts +288 -0
  214. package/src/app/api/[locale]/system/release-tool/repository/version-service.ts +297 -0
  215. package/src/app/api/[locale]/system/release-tool/route.ts +21 -0
  216. package/src/app/api/[locale]/system/unified-interface/README.md +328 -0
  217. package/src/app/api/[locale]/system/unified-interface/cli/README.md +349 -0
  218. package/src/app/api/[locale]/system/unified-interface/cli/auth/cli-handler.ts +95 -0
  219. package/src/app/api/[locale]/system/unified-interface/cli/auth/cli-user.ts +146 -0
  220. package/src/app/api/[locale]/system/unified-interface/cli/auth/session-file.ts +266 -0
  221. package/src/app/api/[locale]/system/unified-interface/cli/env.ts +26 -0
  222. package/src/app/api/[locale]/system/unified-interface/cli/i18n/de/index.ts +157 -0
  223. package/src/app/api/[locale]/system/unified-interface/cli/i18n/en/index.ts +155 -0
  224. package/src/app/api/[locale]/system/unified-interface/cli/i18n/pl/index.ts +158 -0
  225. package/src/app/api/[locale]/system/unified-interface/cli/runtime/debug.ts +595 -0
  226. package/src/app/api/[locale]/system/unified-interface/cli/runtime/entry-point.ts +129 -0
  227. package/src/app/api/[locale]/system/unified-interface/cli/runtime/environment.ts +155 -0
  228. package/src/app/api/[locale]/system/unified-interface/cli/runtime/execution-errors.ts +452 -0
  229. package/src/app/api/[locale]/system/unified-interface/cli/runtime/parsing.ts +297 -0
  230. package/src/app/api/[locale]/system/unified-interface/cli/runtime/route-executor.ts +859 -0
  231. package/src/app/api/[locale]/system/unified-interface/cli/setup/i18n/de/index.ts +12 -0
  232. package/src/app/api/[locale]/system/unified-interface/cli/setup/i18n/en/index.ts +11 -0
  233. package/src/app/api/[locale]/system/unified-interface/cli/setup/i18n/pl/index.ts +12 -0
  234. package/src/app/api/[locale]/system/unified-interface/cli/setup/install/definition.ts +262 -0
  235. package/src/app/api/[locale]/system/unified-interface/cli/setup/install/i18n/de/index.ts +54 -0
  236. package/src/app/api/[locale]/system/unified-interface/cli/setup/install/i18n/en/index.ts +52 -0
  237. package/src/app/api/[locale]/system/unified-interface/cli/setup/install/i18n/pl/index.ts +54 -0
  238. package/src/app/api/[locale]/system/unified-interface/cli/setup/install/repository.ts +421 -0
  239. package/src/app/api/[locale]/system/unified-interface/cli/setup/install/route.ts +25 -0
  240. package/src/app/api/[locale]/system/unified-interface/cli/setup/status/definition.ts +181 -0
  241. package/src/app/api/[locale]/system/unified-interface/cli/setup/status/i18n/de/index.ts +61 -0
  242. package/src/app/api/[locale]/system/unified-interface/cli/setup/status/i18n/en/index.ts +59 -0
  243. package/src/app/api/[locale]/system/unified-interface/cli/setup/status/i18n/pl/index.ts +61 -0
  244. package/src/app/api/[locale]/system/unified-interface/cli/setup/status/repository.ts +195 -0
  245. package/src/app/api/[locale]/system/unified-interface/cli/setup/status/route.ts +22 -0
  246. package/src/app/api/[locale]/system/unified-interface/cli/setup/uninstall/definition.ts +188 -0
  247. package/src/app/api/[locale]/system/unified-interface/cli/setup/uninstall/i18n/de/index.ts +54 -0
  248. package/src/app/api/[locale]/system/unified-interface/cli/setup/uninstall/i18n/en/index.ts +52 -0
  249. package/src/app/api/[locale]/system/unified-interface/cli/setup/uninstall/i18n/pl/index.ts +54 -0
  250. package/src/app/api/[locale]/system/unified-interface/cli/setup/uninstall/repository.ts +209 -0
  251. package/src/app/api/[locale]/system/unified-interface/cli/setup/uninstall/route.ts +24 -0
  252. package/src/app/api/[locale]/system/unified-interface/cli/setup/update/definition.ts +200 -0
  253. package/src/app/api/[locale]/system/unified-interface/cli/setup/update/i18n/de/index.ts +54 -0
  254. package/src/app/api/[locale]/system/unified-interface/cli/setup/update/i18n/en/index.ts +52 -0
  255. package/src/app/api/[locale]/system/unified-interface/cli/setup/update/i18n/pl/index.ts +54 -0
  256. package/src/app/api/[locale]/system/unified-interface/cli/setup/update/repository.ts +113 -0
  257. package/src/app/api/[locale]/system/unified-interface/cli/setup/update/route.ts +22 -0
  258. package/src/app/api/[locale]/system/unified-interface/cli/vibe-runtime.ts +304 -0
  259. package/src/app/api/[locale]/system/unified-interface/cli/widgets/core/base-renderer.ts +270 -0
  260. package/src/app/api/[locale]/system/unified-interface/cli/widgets/core/registry.ts +309 -0
  261. package/src/app/api/[locale]/system/unified-interface/cli/widgets/core/types.ts +126 -0
  262. package/src/app/api/[locale]/system/unified-interface/cli/widgets/i18n/de/index.ts +67 -0
  263. package/src/app/api/[locale]/system/unified-interface/cli/widgets/i18n/en/index.ts +65 -0
  264. package/src/app/api/[locale]/system/unified-interface/cli/widgets/i18n/pl/index.ts +67 -0
  265. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/accordion.ts +74 -0
  266. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/avatar.ts +39 -0
  267. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/badge.ts +54 -0
  268. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/code-output.ts +298 -0
  269. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/code-quality-files.ts +89 -0
  270. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/code-quality-list.ts +298 -0
  271. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/code-quality-summary.ts +96 -0
  272. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/container.ts +186 -0
  273. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/data-card.ts +65 -0
  274. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/data-cards.ts +570 -0
  275. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/data-list.ts +80 -0
  276. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/data-table.ts +385 -0
  277. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/editable-text.ts +99 -0
  278. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/empty-state.ts +55 -0
  279. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/errors.ts +67 -0
  280. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/grouped-list.ts +729 -0
  281. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/link-card.ts +87 -0
  282. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/link-list.ts +112 -0
  283. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/link.ts +59 -0
  284. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/loading.ts +50 -0
  285. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/markdown.ts +131 -0
  286. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/metric.ts +291 -0
  287. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/section.ts +120 -0
  288. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/stats-grid.ts +149 -0
  289. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/tabs.ts +61 -0
  290. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/text.ts +78 -0
  291. package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/title.ts +42 -0
  292. package/src/app/api/[locale]/system/unified-interface/cli/widgets/renderers/response-renderer.ts +418 -0
  293. package/src/app/api/[locale]/system/unified-interface/cli/widgets/renderers/schema-handler.ts +534 -0
  294. package/src/app/api/[locale]/system/unified-interface/i18n/de/index.ts +42 -0
  295. package/src/app/api/[locale]/system/unified-interface/i18n/en/index.ts +40 -0
  296. package/src/app/api/[locale]/system/unified-interface/i18n/pl/index.ts +43 -0
  297. package/src/app/api/[locale]/system/unified-interface/mcp/README.md +114 -0
  298. package/src/app/api/[locale]/system/unified-interface/mcp/converter.ts +146 -0
  299. package/src/app/api/[locale]/system/unified-interface/mcp/i18n/de/index.ts +182 -0
  300. package/src/app/api/[locale]/system/unified-interface/mcp/i18n/en/index.ts +179 -0
  301. package/src/app/api/[locale]/system/unified-interface/mcp/i18n/pl/index.ts +181 -0
  302. package/src/app/api/[locale]/system/unified-interface/mcp/registry.ts +343 -0
  303. package/src/app/api/[locale]/system/unified-interface/mcp/serve/definition.ts +147 -0
  304. package/src/app/api/[locale]/system/unified-interface/mcp/serve/repository.ts +38 -0
  305. package/src/app/api/[locale]/system/unified-interface/mcp/serve/route.ts +14 -0
  306. package/src/app/api/[locale]/system/unified-interface/mcp/server/protocol-handler.ts +309 -0
  307. package/src/app/api/[locale]/system/unified-interface/mcp/server/server.ts +154 -0
  308. package/src/app/api/[locale]/system/unified-interface/mcp/server/stdio-transport.ts +193 -0
  309. package/src/app/api/[locale]/system/unified-interface/mcp/types.ts +246 -0
  310. package/src/app/api/[locale]/system/unified-interface/shared/endpoints/definition/create-form.ts +1510 -0
  311. package/src/app/api/[locale]/system/unified-interface/shared/endpoints/definition/create.ts +581 -0
  312. package/src/app/api/[locale]/system/unified-interface/shared/endpoints/definition/endpoint-to-metadata.ts +52 -0
  313. package/src/app/api/[locale]/system/unified-interface/shared/endpoints/definition/loader.ts +152 -0
  314. package/src/app/api/[locale]/system/unified-interface/shared/endpoints/definitions/registry.ts +265 -0
  315. package/src/app/api/[locale]/system/unified-interface/shared/endpoints/permissions/registry.ts +680 -0
  316. package/src/app/api/[locale]/system/unified-interface/shared/endpoints/route/executor.ts +220 -0
  317. package/src/app/api/[locale]/system/unified-interface/shared/endpoints/route/handler.ts +325 -0
  318. package/src/app/api/[locale]/system/unified-interface/shared/endpoints/route/multi.ts +184 -0
  319. package/src/app/api/[locale]/system/unified-interface/shared/endpoints/route/request-validator.ts +201 -0
  320. package/src/app/api/[locale]/system/unified-interface/shared/endpoints/route/single.ts +58 -0
  321. package/src/app/api/[locale]/system/unified-interface/shared/env/define-env-client.ts +49 -0
  322. package/src/app/api/[locale]/system/unified-interface/shared/env/define-env.ts +47 -0
  323. package/src/app/api/[locale]/system/unified-interface/shared/env/validation-logger.ts +58 -0
  324. package/src/app/api/[locale]/system/unified-interface/shared/field/enum.ts +110 -0
  325. package/src/app/api/[locale]/system/unified-interface/shared/field/specialized.ts +339 -0
  326. package/src/app/api/[locale]/system/unified-interface/shared/field/utils.test.ts +408 -0
  327. package/src/app/api/[locale]/system/unified-interface/shared/field/utils.ts +1349 -0
  328. package/src/app/api/[locale]/system/unified-interface/shared/field-config/endpoint-field-types.ts +107 -0
  329. package/src/app/api/[locale]/system/unified-interface/shared/field-config/field-config-types.ts +268 -0
  330. package/src/app/api/[locale]/system/unified-interface/shared/logger/colors.ts +114 -0
  331. package/src/app/api/[locale]/system/unified-interface/shared/logger/endpoint.ts +169 -0
  332. package/src/app/api/[locale]/system/unified-interface/shared/logger/file-logger.ts +88 -0
  333. package/src/app/api/[locale]/system/unified-interface/shared/logger/formatters.ts +177 -0
  334. package/src/app/api/[locale]/system/unified-interface/shared/server-only/auth/base-auth-handler.ts +82 -0
  335. package/src/app/api/[locale]/system/unified-interface/shared/server-only/auth/factory.ts +33 -0
  336. package/src/app/api/[locale]/system/unified-interface/shared/server-only/server-only.ts +4 -0
  337. package/src/app/api/[locale]/system/unified-interface/shared/types/actions.ts +289 -0
  338. package/src/app/api/[locale]/system/unified-interface/shared/types/endpoint.ts +1167 -0
  339. package/src/app/api/[locale]/system/unified-interface/shared/types/enums.ts +382 -0
  340. package/src/app/api/[locale]/system/unified-interface/shared/types/platform.ts +34 -0
  341. package/src/app/api/[locale]/system/unified-interface/shared/types/types.ts +80 -0
  342. package/src/app/api/[locale]/system/unified-interface/shared/types/ui-config.ts +76 -0
  343. package/src/app/api/[locale]/system/unified-interface/shared/utils/error-types.ts +27 -0
  344. package/src/app/api/[locale]/system/unified-interface/shared/utils/path.ts +63 -0
  345. package/src/app/api/[locale]/system/unified-interface/shared/utils/scanner.ts +241 -0
  346. package/src/app/api/[locale]/system/unified-interface/shared/widgets/actions.ts +256 -0
  347. package/src/app/api/[locale]/system/unified-interface/shared/widgets/configs.ts +1158 -0
  348. package/src/app/api/[locale]/system/unified-interface/shared/widgets/helpers.ts +80 -0
  349. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/accordion.ts +82 -0
  350. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/avatar.ts +75 -0
  351. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/badge.ts +89 -0
  352. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/code-output.ts +302 -0
  353. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/code-quality-list.ts +202 -0
  354. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/container.ts +129 -0
  355. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/data-card.ts +81 -0
  356. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/data-cards.ts +258 -0
  357. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/data-list.ts +123 -0
  358. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/data-table.ts +387 -0
  359. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/editable-text.ts +89 -0
  360. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/empty-state.ts +78 -0
  361. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/errors.ts +93 -0
  362. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/grouped-list.ts +448 -0
  363. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/index.ts +38 -0
  364. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/link-card.ts +130 -0
  365. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/link-list.ts +127 -0
  366. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/link.ts +68 -0
  367. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/loading.ts +81 -0
  368. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/markdown.ts +176 -0
  369. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/metric-card.ts +241 -0
  370. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/section.ts +90 -0
  371. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/stats-grid.ts +71 -0
  372. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/tabs.ts +80 -0
  373. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/text.ts +105 -0
  374. package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/title.ts +72 -0
  375. package/src/app/api/[locale]/system/unified-interface/shared/widgets/types.ts +240 -0
  376. package/src/app/api/[locale]/system/unified-interface/shared/widgets/utils/field-helpers.ts +137 -0
  377. package/src/app/api/[locale]/system/unified-interface/shared/widgets/utils/formatting.ts +437 -0
  378. package/src/app/api/[locale]/system/unified-interface/shared/widgets/utils/url.ts +40 -0
  379. package/src/app/api/[locale]/system/unified-interface/shared/widgets/utils/widget-helpers.ts +465 -0
  380. package/src/app/api/[locale]/user/auth/enum.ts +16 -0
  381. package/src/app/api/[locale]/user/auth/i18n/de/index.ts +227 -0
  382. package/src/app/api/[locale]/user/auth/i18n/en/index.ts +205 -0
  383. package/src/app/api/[locale]/user/auth/i18n/pl/index.ts +219 -0
  384. package/src/app/api/[locale]/user/auth/types.ts +110 -0
  385. package/src/app/api/[locale]/user/enum.ts +64 -0
  386. package/src/app/api/[locale]/user/private/i18n/de/index.ts +3 -0
  387. package/src/app/api/[locale]/user/private/i18n/en/index.ts +1 -0
  388. package/src/app/api/[locale]/user/private/i18n/pl/index.ts +3 -0
  389. package/src/app/api/[locale]/user/types.ts +118 -0
  390. package/src/app/api/[locale]/user/user-roles/enum.ts +112 -0
  391. package/src/app/api/[locale]/user/user-roles/i18n/de/index.ts +85 -0
  392. package/src/app/api/[locale]/user/user-roles/i18n/en/index.ts +83 -0
  393. package/src/app/api/[locale]/user/user-roles/i18n/pl/index.ts +86 -0
  394. package/src/app/api/[locale]/user/user-roles/types.ts +34 -0
  395. package/src/app/api/i18n/de/index.ts +6 -0
  396. package/src/app/api/i18n/en/index.ts +5 -0
  397. package/src/app/api/i18n/pl/index.ts +5 -0
  398. package/src/app/i18n/de/index.ts +6 -0
  399. package/src/app/i18n/en/index.ts +5 -0
  400. package/src/app/i18n/pl/index.ts +5 -0
@@ -0,0 +1,753 @@
1
+ /**
2
+ * Run ESLint Repository (Parallel)
3
+ * Handles parallel eslint operations using Bun.spawn with resource management
4
+ */
5
+
6
+ import { promises as fs } from "node:fs";
7
+ import { dirname, relative, resolve } from "node:path";
8
+
9
+ import type { EndpointLogger } from "@/app/api/[locale]/system/unified-interface/shared/logger/endpoint";
10
+
11
+ import type { ResponseType as ApiResponseType } from "../../../shared/types/response.schema";
12
+ import { success } from "../../../shared/types/response.schema";
13
+ import { parseError } from "../../../shared/utils/parse-error";
14
+ import { ensureConfigReady } from "../config/repository";
15
+ import {
16
+ createWorkerExitCodeMessage,
17
+ createWorkerFailedMessage,
18
+ createWorkerTimeoutMessage,
19
+ discoverFiles,
20
+ distributeFilesAcrossWorkers,
21
+ sortIssuesByLocation,
22
+ } from "../config/shared";
23
+ import { getSystemResources } from "../config/utils";
24
+ import type {
25
+ LintIssue,
26
+ LintRequestOutput,
27
+ LintResponseOutput,
28
+ } from "./definition";
29
+
30
+ /**
31
+ * Worker task for parallel processing
32
+ */
33
+ interface WorkerTask {
34
+ id: number;
35
+ files: string[];
36
+ cacheDir: string;
37
+ eslintConfigPath: string;
38
+ fix: boolean;
39
+ timeout: number;
40
+ }
41
+
42
+ /**
43
+ * Worker result from parallel processing
44
+ */
45
+ interface WorkerResult {
46
+ id: number;
47
+ success: boolean;
48
+ issues: Array<{
49
+ file: string;
50
+ line?: number;
51
+ column?: number;
52
+ rule?: string;
53
+ code?: string;
54
+ severity: "error" | "warning" | "info";
55
+ message: string;
56
+ type: "oxlint" | "lint" | "type";
57
+ }>;
58
+ duration: number;
59
+ error?: string;
60
+ }
61
+
62
+ /**
63
+ * Run ESLint Repository Interface
64
+ */
65
+ export interface LintRepositoryInterface {
66
+ execute(
67
+ data: LintRequestOutput,
68
+ logger: EndpointLogger,
69
+ ): Promise<ApiResponseType<LintResponseOutput>>;
70
+ }
71
+
72
+ /**
73
+ * Run ESLint Repository Implementation (Parallel)
74
+ */
75
+ export class LintRepositoryImpl implements LintRepositoryInterface {
76
+ async execute(
77
+ data: LintRequestOutput,
78
+ logger: EndpointLogger,
79
+ ): Promise<ApiResponseType<LintResponseOutput>> {
80
+ try {
81
+ // Use unified config management - checks, creates if needed, and regenerates
82
+ const configResult = await ensureConfigReady(logger, data.createConfig);
83
+
84
+ if (!configResult.ready) {
85
+ return success({
86
+ issues: {
87
+ items: [
88
+ {
89
+ file: configResult.configPath,
90
+ severity: "error" as const,
91
+ message: configResult.message,
92
+ type: "lint" as const,
93
+ },
94
+ ],
95
+ files: [
96
+ {
97
+ file: configResult.configPath,
98
+ errors: 1,
99
+ warnings: 0,
100
+ total: 1,
101
+ },
102
+ ],
103
+ summary: {
104
+ totalIssues: 1,
105
+ totalFiles: 1,
106
+ totalErrors: 1,
107
+ displayedIssues: 1,
108
+ displayedFiles: 1,
109
+ currentPage: 1,
110
+ totalPages: 1,
111
+ },
112
+ },
113
+ });
114
+ }
115
+
116
+ const checkConfig = configResult.config;
117
+
118
+ // Check if ESLint is enabled in config
119
+ if (!(checkConfig.eslint?.enabled ?? true)) {
120
+ // eslint-disable-next-line i18next/no-literal-string
121
+ logger.info(
122
+ "ESLint is disabled in check.config.ts (eslint.enabled: false)",
123
+ );
124
+
125
+ return success({
126
+ issues: {
127
+ items: [],
128
+ files: [],
129
+ summary: {
130
+ totalIssues: 0,
131
+ totalFiles: 0,
132
+ totalErrors: 0,
133
+ displayedIssues: 0,
134
+ displayedFiles: 0,
135
+ currentPage: 1,
136
+ totalPages: 1,
137
+ },
138
+ },
139
+ });
140
+ }
141
+
142
+ // Check if ESLint is enabled
143
+ if (!checkConfig.eslint.enabled) {
144
+ logger.info("ESLint is disabled in check.config.ts");
145
+ return success({
146
+ issues: {
147
+ items: [],
148
+ files: [],
149
+ summary: {
150
+ totalIssues: 0,
151
+ totalFiles: 0,
152
+ totalErrors: 0,
153
+ displayedIssues: 0,
154
+ displayedFiles: 0,
155
+ currentPage: 1,
156
+ totalPages: 1,
157
+ },
158
+ },
159
+ });
160
+ }
161
+
162
+ logger.debug("ESLint configuration loaded");
163
+
164
+ logger.debug("Starting parallel ESLint execution", {
165
+ path: data.path,
166
+ fix: data.fix,
167
+ });
168
+
169
+ // Get system resources and determine optimal worker count
170
+ const resources = getSystemResources();
171
+ logger.debug("System resources detected", {
172
+ cpus: resources.cpuCores,
173
+ memory: resources.availableMemoryMB,
174
+ });
175
+
176
+ // Discover files to lint using config's ignored directories
177
+ const filesToLint = await discoverFiles(data.path || "./", logger, {
178
+ extensions: checkConfig.eslint.lintableExtensions,
179
+ ignores: checkConfig.eslint.ignores || [],
180
+ });
181
+ logger.debug(`Found ${filesToLint.length} files to lint`);
182
+
183
+ if (filesToLint.length === 0) {
184
+ return success({
185
+ issues: {
186
+ items: [],
187
+ files: [],
188
+ summary: {
189
+ totalIssues: 0,
190
+ totalFiles: 0,
191
+ totalErrors: 0,
192
+ displayedIssues: 0,
193
+ displayedFiles: 0,
194
+ currentPage: 1,
195
+ totalPages: 1,
196
+ },
197
+ },
198
+ });
199
+ }
200
+
201
+ // Distribute files across workers
202
+ const eslintConfigPath = checkConfig.eslint.enabled
203
+ ? resolve(process.cwd(), checkConfig.eslint.configPath)
204
+ : "";
205
+ const workerTasks = this.distributeFiles(
206
+ filesToLint,
207
+ resources.maxWorkers,
208
+ data,
209
+ eslintConfigPath,
210
+ );
211
+ logger.debug(`Distributing work across ${workerTasks.length} workers`);
212
+
213
+ // Pre-create all cache directories in parallel
214
+ await this.createCacheDirectories(workerTasks, logger);
215
+
216
+ // Execute workers in parallel
217
+ const workerResults = await this.executeWorkersInParallel(
218
+ workerTasks,
219
+ logger,
220
+ );
221
+
222
+ // Merge results from all workers
223
+ const mergedResult = this.mergeWorkerResults(workerResults, data, logger);
224
+
225
+ logger.debug("Parallel ESLint execution completed", {
226
+ totalIssues: mergedResult.issues.items.length,
227
+ });
228
+
229
+ return success(mergedResult);
230
+ } catch (error) {
231
+ const errorMessage = parseError(error).message;
232
+ logger.error("Parallel ESLint execution failed", { error: errorMessage });
233
+
234
+ return success({
235
+ issues: {
236
+ items: [
237
+ {
238
+ file: "unknown",
239
+ severity: "error" as const,
240
+ message: errorMessage,
241
+ type: "lint" as const,
242
+ },
243
+ ],
244
+ files: [
245
+ {
246
+ file: "unknown",
247
+ errors: 1,
248
+ warnings: 0,
249
+ total: 1,
250
+ },
251
+ ],
252
+ summary: {
253
+ totalIssues: 1,
254
+ totalFiles: 1,
255
+ totalErrors: 1,
256
+ displayedIssues: 1,
257
+ displayedFiles: 1,
258
+ currentPage: 1,
259
+ totalPages: 1,
260
+ },
261
+ },
262
+ });
263
+ }
264
+ }
265
+
266
+ /**
267
+ * Distribute files across workers evenly
268
+ * Note: Only called when eslint is enabled
269
+ */
270
+ private distributeFiles(
271
+ files: string[],
272
+ workerCount: number,
273
+ data: LintRequestOutput,
274
+ eslintConfigPath: string,
275
+ ): WorkerTask[] {
276
+ const distributed = distributeFilesAcrossWorkers(files, workerCount);
277
+
278
+ return distributed.map((workerFiles, index) => ({
279
+ id: index,
280
+ files: workerFiles,
281
+ cacheDir: data.cacheDir,
282
+ eslintConfigPath,
283
+ fix: data.fix,
284
+ timeout: data.timeout,
285
+ }));
286
+ }
287
+
288
+ /**
289
+ * Create global cache directory
290
+ */
291
+ private async createCacheDirectories(
292
+ tasks: WorkerTask[],
293
+ logger: EndpointLogger,
294
+ ): Promise<void> {
295
+ if (tasks.length === 0) {
296
+ return;
297
+ }
298
+
299
+ // All workers use the same cache directory now
300
+ const globalCacheDir = tasks[0].cacheDir;
301
+
302
+ try {
303
+ await fs.mkdir(dirname(globalCacheDir), { recursive: true });
304
+ } catch (error) {
305
+ logger.warn(
306
+ `Failed to create global cache directory: ${globalCacheDir}`,
307
+ {
308
+ error: parseError(error).message,
309
+ },
310
+ );
311
+ }
312
+ }
313
+
314
+ /**
315
+ * Execute workers in parallel using Bun.spawn
316
+ */
317
+ private async executeWorkersInParallel(
318
+ tasks: WorkerTask[],
319
+ logger: EndpointLogger,
320
+ ): Promise<WorkerResult[]> {
321
+ const results: WorkerResult[] = [];
322
+
323
+ // Execute all workers in parallel
324
+ const workerPromises = tasks.map((task) =>
325
+ this.executeWorker(task, logger),
326
+ );
327
+
328
+ const workerResults = await Promise.allSettled(workerPromises);
329
+
330
+ for (let i = 0; i < workerResults.length; i++) {
331
+ const result = workerResults[i];
332
+ if (result.status === "fulfilled") {
333
+ results.push(result.value);
334
+ } else {
335
+ // Handle failed worker
336
+ results.push({
337
+ id: tasks[i].id,
338
+ success: false,
339
+ issues: [
340
+ {
341
+ file: "worker-error",
342
+ severity: "error" as const,
343
+ message: createWorkerFailedMessage(
344
+ tasks[i].id,
345
+ String(result.reason),
346
+ ),
347
+ type: "lint" as const,
348
+ },
349
+ ],
350
+ duration: 0,
351
+ error: String(result.reason),
352
+ });
353
+ }
354
+ }
355
+
356
+ return results;
357
+ }
358
+
359
+ /**
360
+ * Execute a single worker using Bun.spawn
361
+ */
362
+ private async executeWorker(
363
+ task: WorkerTask,
364
+ logger: EndpointLogger,
365
+ ): Promise<WorkerResult> {
366
+ const startTime = Date.now();
367
+
368
+ try {
369
+ // Cache directory already created in parallel during setup
370
+
371
+ const baseArgs = [
372
+ "eslint",
373
+ "--format=json",
374
+ "--cache",
375
+ "--cache-location",
376
+ task.cacheDir,
377
+ "--cache-strategy",
378
+ "metadata",
379
+ // Use ESLint config path from check.config.ts
380
+ "--config",
381
+ task.eslintConfigPath,
382
+ ...task.files,
383
+ ];
384
+
385
+ // If fix is requested, first check if there are any fixable issues
386
+ if (task.fix) {
387
+ const checkResult = await this.runEslintCommand(baseArgs, task, logger);
388
+ if (!checkResult.hasFixableIssues) {
389
+ // No fixable issues, return the check result
390
+ return {
391
+ id: task.id,
392
+ success: true,
393
+ issues: checkResult.issues,
394
+ duration: Date.now() - startTime,
395
+ };
396
+ }
397
+
398
+ // There are fixable issues, run with --fix
399
+ const fixArgs = [...baseArgs, "--fix"];
400
+ const fixResult = await this.runEslintCommand(fixArgs, task, logger);
401
+ return {
402
+ id: task.id,
403
+ success: true,
404
+ issues: fixResult.issues,
405
+ duration: Date.now() - startTime,
406
+ };
407
+ }
408
+
409
+ // Just run normal check
410
+ const result = await this.runEslintCommand(baseArgs, task, logger);
411
+ return {
412
+ id: task.id,
413
+ success: true,
414
+ issues: result.issues,
415
+ duration: Date.now() - startTime,
416
+ };
417
+ } catch (error) {
418
+ const errorMessage = parseError(error).message;
419
+ logger.error(`Worker ${task.id} failed`, { error: errorMessage });
420
+
421
+ return {
422
+ id: task.id,
423
+ success: false,
424
+ issues: [
425
+ {
426
+ file: "worker-error",
427
+ severity: "error" as const,
428
+ message: errorMessage,
429
+ type: "lint" as const,
430
+ },
431
+ ],
432
+ duration: Date.now() - startTime,
433
+ error: errorMessage,
434
+ };
435
+ }
436
+ }
437
+
438
+ /**
439
+ * Build file statistics from issues
440
+ */
441
+ private buildFileStats(
442
+ issues: LintIssue[],
443
+ ): Map<string, { errors: number; warnings: number; total: number }> {
444
+ const fileStats = new Map<
445
+ string,
446
+ { errors: number; warnings: number; total: number }
447
+ >();
448
+
449
+ for (const issue of issues) {
450
+ const stats = fileStats.get(issue.file) || {
451
+ errors: 0,
452
+ warnings: 0,
453
+ total: 0,
454
+ };
455
+ stats.total++;
456
+ if (issue.severity === "error") {
457
+ stats.errors++;
458
+ }
459
+ if (issue.severity === "warning") {
460
+ stats.warnings++;
461
+ }
462
+ fileStats.set(issue.file, stats);
463
+ }
464
+
465
+ return fileStats;
466
+ }
467
+
468
+ /**
469
+ * Format file statistics for response
470
+ */
471
+ private formatFileStats(
472
+ fileStats: Map<string, { errors: number; warnings: number; total: number }>,
473
+ ): Array<{ file: string; errors: number; warnings: number; total: number }> {
474
+ return [...fileStats.entries()]
475
+ .map(([file, stats]) => ({
476
+ file,
477
+ errors: stats.errors,
478
+ warnings: stats.warnings,
479
+ total: stats.total,
480
+ }))
481
+ .toSorted((a, b) => a.file.localeCompare(b.file));
482
+ }
483
+
484
+ /**
485
+ * Build response with pagination and statistics
486
+ */
487
+ private buildResponse(
488
+ allIssues: LintIssue[],
489
+ data: LintRequestOutput,
490
+ ): LintResponseOutput {
491
+ const totalIssues = allIssues.length;
492
+ const totalFiles = new Set(allIssues.map((issue) => issue.file)).size;
493
+ const totalErrors = allIssues.filter(
494
+ (issue) => issue.severity === "error",
495
+ ).length;
496
+
497
+ const fileStats = this.buildFileStats(allIssues);
498
+ const allFiles = this.formatFileStats(fileStats);
499
+ const limitedFiles = data.maxFilesInSummary
500
+ ? allFiles.slice(0, data.maxFilesInSummary)
501
+ : allFiles;
502
+
503
+ const limit = data.limit;
504
+ const currentPage = data.page;
505
+ const totalPages = Math.ceil(totalIssues / limit);
506
+ const startIndex = (currentPage - 1) * limit;
507
+ const endIndex = startIndex + limit;
508
+ const limitedIssues = allIssues.slice(startIndex, endIndex);
509
+
510
+ const displayedIssues = limitedIssues.length;
511
+ const displayedFiles = new Set(limitedIssues.map((issue) => issue.file))
512
+ .size;
513
+
514
+ return {
515
+ issues: {
516
+ items: limitedIssues,
517
+ files: limitedFiles,
518
+ summary: {
519
+ totalIssues,
520
+ totalFiles,
521
+ totalErrors,
522
+ displayedIssues,
523
+ displayedFiles,
524
+ truncatedMessage:
525
+ displayedIssues < totalIssues || displayedFiles < totalFiles
526
+ ? `Showing ${displayedIssues} of ${totalIssues} issues from ${displayedFiles} of ${totalFiles} files`
527
+ : "",
528
+ currentPage,
529
+ totalPages,
530
+ },
531
+ },
532
+ };
533
+ }
534
+
535
+ /**
536
+ * Merge results from all workers
537
+ */
538
+ private mergeWorkerResults(
539
+ workerResults: WorkerResult[],
540
+ data: LintRequestOutput,
541
+ logger: EndpointLogger,
542
+ ): LintResponseOutput {
543
+ const allIssues: LintIssue[] = [];
544
+
545
+ // Collect all issues from workers
546
+ for (const result of workerResults) {
547
+ allIssues.push(...result.issues);
548
+ }
549
+
550
+ // Sort issues by file, then by line number (unless skipSorting is true)
551
+ const issues = data.skipSorting
552
+ ? allIssues
553
+ : sortIssuesByLocation(allIssues);
554
+
555
+ logger.debug("Merged worker results", {
556
+ totalWorkers: workerResults.length,
557
+ totalIssues: issues.length,
558
+ });
559
+
560
+ return this.buildResponse(issues, data);
561
+ }
562
+
563
+ /**
564
+ * Run ESLint command and return results with fixable issue detection
565
+ */
566
+ private async runEslintCommand(
567
+ args: string[],
568
+ task: WorkerTask,
569
+ logger: EndpointLogger,
570
+ ): Promise<{
571
+ issues: LintIssue[];
572
+ hasFixableIssues: boolean;
573
+ }> {
574
+ logger.debug(`Worker ${task.id} starting with ${task.files.length} files`);
575
+
576
+ // Use spawn for parallel execution
577
+ const { spawn } = await import("node:child_process");
578
+ const stdout = await new Promise<string>((resolve, reject) => {
579
+ const child = spawn("bunx", args, {
580
+ cwd: process.cwd(),
581
+ stdio: ["ignore", "pipe", "pipe"],
582
+ shell: false,
583
+ });
584
+
585
+ let output = "";
586
+
587
+ child.stdout?.on("data", (data: Buffer) => {
588
+ output += data.toString();
589
+ });
590
+
591
+ child.stderr?.on("data", () => {
592
+ // Ignore stderr for ESLint output
593
+ });
594
+
595
+ child.on("close", (code) => {
596
+ // ESLint exit codes: 0=success, 1=lint errors found, 2=config/internal error
597
+ // ESLint with JSON format outputs valid JSON even on code 2, so we accept 0-2
598
+ // Only reject on unexpected errors (code > 2)
599
+ if (code !== null && code > 2) {
600
+ reject(new Error(createWorkerExitCodeMessage(task.id, code)));
601
+ } else {
602
+ resolve(output);
603
+ }
604
+ });
605
+
606
+ child.on("error", (error) => {
607
+ reject(error);
608
+ });
609
+
610
+ // Set timeout
611
+ const timeoutId = setTimeout(() => {
612
+ child.kill("SIGTERM");
613
+ setTimeout(() => {
614
+ child.kill("SIGKILL");
615
+ }, 5000);
616
+ reject(new Error(createWorkerTimeoutMessage(task.id, task.timeout)));
617
+ }, task.timeout * 1000);
618
+
619
+ // Clear timeout when process completes
620
+ child.on("close", () => {
621
+ clearTimeout(timeoutId);
622
+ });
623
+ });
624
+
625
+ // Parse ESLint output and detect fixable issues
626
+ const result = await this.parseEslintOutputWithFixableDetection(
627
+ stdout,
628
+ args.includes("--fix"),
629
+ logger,
630
+ );
631
+
632
+ logger.debug(
633
+ `Worker ${task.id} completed with ${result.issues.length} issues, ${result.hasFixableIssues ? "has" : "no"} fixable issues`,
634
+ );
635
+
636
+ return result;
637
+ }
638
+
639
+ /**
640
+ * Parse ESLint JSON output and detect fixable issues
641
+ */
642
+ private async parseEslintOutputWithFixableDetection(
643
+ stdout: string,
644
+ shouldFix: boolean,
645
+ logger: EndpointLogger,
646
+ ): Promise<{
647
+ issues: LintIssue[];
648
+ hasFixableIssues: boolean;
649
+ }> {
650
+ const issues: LintIssue[] = [];
651
+ let hasFixableIssues = false;
652
+
653
+ if (!stdout.trim()) {
654
+ return { issues, hasFixableIssues };
655
+ }
656
+
657
+ // Define ESLint result structure for type safety
658
+ type EslintResult = Array<{
659
+ filePath: string;
660
+ messages: Array<{
661
+ line: number;
662
+ column: number;
663
+ ruleId: string | null;
664
+ severity: 1 | 2;
665
+ message: string;
666
+ fix?: { range: [number, number]; text: string }; // ESLint provides fix info for fixable issues
667
+ }>;
668
+ output?: string; // Fixed content when --fix is used
669
+ }>;
670
+
671
+ try {
672
+ let parsedResults: EslintResult;
673
+ try {
674
+ parsedResults = JSON.parse(stdout) as EslintResult;
675
+ } catch (parseError) {
676
+ // JSON parse failed - log the error and return empty results
677
+ logger.warn("Failed to parse ESLint JSON output", {
678
+ error:
679
+ parseError instanceof Error
680
+ ? parseError.message
681
+ : String(parseError),
682
+ stdoutPreview: stdout.slice(0, 200),
683
+ });
684
+ return { issues, hasFixableIssues };
685
+ }
686
+
687
+ // If --fix was used, write the fixed content back to files in parallel
688
+ if (shouldFix) {
689
+ const writePromises = parsedResults
690
+ .filter((result) => result.output)
691
+ .map(async (result) => {
692
+ try {
693
+ await fs.writeFile(result.filePath, result.output!, "utf8");
694
+ } catch (error) {
695
+ logger.warn(`Failed to write fixed file: ${result.filePath}`, {
696
+ error: parseError(error).message,
697
+ });
698
+ }
699
+ });
700
+
701
+ // Execute all file writes in parallel
702
+ await Promise.allSettled(writePromises);
703
+ }
704
+
705
+ // Convert results to issues and detect fixable ones in parallel
706
+ const processedResults = parsedResults.map((result) => {
707
+ const relativePath = relative(process.cwd(), result.filePath);
708
+ const resultIssues: LintIssue[] = [];
709
+ let hasFixableInResult = false;
710
+
711
+ for (const msg of result.messages) {
712
+ // Check if this issue is fixable
713
+ if (msg.fix && !shouldFix) {
714
+ hasFixableInResult = true;
715
+ }
716
+
717
+ resultIssues.push({
718
+ file: relativePath,
719
+ line: msg.line,
720
+ column: msg.column,
721
+ rule: msg.ruleId || "unknown",
722
+ code: msg.ruleId || "unknown",
723
+ severity: msg.severity === 2 ? "error" : "warning",
724
+ message: msg.message,
725
+ type: "lint",
726
+ });
727
+ }
728
+
729
+ return { issues: resultIssues, hasFixable: hasFixableInResult };
730
+ });
731
+
732
+ // Combine all issues and fixable flags
733
+ for (const processed of processedResults) {
734
+ issues.push(...processed.issues);
735
+ if (processed.hasFixable) {
736
+ hasFixableIssues = true;
737
+ }
738
+ }
739
+ } catch (error) {
740
+ // Unexpected error during processing
741
+ logger.error("Unexpected error processing ESLint results", {
742
+ error: error instanceof Error ? error.message : String(error),
743
+ });
744
+ }
745
+
746
+ return { issues, hasFixableIssues };
747
+ }
748
+ }
749
+
750
+ /**
751
+ * Default repository instance
752
+ */
753
+ export const lintRepository = new LintRepositoryImpl();