@mocoto/mahoraga 0.14.1 → 0.14.3
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/README.md +0 -34
- package/dist/analysts/architects/analyst-structure.js +20 -20
- package/dist/analysts/architects/archetypes-custom.js +16 -19
- package/dist/analysts/architects/detector-archetypes.js +43 -36
- package/dist/analysts/architects/orchestrator-archetypes.js +3 -3
- package/dist/analysts/architects/signals-project-advanced.js +26 -28
- package/dist/analysts/architects/signals-project.js +2 -2
- package/dist/analysts/architects/strategist-structure.js +47 -66
- package/dist/analysts/azure-pipelines/analysts/analyst-azure.js +41 -35
- package/dist/analysts/azure-pipelines/corrections/correction-azure.js +22 -19
- package/dist/analysts/azure-pipelines/detectors/detector-azure-performance.js +21 -18
- package/dist/analysts/azure-pipelines/detectors/detector-azure-security.js +25 -20
- package/dist/analysts/azure-pipelines/detectors/detector-azure-structure.js +39 -40
- package/dist/analysts/azure-pipelines/scorers/scorer-azure.js +10 -7
- package/dist/analysts/circleci/analysts/analyst-circleci.js +33 -27
- package/dist/analysts/circleci/corrections/correction-circleci.js +22 -20
- package/dist/analysts/circleci/detectors/detector-circleci-performance.js +23 -19
- package/dist/analysts/circleci/detectors/detector-circleci-security.js +78 -82
- package/dist/analysts/circleci/detectors/detector-circleci-structure.js +22 -22
- package/dist/analysts/converters/convert-registry.js +1 -1
- package/dist/analysts/converters/engines/converter-gha-to-gitlab.js +17 -15
- package/dist/analysts/converters/index.js +1 -1
- package/dist/analysts/corrections/analyst-quick-fixes.js +25 -28
- package/dist/analysts/corrections/analyst-scoring.js +24 -21
- package/dist/analysts/corrections/auto-fix-engine.js +1 -1
- package/dist/analysts/corrections/corrector-structure.js +43 -42
- package/dist/analysts/corrections/fix-alias-imports.js +10 -6
- package/dist/analysts/corrections/fix-md-fences.js +23 -23
- package/dist/analysts/corrections/map-reversion.js +56 -53
- package/dist/analysts/corrections/pruning.js +19 -16
- package/dist/analysts/corrections/quick-fixes/fix-any-to-proper-type.js +57 -61
- package/dist/analysts/corrections/quick-fixes/fix-unknown-to-specific-type.js +30 -30
- package/dist/analysts/corrections/reorganize-barrels.js +13 -13
- package/dist/analysts/corrections/rewrite-testes-aliases.js +23 -22
- package/dist/analysts/corrections/scoring-shared.js +19 -18
- package/dist/analysts/corrections/type-safety/context-analyzer.js +15 -10
- package/dist/analysts/corrections/type-safety/type-analyzer.js +3 -3
- package/dist/analysts/corrections/type-safety/type-validator.js +4 -3
- package/dist/analysts/corrections/type-safety/usage-analyzer.js +39 -42
- package/dist/analysts/css/analysts/analyst-css.js +42 -42
- package/dist/analysts/css/corrections/correction-css.js +19 -11
- package/dist/analysts/css/detectors/detector-css-best-practices.js +129 -118
- package/dist/analysts/css/scorers/scorer-css.js +23 -18
- package/dist/analysts/css-in-js/analysts/analyst-css-in-js.js +24 -17
- package/dist/analysts/css-in-js/corrections/correction-css-in-js.js +31 -16
- package/dist/analysts/css-in-js/detectors/detector-css-in-js-best-practices.js +28 -30
- package/dist/analysts/css-in-js/scorers/scorer-css-in-js.js +79 -54
- package/dist/analysts/css-in-js/shared.js +7 -0
- package/dist/analysts/detectors/detector-architecture.js +91 -85
- package/dist/analysts/detectors/detector-bugs-ml.js +29 -27
- package/dist/analysts/detectors/detector-code-fragile.js +41 -36
- package/dist/analysts/detectors/detector-dependencies.js +5 -5
- package/dist/analysts/detectors/detector-duplications.js +26 -26
- package/dist/analysts/detectors/detector-monorepo.js +51 -45
- package/dist/analysts/detectors/detector-performance.js +24 -17
- package/dist/analysts/detectors/detector-recommendation-architecture.js +40 -36
- package/dist/analysts/detectors/detector-security.js +43 -42
- package/dist/analysts/detectors/detector-structure.js +31 -28
- package/dist/analysts/github-actions/analysts/analyst-github-actions.js +5 -8
- package/dist/analysts/github-actions/detectors/detector-workflow-accessibility.js +1 -9
- package/dist/analysts/github-actions/detectors/detector-workflow-structure.js +1 -4
- package/dist/analysts/github-actions/detectors/detector-workflow-trigger-unsafe.js +6 -5
- package/dist/analysts/gitlab-ci/analysts/analyst-gitlab-ci.js +2 -2
- package/dist/analysts/gitlab-ci/detectors/detector-gitlab-ci-structure.js +0 -3
- package/dist/analysts/go/analysts/analyst-best-practices.js +2 -2
- package/dist/analysts/go/analysts/analyst-concurrency.js +1 -1
- package/dist/analysts/go/analysts/analyst-security.js +1 -1
- package/dist/analysts/go/detectors/detector-conventions.js +1 -1
- package/dist/analysts/html/analysts/analyst-html.js +10 -12
- package/dist/analysts/html/detectors/detector-html.js +3 -3
- package/dist/analysts/js-ts/analysts/analyst-commands-cli.js +22 -22
- package/dist/analysts/js-ts/analysts/analyst-functions-long.js +5 -5
- package/dist/analysts/js-ts/analysts/analyst-patterns-usage.js +6 -2
- package/dist/analysts/js-ts/detectors/detector-anti-patterns-async.js +84 -9
- package/dist/analysts/js-ts/detectors/detector-constructions-syntactic.js +33 -10
- package/dist/analysts/js-ts/detectors/detector-context-smart.js +6 -6
- package/dist/analysts/js-ts/detectors/detector-leaks-memory.js +1 -1
- package/dist/analysts/js-ts/detectors/detector-types-unsafe.js +33 -2
- package/dist/analysts/php/analysts/analyst-php.js +3 -3
- package/dist/analysts/php/detectors/detector-php-best-practices.js +5 -5
- package/dist/analysts/php/detectors/detector-php-security.js +5 -5
- package/dist/analysts/php/scorers/scorer-php.js +2 -2
- package/dist/analysts/plugins/detector-documentation.js +6 -6
- package/dist/analysts/plugins/detector-markdown.js +7 -7
- package/dist/analysts/python/analysts/analyst-python.js +2 -5
- package/dist/analysts/react/analysts/analyst-react-hooks.js +66 -9
- package/dist/analysts/react/analysts/analyst-react.js +46 -2
- package/dist/analysts/react/corrections/correction-react.js +41 -1
- package/dist/analysts/react/detectors/detector-react-best-practices.js +5 -5
- package/dist/analysts/react/scorers/scorer-react.js +36 -1
- package/dist/analysts/registry/autodiscovery.js +2 -2
- package/dist/analysts/rust/analysts/analyst-best-practices.js +42 -3
- package/dist/analysts/rust/analysts/analyst-memory.js +2 -2
- package/dist/analysts/rust/analysts/analyst-rust.js +52 -5
- package/dist/analysts/rust/analysts/analyst-security.js +29 -1
- package/dist/analysts/scorers/scorer.js +5 -5
- package/dist/analysts/shell/analysts/analyst-shell.js +81 -5
- package/dist/analysts/shell/corrections/correction-shell.js +34 -1
- package/dist/analysts/shell/detectors/detector-shell-security.js +88 -0
- package/dist/analysts/shell/scorers/scorer-shell.js +58 -1
- package/dist/analysts/strategists/operator-structure.js +5 -7
- package/dist/analysts/strategists/suggestions-contextuais.js +5 -2
- package/dist/analysts/svg/analysts/analyst-svg.js +1 -0
- package/dist/analysts/tailwind/analysts/analyst-tailwind.js +79 -55
- package/dist/analysts/tailwind/corrections/correction-tailwind.js +108 -9
- package/dist/analysts/tailwind/detectors/detector-tailwind-best-practices.js +122 -7
- package/dist/analysts/tailwind/scorers/scorer-tailwind.js +62 -11
- package/dist/analysts/xml/analysts/analyst-xml.js +2 -2
- package/dist/app/index.js +1 -0
- package/dist/bin/cli-bootstrap.js +6 -4
- package/dist/bin/index.js +6 -4
- package/dist/caretakers/scoring.js +1 -0
- package/dist/cli/commands/command-analysts.js +4 -3
- package/dist/cli/commands/command-azure.js +1 -1
- package/dist/cli/commands/command-circleci.js +1 -1
- package/dist/cli/commands/command-compliance.js +1 -1
- package/dist/cli/commands/command-diagnose.js +10 -13
- package/dist/cli/commands/command-fix-types.js +9 -32
- package/dist/cli/commands/command-formatters.js +2 -2
- package/dist/cli/commands/command-github-actions.js +1 -1
- package/dist/cli/commands/command-gitlab-ci.js +1 -1
- package/dist/cli/commands/command-guardian.js +1 -1
- package/dist/cli/commands/command-imports.js +6 -6
- package/dist/cli/commands/command-jenkins.js +1 -1
- package/dist/cli/commands/command-licenses.js +1 -1
- package/dist/cli/commands/command-marketplace.js +7 -7
- package/dist/cli/commands/command-names.js +3 -8
- package/dist/cli/commands/command-perf.js +7 -9
- package/dist/cli/commands/command-plugins.js +4 -4
- package/dist/cli/diagnostic/auto-fix.js +2 -2
- package/dist/cli/diagnostic/exporters/json-exporter.js +1 -1
- package/dist/cli/diagnostic/exporters/sharded-exporter.js +0 -3
- package/dist/cli/diagnostic/exporters/svg-optimization-exporter.js +1 -1
- package/dist/cli/diagnostic/filters.js +9 -9
- package/dist/cli/diagnostic/handlers/archetype-handler.js +3 -6
- package/dist/cli/diagnostic/handlers/auto-fix-handler.js +4 -4
- package/dist/cli/diagnostic/handlers/guardian-handler.js +1 -1
- package/dist/cli/diagnostic/processing-diagnostic.js +31 -35
- package/dist/cli/diagnostic/processing-helpers.js +2 -2
- package/dist/cli/handlers/fix-types-exporter.js +1 -4
- package/dist/cli/helpers/display-frame.js +5 -5
- package/dist/core/config/auto/auto-fix-config.js +0 -6
- package/dist/core/config/chalk-safe.js +6 -6
- package/dist/core/config/config.js +11 -13
- package/dist/core/config/conventions.js +1 -1
- package/dist/core/config/security.js +2 -2
- package/dist/core/execution/analysis-cache.js +5 -8
- package/dist/core/execution/ast-cache.js +1 -3
- package/dist/core/execution/executor.js +8 -21
- package/dist/core/execution/inquisitor.js +24 -21
- package/dist/core/execution/results.js +1 -0
- package/dist/core/execution/scanner.js +4 -4
- package/dist/core/messages/en/analysts/analyst-github-actions-messages.js +1 -1
- package/dist/core/messages/en/analysts/analyst-patterns-usage-messages.js +1 -0
- package/dist/core/messages/en/analysts/analyst-shell-messages.js +15 -0
- package/dist/core/messages/en/analysts/detector-constructions-syntactic-messages.js +6 -0
- package/dist/core/messages/en/analysts/detector-js-ts-messages.js +27 -0
- package/dist/core/messages/en/analysts/detector-react-messages.js +8 -0
- package/dist/core/messages/en/analysts/detector-shell-messages.js +17 -0
- package/dist/core/messages/en/analysts/detector-tailwind-messages.js +3 -3
- package/dist/core/messages/en/analysts/report-circleci-messages.js +7 -7
- package/dist/core/messages/en/caretakers/caretaker-messages.js +1 -7
- package/dist/core/messages/en/core/plugin-messages.js +31 -3
- package/dist/core/messages/en/log/log.js +4 -4
- package/dist/core/messages/en/ui/filter-config.js +1 -5
- package/dist/core/messages/i18n-system.js +3 -3
- package/dist/core/messages/index.js +3 -3
- package/dist/core/messages/ja/analysts/analyst-github-actions-messages.js +1 -1
- package/dist/core/messages/ja/analysts/analyst-patterns-usage-messages.js +1 -0
- package/dist/core/messages/ja/analysts/analyst-shell-messages.js +15 -0
- package/dist/core/messages/ja/analysts/detector-constructions-syntactic-messages.js +6 -0
- package/dist/core/messages/ja/analysts/detector-js-ts-messages.js +27 -0
- package/dist/core/messages/ja/analysts/detector-react-messages.js +8 -0
- package/dist/core/messages/ja/analysts/detector-shell-messages.js +17 -0
- package/dist/core/messages/ja/analysts/detector-tailwind-messages.js +3 -3
- package/dist/core/messages/ja/analysts/report-circleci-messages.js +7 -7
- package/dist/core/messages/ja/caretakers/caretaker-messages.js +1 -7
- package/dist/core/messages/ja/core/plugin-messages.js +31 -3
- package/dist/core/messages/ja/log/log.js +4 -4
- package/dist/core/messages/ja/ui/filter-config.js +1 -1
- package/dist/core/messages/pt/analysts/analyst-github-actions-messages.js +1 -1
- package/dist/core/messages/pt/analysts/analyst-patterns-usage-messages.js +1 -0
- package/dist/core/messages/pt/analysts/analyst-shell-messages.js +15 -0
- package/dist/core/messages/pt/analysts/detector-constructions-syntactic-messages.js +6 -0
- package/dist/core/messages/pt/analysts/detector-js-ts-messages.js +27 -0
- package/dist/core/messages/pt/analysts/detector-react-messages.js +8 -0
- package/dist/core/messages/pt/analysts/detector-shell-messages.js +17 -0
- package/dist/core/messages/pt/analysts/detector-tailwind-messages.js +3 -3
- package/dist/core/messages/pt/analysts/report-circleci-messages.js +7 -7
- package/dist/core/messages/pt/caretakers/caretaker-messages.js +1 -7
- package/dist/core/messages/pt/core/plugin-messages.js +31 -3
- package/dist/core/messages/pt/log/log-engine.js +6 -6
- package/dist/core/messages/pt/log/log.js +3 -3
- package/dist/core/messages/pt/ui/filter-config.js +1 -1
- package/dist/core/messages/shared/icons.js +3 -3
- package/dist/core/messages/zh/analysts/analyst-github-actions-messages.js +1 -1
- package/dist/core/messages/zh/analysts/analyst-patterns-usage-messages.js +1 -0
- package/dist/core/messages/zh/analysts/analyst-shell-messages.js +15 -0
- package/dist/core/messages/zh/analysts/detector-constructions-syntactic-messages.js +6 -0
- package/dist/core/messages/zh/analysts/detector-js-ts-messages.js +27 -0
- package/dist/core/messages/zh/analysts/detector-react-messages.js +8 -0
- package/dist/core/messages/zh/analysts/detector-shell-messages.js +17 -0
- package/dist/core/messages/zh/analysts/detector-tailwind-messages.js +3 -3
- package/dist/core/messages/zh/analysts/report-circleci-messages.js +7 -7
- package/dist/core/messages/zh/caretakers/caretaker-messages.js +1 -7
- package/dist/core/messages/zh/core/plugin-messages.js +31 -3
- package/dist/core/messages/zh/log/log.js +3 -3
- package/dist/core/messages/zh/ui/filter-config.js +1 -5
- package/dist/core/parsing/filters.js +3 -3
- package/dist/core/parsing/langs/json.js +1 -1
- package/dist/core/parsing/langs/python.js +1 -1
- package/dist/core/parsing/langs/typescript.js +1 -1
- package/dist/core/parsing/parser.js +3 -4
- package/dist/core/parsing/utils.js +1 -0
- package/dist/core/registry/file-registry.js +3 -2
- package/dist/core/registry/paths.js +3 -3
- package/dist/core/reporting/default-reporter.js +2 -2
- package/dist/core/schema/version.js +6 -6
- package/dist/core/workers/worker-executor.js +3 -3
- package/dist/core/workers/worker-pool.js +0 -0
- package/dist/guardian/baseline.js +1 -1
- package/dist/guardian/gpg.js +3 -1
- package/dist/guardian/integrity.js +2 -7
- package/dist/guardian/records.js +7 -1
- package/dist/guardian/result.js +1 -1
- package/dist/guardian/sentinel.js +7 -1
- package/dist/guardian/watcher-hidden.js +6 -1
- package/dist/licenses/fs-utils.js +5 -1
- package/dist/licenses/generate-notices.js +1 -1
- package/dist/licenses/index.js +1 -0
- package/dist/licenses/normalizer.js +10 -9
- package/dist/node.loader.js +224 -4
- package/dist/reports/analise-async-patterns.js +1 -1
- package/dist/reports/filter-smart.js +2 -5
- package/dist/reports/generator-report.js +7 -7
- package/dist/reports/report-archetypes.js +10 -10
- package/dist/reports/report-caretaker-health.js +2 -1
- package/dist/reports/report-patterns-usage.js +1 -1
- package/dist/sdk/analyzer.js +1 -1
- package/dist/shared/data-processing/fragment-report.js +11 -11
- package/dist/shared/data-processing/json.js +1 -1
- package/dist/shared/data-processing/occurrences.js +3 -2
- package/dist/shared/formatters/code-min-formatter.js +1 -1
- package/dist/shared/formatters/engines/prettier.js +1 -1
- package/dist/shared/formatters/engines/stylelint.js +43 -40
- package/dist/shared/formatters/formatter.js +8 -8
- package/dist/shared/formatters/formatters/code.js +3 -3
- package/dist/shared/formatters/formatters/css.js +2 -10
- package/dist/shared/formatters/formatters/dotfiles.js +1 -1
- package/dist/shared/formatters/formatters/html.js +1 -5
- package/dist/shared/formatters/formatters/json.js +0 -3
- package/dist/shared/formatters/formatters/markdown.js +19 -24
- package/dist/shared/formatters/formatters/properties.js +2 -2
- package/dist/shared/formatters/formatters/shell.js +1 -4
- package/dist/shared/formatters/formatters/sql.js +0 -3
- package/dist/shared/formatters/formatters/xml.js +5 -7
- package/dist/shared/formatters/formatters/yaml.js +2 -7
- package/dist/shared/formatters/index.js +1 -1
- package/dist/shared/helpers/framework-detector.js +6 -2
- package/dist/shared/helpers/json.js +1 -1
- package/dist/shared/helpers/magic-constants-whitelist.js +1 -1
- package/dist/shared/helpers/masking.js +17 -17
- package/dist/shared/helpers/reader-report.js +0 -12
- package/dist/shared/helpers/structural-hash.js +3 -2
- package/dist/shared/helpers/structure.js +1 -1
- package/dist/shared/marketplace/registry.js +1 -1
- package/dist/shared/marketplace/remote.js +4 -4
- package/dist/shared/persistence/persistence.js +13 -6
- package/dist/shared/plugins/core-plugin.js +5 -1
- package/dist/shared/plugins/registry.js +3 -2
- package/dist/types/analysts/tailwind-correction.js +2 -0
- package/dist/types/caretakers/imports-barrel.js +1 -0
- package/dist/types/caretakers/index.js +4 -0
- package/dist/types/caretakers/map-reversion.js +1 -0
- package/dist/types/caretakers/pruning.js +1 -0
- package/dist/types/caretakers/scoring.js +1 -0
- package/dist/types/common/analysts.js +1 -1
- package/dist/types/core/config/filters.js +1 -0
- package/dist/types/core/config/index.js +2 -0
- package/dist/types/core/execution/ambiente.js +1 -0
- package/dist/types/core/execution/linguagens.js +1 -0
- package/dist/types/core/execution/parse-errors.js +1 -0
- package/dist/types/core/execution/results.js +1 -0
- package/dist/types/core/execution/structure-json.js +1 -0
- package/dist/types/core/index.js +1 -0
- package/dist/types/core/messages/index.js +1 -0
- package/dist/types/core/messages/log.js +1 -0
- package/dist/types/core/parsing/babel-narrow.js +1 -0
- package/dist/types/core/parsing/index.js +1 -0
- package/dist/types/core/runtime.js +1 -0
- package/dist/types/guardian/index.js +2 -0
- package/dist/types/guardian/integrity.js +7 -0
- package/dist/types/guardian/snapshot.js +1 -0
- package/dist/types/index.js +4 -4
- package/dist/types/licenses/index.js +2 -0
- package/dist/types/processing/display.js +16 -13
- package/dist/types/processing/filters.js +8 -11
- package/dist/types/reports/compliance.js +1 -0
- package/dist/types/reports/streaming.js +1 -0
- package/dist/types/scripts/index.js +1 -0
- package/dist/types/scripts/migrar-aliases.js +1 -0
- package/dist/types/sdk/index.js +1 -0
- package/dist/types/shared/index.js +2 -0
- package/dist/types/vulnerabilities/index.js +2 -0
- package/dist/vulnerabilities/scanner.js +3 -2
- package/package.json +14 -20
|
@@ -60,4 +60,19 @@ export const AnalistaShellMensagens = {
|
|
|
60
60
|
loopOverCommandOutputSugestao: 'グロブを使用: "for f in *"。',
|
|
61
61
|
pipeOverTempfile: 'パイプラインが一時ファイルを置き換えられる可能性があります。',
|
|
62
62
|
pipeOverTempfileSugestao: '一時ファイルの代わりにパイプを使用してください。',
|
|
63
|
+
// Modern Bash (2026)
|
|
64
|
+
missingSetU: '"set -u" がありません — 未設定の変数は静かに空に展開されます。',
|
|
65
|
+
missingSetUSugestao: '変数名のタイポをキャッチするために "set -u" を追加してください。',
|
|
66
|
+
missingIso: 'IFS=$\'\\n\\t\' がありません — ワードスプリッティングが予期しない動作を引き起こす可能性があります。',
|
|
67
|
+
missingIsoSugestao: '安全なワードスプリッティングのためにスクリプト先頭に IFS=$\'\\n\\t\' を追加してください。',
|
|
68
|
+
missingTrap: 'trap ハンドラが見つかりません — シグナル時にクリーンアップがスキップされる可能性があります。',
|
|
69
|
+
missingTrapSugestao: 'trap ハンドラを追加: trap "cleanup" EXIT INT TERM。',
|
|
70
|
+
missingMainFn: 'スクリプトに main 関数パターンがありません。',
|
|
71
|
+
missingMainFnSugestao: 'ロジックを main() でラップし、最後に main "$@" を呼び出してください。',
|
|
72
|
+
missingCommandV: 'command -v の代わりにハードコードされたパス。',
|
|
73
|
+
missingCommandVSugestao: '可用性を確認するには "command -v <ツール>" を使用してください。',
|
|
74
|
+
missingDebugMode: 'スクリプトにデバッグモードがありません — トラブルシューティングが困難です。',
|
|
75
|
+
missingDebugModeSugestao: 'デバッグトレースのために [[ "${DEBUG:-}" == "true" ]] && set -x を追加してください。',
|
|
76
|
+
missingInputValidation: 'コマンド引数が検証されていません — 予期しない入力がエラーの原因になる可能性があります。',
|
|
77
|
+
missingInputValidationSugestao: '先頭で引数を検証: [[ -z "$1" ]] && { echo "使用法: ..."; exit 1; }。',
|
|
63
78
|
};
|
|
@@ -11,4 +11,10 @@ export const DetectorConstrucoesSintaticasMensagens = {
|
|
|
11
11
|
templateLiteralOveruse: "単純な連結に不要なテンプレートリテラル。'+'演算子を使用してください。",
|
|
12
12
|
unnecessaryObjectSpread: "不要なオブジェクトスプレッド。直接代入'obj.prop = val'の方が効率的です。",
|
|
13
13
|
getterSetterWithoutValidation: "セッターにバリデーションのないgetter/setter。無効なデータを防ぐためバリデーションを追加してください。",
|
|
14
|
+
// ES2025/ES2026
|
|
15
|
+
explicitResourceManagement: "'using' を使用した明示的リソース管理が検出されました (ES2026)",
|
|
16
|
+
temporalApiUsage: "Temporal API の使用が検出されました (ES2026) — Date に代わる最新の日付/時刻 API",
|
|
17
|
+
iteratorHelperUsage: "イテレータヘルパーメソッドが検出されました (ES2025) — イテラブルに対する遅延評価",
|
|
18
|
+
setMethodUsage: "新しい Set メソッドが検出されました (ES2025) — 集合演算に使用",
|
|
19
|
+
mapUpsertUsage: "Map の upsert メソッドが検出されました (ES2026) — .getOrInsert() / .getOrInsertComputed()",
|
|
14
20
|
};
|
|
@@ -54,4 +54,31 @@ export const DetectorJsTsMensagens = {
|
|
|
54
54
|
observerWithoutDisconnect: 'disconnect()のないObserver(MutationObserver/IntersectionObserver)。メモリリークの原因になります。',
|
|
55
55
|
webSocketWithoutClose: '対応するclose()呼び出しのないWebSocket。接続が開いたままになる可能性があります。',
|
|
56
56
|
workerWithoutTerminate: 'terminate()呼び出しのないWorker。ワーカーがバックグラウンドで実行され続けます。',
|
|
57
|
+
// ES2025+ features
|
|
58
|
+
satisfiesAvailable: '型はより安全なナローイングのために"satisfies"を"as"の代わりに使用できます',
|
|
59
|
+
satisfiesAvailableSugestao: '"as Type" を "satisfies Type" に置き換えて、ワイドニングせずに検証してください',
|
|
60
|
+
usingResourceManagement: '"using" による明示的リソース管理が検出されました (ES2026)',
|
|
61
|
+
usingResourceManagementSugestao: 'リソースがSymbol.disposeまたはSymbol.asyncDisposeを実装していることを確認してください',
|
|
62
|
+
temporalApi: 'Temporal API の使用が検出されました (ES2026)',
|
|
63
|
+
temporalApiSugestao: 'TemporalはDateを置き換えます — Temporal.Now, Temporal.PlainDate等を使用してください',
|
|
64
|
+
iteratorHelper: 'イテレータヘルパーメソッドが検出されました (ES2025)',
|
|
65
|
+
iteratorHelperSugestao: 'Iteratorヘルパー(.map(), .filter(), .take())は遅延評価を可能にします',
|
|
66
|
+
setMethods: '新しいSetメソッドが検出されました (ES2025)',
|
|
67
|
+
setMethodsSugestao: '集合演算にはSet.prototype.union(), .intersection(), .difference()を使用してください',
|
|
68
|
+
topLevelAwait: 'トップレベルawaitが検出されました',
|
|
69
|
+
topLevelAwaitSugestao: 'トップレベルawaitが不必要にインポートをブロックしないか確認してください',
|
|
70
|
+
promiseWithResolvers: 'Promise.withResolvers() が検出されました (ES2025)',
|
|
71
|
+
promiseWithResolversSugestao: '可能な場合はPromise.withResolvers()よりもasync/awaitを推奨します',
|
|
72
|
+
promiseAllSettled: 'Promise.allSettled() が検出されました — all-settledパターンに適しています',
|
|
73
|
+
promiseAllSettledSugestao: 'すべてのプロミスの結果(拒否に関わらず)が必要な場合はPromise.allSettled()を使用してください',
|
|
74
|
+
forAwaitOf: 'for await...of が検出されました — 非同期反復',
|
|
75
|
+
forAwaitOfSugestao: '非同期反復可能が正しくSymbol.asyncIteratorを実装していることを確認してください',
|
|
76
|
+
regexpEscape: 'RegExp.escape() が検出されました (ES2025)',
|
|
77
|
+
regexpEscapeSugestao: '正規表現パターンでユーザー入力を安全にエスケープするにはRegExp.escape()を使用してください',
|
|
78
|
+
errorIsError: 'Error.isError() が検出されました (ES2026)',
|
|
79
|
+
errorIsErrorSugestao: '信頼性のあるエラー型チェックにはError.isError()を使用してください',
|
|
80
|
+
arrayFromAsync: 'Array.fromAsync() が検出されました (ES2026)',
|
|
81
|
+
arrayFromAsyncSugestao: '非同期反復可能から配列を作成するにはArray.fromAsync()を使用してください',
|
|
82
|
+
mapGetOrInsert: 'Map.getOrInsert() / .getOrInsertComputed() が検出されました (ES2026)',
|
|
83
|
+
mapGetOrInsertSugestao: 'アトミックなMap upsert操作にはgetOrInsert()を使用してください',
|
|
57
84
|
};
|
|
@@ -57,4 +57,12 @@ export const DetectorReactMensagens = {
|
|
|
57
57
|
contextTooBroadSugestao: 'より小さなコンテキストに分割してください',
|
|
58
58
|
liftingStateTooHigh: '必要なレベルよりも多くのレベルに状態が引き上げられています',
|
|
59
59
|
liftingStateTooHighSugestao: 'コンテキストまたはローカル状態を検討してください',
|
|
60
|
+
react19ForwardRef: 'forwardRef は React 19 で非推奨',
|
|
61
|
+
react19ForwardRefSugestao: '通常のプロップとして ref を渡してください',
|
|
62
|
+
react19FC: 'React.FC は React 19 で非推奨',
|
|
63
|
+
react19FCSugestao: 'React.FC を使わずに直接 props を型指定してください',
|
|
64
|
+
react19UseClient: '\'use client\' ディレクティブがありません (React 19)',
|
|
65
|
+
react19UseClientSugestao: 'クライアントコンポーネントにはファイル先頭に \'use client\' を追加してください',
|
|
66
|
+
react19DefaultProps: 'defaultProps は React 19 で非推奨',
|
|
67
|
+
react19DefaultPropsSugestao: '代わりにデフォルトパラメータ値を使用してください',
|
|
60
68
|
};
|
|
@@ -60,4 +60,21 @@ export const DetectorShellMensagens = {
|
|
|
60
60
|
loopOverCommandOutputSugestao: 'ls の解析の代わりにグロブパターンを使用してください',
|
|
61
61
|
pipeOverTempfile: 'パイプラインが一時ファイルを置き換えられる可能性があります',
|
|
62
62
|
pipeOverTempfileSugestao: '一時ファイルの代わりにパイプを使用してください',
|
|
63
|
+
// Modern Bash (2026)
|
|
64
|
+
missingSetU: '"set -u" がありません — 未設定の変数は静かに空に展開されます',
|
|
65
|
+
missingSetUSugestao: '変数名のタイポをキャッチするために "set -u" を追加してください',
|
|
66
|
+
missingIso: 'IFS=$\'\\n\\t\' がありません — ワードスプリッティングが予期しない動作を引き起こす可能性があります',
|
|
67
|
+
missingIsoSugestao: '安全なワードスプリッティングのためにスクリプト先頭に IFS=$\'\\n\\t\' を追加してください',
|
|
68
|
+
missingTrap: 'trap ハンドラが見つかりません — シグナル時にクリーンアップがスキップされる可能性があります',
|
|
69
|
+
missingTrapSugestao: 'trap ハンドラを追加: trap "cleanup" EXIT INT TERM',
|
|
70
|
+
missingMainFn: 'スクリプトに main 関数パターンがありません',
|
|
71
|
+
missingMainFnSugestao: 'ロジックを main() でラップし、最後に main "$@" を呼び出してください',
|
|
72
|
+
missingCommandV: 'command -v の代わりにハードコードされたパス',
|
|
73
|
+
missingCommandVSugestao: '可用性を確認するには "command -v <ツール>" を使用してください',
|
|
74
|
+
missingDebugMode: 'スクリプトにデバッグモードがありません — トラブルシューティングが困難です',
|
|
75
|
+
missingDebugModeSugestao: 'デバッグトレースのために [[ "${DEBUG:-}" == "true" ]] && set -x を追加してください',
|
|
76
|
+
missingInputValidation: 'コマンド引数が検証されていません — 予期しない入力がエラーの原因になる可能性があります',
|
|
77
|
+
missingInputValidationSugestao: '先頭で引数を検証: [[ -z "$1" ]] && { echo "使用法: ..."; exit 1; }',
|
|
78
|
+
shellCheckRecommended: '包括的な分析のために ShellCheck の実行を検討してください',
|
|
79
|
+
shellCheckRecommendedSugestao: 'shellcheck をインストールして実行: shellcheck script.sh',
|
|
63
80
|
};
|
|
@@ -5,13 +5,13 @@ export const DetectorTailwindMensagens = {
|
|
|
5
5
|
repeatedClasses: (duplicates) => `重複したクラス: ${duplicates}`,
|
|
6
6
|
repeatedClassesSugestao: '重複したクラスを削除してください',
|
|
7
7
|
arbitraryValue: (val) => `任意の値が検出されました: ${val}`,
|
|
8
|
-
arbitraryValueSugestao: '
|
|
8
|
+
arbitraryValueSugestao: 'CSSの@theme経由での追加を検討してください (Tailwind v4)',
|
|
9
9
|
important: 'Tailwindクラスで!importantが検出されました',
|
|
10
10
|
importantSugestao: '!importantを避けてください - 詳細度をリファクタリングしてください',
|
|
11
11
|
arbitraryValueOveruse: '任意の値の過剰使用 - デザイントークンが不足している可能性があります',
|
|
12
|
-
arbitraryValueOveruseSugestao: '任意の値の代わりに
|
|
12
|
+
arbitraryValueOveruseSugestao: '任意の値の代わりにCSSの@themeでカスタムトークンを定義してください (Tailwind v4)',
|
|
13
13
|
missingDesignToken: 'ハードコードされた値が検出されました - Tailwindデザイントークンを使用してください',
|
|
14
|
-
missingDesignTokenSugestao: '色、スペーシング、サイズを
|
|
14
|
+
missingDesignTokenSugestao: '色、スペーシング、サイズをCSSの@themeに抽出してください (Tailwind v4)',
|
|
15
15
|
responsiveWithoutBase: '対応するベースクラスなしのレスポンシブクラス',
|
|
16
16
|
responsiveWithoutBaseSugestao: 'レスポンシブバリアントの前にベースクラスを追加してください',
|
|
17
17
|
inlineStylesWithTailwind: 'Tailwindクラスと一緒にインラインスタイルが検出されました',
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
// SPDX-License-Identifier: MIT
|
|
2
2
|
export const RelatorioCircleciMensagens = {
|
|
3
3
|
tituloPadrao: '分析レポート - CircleCI',
|
|
4
|
-
repositorio: (
|
|
5
|
-
data: (
|
|
6
|
-
tempo: (
|
|
4
|
+
repositorio: (...args) => `**リポジトリ:** ${String(args[0])}`,
|
|
5
|
+
data: (...args) => `**日付:** ${String(args[0])}`,
|
|
6
|
+
tempo: (...args) => `**時間:** ${args[0]}ms`,
|
|
7
7
|
resumo: '## 概要',
|
|
8
|
-
scoreGeral: (
|
|
9
|
-
totalConfigs: (
|
|
10
|
-
totalOcorrencias: (
|
|
8
|
+
scoreGeral: (...args) => `| 総合スコア | ${args[0]}/100 |`,
|
|
9
|
+
totalConfigs: (...args) => `| 設定総数 | ${args[0]} |`,
|
|
10
|
+
totalOcorrencias: (...args) => `| 総出現件数 | ${args[0]} |`,
|
|
11
11
|
severidade: '## 重要度',
|
|
12
12
|
configsAnalisadas: '## 分析済み設定',
|
|
13
13
|
ocorrenciasDetalhadas: '## 詳細な出現箇所',
|
|
14
14
|
geradoPor: '*Mahoraga v0.7.0 により生成*',
|
|
15
|
-
formatoNaoSuportado: (
|
|
15
|
+
formatoNaoSuportado: (...args) => `サポートされていない形式: ${args[0]}`,
|
|
16
16
|
schemaJson: 'mahoraga://schemas/circleci-report/v1',
|
|
17
17
|
versao: '0.7.0',
|
|
18
18
|
csvCabecalho: 'ファイル,行,重要度,タイプ,メッセージ,提案',
|
|
@@ -1,19 +1,13 @@
|
|
|
1
1
|
// SPDX-License-Identifier: MIT
|
|
2
2
|
// @mahoraga-disable tipo-literal-inline-complexo
|
|
3
3
|
// 正当化: ゼラドーメッセージ用のインライン型
|
|
4
|
-
import { ICONES_ACAO, ICONES_STATUS, ICONES_ZELADOR
|
|
4
|
+
import { ICONES_ACAO, ICONES_STATUS, ICONES_ZELADOR } from '../../shared/icons.js';
|
|
5
5
|
/**
|
|
6
6
|
* ゼラドーメッセージ
|
|
7
7
|
*
|
|
8
8
|
* ゼラドー(自動修正)に関連するすべてのメッセージを集中化
|
|
9
9
|
* インポート、型、構造などを含む
|
|
10
10
|
*/
|
|
11
|
-
/**
|
|
12
|
-
* ゼラドーが使用するアイコンと絵文字
|
|
13
|
-
*/
|
|
14
|
-
const ICONES_ZELADOR = {
|
|
15
|
-
...ICONES_ZELADOR_CENTRAL
|
|
16
|
-
};
|
|
17
11
|
/**
|
|
18
12
|
* インポートゼラドーのメッセージ
|
|
19
13
|
*/
|
|
@@ -29,7 +29,16 @@ export const ReactMensagens = {
|
|
|
29
29
|
export const ReactHooksMensagens = {
|
|
30
30
|
useEffectNoDeps: 'useEffect に依存配列がありません(ループを避けるため依存関係を確認してください)。',
|
|
31
31
|
memoCallbackNoDeps: 'フックに依存配列がありません(useMemo/useCallback)。',
|
|
32
|
-
hookInConditional: '条件分岐内でフックが宣言されています(フックのルールに違反)。'
|
|
32
|
+
hookInConditional: '条件分岐内でフックが宣言されています(フックのルールに違反)。',
|
|
33
|
+
react19Use: 'use() フック検出 (React 19) — <Suspense> バウンダリでラップしてください。',
|
|
34
|
+
react19UseOptimistic: 'useOptimistic フック検出 (React 19) — 更新関数が必要です。',
|
|
35
|
+
react19UseActionState: 'useActionState フック検出 (React 19) — フォームアクション用。',
|
|
36
|
+
react19UseFormStatus: 'useFormStatus フック検出 (React 19) — フォームの pending 状態にアクセス。',
|
|
37
|
+
react19ForwardRefDeprecated: 'forwardRef は React 19 で非推奨 — 通常のプロップとして ref を渡してください。',
|
|
38
|
+
react19FCDeprecated: 'React.FC/FunctionComponent は React 19 で非推奨 — プロップを直接型指定してください。',
|
|
39
|
+
react19DefaultPropsDeprecated: 'defaultProps は React 19 で非推奨 — デフォルトパラメータを使用してください。',
|
|
40
|
+
react19UseClient: 'ファイルが \'use client\' ディレクティブなしでクライアント機能を使用 (React 19)。',
|
|
41
|
+
react19FormAction: 'action プロップ付きフォーム検出 (React 19)。'
|
|
33
42
|
};
|
|
34
43
|
// ─── TAILWINDメッセージ ────────────────────────────────────────────
|
|
35
44
|
export const TailwindMensagens = {
|
|
@@ -38,7 +47,13 @@ export const TailwindMensagens = {
|
|
|
38
47
|
importantUsage: (token) => `!(important)の使用が検出されました(${token})。important の代わりにユーティリティクラスまたはスコープの強化を優先してください。`,
|
|
39
48
|
variantConflict: (prop, variants) => `${prop} のバリアント競合の可能性あり(バリアント: ${variants.slice(0, 6).join(', ')})。順序/スコープを確認してください。`,
|
|
40
49
|
dangerousArbitraryValue: (token) => `潜在的に危険な url を含む任意の値(${token})。javascript:/data:text/html は避けてください。`,
|
|
41
|
-
arbitraryValue: (token) => `任意の値を含むクラス(${token})
|
|
50
|
+
arbitraryValue: (token) => `任意の値を含むクラス(${token})。デザインと一致しているか確認してください。`,
|
|
51
|
+
v3DeprecatedUtility: (token, replacement) => `v3の非推奨ユーティリティ "${token}" → "${replacement}"を使用してください (Tailwind v4).`,
|
|
52
|
+
v3Directive: `@tailwindディレクティブが検出されました (v3) → @import "tailwindcss"を使用してください (Tailwind v4).`,
|
|
53
|
+
v3LayerUtilities: `@layer utilitiesが検出されました (v3) → @utilityを使用してください (Tailwind v4).`,
|
|
54
|
+
themeFunction: `theme()関数が検出されました (非推奨 v3) → CSS変数 (var(--color-*))を優先してください.`,
|
|
55
|
+
v3ImportantPrefix: (token) => `"${token}" 内の!importantプレフィックス (v3) → !を末尾に移動 ("${token.replace('!', '')}!").`,
|
|
56
|
+
v3ArbitraryVar: `角括弧内の変数 (v3) → 括弧を使用 (例: bg-[--var]の代わりにbg-(--var)).`
|
|
42
57
|
};
|
|
43
58
|
// ─── CSSメッセージ ─────────────────────────────────────────────────
|
|
44
59
|
export const CssMensagens = {
|
|
@@ -270,7 +285,20 @@ export const RustMensagens = {
|
|
|
270
285
|
missingDoc: (fnName) => `公開関数 '${fnName}' にドキュメンテーションコメント (///) がありません。`,
|
|
271
286
|
namingConvention: (constName) => `定数 '${constName}' は SCREAMING_CASE 規約に従うべきです。`,
|
|
272
287
|
redundantReturn: '関数末尾の return は冗長です。Rust は暗黙の戻り値 (最後の式) を使用します。',
|
|
273
|
-
wildcardImport: (importPath) => `ワイルドカードインポート '${importPath}'
|
|
288
|
+
wildcardImport: (importPath) => `ワイルドカードインポート '${importPath}' は名前空間を汚染する可能性があります。明示的なインポートを推奨します。`,
|
|
289
|
+
lazyLockSuggestion: 'once_cell::sync::Lazy を検出 — std::sync::LazyLock を使用 (Rust 1.80+)。',
|
|
290
|
+
onceLockSuggestion: 'once_cell::sync::OnceCell を検出 — std::sync::OnceLock を使用 (Rust 1.70+)。',
|
|
291
|
+
offsetOfSuggestion: 'フィールドアクセスの手動ポインタオフセット — std::mem::offset_of! を使用 (Rust 1.77+)。',
|
|
292
|
+
letChainsPattern: 'let_chains パターン検出 (Rust 1.78 で安定化)。',
|
|
293
|
+
assertMatchesSuggestion: 'assert!(matches!(...)) パターン — assert_matches!(...) を検討 (nightly)。',
|
|
294
|
+
isSomeAnd: '.is_some() && 述語パターン — .is_some_and(|x| ...) を使用 (Rust 1.70+)。',
|
|
295
|
+
isOkAnd: '.is_ok() && 述語パターン — .is_ok_and(|x| ...) を使用 (Rust 1.70+)。',
|
|
296
|
+
inspectMethod: '副作用のある map() — .inspect() を使用 (Rust 1.76+)。',
|
|
297
|
+
implicitFormatCapture: 'format!("...{var}...") は暗黙的キャプチャが可能 (Rust 1.80+)。',
|
|
298
|
+
pointerCast: 'ポインタキャストに `as` を使用 — .cast() を使用 (Rust 1.72+)。',
|
|
299
|
+
splitOnce: 'インデックスアクセス付き splitn(2, ...) — .split_once() を使用 (Rust 1.62+)。',
|
|
300
|
+
okErrAntipattern: '.ok()?.unwrap() アンチパターン — Result に直接 ? を使用。',
|
|
301
|
+
collectOverPush: 'ループ内で push() によるコレクション構築 — .map().collect() を使用。'
|
|
274
302
|
};
|
|
275
303
|
// ─── JAVA / KOTLINメッセージ ───────────────────────────────────────
|
|
276
304
|
export const JavaMensagens = {
|
|
@@ -140,9 +140,9 @@ export function formatarLinha({ nivel, mensagem, sanitize = true }) {
|
|
|
140
140
|
if (!process.env.VITEST && process.env.SUKUNA_CENTER === '1') {
|
|
141
141
|
try {
|
|
142
142
|
const cols = obterColunasTerm();
|
|
143
|
-
const out =
|
|
143
|
+
const out = typeof process.stdout.isTTY !== 'undefined' ? process.stdout : undefined;
|
|
144
144
|
const isTty = !!out && out.isTTY;
|
|
145
|
-
if (isTty && cols && cols > 0) {
|
|
145
|
+
if (isTty && typeof cols === 'number' && cols > 0) {
|
|
146
146
|
const ANSI_REGEX = /[\u001B\u009B][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g;
|
|
147
147
|
const visLen = (string) => (string || '').replace(ANSI_REGEX, '').length;
|
|
148
148
|
const pad = Math.floor(Math.max(0, cols - visLen(linha)) / 2);
|
|
@@ -164,7 +164,7 @@ export function formatarLinha({ nivel, mensagem, sanitize = true }) {
|
|
|
164
164
|
function obterColunasTerm() {
|
|
165
165
|
// Tries to get terminal width safely
|
|
166
166
|
try {
|
|
167
|
-
const out =
|
|
167
|
+
const out = typeof process.stdout.columns !== 'undefined' ? process.stdout : undefined;
|
|
168
168
|
const cols = out?.columns;
|
|
169
169
|
if (typeof cols === 'number' && cols > 0) {
|
|
170
170
|
return cols;
|
|
@@ -414,7 +414,7 @@ export const log = {
|
|
|
414
414
|
const visibleLen = (string) => string.replace(ANSI_REGEX, '').length;
|
|
415
415
|
const frameWidth = Math.max(...lines.map(linha => visibleLen(linha)));
|
|
416
416
|
const cols = obterColunasTerm() ?? 0;
|
|
417
|
-
const outStream =
|
|
417
|
+
const outStream = typeof process.stdout.isTTY !== 'undefined' ? process.stdout : undefined;
|
|
418
418
|
const isTty = !!outStream && outStream.isTTY;
|
|
419
419
|
if (isTty) {
|
|
420
420
|
const pad = Math.floor(Math.max(0, cols - frameWidth) / 2);
|
|
@@ -221,7 +221,7 @@ export const AGRUPAMENTOS_MENSAGEM = [
|
|
|
221
221
|
* 問題タイプの優先度を取得
|
|
222
222
|
*/
|
|
223
223
|
export function getPrioridade(tipo) {
|
|
224
|
-
return PRIORIDADES[tipo]
|
|
224
|
+
return PRIORIDADES[tipo] ?? {
|
|
225
225
|
prioridade: 'baixa',
|
|
226
226
|
icone: ICONES_ARQUIVO.arquivo,
|
|
227
227
|
descricao: 'カテゴリ未分類の問題'
|
|
@@ -54,5 +54,5 @@ export const AnalistaGithubActionsMensagens = {
|
|
|
54
54
|
pullRequestTargetGrantsWritePermissionsSugestao: 'Use pull_request ao invés de pull_request_target, ou valide cuidadosamente o branch de origem',
|
|
55
55
|
workflowDispatchWithoutInputs: 'workflow_dispatch sem inputs definidos',
|
|
56
56
|
workflowDispatchWithoutInputsSugestao: 'Defina inputs obrigatórios para controlar a execução manual do workflow',
|
|
57
|
-
erroAplicarCorrecao: (erro) => `Erro ao aplicar correção: ${erro}`,
|
|
57
|
+
erroAplicarCorrecao: (erro) => `Erro ao aplicar correção: ${String(erro)}`,
|
|
58
58
|
};
|
|
@@ -16,5 +16,6 @@ export const PadroesUsoMensagens = {
|
|
|
16
16
|
nonArrowCallback: "Callback com 'function' onde arrow function seria mais adequada. Prefira () => {}.",
|
|
17
17
|
consoleLog: "console.log detectado em código de produção. Remova ou substitua por logger apropriado.",
|
|
18
18
|
uselessConditional: "Comparação desnecessária: if (x === true). Use apenas if (x).",
|
|
19
|
+
satisfiesUsage: "Palavra-chave 'satisfies' do TypeScript usada — garante type safety sem widening",
|
|
19
20
|
erroAnalise: (relPath, erro) => `Falha ao analisar padrões de uso em ${relPath}: ${erro}`
|
|
20
21
|
};
|
|
@@ -60,4 +60,19 @@ export const AnalistaShellMensagens = {
|
|
|
60
60
|
loopOverCommandOutputSugestao: 'Use glob: "for f in *".',
|
|
61
61
|
pipeOverTempfile: 'Pipeline poderia substituir arquivo temporário.',
|
|
62
62
|
pipeOverTempfileSugestao: 'Use pipes em vez de arquivos temporários.',
|
|
63
|
+
// Modern Bash (2026)
|
|
64
|
+
missingSetU: 'Falta "set -u" — variáveis não definidas expandirão para vazio silenciosamente.',
|
|
65
|
+
missingSetUSugestao: 'Adicione "set -u" para capturar erros de digitação em nomes de variáveis.',
|
|
66
|
+
missingIso: 'Falta IFS=$\'\\n\\t\' — word splitting pode causar comportamento inesperado.',
|
|
67
|
+
missingIsoSugestao: 'Adicione IFS=$\'\\n\\t\' no início do script para word splitting seguro.',
|
|
68
|
+
missingTrap: 'Nenhum trap handler encontrado — limpeza pode ser ignorada em sinais.',
|
|
69
|
+
missingTrapSugestao: 'Adicione trap handler: trap "cleanup" EXIT INT TERM.',
|
|
70
|
+
missingMainFn: 'Script não possui padrão de função main.',
|
|
71
|
+
missingMainFnSugestao: 'Envolva a lógica em main() e chame main "$@" no final.',
|
|
72
|
+
missingCommandV: 'Caminho hardcoded em vez de usar command -v.',
|
|
73
|
+
missingCommandVSugestao: 'Use "command -v <ferramenta>" para verificar disponibilidade.',
|
|
74
|
+
missingDebugMode: 'Script não tem modo debug — troubleshooting é mais difícil.',
|
|
75
|
+
missingDebugModeSugestao: 'Adicione [[ "${DEBUG:-}" == "true" ]] && set -x para debug tracing.',
|
|
76
|
+
missingInputValidation: 'Argumentos de comando não validados — input inesperado pode causar erros.',
|
|
77
|
+
missingInputValidationSugestao: 'Valide argumentos no início: [[ -z "$1" ]] && { echo "Uso: ..."; exit 1; }.',
|
|
63
78
|
};
|
|
@@ -12,4 +12,10 @@ export const DetectorConstrucoesSintaticasMensagens = {
|
|
|
12
12
|
templateLiteralOveruse: "Template literal desnecessário para concatenação simples. Use operador '+'.",
|
|
13
13
|
unnecessaryObjectSpread: "Spread de objeto desnecessário. Atribuição direta 'obj.prop = val' é mais eficiente.",
|
|
14
14
|
getterSetterWithoutValidation: "Getter/setter sem validação no setter. Adicione validação para evitar dados inválidos.",
|
|
15
|
+
// ES2025/ES2026
|
|
16
|
+
explicitResourceManagement: "Gerenciamento Explícito de Recursos com 'using' detectado (ES2026)",
|
|
17
|
+
temporalApiUsage: "Uso da Temporal API detectado (ES2026) — alternativa moderna de data/hora ao Date",
|
|
18
|
+
iteratorHelperUsage: "Método auxiliar de iterador detectado (ES2025) — avaliação lazy em iteráveis",
|
|
19
|
+
setMethodUsage: "Novo método de Set detectado (ES2025) — use para operações de conjunto",
|
|
20
|
+
mapUpsertUsage: "Método upsert de Map detectado (ES2026) — .getOrInsert() / .getOrInsertComputed()",
|
|
15
21
|
};
|
|
@@ -54,4 +54,31 @@ export const DetectorJsTsMensagens = {
|
|
|
54
54
|
observerWithoutDisconnect: 'Observer (MutationObserver/IntersectionObserver) sem disconnect(). Isso causa vazamento de memória.',
|
|
55
55
|
webSocketWithoutClose: 'WebSocket sem chamada close() correspondente. A conexão pode permanecer aberta.',
|
|
56
56
|
workerWithoutTerminate: 'Worker sem chamada terminate(). O worker continuará executando em segundo plano.',
|
|
57
|
+
// ES2025+ features
|
|
58
|
+
satisfiesAvailable: 'Tipo pode usar "satisfies" no lugar de "as" para narrowing mais seguro',
|
|
59
|
+
satisfiesAvailableSugestao: 'Substitua "as Type" por "satisfies Type" para validar sem widen',
|
|
60
|
+
usingResourceManagement: 'Gerenciamento de Recursos com "using" detectado (ES2026)',
|
|
61
|
+
usingResourceManagementSugestao: 'Certifique-se que o recurso implementa Symbol.dispose ou Symbol.asyncDispose',
|
|
62
|
+
temporalApi: 'Uso da Temporal API detectado (ES2026)',
|
|
63
|
+
temporalApiSugestao: 'Temporal substitui Date — use Temporal.Now, Temporal.PlainDate, etc.',
|
|
64
|
+
iteratorHelper: 'Método helper de iterador detectado (ES2025)',
|
|
65
|
+
iteratorHelperSugestao: 'Iterator helpers (.map(), .filter(), .take()) permitem lazy evaluation',
|
|
66
|
+
setMethods: 'Novo método de Set detectado (ES2025)',
|
|
67
|
+
setMethodsSugestao: 'Use Set.prototype.union(), .intersection(), .difference() para operações',
|
|
68
|
+
topLevelAwait: 'Top-level await detectado',
|
|
69
|
+
topLevelAwaitSugestao: 'Verifique se o top-level await não bloqueia imports desnecessariamente',
|
|
70
|
+
promiseWithResolvers: 'Promise.withResolvers() detectado (ES2025)',
|
|
71
|
+
promiseWithResolversSugestao: 'Prefira async/await ao invés de Promise.withResolvers() quando possível',
|
|
72
|
+
promiseAllSettled: 'Promise.allSettled() detectado — bom para padrões all-settled',
|
|
73
|
+
promiseAllSettledSugestao: 'Use Promise.allSettled() quando precisar de resultados independente de rejeição',
|
|
74
|
+
forAwaitOf: 'for await...of detectado — iteração assíncrona',
|
|
75
|
+
forAwaitOfSugestao: 'Certifique-se que o iterável assíncrono implementa Symbol.asyncIterator corretamente',
|
|
76
|
+
regexpEscape: 'RegExp.escape() detectado (ES2025)',
|
|
77
|
+
regexpEscapeSugestao: 'Use RegExp.escape() para escapar input de usuário com segurança em regex',
|
|
78
|
+
errorIsError: 'Error.isError() detectado (ES2026)',
|
|
79
|
+
errorIsErrorSugestao: 'Use Error.isError() para verificação confiável de tipo Error',
|
|
80
|
+
arrayFromAsync: 'Array.fromAsync() detectado (ES2026)',
|
|
81
|
+
arrayFromAsyncSugestao: 'Use Array.fromAsync() para criar arrays a partir de iteráveis assíncronos',
|
|
82
|
+
mapGetOrInsert: 'Map.getOrInsert() / .getOrInsertComputed() detectado (ES2026)',
|
|
83
|
+
mapGetOrInsertSugestao: 'Use getOrInsert() para operações atômicas de upsert em Map',
|
|
57
84
|
};
|
|
@@ -57,4 +57,12 @@ export const DetectorReactMensagens = {
|
|
|
57
57
|
contextTooBroadSugestao: 'Divida em contextos menores',
|
|
58
58
|
liftingStateTooHigh: 'Estado elevado mais níveis que o necessário',
|
|
59
59
|
liftingStateTooHighSugestao: 'Considere context ou estado local',
|
|
60
|
+
react19ForwardRef: 'forwardRef é deprecated no React 19',
|
|
61
|
+
react19ForwardRefSugestao: 'Passe ref como uma prop direta',
|
|
62
|
+
react19FC: 'React.FC é deprecated no React 19',
|
|
63
|
+
react19FCSugestao: 'Tipe as props diretamente ao invés de usar React.FC',
|
|
64
|
+
react19UseClient: 'Diretiva \'use client\' ausente (React 19)',
|
|
65
|
+
react19UseClientSugestao: 'Adicione \'use client\' no topo do arquivo para componentes client',
|
|
66
|
+
react19DefaultProps: 'defaultProps é deprecated no React 19',
|
|
67
|
+
react19DefaultPropsSugestao: 'Use valores padrão de parâmetros',
|
|
60
68
|
};
|
|
@@ -60,4 +60,21 @@ export const DetectorShellMensagens = {
|
|
|
60
60
|
loopOverCommandOutputSugestao: 'Use padrões glob em vez de analisar ls',
|
|
61
61
|
pipeOverTempfile: 'Pipeline poderia substituir arquivo temporário',
|
|
62
62
|
pipeOverTempfileSugestao: 'Use pipes em vez de arquivos temporários',
|
|
63
|
+
// Modern Bash (2026)
|
|
64
|
+
missingSetU: 'Falta "set -u" — variáveis não definidas expandirão para vazio silenciosamente',
|
|
65
|
+
missingSetUSugestao: 'Adicione "set -u" para capturar erros de digitação em nomes de variáveis',
|
|
66
|
+
missingIso: 'Falta IFS=$\'\\n\\t\' — word splitting pode causar comportamento inesperado',
|
|
67
|
+
missingIsoSugestao: 'Adicione IFS=$\'\\n\\t\' no início do script para word splitting seguro',
|
|
68
|
+
missingTrap: 'Nenhum trap handler encontrado — limpeza pode ser ignorada em sinais',
|
|
69
|
+
missingTrapSugestao: 'Adicione trap handler: trap "cleanup" EXIT INT TERM',
|
|
70
|
+
missingMainFn: 'Script não possui padrão de função main',
|
|
71
|
+
missingMainFnSugestao: 'Envolva a lógica em main() e chame main "$@" no final',
|
|
72
|
+
missingCommandV: 'Caminho hardcoded em vez de usar command -v',
|
|
73
|
+
missingCommandVSugestao: 'Use "command -v <ferramenta>" para verificar disponibilidade',
|
|
74
|
+
missingDebugMode: 'Script não tem modo debug — troubleshooting é mais difícil',
|
|
75
|
+
missingDebugModeSugestao: 'Adicione [[ "${DEBUG:-}" == "true" ]] && set -x para debug tracing',
|
|
76
|
+
missingInputValidation: 'Argumentos de comando não validados — input inesperado pode causar erros',
|
|
77
|
+
missingInputValidationSugestao: 'Valide argumentos no início: [[ -z "$1" ]] && { echo "Uso: ..."; exit 1; }',
|
|
78
|
+
shellCheckRecommended: 'Considere rodar ShellCheck para análise abrangente',
|
|
79
|
+
shellCheckRecommendedSugestao: 'Instale shellcheck e execute: shellcheck script.sh',
|
|
63
80
|
};
|
|
@@ -5,13 +5,13 @@ export const DetectorTailwindMensagens = {
|
|
|
5
5
|
repeatedClasses: (duplicates) => `Classes repetidas: ${duplicates}`,
|
|
6
6
|
repeatedClassesSugestao: 'Remova classes duplicadas',
|
|
7
7
|
arbitraryValue: (val) => `Valor arbitrário detectado: ${val}`,
|
|
8
|
-
arbitraryValueSugestao: 'Considere adicionar
|
|
8
|
+
arbitraryValueSugestao: 'Considere adicionar via @theme no CSS (Tailwind v4)',
|
|
9
9
|
important: '!important detectado em classe Tailwind',
|
|
10
10
|
importantSugestao: 'Evite !important - refatore a especificidade',
|
|
11
11
|
arbitraryValueOveruse: 'Uso excessivo de valores arbitrários - pode indicar falta de tokens de design',
|
|
12
|
-
arbitraryValueOveruseSugestao: 'Defina tokens personalizados
|
|
12
|
+
arbitraryValueOveruseSugestao: 'Defina tokens personalizados via @theme no CSS ao invés de valores arbitrários (Tailwind v4)',
|
|
13
13
|
missingDesignToken: 'Valor hardcoded detectado - use tokens de design do Tailwind',
|
|
14
|
-
missingDesignTokenSugestao: 'Extraia cores, espaçamentos e tamanhos para
|
|
14
|
+
missingDesignTokenSugestao: 'Extraia cores, espaçamentos e tamanhos para @theme no CSS (Tailwind v4)',
|
|
15
15
|
responsiveWithoutBase: 'Classe responsiva sem classe base correspondente',
|
|
16
16
|
responsiveWithoutBaseSugestao: 'Adicione a classe base antes das variantes responsivas',
|
|
17
17
|
inlineStylesWithTailwind: 'Estilos inline detectados junto com classes Tailwind',
|
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
// SPDX-License-Identifier: MIT
|
|
2
2
|
export const RelatorioCircleciMensagens = {
|
|
3
3
|
tituloPadrao: 'Relatório de Análise - CircleCI',
|
|
4
|
-
repositorio: (
|
|
5
|
-
data: (
|
|
6
|
-
tempo: (
|
|
4
|
+
repositorio: (...args) => `**Repositório:** ${String(args[0])}`,
|
|
5
|
+
data: (...args) => `**Data:** ${String(args[0])}`,
|
|
6
|
+
tempo: (...args) => `**Tempo:** ${args[0]}ms`,
|
|
7
7
|
resumo: '## Resumo',
|
|
8
|
-
scoreGeral: (
|
|
9
|
-
totalConfigs: (
|
|
10
|
-
totalOcorrencias: (
|
|
8
|
+
scoreGeral: (...args) => `| Score Geral | ${args[0]}/100 |`,
|
|
9
|
+
totalConfigs: (...args) => `| Total de Configs | ${args[0]} |`,
|
|
10
|
+
totalOcorrencias: (...args) => `| Total de Ocorrências | ${args[0]} |`,
|
|
11
11
|
severidade: '## Severidade',
|
|
12
12
|
configsAnalisadas: '## Configs Analisadas',
|
|
13
13
|
ocorrenciasDetalhadas: '## Ocorrências Detalhadas',
|
|
14
14
|
geradoPor: '*Gerado por Mahoraga v0.7.0*',
|
|
15
|
-
formatoNaoSuportado: (
|
|
15
|
+
formatoNaoSuportado: (...args) => `Formato não suportado: ${args[0]}`,
|
|
16
16
|
schemaJson: 'mahoraga://schemas/circleci-report/v1',
|
|
17
17
|
versao: '0.7.0',
|
|
18
18
|
csvCabecalho: 'Arquivo,Linha,Severidade,Tipo,Mensagem,Sugestao',
|
|
@@ -1,19 +1,13 @@
|
|
|
1
1
|
// SPDX-License-Identifier: MIT
|
|
2
2
|
// @mahoraga-disable tipo-literal-inline-complexo
|
|
3
3
|
// Justificativa: tipos inline para mensagens de zeladores
|
|
4
|
-
import { ICONES_ACAO, ICONES_STATUS, ICONES_ZELADOR
|
|
4
|
+
import { ICONES_ACAO, ICONES_STATUS, ICONES_ZELADOR } from '../../shared/icons.js';
|
|
5
5
|
/**
|
|
6
6
|
* Mensagens dos Zeladores
|
|
7
7
|
*
|
|
8
8
|
* Centraliza todas as mensagens relacionadas aos zeladores (auto-fix)
|
|
9
9
|
* incluindo: imports, tipos, estrutura, etc.
|
|
10
10
|
*/
|
|
11
|
-
/**
|
|
12
|
-
* Ícones e emojis usados pelos zeladores
|
|
13
|
-
*/
|
|
14
|
-
const ICONES_ZELADOR = {
|
|
15
|
-
...ICONES_ZELADOR_CENTRAL
|
|
16
|
-
};
|
|
17
11
|
/**
|
|
18
12
|
* Mensagens do Zelador de Imports
|
|
19
13
|
*/
|
|
@@ -29,7 +29,16 @@ export const ReactMensagens = {
|
|
|
29
29
|
export const ReactHooksMensagens = {
|
|
30
30
|
useEffectNoDeps: 'useEffect sem array de dependências (avalie deps para evitar loops).',
|
|
31
31
|
memoCallbackNoDeps: 'Hook sem array de dependências (useMemo/useCallback).',
|
|
32
|
-
hookInConditional: 'Hook declarado dentro de condicional (quebra Rules of Hooks).'
|
|
32
|
+
hookInConditional: 'Hook declarado dentro de condicional (quebra Rules of Hooks).',
|
|
33
|
+
react19Use: 'Hook use() detectado (React 19) — certifique-se de usar <Suspense>.',
|
|
34
|
+
react19UseOptimistic: 'Hook useOptimistic detectado (React 19) — requer função de update.',
|
|
35
|
+
react19UseActionState: 'Hook useActionState detectado (React 19) — para form actions.',
|
|
36
|
+
react19UseFormStatus: 'Hook useFormStatus detectado (React 19) — acessa estado pendente do form.',
|
|
37
|
+
react19ForwardRefDeprecated: 'forwardRef é deprecated no React 19 — passe ref como prop direta.',
|
|
38
|
+
react19FCDeprecated: 'React.FC/FunctionComponent é deprecated no React 19 — tipagem direta de props.',
|
|
39
|
+
react19DefaultPropsDeprecated: 'defaultProps é deprecated no React 19 — use parâmetros default.',
|
|
40
|
+
react19UseClient: 'Arquivo usa recursos client-side (hooks/eventos) sem diretiva \'use client\' (React 19).',
|
|
41
|
+
react19FormAction: 'Form com action prop detectado (React 19).'
|
|
33
42
|
};
|
|
34
43
|
// ─── MENSAGENS TAILWIND ───────────────────────────────────────
|
|
35
44
|
export const TailwindMensagens = {
|
|
@@ -38,7 +47,13 @@ export const TailwindMensagens = {
|
|
|
38
47
|
importantUsage: (token) => `Uso de ! (important) detectado em (${token}). Prefira classes utilitárias ou reforço de escopo ao invés de important.`,
|
|
39
48
|
variantConflict: (prop, variants) => `Possível conflito de variantes para ${prop} (variantes: ${variants.slice(0, 6).join(', ')}). Verifique ordem/escopo.`,
|
|
40
49
|
dangerousArbitraryValue: (token) => `Valor arbitrário com url potencialmente perigosa (${token}). Evite javascript:/data:text/html.`,
|
|
41
|
-
arbitraryValue: (token) => `Classe com valor arbitrário (${token}). Confirme se está alinhada ao design
|
|
50
|
+
arbitraryValue: (token) => `Classe com valor arbitrário (${token}). Confirme se está alinhada ao design.`,
|
|
51
|
+
v3DeprecatedUtility: (token, replacement) => `Utilitário obsoleto do v3 "${token}" → use "${replacement}" (Tailwind v4).`,
|
|
52
|
+
v3Directive: `Diretiva @tailwind detectada (v3) → use @import "tailwindcss" (Tailwind v4).`,
|
|
53
|
+
v3LayerUtilities: `@layer utilities detectado (v3) → use @utility (Tailwind v4).`,
|
|
54
|
+
themeFunction: `Função theme() detectada (deprecated v3) → prefira CSS variables (var(--color-*)).`,
|
|
55
|
+
v3ImportantPrefix: (token) => `!important como prefixo em "${token}" (v3) → mova ! para o final ("${token.replace('!', '')}!").`,
|
|
56
|
+
v3ArbitraryVar: `Variável entre colchetes (v3) → use parênteses (ex: bg-(--var) ao invés de bg-[--var]).`
|
|
42
57
|
};
|
|
43
58
|
// ─── MENSAGENS CSS ────────────────────────────────────────────
|
|
44
59
|
export const CssMensagens = {
|
|
@@ -287,7 +302,20 @@ export const RustMensagens = {
|
|
|
287
302
|
missingDoc: (fnName) => `Função pública '${fnName}' sem comentário de documentação (///).`,
|
|
288
303
|
namingConvention: (constName) => `Constante '${constName}' deve seguir convenção SCREAMING_CASE.`,
|
|
289
304
|
redundantReturn: 'return redundante no final da função; Rust usa retorno implícito (última expressão).',
|
|
290
|
-
wildcardImport: (importPath) => `Importação curinga '${importPath}' pode poluir o namespace; prefira imports explícitos
|
|
305
|
+
wildcardImport: (importPath) => `Importação curinga '${importPath}' pode poluir o namespace; prefira imports explícitos.`,
|
|
306
|
+
lazyLockSuggestion: 'once_cell::sync::Lazy detectado — use std::sync::LazyLock (Rust 1.80+).',
|
|
307
|
+
onceLockSuggestion: 'once_cell::sync::OnceCell detectado — use std::sync::OnceLock (Rust 1.70+).',
|
|
308
|
+
offsetOfSuggestion: 'Offset manual para campo — use std::mem::offset_of! (Rust 1.77+).',
|
|
309
|
+
letChainsPattern: 'Padrão let_chains detectado (estável desde Rust 1.78).',
|
|
310
|
+
assertMatchesSuggestion: 'Padrão assert!(matches!(...)) — considere assert_matches!(...) (nightly).',
|
|
311
|
+
isSomeAnd: '.is_some() && predicate — use .is_some_and(|x| ...) (Rust 1.70+).',
|
|
312
|
+
isOkAnd: '.is_ok() && predicate — use .is_ok_and(|x| ...) (Rust 1.70+).',
|
|
313
|
+
inspectMethod: 'map() com closure de efeito colateral — use .inspect() (Rust 1.76+).',
|
|
314
|
+
implicitFormatCapture: 'format!("...{var}...") pode usar captura implícita (Rust 1.80+).',
|
|
315
|
+
pointerCast: 'Uso de `as` para cast de ponteiro — use .cast() (Rust 1.72+).',
|
|
316
|
+
splitOnce: 'splitn(2, ...) com acesso por índice — use .split_once() (Rust 1.62+).',
|
|
317
|
+
okErrAntipattern: 'Antipadrão .ok()?.unwrap() — use ? diretamente no Result.',
|
|
318
|
+
collectOverPush: 'Construção de coleção com push() em loop — use .map().collect().'
|
|
291
319
|
};
|
|
292
320
|
// ─── MENSAGENS JAVA / KOTLIN ──────────────────────────────────
|
|
293
321
|
export const JavaMensagens = {
|
|
@@ -13,9 +13,7 @@ class LogEngineAdaptativo {
|
|
|
13
13
|
metricas = null;
|
|
14
14
|
isCI = false;
|
|
15
15
|
static getInstance() {
|
|
16
|
-
|
|
17
|
-
LogEngineAdaptativo.instance = new LogEngineAdaptativo();
|
|
18
|
-
}
|
|
16
|
+
LogEngineAdaptativo.instance ??= new LogEngineAdaptativo();
|
|
19
17
|
return LogEngineAdaptativo.instance;
|
|
20
18
|
}
|
|
21
19
|
/**
|
|
@@ -88,7 +86,7 @@ class LogEngineAdaptativo {
|
|
|
88
86
|
* Detecta se está rodando em ambiente CI/CD
|
|
89
87
|
*/
|
|
90
88
|
detectarCI() {
|
|
91
|
-
return !!((process.env.CI
|
|
89
|
+
return !!((process.env.CI ?? process.env.GITHUB_ACTIONS ?? (process.env.GITLAB_CI ?? process.env.JENKINS_URL)) ?? config.REPORT_SILENCE_LOGS);
|
|
92
90
|
}
|
|
93
91
|
/**
|
|
94
92
|
* Calcula confiança da detecção de contexto
|
|
@@ -166,7 +164,7 @@ class LogEngineAdaptativo {
|
|
|
166
164
|
// Aplica formatação de template
|
|
167
165
|
return template.replace(/\{(\w+)\}/g, (match, key) => {
|
|
168
166
|
const value = processedData[key];
|
|
169
|
-
return
|
|
167
|
+
return String(value);
|
|
170
168
|
});
|
|
171
169
|
}
|
|
172
170
|
/**
|
|
@@ -194,7 +192,9 @@ class LogEngineAdaptativo {
|
|
|
194
192
|
return console.error;
|
|
195
193
|
case 'aviso':
|
|
196
194
|
return console.warn;
|
|
197
|
-
|
|
195
|
+
case 'info':
|
|
196
|
+
case 'debug':
|
|
197
|
+
case 'sucesso':
|
|
198
198
|
return console.log;
|
|
199
199
|
}
|
|
200
200
|
}
|
|
@@ -140,7 +140,7 @@ export function formatarLinha({ nivel, mensagem, sanitize = true }) {
|
|
|
140
140
|
if (!process.env.VITEST && process.env.SUKUNA_CENTER === '1') {
|
|
141
141
|
try {
|
|
142
142
|
const cols = obterColunasTerm();
|
|
143
|
-
const out =
|
|
143
|
+
const out = typeof process.stdout.isTTY !== 'undefined' ? process.stdout : undefined;
|
|
144
144
|
const isTty = !!out && out.isTTY;
|
|
145
145
|
if (isTty && cols && cols > 0) {
|
|
146
146
|
const ANSI_REGEX = /[\u001B\u009B][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g;
|
|
@@ -164,7 +164,7 @@ export function formatarLinha({ nivel, mensagem, sanitize = true }) {
|
|
|
164
164
|
function obterColunasTerm() {
|
|
165
165
|
// Tenta obter largura do terminal de forma segura
|
|
166
166
|
try {
|
|
167
|
-
const out =
|
|
167
|
+
const out = typeof process.stdout.columns !== 'undefined' ? process.stdout : undefined;
|
|
168
168
|
const cols = out?.columns;
|
|
169
169
|
if (typeof cols === 'number' && cols > 0) {
|
|
170
170
|
return cols;
|
|
@@ -414,7 +414,7 @@ export const log = {
|
|
|
414
414
|
const visibleLen = (string) => string.replace(ANSI_REGEX, '').length;
|
|
415
415
|
const frameWidth = Math.max(...lines.map(linha => visibleLen(linha)));
|
|
416
416
|
const cols = obterColunasTerm() ?? 0;
|
|
417
|
-
const outStream =
|
|
417
|
+
const outStream = typeof process.stdout.isTTY !== 'undefined' ? process.stdout : undefined;
|
|
418
418
|
const isTty = !!outStream && outStream.isTTY;
|
|
419
419
|
if (isTty) {
|
|
420
420
|
const pad = Math.floor(Math.max(0, cols - frameWidth) / 2);
|
|
@@ -221,7 +221,7 @@ export const AGRUPAMENTOS_MENSAGEM = [
|
|
|
221
221
|
* Obtém a prioridade de um tipo de problema
|
|
222
222
|
*/
|
|
223
223
|
export function getPrioridade(tipo) {
|
|
224
|
-
return PRIORIDADES[tipo]
|
|
224
|
+
return PRIORIDADES[tipo] ?? {
|
|
225
225
|
prioridade: 'baixa',
|
|
226
226
|
icone: ICONES_ARQUIVO.arquivo,
|
|
227
227
|
descricao: 'Problema não categorizado'
|