@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,642 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Release Tool Utilities
|
|
3
|
+
* Type guards, retry logic, and helper functions
|
|
4
|
+
*/
|
|
5
|
+
|
|
6
|
+
import type { EndpointLogger } from "../../unified-interface/shared/logger/endpoint";
|
|
7
|
+
import type {
|
|
8
|
+
PackageJson,
|
|
9
|
+
ParsedVersion,
|
|
10
|
+
ReleaseConfig,
|
|
11
|
+
RetryConfig,
|
|
12
|
+
} from "../definition";
|
|
13
|
+
import { MESSAGES, RETRY_DEFAULTS } from "./constants";
|
|
14
|
+
|
|
15
|
+
// ============================================================================
|
|
16
|
+
// Type Definitions for Type Guards
|
|
17
|
+
// ============================================================================
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Parsed JSON value type (result of JSON.parse)
|
|
21
|
+
*/
|
|
22
|
+
type JsonValue = string | number | boolean | null | JsonObject | JsonArray;
|
|
23
|
+
interface JsonObject {
|
|
24
|
+
[key: string]: JsonValue;
|
|
25
|
+
}
|
|
26
|
+
type JsonArray = JsonValue[];
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Error type from catch blocks - can be any value
|
|
30
|
+
*/
|
|
31
|
+
type CatchError =
|
|
32
|
+
| Error
|
|
33
|
+
| {
|
|
34
|
+
stdout?: string | Buffer;
|
|
35
|
+
stderr?: string | Buffer;
|
|
36
|
+
status?: number;
|
|
37
|
+
message?: string;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Exec sync error type with stdout/stderr
|
|
42
|
+
*/
|
|
43
|
+
interface ExecSyncError {
|
|
44
|
+
stdout?: string | Buffer;
|
|
45
|
+
stderr?: string | Buffer;
|
|
46
|
+
status?: number;
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
// ============================================================================
|
|
50
|
+
// Type Guards
|
|
51
|
+
// ============================================================================
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Check if a parsed JSON value is a valid PackageJson
|
|
55
|
+
* Returns the value typed as PackageJson if valid, otherwise undefined
|
|
56
|
+
*/
|
|
57
|
+
export function parsePackageJson(
|
|
58
|
+
value: JsonValue | undefined,
|
|
59
|
+
): PackageJson | undefined {
|
|
60
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
const obj = value as JsonObject;
|
|
64
|
+
if (typeof obj.name === "string" && typeof obj.version === "string") {
|
|
65
|
+
// Build a properly typed PackageJson object
|
|
66
|
+
return {
|
|
67
|
+
name: obj.name,
|
|
68
|
+
version: obj.version,
|
|
69
|
+
scripts: obj.scripts as PackageJson["scripts"],
|
|
70
|
+
dependencies: obj.dependencies as PackageJson["dependencies"],
|
|
71
|
+
devDependencies: obj.devDependencies as PackageJson["devDependencies"],
|
|
72
|
+
peerDependencies: obj.peerDependencies as PackageJson["peerDependencies"],
|
|
73
|
+
optionalDependencies:
|
|
74
|
+
obj.optionalDependencies as PackageJson["optionalDependencies"],
|
|
75
|
+
updateIgnoreDependencies:
|
|
76
|
+
obj.updateIgnoreDependencies as PackageJson["updateIgnoreDependencies"],
|
|
77
|
+
};
|
|
78
|
+
}
|
|
79
|
+
return undefined;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
/**
|
|
83
|
+
* Safe JSON parse that returns JsonValue type
|
|
84
|
+
*/
|
|
85
|
+
export function safeJsonParse(text: string): JsonValue | undefined {
|
|
86
|
+
try {
|
|
87
|
+
return JSON.parse(text) as JsonValue;
|
|
88
|
+
} catch {
|
|
89
|
+
return undefined;
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
/**
|
|
94
|
+
* Type guard for ReleaseConfig modules
|
|
95
|
+
*/
|
|
96
|
+
export function isReleaseConfigModule(
|
|
97
|
+
module: { default?: ReleaseConfig } | null | undefined,
|
|
98
|
+
): module is { default: ReleaseConfig } {
|
|
99
|
+
if (typeof module !== "object" || module === null) {
|
|
100
|
+
return false;
|
|
101
|
+
}
|
|
102
|
+
if (!("default" in module) || module.default === undefined) {
|
|
103
|
+
return false;
|
|
104
|
+
}
|
|
105
|
+
const defaultExport = module.default;
|
|
106
|
+
if (typeof defaultExport !== "object" || defaultExport === null) {
|
|
107
|
+
return false;
|
|
108
|
+
}
|
|
109
|
+
if (!("packages" in defaultExport)) {
|
|
110
|
+
return false;
|
|
111
|
+
}
|
|
112
|
+
return Array.isArray(defaultExport.packages);
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
/**
|
|
116
|
+
* Convert catch error to typed error
|
|
117
|
+
* Accepts any value from catch block and converts to CatchError
|
|
118
|
+
*/
|
|
119
|
+
export function toCatchError(
|
|
120
|
+
err: Error | ExecSyncError | string | null | undefined,
|
|
121
|
+
): CatchError {
|
|
122
|
+
if (err instanceof Error) {
|
|
123
|
+
return err;
|
|
124
|
+
}
|
|
125
|
+
if (typeof err === "string") {
|
|
126
|
+
return new Error(err);
|
|
127
|
+
}
|
|
128
|
+
if (typeof err === "object" && err !== null) {
|
|
129
|
+
return err as CatchError;
|
|
130
|
+
}
|
|
131
|
+
return new Error(String(err));
|
|
132
|
+
}
|
|
133
|
+
|
|
134
|
+
/**
|
|
135
|
+
* Type guard for errors with stdout
|
|
136
|
+
*/
|
|
137
|
+
export function hasStdout(
|
|
138
|
+
error: CatchError,
|
|
139
|
+
): error is CatchError & { stdout: string | Buffer } {
|
|
140
|
+
if (typeof error !== "object" || error === null) {
|
|
141
|
+
return false;
|
|
142
|
+
}
|
|
143
|
+
return (
|
|
144
|
+
"stdout" in error &&
|
|
145
|
+
error.stdout !== undefined &&
|
|
146
|
+
(typeof error.stdout === "string" || Buffer.isBuffer(error.stdout))
|
|
147
|
+
);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/**
|
|
151
|
+
* Type guard for errors with stderr
|
|
152
|
+
*/
|
|
153
|
+
export function hasStderr(
|
|
154
|
+
error: CatchError,
|
|
155
|
+
): error is CatchError & { stderr: string | Buffer } {
|
|
156
|
+
if (typeof error !== "object" || error === null) {
|
|
157
|
+
return false;
|
|
158
|
+
}
|
|
159
|
+
return (
|
|
160
|
+
"stderr" in error &&
|
|
161
|
+
error.stderr !== undefined &&
|
|
162
|
+
(typeof error.stderr === "string" || Buffer.isBuffer(error.stderr))
|
|
163
|
+
);
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
/**
|
|
167
|
+
* Type guard for errors with exit code
|
|
168
|
+
*/
|
|
169
|
+
export function hasExitCode(
|
|
170
|
+
error: CatchError,
|
|
171
|
+
): error is CatchError & { status: number } {
|
|
172
|
+
if (typeof error !== "object" || error === null) {
|
|
173
|
+
return false;
|
|
174
|
+
}
|
|
175
|
+
return "status" in error && typeof error.status === "number";
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
/**
|
|
179
|
+
* Check if a value is a non-empty string
|
|
180
|
+
*/
|
|
181
|
+
export function isNonEmptyString(
|
|
182
|
+
value: string | undefined | null,
|
|
183
|
+
): value is string {
|
|
184
|
+
return typeof value === "string" && value.trim().length > 0;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Check if a value is a valid semver string
|
|
189
|
+
*/
|
|
190
|
+
export function isValidSemver(value: string): boolean {
|
|
191
|
+
const semverRegex = /^\d+\.\d+\.\d+(-[a-zA-Z0-9.-]+)?(\+[a-zA-Z0-9.-]+)?$/;
|
|
192
|
+
return semverRegex.test(value);
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// ============================================================================
|
|
196
|
+
// Retry Logic
|
|
197
|
+
// ============================================================================
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Result type for retry operations
|
|
201
|
+
*/
|
|
202
|
+
export type RetryResult<T> =
|
|
203
|
+
| { success: true; data: T }
|
|
204
|
+
| { success: false; message: string };
|
|
205
|
+
|
|
206
|
+
/**
|
|
207
|
+
* Handler for retrying failed operations with exponential backoff
|
|
208
|
+
*/
|
|
209
|
+
export class RetryHandler {
|
|
210
|
+
private readonly maxAttempts: number;
|
|
211
|
+
private readonly delayMs: number;
|
|
212
|
+
private readonly backoffMultiplier: number;
|
|
213
|
+
private readonly maxDelayMs: number;
|
|
214
|
+
|
|
215
|
+
constructor(config?: RetryConfig) {
|
|
216
|
+
this.maxAttempts = config?.maxAttempts ?? RETRY_DEFAULTS.MAX_ATTEMPTS;
|
|
217
|
+
this.delayMs = config?.delayMs ?? RETRY_DEFAULTS.INITIAL_DELAY;
|
|
218
|
+
this.backoffMultiplier =
|
|
219
|
+
config?.backoffMultiplier ?? RETRY_DEFAULTS.BACKOFF_MULTIPLIER;
|
|
220
|
+
this.maxDelayMs = config?.maxDelayMs ?? RETRY_DEFAULTS.MAX_DELAY;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
/**
|
|
224
|
+
* Execute an operation with retry logic
|
|
225
|
+
* Returns a result type instead of throwing
|
|
226
|
+
*/
|
|
227
|
+
async withRetry<T>(
|
|
228
|
+
operation: () => Promise<T>,
|
|
229
|
+
logger: EndpointLogger,
|
|
230
|
+
operationName: string,
|
|
231
|
+
): Promise<RetryResult<T>> {
|
|
232
|
+
let lastError: Error | undefined;
|
|
233
|
+
|
|
234
|
+
for (let attempt = 1; attempt <= this.maxAttempts; attempt++) {
|
|
235
|
+
try {
|
|
236
|
+
const data = await operation();
|
|
237
|
+
return { success: true, data };
|
|
238
|
+
} catch (error) {
|
|
239
|
+
lastError = error instanceof Error ? error : new Error(String(error));
|
|
240
|
+
|
|
241
|
+
if (attempt < this.maxAttempts) {
|
|
242
|
+
const delay = this.calculateDelay(attempt);
|
|
243
|
+
logger.warn(MESSAGES.RETRY_ATTEMPT, {
|
|
244
|
+
operation: operationName,
|
|
245
|
+
attempt,
|
|
246
|
+
maxAttempts: this.maxAttempts,
|
|
247
|
+
nextRetryIn: formatDuration(delay),
|
|
248
|
+
error: lastError.message,
|
|
249
|
+
});
|
|
250
|
+
await sleep(delay);
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
}
|
|
254
|
+
|
|
255
|
+
logger.error(MESSAGES.RETRY_FAILED, {
|
|
256
|
+
operation: operationName,
|
|
257
|
+
attempts: this.maxAttempts,
|
|
258
|
+
lastError: lastError?.message,
|
|
259
|
+
});
|
|
260
|
+
|
|
261
|
+
return {
|
|
262
|
+
success: false,
|
|
263
|
+
message:
|
|
264
|
+
lastError?.message ??
|
|
265
|
+
`${operationName} failed after ${this.maxAttempts} attempts`,
|
|
266
|
+
};
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
/**
|
|
270
|
+
* Calculate delay for a given attempt using exponential backoff
|
|
271
|
+
*/
|
|
272
|
+
private calculateDelay(attempt: number): number {
|
|
273
|
+
const delay = this.delayMs * Math.pow(this.backoffMultiplier, attempt - 1);
|
|
274
|
+
return Math.min(delay, this.maxDelayMs);
|
|
275
|
+
}
|
|
276
|
+
}
|
|
277
|
+
|
|
278
|
+
// ============================================================================
|
|
279
|
+
// Time and Duration Helpers
|
|
280
|
+
// ============================================================================
|
|
281
|
+
|
|
282
|
+
/**
|
|
283
|
+
* Sleep for a specified duration
|
|
284
|
+
*/
|
|
285
|
+
export function sleep(ms: number): Promise<void> {
|
|
286
|
+
return new Promise((resolve) => {
|
|
287
|
+
setTimeout(resolve, ms);
|
|
288
|
+
});
|
|
289
|
+
}
|
|
290
|
+
|
|
291
|
+
/**
|
|
292
|
+
* Format a duration in milliseconds to a human-readable string
|
|
293
|
+
*/
|
|
294
|
+
export function formatDuration(ms: number): string {
|
|
295
|
+
if (ms < 1000) {
|
|
296
|
+
return `${ms}ms`;
|
|
297
|
+
}
|
|
298
|
+
|
|
299
|
+
const seconds = Math.floor(ms / 1000);
|
|
300
|
+
const remainingMs = ms % 1000;
|
|
301
|
+
|
|
302
|
+
if (seconds < 60) {
|
|
303
|
+
return remainingMs > 0
|
|
304
|
+
? `${seconds}.${Math.floor(remainingMs / 100)}s`
|
|
305
|
+
: `${seconds}s`;
|
|
306
|
+
}
|
|
307
|
+
|
|
308
|
+
const minutes = Math.floor(seconds / 60);
|
|
309
|
+
const remainingSeconds = seconds % 60;
|
|
310
|
+
|
|
311
|
+
if (minutes < 60) {
|
|
312
|
+
return remainingSeconds > 0
|
|
313
|
+
? `${minutes}m ${remainingSeconds}s`
|
|
314
|
+
: `${minutes}m`;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
const hours = Math.floor(minutes / 60);
|
|
318
|
+
const remainingMinutes = minutes % 60;
|
|
319
|
+
return `${hours}h ${remainingMinutes}m`;
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
/**
|
|
323
|
+
* Create a stopwatch for measuring operation duration
|
|
324
|
+
*/
|
|
325
|
+
export function createStopwatch(): {
|
|
326
|
+
stop: () => number;
|
|
327
|
+
elapsed: () => number;
|
|
328
|
+
} {
|
|
329
|
+
const start = Date.now();
|
|
330
|
+
return {
|
|
331
|
+
stop: () => Date.now() - start,
|
|
332
|
+
elapsed: () => Date.now() - start,
|
|
333
|
+
};
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
// ============================================================================
|
|
337
|
+
// String Helpers
|
|
338
|
+
// ============================================================================
|
|
339
|
+
|
|
340
|
+
/**
|
|
341
|
+
* Escape shell special characters in a string
|
|
342
|
+
*/
|
|
343
|
+
export function sanitizeForShell(value: string): string {
|
|
344
|
+
return value.replaceAll(/[`$\\!"']/g, "\\$&");
|
|
345
|
+
}
|
|
346
|
+
|
|
347
|
+
/**
|
|
348
|
+
* Escape double quotes in a string for shell commands
|
|
349
|
+
*/
|
|
350
|
+
export function escapeDoubleQuotes(value: string): string {
|
|
351
|
+
return value.replaceAll('"', '\\"');
|
|
352
|
+
}
|
|
353
|
+
|
|
354
|
+
/**
|
|
355
|
+
* Truncate a string to a maximum length with ellipsis
|
|
356
|
+
*/
|
|
357
|
+
export function truncate(str: string, maxLength: number): string {
|
|
358
|
+
if (str.length <= maxLength) {
|
|
359
|
+
return str;
|
|
360
|
+
}
|
|
361
|
+
return `${str.slice(0, maxLength - 3)}...`;
|
|
362
|
+
}
|
|
363
|
+
|
|
364
|
+
/**
|
|
365
|
+
* Convert a string to kebab-case
|
|
366
|
+
*/
|
|
367
|
+
export function toKebabCase(str: string): string {
|
|
368
|
+
return str
|
|
369
|
+
.replaceAll(/([a-z])([A-Z])/g, "$1-$2")
|
|
370
|
+
.replaceAll(/[\s_]+/g, "-")
|
|
371
|
+
.toLowerCase();
|
|
372
|
+
}
|
|
373
|
+
|
|
374
|
+
/**
|
|
375
|
+
* Pluralize a word based on count
|
|
376
|
+
*/
|
|
377
|
+
export function pluralize(
|
|
378
|
+
count: number,
|
|
379
|
+
singular: string,
|
|
380
|
+
plural?: string,
|
|
381
|
+
): string {
|
|
382
|
+
return count === 1 ? singular : (plural ?? `${singular}s`);
|
|
383
|
+
}
|
|
384
|
+
|
|
385
|
+
// ============================================================================
|
|
386
|
+
// Version Helpers
|
|
387
|
+
// ============================================================================
|
|
388
|
+
|
|
389
|
+
/**
|
|
390
|
+
* Parse a semantic version string into components
|
|
391
|
+
*/
|
|
392
|
+
export function parseVersion(version: string): ParsedVersion {
|
|
393
|
+
const regex =
|
|
394
|
+
/^(\d+)\.(\d+)\.(\d+)(?:-([a-zA-Z0-9.-]+))?(?:\+([a-zA-Z0-9.-]+))?$/;
|
|
395
|
+
const match = version.match(regex);
|
|
396
|
+
|
|
397
|
+
if (!match) {
|
|
398
|
+
return {
|
|
399
|
+
major: 0,
|
|
400
|
+
minor: 0,
|
|
401
|
+
patch: 0,
|
|
402
|
+
prerelease: null,
|
|
403
|
+
prereleaseNumber: null,
|
|
404
|
+
buildMetadata: null,
|
|
405
|
+
};
|
|
406
|
+
}
|
|
407
|
+
|
|
408
|
+
const prerelease = match[4] ?? null;
|
|
409
|
+
let prereleaseNumber: number | null = null;
|
|
410
|
+
|
|
411
|
+
if (prerelease) {
|
|
412
|
+
const preMatch = prerelease.match(/\.(\d+)$/);
|
|
413
|
+
if (preMatch) {
|
|
414
|
+
prereleaseNumber = parseInt(preMatch[1] ?? "0", 10);
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
return {
|
|
419
|
+
major: parseInt(match[1] ?? "0", 10),
|
|
420
|
+
minor: parseInt(match[2] ?? "0", 10),
|
|
421
|
+
patch: parseInt(match[3] ?? "0", 10),
|
|
422
|
+
prerelease,
|
|
423
|
+
prereleaseNumber,
|
|
424
|
+
buildMetadata: match[5] ?? null,
|
|
425
|
+
};
|
|
426
|
+
}
|
|
427
|
+
|
|
428
|
+
/**
|
|
429
|
+
* Compare two semantic version strings
|
|
430
|
+
* Returns: -1 if a < b, 0 if a == b, 1 if a > b
|
|
431
|
+
*/
|
|
432
|
+
export function compareVersions(a: string, b: string): -1 | 0 | 1 {
|
|
433
|
+
const va = parseVersion(a);
|
|
434
|
+
const vb = parseVersion(b);
|
|
435
|
+
|
|
436
|
+
// Compare major.minor.patch
|
|
437
|
+
if (va.major !== vb.major) {
|
|
438
|
+
return va.major > vb.major ? 1 : -1;
|
|
439
|
+
}
|
|
440
|
+
if (va.minor !== vb.minor) {
|
|
441
|
+
return va.minor > vb.minor ? 1 : -1;
|
|
442
|
+
}
|
|
443
|
+
if (va.patch !== vb.patch) {
|
|
444
|
+
return va.patch > vb.patch ? 1 : -1;
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
// Handle prerelease comparison
|
|
448
|
+
if (va.prerelease === null && vb.prerelease === null) {
|
|
449
|
+
return 0;
|
|
450
|
+
}
|
|
451
|
+
if (va.prerelease === null) {
|
|
452
|
+
return 1; // Release > prerelease
|
|
453
|
+
}
|
|
454
|
+
if (vb.prerelease === null) {
|
|
455
|
+
return -1;
|
|
456
|
+
}
|
|
457
|
+
|
|
458
|
+
// Compare prerelease identifiers
|
|
459
|
+
const comparison = va.prerelease.localeCompare(vb.prerelease);
|
|
460
|
+
return comparison === 0 ? 0 : comparison > 0 ? 1 : -1;
|
|
461
|
+
}
|
|
462
|
+
|
|
463
|
+
// ============================================================================
|
|
464
|
+
// Array Helpers
|
|
465
|
+
// ============================================================================
|
|
466
|
+
|
|
467
|
+
/**
|
|
468
|
+
* Chunk an array into smaller arrays of specified size
|
|
469
|
+
*/
|
|
470
|
+
export function chunk<T>(array: T[], size: number): T[][] {
|
|
471
|
+
const chunks: T[][] = [];
|
|
472
|
+
for (let i = 0; i < array.length; i += size) {
|
|
473
|
+
chunks.push(array.slice(i, i + size));
|
|
474
|
+
}
|
|
475
|
+
return chunks;
|
|
476
|
+
}
|
|
477
|
+
|
|
478
|
+
/**
|
|
479
|
+
* Remove duplicate items from an array
|
|
480
|
+
*/
|
|
481
|
+
export function unique<T>(array: T[]): T[] {
|
|
482
|
+
return [...new Set(array)];
|
|
483
|
+
}
|
|
484
|
+
|
|
485
|
+
/**
|
|
486
|
+
* Execute async operations with a concurrency limit
|
|
487
|
+
* Uses Promise.allSettled for cleaner implementation without type casts
|
|
488
|
+
*/
|
|
489
|
+
export async function asyncPool<T, R>(
|
|
490
|
+
items: T[],
|
|
491
|
+
concurrency: number,
|
|
492
|
+
fn: (item: T) => Promise<R>,
|
|
493
|
+
): Promise<R[]> {
|
|
494
|
+
const results: R[] = [];
|
|
495
|
+
|
|
496
|
+
// Process items in batches of concurrency size
|
|
497
|
+
for (let i = 0; i < items.length; i += concurrency) {
|
|
498
|
+
const batch = items.slice(i, i + concurrency);
|
|
499
|
+
const batchResults = await Promise.allSettled(batch.map(fn));
|
|
500
|
+
|
|
501
|
+
for (const result of batchResults) {
|
|
502
|
+
if (result.status === "fulfilled") {
|
|
503
|
+
results.push(result.value);
|
|
504
|
+
}
|
|
505
|
+
}
|
|
506
|
+
}
|
|
507
|
+
|
|
508
|
+
return results;
|
|
509
|
+
}
|
|
510
|
+
|
|
511
|
+
// ============================================================================
|
|
512
|
+
// Object Helpers
|
|
513
|
+
// ============================================================================
|
|
514
|
+
|
|
515
|
+
/**
|
|
516
|
+
* Deep clone an object
|
|
517
|
+
*/
|
|
518
|
+
export function deepClone<T>(obj: T): T {
|
|
519
|
+
return JSON.parse(JSON.stringify(obj));
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
/**
|
|
523
|
+
* Pick specific keys from an object
|
|
524
|
+
*/
|
|
525
|
+
export function pick<T extends Record<string, JsonValue>, K extends keyof T>(
|
|
526
|
+
obj: T,
|
|
527
|
+
keys: K[],
|
|
528
|
+
): Pick<T, K> {
|
|
529
|
+
const result = {} as Pick<T, K>;
|
|
530
|
+
for (const key of keys) {
|
|
531
|
+
if (key in obj) {
|
|
532
|
+
result[key] = obj[key];
|
|
533
|
+
}
|
|
534
|
+
}
|
|
535
|
+
return result;
|
|
536
|
+
}
|
|
537
|
+
|
|
538
|
+
/**
|
|
539
|
+
* Omit specific keys from an object
|
|
540
|
+
*/
|
|
541
|
+
export function omit<T extends Record<string, JsonValue>, K extends keyof T>(
|
|
542
|
+
obj: T,
|
|
543
|
+
keys: K[],
|
|
544
|
+
): Omit<T, K> {
|
|
545
|
+
const result = { ...obj };
|
|
546
|
+
for (const key of keys) {
|
|
547
|
+
delete result[key];
|
|
548
|
+
}
|
|
549
|
+
return result as Omit<T, K>;
|
|
550
|
+
}
|
|
551
|
+
|
|
552
|
+
// ============================================================================
|
|
553
|
+
// Environment Helpers
|
|
554
|
+
// ============================================================================
|
|
555
|
+
|
|
556
|
+
/**
|
|
557
|
+
* Result type for environment variable retrieval
|
|
558
|
+
*/
|
|
559
|
+
export type EnvResult =
|
|
560
|
+
| { success: true; value: string }
|
|
561
|
+
| { success: false; message: string };
|
|
562
|
+
|
|
563
|
+
/**
|
|
564
|
+
* Get an environment variable with a default value
|
|
565
|
+
*/
|
|
566
|
+
export function getEnv(key: string, defaultValue?: string): string | undefined {
|
|
567
|
+
return process.env[key] ?? defaultValue;
|
|
568
|
+
}
|
|
569
|
+
|
|
570
|
+
/**
|
|
571
|
+
* Get a required environment variable
|
|
572
|
+
* Returns a result type instead of throwing
|
|
573
|
+
*/
|
|
574
|
+
export function requireEnv(key: string): EnvResult {
|
|
575
|
+
const value = process.env[key];
|
|
576
|
+
if (value === undefined || value === "") {
|
|
577
|
+
return {
|
|
578
|
+
success: false,
|
|
579
|
+
message: `Required environment variable ${key} is not set`,
|
|
580
|
+
};
|
|
581
|
+
}
|
|
582
|
+
return { success: true, value };
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
/**
|
|
586
|
+
* Check if running in production
|
|
587
|
+
*/
|
|
588
|
+
export function isProduction(): boolean {
|
|
589
|
+
return process.env.NODE_ENV === "production";
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
/**
|
|
593
|
+
* Check if running in development
|
|
594
|
+
*/
|
|
595
|
+
export function isDevelopment(): boolean {
|
|
596
|
+
return process.env.NODE_ENV === "development" || !process.env.NODE_ENV;
|
|
597
|
+
}
|
|
598
|
+
|
|
599
|
+
// ============================================================================
|
|
600
|
+
// Path Helpers
|
|
601
|
+
// ============================================================================
|
|
602
|
+
|
|
603
|
+
/**
|
|
604
|
+
* Normalize path separators to forward slashes
|
|
605
|
+
*/
|
|
606
|
+
export function normalizePath(path: string): string {
|
|
607
|
+
return path.replaceAll("\\", "/");
|
|
608
|
+
}
|
|
609
|
+
|
|
610
|
+
/**
|
|
611
|
+
* Get file extension from path (without dot)
|
|
612
|
+
*/
|
|
613
|
+
export function getExtension(path: string): string {
|
|
614
|
+
const lastDot = path.lastIndexOf(".");
|
|
615
|
+
if (lastDot === -1 || lastDot === 0) {
|
|
616
|
+
return "";
|
|
617
|
+
}
|
|
618
|
+
return path.slice(lastDot + 1).toLowerCase();
|
|
619
|
+
}
|
|
620
|
+
|
|
621
|
+
// ============================================================================
|
|
622
|
+
// Date Helpers
|
|
623
|
+
// ============================================================================
|
|
624
|
+
|
|
625
|
+
/**
|
|
626
|
+
* Get current date in ISO format (YYYY-MM-DD)
|
|
627
|
+
*/
|
|
628
|
+
export function getISODate(): string {
|
|
629
|
+
return new Date().toISOString().split("T")[0] ?? "";
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
/**
|
|
633
|
+
* Get current timestamp suitable for filenames
|
|
634
|
+
*/
|
|
635
|
+
export function getFileTimestamp(): string {
|
|
636
|
+
return new Date()
|
|
637
|
+
.toISOString()
|
|
638
|
+
.replaceAll(/[:.T]/g, "-")
|
|
639
|
+
.split("-")
|
|
640
|
+
.slice(0, 6)
|
|
641
|
+
.join("-");
|
|
642
|
+
}
|