@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.
- package/.dist/bin/vibe-runtime.js +26 -22
- package/.dist/bin/vibe-runtime.js.map +5 -5
- package/.dist/oxlint-plugins/i18n.js +4 -0
- package/.dist/oxlint-plugins/i18n.js.map +1 -0
- package/.dist/oxlint-plugins/jsx-capitalization.js +4 -0
- package/.dist/oxlint-plugins/jsx-capitalization.js.map +1 -0
- package/.dist/oxlint-plugins/restricted-syntax.js +4 -0
- package/.dist/oxlint-plugins/restricted-syntax.js.map +1 -0
- package/check.config.ts +4 -12
- package/package.json +2 -9
- package/src/app/api/[locale]/LICENSE +674 -0
- package/src/app/api/[locale]/i18n/de/index.ts +13 -0
- package/src/app/api/[locale]/i18n/en/index.ts +12 -0
- package/src/app/api/[locale]/i18n/pl/index.ts +11 -0
- package/src/app/api/[locale]/shared/i18n/de/index.ts +85 -0
- package/src/app/api/[locale]/shared/i18n/en/index.ts +83 -0
- package/src/app/api/[locale]/shared/i18n/pl/index.ts +85 -0
- package/src/app/api/[locale]/shared/stats-filtering.ts +202 -0
- package/src/app/api/[locale]/shared/types/common.schema.ts +55 -0
- package/src/app/api/[locale]/shared/types/response.schema.ts +372 -0
- package/src/app/api/[locale]/shared/types/stats-filtering.schema.ts +375 -0
- package/src/app/api/[locale]/shared/types/utils.ts +190 -0
- package/src/app/api/[locale]/shared/utils/base64.ts +49 -0
- package/src/app/api/[locale]/shared/utils/env-util.ts +40 -0
- package/src/app/api/[locale]/shared/utils/i18n/de/index.ts +21 -0
- package/src/app/api/[locale]/shared/utils/i18n/en/index.ts +19 -0
- package/src/app/api/[locale]/shared/utils/i18n/pl/index.ts +21 -0
- package/src/app/api/[locale]/shared/utils/index.ts +11 -0
- package/src/app/api/[locale]/shared/utils/object-path.ts +41 -0
- package/src/app/api/[locale]/shared/utils/object.test.ts +82 -0
- package/src/app/api/[locale]/shared/utils/object.ts +75 -0
- package/src/app/api/[locale]/shared/utils/parse-error.ts +134 -0
- package/src/app/api/[locale]/shared/utils/parse-json.ts +70 -0
- package/src/app/api/[locale]/shared/utils/time.ts +53 -0
- package/src/app/api/[locale]/shared/utils/validation.ts +127 -0
- package/src/app/api/[locale]/shared/utils/zod-required-fields.ts +116 -0
- package/src/app/api/[locale]/system/builder/definition.ts +1942 -0
- package/src/app/api/[locale]/system/builder/enum.ts +78 -0
- package/src/app/api/[locale]/system/builder/i18n/de/index.ts +677 -0
- package/src/app/api/[locale]/system/builder/i18n/en/index.ts +665 -0
- package/src/app/api/[locale]/system/builder/i18n/pl/index.ts +668 -0
- package/src/app/api/[locale]/system/builder/repository/build-executor.test.ts +182 -0
- package/src/app/api/[locale]/system/builder/repository/build-executor.ts +583 -0
- package/src/app/api/[locale]/system/builder/repository/bun-compiler.ts +261 -0
- package/src/app/api/[locale]/system/builder/repository/bundle-analyzer.ts +197 -0
- package/src/app/api/[locale]/system/builder/repository/config-loader.ts +159 -0
- package/src/app/api/[locale]/system/builder/repository/config-validator.ts +97 -0
- package/src/app/api/[locale]/system/builder/repository/constants.ts +125 -0
- package/src/app/api/[locale]/system/builder/repository/error-suggester.ts +75 -0
- package/src/app/api/[locale]/system/builder/repository/file-copier.ts +98 -0
- package/src/app/api/[locale]/system/builder/repository/folder-cleaner.ts +80 -0
- package/src/app/api/[locale]/system/builder/repository/index.ts +2 -0
- package/src/app/api/[locale]/system/builder/repository/npm-package-generator.ts +146 -0
- package/src/app/api/[locale]/system/builder/repository/output-formatter.ts +104 -0
- package/src/app/api/[locale]/system/builder/repository/profile-service.ts +79 -0
- package/src/app/api/[locale]/system/builder/repository/report-generator.ts +125 -0
- package/src/app/api/[locale]/system/builder/repository/vite-compiler.ts +291 -0
- package/src/app/api/[locale]/system/builder/route.ts +21 -0
- package/src/app/api/[locale]/system/builder/test-files/file1.ts +2 -0
- package/src/app/api/[locale]/system/builder/test-files/file2.tsx +10 -0
- package/src/app/api/[locale]/system/builder/test-files/file3.tsx +16 -0
- package/src/app/api/[locale]/system/builder/test-files/folderToCopy/fileInFolder.ts +2 -0
- package/src/app/api/[locale]/system/builder/test-files/test-config.ts +38 -0
- package/src/app/api/[locale]/system/builder/test-files/test-delete-config.ts +8 -0
- package/src/app/api/[locale]/system/builder/test-files/test-project/package.json +24 -0
- package/src/app/api/[locale]/system/builder/test-files/test-project/src/constants.ts +6 -0
- package/src/app/api/[locale]/system/builder/test-files/test-project/src/greet.ts +18 -0
- package/src/app/api/[locale]/system/builder/test-files/test-project/src/index.ts +7 -0
- package/src/app/api/[locale]/system/builder/test-files/test-project/src/utils/calculate.ts +27 -0
- package/src/app/api/[locale]/system/builder/test-files/test-project/tsconfig.json +19 -0
- package/src/app/api/[locale]/system/builder/test-files/test-project/tsconfig.tsbuildinfo +1 -0
- package/src/app/api/[locale]/system/builder/test-files/test3.css +1 -0
- package/src/app/api/[locale]/system/check/config/repository.ts +886 -0
- package/src/app/api/[locale]/system/check/config/shared.ts +396 -0
- package/src/app/api/[locale]/system/check/config/types.ts +616 -0
- package/src/app/api/[locale]/system/check/config/utils.ts +171 -0
- package/src/app/api/[locale]/system/check/i18n/de/index.ts +15 -0
- package/src/app/api/[locale]/system/check/i18n/en/index.ts +14 -0
- package/src/app/api/[locale]/system/check/i18n/pl/index.ts +15 -0
- package/src/app/api/[locale]/system/check/lint/definition.ts +414 -0
- package/src/app/api/[locale]/system/check/lint/enum.ts +37 -0
- package/src/app/api/[locale]/system/check/lint/i18n/de/index.ts +164 -0
- package/src/app/api/[locale]/system/check/lint/i18n/en/index.ts +162 -0
- package/src/app/api/[locale]/system/check/lint/i18n/pl/index.ts +164 -0
- package/src/app/api/[locale]/system/check/lint/repository.ts +753 -0
- package/src/app/api/[locale]/system/check/lint/route.ts +21 -0
- package/src/app/api/[locale]/system/check/oxlint/README.md +190 -0
- package/src/app/api/[locale]/system/check/oxlint/definition.ts +414 -0
- package/src/app/api/[locale]/system/check/oxlint/enum.ts +37 -0
- package/src/app/api/[locale]/system/check/oxlint/i18n/de/index.ts +171 -0
- package/src/app/api/[locale]/system/check/oxlint/i18n/en/index.ts +168 -0
- package/src/app/api/[locale]/system/check/oxlint/i18n/pl/index.ts +172 -0
- package/src/app/api/[locale]/system/check/oxlint/plugins/i18n/src/index.ts +372 -0
- package/src/app/api/[locale]/system/check/oxlint/plugins/jsx-capitalization/README.md +246 -0
- package/src/app/api/[locale]/system/check/oxlint/plugins/jsx-capitalization/src/index.ts +583 -0
- package/src/app/api/[locale]/system/check/oxlint/plugins/restricted-syntax/src/index.ts +500 -0
- package/src/app/api/[locale]/system/check/oxlint/plugins/restricted-syntax/test.tsx +74 -0
- package/src/app/api/[locale]/system/check/oxlint/plugins/shared/config-loader.ts +305 -0
- package/src/app/api/[locale]/system/check/oxlint/repository.ts +959 -0
- package/src/app/api/[locale]/system/check/oxlint/route.ts +21 -0
- package/src/app/api/[locale]/system/check/oxlint/types.ts +193 -0
- package/src/app/api/[locale]/system/check/test-project/bun.lock +532 -0
- package/src/app/api/[locale]/system/check/test-project/check.config.ts +981 -0
- package/src/app/api/[locale]/system/check/test-project/package.json +12 -0
- package/src/app/api/[locale]/system/check/test-project/src/constants.ts +6 -0
- package/src/app/api/[locale]/system/check/test-project/src/greet.ts +18 -0
- package/src/app/api/[locale]/system/check/test-project/src/test-issues/a11y-issues.tsx +107 -0
- package/src/app/api/[locale]/system/check/test-project/src/test-issues/eslint-issues.tsx +37 -0
- package/src/app/api/[locale]/system/check/test-project/src/test-issues/general-issues.ts +137 -0
- package/src/app/api/[locale]/system/check/test-project/src/test-issues/i18n-issues.tsx +129 -0
- package/src/app/api/[locale]/system/check/test-project/src/test-issues/jsx-capitalization-issues.tsx +131 -0
- package/src/app/api/[locale]/system/check/test-project/src/test-issues/nextjs-issues.tsx +95 -0
- package/src/app/api/[locale]/system/check/test-project/src/test-issues/promise-issues.ts +76 -0
- package/src/app/api/[locale]/system/check/test-project/src/test-issues/react-issues.tsx +95 -0
- package/src/app/api/[locale]/system/check/test-project/src/test-issues/restricted-syntax-issues.tsx +61 -0
- package/src/app/api/[locale]/system/check/test-project/src/test-issues/typescript-issues.ts +80 -0
- package/src/app/api/[locale]/system/check/test-project/src/utils/calculate.ts +27 -0
- package/src/app/api/[locale]/system/check/test-project/tsconfig.json +34 -0
- package/src/app/api/[locale]/system/check/test-project/tsconfig.tsbuildinfo +1 -0
- package/src/app/api/[locale]/system/check/typecheck/definition.ts +369 -0
- package/src/app/api/[locale]/system/check/typecheck/enum.ts +37 -0
- package/src/app/api/[locale]/system/check/typecheck/i18n/de/index.ts +159 -0
- package/src/app/api/[locale]/system/check/typecheck/i18n/en/index.ts +150 -0
- package/src/app/api/[locale]/system/check/typecheck/i18n/pl/index.ts +155 -0
- package/src/app/api/[locale]/system/check/typecheck/repository.ts +919 -0
- package/src/app/api/[locale]/system/check/typecheck/route.ts +22 -0
- package/src/app/api/[locale]/system/check/typecheck/utils.ts +168 -0
- package/src/app/api/[locale]/system/check/vibe-check/definition.ts +568 -0
- package/src/app/api/[locale]/system/check/vibe-check/enum.ts +69 -0
- package/src/app/api/[locale]/system/check/vibe-check/i18n/de/index.ts +192 -0
- package/src/app/api/[locale]/system/check/vibe-check/i18n/en/index.ts +189 -0
- package/src/app/api/[locale]/system/check/vibe-check/i18n/pl/index.ts +192 -0
- package/src/app/api/[locale]/system/check/vibe-check/repository.ts +545 -0
- package/src/app/api/[locale]/system/check/vibe-check/route.test.ts +1142 -0
- package/src/app/api/[locale]/system/check/vibe-check/route.ts +21 -0
- package/src/app/api/[locale]/system/generated/endpoint.ts +313 -0
- package/src/app/api/[locale]/system/generated/endpoints.ts +156 -0
- package/src/app/api/[locale]/system/generated/route-handlers.ts +224 -0
- package/src/app/api/[locale]/system/generators/endpoint/definition.ts +193 -0
- package/src/app/api/[locale]/system/generators/endpoint/i18n/de/index.ts +48 -0
- package/src/app/api/[locale]/system/generators/endpoint/i18n/en/index.ts +48 -0
- package/src/app/api/[locale]/system/generators/endpoint/i18n/pl/index.ts +50 -0
- package/src/app/api/[locale]/system/generators/endpoint/repository.ts +291 -0
- package/src/app/api/[locale]/system/generators/endpoint/route.ts +21 -0
- package/src/app/api/[locale]/system/generators/endpoints/definition.ts +246 -0
- package/src/app/api/[locale]/system/generators/endpoints/i18n/de/index.ts +54 -0
- package/src/app/api/[locale]/system/generators/endpoints/i18n/en/index.ts +52 -0
- package/src/app/api/[locale]/system/generators/endpoints/i18n/pl/index.ts +54 -0
- package/src/app/api/[locale]/system/generators/endpoints/options-repository.ts +463 -0
- package/src/app/api/[locale]/system/generators/endpoints/repository.ts +383 -0
- package/src/app/api/[locale]/system/generators/endpoints/route.ts +18 -0
- package/src/app/api/[locale]/system/generators/endpoints-index/definition.ts +194 -0
- package/src/app/api/[locale]/system/generators/endpoints-index/i18n/de/index.ts +71 -0
- package/src/app/api/[locale]/system/generators/endpoints-index/i18n/en/index.ts +69 -0
- package/src/app/api/[locale]/system/generators/endpoints-index/i18n/pl/index.ts +71 -0
- package/src/app/api/[locale]/system/generators/endpoints-index/repository.ts +294 -0
- package/src/app/api/[locale]/system/generators/endpoints-index/route.ts +18 -0
- package/src/app/api/[locale]/system/generators/generate-all/definition.ts +355 -0
- package/src/app/api/[locale]/system/generators/generate-all/i18n/de/index.ts +96 -0
- package/src/app/api/[locale]/system/generators/generate-all/i18n/en/index.ts +94 -0
- package/src/app/api/[locale]/system/generators/generate-all/i18n/pl/index.ts +96 -0
- package/src/app/api/[locale]/system/generators/generate-all/repository.ts +257 -0
- package/src/app/api/[locale]/system/generators/generate-all/route.ts +20 -0
- package/src/app/api/[locale]/system/generators/i18n/de/index.ts +15 -0
- package/src/app/api/[locale]/system/generators/i18n/en/index.ts +14 -0
- package/src/app/api/[locale]/system/generators/i18n/pl/index.ts +15 -0
- package/src/app/api/[locale]/system/generators/route-handlers/definition.ts +198 -0
- package/src/app/api/[locale]/system/generators/route-handlers/i18n/de/index.ts +48 -0
- package/src/app/api/[locale]/system/generators/route-handlers/i18n/en/index.ts +48 -0
- package/src/app/api/[locale]/system/generators/route-handlers/i18n/pl/index.ts +50 -0
- package/src/app/api/[locale]/system/generators/route-handlers/repository.ts +277 -0
- package/src/app/api/[locale]/system/generators/route-handlers/route.ts +17 -0
- package/src/app/api/[locale]/system/generators/shared/utils.ts +233 -0
- package/src/app/api/[locale]/system/help/definition.ts +445 -0
- package/src/app/api/[locale]/system/help/i18n/de/index.ts +267 -0
- package/src/app/api/[locale]/system/help/i18n/en/index.ts +262 -0
- package/src/app/api/[locale]/system/help/i18n/pl/index.ts +265 -0
- package/src/app/api/[locale]/system/help/interactive/definition.ts +125 -0
- package/src/app/api/[locale]/system/help/interactive/i18n/de/index.ts +22 -0
- package/src/app/api/[locale]/system/help/interactive/i18n/en/index.ts +19 -0
- package/src/app/api/[locale]/system/help/interactive/i18n/pl/index.ts +22 -0
- package/src/app/api/[locale]/system/help/interactive/repository.ts +1025 -0
- package/src/app/api/[locale]/system/help/interactive/route.ts +53 -0
- package/src/app/api/[locale]/system/help/list/definition.ts +372 -0
- package/src/app/api/[locale]/system/help/list/repository.ts +110 -0
- package/src/app/api/[locale]/system/help/list/route.ts +21 -0
- package/src/app/api/[locale]/system/help/repository.ts +212 -0
- package/src/app/api/[locale]/system/help/route.ts +16 -0
- package/src/app/api/[locale]/system/i18n/de/index.ts +68 -0
- package/src/app/api/[locale]/system/i18n/en/index.ts +65 -0
- package/src/app/api/[locale]/system/i18n/pl/index.ts +66 -0
- package/src/app/api/[locale]/system/release-tool/definition.ts +3104 -0
- package/src/app/api/[locale]/system/release-tool/i18n/de/index.ts +813 -0
- package/src/app/api/[locale]/system/release-tool/i18n/en/index.ts +797 -0
- package/src/app/api/[locale]/system/release-tool/i18n/pl/index.ts +810 -0
- package/src/app/api/[locale]/system/release-tool/repository/asset-zipper.ts +128 -0
- package/src/app/api/[locale]/system/release-tool/repository/changelog-generator.ts +212 -0
- package/src/app/api/[locale]/system/release-tool/repository/ci-detector.ts +566 -0
- package/src/app/api/[locale]/system/release-tool/repository/config.ts +113 -0
- package/src/app/api/[locale]/system/release-tool/repository/constants.ts +407 -0
- package/src/app/api/[locale]/system/release-tool/repository/dependency-manager.ts +527 -0
- package/src/app/api/[locale]/system/release-tool/repository/git-service.ts +403 -0
- package/src/app/api/[locale]/system/release-tool/repository/hook-runner.ts +100 -0
- package/src/app/api/[locale]/system/release-tool/repository/index.ts +1 -0
- package/src/app/api/[locale]/system/release-tool/repository/notification-service.ts +638 -0
- package/src/app/api/[locale]/system/release-tool/repository/package-service.ts +169 -0
- package/src/app/api/[locale]/system/release-tool/repository/publisher.ts +253 -0
- package/src/app/api/[locale]/system/release-tool/repository/quality-runner.ts +428 -0
- package/src/app/api/[locale]/system/release-tool/repository/release-creator.ts +293 -0
- package/src/app/api/[locale]/system/release-tool/repository/release-executor.ts +1198 -0
- package/src/app/api/[locale]/system/release-tool/repository/snyk-service.ts +136 -0
- package/src/app/api/[locale]/system/release-tool/repository/utils.ts +642 -0
- package/src/app/api/[locale]/system/release-tool/repository/validation.ts +288 -0
- package/src/app/api/[locale]/system/release-tool/repository/version-service.ts +297 -0
- package/src/app/api/[locale]/system/release-tool/route.ts +21 -0
- package/src/app/api/[locale]/system/unified-interface/README.md +328 -0
- package/src/app/api/[locale]/system/unified-interface/cli/README.md +349 -0
- package/src/app/api/[locale]/system/unified-interface/cli/auth/cli-handler.ts +95 -0
- package/src/app/api/[locale]/system/unified-interface/cli/auth/cli-user.ts +146 -0
- package/src/app/api/[locale]/system/unified-interface/cli/auth/session-file.ts +266 -0
- package/src/app/api/[locale]/system/unified-interface/cli/env.ts +26 -0
- package/src/app/api/[locale]/system/unified-interface/cli/i18n/de/index.ts +157 -0
- package/src/app/api/[locale]/system/unified-interface/cli/i18n/en/index.ts +155 -0
- package/src/app/api/[locale]/system/unified-interface/cli/i18n/pl/index.ts +158 -0
- package/src/app/api/[locale]/system/unified-interface/cli/runtime/debug.ts +595 -0
- package/src/app/api/[locale]/system/unified-interface/cli/runtime/entry-point.ts +129 -0
- package/src/app/api/[locale]/system/unified-interface/cli/runtime/environment.ts +155 -0
- package/src/app/api/[locale]/system/unified-interface/cli/runtime/execution-errors.ts +452 -0
- package/src/app/api/[locale]/system/unified-interface/cli/runtime/parsing.ts +297 -0
- package/src/app/api/[locale]/system/unified-interface/cli/runtime/route-executor.ts +859 -0
- package/src/app/api/[locale]/system/unified-interface/cli/setup/i18n/de/index.ts +12 -0
- package/src/app/api/[locale]/system/unified-interface/cli/setup/i18n/en/index.ts +11 -0
- package/src/app/api/[locale]/system/unified-interface/cli/setup/i18n/pl/index.ts +12 -0
- package/src/app/api/[locale]/system/unified-interface/cli/setup/install/definition.ts +262 -0
- package/src/app/api/[locale]/system/unified-interface/cli/setup/install/i18n/de/index.ts +54 -0
- package/src/app/api/[locale]/system/unified-interface/cli/setup/install/i18n/en/index.ts +52 -0
- package/src/app/api/[locale]/system/unified-interface/cli/setup/install/i18n/pl/index.ts +54 -0
- package/src/app/api/[locale]/system/unified-interface/cli/setup/install/repository.ts +421 -0
- package/src/app/api/[locale]/system/unified-interface/cli/setup/install/route.ts +25 -0
- package/src/app/api/[locale]/system/unified-interface/cli/setup/status/definition.ts +181 -0
- package/src/app/api/[locale]/system/unified-interface/cli/setup/status/i18n/de/index.ts +61 -0
- package/src/app/api/[locale]/system/unified-interface/cli/setup/status/i18n/en/index.ts +59 -0
- package/src/app/api/[locale]/system/unified-interface/cli/setup/status/i18n/pl/index.ts +61 -0
- package/src/app/api/[locale]/system/unified-interface/cli/setup/status/repository.ts +195 -0
- package/src/app/api/[locale]/system/unified-interface/cli/setup/status/route.ts +22 -0
- package/src/app/api/[locale]/system/unified-interface/cli/setup/uninstall/definition.ts +188 -0
- package/src/app/api/[locale]/system/unified-interface/cli/setup/uninstall/i18n/de/index.ts +54 -0
- package/src/app/api/[locale]/system/unified-interface/cli/setup/uninstall/i18n/en/index.ts +52 -0
- package/src/app/api/[locale]/system/unified-interface/cli/setup/uninstall/i18n/pl/index.ts +54 -0
- package/src/app/api/[locale]/system/unified-interface/cli/setup/uninstall/repository.ts +209 -0
- package/src/app/api/[locale]/system/unified-interface/cli/setup/uninstall/route.ts +24 -0
- package/src/app/api/[locale]/system/unified-interface/cli/setup/update/definition.ts +200 -0
- package/src/app/api/[locale]/system/unified-interface/cli/setup/update/i18n/de/index.ts +54 -0
- package/src/app/api/[locale]/system/unified-interface/cli/setup/update/i18n/en/index.ts +52 -0
- package/src/app/api/[locale]/system/unified-interface/cli/setup/update/i18n/pl/index.ts +54 -0
- package/src/app/api/[locale]/system/unified-interface/cli/setup/update/repository.ts +113 -0
- package/src/app/api/[locale]/system/unified-interface/cli/setup/update/route.ts +22 -0
- package/src/app/api/[locale]/system/unified-interface/cli/vibe-runtime.ts +304 -0
- package/src/app/api/[locale]/system/unified-interface/cli/widgets/core/base-renderer.ts +270 -0
- package/src/app/api/[locale]/system/unified-interface/cli/widgets/core/registry.ts +309 -0
- package/src/app/api/[locale]/system/unified-interface/cli/widgets/core/types.ts +126 -0
- package/src/app/api/[locale]/system/unified-interface/cli/widgets/i18n/de/index.ts +67 -0
- package/src/app/api/[locale]/system/unified-interface/cli/widgets/i18n/en/index.ts +65 -0
- package/src/app/api/[locale]/system/unified-interface/cli/widgets/i18n/pl/index.ts +67 -0
- package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/accordion.ts +74 -0
- package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/avatar.ts +39 -0
- package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/badge.ts +54 -0
- package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/code-output.ts +298 -0
- package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/code-quality-files.ts +89 -0
- package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/code-quality-list.ts +298 -0
- package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/code-quality-summary.ts +96 -0
- package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/container.ts +186 -0
- package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/data-card.ts +65 -0
- package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/data-cards.ts +570 -0
- package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/data-list.ts +80 -0
- package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/data-table.ts +385 -0
- package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/editable-text.ts +99 -0
- package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/empty-state.ts +55 -0
- package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/errors.ts +67 -0
- package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/grouped-list.ts +729 -0
- package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/link-card.ts +87 -0
- package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/link-list.ts +112 -0
- package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/link.ts +59 -0
- package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/loading.ts +50 -0
- package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/markdown.ts +131 -0
- package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/metric.ts +291 -0
- package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/section.ts +120 -0
- package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/stats-grid.ts +149 -0
- package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/tabs.ts +61 -0
- package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/text.ts +78 -0
- package/src/app/api/[locale]/system/unified-interface/cli/widgets/implementations/title.ts +42 -0
- package/src/app/api/[locale]/system/unified-interface/cli/widgets/renderers/response-renderer.ts +418 -0
- package/src/app/api/[locale]/system/unified-interface/cli/widgets/renderers/schema-handler.ts +534 -0
- package/src/app/api/[locale]/system/unified-interface/i18n/de/index.ts +42 -0
- package/src/app/api/[locale]/system/unified-interface/i18n/en/index.ts +40 -0
- package/src/app/api/[locale]/system/unified-interface/i18n/pl/index.ts +43 -0
- package/src/app/api/[locale]/system/unified-interface/mcp/README.md +114 -0
- package/src/app/api/[locale]/system/unified-interface/mcp/converter.ts +146 -0
- package/src/app/api/[locale]/system/unified-interface/mcp/i18n/de/index.ts +182 -0
- package/src/app/api/[locale]/system/unified-interface/mcp/i18n/en/index.ts +179 -0
- package/src/app/api/[locale]/system/unified-interface/mcp/i18n/pl/index.ts +181 -0
- package/src/app/api/[locale]/system/unified-interface/mcp/registry.ts +343 -0
- package/src/app/api/[locale]/system/unified-interface/mcp/serve/definition.ts +147 -0
- package/src/app/api/[locale]/system/unified-interface/mcp/serve/repository.ts +38 -0
- package/src/app/api/[locale]/system/unified-interface/mcp/serve/route.ts +14 -0
- package/src/app/api/[locale]/system/unified-interface/mcp/server/protocol-handler.ts +309 -0
- package/src/app/api/[locale]/system/unified-interface/mcp/server/server.ts +154 -0
- package/src/app/api/[locale]/system/unified-interface/mcp/server/stdio-transport.ts +193 -0
- package/src/app/api/[locale]/system/unified-interface/mcp/types.ts +246 -0
- package/src/app/api/[locale]/system/unified-interface/shared/endpoints/definition/create-form.ts +1510 -0
- package/src/app/api/[locale]/system/unified-interface/shared/endpoints/definition/create.ts +581 -0
- package/src/app/api/[locale]/system/unified-interface/shared/endpoints/definition/endpoint-to-metadata.ts +52 -0
- package/src/app/api/[locale]/system/unified-interface/shared/endpoints/definition/loader.ts +152 -0
- package/src/app/api/[locale]/system/unified-interface/shared/endpoints/definitions/registry.ts +265 -0
- package/src/app/api/[locale]/system/unified-interface/shared/endpoints/permissions/registry.ts +680 -0
- package/src/app/api/[locale]/system/unified-interface/shared/endpoints/route/executor.ts +220 -0
- package/src/app/api/[locale]/system/unified-interface/shared/endpoints/route/handler.ts +325 -0
- package/src/app/api/[locale]/system/unified-interface/shared/endpoints/route/multi.ts +184 -0
- package/src/app/api/[locale]/system/unified-interface/shared/endpoints/route/request-validator.ts +201 -0
- package/src/app/api/[locale]/system/unified-interface/shared/endpoints/route/single.ts +58 -0
- package/src/app/api/[locale]/system/unified-interface/shared/env/define-env-client.ts +49 -0
- package/src/app/api/[locale]/system/unified-interface/shared/env/define-env.ts +47 -0
- package/src/app/api/[locale]/system/unified-interface/shared/env/validation-logger.ts +58 -0
- package/src/app/api/[locale]/system/unified-interface/shared/field/enum.ts +110 -0
- package/src/app/api/[locale]/system/unified-interface/shared/field/specialized.ts +339 -0
- package/src/app/api/[locale]/system/unified-interface/shared/field/utils.test.ts +408 -0
- package/src/app/api/[locale]/system/unified-interface/shared/field/utils.ts +1349 -0
- package/src/app/api/[locale]/system/unified-interface/shared/field-config/endpoint-field-types.ts +107 -0
- package/src/app/api/[locale]/system/unified-interface/shared/field-config/field-config-types.ts +268 -0
- package/src/app/api/[locale]/system/unified-interface/shared/logger/colors.ts +114 -0
- package/src/app/api/[locale]/system/unified-interface/shared/logger/endpoint.ts +169 -0
- package/src/app/api/[locale]/system/unified-interface/shared/logger/file-logger.ts +88 -0
- package/src/app/api/[locale]/system/unified-interface/shared/logger/formatters.ts +177 -0
- package/src/app/api/[locale]/system/unified-interface/shared/server-only/auth/base-auth-handler.ts +82 -0
- package/src/app/api/[locale]/system/unified-interface/shared/server-only/auth/factory.ts +33 -0
- package/src/app/api/[locale]/system/unified-interface/shared/server-only/server-only.ts +4 -0
- package/src/app/api/[locale]/system/unified-interface/shared/types/actions.ts +289 -0
- package/src/app/api/[locale]/system/unified-interface/shared/types/endpoint.ts +1167 -0
- package/src/app/api/[locale]/system/unified-interface/shared/types/enums.ts +382 -0
- package/src/app/api/[locale]/system/unified-interface/shared/types/platform.ts +34 -0
- package/src/app/api/[locale]/system/unified-interface/shared/types/types.ts +80 -0
- package/src/app/api/[locale]/system/unified-interface/shared/types/ui-config.ts +76 -0
- package/src/app/api/[locale]/system/unified-interface/shared/utils/error-types.ts +27 -0
- package/src/app/api/[locale]/system/unified-interface/shared/utils/path.ts +63 -0
- package/src/app/api/[locale]/system/unified-interface/shared/utils/scanner.ts +241 -0
- package/src/app/api/[locale]/system/unified-interface/shared/widgets/actions.ts +256 -0
- package/src/app/api/[locale]/system/unified-interface/shared/widgets/configs.ts +1158 -0
- package/src/app/api/[locale]/system/unified-interface/shared/widgets/helpers.ts +80 -0
- package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/accordion.ts +82 -0
- package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/avatar.ts +75 -0
- package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/badge.ts +89 -0
- package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/code-output.ts +302 -0
- package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/code-quality-list.ts +202 -0
- package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/container.ts +129 -0
- package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/data-card.ts +81 -0
- package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/data-cards.ts +258 -0
- package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/data-list.ts +123 -0
- package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/data-table.ts +387 -0
- package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/editable-text.ts +89 -0
- package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/empty-state.ts +78 -0
- package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/errors.ts +93 -0
- package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/grouped-list.ts +448 -0
- package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/index.ts +38 -0
- package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/link-card.ts +130 -0
- package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/link-list.ts +127 -0
- package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/link.ts +68 -0
- package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/loading.ts +81 -0
- package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/markdown.ts +176 -0
- package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/metric-card.ts +241 -0
- package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/section.ts +90 -0
- package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/stats-grid.ts +71 -0
- package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/tabs.ts +80 -0
- package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/text.ts +105 -0
- package/src/app/api/[locale]/system/unified-interface/shared/widgets/logic/title.ts +72 -0
- package/src/app/api/[locale]/system/unified-interface/shared/widgets/types.ts +240 -0
- package/src/app/api/[locale]/system/unified-interface/shared/widgets/utils/field-helpers.ts +137 -0
- package/src/app/api/[locale]/system/unified-interface/shared/widgets/utils/formatting.ts +437 -0
- package/src/app/api/[locale]/system/unified-interface/shared/widgets/utils/url.ts +40 -0
- package/src/app/api/[locale]/system/unified-interface/shared/widgets/utils/widget-helpers.ts +465 -0
- package/src/app/api/[locale]/user/auth/enum.ts +16 -0
- package/src/app/api/[locale]/user/auth/i18n/de/index.ts +227 -0
- package/src/app/api/[locale]/user/auth/i18n/en/index.ts +205 -0
- package/src/app/api/[locale]/user/auth/i18n/pl/index.ts +219 -0
- package/src/app/api/[locale]/user/auth/types.ts +110 -0
- package/src/app/api/[locale]/user/enum.ts +64 -0
- package/src/app/api/[locale]/user/private/i18n/de/index.ts +3 -0
- package/src/app/api/[locale]/user/private/i18n/en/index.ts +1 -0
- package/src/app/api/[locale]/user/private/i18n/pl/index.ts +3 -0
- package/src/app/api/[locale]/user/types.ts +118 -0
- package/src/app/api/[locale]/user/user-roles/enum.ts +112 -0
- package/src/app/api/[locale]/user/user-roles/i18n/de/index.ts +85 -0
- package/src/app/api/[locale]/user/user-roles/i18n/en/index.ts +83 -0
- package/src/app/api/[locale]/user/user-roles/i18n/pl/index.ts +86 -0
- package/src/app/api/[locale]/user/user-roles/types.ts +34 -0
- package/src/app/api/i18n/de/index.ts +6 -0
- package/src/app/api/i18n/en/index.ts +5 -0
- package/src/app/api/i18n/pl/index.ts +5 -0
- package/src/app/i18n/de/index.ts +6 -0
- package/src/app/i18n/en/index.ts +5 -0
- package/src/app/i18n/pl/index.ts +5 -0
|
@@ -0,0 +1,919 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Run TypeScript type checking Repository
|
|
3
|
+
* Handles run typescript type checking operations
|
|
4
|
+
*
|
|
5
|
+
* This repository supports both tsc and tsgo type checkers.
|
|
6
|
+
* The choice is controlled by the `useTsgo` config option.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import { exec } from "node:child_process";
|
|
10
|
+
import { readFileSync, writeFileSync } from "node:fs";
|
|
11
|
+
import { promisify } from "node:util";
|
|
12
|
+
|
|
13
|
+
import { z } from "zod";
|
|
14
|
+
|
|
15
|
+
import type { EndpointLogger } from "@/app/api/[locale]/system/unified-interface/shared/logger/endpoint";
|
|
16
|
+
|
|
17
|
+
import type { ResponseType as ApiResponseType } from "../../../shared/types/response.schema";
|
|
18
|
+
import {
|
|
19
|
+
ErrorResponseTypes,
|
|
20
|
+
fail,
|
|
21
|
+
success,
|
|
22
|
+
} from "../../../shared/types/response.schema";
|
|
23
|
+
import { parseError } from "../../../shared/utils/parse-error";
|
|
24
|
+
import { parseJsonWithComments } from "../../../shared/utils/parse-json";
|
|
25
|
+
import { ensureConfigReady } from "../config/repository";
|
|
26
|
+
import type {
|
|
27
|
+
TypecheckIssue,
|
|
28
|
+
TypecheckRequestOutput,
|
|
29
|
+
TypecheckResponseOutput,
|
|
30
|
+
} from "./definition";
|
|
31
|
+
import {
|
|
32
|
+
createTypecheckConfig,
|
|
33
|
+
getDisplayPath,
|
|
34
|
+
PathType,
|
|
35
|
+
shouldIncludeFile,
|
|
36
|
+
type TypecheckConfig,
|
|
37
|
+
} from "./utils";
|
|
38
|
+
|
|
39
|
+
// ============================================================
|
|
40
|
+
// Constants
|
|
41
|
+
// ============================================================
|
|
42
|
+
|
|
43
|
+
/** Wildcard include patterns to remove (we specify explicit files instead) */
|
|
44
|
+
const WILDCARD_INCLUDE_PATTERNS: readonly string[] = ["**/*.ts", "**/*.tsx"];
|
|
45
|
+
|
|
46
|
+
// ============================================================
|
|
47
|
+
// TypeScript Configuration Schema
|
|
48
|
+
// ============================================================
|
|
49
|
+
|
|
50
|
+
// TypeScript configuration Zod schema for runtime validation
|
|
51
|
+
const TsConfigSchema = z.object({
|
|
52
|
+
compilerOptions: z
|
|
53
|
+
.object({
|
|
54
|
+
rootDir: z.string().optional(),
|
|
55
|
+
paths: z.record(z.string(), z.array(z.string())).optional(),
|
|
56
|
+
baseUrl: z.string().optional(),
|
|
57
|
+
typeRoots: z.array(z.string()).optional(),
|
|
58
|
+
})
|
|
59
|
+
.passthrough()
|
|
60
|
+
.optional(),
|
|
61
|
+
include: z.array(z.string()).optional(),
|
|
62
|
+
exclude: z.array(z.string()).optional(),
|
|
63
|
+
});
|
|
64
|
+
|
|
65
|
+
// TypeScript configuration type inferred from Zod schema
|
|
66
|
+
type TsConfig = z.infer<typeof TsConfigSchema>;
|
|
67
|
+
|
|
68
|
+
// ============================================================
|
|
69
|
+
// Internal Types
|
|
70
|
+
// ============================================================
|
|
71
|
+
|
|
72
|
+
/** Parsed issue from typecheck output */
|
|
73
|
+
interface ParsedIssue {
|
|
74
|
+
file: string;
|
|
75
|
+
line?: number;
|
|
76
|
+
column?: number;
|
|
77
|
+
code?: string;
|
|
78
|
+
severity: "error" | "warning" | "info";
|
|
79
|
+
message: string;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// ============================================================
|
|
83
|
+
// Repository Interface
|
|
84
|
+
// ============================================================
|
|
85
|
+
|
|
86
|
+
const execAsync = promisify(exec);
|
|
87
|
+
|
|
88
|
+
/**
|
|
89
|
+
* Run TypeScript type checking Repository Interface
|
|
90
|
+
*/
|
|
91
|
+
export interface TypecheckRepositoryInterface {
|
|
92
|
+
execute(
|
|
93
|
+
data: TypecheckRequestOutput,
|
|
94
|
+
logger: EndpointLogger,
|
|
95
|
+
): Promise<ApiResponseType<TypecheckResponseOutput>>;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
// ============================================================
|
|
99
|
+
// Repository Implementation
|
|
100
|
+
// ============================================================
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Run TypeScript type checking Repository Implementation
|
|
104
|
+
*/
|
|
105
|
+
export class TypecheckRepositoryImpl implements TypecheckRepositoryInterface {
|
|
106
|
+
// --------------------------------------------------------
|
|
107
|
+
// Static Private Helpers - Command Configuration
|
|
108
|
+
// --------------------------------------------------------
|
|
109
|
+
|
|
110
|
+
/**
|
|
111
|
+
* Get the base command for type checking.
|
|
112
|
+
* @param useTsgo - Whether to use tsgo instead of tsc
|
|
113
|
+
* @returns The base command string
|
|
114
|
+
*/
|
|
115
|
+
private static getBaseCommand(useTsgo: boolean): string {
|
|
116
|
+
if (useTsgo) {
|
|
117
|
+
// eslint-disable-next-line i18next/no-literal-string
|
|
118
|
+
return "bunx tsgo";
|
|
119
|
+
}
|
|
120
|
+
// tsc needs increased memory for large projects
|
|
121
|
+
// eslint-disable-next-line i18next/no-literal-string
|
|
122
|
+
return 'NODE_OPTIONS="--max-old-space-size=32768" bunx tsc';
|
|
123
|
+
}
|
|
124
|
+
|
|
125
|
+
/**
|
|
126
|
+
* Build the full typecheck command with all flags.
|
|
127
|
+
*/
|
|
128
|
+
private static buildTypecheckCommand(
|
|
129
|
+
baseCommand: string,
|
|
130
|
+
buildInfoFile: string,
|
|
131
|
+
projectConfig: string,
|
|
132
|
+
): string {
|
|
133
|
+
// eslint-disable-next-line i18next/no-literal-string
|
|
134
|
+
return `${baseCommand} --noEmit --incremental --tsBuildInfoFile ${buildInfoFile} --skipLibCheck --project ${projectConfig}`;
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
// --------------------------------------------------------
|
|
138
|
+
// Static Private Helpers - Error Patterns
|
|
139
|
+
// --------------------------------------------------------
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Get the error pattern regex for tsc output.
|
|
143
|
+
* Format: file.ts(line,column): error TS1234: message
|
|
144
|
+
*/
|
|
145
|
+
private static getTscErrorPattern(): RegExp {
|
|
146
|
+
return /^(.+?)\((\d+),(\d+)\):\s+(error|warning)\s+(TS\d+):\s*(.+)$/;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Get the error pattern regex for tsgo output.
|
|
151
|
+
* Format: file.ts:line:column - error TS1234: message
|
|
152
|
+
*/
|
|
153
|
+
private static getTsgoErrorPattern(): RegExp {
|
|
154
|
+
return /^(.+?):(\d+):(\d+)\s+-\s+(error|warning)\s+(TS\d+):\s*(.+)$/;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
// --------------------------------------------------------
|
|
158
|
+
// Static Private Helpers - Output Parsing
|
|
159
|
+
// --------------------------------------------------------
|
|
160
|
+
|
|
161
|
+
/**
|
|
162
|
+
* Strip ANSI color codes from output.
|
|
163
|
+
* tsgo adds color codes to its output which need to be removed for parsing.
|
|
164
|
+
*/
|
|
165
|
+
private static stripAnsiCodes(text: string): string {
|
|
166
|
+
const ESC = String.fromCodePoint(0x1b);
|
|
167
|
+
const ansiPattern = new RegExp(`${ESC}\\[[0-9;]*m`, "g");
|
|
168
|
+
return text.replaceAll(ansiPattern, "");
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
/**
|
|
172
|
+
* Parse a single output line for TypeScript errors/warnings.
|
|
173
|
+
* Tries both tsc and tsgo patterns.
|
|
174
|
+
*/
|
|
175
|
+
private static parseOutputLine(
|
|
176
|
+
line: string,
|
|
177
|
+
useTsgo: boolean,
|
|
178
|
+
): ParsedIssue | null {
|
|
179
|
+
// Try patterns in order based on which tool is being used
|
|
180
|
+
const primaryPattern = useTsgo
|
|
181
|
+
? TypecheckRepositoryImpl.getTsgoErrorPattern()
|
|
182
|
+
: TypecheckRepositoryImpl.getTscErrorPattern();
|
|
183
|
+
const fallbackPattern = useTsgo
|
|
184
|
+
? TypecheckRepositoryImpl.getTscErrorPattern()
|
|
185
|
+
: TypecheckRepositoryImpl.getTsgoErrorPattern();
|
|
186
|
+
|
|
187
|
+
let match = line.match(primaryPattern);
|
|
188
|
+
if (!match) {
|
|
189
|
+
match = line.match(fallbackPattern);
|
|
190
|
+
}
|
|
191
|
+
|
|
192
|
+
if (!match) {
|
|
193
|
+
return null;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const [, file, lineNum, colNum, severity, code, message] = match;
|
|
197
|
+
|
|
198
|
+
return {
|
|
199
|
+
file: file.trim(),
|
|
200
|
+
line: parseInt(lineNum, 10),
|
|
201
|
+
column: parseInt(colNum, 10),
|
|
202
|
+
code: code.trim(),
|
|
203
|
+
severity: severity === "error" ? "error" : "warning",
|
|
204
|
+
message: message.trim(),
|
|
205
|
+
};
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
/**
|
|
209
|
+
* Parse typecheck output into structured issues.
|
|
210
|
+
*/
|
|
211
|
+
private static parseTypecheckOutput(
|
|
212
|
+
output: string,
|
|
213
|
+
useTsgo: boolean,
|
|
214
|
+
targetPath: string | undefined,
|
|
215
|
+
disableFilter: boolean,
|
|
216
|
+
): { errors: ParsedIssue[]; warnings: ParsedIssue[] } {
|
|
217
|
+
const errors: ParsedIssue[] = [];
|
|
218
|
+
const warnings: ParsedIssue[] = [];
|
|
219
|
+
|
|
220
|
+
const cleanOutput = TypecheckRepositoryImpl.stripAnsiCodes(output);
|
|
221
|
+
const lines = cleanOutput.split("\n");
|
|
222
|
+
|
|
223
|
+
for (const line of lines) {
|
|
224
|
+
const issue = TypecheckRepositoryImpl.parseOutputLine(line, useTsgo);
|
|
225
|
+
|
|
226
|
+
if (issue) {
|
|
227
|
+
// Apply filtering based on target path and disableFilter setting
|
|
228
|
+
if (!shouldIncludeFile(issue.file, targetPath, disableFilter)) {
|
|
229
|
+
continue;
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
// Convert file path to display format
|
|
233
|
+
issue.file = getDisplayPath(issue.file);
|
|
234
|
+
|
|
235
|
+
if (issue.severity === "error") {
|
|
236
|
+
errors.push(issue);
|
|
237
|
+
} else {
|
|
238
|
+
warnings.push(issue);
|
|
239
|
+
}
|
|
240
|
+
} else if (line.includes("error TS") && line.trim()) {
|
|
241
|
+
// Fallback for simpler error formats - only when filtering is disabled
|
|
242
|
+
if (targetPath && !disableFilter) {
|
|
243
|
+
continue;
|
|
244
|
+
}
|
|
245
|
+
errors.push({
|
|
246
|
+
file: "unknown",
|
|
247
|
+
severity: "error",
|
|
248
|
+
message: line.trim(),
|
|
249
|
+
});
|
|
250
|
+
} else if (
|
|
251
|
+
line.includes("warning") &&
|
|
252
|
+
[".ts", ".tsx"].some((ext) => line.includes(ext)) &&
|
|
253
|
+
line.trim()
|
|
254
|
+
) {
|
|
255
|
+
// Fallback warning format - only when filtering is disabled
|
|
256
|
+
if (targetPath && !disableFilter) {
|
|
257
|
+
continue;
|
|
258
|
+
}
|
|
259
|
+
warnings.push({
|
|
260
|
+
file: "unknown",
|
|
261
|
+
severity: "warning",
|
|
262
|
+
message: line.trim(),
|
|
263
|
+
});
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
return { errors, warnings };
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
// --------------------------------------------------------
|
|
271
|
+
// Static Private Helpers - Temp TSConfig Management
|
|
272
|
+
// --------------------------------------------------------
|
|
273
|
+
|
|
274
|
+
/**
|
|
275
|
+
* Adjust a single path to be relative to temp config location.
|
|
276
|
+
* @param path - The path to adjust
|
|
277
|
+
* @param prefix - The relative prefix (e.g., "../../")
|
|
278
|
+
*/
|
|
279
|
+
private static adjustPath(path: string, prefix: string): string {
|
|
280
|
+
if (path.startsWith("/")) {
|
|
281
|
+
return path; // Absolute paths don't need adjustment
|
|
282
|
+
}
|
|
283
|
+
if (path.startsWith("./")) {
|
|
284
|
+
return `${prefix}${path.slice(2)}`;
|
|
285
|
+
}
|
|
286
|
+
if (path.startsWith("../")) {
|
|
287
|
+
return path; // Already relative, don't double-adjust
|
|
288
|
+
}
|
|
289
|
+
return `${prefix}${path}`;
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* Adjust file paths to be relative to temp config location.
|
|
294
|
+
*/
|
|
295
|
+
private static adjustFilePaths(files: string[], prefix: string): string[] {
|
|
296
|
+
return files.map((file) =>
|
|
297
|
+
TypecheckRepositoryImpl.adjustPath(file, prefix),
|
|
298
|
+
);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* Adjust path mappings to account for temp config location.
|
|
303
|
+
*/
|
|
304
|
+
private static adjustPathMappings(
|
|
305
|
+
paths: Record<string, string[]> | undefined,
|
|
306
|
+
prefix: string,
|
|
307
|
+
): Record<string, string[]> {
|
|
308
|
+
const adjustedPaths: Record<string, string[]> = {};
|
|
309
|
+
if (!paths) {
|
|
310
|
+
return adjustedPaths;
|
|
311
|
+
}
|
|
312
|
+
|
|
313
|
+
for (const [key, pathArray] of Object.entries(paths)) {
|
|
314
|
+
adjustedPaths[key] = pathArray.map((path) =>
|
|
315
|
+
TypecheckRepositoryImpl.adjustPath(path, prefix),
|
|
316
|
+
);
|
|
317
|
+
}
|
|
318
|
+
|
|
319
|
+
return adjustedPaths;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Adjust typeRoots to account for temp config location.
|
|
324
|
+
*/
|
|
325
|
+
private static adjustTypeRoots(
|
|
326
|
+
typeRoots: string[] | undefined,
|
|
327
|
+
prefix: string,
|
|
328
|
+
): string[] | undefined {
|
|
329
|
+
if (!typeRoots) {
|
|
330
|
+
return undefined;
|
|
331
|
+
}
|
|
332
|
+
|
|
333
|
+
return typeRoots.map((root) =>
|
|
334
|
+
TypecheckRepositoryImpl.adjustPath(root, prefix),
|
|
335
|
+
);
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
/**
|
|
339
|
+
* Adjust general include patterns to account for temp config location.
|
|
340
|
+
*/
|
|
341
|
+
private static adjustIncludePatterns(
|
|
342
|
+
patterns: string[],
|
|
343
|
+
prefix: string,
|
|
344
|
+
): string[] {
|
|
345
|
+
return patterns.map((pattern) =>
|
|
346
|
+
TypecheckRepositoryImpl.adjustPath(pattern, prefix),
|
|
347
|
+
);
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
/**
|
|
351
|
+
* Calculate the relative path prefix needed to reach project root from the cache directory.
|
|
352
|
+
* e.g., ".tmp/typecheck-cache" -> "../../"
|
|
353
|
+
*/
|
|
354
|
+
private static getRelativePrefix(cachePath: string): string {
|
|
355
|
+
// Count directory depth by splitting on path separator
|
|
356
|
+
const depth = cachePath.split("/").filter((p) => p && p !== ".").length;
|
|
357
|
+
// eslint-disable-next-line i18next/no-literal-string
|
|
358
|
+
return "../".repeat(depth);
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
/**
|
|
362
|
+
* Adjust exclude patterns to account for temp config location.
|
|
363
|
+
*/
|
|
364
|
+
private static adjustExcludePatterns(
|
|
365
|
+
excludes: string[] | undefined,
|
|
366
|
+
prefix: string,
|
|
367
|
+
): string[] {
|
|
368
|
+
if (!excludes) {
|
|
369
|
+
return [];
|
|
370
|
+
}
|
|
371
|
+
|
|
372
|
+
return excludes.map((excludePattern) =>
|
|
373
|
+
TypecheckRepositoryImpl.adjustPath(excludePattern, prefix),
|
|
374
|
+
);
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
/**
|
|
378
|
+
* Create a temporary tsconfig.json for specific files.
|
|
379
|
+
* Preserves compiler options and path mappings from main tsconfig
|
|
380
|
+
* but limits files to improve performance.
|
|
381
|
+
*/
|
|
382
|
+
private static createTempTsConfig(
|
|
383
|
+
filesToCheck: string[],
|
|
384
|
+
tempConfigPath: string,
|
|
385
|
+
cachePath: string,
|
|
386
|
+
): void {
|
|
387
|
+
// Calculate the relative prefix based on cache directory depth
|
|
388
|
+
const prefix = TypecheckRepositoryImpl.getRelativePrefix(cachePath);
|
|
389
|
+
|
|
390
|
+
// Read and validate the main tsconfig.json
|
|
391
|
+
let mainTsConfig: TsConfig;
|
|
392
|
+
try {
|
|
393
|
+
const tsConfigContent = readFileSync("tsconfig.json", "utf8");
|
|
394
|
+
const parsedJsonResult = parseJsonWithComments(tsConfigContent);
|
|
395
|
+
if (!parsedJsonResult.success) {
|
|
396
|
+
// eslint-disable-next-line oxlint-plugin-restricted/restricted-syntax, i18next/no-literal-string -- Build infrastructure needs to throw for configuration errors
|
|
397
|
+
throw new Error("Failed to parse tsconfig.json");
|
|
398
|
+
}
|
|
399
|
+
mainTsConfig = TsConfigSchema.parse(parsedJsonResult.data);
|
|
400
|
+
} catch (error) {
|
|
401
|
+
/* eslint-disable oxlint-plugin-restricted/restricted-syntax, i18next/no-literal-string -- Build infrastructure needs to throw for configuration errors */
|
|
402
|
+
throw new Error(
|
|
403
|
+
`Failed to read or parse tsconfig.json: ${error instanceof Error ? error.message : String(error)}`,
|
|
404
|
+
{ cause: error },
|
|
405
|
+
);
|
|
406
|
+
/* eslint-enable oxlint-plugin-restricted/restricted-syntax, i18next/no-literal-string */
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
// Filter out wildcard patterns and adjust paths for temp config location
|
|
410
|
+
const generalFilesToInclude = (mainTsConfig.include || []).filter(
|
|
411
|
+
(includePattern) =>
|
|
412
|
+
WILDCARD_INCLUDE_PATTERNS.includes(includePattern)
|
|
413
|
+
? undefined
|
|
414
|
+
: includePattern,
|
|
415
|
+
);
|
|
416
|
+
const adjustedGeneralIncludes =
|
|
417
|
+
TypecheckRepositoryImpl.adjustIncludePatterns(
|
|
418
|
+
generalFilesToInclude,
|
|
419
|
+
prefix,
|
|
420
|
+
);
|
|
421
|
+
|
|
422
|
+
// Adjust paths for temp config location
|
|
423
|
+
const adjustedFiles = TypecheckRepositoryImpl.adjustFilePaths(
|
|
424
|
+
filesToCheck,
|
|
425
|
+
prefix,
|
|
426
|
+
);
|
|
427
|
+
const adjustedPaths = TypecheckRepositoryImpl.adjustPathMappings(
|
|
428
|
+
mainTsConfig.compilerOptions?.paths,
|
|
429
|
+
prefix,
|
|
430
|
+
);
|
|
431
|
+
const adjustedExcludes = TypecheckRepositoryImpl.adjustExcludePatterns(
|
|
432
|
+
mainTsConfig.exclude,
|
|
433
|
+
prefix,
|
|
434
|
+
);
|
|
435
|
+
const adjustedTypeRoots = TypecheckRepositoryImpl.adjustTypeRoots(
|
|
436
|
+
mainTsConfig.compilerOptions?.typeRoots,
|
|
437
|
+
prefix,
|
|
438
|
+
);
|
|
439
|
+
|
|
440
|
+
// Create temporary tsconfig
|
|
441
|
+
const tempTsConfig: TsConfig = {
|
|
442
|
+
...mainTsConfig,
|
|
443
|
+
compilerOptions: {
|
|
444
|
+
...mainTsConfig.compilerOptions,
|
|
445
|
+
rootDir: prefix.slice(0, -1), // Remove trailing slash for rootDir (e.g., "../..")
|
|
446
|
+
baseUrl: undefined, // Remove baseUrl as tsgo doesn't support it
|
|
447
|
+
typeRoots: adjustedTypeRoots,
|
|
448
|
+
paths: {
|
|
449
|
+
...adjustedPaths,
|
|
450
|
+
// eslint-disable-next-line i18next/no-literal-string
|
|
451
|
+
"*": [`${prefix}*`], // Replace baseUrl functionality for tsgo compatibility (resolve from project root)
|
|
452
|
+
},
|
|
453
|
+
},
|
|
454
|
+
include: [...adjustedGeneralIncludes, ...adjustedFiles],
|
|
455
|
+
exclude: adjustedExcludes,
|
|
456
|
+
};
|
|
457
|
+
|
|
458
|
+
writeFileSync(tempConfigPath, JSON.stringify(tempTsConfig, null, 2));
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
// --------------------------------------------------------
|
|
462
|
+
// Public Methods
|
|
463
|
+
// --------------------------------------------------------
|
|
464
|
+
|
|
465
|
+
/**
|
|
466
|
+
* Execute TypeScript type checking.
|
|
467
|
+
*/
|
|
468
|
+
async execute(
|
|
469
|
+
data: TypecheckRequestOutput,
|
|
470
|
+
logger: EndpointLogger,
|
|
471
|
+
): Promise<ApiResponseType<TypecheckResponseOutput>> {
|
|
472
|
+
const startTime = Date.now();
|
|
473
|
+
let output = "";
|
|
474
|
+
let config: TypecheckConfig | undefined;
|
|
475
|
+
|
|
476
|
+
try {
|
|
477
|
+
// Load and validate configuration
|
|
478
|
+
const configResult = await ensureConfigReady(logger, data.createConfig);
|
|
479
|
+
|
|
480
|
+
if (!configResult.ready) {
|
|
481
|
+
return success({
|
|
482
|
+
issues: {
|
|
483
|
+
items: [
|
|
484
|
+
{
|
|
485
|
+
file: configResult.configPath,
|
|
486
|
+
severity: "error" as const,
|
|
487
|
+
message: configResult.message,
|
|
488
|
+
type: "type" as const,
|
|
489
|
+
},
|
|
490
|
+
],
|
|
491
|
+
files: [
|
|
492
|
+
{
|
|
493
|
+
file: configResult.configPath,
|
|
494
|
+
errors: 1,
|
|
495
|
+
warnings: 0,
|
|
496
|
+
total: 1,
|
|
497
|
+
},
|
|
498
|
+
],
|
|
499
|
+
summary: {
|
|
500
|
+
totalIssues: 1,
|
|
501
|
+
totalFiles: 1,
|
|
502
|
+
totalErrors: 1,
|
|
503
|
+
displayedIssues: 1,
|
|
504
|
+
displayedFiles: 1,
|
|
505
|
+
currentPage: 1,
|
|
506
|
+
totalPages: 1,
|
|
507
|
+
},
|
|
508
|
+
},
|
|
509
|
+
});
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
const checkConfig = configResult.config;
|
|
513
|
+
|
|
514
|
+
// Check if typecheck is enabled
|
|
515
|
+
if (!checkConfig.typecheck.enabled) {
|
|
516
|
+
logger.info("Typecheck is disabled in check.config.ts");
|
|
517
|
+
return success({
|
|
518
|
+
issues: {
|
|
519
|
+
items: [],
|
|
520
|
+
files: [],
|
|
521
|
+
summary: {
|
|
522
|
+
totalIssues: 0,
|
|
523
|
+
totalFiles: 0,
|
|
524
|
+
totalErrors: 0,
|
|
525
|
+
displayedIssues: 0,
|
|
526
|
+
displayedFiles: 0,
|
|
527
|
+
currentPage: 1,
|
|
528
|
+
totalPages: 1,
|
|
529
|
+
},
|
|
530
|
+
},
|
|
531
|
+
});
|
|
532
|
+
}
|
|
533
|
+
|
|
534
|
+
const typecheckConfig = checkConfig.typecheck;
|
|
535
|
+
const useTsgo = typecheckConfig.useTsgo ?? false;
|
|
536
|
+
|
|
537
|
+
// Get the appropriate base command
|
|
538
|
+
const baseCommand = TypecheckRepositoryImpl.getBaseCommand(useTsgo);
|
|
539
|
+
logger.debug(`Using ${useTsgo ? "tsgo" : "tsc"} for type checking`);
|
|
540
|
+
|
|
541
|
+
// Create TypeScript checking configuration
|
|
542
|
+
config = createTypecheckConfig(data.path, typecheckConfig.cachePath);
|
|
543
|
+
|
|
544
|
+
// Build the command based on path type
|
|
545
|
+
const command = this.buildCommand(
|
|
546
|
+
baseCommand,
|
|
547
|
+
config,
|
|
548
|
+
typecheckConfig.cachePath,
|
|
549
|
+
logger,
|
|
550
|
+
);
|
|
551
|
+
|
|
552
|
+
if (!command) {
|
|
553
|
+
return fail({
|
|
554
|
+
message: "app.api.system.check.typecheck.errors.noTsFiles.title",
|
|
555
|
+
errorType: ErrorResponseTypes.NOT_FOUND,
|
|
556
|
+
messageParams: {
|
|
557
|
+
message: "app.api.system.check.typecheck.errors.noTsFiles.message",
|
|
558
|
+
},
|
|
559
|
+
});
|
|
560
|
+
}
|
|
561
|
+
|
|
562
|
+
logger.debug("Executing TypeScript command:", command);
|
|
563
|
+
|
|
564
|
+
// Execute the typecheck command
|
|
565
|
+
const execResult = await this.executeCommand(
|
|
566
|
+
command,
|
|
567
|
+
data.timeout,
|
|
568
|
+
logger,
|
|
569
|
+
);
|
|
570
|
+
|
|
571
|
+
if (!execResult.success && !execResult.output) {
|
|
572
|
+
return fail({
|
|
573
|
+
message: "app.api.system.check.typecheck.errors.internal.title",
|
|
574
|
+
errorType: ErrorResponseTypes.INTERNAL_ERROR,
|
|
575
|
+
messageParams: {
|
|
576
|
+
error: execResult.error || "Unknown error",
|
|
577
|
+
},
|
|
578
|
+
});
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
output = execResult.output;
|
|
582
|
+
|
|
583
|
+
// Parse the output into structured issues
|
|
584
|
+
const { errors, warnings } = TypecheckRepositoryImpl.parseTypecheckOutput(
|
|
585
|
+
output,
|
|
586
|
+
useTsgo,
|
|
587
|
+
config.targetPath,
|
|
588
|
+
data.disableFilter,
|
|
589
|
+
);
|
|
590
|
+
|
|
591
|
+
// Build response with optional sorting
|
|
592
|
+
const allIssues = [
|
|
593
|
+
...errors.map((e) => ({ ...e, type: "type" as const })),
|
|
594
|
+
...warnings.map((w) => ({ ...w, type: "type" as const })),
|
|
595
|
+
];
|
|
596
|
+
|
|
597
|
+
// Skip sorting if requested (when vibe-check already sorted)
|
|
598
|
+
const issues = data.skipSorting
|
|
599
|
+
? allIssues
|
|
600
|
+
: allIssues.toSorted((a, b) => {
|
|
601
|
+
const fileCompare = a.file.localeCompare(b.file);
|
|
602
|
+
if (fileCompare !== 0) {
|
|
603
|
+
return fileCompare;
|
|
604
|
+
}
|
|
605
|
+
const lineA = a.line || 0;
|
|
606
|
+
const lineB = b.line || 0;
|
|
607
|
+
return lineA - lineB;
|
|
608
|
+
});
|
|
609
|
+
|
|
610
|
+
return success(this.buildResponse(issues, data));
|
|
611
|
+
} catch (error) {
|
|
612
|
+
return this.handleError(
|
|
613
|
+
error as Error,
|
|
614
|
+
output,
|
|
615
|
+
config,
|
|
616
|
+
data,
|
|
617
|
+
startTime,
|
|
618
|
+
logger,
|
|
619
|
+
);
|
|
620
|
+
}
|
|
621
|
+
}
|
|
622
|
+
|
|
623
|
+
// --------------------------------------------------------
|
|
624
|
+
// Private Methods
|
|
625
|
+
// --------------------------------------------------------
|
|
626
|
+
|
|
627
|
+
/**
|
|
628
|
+
* Build file statistics from issues
|
|
629
|
+
*/
|
|
630
|
+
private static buildFileStats(
|
|
631
|
+
issues: TypecheckIssue[],
|
|
632
|
+
): Map<string, { errors: number; warnings: number; total: number }> {
|
|
633
|
+
const fileStats = new Map<
|
|
634
|
+
string,
|
|
635
|
+
{ errors: number; warnings: number; total: number }
|
|
636
|
+
>();
|
|
637
|
+
|
|
638
|
+
for (const issue of issues) {
|
|
639
|
+
const stats = fileStats.get(issue.file) || {
|
|
640
|
+
errors: 0,
|
|
641
|
+
warnings: 0,
|
|
642
|
+
total: 0,
|
|
643
|
+
};
|
|
644
|
+
stats.total++;
|
|
645
|
+
if (issue.severity === "error") {
|
|
646
|
+
stats.errors++;
|
|
647
|
+
}
|
|
648
|
+
if (issue.severity === "warning") {
|
|
649
|
+
stats.warnings++;
|
|
650
|
+
}
|
|
651
|
+
fileStats.set(issue.file, stats);
|
|
652
|
+
}
|
|
653
|
+
|
|
654
|
+
return fileStats;
|
|
655
|
+
}
|
|
656
|
+
|
|
657
|
+
/**
|
|
658
|
+
* Format file statistics for response
|
|
659
|
+
*/
|
|
660
|
+
private static formatFileStats(
|
|
661
|
+
fileStats: Map<string, { errors: number; warnings: number; total: number }>,
|
|
662
|
+
): Array<{ file: string; errors: number; warnings: number; total: number }> {
|
|
663
|
+
return [...fileStats.entries()]
|
|
664
|
+
.map(([file, stats]) => ({
|
|
665
|
+
file,
|
|
666
|
+
errors: stats.errors,
|
|
667
|
+
warnings: stats.warnings,
|
|
668
|
+
total: stats.total,
|
|
669
|
+
}))
|
|
670
|
+
.toSorted((a, b) => a.file.localeCompare(b.file));
|
|
671
|
+
}
|
|
672
|
+
|
|
673
|
+
/**
|
|
674
|
+
* Build response with pagination and statistics
|
|
675
|
+
*/
|
|
676
|
+
private buildResponse(
|
|
677
|
+
allIssues: TypecheckIssue[],
|
|
678
|
+
data: TypecheckRequestOutput,
|
|
679
|
+
): TypecheckResponseOutput {
|
|
680
|
+
const totalIssues = allIssues.length;
|
|
681
|
+
const totalFiles = new Set(allIssues.map((issue) => issue.file)).size;
|
|
682
|
+
const totalErrors = allIssues.filter(
|
|
683
|
+
(issue) => issue.severity === "error",
|
|
684
|
+
).length;
|
|
685
|
+
|
|
686
|
+
const fileStats = TypecheckRepositoryImpl.buildFileStats(allIssues);
|
|
687
|
+
const allFiles = TypecheckRepositoryImpl.formatFileStats(fileStats);
|
|
688
|
+
const limitedFiles = data.maxFilesInSummary
|
|
689
|
+
? allFiles.slice(0, data.maxFilesInSummary)
|
|
690
|
+
: allFiles;
|
|
691
|
+
|
|
692
|
+
const limit = data.limit;
|
|
693
|
+
const currentPage = data.page;
|
|
694
|
+
const totalPages = Math.ceil(totalIssues / limit);
|
|
695
|
+
const startIndex = (currentPage - 1) * limit;
|
|
696
|
+
const endIndex = startIndex + limit;
|
|
697
|
+
const limitedIssues = allIssues.slice(startIndex, endIndex);
|
|
698
|
+
|
|
699
|
+
const displayedIssues = limitedIssues.length;
|
|
700
|
+
const displayedFiles = new Set(limitedIssues.map((issue) => issue.file))
|
|
701
|
+
.size;
|
|
702
|
+
|
|
703
|
+
return {
|
|
704
|
+
issues: {
|
|
705
|
+
items: limitedIssues,
|
|
706
|
+
files: limitedFiles,
|
|
707
|
+
summary: {
|
|
708
|
+
totalIssues,
|
|
709
|
+
totalFiles,
|
|
710
|
+
totalErrors,
|
|
711
|
+
displayedIssues,
|
|
712
|
+
displayedFiles,
|
|
713
|
+
truncatedMessage:
|
|
714
|
+
displayedIssues < totalIssues || displayedFiles < totalFiles
|
|
715
|
+
? `Showing ${displayedIssues} of ${totalIssues} issues from ${displayedFiles} of ${totalFiles} files`
|
|
716
|
+
: "",
|
|
717
|
+
currentPage,
|
|
718
|
+
totalPages,
|
|
719
|
+
},
|
|
720
|
+
},
|
|
721
|
+
};
|
|
722
|
+
}
|
|
723
|
+
|
|
724
|
+
/**
|
|
725
|
+
* Build the typecheck command based on path type.
|
|
726
|
+
*/
|
|
727
|
+
private buildCommand(
|
|
728
|
+
baseCommand: string,
|
|
729
|
+
config: TypecheckConfig,
|
|
730
|
+
cachePath: string,
|
|
731
|
+
logger: EndpointLogger,
|
|
732
|
+
): string | null {
|
|
733
|
+
if (config.pathType === PathType.NO_PATH) {
|
|
734
|
+
// No specific path provided, check entire project
|
|
735
|
+
logger.debug("Running TypeScript check on entire project");
|
|
736
|
+
return TypecheckRepositoryImpl.buildTypecheckCommand(
|
|
737
|
+
baseCommand,
|
|
738
|
+
config.buildInfoFile,
|
|
739
|
+
"tsconfig.json",
|
|
740
|
+
);
|
|
741
|
+
}
|
|
742
|
+
|
|
743
|
+
if (!config.tempConfigFile) {
|
|
744
|
+
return null;
|
|
745
|
+
}
|
|
746
|
+
|
|
747
|
+
if (config.pathType === PathType.SINGLE_FILE) {
|
|
748
|
+
// Single file - create temporary tsconfig for this file
|
|
749
|
+
TypecheckRepositoryImpl.createTempTsConfig(
|
|
750
|
+
[config.targetPath!],
|
|
751
|
+
config.tempConfigFile,
|
|
752
|
+
cachePath,
|
|
753
|
+
);
|
|
754
|
+
} else {
|
|
755
|
+
// Folder - create temporary tsconfig with folder glob pattern
|
|
756
|
+
const folderPath = config.targetPath || ".";
|
|
757
|
+
// eslint-disable-next-line i18next/no-literal-string
|
|
758
|
+
TypecheckRepositoryImpl.createTempTsConfig(
|
|
759
|
+
[`${folderPath}/**/*`],
|
|
760
|
+
config.tempConfigFile,
|
|
761
|
+
cachePath,
|
|
762
|
+
);
|
|
763
|
+
}
|
|
764
|
+
|
|
765
|
+
return TypecheckRepositoryImpl.buildTypecheckCommand(
|
|
766
|
+
baseCommand,
|
|
767
|
+
config.buildInfoFile,
|
|
768
|
+
config.tempConfigFile,
|
|
769
|
+
);
|
|
770
|
+
}
|
|
771
|
+
|
|
772
|
+
/**
|
|
773
|
+
* Execute the typecheck command.
|
|
774
|
+
*/
|
|
775
|
+
private async executeCommand(
|
|
776
|
+
command: string,
|
|
777
|
+
timeout: number | undefined,
|
|
778
|
+
logger: EndpointLogger,
|
|
779
|
+
): Promise<{ success: boolean; output: string; error?: string }> {
|
|
780
|
+
try {
|
|
781
|
+
const result = await execAsync(command, {
|
|
782
|
+
cwd: process.cwd(),
|
|
783
|
+
timeout: (timeout ?? 900) * 1000,
|
|
784
|
+
maxBuffer: 1024 * 1024 * 10, // 10MB buffer
|
|
785
|
+
});
|
|
786
|
+
|
|
787
|
+
logger.debug("TypeScript command executed successfully");
|
|
788
|
+
return {
|
|
789
|
+
success: true,
|
|
790
|
+
output: [result.stdout, result.stderr].filter(Boolean).join("\n"),
|
|
791
|
+
};
|
|
792
|
+
} catch (execError) {
|
|
793
|
+
// TSC exit codes 1 and 2 mean TypeScript errors were found
|
|
794
|
+
const hasTypeErrors =
|
|
795
|
+
execError &&
|
|
796
|
+
typeof execError === "object" &&
|
|
797
|
+
"code" in execError &&
|
|
798
|
+
(execError.code === 1 || execError.code === 2);
|
|
799
|
+
|
|
800
|
+
if (hasTypeErrors && "stdout" in execError && "stderr" in execError) {
|
|
801
|
+
const stdout =
|
|
802
|
+
typeof execError.stdout === "string" ? execError.stdout : "";
|
|
803
|
+
const stderr =
|
|
804
|
+
typeof execError.stderr === "string" ? execError.stderr : "";
|
|
805
|
+
return {
|
|
806
|
+
success: false,
|
|
807
|
+
output: [stdout, stderr].filter(Boolean).join("\n"),
|
|
808
|
+
};
|
|
809
|
+
}
|
|
810
|
+
|
|
811
|
+
// Other errors are unexpected
|
|
812
|
+
const parsedError = parseError(execError);
|
|
813
|
+
logger.error(
|
|
814
|
+
"Unexpected error executing TypeScript command",
|
|
815
|
+
parsedError,
|
|
816
|
+
);
|
|
817
|
+
return {
|
|
818
|
+
success: false,
|
|
819
|
+
output: "",
|
|
820
|
+
error: parsedError.message,
|
|
821
|
+
};
|
|
822
|
+
}
|
|
823
|
+
}
|
|
824
|
+
|
|
825
|
+
/**
|
|
826
|
+
* Handle errors during execution.
|
|
827
|
+
*/
|
|
828
|
+
private handleError(
|
|
829
|
+
error: Error,
|
|
830
|
+
output: string,
|
|
831
|
+
config: TypecheckConfig | undefined,
|
|
832
|
+
data: TypecheckRequestOutput,
|
|
833
|
+
startTime: number,
|
|
834
|
+
logger: EndpointLogger,
|
|
835
|
+
): ApiResponseType<TypecheckResponseOutput> {
|
|
836
|
+
const duration = Date.now() - startTime;
|
|
837
|
+
const parsedError = parseError(error);
|
|
838
|
+
const targetPath = config?.targetPath ?? data.path;
|
|
839
|
+
|
|
840
|
+
logger.warn("Typecheck execution error", {
|
|
841
|
+
error: parsedError.message,
|
|
842
|
+
duration,
|
|
843
|
+
});
|
|
844
|
+
|
|
845
|
+
// Try to extract issues from error output
|
|
846
|
+
const hasStderr = error && typeof error === "object" && "stderr" in error;
|
|
847
|
+
const hasStdout = error && typeof error === "object" && "stdout" in error;
|
|
848
|
+
const hasCode = error && typeof error === "object" && "code" in error;
|
|
849
|
+
|
|
850
|
+
const issues: Array<{
|
|
851
|
+
file: string;
|
|
852
|
+
line?: number;
|
|
853
|
+
column?: number;
|
|
854
|
+
code?: string;
|
|
855
|
+
severity: "error" | "warning" | "info";
|
|
856
|
+
message: string;
|
|
857
|
+
type: "type";
|
|
858
|
+
}> = [];
|
|
859
|
+
|
|
860
|
+
if (hasStderr && typeof error.stderr === "string") {
|
|
861
|
+
output += error.stderr;
|
|
862
|
+
issues.push({
|
|
863
|
+
file: "unknown",
|
|
864
|
+
severity: "error",
|
|
865
|
+
message: error.stderr.trim(),
|
|
866
|
+
type: "type",
|
|
867
|
+
});
|
|
868
|
+
}
|
|
869
|
+
|
|
870
|
+
if (hasStdout && typeof error.stdout === "string") {
|
|
871
|
+
output += error.stdout;
|
|
872
|
+
|
|
873
|
+
// Parse TypeScript errors from stdout
|
|
874
|
+
const { errors } = TypecheckRepositoryImpl.parseTypecheckOutput(
|
|
875
|
+
error.stdout,
|
|
876
|
+
false, // Try both patterns
|
|
877
|
+
targetPath,
|
|
878
|
+
data.disableFilter,
|
|
879
|
+
);
|
|
880
|
+
|
|
881
|
+
for (const err of errors) {
|
|
882
|
+
issues.push({ ...err, type: "type" });
|
|
883
|
+
}
|
|
884
|
+
}
|
|
885
|
+
|
|
886
|
+
// If no specific errors found, add the general error message
|
|
887
|
+
if (issues.length === 0) {
|
|
888
|
+
issues.push({
|
|
889
|
+
file: "unknown",
|
|
890
|
+
severity: "error",
|
|
891
|
+
message: parsedError.message,
|
|
892
|
+
type: "type",
|
|
893
|
+
});
|
|
894
|
+
}
|
|
895
|
+
|
|
896
|
+
// For TypeScript errors (exit code 2) or when we have parsed errors,
|
|
897
|
+
// return success with error details for UI display
|
|
898
|
+
const errorCode =
|
|
899
|
+
hasCode && typeof error.code === "number" ? error.code : 0;
|
|
900
|
+
if (errorCode === 2 || issues.length > 0) {
|
|
901
|
+
return success(this.buildResponse(issues, data));
|
|
902
|
+
}
|
|
903
|
+
|
|
904
|
+
return fail({
|
|
905
|
+
message: "app.api.system.check.typecheck.errors.internal.title",
|
|
906
|
+
errorType: ErrorResponseTypes.INTERNAL_ERROR,
|
|
907
|
+
messageParams: {
|
|
908
|
+
error: parsedError.message,
|
|
909
|
+
output: output.trim(),
|
|
910
|
+
duration: duration.toString(),
|
|
911
|
+
},
|
|
912
|
+
});
|
|
913
|
+
}
|
|
914
|
+
}
|
|
915
|
+
|
|
916
|
+
// ============================================================
|
|
917
|
+
// Default Repository Instance
|
|
918
|
+
// ============================================================
|
|
919
|
+
export const typecheckRepository = new TypecheckRepositoryImpl();
|