tutanus 0.12.3 → 0.12.4
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 +6 -6
- package/dist/analysts/converters/converter-base.js.map +1 -1
- package/dist/analysts/converters/engines/converter-gha-to-gitlab.js.map +1 -1
- package/dist/analysts/converters/index.js.map +1 -1
- package/dist/analysts/corrections/map-reversion.js +2 -2
- package/dist/analysts/corrections/map-reversion.js.map +1 -1
- package/dist/analysts/corrections/pruning.js +3 -3
- package/dist/analysts/corrections/pruning.js.map +1 -1
- package/dist/analysts/detectors/detector-recommendation-architecture.js +2 -2
- package/dist/analysts/detectors/detector-recommendation-architecture.js.map +1 -1
- package/dist/analysts/github-actions/detectors/org-verified.js.map +1 -1
- package/dist/analysts/github-actions/reports/generator-report-github-actions.js +4 -4
- package/dist/analysts/github-actions/reports/generator-report-github-actions.js.map +1 -1
- package/dist/analysts/js-ts/detectors/detector-context-smart.js +10 -10
- package/dist/analysts/js-ts/detectors/detector-context-smart.js.map +1 -1
- package/dist/analysts/js-ts/detectors/detector-types-unsafe.js +3 -3
- package/dist/analysts/js-ts/detectors/detector-types-unsafe.js.map +1 -1
- package/dist/analysts/plugins/detector-documentation.js.map +1 -1
- package/dist/analysts/plugins/index.js.map +1 -1
- package/dist/analysts/scorers/scorer.js +67 -67
- package/dist/analysts/scorers/scorer.js.map +1 -1
- package/dist/app/github/app/repo-downloader.d.ts +2 -0
- package/dist/app/github/app/repo-downloader.d.ts.map +1 -1
- package/dist/app/github/app/repo-downloader.js +2 -2
- package/dist/app/github/app/repo-downloader.js.map +1 -1
- package/dist/app/github/jobs/auto-fix-job.d.ts.map +1 -1
- package/dist/app/github/jobs/auto-fix-job.js +19 -3
- package/dist/app/github/jobs/auto-fix-job.js.map +1 -1
- package/dist/app/github/push-analysis/push-analysis-service.d.ts.map +1 -1
- package/dist/app/github/push-analysis/push-analysis-service.js +19 -7
- package/dist/app/github/push-analysis/push-analysis-service.js.map +1 -1
- package/dist/app/github/push-analysis/push-report.js +2 -2
- package/dist/app/github/push-analysis/push-report.js.map +1 -1
- package/dist/cli/commands/command-azure.js +1 -1
- package/dist/cli/commands/command-azure.js.map +1 -1
- package/dist/cli/commands/command-circleci.js +1 -1
- package/dist/cli/commands/command-circleci.js.map +1 -1
- package/dist/cli/commands/command-convert.js.map +1 -1
- package/dist/cli/commands/command-github-actions.js +1 -1
- package/dist/cli/commands/command-github-actions.js.map +1 -1
- package/dist/cli/commands/command-gitlab-ci.js +1 -1
- package/dist/cli/commands/command-gitlab-ci.js.map +1 -1
- package/dist/cli/commands/command-jenkins.js +1 -1
- package/dist/cli/commands/command-jenkins.js.map +1 -1
- package/dist/cli/diagnostic/exporters/compliance-exporter.js +2 -2
- package/dist/cli/diagnostic/exporters/compliance-exporter.js.map +1 -1
- package/dist/cli/diagnostic/exporters/markdown-exporter.js +7 -7
- package/dist/cli/diagnostic/exporters/markdown-exporter.js.map +1 -1
- package/dist/cli/diagnostic/handlers/archetype-handler.js.map +1 -1
- package/dist/cli/diagnostic/handlers/guardian-handler.js.map +1 -1
- package/dist/cli/diagnostic/processing-diagnostic.js +1 -1
- package/dist/cli/diagnostic/processing-diagnostic.js.map +1 -1
- package/dist/core/config/auto/fix-config.js.map +1 -1
- package/dist/core/execution/executor.js +4 -4
- package/dist/core/execution/executor.js.map +1 -1
- package/dist/core/execution/inquisitor.js +6 -6
- package/dist/core/execution/inquisitor.js.map +1 -1
- package/dist/core/execution/scanner.js.map +1 -1
- package/dist/core/messages/en/analysts/archetypes-extra-messages.d.ts +2 -2
- package/dist/core/messages/en/analysts/archetypes-extra-messages.js +2 -2
- package/dist/core/messages/en/analysts/archetypes-extra-messages.js.map +1 -1
- package/dist/core/messages/en/analysts/detector-clean-arch-messages.d.ts +4 -4
- package/dist/core/messages/en/analysts/detector-clean-arch-messages.js +4 -4
- package/dist/core/messages/en/analysts/detector-clean-arch-messages.js.map +1 -1
- package/dist/core/messages/en/analysts/detector-js-ts-messages.d.ts +2 -2
- package/dist/core/messages/en/analysts/detector-js-ts-messages.js +2 -2
- package/dist/core/messages/en/analysts/detector-js-ts-messages.js.map +1 -1
- package/dist/core/messages/en/analysts/map-reversion-extra-messages.d.ts +6 -6
- package/dist/core/messages/en/analysts/map-reversion-extra-messages.js +6 -6
- package/dist/core/messages/en/analysts/map-reversion-extra-messages.js.map +1 -1
- package/dist/core/messages/en/analysts/report-github-actions-messages.d.ts +2 -2
- package/dist/core/messages/en/analysts/report-github-actions-messages.js +2 -2
- package/dist/core/messages/en/analysts/report-github-actions-messages.js.map +1 -1
- package/dist/core/messages/en/analysts/scorer-messages.d.ts +45 -45
- package/dist/core/messages/en/analysts/scorer-messages.js +49 -49
- package/dist/core/messages/en/analysts/scorer-messages.js.map +1 -1
- package/dist/core/messages/en/cli/cli-command-convert-messages.d.ts +1 -1
- package/dist/core/messages/en/cli/cli-command-convert-messages.js +1 -1
- package/dist/core/messages/en/cli/cli-command-convert-messages.js.map +1 -1
- package/dist/core/messages/en/cli/cli-command-format-messages.d.ts +1 -1
- package/dist/core/messages/en/cli/cli-command-format-messages.js +1 -1
- package/dist/core/messages/en/cli/cli-command-format-messages.js.map +1 -1
- package/dist/core/messages/en/cli/cli-command-github-actions-messages.d.ts +1 -1
- package/dist/core/messages/en/cli/cli-command-github-actions-messages.js +4 -4
- package/dist/core/messages/en/cli/cli-command-github-actions-messages.js.map +1 -1
- package/dist/core/messages/en/cli/cli-command-update-messages.d.ts +2 -2
- package/dist/core/messages/en/cli/cli-command-update-messages.js +2 -2
- package/dist/core/messages/en/cli/cli-command-update-messages.js.map +1 -1
- package/dist/core/messages/en/cli/cli-flags-validator-messages.d.ts +3 -3
- package/dist/core/messages/en/cli/cli-flags-validator-messages.js +3 -3
- package/dist/core/messages/en/cli/cli-flags-validator-messages.js.map +1 -1
- package/dist/core/messages/en/core/correcoes-messages.js +2 -2
- package/dist/core/messages/en/core/correcoes-messages.js.map +1 -1
- package/dist/core/messages/en/core/inquisitor-extra-messages.d.ts +2 -2
- package/dist/core/messages/en/core/inquisitor-extra-messages.js +2 -2
- package/dist/core/messages/en/core/inquisitor-extra-messages.js.map +1 -1
- package/dist/core/messages/en/core/parser-extra-messages.d.ts +3 -3
- package/dist/core/messages/en/core/parser-extra-messages.js +3 -3
- package/dist/core/messages/en/core/parser-extra-messages.js.map +1 -1
- package/dist/core/messages/en/guardian/guardian-messages.d.ts +2 -2
- package/dist/core/messages/en/guardian/guardian-messages.js +2 -2
- package/dist/core/messages/en/guardian/guardian-messages.js.map +1 -1
- package/dist/core/messages/en/guardian/watcher-hidden-messages.d.ts +2 -2
- package/dist/core/messages/en/guardian/watcher-hidden-messages.js +2 -2
- package/dist/core/messages/en/guardian/watcher-hidden-messages.js.map +1 -1
- package/dist/core/messages/en/log/log-helper.js.map +1 -1
- package/dist/core/messages/en/reports/report-async-patterns-messages.d.ts +3 -3
- package/dist/core/messages/en/reports/report-async-patterns-messages.js +3 -3
- package/dist/core/messages/en/reports/report-async-patterns-messages.js.map +1 -1
- package/dist/core/messages/en/shared/plugin-core-messages.d.ts +2 -2
- package/dist/core/messages/en/shared/plugin-core-messages.js +2 -2
- package/dist/core/messages/en/shared/plugin-core-messages.js.map +1 -1
- package/dist/core/messages/en/shared/plugin-registry-messages.d.ts +4 -4
- package/dist/core/messages/en/shared/plugin-registry-messages.js +4 -4
- package/dist/core/messages/en/shared/plugin-registry-messages.js.map +1 -1
- package/dist/core/messages/ja/analysts/archetypes-extra-messages.d.ts +2 -2
- package/dist/core/messages/ja/analysts/archetypes-extra-messages.js +2 -2
- package/dist/core/messages/ja/analysts/archetypes-extra-messages.js.map +1 -1
- package/dist/core/messages/ja/analysts/detector-clean-arch-messages.d.ts +4 -4
- package/dist/core/messages/ja/analysts/detector-clean-arch-messages.js +4 -4
- package/dist/core/messages/ja/analysts/detector-clean-arch-messages.js.map +1 -1
- package/dist/core/messages/ja/analysts/detector-js-ts-messages.d.ts +2 -2
- package/dist/core/messages/ja/analysts/detector-js-ts-messages.js +2 -2
- package/dist/core/messages/ja/analysts/detector-js-ts-messages.js.map +1 -1
- package/dist/core/messages/ja/analysts/map-reversion-extra-messages.d.ts +6 -6
- package/dist/core/messages/ja/analysts/map-reversion-extra-messages.js +6 -6
- package/dist/core/messages/ja/analysts/map-reversion-extra-messages.js.map +1 -1
- package/dist/core/messages/ja/analysts/report-github-actions-messages.d.ts +2 -2
- package/dist/core/messages/ja/analysts/report-github-actions-messages.js +2 -2
- package/dist/core/messages/ja/analysts/report-github-actions-messages.js.map +1 -1
- package/dist/core/messages/ja/analysts/scorer-messages.d.ts +45 -45
- package/dist/core/messages/ja/analysts/scorer-messages.js +49 -49
- package/dist/core/messages/ja/analysts/scorer-messages.js.map +1 -1
- package/dist/core/messages/ja/cli/cli-command-analysts-messages.d.ts +2 -2
- package/dist/core/messages/ja/cli/cli-command-analysts-messages.js +2 -2
- package/dist/core/messages/ja/cli/cli-command-analysts-messages.js.map +1 -1
- package/dist/core/messages/ja/cli/cli-command-convert-messages.d.ts +1 -1
- package/dist/core/messages/ja/cli/cli-command-convert-messages.js +1 -1
- package/dist/core/messages/ja/cli/cli-command-convert-messages.js.map +1 -1
- package/dist/core/messages/ja/cli/cli-command-format-messages.d.ts +1 -1
- package/dist/core/messages/ja/cli/cli-command-format-messages.js +1 -1
- package/dist/core/messages/ja/cli/cli-command-format-messages.js.map +1 -1
- package/dist/core/messages/ja/cli/cli-command-github-actions-messages.d.ts +1 -1
- package/dist/core/messages/ja/cli/cli-command-github-actions-messages.js +4 -4
- package/dist/core/messages/ja/cli/cli-command-github-actions-messages.js.map +1 -1
- package/dist/core/messages/ja/cli/cli-command-update-messages.d.ts +2 -2
- package/dist/core/messages/ja/cli/cli-command-update-messages.js +2 -2
- package/dist/core/messages/ja/cli/cli-command-update-messages.js.map +1 -1
- package/dist/core/messages/ja/cli/cli-flags-validator-messages.d.ts +3 -3
- package/dist/core/messages/ja/cli/cli-flags-validator-messages.js +3 -3
- package/dist/core/messages/ja/cli/cli-flags-validator-messages.js.map +1 -1
- package/dist/core/messages/ja/core/correcoes-messages.js +2 -2
- package/dist/core/messages/ja/core/correcoes-messages.js.map +1 -1
- package/dist/core/messages/ja/core/inquisitor-extra-messages.d.ts +2 -2
- package/dist/core/messages/ja/core/inquisitor-extra-messages.js +2 -2
- package/dist/core/messages/ja/core/inquisitor-extra-messages.js.map +1 -1
- package/dist/core/messages/ja/core/parser-extra-messages.d.ts +3 -3
- package/dist/core/messages/ja/core/parser-extra-messages.js +3 -3
- package/dist/core/messages/ja/core/parser-extra-messages.js.map +1 -1
- package/dist/core/messages/ja/guardian/guardian-messages.d.ts +2 -2
- package/dist/core/messages/ja/guardian/guardian-messages.js +2 -2
- package/dist/core/messages/ja/guardian/guardian-messages.js.map +1 -1
- package/dist/core/messages/ja/guardian/watcher-hidden-messages.d.ts +2 -2
- package/dist/core/messages/ja/guardian/watcher-hidden-messages.js +2 -2
- package/dist/core/messages/ja/guardian/watcher-hidden-messages.js.map +1 -1
- package/dist/core/messages/ja/log/log-helper.js.map +1 -1
- package/dist/core/messages/ja/reports/report-async-patterns-messages.d.ts +3 -3
- package/dist/core/messages/ja/reports/report-async-patterns-messages.js +3 -3
- package/dist/core/messages/ja/reports/report-async-patterns-messages.js.map +1 -1
- package/dist/core/messages/ja/shared/plugin-core-messages.d.ts +2 -2
- package/dist/core/messages/ja/shared/plugin-core-messages.js +2 -2
- package/dist/core/messages/ja/shared/plugin-core-messages.js.map +1 -1
- package/dist/core/messages/ja/shared/plugin-registry-messages.d.ts +4 -4
- package/dist/core/messages/ja/shared/plugin-registry-messages.js +4 -4
- package/dist/core/messages/ja/shared/plugin-registry-messages.js.map +1 -1
- package/dist/core/messages/pt/analysts/archetypes-extra-messages.d.ts +2 -2
- package/dist/core/messages/pt/analysts/archetypes-extra-messages.js +2 -2
- package/dist/core/messages/pt/analysts/archetypes-extra-messages.js.map +1 -1
- package/dist/core/messages/pt/analysts/detector-clean-arch-messages.d.ts +4 -4
- package/dist/core/messages/pt/analysts/detector-clean-arch-messages.js +4 -4
- package/dist/core/messages/pt/analysts/detector-clean-arch-messages.js.map +1 -1
- package/dist/core/messages/pt/analysts/detector-js-ts-messages.d.ts +2 -2
- package/dist/core/messages/pt/analysts/detector-js-ts-messages.js +2 -2
- package/dist/core/messages/pt/analysts/detector-js-ts-messages.js.map +1 -1
- package/dist/core/messages/pt/analysts/map-reversion-extra-messages.d.ts +6 -6
- package/dist/core/messages/pt/analysts/map-reversion-extra-messages.js +6 -6
- package/dist/core/messages/pt/analysts/map-reversion-extra-messages.js.map +1 -1
- package/dist/core/messages/pt/analysts/report-github-actions-messages.d.ts +2 -2
- package/dist/core/messages/pt/analysts/report-github-actions-messages.js +2 -2
- package/dist/core/messages/pt/analysts/report-github-actions-messages.js.map +1 -1
- package/dist/core/messages/pt/analysts/scorer-messages.d.ts +45 -45
- package/dist/core/messages/pt/analysts/scorer-messages.js +49 -49
- package/dist/core/messages/pt/analysts/scorer-messages.js.map +1 -1
- package/dist/core/messages/pt/cli/cli-command-convert-messages.d.ts +1 -1
- package/dist/core/messages/pt/cli/cli-command-convert-messages.js +1 -1
- package/dist/core/messages/pt/cli/cli-command-convert-messages.js.map +1 -1
- package/dist/core/messages/pt/cli/cli-command-format-messages.d.ts +1 -1
- package/dist/core/messages/pt/cli/cli-command-format-messages.js +1 -1
- package/dist/core/messages/pt/cli/cli-command-format-messages.js.map +1 -1
- package/dist/core/messages/pt/cli/cli-command-github-actions-messages.d.ts +1 -1
- package/dist/core/messages/pt/cli/cli-command-github-actions-messages.js +4 -4
- package/dist/core/messages/pt/cli/cli-command-github-actions-messages.js.map +1 -1
- package/dist/core/messages/pt/cli/cli-command-update-messages.d.ts +2 -2
- package/dist/core/messages/pt/cli/cli-command-update-messages.js +2 -2
- package/dist/core/messages/pt/cli/cli-command-update-messages.js.map +1 -1
- package/dist/core/messages/pt/cli/cli-flags-validator-messages.d.ts +3 -3
- package/dist/core/messages/pt/cli/cli-flags-validator-messages.js +3 -3
- package/dist/core/messages/pt/cli/cli-flags-validator-messages.js.map +1 -1
- package/dist/core/messages/pt/core/correcoes-messages.js +2 -2
- package/dist/core/messages/pt/core/correcoes-messages.js.map +1 -1
- package/dist/core/messages/pt/core/inquisitor-extra-messages.d.ts +2 -2
- package/dist/core/messages/pt/core/inquisitor-extra-messages.js +2 -2
- package/dist/core/messages/pt/core/inquisitor-extra-messages.js.map +1 -1
- package/dist/core/messages/pt/core/parser-extra-messages.d.ts +3 -3
- package/dist/core/messages/pt/core/parser-extra-messages.js +3 -3
- package/dist/core/messages/pt/core/parser-extra-messages.js.map +1 -1
- package/dist/core/messages/pt/guardian/guardian-messages.d.ts +2 -2
- package/dist/core/messages/pt/guardian/guardian-messages.js +2 -2
- package/dist/core/messages/pt/guardian/guardian-messages.js.map +1 -1
- package/dist/core/messages/pt/guardian/watcher-hidden-messages.d.ts +2 -2
- package/dist/core/messages/pt/guardian/watcher-hidden-messages.js +2 -2
- package/dist/core/messages/pt/guardian/watcher-hidden-messages.js.map +1 -1
- package/dist/core/messages/pt/log/log-helper.js.map +1 -1
- package/dist/core/messages/pt/reports/report-async-patterns-messages.d.ts +3 -3
- package/dist/core/messages/pt/reports/report-async-patterns-messages.js +3 -3
- package/dist/core/messages/pt/reports/report-async-patterns-messages.js.map +1 -1
- package/dist/core/messages/pt/shared/plugin-core-messages.d.ts +2 -2
- package/dist/core/messages/pt/shared/plugin-core-messages.js +2 -2
- package/dist/core/messages/pt/shared/plugin-core-messages.js.map +1 -1
- package/dist/core/messages/pt/shared/plugin-registry-messages.d.ts +4 -4
- package/dist/core/messages/pt/shared/plugin-registry-messages.js +4 -4
- package/dist/core/messages/pt/shared/plugin-registry-messages.js.map +1 -1
- package/dist/core/messages/zh/analysts/archetypes-extra-messages.d.ts +2 -2
- package/dist/core/messages/zh/analysts/archetypes-extra-messages.js +2 -2
- package/dist/core/messages/zh/analysts/archetypes-extra-messages.js.map +1 -1
- package/dist/core/messages/zh/analysts/detector-clean-arch-messages.d.ts +4 -4
- package/dist/core/messages/zh/analysts/detector-clean-arch-messages.js +4 -4
- package/dist/core/messages/zh/analysts/detector-clean-arch-messages.js.map +1 -1
- package/dist/core/messages/zh/analysts/detector-js-ts-messages.d.ts +2 -2
- package/dist/core/messages/zh/analysts/detector-js-ts-messages.js +2 -2
- package/dist/core/messages/zh/analysts/detector-js-ts-messages.js.map +1 -1
- package/dist/core/messages/zh/analysts/map-reversion-extra-messages.d.ts +6 -6
- package/dist/core/messages/zh/analysts/map-reversion-extra-messages.js +6 -6
- package/dist/core/messages/zh/analysts/map-reversion-extra-messages.js.map +1 -1
- package/dist/core/messages/zh/analysts/report-github-actions-messages.d.ts +2 -2
- package/dist/core/messages/zh/analysts/report-github-actions-messages.js +2 -2
- package/dist/core/messages/zh/analysts/report-github-actions-messages.js.map +1 -1
- package/dist/core/messages/zh/analysts/scorer-messages.d.ts +45 -45
- package/dist/core/messages/zh/analysts/scorer-messages.js +49 -49
- package/dist/core/messages/zh/analysts/scorer-messages.js.map +1 -1
- package/dist/core/messages/zh/cli/cli-command-analysts-messages.d.ts +2 -2
- package/dist/core/messages/zh/cli/cli-command-analysts-messages.js +2 -2
- package/dist/core/messages/zh/cli/cli-command-analysts-messages.js.map +1 -1
- package/dist/core/messages/zh/cli/cli-command-convert-messages.d.ts +1 -1
- package/dist/core/messages/zh/cli/cli-command-convert-messages.js +1 -1
- package/dist/core/messages/zh/cli/cli-command-convert-messages.js.map +1 -1
- package/dist/core/messages/zh/cli/cli-command-format-messages.d.ts +1 -1
- package/dist/core/messages/zh/cli/cli-command-format-messages.js +1 -1
- package/dist/core/messages/zh/cli/cli-command-format-messages.js.map +1 -1
- package/dist/core/messages/zh/cli/cli-command-github-actions-messages.d.ts +1 -1
- package/dist/core/messages/zh/cli/cli-command-github-actions-messages.js +4 -4
- package/dist/core/messages/zh/cli/cli-command-github-actions-messages.js.map +1 -1
- package/dist/core/messages/zh/cli/cli-command-update-messages.d.ts +2 -2
- package/dist/core/messages/zh/cli/cli-command-update-messages.js +2 -2
- package/dist/core/messages/zh/cli/cli-command-update-messages.js.map +1 -1
- package/dist/core/messages/zh/cli/cli-flags-validator-messages.d.ts +3 -3
- package/dist/core/messages/zh/cli/cli-flags-validator-messages.js +3 -3
- package/dist/core/messages/zh/cli/cli-flags-validator-messages.js.map +1 -1
- package/dist/core/messages/zh/core/correcoes-messages.js +2 -2
- package/dist/core/messages/zh/core/correcoes-messages.js.map +1 -1
- package/dist/core/messages/zh/core/inquisitor-extra-messages.d.ts +2 -2
- package/dist/core/messages/zh/core/inquisitor-extra-messages.js +2 -2
- package/dist/core/messages/zh/core/inquisitor-extra-messages.js.map +1 -1
- package/dist/core/messages/zh/core/parser-extra-messages.d.ts +3 -3
- package/dist/core/messages/zh/core/parser-extra-messages.js +3 -3
- package/dist/core/messages/zh/core/parser-extra-messages.js.map +1 -1
- package/dist/core/messages/zh/guardian/guardian-messages.d.ts +2 -2
- package/dist/core/messages/zh/guardian/guardian-messages.js +2 -2
- package/dist/core/messages/zh/guardian/guardian-messages.js.map +1 -1
- package/dist/core/messages/zh/guardian/watcher-hidden-messages.d.ts +2 -2
- package/dist/core/messages/zh/guardian/watcher-hidden-messages.js +2 -2
- package/dist/core/messages/zh/guardian/watcher-hidden-messages.js.map +1 -1
- package/dist/core/messages/zh/log/log-helper.js.map +1 -1
- package/dist/core/messages/zh/reports/report-async-patterns-messages.d.ts +3 -3
- package/dist/core/messages/zh/reports/report-async-patterns-messages.js +3 -3
- package/dist/core/messages/zh/reports/report-async-patterns-messages.js.map +1 -1
- package/dist/core/messages/zh/shared/plugin-core-messages.d.ts +2 -2
- package/dist/core/messages/zh/shared/plugin-core-messages.js +2 -2
- package/dist/core/messages/zh/shared/plugin-core-messages.js.map +1 -1
- package/dist/core/messages/zh/shared/plugin-registry-messages.d.ts +4 -4
- package/dist/core/messages/zh/shared/plugin-registry-messages.js +4 -4
- package/dist/core/messages/zh/shared/plugin-registry-messages.js.map +1 -1
- package/dist/core/parsing/utils.d.ts +3 -3
- package/dist/core/workers/worker-pool.js +1 -1
- package/dist/core/workers/worker-pool.js.map +1 -1
- package/dist/guardian/baseline.js.map +1 -1
- package/dist/guardian/constants.js.map +1 -1
- package/dist/guardian/diff.js.map +1 -1
- package/dist/reports/analise-async-patterns.js +1 -1
- package/dist/reports/analise-async-patterns.js.map +1 -1
- package/dist/reports/filter-smart.js.map +1 -1
- package/dist/reports/report-caretaker-health.js +1 -1
- package/dist/reports/report-caretaker-health.js.map +1 -1
- package/dist/shared/plugins/init.js.map +1 -1
- package/package.json +6 -6
- package/out/404/index.html +0 -1
- package/out/404.html +0 -1
- package/out/__next.__PAGE__.txt +0 -9
- package/out/__next._full.txt +0 -18
- package/out/__next._head.txt +0 -5
- package/out/__next._index.txt +0 -6
- package/out/__next._tree.txt +0 -3
- package/out/_next/static/chunks/05-c3ty_6dwfk.js +0 -1
- package/out/_next/static/chunks/0cz1d0mv5g_q7.js +0 -1
- package/out/_next/static/chunks/1061ff024jzvu.js +0 -2
- package/out/_next/static/chunks/14mrh2-p_w84d.js +0 -1
- package/out/_next/static/chunks/15orcrkp-_9ct.js +0 -4
- package/out/_next/static/chunks/1jq4o6yq14o4c.js +0 -31
- package/out/_next/static/chunks/1l-dhswmn6dl_.js +0 -11
- package/out/_next/static/chunks/1rxncug86bump.js +0 -1
- package/out/_next/static/chunks/2n-4qa9h44lgj.js +0 -1
- package/out/_next/static/chunks/3n7dm2ojtyzwn.js +0 -1
- package/out/_next/static/chunks/3uta7d_6k863-.css +0 -1
- package/out/_next/static/chunks/turbopack-2xb6mmb6_q43u.js +0 -1
- package/out/_next/static/media/icon-1.008jpsm4iakzh.png +0 -0
- package/out/_next/static/sHP-sIMshwWXMCtdszRWm/_buildManifest.js +0 -11
- package/out/_next/static/sHP-sIMshwWXMCtdszRWm/_clientMiddlewareManifest.js +0 -1
- package/out/_next/static/sHP-sIMshwWXMCtdszRWm/_ssgManifest.js +0 -1
- package/out/_not-found/__next._full.txt +0 -16
- package/out/_not-found/__next._head.txt +0 -5
- package/out/_not-found/__next._index.txt +0 -6
- package/out/_not-found/__next._not-found.__PAGE__.txt +0 -5
- package/out/_not-found/__next._not-found.txt +0 -5
- package/out/_not-found/__next._tree.txt +0 -3
- package/out/_not-found/index.html +0 -1
- package/out/_not-found/index.txt +0 -16
- package/out/changelog/__next._full.txt +0 -573
- package/out/changelog/__next._head.txt +0 -5
- package/out/changelog/__next._index.txt +0 -6
- package/out/changelog/__next._tree.txt +0 -4
- package/out/changelog/__next.changelog.__PAGE__.txt +0 -560
- package/out/changelog/__next.changelog.txt +0 -5
- package/out/changelog/index.html +0 -550
- package/out/changelog/index.txt +0 -573
- package/out/github/dashboard/__next._full.txt +0 -20
- package/out/github/dashboard/__next._head.txt +0 -5
- package/out/github/dashboard/__next._index.txt +0 -6
- package/out/github/dashboard/__next._tree.txt +0 -3
- package/out/github/dashboard/__next.github.dashboard.__PAGE__.txt +0 -9
- package/out/github/dashboard/__next.github.dashboard.txt +0 -4
- package/out/github/dashboard/__next.github.txt +0 -5
- package/out/github/dashboard/index.html +0 -1
- package/out/github/dashboard/index.txt +0 -20
- package/out/index.html +0 -1
- package/out/index.txt +0 -18
- package/out/privacy-policy/__next._full.txt +0 -38
- package/out/privacy-policy/__next._head.txt +0 -5
- package/out/privacy-policy/__next._index.txt +0 -6
- package/out/privacy-policy/__next._tree.txt +0 -4
- package/out/privacy-policy/__next.privacy-policy.__PAGE__.txt +0 -23
- package/out/privacy-policy/__next.privacy-policy.txt +0 -5
- package/out/privacy-policy/index.html +0 -1
- package/out/privacy-policy/index.txt +0 -38
- package/out/terms-of-use/__next._full.txt +0 -37
- package/out/terms-of-use/__next._head.txt +0 -5
- package/out/terms-of-use/__next._index.txt +0 -6
- package/out/terms-of-use/__next._tree.txt +0 -4
- package/out/terms-of-use/__next.terms-of-use.__PAGE__.txt +0 -18
- package/out/terms-of-use/__next.terms-of-use.txt +0 -5
- package/out/terms-of-use/index.html +0 -1
- package/out/terms-of-use/index.txt +0 -37
|
@@ -400,21 +400,21 @@ function gerarSugestoesMelhoria(tecnologia, evidencias) {
|
|
|
400
400
|
sugestoes.push('[CHAVE-INGLESA] Configurar intents específicos no Discord Client para melhor performance');
|
|
401
401
|
}
|
|
402
402
|
if (!evidencias.some(erro => erro.valor.includes('command'))) {
|
|
403
|
-
sugestoes.push('
|
|
403
|
+
sugestoes.push('[FOLDER] Estruturar commands em pasta dedicada para organização');
|
|
404
404
|
}
|
|
405
405
|
if (!evidencias.some(erro => erro.valor.includes('rate'))) {
|
|
406
|
-
sugestoes.push('
|
|
406
|
+
sugestoes.push('[BOLT] Implementar rate limiting para evitar banimento por spam');
|
|
407
407
|
}
|
|
408
408
|
break;
|
|
409
409
|
case 'express-api':
|
|
410
410
|
if (!evidencias.some(erro => erro.valor.includes('helmet'))) {
|
|
411
|
-
sugestoes.push('
|
|
411
|
+
sugestoes.push('[SHIELD] Adicionar helmet para headers de segurança');
|
|
412
412
|
}
|
|
413
413
|
if (!evidencias.some(erro => erro.valor.includes('cors'))) {
|
|
414
|
-
sugestoes.push('
|
|
414
|
+
sugestoes.push('[GLOBE] Configurar CORS adequadamente para APIs');
|
|
415
415
|
}
|
|
416
416
|
if (!evidencias.some(erro => erro.valor.includes('joi') && erro.valor.includes('swagger'))) {
|
|
417
|
-
sugestoes.push('
|
|
417
|
+
sugestoes.push('[LIST] Implementar validação com Joi e documentação Swagger');
|
|
418
418
|
}
|
|
419
419
|
break;
|
|
420
420
|
case 'cli-modular':
|
|
@@ -433,10 +433,10 @@ function gerarSugestoesMelhoria(tecnologia, evidencias) {
|
|
|
433
433
|
sugestoes.push('[BLOQUEADO] Implementar preload script para comunicação segura');
|
|
434
434
|
}
|
|
435
435
|
if (!evidencias.some(erro => erro.valor.includes('contextIsolation'))) {
|
|
436
|
-
sugestoes.push('
|
|
436
|
+
sugestoes.push('[SHIELD] Habilitar context isolation para segurança');
|
|
437
437
|
}
|
|
438
438
|
if (!evidencias.some(erro => erro.valor.includes('updater'))) {
|
|
439
|
-
sugestoes.push('
|
|
439
|
+
sugestoes.push('[REFRESH] Implementar auto-updater para atualizações automáticas');
|
|
440
440
|
}
|
|
441
441
|
break;
|
|
442
442
|
}
|
|
@@ -448,7 +448,7 @@ function detectarProblemas(tecnologia, evidencias, arquivos) {
|
|
|
448
448
|
case 'discord-bot':
|
|
449
449
|
for (const arquivo of arquivos) {
|
|
450
450
|
if (arquivo.content?.includes('token') && !arquivo.content.includes('process.env')) {
|
|
451
|
-
problemas.push(
|
|
451
|
+
problemas.push(`[ALERT] Possível token hardcoded em ${arquivo.relPath}`);
|
|
452
452
|
}
|
|
453
453
|
}
|
|
454
454
|
break;
|
|
@@ -465,10 +465,10 @@ function detectarProblemas(tecnologia, evidencias, arquivos) {
|
|
|
465
465
|
case 'electron-app':
|
|
466
466
|
for (const arquivo of arquivos) {
|
|
467
467
|
if (arquivo.content?.includes('nodeIntegration: true')) {
|
|
468
|
-
problemas.push(
|
|
468
|
+
problemas.push(`[ALERT] nodeIntegration habilitado em ${arquivo.relPath} - risco de segurança`);
|
|
469
469
|
}
|
|
470
470
|
if (arquivo.content?.includes('contextIsolation: false')) {
|
|
471
|
-
problemas.push(
|
|
471
|
+
problemas.push(`[ALERT] contextIsolation desabilitado em ${arquivo.relPath} - vulnerabilidade`);
|
|
472
472
|
}
|
|
473
473
|
}
|
|
474
474
|
break;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detector-context-smart.js","sourceRoot":"","sources":["../../../../src/analysts/js-ts/detectors/detector-context-smart.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\n/**\n * Sistema Inteligente de Detecção de Arquétipos por Contexto\n *\n * Combina múltiplas evidências para inferir corretamente o tipo de projeto:\n * - Análise de dependências (package.json)\n * - Padrões de código (imports, exports, funcionalidades)\n * - Estrutura de arquivos e nomenclatura\n * - Configurações específicas de tecnologia\n * - Contexto de execução e entry points\n */\n\nimport type { NodePath } from '@babel/traverse';\nimport type { ExportDeclaration, ImportDeclaration, Program } from '@babel/types';\nimport { config, traverse } from '@core/config';\nimport { getMessages } from '@core/messages';\n\nimport type { EvidenciaContexto, FileEntryWithAst, PackageJson, ResultadoDeteccaoContextual } from '@';\n\nconst {\n DetectorContextoExtraMensagens\n} = getMessages();\n\n// Re-exporta os tipos para compatibilidade\nexport type { EvidenciaContexto, ResultadoDeteccaoContextual };\n\n/**\n * Padrões específicos de detecção por tecnologia\n */\nconst PADROES_TECNOLOGIA = {\n 'discord-bot': {\n dependencias: ['discord.js', '@discordjs/builders', '@discordjs/rest'],\n imports: ['discord.js', 'discord-api-types'],\n exports: [],\n estrutura: ['commands', 'events', 'handlers'],\n configs: ['bot.js', 'bot.ts', 'config/bot'],\n scripts: ['start:bot', 'dev:bot'],\n codigoPatterns: [/Client\\(\\s*\\{[\\s\\S]*intents/i, /\\.login\\s*\\(\\s*process\\.env/i, /interaction\\.reply/i, /message\\.reply/i],\n // Sinais que indicam que NÃO é um bot Discord (é uma CLI)\n antiPatterns: [/new\\s+Command\\(/i,\n // Commander.js\n /program\\.parse/i,\n // CLI parsing\n /\\.option\\s*\\(/i,\n // CLI options\n /bin\\/index\\.(js|ts)/i // Binary entry point\n ]\n },\n 'telegram-bot': {\n dependencias: ['telegraf', 'grammy', 'node-telegram-bot-api'],\n imports: ['telegraf', 'grammy'],\n exports: [],\n estrutura: ['scenes', 'handlers', 'middleware'],\n configs: ['bot.js', 'bot.ts'],\n scripts: ['start:bot'],\n codigoPatterns: [/new\\s+Telegraf/i, /bot\\.command/i, /ctx\\.reply/i, /\\.telegram\\.sendMessage/i],\n // Sinais que indicam que NÃO é um bot Telegram\n antiPatterns: [/new\\s+Command\\(/i, /program\\.parse/i, /\\.option\\s*\\(/i, /bin\\/index\\.(js|ts)/i]\n },\n 'express-api': {\n dependencias: ['express', 'cors', 'helmet', 'joi', 'swagger', 'express-validator', 'multer', 'compression'],\n imports: ['express', 'cors', 'helmet', 'body-parser', 'cookie-parser'],\n exports: ['app', 'server', 'router'],\n estrutura: ['routes', 'controllers', 'middleware', 'models', 'services', 'utils', 'config'],\n configs: ['server.js', 'app.js', 'index.js', 'src/server.js', 'src/app.js'],\n scripts: ['start', 'dev', 'serve', 'test'],\n codigoPatterns: [/express\\(\\)/i, /app\\.use\\(/i, /app\\.(get|post|put|delete|patch)\\(/i, /res\\.(json|send|status|sendStatus)/i, /req\\.(body|params|query|headers)/i, /router\\.(get|post|put|delete)/i, /middleware/i, /cors\\(/i, /helmet\\(/i],\n antiPatterns: []\n },\n 'fastify-api': {\n dependencias: ['fastify', '@fastify/cors', '@fastify/helmet', '@fastify/jwt', '@fastify/rate-limit', '@fastify/swagger'],\n imports: ['fastify', '@fastify/cors', '@fastify/helmet'],\n exports: ['app', 'server', 'fastify'],\n estrutura: ['routes', 'plugins', 'handlers', 'schemas', 'services', 'utils'],\n configs: ['server.js', 'app.js', 'index.js', 'src/server.js', 'src/app.js'],\n scripts: ['start', 'dev', 'serve', 'test'],\n codigoPatterns: [/fastify\\(\\)/i, /\\.register\\(/i, /reply\\.(send|code)/i, /\\.listen\\(\\s*\\d+/i, /fastify\\.(get|post|put|delete|patch)/i, /request\\.(body|params|query|headers)/i, /addHook/i, /setValidatorCompiler/i, /setSerializerCompiler/i],\n antiPatterns: []\n },\n 'cli-modular': {\n dependencias: ['commander', 'yargs', 'inquirer', 'chalk', 'ora', 'prompts'],\n imports: ['commander', 'yargs', 'inquirer'],\n exports: [],\n estrutura: ['cli', 'cli/commands', 'bin', 'commands'],\n configs: ['cli.js', 'cli.ts', 'bin/', 'bin/index.js', 'bin/index.ts'],\n scripts: ['build', 'start', 'dev'],\n codigoPatterns: [/new\\s+Command\\(/i, /\\.command\\s*\\(/i, /\\.option\\s*\\(/i, /process\\.argv/i, /\\.parse\\s*\\(/i, /\\.action\\s*\\(/i, /\\.version\\s*\\(/i, /\\.description\\s*\\(/i],\n // Sinais que indicam que NÃO é um bot\n antiPatterns: [/Client\\(\\s*\\{[\\s\\S]*intents/i,\n // Discord client\n /new\\s+Telegraf/i,\n // Telegram bot\n /bot\\.command/i,\n // Bot commands\n /interaction\\.reply/i,\n // Discord interactions\n /ctx\\.reply/i // Telegram context\n ]\n },\n 'electron-app': {\n dependencias: ['electron', 'electron-builder', 'electron-updater'],\n imports: ['electron'],\n exports: [],\n estrutura: ['src/main', 'src/renderer', 'src/preload'],\n configs: ['main.js', 'main.ts', 'electron.js'],\n scripts: ['electron', 'build:electron', 'pack'],\n codigoPatterns: [/new\\s+BrowserWindow/i, /app\\.whenReady/i, /ipcMain\\.handle/i, /contextBridge\\.exposeInMainWorld/i],\n antiPatterns: []\n },\n 'next-fullstack': {\n dependencias: ['next', 'react', 'react-dom', '@types/react', '@types/node', 'typescript'],\n imports: ['next', 'react', 'next/router', 'next/link', 'next/head'],\n exports: [],\n estrutura: ['pages', 'app', 'api', 'components', 'lib', 'utils', 'styles', 'public', 'prisma'],\n configs: ['next.config.js', 'next.config.ts', 'next.config.mjs', 'next-env.d.ts', 'tailwind.config.js'],\n scripts: ['dev', 'build', 'start', 'lint', 'type-check'],\n codigoPatterns: [/export\\s+default\\s+function.*Page/i, /getServerSideProps/i, /getStaticProps/i, /getStaticPaths/i, /NextApiRequest/i, /NextApiResponse/i, /useRouter/i, /next\\/head/i, /next\\/link/i, /export\\s+default\\s+function\\s+Page/i,\n // App Router\n /export\\s+default\\s+function\\s+Layout/i,\n // App Router Layout\n /export\\s+default\\s+function\\s+Loading/i,\n // App Router Loading\n /export\\s+default\\s+function\\s+Error/i,\n // App Router Error\n /export\\s+default\\s+function\\s+NotFound/i,\n // App Router Not Found\n /metadata\\s*=/i,\n // App Router metadata\n /generateStaticParams/i,\n // App Router static generation\n /generateMetadata/i // App Router metadata generation\n ],\n antiPatterns: []\n },\n 'react-spa': {\n dependencias: ['react', 'react-dom', 'react-router', 'vite'],\n imports: ['react', 'react-dom'],\n exports: [],\n estrutura: ['src/components', 'src/pages', 'src/hooks'],\n configs: ['vite.config.js', 'webpack.config.js'],\n scripts: ['dev', 'build', 'preview'],\n codigoPatterns: [/ReactDOM\\.render/i, /createRoot/i, /useState/i, /useEffect/i],\n antiPatterns: []\n },\n 'nest-api': {\n dependencias: ['@nestjs/core', '@nestjs/common', '@nestjs/platform-express'],\n imports: ['@nestjs/core', '@nestjs/common'],\n exports: [],\n estrutura: ['src/modules', 'src/controllers', 'src/services'],\n configs: ['main.ts', 'app.module.ts'],\n scripts: ['start', 'start:dev', 'build'],\n codigoPatterns: [/@Controller\\(/i, /@Injectable\\(/i, /@Module\\(/i, /NestFactory\\.create/i],\n antiPatterns: []\n },\n 'koa-api': {\n dependencias: ['koa', 'koa-router', 'koa-cors', 'koa-helmet', 'koa-bodyparser'],\n imports: ['koa', 'koa-router', 'koa-cors', 'koa-helmet'],\n exports: ['app', 'server'],\n estrutura: ['routes', 'controllers', 'middleware', 'models', 'services'],\n configs: ['server.js', 'app.js', 'index.js'],\n scripts: ['start', 'dev', 'serve'],\n codigoPatterns: [/new\\s+Koa\\(\\)/i, /app\\.use\\(/i, /router\\.(get|post|put|delete)/i, /ctx\\.(body|status|set)/i, /next\\(\\)/i, /middleware/i],\n antiPatterns: []\n },\n 'hapi-api': {\n dependencias: ['@hapi/hapi', 'joi', 'boom'],\n imports: ['@hapi/hapi', 'joi', 'boom'],\n exports: ['server', 'routes'],\n estrutura: ['routes', 'controllers', 'plugins', 'models'],\n configs: ['server.js', 'index.js'],\n scripts: ['start', 'dev', 'serve'],\n codigoPatterns: [/Hapi\\.server/i, /server\\.route/i, /handler:\\s*async/i, /request\\.(payload|params|query)/i, /h\\.response/i, /Joi\\.object/i],\n antiPatterns: []\n },\n 'serverless-api': {\n dependencias: ['serverless', 'serverless-offline', '@types/aws-lambda', 'aws-sdk'],\n imports: ['aws-lambda', 'aws-sdk'],\n exports: ['handler'],\n estrutura: ['src/handlers', 'src/functions', 'src/lib'],\n configs: ['serverless.yml', 'serverless.ts'],\n scripts: ['deploy', 'offline', 'invoke'],\n codigoPatterns: [/exports\\.handler/i, /APIGatewayProxyEvent/i, /APIGatewayProxyResult/i, /Context/i, /Callback/i, /async\\s+\\(event/i],\n antiPatterns: []\n },\n 'vue-spa': {\n dependencias: ['vue', '@vue/cli-service', 'vue-router', 'vuex', 'pinia'],\n imports: ['vue', 'vue-router', 'vuex', 'pinia'],\n exports: [],\n estrutura: ['src/components', 'src/views', 'src/router', 'src/store', 'src/composables', 'public'],\n configs: ['vue.config.js', 'vue.config.ts'],\n scripts: ['serve', 'build', 'lint'],\n codigoPatterns: [/createApp\\(/i, /<template>/i, /<script>/i, /<style/i, /defineComponent/i, /setup\\(\\)/i, /ref\\(/i, /reactive\\(/i, /computed\\(/i, /watch\\(/i, /onMounted/i, /onUnmounted/i],\n antiPatterns: []\n },\n 'nuxt-app': {\n dependencias: ['nuxt', 'nuxt3', '@nuxt/devtools', '@nuxtjs/tailwindcss'],\n imports: ['nuxt', '@nuxt/kit'],\n exports: [],\n estrutura: ['pages', 'components', 'layouts', 'plugins', 'middleware', 'composables', 'server/api'],\n configs: ['nuxt.config.js', 'nuxt.config.ts'],\n scripts: ['dev', 'build', 'generate', 'preview'],\n codigoPatterns: [/defineNuxtConfig/i, /useHead/i, /useState/i, /useFetch/i, /useAsyncData/i, /navigateTo/i, /<NuxtPage/i, /<NuxtLink/i, /definePageMeta/i, /server\\/api/i],\n antiPatterns: []\n },\n 'vite-vue': {\n dependencias: ['vue', 'vite', '@vitejs/plugin-vue', 'vue-router', 'pinia'],\n imports: ['vue', 'vite', '@vitejs/plugin-vue'],\n exports: [],\n estrutura: ['src/components', 'src/views', 'src/router', 'src/stores', 'src/composables', 'src/assets'],\n configs: ['vite.config.js', 'vite.config.ts', 'index.html'],\n scripts: ['dev', 'build', 'preview'],\n codigoPatterns: [/createApp\\(/i, /<template>/i, /<script setup/i, /<style scoped/i, /defineComponent/i, /setup\\(\\)/i, /ref\\(/i, /reactive\\(/i, /computed\\(/i],\n antiPatterns: []\n },\n 'hono-api': {\n dependencias: ['hono', '@hono/node-server', '@hono/zod-validator'],\n imports: ['hono', 'hono/cors', 'hono/logger'],\n exports: ['app'],\n estrutura: ['src/routes', 'src/middleware'],\n configs: ['src/index.ts', 'src/index.js'],\n scripts: ['dev', 'start'],\n codigoPatterns: [/new\\s+Hono\\(\\)/i, /app\\.(get|post|put|delete|patch|use)\\(/i, /c\\.(json|text|html|redirect)/i, /return\\s+c\\.json/i],\n antiPatterns: []\n },\n 'prisma-orm': {\n dependencias: ['@prisma/client', 'prisma'],\n imports: ['@prisma/client'],\n exports: ['prisma'],\n estrutura: ['prisma', 'prisma/schema.prisma'],\n configs: ['schema.prisma'],\n scripts: ['prisma:generate', 'prisma:migrate'],\n codigoPatterns: [/new\\s+PrismaClient\\(\\)/i, /prisma\\.\\w+\\.(findMany|findUnique|create|update|delete)/i],\n antiPatterns: []\n },\n 'trpc-api': {\n dependencias: ['@trpc/server', '@trpc/client', '@trpc/react-query'],\n imports: ['@trpc/server', '@trpc/client'],\n exports: ['appRouter', 't'],\n estrutura: ['src/server/trpc', 'src/trpc'],\n configs: [],\n scripts: [],\n codigoPatterns: [/initTRPC\\.create\\(\\)/i, /t\\.router\\(\\{/i, /t\\.procedure/i, /publicProcedure/i],\n antiPatterns: []\n },\n 'zod-validation': {\n dependencias: ['zod'],\n imports: ['zod'],\n exports: [],\n estrutura: [],\n configs: [],\n scripts: [],\n codigoPatterns: [/z\\.object\\(\\{/i, /z\\.string\\(\\)/i, /z\\.infer<typeof/i, /\\.parse\\(/i, /\\.safeParse\\(/i],\n antiPatterns: []\n },\n 'vitest-testing': {\n dependencias: ['vitest', '@vitest/ui', '@vitest/coverage-v8'],\n imports: ['vitest'],\n exports: [],\n estrutura: ['tests', '__tests__', 'src/__tests__'],\n configs: ['vitest.config.ts', 'vitest.config.js'],\n scripts: ['test', 'test:ui', 'coverage'],\n codigoPatterns: [/describe\\(/i, /it\\(/i, /test\\(/i, /expect\\(/i, /vi\\.fn\\(\\)/i, /vi\\.mock\\(/i],\n antiPatterns: []\n }\n};\nfunction analisarDependencias(packageJson?: PackageJson): EvidenciaContexto[] {\n const evidencias: EvidenciaContexto[] = [];\n if (!packageJson) return evidencias;\n const deps = {\n ...(packageJson.dependencies as Record<string, string> || {}),\n ...(packageJson.devDependencies as Record<string, string> || {})\n };\n if (config.VERBOSE) {\n console.log(DetectorContextoExtraMensagens.debugDependencias, Object.keys(deps));\n }\n for (const [tecnologia, padroes] of Object.entries(PADROES_TECNOLOGIA)) {\n for (const dep of padroes.dependencias) {\n if (deps[dep]) {\n evidencias.push({\n tipo: 'dependencia',\n valor: dep,\n confianca: 0.8,\n tecnologia,\n localizacao: 'package.json'\n });\n }\n }\n }\n return evidencias;\n}\nfunction analisarScripts(packageJson?: PackageJson): EvidenciaContexto[] {\n const evidencias: EvidenciaContexto[] = [];\n if (!packageJson) return evidencias;\n const scripts = packageJson.scripts as Record<string, string> || {};\n for (const [tecnologia, padroes] of Object.entries(PADROES_TECNOLOGIA)) {\n for (const script of padroes.scripts) {\n if (Object.keys(scripts).some(key => key.includes(script) || scripts[key]?.includes(script))) {\n evidencias.push({\n tipo: 'script',\n valor: script,\n confianca: 0.6,\n tecnologia,\n localizacao: 'package.json'\n });\n }\n }\n }\n return evidencias;\n}\nfunction analisarEstrutura(estruturaDetectada: string[]): EvidenciaContexto[] {\n const evidencias: EvidenciaContexto[] = [];\n for (const [tecnologia, padroes] of Object.entries(PADROES_TECNOLOGIA)) {\n for (const estrutura of padroes.estrutura) {\n // Verificação mais rigorosa para evitar falsos positivos\n const matchExato = estruturaDetectada?.find(dir => {\n // Match exato do caminho\n if (dir === estrutura) return true;\n\n // Match no final do caminho (ex: src/cli/commands matcheia 'commands')\n if (dir.endsWith(`/${estrutura}`)) return true;\n\n // Match no início seguido de / (ex: commands/subdir matcheia 'commands')\n if (dir.startsWith(`${estrutura}/`)) return true;\n\n // Para padrões que incluem /, verificar match rigoroso de subcaminho\n if (estrutura.includes('/')) {\n // Normalizar separadores para comparação\n const estruturaNorm = estrutura.replace(/\\\\/g, '/');\n const dirNorm = dir.replace(/\\\\/g, '/');\n\n // Verificar se é subcaminho exato\n if (dirNorm === estruturaNorm) return true;\n if (dirNorm.endsWith(`/${estruturaNorm}`)) return true;\n if (dirNorm.startsWith(`${estruturaNorm}/`)) return true;\n }\n return false;\n });\n if (matchExato) {\n evidencias.push({\n tipo: 'estrutura',\n valor: estrutura,\n confianca: 0.7,\n tecnologia,\n localizacao: matchExato\n });\n }\n }\n }\n return evidencias;\n}\nfunction analisarImportsExports(arquivos: FileEntryWithAst[]): EvidenciaContexto[] {\n const evidencias: EvidenciaContexto[] = [];\n for (const arquivo of arquivos) {\n if (!arquivo.ast || !('node' in arquivo.ast) || !arquivo.ast.node || arquivo.ast.node.type !== 'Program') continue;\n const programa = arquivo.ast.node as Program;\n const imports: string[] = [];\n const exports: string[] = [];\n traverse(programa, {\n ImportDeclaration(path: NodePath<ImportDeclaration>) {\n const node = path.node;\n if (typeof node.source.value === 'string') {\n imports.push(node.source.value);\n }\n },\n ExportDeclaration(path: NodePath<ExportDeclaration>) {\n const node = path.node as ExportDeclaration;\n // Analisa exports nomeados e padrão\n if ('declaration' in node && node.declaration) {\n if ('id' in node.declaration && node.declaration.id && 'name' in node.declaration.id) {\n if (typeof node.declaration.id.name === 'string') exports.push(node.declaration.id.name);\n }\n }\n }\n });\n\n // Verifica evidências nos imports\n for (const [tecnologia, padroes] of Object.entries(PADROES_TECNOLOGIA)) {\n for (const importEsperado of padroes.imports) {\n if (imports.some(imp => imp.includes(importEsperado))) {\n evidencias.push({\n tipo: 'import',\n valor: importEsperado,\n confianca: 0.9,\n tecnologia,\n localizacao: arquivo.relPath\n });\n }\n }\n for (const exportEsperado of padroes.exports) {\n if (exports.some(exp => exp.includes(exportEsperado))) {\n evidencias.push({\n tipo: 'export',\n valor: exportEsperado,\n confianca: 0.8,\n tecnologia,\n localizacao: arquivo.relPath\n });\n }\n }\n }\n }\n return evidencias;\n}\nfunction analisarPadroesCodigo(arquivos: FileEntryWithAst[]): EvidenciaContexto[] {\n const evidencias: EvidenciaContexto[] = [];\n for (const arquivo of arquivos) {\n if (!arquivo.content) continue;\n for (const [tecnologia, padroes] of Object.entries(PADROES_TECNOLOGIA)) {\n for (const pattern of padroes.codigoPatterns) {\n if (pattern.test(arquivo.content)) {\n evidencias.push({\n tipo: 'codigo',\n valor: pattern.source,\n confianca: 0.85,\n tecnologia,\n localizacao: arquivo.relPath\n });\n }\n }\n }\n }\n return evidencias;\n}\n\n/**\n * Verifica se anti-patterns estão presentes no código\n * Anti-patterns indicam que a tecnologia detectada está INCORRETA\n */\nfunction verificarAntiPatterns(arquivos: FileEntryWithAst[], tecnologia: string): boolean {\n const padraoTecnologia = PADROES_TECNOLOGIA[tecnologia as keyof typeof PADROES_TECNOLOGIA];\n if (!padraoTecnologia || !padraoTecnologia.antiPatterns) {\n return false; // Sem anti-patterns definidos\n }\n for (const arquivo of arquivos) {\n if (!arquivo.content) continue;\n\n // Se encontrar qualquer anti-pattern, retorna true (detecção incorreta)\n for (const antiPadrao of padraoTecnologia.antiPatterns) {\n if (antiPadrao.test(arquivo.content)) {\n return true; // Anti-pattern encontrado!\n }\n }\n }\n return false; // Nenhum anti-pattern encontrado\n}\nfunction gerarSugestoesMelhoria(tecnologia: string, evidencias: EvidenciaContexto[]): string[] {\n const sugestoes: string[] = [];\n const _arquivosEncontrados = evidencias.map(erro => erro.localizacao).filter(Boolean);\n switch (tecnologia) {\n case 'discord-bot':\n if (!evidencias.some(erro => erro.valor.includes('intents'))) {\n sugestoes.push('[CHAVE-INGLESA] Configurar intents específicos no Discord Client para melhor performance');\n }\n if (!evidencias.some(erro => erro.valor.includes('command'))) {\n sugestoes.push('📁 Estruturar commands em pasta dedicada para organização');\n }\n if (!evidencias.some(erro => erro.valor.includes('rate'))) {\n sugestoes.push('⚡ Implementar rate limiting para evitar banimento por spam');\n }\n break;\n case 'express-api':\n if (!evidencias.some(erro => erro.valor.includes('helmet'))) {\n sugestoes.push('🛡️ Adicionar helmet para headers de segurança');\n }\n if (!evidencias.some(erro => erro.valor.includes('cors'))) {\n sugestoes.push('🌐 Configurar CORS adequadamente para APIs');\n }\n if (!evidencias.some(erro => erro.valor.includes('joi') && erro.valor.includes('swagger'))) {\n sugestoes.push('📋 Implementar validação com Joi e documentação Swagger');\n }\n break;\n case 'cli-modular':\n if (!evidencias.some(erro => erro.valor.includes('help'))) {\n sugestoes.push('[PERGUNTA] Implementar comando --help abrangente');\n }\n if (!evidencias.some(erro => erro.valor.includes('version'))) {\n sugestoes.push('[PACOTE] Adicionar comando --version');\n }\n if (!evidencias.some(erro => erro.valor.includes('config'))) {\n sugestoes.push('[CONFIG] Considerar arquivo de configuração para usuários');\n }\n break;\n case 'electron-app':\n if (!evidencias.some(erro => erro.valor.includes('preload'))) {\n sugestoes.push('[BLOQUEADO] Implementar preload script para comunicação segura');\n }\n if (!evidencias.some(erro => erro.valor.includes('contextIsolation'))) {\n sugestoes.push('🛡️ Habilitar context isolation para segurança');\n }\n if (!evidencias.some(erro => erro.valor.includes('updater'))) {\n sugestoes.push('🔄 Implementar auto-updater para atualizações automáticas');\n }\n break;\n }\n return sugestoes;\n}\nfunction detectarProblemas(tecnologia: string, evidencias: EvidenciaContexto[], arquivos: FileEntryWithAst[]): string[] {\n const problemas: string[] = [];\n switch (tecnologia) {\n case 'discord-bot':\n // Verifica se token está hardcoded\n for (const arquivo of arquivos) {\n if (arquivo.content?.includes('token') && !arquivo.content.includes('process.env')) {\n problemas.push(`🚨 Possível token hardcoded em ${arquivo.relPath}`);\n }\n }\n break;\n case 'express-api':\n // Verifica middleware de segurança\n const temHelmet = evidencias.some(erro => erro.valor.includes('helmet'));\n const temCors = evidencias.some(erro => erro.valor.includes('cors'));\n if (!temHelmet) {\n problemas.push('[AVISO] API sem helmet - vulnerável a ataques de header');\n }\n if (!temCors) {\n problemas.push('[AVISO] API sem CORS configurado - possíveis problemas de origem');\n }\n break;\n case 'electron-app':\n // Verifica configurações de segurança\n for (const arquivo of arquivos) {\n if (arquivo.content?.includes('nodeIntegration: true')) {\n problemas.push(`🚨 nodeIntegration habilitado em ${arquivo.relPath} - risco de segurança`);\n }\n if (arquivo.content?.includes('contextIsolation: false')) {\n problemas.push(`🚨 contextIsolation desabilitado em ${arquivo.relPath} - vulnerabilidade`);\n }\n }\n break;\n }\n return problemas;\n}\nfunction calcularConfiancaTotal(evidencias: EvidenciaContexto[]): number {\n if (evidencias.length === 0) return 0;\n const pesosPorTipo = {\n dependencia: 1.0,\n import: 0.9,\n codigo: 0.85,\n export: 0.8,\n estrutura: 0.7,\n script: 0.6,\n config: 0.5\n };\n let somaConfianca = 0;\n let somaPesos = 0;\n for (const evidencia of evidencias) {\n const peso = pesosPorTipo[evidencia.tipo as keyof typeof pesosPorTipo] || 0.5;\n somaConfianca += evidencia.confianca * peso;\n somaPesos += peso;\n }\n return somaPesos > 0 ? somaConfianca / somaPesos : 0;\n}\nexport function detectarContextoInteligente(estruturaDetectada: string[], arquivos: FileEntryWithAst[], packageJson?: PackageJson, options?: {\n quiet?: boolean;\n}): ResultadoDeteccaoContextual[] {\n // DEBUG: Log simples para verificar se está sendo chamado\n if (!options?.quiet && config.VERBOSE) {\n console.log(DetectorContextoExtraMensagens.debugPackageCompleto, JSON.stringify(packageJson, null, 2));\n if (packageJson?.dependencies?.vue) {\n console.log(DetectorContextoExtraMensagens.debugPackageVue, packageJson.dependencies.vue);\n }\n }\n const todasEvidencias: EvidenciaContexto[] = [...analisarDependencias(packageJson), ...analisarScripts(packageJson), ...analisarEstrutura(estruturaDetectada), ...analisarImportsExports(arquivos), ...analisarPadroesCodigo(arquivos)];\n\n // Agrupa evidências por tecnologia\n const evidenciasPorTecnologia = new Map<string, EvidenciaContexto[]>();\n for (const evidencia of todasEvidencias) {\n const tec = evidencia.tecnologia || 'desconhecido';\n if (!evidenciasPorTecnologia.has(tec)) {\n evidenciasPorTecnologia.set(tec, []);\n }\n const tecEvidencias = evidenciasPorTecnologia.get(tec);\n if (tecEvidencias) {\n tecEvidencias.push(evidencia);\n }\n }\n\n // Calcula resultados por tecnologia\n const resultados: ResultadoDeteccaoContextual[] = [];\n for (const [tecnologia, evidencias] of evidenciasPorTecnologia) {\n let confiancaTotal = calcularConfiancaTotal(evidencias);\n\n // Verificação de dependências obrigatórias para evitar falsos positivos\n const padraoTecnologia = PADROES_TECNOLOGIA[tecnologia as keyof typeof PADROES_TECNOLOGIA];\n if (padraoTecnologia && padraoTecnologia.dependencias.length > 0) {\n const temDependenciaObrigatoria = evidencias.some(erro => erro.tipo === 'dependencia' && padraoTecnologia.dependencias.includes(erro.valor));\n\n // Se não tem nenhuma dependência obrigatória, penalizar severamente\n if (!temDependenciaObrigatoria) {\n confiancaTotal *= 0.1; // Reduz confiança para 10%\n }\n }\n\n // 🚨 VERIFICAÇÃO DE ANTI-PATTERNS: Se anti-patterns estão presentes, ELIMINAR detecção\n const temAntiPadrao = verificarAntiPatterns(arquivos, tecnologia);\n if (temAntiPadrao) {\n // Anti-pattern detectado = detecção FALSA, eliminar confiança\n confiancaTotal = 0;\n // Opcional: Adicionar evidência negativa\n evidencias.push({\n tipo: 'codigo',\n valor: 'anti-pattern-detectado',\n confianca: -1.0,\n // Negativa\n tecnologia,\n localizacao: 'código'\n });\n }\n if (confiancaTotal > 0.3) {\n // Threshold mínimo para considerar\n resultados.push({\n tecnologia,\n confiancaTotal,\n evidencias,\n sugestoesMelhoria: gerarSugestoesMelhoria(tecnologia, evidencias),\n problemasDetectados: detectarProblemas(tecnologia, evidencias, arquivos)\n });\n }\n }\n\n // Ordena por confiança decrescente\n return resultados.sort((arquivo, base) => base.confiancaTotal - arquivo.confiancaTotal);\n}\nexport function inferirArquetipoInteligente(estruturaDetectada: string[], arquivos: FileEntryWithAst[], packageJson?: PackageJson, options?: {\n quiet?: boolean;\n}): string {\n const resultados = detectarContextoInteligente(estruturaDetectada, arquivos, packageJson, options);\n if (resultados.length === 0) return 'generico';\n const melhorResultado = resultados[0];\n\n // Mapeia tecnologias para arquétipos oficiais\n const mapeamentoArquetipos: Record<string, string> = {\n 'discord-bot': 'bot',\n 'telegram-bot': 'bot',\n 'express-api': 'api-rest-express',\n 'fastify-api': 'api-rest-express',\n 'nest-api': 'api-rest-express',\n 'koa-api': 'api-rest-express',\n 'hapi-api': 'api-rest-express',\n 'serverless-api': 'api-rest-express',\n 'cli-modular': 'cli-modular',\n 'electron-app': 'electron',\n 'next-fullstack': 'fullstack',\n 'react-spa': 'landing-page',\n 'vue-spa': 'vue-spa',\n 'nuxt-app': 'vue-spa',\n 'vite-vue': 'vue-spa'\n };\n return mapeamentoArquetipos[melhorResultado.tecnologia || 'generico'] || 'generico';\n}"]}
|
|
1
|
+
{"version":3,"file":"detector-context-smart.js","sourceRoot":"","sources":["../../../../src/analysts/js-ts/detectors/detector-context-smart.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\n/**\n * Sistema Inteligente de Detecção de Arquétipos por Contexto\n *\n * Combina múltiplas evidências para inferir corretamente o tipo de projeto:\n * - Análise de dependências (package.json)\n * - Padrões de código (imports, exports, funcionalidades)\n * - Estrutura de arquivos e nomenclatura\n * - Configurações específicas de tecnologia\n * - Contexto de execução e entry points\n */\n\nimport type { NodePath } from '@babel/traverse';\nimport type { ExportDeclaration, ImportDeclaration, Program } from '@babel/types';\nimport { config, traverse } from '@core/config';\nimport { getMessages } from '@core/messages';\n\nimport type { EvidenciaContexto, FileEntryWithAst, PackageJson, ResultadoDeteccaoContextual } from '@';\n\nconst {\n DetectorContextoExtraMensagens\n} = getMessages();\n\n// Re-exporta os tipos para compatibilidade\nexport type { EvidenciaContexto, ResultadoDeteccaoContextual };\n\n/**\n * Padrões específicos de detecção por tecnologia\n */\nconst PADROES_TECNOLOGIA = {\n 'discord-bot': {\n dependencias: ['discord.js', '@discordjs/builders', '@discordjs/rest'],\n imports: ['discord.js', 'discord-api-types'],\n exports: [],\n estrutura: ['commands', 'events', 'handlers'],\n configs: ['bot.js', 'bot.ts', 'config/bot'],\n scripts: ['start:bot', 'dev:bot'],\n codigoPatterns: [/Client\\(\\s*\\{[\\s\\S]*intents/i, /\\.login\\s*\\(\\s*process\\.env/i, /interaction\\.reply/i, /message\\.reply/i],\n // Sinais que indicam que NÃO é um bot Discord (é uma CLI)\n antiPatterns: [/new\\s+Command\\(/i,\n // Commander.js\n /program\\.parse/i,\n // CLI parsing\n /\\.option\\s*\\(/i,\n // CLI options\n /bin\\/index\\.(js|ts)/i // Binary entry point\n ]\n },\n 'telegram-bot': {\n dependencias: ['telegraf', 'grammy', 'node-telegram-bot-api'],\n imports: ['telegraf', 'grammy'],\n exports: [],\n estrutura: ['scenes', 'handlers', 'middleware'],\n configs: ['bot.js', 'bot.ts'],\n scripts: ['start:bot'],\n codigoPatterns: [/new\\s+Telegraf/i, /bot\\.command/i, /ctx\\.reply/i, /\\.telegram\\.sendMessage/i],\n // Sinais que indicam que NÃO é um bot Telegram\n antiPatterns: [/new\\s+Command\\(/i, /program\\.parse/i, /\\.option\\s*\\(/i, /bin\\/index\\.(js|ts)/i]\n },\n 'express-api': {\n dependencias: ['express', 'cors', 'helmet', 'joi', 'swagger', 'express-validator', 'multer', 'compression'],\n imports: ['express', 'cors', 'helmet', 'body-parser', 'cookie-parser'],\n exports: ['app', 'server', 'router'],\n estrutura: ['routes', 'controllers', 'middleware', 'models', 'services', 'utils', 'config'],\n configs: ['server.js', 'app.js', 'index.js', 'src/server.js', 'src/app.js'],\n scripts: ['start', 'dev', 'serve', 'test'],\n codigoPatterns: [/express\\(\\)/i, /app\\.use\\(/i, /app\\.(get|post|put|delete|patch)\\(/i, /res\\.(json|send|status|sendStatus)/i, /req\\.(body|params|query|headers)/i, /router\\.(get|post|put|delete)/i, /middleware/i, /cors\\(/i, /helmet\\(/i],\n antiPatterns: []\n },\n 'fastify-api': {\n dependencias: ['fastify', '@fastify/cors', '@fastify/helmet', '@fastify/jwt', '@fastify/rate-limit', '@fastify/swagger'],\n imports: ['fastify', '@fastify/cors', '@fastify/helmet'],\n exports: ['app', 'server', 'fastify'],\n estrutura: ['routes', 'plugins', 'handlers', 'schemas', 'services', 'utils'],\n configs: ['server.js', 'app.js', 'index.js', 'src/server.js', 'src/app.js'],\n scripts: ['start', 'dev', 'serve', 'test'],\n codigoPatterns: [/fastify\\(\\)/i, /\\.register\\(/i, /reply\\.(send|code)/i, /\\.listen\\(\\s*\\d+/i, /fastify\\.(get|post|put|delete|patch)/i, /request\\.(body|params|query|headers)/i, /addHook/i, /setValidatorCompiler/i, /setSerializerCompiler/i],\n antiPatterns: []\n },\n 'cli-modular': {\n dependencias: ['commander', 'yargs', 'inquirer', 'chalk', 'ora', 'prompts'],\n imports: ['commander', 'yargs', 'inquirer'],\n exports: [],\n estrutura: ['cli', 'cli/commands', 'bin', 'commands'],\n configs: ['cli.js', 'cli.ts', 'bin/', 'bin/index.js', 'bin/index.ts'],\n scripts: ['build', 'start', 'dev'],\n codigoPatterns: [/new\\s+Command\\(/i, /\\.command\\s*\\(/i, /\\.option\\s*\\(/i, /process\\.argv/i, /\\.parse\\s*\\(/i, /\\.action\\s*\\(/i, /\\.version\\s*\\(/i, /\\.description\\s*\\(/i],\n // Sinais que indicam que NÃO é um bot\n antiPatterns: [/Client\\(\\s*\\{[\\s\\S]*intents/i,\n // Discord client\n /new\\s+Telegraf/i,\n // Telegram bot\n /bot\\.command/i,\n // Bot commands\n /interaction\\.reply/i,\n // Discord interactions\n /ctx\\.reply/i // Telegram context\n ]\n },\n 'electron-app': {\n dependencias: ['electron', 'electron-builder', 'electron-updater'],\n imports: ['electron'],\n exports: [],\n estrutura: ['src/main', 'src/renderer', 'src/preload'],\n configs: ['main.js', 'main.ts', 'electron.js'],\n scripts: ['electron', 'build:electron', 'pack'],\n codigoPatterns: [/new\\s+BrowserWindow/i, /app\\.whenReady/i, /ipcMain\\.handle/i, /contextBridge\\.exposeInMainWorld/i],\n antiPatterns: []\n },\n 'next-fullstack': {\n dependencias: ['next', 'react', 'react-dom', '@types/react', '@types/node', 'typescript'],\n imports: ['next', 'react', 'next/router', 'next/link', 'next/head'],\n exports: [],\n estrutura: ['pages', 'app', 'api', 'components', 'lib', 'utils', 'styles', 'public', 'prisma'],\n configs: ['next.config.js', 'next.config.ts', 'next.config.mjs', 'next-env.d.ts', 'tailwind.config.js'],\n scripts: ['dev', 'build', 'start', 'lint', 'type-check'],\n codigoPatterns: [/export\\s+default\\s+function.*Page/i, /getServerSideProps/i, /getStaticProps/i, /getStaticPaths/i, /NextApiRequest/i, /NextApiResponse/i, /useRouter/i, /next\\/head/i, /next\\/link/i, /export\\s+default\\s+function\\s+Page/i,\n // App Router\n /export\\s+default\\s+function\\s+Layout/i,\n // App Router Layout\n /export\\s+default\\s+function\\s+Loading/i,\n // App Router Loading\n /export\\s+default\\s+function\\s+Error/i,\n // App Router Error\n /export\\s+default\\s+function\\s+NotFound/i,\n // App Router Not Found\n /metadata\\s*=/i,\n // App Router metadata\n /generateStaticParams/i,\n // App Router static generation\n /generateMetadata/i // App Router metadata generation\n ],\n antiPatterns: []\n },\n 'react-spa': {\n dependencias: ['react', 'react-dom', 'react-router', 'vite'],\n imports: ['react', 'react-dom'],\n exports: [],\n estrutura: ['src/components', 'src/pages', 'src/hooks'],\n configs: ['vite.config.js', 'webpack.config.js'],\n scripts: ['dev', 'build', 'preview'],\n codigoPatterns: [/ReactDOM\\.render/i, /createRoot/i, /useState/i, /useEffect/i],\n antiPatterns: []\n },\n 'nest-api': {\n dependencias: ['@nestjs/core', '@nestjs/common', '@nestjs/platform-express'],\n imports: ['@nestjs/core', '@nestjs/common'],\n exports: [],\n estrutura: ['src/modules', 'src/controllers', 'src/services'],\n configs: ['main.ts', 'app.module.ts'],\n scripts: ['start', 'start:dev', 'build'],\n codigoPatterns: [/@Controller\\(/i, /@Injectable\\(/i, /@Module\\(/i, /NestFactory\\.create/i],\n antiPatterns: []\n },\n 'koa-api': {\n dependencias: ['koa', 'koa-router', 'koa-cors', 'koa-helmet', 'koa-bodyparser'],\n imports: ['koa', 'koa-router', 'koa-cors', 'koa-helmet'],\n exports: ['app', 'server'],\n estrutura: ['routes', 'controllers', 'middleware', 'models', 'services'],\n configs: ['server.js', 'app.js', 'index.js'],\n scripts: ['start', 'dev', 'serve'],\n codigoPatterns: [/new\\s+Koa\\(\\)/i, /app\\.use\\(/i, /router\\.(get|post|put|delete)/i, /ctx\\.(body|status|set)/i, /next\\(\\)/i, /middleware/i],\n antiPatterns: []\n },\n 'hapi-api': {\n dependencias: ['@hapi/hapi', 'joi', 'boom'],\n imports: ['@hapi/hapi', 'joi', 'boom'],\n exports: ['server', 'routes'],\n estrutura: ['routes', 'controllers', 'plugins', 'models'],\n configs: ['server.js', 'index.js'],\n scripts: ['start', 'dev', 'serve'],\n codigoPatterns: [/Hapi\\.server/i, /server\\.route/i, /handler:\\s*async/i, /request\\.(payload|params|query)/i, /h\\.response/i, /Joi\\.object/i],\n antiPatterns: []\n },\n 'serverless-api': {\n dependencias: ['serverless', 'serverless-offline', '@types/aws-lambda', 'aws-sdk'],\n imports: ['aws-lambda', 'aws-sdk'],\n exports: ['handler'],\n estrutura: ['src/handlers', 'src/functions', 'src/lib'],\n configs: ['serverless.yml', 'serverless.ts'],\n scripts: ['deploy', 'offline', 'invoke'],\n codigoPatterns: [/exports\\.handler/i, /APIGatewayProxyEvent/i, /APIGatewayProxyResult/i, /Context/i, /Callback/i, /async\\s+\\(event/i],\n antiPatterns: []\n },\n 'vue-spa': {\n dependencias: ['vue', '@vue/cli-service', 'vue-router', 'vuex', 'pinia'],\n imports: ['vue', 'vue-router', 'vuex', 'pinia'],\n exports: [],\n estrutura: ['src/components', 'src/views', 'src/router', 'src/store', 'src/composables', 'public'],\n configs: ['vue.config.js', 'vue.config.ts'],\n scripts: ['serve', 'build', 'lint'],\n codigoPatterns: [/createApp\\(/i, /<template>/i, /<script>/i, /<style/i, /defineComponent/i, /setup\\(\\)/i, /ref\\(/i, /reactive\\(/i, /computed\\(/i, /watch\\(/i, /onMounted/i, /onUnmounted/i],\n antiPatterns: []\n },\n 'nuxt-app': {\n dependencias: ['nuxt', 'nuxt3', '@nuxt/devtools', '@nuxtjs/tailwindcss'],\n imports: ['nuxt', '@nuxt/kit'],\n exports: [],\n estrutura: ['pages', 'components', 'layouts', 'plugins', 'middleware', 'composables', 'server/api'],\n configs: ['nuxt.config.js', 'nuxt.config.ts'],\n scripts: ['dev', 'build', 'generate', 'preview'],\n codigoPatterns: [/defineNuxtConfig/i, /useHead/i, /useState/i, /useFetch/i, /useAsyncData/i, /navigateTo/i, /<NuxtPage/i, /<NuxtLink/i, /definePageMeta/i, /server\\/api/i],\n antiPatterns: []\n },\n 'vite-vue': {\n dependencias: ['vue', 'vite', '@vitejs/plugin-vue', 'vue-router', 'pinia'],\n imports: ['vue', 'vite', '@vitejs/plugin-vue'],\n exports: [],\n estrutura: ['src/components', 'src/views', 'src/router', 'src/stores', 'src/composables', 'src/assets'],\n configs: ['vite.config.js', 'vite.config.ts', 'index.html'],\n scripts: ['dev', 'build', 'preview'],\n codigoPatterns: [/createApp\\(/i, /<template>/i, /<script setup/i, /<style scoped/i, /defineComponent/i, /setup\\(\\)/i, /ref\\(/i, /reactive\\(/i, /computed\\(/i],\n antiPatterns: []\n },\n 'hono-api': {\n dependencias: ['hono', '@hono/node-server', '@hono/zod-validator'],\n imports: ['hono', 'hono/cors', 'hono/logger'],\n exports: ['app'],\n estrutura: ['src/routes', 'src/middleware'],\n configs: ['src/index.ts', 'src/index.js'],\n scripts: ['dev', 'start'],\n codigoPatterns: [/new\\s+Hono\\(\\)/i, /app\\.(get|post|put|delete|patch|use)\\(/i, /c\\.(json|text|html|redirect)/i, /return\\s+c\\.json/i],\n antiPatterns: []\n },\n 'prisma-orm': {\n dependencias: ['@prisma/client', 'prisma'],\n imports: ['@prisma/client'],\n exports: ['prisma'],\n estrutura: ['prisma', 'prisma/schema.prisma'],\n configs: ['schema.prisma'],\n scripts: ['prisma:generate', 'prisma:migrate'],\n codigoPatterns: [/new\\s+PrismaClient\\(\\)/i, /prisma\\.\\w+\\.(findMany|findUnique|create|update|delete)/i],\n antiPatterns: []\n },\n 'trpc-api': {\n dependencias: ['@trpc/server', '@trpc/client', '@trpc/react-query'],\n imports: ['@trpc/server', '@trpc/client'],\n exports: ['appRouter', 't'],\n estrutura: ['src/server/trpc', 'src/trpc'],\n configs: [],\n scripts: [],\n codigoPatterns: [/initTRPC\\.create\\(\\)/i, /t\\.router\\(\\{/i, /t\\.procedure/i, /publicProcedure/i],\n antiPatterns: []\n },\n 'zod-validation': {\n dependencias: ['zod'],\n imports: ['zod'],\n exports: [],\n estrutura: [],\n configs: [],\n scripts: [],\n codigoPatterns: [/z\\.object\\(\\{/i, /z\\.string\\(\\)/i, /z\\.infer<typeof/i, /\\.parse\\(/i, /\\.safeParse\\(/i],\n antiPatterns: []\n },\n 'vitest-testing': {\n dependencias: ['vitest', '@vitest/ui', '@vitest/coverage-v8'],\n imports: ['vitest'],\n exports: [],\n estrutura: ['tests', '__tests__', 'src/__tests__'],\n configs: ['vitest.config.ts', 'vitest.config.js'],\n scripts: ['test', 'test:ui', 'coverage'],\n codigoPatterns: [/describe\\(/i, /it\\(/i, /test\\(/i, /expect\\(/i, /vi\\.fn\\(\\)/i, /vi\\.mock\\(/i],\n antiPatterns: []\n }\n};\nfunction analisarDependencias(packageJson?: PackageJson): EvidenciaContexto[] {\n const evidencias: EvidenciaContexto[] = [];\n if (!packageJson) return evidencias;\n const deps = {\n ...(packageJson.dependencies as Record<string, string> || {}),\n ...(packageJson.devDependencies as Record<string, string> || {})\n };\n if (config.VERBOSE) {\n console.log(DetectorContextoExtraMensagens.debugDependencias, Object.keys(deps));\n }\n for (const [tecnologia, padroes] of Object.entries(PADROES_TECNOLOGIA)) {\n for (const dep of padroes.dependencias) {\n if (deps[dep]) {\n evidencias.push({\n tipo: 'dependencia',\n valor: dep,\n confianca: 0.8,\n tecnologia,\n localizacao: 'package.json'\n });\n }\n }\n }\n return evidencias;\n}\nfunction analisarScripts(packageJson?: PackageJson): EvidenciaContexto[] {\n const evidencias: EvidenciaContexto[] = [];\n if (!packageJson) return evidencias;\n const scripts = packageJson.scripts as Record<string, string> || {};\n for (const [tecnologia, padroes] of Object.entries(PADROES_TECNOLOGIA)) {\n for (const script of padroes.scripts) {\n if (Object.keys(scripts).some(key => key.includes(script) || scripts[key]?.includes(script))) {\n evidencias.push({\n tipo: 'script',\n valor: script,\n confianca: 0.6,\n tecnologia,\n localizacao: 'package.json'\n });\n }\n }\n }\n return evidencias;\n}\nfunction analisarEstrutura(estruturaDetectada: string[]): EvidenciaContexto[] {\n const evidencias: EvidenciaContexto[] = [];\n for (const [tecnologia, padroes] of Object.entries(PADROES_TECNOLOGIA)) {\n for (const estrutura of padroes.estrutura) {\n // Verificação mais rigorosa para evitar falsos positivos\n const matchExato = estruturaDetectada?.find(dir => {\n // Match exato do caminho\n if (dir === estrutura) return true;\n\n // Match no final do caminho (ex: src/cli/commands matcheia 'commands')\n if (dir.endsWith(`/${estrutura}`)) return true;\n\n // Match no início seguido de / (ex: commands/subdir matcheia 'commands')\n if (dir.startsWith(`${estrutura}/`)) return true;\n\n // Para padrões que incluem /, verificar match rigoroso de subcaminho\n if (estrutura.includes('/')) {\n // Normalizar separadores para comparação\n const estruturaNorm = estrutura.replace(/\\\\/g, '/');\n const dirNorm = dir.replace(/\\\\/g, '/');\n\n // Verificar se é subcaminho exato\n if (dirNorm === estruturaNorm) return true;\n if (dirNorm.endsWith(`/${estruturaNorm}`)) return true;\n if (dirNorm.startsWith(`${estruturaNorm}/`)) return true;\n }\n return false;\n });\n if (matchExato) {\n evidencias.push({\n tipo: 'estrutura',\n valor: estrutura,\n confianca: 0.7,\n tecnologia,\n localizacao: matchExato\n });\n }\n }\n }\n return evidencias;\n}\nfunction analisarImportsExports(arquivos: FileEntryWithAst[]): EvidenciaContexto[] {\n const evidencias: EvidenciaContexto[] = [];\n for (const arquivo of arquivos) {\n if (!arquivo.ast || !('node' in arquivo.ast) || !arquivo.ast.node || arquivo.ast.node.type !== 'Program') continue;\n const programa = arquivo.ast.node as Program;\n const imports: string[] = [];\n const exports: string[] = [];\n traverse(programa, {\n ImportDeclaration(path: NodePath<ImportDeclaration>) {\n const node = path.node;\n if (typeof node.source.value === 'string') {\n imports.push(node.source.value);\n }\n },\n ExportDeclaration(path: NodePath<ExportDeclaration>) {\n const node = path.node as ExportDeclaration;\n // Analisa exports nomeados e padrão\n if ('declaration' in node && node.declaration) {\n if ('id' in node.declaration && node.declaration.id && 'name' in node.declaration.id) {\n if (typeof node.declaration.id.name === 'string') exports.push(node.declaration.id.name);\n }\n }\n }\n });\n\n // Verifica evidências nos imports\n for (const [tecnologia, padroes] of Object.entries(PADROES_TECNOLOGIA)) {\n for (const importEsperado of padroes.imports) {\n if (imports.some(imp => imp.includes(importEsperado))) {\n evidencias.push({\n tipo: 'import',\n valor: importEsperado,\n confianca: 0.9,\n tecnologia,\n localizacao: arquivo.relPath\n });\n }\n }\n for (const exportEsperado of padroes.exports) {\n if (exports.some(exp => exp.includes(exportEsperado))) {\n evidencias.push({\n tipo: 'export',\n valor: exportEsperado,\n confianca: 0.8,\n tecnologia,\n localizacao: arquivo.relPath\n });\n }\n }\n }\n }\n return evidencias;\n}\nfunction analisarPadroesCodigo(arquivos: FileEntryWithAst[]): EvidenciaContexto[] {\n const evidencias: EvidenciaContexto[] = [];\n for (const arquivo of arquivos) {\n if (!arquivo.content) continue;\n for (const [tecnologia, padroes] of Object.entries(PADROES_TECNOLOGIA)) {\n for (const pattern of padroes.codigoPatterns) {\n if (pattern.test(arquivo.content)) {\n evidencias.push({\n tipo: 'codigo',\n valor: pattern.source,\n confianca: 0.85,\n tecnologia,\n localizacao: arquivo.relPath\n });\n }\n }\n }\n }\n return evidencias;\n}\n\n/**\n * Verifica se anti-patterns estão presentes no código\n * Anti-patterns indicam que a tecnologia detectada está INCORRETA\n */\nfunction verificarAntiPatterns(arquivos: FileEntryWithAst[], tecnologia: string): boolean {\n const padraoTecnologia = PADROES_TECNOLOGIA[tecnologia as keyof typeof PADROES_TECNOLOGIA];\n if (!padraoTecnologia || !padraoTecnologia.antiPatterns) {\n return false; // Sem anti-patterns definidos\n }\n for (const arquivo of arquivos) {\n if (!arquivo.content) continue;\n\n // Se encontrar qualquer anti-pattern, retorna true (detecção incorreta)\n for (const antiPadrao of padraoTecnologia.antiPatterns) {\n if (antiPadrao.test(arquivo.content)) {\n return true; // Anti-pattern encontrado!\n }\n }\n }\n return false; // Nenhum anti-pattern encontrado\n}\nfunction gerarSugestoesMelhoria(tecnologia: string, evidencias: EvidenciaContexto[]): string[] {\n const sugestoes: string[] = [];\n const _arquivosEncontrados = evidencias.map(erro => erro.localizacao).filter(Boolean);\n switch (tecnologia) {\n case 'discord-bot':\n if (!evidencias.some(erro => erro.valor.includes('intents'))) {\n sugestoes.push('[CHAVE-INGLESA] Configurar intents específicos no Discord Client para melhor performance');\n }\n if (!evidencias.some(erro => erro.valor.includes('command'))) {\n sugestoes.push('[FOLDER] Estruturar commands em pasta dedicada para organização');\n }\n if (!evidencias.some(erro => erro.valor.includes('rate'))) {\n sugestoes.push('[BOLT] Implementar rate limiting para evitar banimento por spam');\n }\n break;\n case 'express-api':\n if (!evidencias.some(erro => erro.valor.includes('helmet'))) {\n sugestoes.push('[SHIELD] Adicionar helmet para headers de segurança');\n }\n if (!evidencias.some(erro => erro.valor.includes('cors'))) {\n sugestoes.push('[GLOBE] Configurar CORS adequadamente para APIs');\n }\n if (!evidencias.some(erro => erro.valor.includes('joi') && erro.valor.includes('swagger'))) {\n sugestoes.push('[LIST] Implementar validação com Joi e documentação Swagger');\n }\n break;\n case 'cli-modular':\n if (!evidencias.some(erro => erro.valor.includes('help'))) {\n sugestoes.push('[PERGUNTA] Implementar comando --help abrangente');\n }\n if (!evidencias.some(erro => erro.valor.includes('version'))) {\n sugestoes.push('[PACOTE] Adicionar comando --version');\n }\n if (!evidencias.some(erro => erro.valor.includes('config'))) {\n sugestoes.push('[CONFIG] Considerar arquivo de configuração para usuários');\n }\n break;\n case 'electron-app':\n if (!evidencias.some(erro => erro.valor.includes('preload'))) {\n sugestoes.push('[BLOQUEADO] Implementar preload script para comunicação segura');\n }\n if (!evidencias.some(erro => erro.valor.includes('contextIsolation'))) {\n sugestoes.push('[SHIELD] Habilitar context isolation para segurança');\n }\n if (!evidencias.some(erro => erro.valor.includes('updater'))) {\n sugestoes.push('[REFRESH] Implementar auto-updater para atualizações automáticas');\n }\n break;\n }\n return sugestoes;\n}\nfunction detectarProblemas(tecnologia: string, evidencias: EvidenciaContexto[], arquivos: FileEntryWithAst[]): string[] {\n const problemas: string[] = [];\n switch (tecnologia) {\n case 'discord-bot':\n // Verifica se token está hardcoded\n for (const arquivo of arquivos) {\n if (arquivo.content?.includes('token') && !arquivo.content.includes('process.env')) {\n problemas.push(`[ALERT] Possível token hardcoded em ${arquivo.relPath}`);\n }\n }\n break;\n case 'express-api':\n // Verifica middleware de segurança\n const temHelmet = evidencias.some(erro => erro.valor.includes('helmet'));\n const temCors = evidencias.some(erro => erro.valor.includes('cors'));\n if (!temHelmet) {\n problemas.push('[AVISO] API sem helmet - vulnerável a ataques de header');\n }\n if (!temCors) {\n problemas.push('[AVISO] API sem CORS configurado - possíveis problemas de origem');\n }\n break;\n case 'electron-app':\n // Verifica configurações de segurança\n for (const arquivo of arquivos) {\n if (arquivo.content?.includes('nodeIntegration: true')) {\n problemas.push(`[ALERT] nodeIntegration habilitado em ${arquivo.relPath} - risco de segurança`);\n }\n if (arquivo.content?.includes('contextIsolation: false')) {\n problemas.push(`[ALERT] contextIsolation desabilitado em ${arquivo.relPath} - vulnerabilidade`);\n }\n }\n break;\n }\n return problemas;\n}\nfunction calcularConfiancaTotal(evidencias: EvidenciaContexto[]): number {\n if (evidencias.length === 0) return 0;\n const pesosPorTipo = {\n dependencia: 1.0,\n import: 0.9,\n codigo: 0.85,\n export: 0.8,\n estrutura: 0.7,\n script: 0.6,\n config: 0.5\n };\n let somaConfianca = 0;\n let somaPesos = 0;\n for (const evidencia of evidencias) {\n const peso = pesosPorTipo[evidencia.tipo as keyof typeof pesosPorTipo] || 0.5;\n somaConfianca += evidencia.confianca * peso;\n somaPesos += peso;\n }\n return somaPesos > 0 ? somaConfianca / somaPesos : 0;\n}\nexport function detectarContextoInteligente(estruturaDetectada: string[], arquivos: FileEntryWithAst[], packageJson?: PackageJson, options?: {\n quiet?: boolean;\n}): ResultadoDeteccaoContextual[] {\n // DEBUG: Log simples para verificar se está sendo chamado\n if (!options?.quiet && config.VERBOSE) {\n console.log(DetectorContextoExtraMensagens.debugPackageCompleto, JSON.stringify(packageJson, null, 2));\n if (packageJson?.dependencies?.vue) {\n console.log(DetectorContextoExtraMensagens.debugPackageVue, packageJson.dependencies.vue);\n }\n }\n const todasEvidencias: EvidenciaContexto[] = [...analisarDependencias(packageJson), ...analisarScripts(packageJson), ...analisarEstrutura(estruturaDetectada), ...analisarImportsExports(arquivos), ...analisarPadroesCodigo(arquivos)];\n\n // Agrupa evidências por tecnologia\n const evidenciasPorTecnologia = new Map<string, EvidenciaContexto[]>();\n for (const evidencia of todasEvidencias) {\n const tec = evidencia.tecnologia || 'desconhecido';\n if (!evidenciasPorTecnologia.has(tec)) {\n evidenciasPorTecnologia.set(tec, []);\n }\n const tecEvidencias = evidenciasPorTecnologia.get(tec);\n if (tecEvidencias) {\n tecEvidencias.push(evidencia);\n }\n }\n\n // Calcula resultados por tecnologia\n const resultados: ResultadoDeteccaoContextual[] = [];\n for (const [tecnologia, evidencias] of evidenciasPorTecnologia) {\n let confiancaTotal = calcularConfiancaTotal(evidencias);\n\n // Verificação de dependências obrigatórias para evitar falsos positivos\n const padraoTecnologia = PADROES_TECNOLOGIA[tecnologia as keyof typeof PADROES_TECNOLOGIA];\n if (padraoTecnologia && padraoTecnologia.dependencias.length > 0) {\n const temDependenciaObrigatoria = evidencias.some(erro => erro.tipo === 'dependencia' && padraoTecnologia.dependencias.includes(erro.valor));\n\n // Se não tem nenhuma dependência obrigatória, penalizar severamente\n if (!temDependenciaObrigatoria) {\n confiancaTotal *= 0.1; // Reduz confiança para 10%\n }\n }\n\n // [ALERT] VERIFICAÇÃO DE ANTI-PATTERNS: Se anti-patterns estão presentes, ELIMINAR detecção\n const temAntiPadrao = verificarAntiPatterns(arquivos, tecnologia);\n if (temAntiPadrao) {\n // Anti-pattern detectado = detecção FALSA, eliminar confiança\n confiancaTotal = 0;\n // Opcional: Adicionar evidência negativa\n evidencias.push({\n tipo: 'codigo',\n valor: 'anti-pattern-detectado',\n confianca: -1.0,\n // Negativa\n tecnologia,\n localizacao: 'código'\n });\n }\n if (confiancaTotal > 0.3) {\n // Threshold mínimo para considerar\n resultados.push({\n tecnologia,\n confiancaTotal,\n evidencias,\n sugestoesMelhoria: gerarSugestoesMelhoria(tecnologia, evidencias),\n problemasDetectados: detectarProblemas(tecnologia, evidencias, arquivos)\n });\n }\n }\n\n // Ordena por confiança decrescente\n return resultados.sort((arquivo, base) => base.confiancaTotal - arquivo.confiancaTotal);\n}\nexport function inferirArquetipoInteligente(estruturaDetectada: string[], arquivos: FileEntryWithAst[], packageJson?: PackageJson, options?: {\n quiet?: boolean;\n}): string {\n const resultados = detectarContextoInteligente(estruturaDetectada, arquivos, packageJson, options);\n if (resultados.length === 0) return 'generico';\n const melhorResultado = resultados[0];\n\n // Mapeia tecnologias para arquétipos oficiais\n const mapeamentoArquetipos: Record<string, string> = {\n 'discord-bot': 'bot',\n 'telegram-bot': 'bot',\n 'express-api': 'api-rest-express',\n 'fastify-api': 'api-rest-express',\n 'nest-api': 'api-rest-express',\n 'koa-api': 'api-rest-express',\n 'hapi-api': 'api-rest-express',\n 'serverless-api': 'api-rest-express',\n 'cli-modular': 'cli-modular',\n 'electron-app': 'electron',\n 'next-fullstack': 'fullstack',\n 'react-spa': 'landing-page',\n 'vue-spa': 'vue-spa',\n 'nuxt-app': 'vue-spa',\n 'vite-vue': 'vue-spa'\n };\n return mapeamentoArquetipos[melhorResultado.tecnologia || 'generico'] || 'generico';\n}"]}
|
|
@@ -157,7 +157,7 @@ const ANALISTA = {
|
|
|
157
157
|
else {
|
|
158
158
|
sugestao = 'Substitua por tipo específico ou use unknown com validação runtime';
|
|
159
159
|
}
|
|
160
|
-
const mensagemCompleta = `${mensagem} | [IDEIA] ${sugestao} |
|
|
160
|
+
const mensagemCompleta = `${mensagem} | [IDEIA] ${sugestao} | [ALERT] CRÍTICO: Type safety completamente desabilitado | [BUSCA] Revisão manual obrigatória`;
|
|
161
161
|
if (shouldSuppressOccurrence('tipo-inseguro-any-assertion', relPath)) {
|
|
162
162
|
continue;
|
|
163
163
|
}
|
|
@@ -179,7 +179,7 @@ const ANALISTA = {
|
|
|
179
179
|
}
|
|
180
180
|
const linha = splitLines(src.substring(0, position)).length;
|
|
181
181
|
const lineContext = splitLines(src)[linha - 1]?.trim() || '';
|
|
182
|
-
const mensagemCompleta = "Type casting '<any>' (sintaxe legada) desabilita type safety | [IDEIA] Use sintaxe 'as' moderna e tipo específico |
|
|
182
|
+
const mensagemCompleta = "Type casting '<any>' (sintaxe legada) desabilita type safety | [IDEIA] Use sintaxe 'as' moderna e tipo específico | [ALERT] CRÍTICO: Migrar para sintaxe moderna e tipo correto | [BUSCA] Revisão manual obrigatória";
|
|
183
183
|
if (shouldSuppressOccurrence('tipo-inseguro-any-cast', relPath)) {
|
|
184
184
|
continue;
|
|
185
185
|
}
|
|
@@ -235,7 +235,7 @@ const ANALISTA = {
|
|
|
235
235
|
mensagem = varNome ? `Tipo 'unknown' em '${varNome}' deve ser corrigido (${categorizacao.confianca}% confiança)` : `Tipo 'unknown' deve ser corrigido (${categorizacao.confianca}% confiança)`;
|
|
236
236
|
mensagem += ` | ${categorizacao.motivo}`;
|
|
237
237
|
if (categorizacao.sugestao) {
|
|
238
|
-
mensagem += ` |
|
|
238
|
+
mensagem += ` | [EDIT] ${categorizacao.sugestao}`;
|
|
239
239
|
}
|
|
240
240
|
mensagem += ` | [BUSCA] Revisão manual obrigatória`;
|
|
241
241
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detector-types-unsafe.js","sourceRoot":"","sources":["../../../../src/analysts/js-ts/detectors/detector-types-unsafe.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\n/**\n * Detector de tipos inseguros (any e unknown) - Versão Inteligente\n * Identifica uso de any e unknown com análise contextual avançada\n *\n * Estratégia:\n * - Analisa contexto para determinar legitimidade do uso\n * - Sugere alternativas específicas quando possível\n * - Explica variantes e possibilidades quando análise é incerta\n * - Sempre recomenda revisão manual para casos complexos\n */\n\nimport { categorizarUnknown, extractVariableName, isAnyInGenericFunction, isInStringOrComment, isLegacyOrVendorFile, isTypeScriptContext, isUnknownInGenericContext } from '@analysts/corrections/type-safety';\nimport type { NodePath } from '@babel/traverse';\nimport type { Node } from '@babel/types';\nimport { config } from '@core/config';\nimport { isTestArquivo, shouldSuppressOccurrence,splitLines } from '@shared/helpers';\n\nimport type { Analista, Ocorrencia } from '@';\n\nconst ANALISTA: Analista = {\n nome: 'detector-tipos-inseguros',\n categoria: 'code-quality',\n descricao: 'Detecta uso de any e unknown que podem ser substituídos por tipos específicos',\n test: (relPath: string) => {\n return relPath.endsWith('.ts') || relPath.endsWith('.tsx');\n },\n aplicar: async (srcParam: string, relPath: string, _ast: NodePath<Node> | null, fullCaminho?: string): Promise<Ocorrencia[]> => {\n const ocorrencias: Ocorrencia[] = [];\n\n // IMPORTANTE: Normalização de line endings para compatibilidade Windows/Linux\n // Sem isso, arquivos com \\r\\n causam split('\\n') incorreto (retorna 1 linha)\n // Ver: docs/reports/DEBUG-TYPE-SAFETY-DETECTOR-2025-11-03.md\n const src = srcParam.replace(/\\r\\n/g, '\\n');\n\n const allowAnyInTests = Boolean((config as unknown as {\n testPadroes?: {\n allowAnyType?: boolean;\n };\n }).testPadroes?.allowAnyType);\n\n if (allowAnyInTests && isTestArquivo(fullCaminho || relPath)) {\n return ocorrencias;\n }\n\n // Verificar se é arquivo que deve ser ignorado\n if (isLegacyOrVendorFile(fullCaminho || relPath)) {\n return ocorrencias;\n }\n\n // Detectar uso de any\n const anyPadrao = /:\\s*(any|NonNullable<any>|Partial<any>|Omit<any,\\s*[^>]+>|Pick<any,\\s*[^>]+>)\\b/g;\n let anyMatch: RegExpMatchArray | null;\n while ((anyMatch = anyPadrao.exec(src)) !== null) {\n const position = anyMatch.index || 0;\n\n // Pular se estiver em string ou comentário\n if (isInStringOrComment(src, position)) {\n continue;\n }\n\n // Pular se estiver em contexto TypeScript específico (type assertions)\n if (isTypeScriptContext(src, position)) {\n continue;\n }\n\n // Pular se any está em função genérica apropriada\n if (isAnyInGenericFunction(src, position)) {\n continue;\n }\n\n // Extrair nome da variável e contexto\n const varNome = extractVariableName(anyMatch, src);\n const linha = splitLines(src.substring(0, position)).length;\n const lineContext = splitLines(src)[linha - 1]?.trim() || '';\n\n // Análise contextual para any\n let mensagem = '';\n let sugestao = '';\n\n // Detectar padrões específicos\n if (anyMatch[1] !== 'any') {\n mensagem = `Uso de utilitário de tipo com 'any' em '${varNome}' mascara perda de type safety`;\n sugestao = `Substitua por: ${anyMatch[1].replace('any', 'TipoEspecifico')}`;\n } else if (/catch\\s*\\(\\s*\\w+\\s*:\\s*any\\s*\\)/.test(lineContext)) {\n mensagem = varNome ? `'any' em catch block '${varNome}' - TypeScript recomenda 'unknown'` : \"'any' em catch block - TypeScript recomenda 'unknown'\";\n sugestao = 'Substitua por: catch (error: unknown) { ... }';\n } else if (/callback\\s*:\\s*\\([^)]*:\\s*any/.test(lineContext)) {\n mensagem = varNome ? `Callback '${varNome}' com parâmetro 'any' - tipagem fraca` : \"Callback com parâmetro 'any' - tipagem fraca\";\n sugestao = 'Defina interface do callback: (param: TipoEspecifico) => void';\n } else if (/event\\s*:\\s*any|e\\s*:\\s*any/.test(lineContext)) {\n mensagem = varNome ? `Event handler '${varNome}' com 'any' - pode usar Event types` : \"Event handler com 'any' - pode usar Event types\";\n sugestao = 'Use tipos do DOM: MouseEvent, KeyboardEvent, etc ou React.SyntheticEvent<T>';\n } else if (/\\[\\s*key\\s*:\\s*string\\s*\\]\\s*:\\s*any/.test(lineContext)) {\n mensagem = 'Índice extensível com any - muito permissivo';\n sugestao = 'Use: [key: string]: unknown (mais seguro) ou defina union type';\n } else if (/Record<[^,]+,\\s*any>/.test(lineContext)) {\n mensagem = varNome ? `Record com 'any' em '${varNome}' - sem type safety` : \"Record com 'any' - sem type safety\";\n sugestao = 'Use Record<string, unknown> ou interface específica';\n } else if (/Array<any>/.test(lineContext) || /any\\[\\]/.test(lineContext)) {\n mensagem = varNome ? `Array de 'any' em '${varNome}' - perde tipagem` : \"Array de 'any' - perde tipagem\";\n sugestao = 'Especifique tipo do array: string[], number[], CustomType[], etc';\n } else {\n // Caso genérico\n mensagem = varNome ? `Tipo 'any' em '${varNome}' desabilita verificação de tipos` : \"Tipo 'any' desabilita verificação de tipos\";\n sugestao = 'Analise uso da variável e defina tipo específico ou use unknown com type guards';\n }\n\n // Adicionar contexto adicional baseado no arquivo\n let contextoAdicional = '';\n if (fullCaminho?.includes('tipos/')) {\n contextoAdicional = ' | [AVISO] Arquivo de tipos - impacta toda base de código';\n } else if (fullCaminho?.includes('core/') || fullCaminho?.includes('shared/')) {\n contextoAdicional = ' | [AVISO] Módulo core/shared - usado por muitos componentes';\n }\n const mensagemCompleta = `${mensagem} | [IDEIA] ${sugestao}${contextoAdicional} | [BUSCA] Revisão manual obrigatória`;\n\n // Verifica se regra está suprimida para este arquivo\n if (shouldSuppressOccurrence('tipo-inseguro-any', relPath)) {\n continue;\n }\n ocorrencias.push({\n tipo: 'tipo-inseguro-any',\n nivel: 'aviso',\n mensagem: mensagemCompleta,\n relPath,\n linha,\n contexto: lineContext\n });\n }\n\n// ─── DETECTAR Object e {} (tipos fracos) ──────────────────────\n const tiposFracosPadrao = /:\\s*(Object|\\{\\})(?![a-zA-Z0-9_$])/g;\n let matchFraco: RegExpMatchArray | null;\n while ((matchFraco = tiposFracosPadrao.exec(src)) !== null) {\n const position = matchFraco.index || 0;\n if (isInStringOrComment(src, position)) continue;\n\n // Pular se Object é usado como método estático (ex: Object.keys(), Object.create())\n const antesObj = src.substring(Math.max(0, position - 10), position);\n if (/Object\\s*\\.\\s*$/.test(antesObj)) continue;\n\n const linha = splitLines(src.substring(0, position)).length;\n const lineContext = splitLines(src)[linha - 1]?.trim() || '';\n const tipo = matchFraco[1];\n\n // Filtrar contextos legítimos onde {} é aceitável\n // 1. Inicialização de objeto vazio: prop?: {} = {}\n // 2. Partial types: Partial<SomeType> - contexto válido\n // 3. Parâmetros opcionais com valor padrão\n // 4. Type assertions em objetos reais (não tipagem explícita)\n const antes = src.substring(Math.max(0, position - 30), position);\n const depois = lineContext.substring(lineContext.indexOf(':') + 1);\n\n // Pular se é inicialização de objeto vazio (prop?: {} = {})\n if (/\\?\\s*:\\s*\\{\\}\\s*=/.test(`${antes }: {}`)) continue;\n\n // Pular se é parâmetro de função com valor default\n if (/\\?\\s*:\\s*\\{\\}\\s*[=,)]/.test(antes)) continue;\n\n // Pular se é parte de Partial/Required/Readonly\n if (/Partial<|Required<|Readonly<|\\}\\?$/.test(antes)) continue;\n\n // Pular se é em contexto de catch block\n if (/catch\\s*\\([^)]*:\\s*\\{\\}/.test(lineContext)) continue;\n\n // Pular se é inicialização de objeto vazio: algo = {}\n if (depois.trim().startsWith('=')) continue;\n\n // Pular se é parâmetro de função com default: : {} = ou : {} ,\n if (/^\\s*\\{?\\s*\\}\\s*[,=)]/.test(depois)) continue;\n\n // Pular se é valor de propriedade em objeto: chave: {}\n if (/\\w+\\s*:\\s*\\{\\}\\s*$/.test(lineContext)) continue;\n\n // Pular se é spread com objeto vazio condicional: ...cond ? {x} : {}\n if (/\\?\\s*\\{[^}]*\\}\\s*:\\s*\\{\\}/.test(lineContext)) continue;\n\n // Pular se é ternário com objeto vazio como fallback\n if (/:\\s*\\{\\}\\s*$/.test(lineContext.trim())) continue;\n\n const mensagem = `Tipo '${tipo}' é muito permissivo e pouco útil para type safety`;\n const sugestao = tipo === 'Object' ? 'Use Record<string, unknown> ou interface específica' : 'Use Record<string, never> para objetos vazios ou interface específica';\n\n if (shouldSuppressOccurrence('tipo-permissivo-object', relPath)) continue;\n\n ocorrencias.push({\n tipo: 'tipo-permissivo-object',\n nivel: 'aviso',\n mensagem: `${mensagem} | [IDEIA] ${sugestao}`,\n relPath,\n linha,\n contexto: lineContext\n });\n }\n\n// ─── DETECTAR TYPE ASSERTIONS (as any) ────────────────────────\n const asAnyPadrao = /\\b(as\\s+any)\\b/g;\n let asAnyMatch: RegExpMatchArray | null;\n while ((asAnyMatch = asAnyPadrao.exec(src)) !== null) {\n const position = asAnyMatch.index || 0;\n\n // Pular se estiver em string ou comentário\n if (isInStringOrComment(src, position)) {\n continue;\n }\n const linha = splitLines(src.substring(0, position)).length;\n const lineContext = splitLines(src)[linha - 1]?.trim() || '';\n\n // Extrair contexto da expressão\n const after = src.substring(position, Math.min(src.length, position + 50));\n const mensagem = \"Type assertion 'as any' desabilita verificação de tipos completamente\";\n let sugestao = '';\n\n // Detectar padrões comuns de type assertion\n if (/\\)\\s*as\\s+any/.test(lineContext)) {\n sugestao = 'Evite cast de retorno de função - tipar função corretamente ou usar unknown com type guard';\n } else if (/\\.\\w+\\s+as\\s+any/.test(lineContext)) {\n sugestao = 'Evite cast de propriedade - definir tipo correto no objeto pai';\n } else if (/\\bas\\s+any\\s*\\)/.test(after)) {\n sugestao = 'Type assertion em parâmetro - definir tipo correto na assinatura da função chamada';\n } else {\n sugestao = 'Substitua por tipo específico ou use unknown com validação runtime';\n }\n const mensagemCompleta = `${mensagem} | [IDEIA] ${sugestao} | 🚨 CRÍTICO: Type safety completamente desabilitado | [BUSCA] Revisão manual obrigatória`;\n\n // Verifica se regra está suprimida para este arquivo\n if (shouldSuppressOccurrence('tipo-inseguro-any-assertion', relPath)) {\n continue;\n }\n ocorrencias.push({\n tipo: 'tipo-inseguro-any-assertion',\n nivel: 'erro',\n // Mais severo que declaração de tipo\n mensagem: mensagemCompleta,\n relPath,\n linha,\n contexto: lineContext\n });\n }\n\n// ─── DETECTAR ANGLE BRACKET CASTING (<any>) ───────────────────\n const angleBracketPadrao = /<any>/g;\n let angleBracketMatch: RegExpMatchArray | null;\n while ((angleBracketMatch = angleBracketPadrao.exec(src)) !== null) {\n const position = angleBracketMatch.index || 0;\n\n // Pular se estiver em string ou comentário\n if (isInStringOrComment(src, position)) {\n continue;\n }\n const linha = splitLines(src.substring(0, position)).length;\n const lineContext = splitLines(src)[linha - 1]?.trim() || '';\n const mensagemCompleta = \"Type casting '<any>' (sintaxe legada) desabilita type safety | [IDEIA] Use sintaxe 'as' moderna e tipo específico | 🚨 CRÍTICO: Migrar para sintaxe moderna e tipo correto | [BUSCA] Revisão manual obrigatória\";\n\n // Verifica se regra está suprimida para este arquivo\n if (shouldSuppressOccurrence('tipo-inseguro-any-cast', relPath)) {\n continue;\n }\n ocorrencias.push({\n tipo: 'tipo-inseguro-any-cast',\n nivel: 'erro',\n mensagem: mensagemCompleta,\n relPath,\n linha,\n contexto: lineContext\n });\n }\n\n // Detectar uso de unknown\n const unknownPadrao = /:\\s*unknown\\b/g;\n let unknownMatch: RegExpMatchArray | null;\n while ((unknownMatch = unknownPadrao.exec(src)) !== null) {\n const position = unknownMatch.index || 0;\n\n // Pular se estiver em string ou comentário\n if (isInStringOrComment(src, position)) {\n continue;\n }\n\n // Pular se unknown está em contexto genérico apropriado (validação básica)\n if (isUnknownInGenericContext(src, position)) {\n continue;\n }\n\n // Análise contextual inteligente\n const linha = splitLines(src.substring(0, position)).length;\n const lineContext = splitLines(src)[linha - 1]?.trim() || '';\n const categorizacao = categorizarUnknown(src, fullCaminho || relPath, lineContext);\n\n // Extrair nome da variável\n const varNome = extractVariableName(unknownMatch, src);\n\n // Construir mensagem baseada na categorização\n let mensagem = '';\n let nivel: 'info' | 'aviso' | 'erro';\n if (categorizacao.categoria === 'legitimo') {\n // Legítimo com alta confiança (>=95%) - PULAR completamente\n if (categorizacao.confianca >= 95) {\n continue;\n }\n\n // Legítimo com confiança moderada (85-94%) - info apenas\n mensagem = varNome ? `Tipo 'unknown' em '${varNome}': ${categorizacao.motivo}` : `Tipo 'unknown': ${categorizacao.motivo}`;\n nivel = 'info';\n\n // Se tem sugestão, adicionar\n if (categorizacao.sugestao) {\n mensagem += ` | [IDEIA] ${categorizacao.sugestao}`;\n }\n } else if (categorizacao.categoria === 'melhoravel') {\n // Melhorável - aviso com sugestão\n nivel = 'aviso';\n mensagem = varNome ? `Tipo 'unknown' em '${varNome}' pode ser melhorado (${categorizacao.confianca}% confiança)` : `Tipo 'unknown' pode ser melhorado (${categorizacao.confianca}% confiança)`;\n mensagem += ` | ${categorizacao.motivo}`;\n if (categorizacao.sugestao) {\n mensagem += ` | [IDEIA] ${categorizacao.sugestao}`;\n } else {\n mensagem += ` | [IDEIA] Revisar uso para inferir tipo mais específico`;\n }\n mensagem += ` | [AVISO] Revisão manual recomendada`;\n } else {\n // Corrigir - erro que deve ser tratado\n nivel = 'erro';\n mensagem = varNome ? `Tipo 'unknown' em '${varNome}' deve ser corrigido (${categorizacao.confianca}% confiança)` : `Tipo 'unknown' deve ser corrigido (${categorizacao.confianca}% confiança)`;\n mensagem += ` | ${categorizacao.motivo}`;\n if (categorizacao.sugestao) {\n mensagem += ` | ✏️ ${categorizacao.sugestao}`;\n }\n mensagem += ` | [BUSCA] Revisão manual obrigatória`;\n }\n\n // Verifica se regra está suprimida para este arquivo\n if (shouldSuppressOccurrence('tipo-inseguro-unknown', relPath)) {\n continue;\n }\n ocorrencias.push({\n tipo: 'tipo-inseguro-unknown',\n nivel,\n mensagem,\n relPath,\n linha,\n contexto: lineContext\n });\n }\n return ocorrencias;\n }\n};\nexport const detectorTiposInseguros = ANALISTA;\n"]}
|
|
1
|
+
{"version":3,"file":"detector-types-unsafe.js","sourceRoot":"","sources":["../../../../src/analysts/js-ts/detectors/detector-types-unsafe.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\n/**\n * Detector de tipos inseguros (any e unknown) - Versão Inteligente\n * Identifica uso de any e unknown com análise contextual avançada\n *\n * Estratégia:\n * - Analisa contexto para determinar legitimidade do uso\n * - Sugere alternativas específicas quando possível\n * - Explica variantes e possibilidades quando análise é incerta\n * - Sempre recomenda revisão manual para casos complexos\n */\n\nimport { categorizarUnknown, extractVariableName, isAnyInGenericFunction, isInStringOrComment, isLegacyOrVendorFile, isTypeScriptContext, isUnknownInGenericContext } from '@analysts/corrections/type-safety';\nimport type { NodePath } from '@babel/traverse';\nimport type { Node } from '@babel/types';\nimport { config } from '@core/config';\nimport { isTestArquivo, shouldSuppressOccurrence,splitLines } from '@shared/helpers';\n\nimport type { Analista, Ocorrencia } from '@';\n\nconst ANALISTA: Analista = {\n nome: 'detector-tipos-inseguros',\n categoria: 'code-quality',\n descricao: 'Detecta uso de any e unknown que podem ser substituídos por tipos específicos',\n test: (relPath: string) => {\n return relPath.endsWith('.ts') || relPath.endsWith('.tsx');\n },\n aplicar: async (srcParam: string, relPath: string, _ast: NodePath<Node> | null, fullCaminho?: string): Promise<Ocorrencia[]> => {\n const ocorrencias: Ocorrencia[] = [];\n\n // IMPORTANTE: Normalização de line endings para compatibilidade Windows/Linux\n // Sem isso, arquivos com \\r\\n causam split('\\n') incorreto (retorna 1 linha)\n // Ver: docs/reports/DEBUG-TYPE-SAFETY-DETECTOR-2025-11-03.md\n const src = srcParam.replace(/\\r\\n/g, '\\n');\n\n const allowAnyInTests = Boolean((config as unknown as {\n testPadroes?: {\n allowAnyType?: boolean;\n };\n }).testPadroes?.allowAnyType);\n\n if (allowAnyInTests && isTestArquivo(fullCaminho || relPath)) {\n return ocorrencias;\n }\n\n // Verificar se é arquivo que deve ser ignorado\n if (isLegacyOrVendorFile(fullCaminho || relPath)) {\n return ocorrencias;\n }\n\n // Detectar uso de any\n const anyPadrao = /:\\s*(any|NonNullable<any>|Partial<any>|Omit<any,\\s*[^>]+>|Pick<any,\\s*[^>]+>)\\b/g;\n let anyMatch: RegExpMatchArray | null;\n while ((anyMatch = anyPadrao.exec(src)) !== null) {\n const position = anyMatch.index || 0;\n\n // Pular se estiver em string ou comentário\n if (isInStringOrComment(src, position)) {\n continue;\n }\n\n // Pular se estiver em contexto TypeScript específico (type assertions)\n if (isTypeScriptContext(src, position)) {\n continue;\n }\n\n // Pular se any está em função genérica apropriada\n if (isAnyInGenericFunction(src, position)) {\n continue;\n }\n\n // Extrair nome da variável e contexto\n const varNome = extractVariableName(anyMatch, src);\n const linha = splitLines(src.substring(0, position)).length;\n const lineContext = splitLines(src)[linha - 1]?.trim() || '';\n\n // Análise contextual para any\n let mensagem = '';\n let sugestao = '';\n\n // Detectar padrões específicos\n if (anyMatch[1] !== 'any') {\n mensagem = `Uso de utilitário de tipo com 'any' em '${varNome}' mascara perda de type safety`;\n sugestao = `Substitua por: ${anyMatch[1].replace('any', 'TipoEspecifico')}`;\n } else if (/catch\\s*\\(\\s*\\w+\\s*:\\s*any\\s*\\)/.test(lineContext)) {\n mensagem = varNome ? `'any' em catch block '${varNome}' - TypeScript recomenda 'unknown'` : \"'any' em catch block - TypeScript recomenda 'unknown'\";\n sugestao = 'Substitua por: catch (error: unknown) { ... }';\n } else if (/callback\\s*:\\s*\\([^)]*:\\s*any/.test(lineContext)) {\n mensagem = varNome ? `Callback '${varNome}' com parâmetro 'any' - tipagem fraca` : \"Callback com parâmetro 'any' - tipagem fraca\";\n sugestao = 'Defina interface do callback: (param: TipoEspecifico) => void';\n } else if (/event\\s*:\\s*any|e\\s*:\\s*any/.test(lineContext)) {\n mensagem = varNome ? `Event handler '${varNome}' com 'any' - pode usar Event types` : \"Event handler com 'any' - pode usar Event types\";\n sugestao = 'Use tipos do DOM: MouseEvent, KeyboardEvent, etc ou React.SyntheticEvent<T>';\n } else if (/\\[\\s*key\\s*:\\s*string\\s*\\]\\s*:\\s*any/.test(lineContext)) {\n mensagem = 'Índice extensível com any - muito permissivo';\n sugestao = 'Use: [key: string]: unknown (mais seguro) ou defina union type';\n } else if (/Record<[^,]+,\\s*any>/.test(lineContext)) {\n mensagem = varNome ? `Record com 'any' em '${varNome}' - sem type safety` : \"Record com 'any' - sem type safety\";\n sugestao = 'Use Record<string, unknown> ou interface específica';\n } else if (/Array<any>/.test(lineContext) || /any\\[\\]/.test(lineContext)) {\n mensagem = varNome ? `Array de 'any' em '${varNome}' - perde tipagem` : \"Array de 'any' - perde tipagem\";\n sugestao = 'Especifique tipo do array: string[], number[], CustomType[], etc';\n } else {\n // Caso genérico\n mensagem = varNome ? `Tipo 'any' em '${varNome}' desabilita verificação de tipos` : \"Tipo 'any' desabilita verificação de tipos\";\n sugestao = 'Analise uso da variável e defina tipo específico ou use unknown com type guards';\n }\n\n // Adicionar contexto adicional baseado no arquivo\n let contextoAdicional = '';\n if (fullCaminho?.includes('tipos/')) {\n contextoAdicional = ' | [AVISO] Arquivo de tipos - impacta toda base de código';\n } else if (fullCaminho?.includes('core/') || fullCaminho?.includes('shared/')) {\n contextoAdicional = ' | [AVISO] Módulo core/shared - usado por muitos componentes';\n }\n const mensagemCompleta = `${mensagem} | [IDEIA] ${sugestao}${contextoAdicional} | [BUSCA] Revisão manual obrigatória`;\n\n // Verifica se regra está suprimida para este arquivo\n if (shouldSuppressOccurrence('tipo-inseguro-any', relPath)) {\n continue;\n }\n ocorrencias.push({\n tipo: 'tipo-inseguro-any',\n nivel: 'aviso',\n mensagem: mensagemCompleta,\n relPath,\n linha,\n contexto: lineContext\n });\n }\n\n// ─── DETECTAR Object e {} (tipos fracos) ──────────────────────\n const tiposFracosPadrao = /:\\s*(Object|\\{\\})(?![a-zA-Z0-9_$])/g;\n let matchFraco: RegExpMatchArray | null;\n while ((matchFraco = tiposFracosPadrao.exec(src)) !== null) {\n const position = matchFraco.index || 0;\n if (isInStringOrComment(src, position)) continue;\n\n // Pular se Object é usado como método estático (ex: Object.keys(), Object.create())\n const antesObj = src.substring(Math.max(0, position - 10), position);\n if (/Object\\s*\\.\\s*$/.test(antesObj)) continue;\n\n const linha = splitLines(src.substring(0, position)).length;\n const lineContext = splitLines(src)[linha - 1]?.trim() || '';\n const tipo = matchFraco[1];\n\n // Filtrar contextos legítimos onde {} é aceitável\n // 1. Inicialização de objeto vazio: prop?: {} = {}\n // 2. Partial types: Partial<SomeType> - contexto válido\n // 3. Parâmetros opcionais com valor padrão\n // 4. Type assertions em objetos reais (não tipagem explícita)\n const antes = src.substring(Math.max(0, position - 30), position);\n const depois = lineContext.substring(lineContext.indexOf(':') + 1);\n\n // Pular se é inicialização de objeto vazio (prop?: {} = {})\n if (/\\?\\s*:\\s*\\{\\}\\s*=/.test(`${antes }: {}`)) continue;\n\n // Pular se é parâmetro de função com valor default\n if (/\\?\\s*:\\s*\\{\\}\\s*[=,)]/.test(antes)) continue;\n\n // Pular se é parte de Partial/Required/Readonly\n if (/Partial<|Required<|Readonly<|\\}\\?$/.test(antes)) continue;\n\n // Pular se é em contexto de catch block\n if (/catch\\s*\\([^)]*:\\s*\\{\\}/.test(lineContext)) continue;\n\n // Pular se é inicialização de objeto vazio: algo = {}\n if (depois.trim().startsWith('=')) continue;\n\n // Pular se é parâmetro de função com default: : {} = ou : {} ,\n if (/^\\s*\\{?\\s*\\}\\s*[,=)]/.test(depois)) continue;\n\n // Pular se é valor de propriedade em objeto: chave: {}\n if (/\\w+\\s*:\\s*\\{\\}\\s*$/.test(lineContext)) continue;\n\n // Pular se é spread com objeto vazio condicional: ...cond ? {x} : {}\n if (/\\?\\s*\\{[^}]*\\}\\s*:\\s*\\{\\}/.test(lineContext)) continue;\n\n // Pular se é ternário com objeto vazio como fallback\n if (/:\\s*\\{\\}\\s*$/.test(lineContext.trim())) continue;\n\n const mensagem = `Tipo '${tipo}' é muito permissivo e pouco útil para type safety`;\n const sugestao = tipo === 'Object' ? 'Use Record<string, unknown> ou interface específica' : 'Use Record<string, never> para objetos vazios ou interface específica';\n\n if (shouldSuppressOccurrence('tipo-permissivo-object', relPath)) continue;\n\n ocorrencias.push({\n tipo: 'tipo-permissivo-object',\n nivel: 'aviso',\n mensagem: `${mensagem} | [IDEIA] ${sugestao}`,\n relPath,\n linha,\n contexto: lineContext\n });\n }\n\n// ─── DETECTAR TYPE ASSERTIONS (as any) ────────────────────────\n const asAnyPadrao = /\\b(as\\s+any)\\b/g;\n let asAnyMatch: RegExpMatchArray | null;\n while ((asAnyMatch = asAnyPadrao.exec(src)) !== null) {\n const position = asAnyMatch.index || 0;\n\n // Pular se estiver em string ou comentário\n if (isInStringOrComment(src, position)) {\n continue;\n }\n const linha = splitLines(src.substring(0, position)).length;\n const lineContext = splitLines(src)[linha - 1]?.trim() || '';\n\n // Extrair contexto da expressão\n const after = src.substring(position, Math.min(src.length, position + 50));\n const mensagem = \"Type assertion 'as any' desabilita verificação de tipos completamente\";\n let sugestao = '';\n\n // Detectar padrões comuns de type assertion\n if (/\\)\\s*as\\s+any/.test(lineContext)) {\n sugestao = 'Evite cast de retorno de função - tipar função corretamente ou usar unknown com type guard';\n } else if (/\\.\\w+\\s+as\\s+any/.test(lineContext)) {\n sugestao = 'Evite cast de propriedade - definir tipo correto no objeto pai';\n } else if (/\\bas\\s+any\\s*\\)/.test(after)) {\n sugestao = 'Type assertion em parâmetro - definir tipo correto na assinatura da função chamada';\n } else {\n sugestao = 'Substitua por tipo específico ou use unknown com validação runtime';\n }\n const mensagemCompleta = `${mensagem} | [IDEIA] ${sugestao} | [ALERT] CRÍTICO: Type safety completamente desabilitado | [BUSCA] Revisão manual obrigatória`;\n\n // Verifica se regra está suprimida para este arquivo\n if (shouldSuppressOccurrence('tipo-inseguro-any-assertion', relPath)) {\n continue;\n }\n ocorrencias.push({\n tipo: 'tipo-inseguro-any-assertion',\n nivel: 'erro',\n // Mais severo que declaração de tipo\n mensagem: mensagemCompleta,\n relPath,\n linha,\n contexto: lineContext\n });\n }\n\n// ─── DETECTAR ANGLE BRACKET CASTING (<any>) ───────────────────\n const angleBracketPadrao = /<any>/g;\n let angleBracketMatch: RegExpMatchArray | null;\n while ((angleBracketMatch = angleBracketPadrao.exec(src)) !== null) {\n const position = angleBracketMatch.index || 0;\n\n // Pular se estiver em string ou comentário\n if (isInStringOrComment(src, position)) {\n continue;\n }\n const linha = splitLines(src.substring(0, position)).length;\n const lineContext = splitLines(src)[linha - 1]?.trim() || '';\n const mensagemCompleta = \"Type casting '<any>' (sintaxe legada) desabilita type safety | [IDEIA] Use sintaxe 'as' moderna e tipo específico | [ALERT] CRÍTICO: Migrar para sintaxe moderna e tipo correto | [BUSCA] Revisão manual obrigatória\";\n\n // Verifica se regra está suprimida para este arquivo\n if (shouldSuppressOccurrence('tipo-inseguro-any-cast', relPath)) {\n continue;\n }\n ocorrencias.push({\n tipo: 'tipo-inseguro-any-cast',\n nivel: 'erro',\n mensagem: mensagemCompleta,\n relPath,\n linha,\n contexto: lineContext\n });\n }\n\n // Detectar uso de unknown\n const unknownPadrao = /:\\s*unknown\\b/g;\n let unknownMatch: RegExpMatchArray | null;\n while ((unknownMatch = unknownPadrao.exec(src)) !== null) {\n const position = unknownMatch.index || 0;\n\n // Pular se estiver em string ou comentário\n if (isInStringOrComment(src, position)) {\n continue;\n }\n\n // Pular se unknown está em contexto genérico apropriado (validação básica)\n if (isUnknownInGenericContext(src, position)) {\n continue;\n }\n\n // Análise contextual inteligente\n const linha = splitLines(src.substring(0, position)).length;\n const lineContext = splitLines(src)[linha - 1]?.trim() || '';\n const categorizacao = categorizarUnknown(src, fullCaminho || relPath, lineContext);\n\n // Extrair nome da variável\n const varNome = extractVariableName(unknownMatch, src);\n\n // Construir mensagem baseada na categorização\n let mensagem = '';\n let nivel: 'info' | 'aviso' | 'erro';\n if (categorizacao.categoria === 'legitimo') {\n // Legítimo com alta confiança (>=95%) - PULAR completamente\n if (categorizacao.confianca >= 95) {\n continue;\n }\n\n // Legítimo com confiança moderada (85-94%) - info apenas\n mensagem = varNome ? `Tipo 'unknown' em '${varNome}': ${categorizacao.motivo}` : `Tipo 'unknown': ${categorizacao.motivo}`;\n nivel = 'info';\n\n // Se tem sugestão, adicionar\n if (categorizacao.sugestao) {\n mensagem += ` | [IDEIA] ${categorizacao.sugestao}`;\n }\n } else if (categorizacao.categoria === 'melhoravel') {\n // Melhorável - aviso com sugestão\n nivel = 'aviso';\n mensagem = varNome ? `Tipo 'unknown' em '${varNome}' pode ser melhorado (${categorizacao.confianca}% confiança)` : `Tipo 'unknown' pode ser melhorado (${categorizacao.confianca}% confiança)`;\n mensagem += ` | ${categorizacao.motivo}`;\n if (categorizacao.sugestao) {\n mensagem += ` | [IDEIA] ${categorizacao.sugestao}`;\n } else {\n mensagem += ` | [IDEIA] Revisar uso para inferir tipo mais específico`;\n }\n mensagem += ` | [AVISO] Revisão manual recomendada`;\n } else {\n // Corrigir - erro que deve ser tratado\n nivel = 'erro';\n mensagem = varNome ? `Tipo 'unknown' em '${varNome}' deve ser corrigido (${categorizacao.confianca}% confiança)` : `Tipo 'unknown' deve ser corrigido (${categorizacao.confianca}% confiança)`;\n mensagem += ` | ${categorizacao.motivo}`;\n if (categorizacao.sugestao) {\n mensagem += ` | [EDIT] ${categorizacao.sugestao}`;\n }\n mensagem += ` | [BUSCA] Revisão manual obrigatória`;\n }\n\n // Verifica se regra está suprimida para este arquivo\n if (shouldSuppressOccurrence('tipo-inseguro-unknown', relPath)) {\n continue;\n }\n ocorrencias.push({\n tipo: 'tipo-inseguro-unknown',\n nivel,\n mensagem,\n relPath,\n linha,\n contexto: lineContext\n });\n }\n return ocorrencias;\n }\n};\nexport const detectorTiposInseguros = ANALISTA;\n"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"detector-documentation.js","sourceRoot":"","sources":["../../../src/analysts/plugins/detector-documentation.ts"],"names":[],"mappings":"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","sourcesContent":["// SPDX-License-Identifier: MIT\nimport type { NodePath } from '@babel/traverse';\nimport type { Node } from '@babel/types';\nimport { messages } from '@core/messages';\nimport { detectarContextoProjeto } from '@shared';\nimport { filtrarOcorrenciasSuprimidas } from '@shared/helpers';\n\nimport type { Analista, Ocorrencia, ProblemaDocumentacao } from '@';\nimport { criarOcorrencia } from '@';\n\nexport const analistaDocumentacao: Analista = {\n nome: 'documentacao',\n categoria: 'manutenibilidade',\n descricao: 'Detecta problemas de documentação e legibilidade do código',\n test: (relPath: string): boolean => {\n return /\\.(js|jsx|ts|tsx|mjs|cjs)$/.test(relPath);\n },\n aplicar: (src: string, relPath: string, ast: NodePath<Node> | null): Ocorrencia[] => {\n if (!src) return [];\n const contextoArquivo = detectarContextoProjeto({\n arquivo: relPath,\n conteudo: src,\n relPath\n });\n const problemas: ProblemaDocumentacao[] = [];\n try {\n // Detectar problemas por padrões de texto\n detectarPadroesDocumentacao(src, problemas, relPath);\n\n // Detectar problemas via AST quando disponível\n if (ast) {\n detectarProblemasDocumentacaoAST(ast, problemas);\n }\n\n // Converter para ocorrências\n const ocorrencias: Ocorrencia[] = [];\n\n // Agrupar por prioridade\n const porPrioridade = agruparPorPrioridade(problemas);\n for (const [prioridade, items] of Object.entries(porPrioridade)) {\n if (items.length > 0) {\n const nivel = mapearPrioridadeParaNivel(prioridade as ProblemaDocumentacao['prioridade']);\n\n // Ser mais relaxado com testes e arquivos de configuração\n const nivelAjustado = (contextoArquivo.isTest || contextoArquivo.isConfiguracao) && nivel === 'aviso' ? 'info' : nivel;\n const resumo = items.slice(0, 3).map(caminho => caminho.tipo).join(', ');\n ocorrencias.push(criarOcorrencia({\n tipo: 'problema-documentacao',\n nivel: nivelAjustado,\n mensagem: messages.DetectorAgregadosMensagens.problemasDocumentacaoResumo(prioridade, resumo, items.length),\n relPath,\n linha: items[0].linha\n }));\n }\n }\n\n // Aplicar supressões inline antes de retornar\n return filtrarOcorrenciasSuprimidas(ocorrencias, 'documentacao', src);\n } catch (erro) {\n return [criarOcorrencia({\n tipo: 'ERRO_ANALISE',\n nivel: 'aviso',\n mensagem: messages.DetectorAgregadosMensagens.erroAnalisarDocumentacao(erro),\n relPath,\n linha: 1\n })];\n }\n }\n};\nfunction detectarPadroesDocumentacao(src: string, problemas: ProblemaDocumentacao[], relPath: string): void {\n const linhas = src.split('\\n');\n\n // [ALVO] FILOSOFIA: Documentação é importante mas não deve poluir\n // - Detectar apenas problemas reais, não ausência de JSDoc em código interno\n // - Priorizar qualidade do código sobre quantidade de comentários\n // - Arquivos de biblioteca pública precisam mais documentação que utils internos\n\n // Verificar se é arquivo de biblioteca pública (requer documentação rigorosa)\n const isLibraryArquivo = relPath.includes('src/shared/') || relPath.includes('src/core/') || relPath.includes('lib/');\n\n // Arquivos que não precisam JSDoc rigoroso\n const isInternalArquivo = relPath.includes('/cli/') || relPath.includes('/test') || relPath.includes('/spec') || relPath.includes('/__tests__/') || relPath.includes('/fixtures/') || relPath.includes('/mocks/') || relPath.includes('config.') || relPath.includes('setup.') || relPath.includes('/messages/');\n let temExportacaoPublica = false;\n let temJSDoc = false;\n let dentroDeJSDoc = false;\n linhas.forEach((linha, index) => {\n const numeroLinha = index + 1;\n\n // Rastrear contexto JSDoc\n if (/\\/\\*\\*/.test(linha)) {\n temJSDoc = true;\n dentroDeJSDoc = true;\n }\n\n // Pular análise de problemas se estiver dentro de JSDoc ou linha começa com * (JSDoc)\n const linhaJSDoc = dentroDeJSDoc || /^\\s*\\*/.test(linha);\n if (linhaJSDoc) {\n // Verificar fechamento depois de pular análise\n if (/\\*\\//.test(linha)) {\n dentroDeJSDoc = false;\n }\n return; // Não analisar código dentro de comentários JSDoc\n }\n\n // Detectar exportações\n if (/^export\\s+(function|class|const|let|var|default)/.test(linha.trim())) {\n temExportacaoPublica = true;\n }\n\n // Variáveis com nomes de uma letra (exceto loops, cast types, e contextos legítimos)\n const singleLetterMatch = /\\b(const|let|var)\\s+([a-z])\\s*=/.exec(linha);\n if (singleLetterMatch && !/for\\s*\\(/.test(linha) && !/while\\s*\\(/.test(linha)) {\n const varNome = singleLetterMatch[2];\n // Excluir variáveis legítimas: i, j, k em contexto de iteração, tipos (x as Type)\n const isLoopContext = /\\b(i|j|k)\\s*=\\s*\\d+/.test(linha) || /\\b(i|j|k)\\s*[+\\-]=/.test(linha);\n const isTipoCast = /as\\s+\\w+/.test(linha) || /:\\s*\\w+\\s*=/.test(linha);\n if (!isLoopContext && !isTipoCast) {\n problemas.push({\n tipo: 'poor-naming',\n descricao: `Variável '${varNome}' com nome de uma letra dificulta compreensão`,\n prioridade: 'media',\n linha: numeroLinha,\n coluna: linha.indexOf(singleLetterMatch[0]) + 1,\n contexto: linha.trim(),\n sugestao: 'Use nomes descritivos para variáveis'\n });\n }\n }\n\n // Números mágicos (não em arrays ou comparações simples)\n const numMagico = /\\b(\\d{2,})\\b/.exec(linha);\n if (numMagico && !/(length|size|count)\\s*[=><!]/.test(linha) && !/\\[\\s*\\d+\\s*\\]/.test(linha) && parseInt(numMagico[1]) > 10) {\n problemas.push({\n tipo: 'magic-constants',\n descricao: `Número mágico ${numMagico[1]} sem explicação`,\n prioridade: 'baixa',\n linha: numeroLinha,\n coluna: linha.indexOf(numMagico[0]) + 1,\n contexto: linha.trim(),\n sugestao: 'Extraia para constante nomeada com comentário'\n });\n }\n\n // Comentários TODO antigos (aproximação heurística)\n if (/TODO.*\\d{4}/.test(linha)) {\n const ano = /TODO.*(\\d{4})/.exec(linha)?.[1];\n const anoAtual = new Date().getFullYear();\n if (ano && anoAtual - parseInt(ano) > 1) {\n problemas.push({\n tipo: 'outdated-comments',\n descricao: `TODO de ${ano} pode estar desatualizado`,\n prioridade: 'baixa',\n linha: numeroLinha,\n coluna: linha.indexOf('TODO') + 1,\n contexto: linha.trim(),\n sugestao: 'Revisar e atualizar ou implementar TODO antigo'\n });\n }\n }\n\n // TypeScript: tipos 'any' sem comentário explicativo (exceto em strings literais)\n if (/:\\s*any\\b/.test(linha) && !/\\/\\/|\\/\\*/.test(linha)) {\n // Verificar se não está dentro de string (ex: const code = 'x: any')\n const anyMatch = /:\\s*any\\b/.exec(linha);\n if (anyMatch) {\n const position = anyMatch.index;\n const before = linha.substring(0, position);\n // Contar aspas antes da posição\n const singleQuotes = (before.match(/'/g) || []).length;\n const doubleQuotes = (before.match(/\"/g) || []).length;\n const backticks = (before.match(/`/g) || []).length;\n\n // Se número ímpar de aspas, está dentro de string\n const dentroDeString = singleQuotes % 2 !== 0 || doubleQuotes % 2 !== 0 || backticks % 2 !== 0;\n if (!dentroDeString) {\n problemas.push({\n tipo: 'missing-types',\n descricao: 'Tipo any sem justificativa via comentário',\n prioridade: 'media',\n linha: numeroLinha,\n coluna: position + 1,\n contexto: linha.trim(),\n sugestao: 'Adicione comentário explicando uso de any ou use tipo mais específico'\n });\n }\n }\n }\n });\n\n // [BIBLIOTECA] DETECÇÃO INTELIGENTE DE FALTA DE DOCUMENTAÇÃO\n // Apenas reportar se:\n // 1. É arquivo de biblioteca pública (shared/, core/, lib/) E\n // 2. Tem exportações públicas E\n // 3. Não tem nenhum JSDoc E\n // 4. Não é arquivo de teste/config/setup\n if (isLibraryArquivo && temExportacaoPublica && !temJSDoc && !isInternalArquivo && src.length > 200) {\n // Arquivo grande o suficiente para justificar documentação\n problemas.push({\n tipo: 'missing-jsdoc',\n descricao: 'Arquivo de biblioteca pública sem documentação',\n prioridade: 'media',\n // Reduzido de 'alta' para 'media'\n linha: 1,\n coluna: 1,\n contexto: 'Arquivo de biblioteca',\n sugestao: 'Considere adicionar JSDoc para APIs públicas (funções/classes exportadas principais)'\n });\n }\n}\nfunction detectarProblemasDocumentacaoAST(ast: NodePath<Node>, problemas: ProblemaDocumentacao[]): void {\n try {\n ast.traverse({\n // [ALVO] FILOSOFIA: Detectar apenas exports DEFAULT sem JSDoc\n // Exports nomeados podem ser auto-explicativos pelo nome\n ExportDefaultDeclaration(path) {\n if ((path.node.declaration.type === 'FunctionDeclaration' || path.node.declaration.type === 'ClassDeclaration') && !path.node.leadingComments?.some(elem => elem.value.startsWith('*'))) {\n problemas.push({\n tipo: 'missing-jsdoc',\n descricao: 'Export default (principal) sem JSDoc',\n prioridade: 'media',\n // Reduzido de 'alta'\n linha: path.node.loc?.start.line || 0,\n coluna: path.node.loc?.start.column || 0,\n contexto: 'Export default',\n sugestao: 'Documente a API principal do módulo para facilitar uso'\n });\n }\n },\n // Classes públicas complexas (>3 métodos) sem documentação\n ClassDeclaration(path) {\n const node = path.node;\n if (node.body.body.length > 3 &&\n // Apenas classes não-triviais\n !node.leadingComments?.some(elem => elem.value.startsWith('*')) && node.id?.name && !node.id.name.toLowerCase().includes('test') && !node.id.name.toLowerCase().includes('mock')) {\n // Verificar se é exportada\n const parent = path.parent;\n const isExported = parent.type === 'ExportNamedDeclaration' || parent.type === 'ExportDefaultDeclaration';\n if (isExported) {\n problemas.push({\n tipo: 'missing-jsdoc',\n descricao: `Classe pública ${node.id.name} (${node.body.body.length} membros) sem documentação`,\n prioridade: 'media',\n linha: node.loc?.start.line || 0,\n coluna: node.loc?.start.column || 0,\n contexto: 'ClassDeclaration',\n sugestao: 'Documente o propósito e principais responsabilidades da classe'\n });\n }\n }\n }\n\n // 🚫 REMOVIDO: Detecção de funções com muitos parâmetros\n // Motivo: Gera muito ruído em código interno/utils\n // Alternativa: Revisar code review manual ou usar linter específico\n });\n } catch {\n // Ignorar erros de traverse\n }\n}\nfunction agruparPorPrioridade(problemas: ProblemaDocumentacao[]): Record<string, ProblemaDocumentacao[]> {\n return problemas.reduce((acc, problema) => {\n const prioridade = problema.prioridade;\n if (prioridade) {\n if (!acc[prioridade]) {\n acc[prioridade] = [];\n }\n acc[prioridade].push(problema);\n }\n return acc;\n }, {} as Record<string, ProblemaDocumentacao[]>);\n}\nfunction mapearPrioridadeParaNivel(prioridade: ProblemaDocumentacao['prioridade']): 'info' | 'aviso' | 'erro' {\n switch (prioridade) {\n case 'alta':\n return 'aviso';\n // Documentação raramente é erro crítico\n case 'media':\n return 'aviso';\n case 'baixa':\n default:\n return 'info';\n }\n}"]}
|
|
1
|
+
{"version":3,"file":"detector-documentation.js","sourceRoot":"","sources":["../../../src/analysts/plugins/detector-documentation.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,OAAO,EAAE,uBAAuB,EAAE,MAAM,SAAS,CAAC;AAClD,OAAO,EAAE,4BAA4B,EAAE,MAAM,iBAAiB,CAAC;AAG/D,OAAO,EAAE,eAAe,EAAE,MAAM,GAAG,CAAC;AAEpC,MAAM,CAAC,MAAM,oBAAoB,GAAa;IAC5C,IAAI,EAAE,cAAc;IACpB,SAAS,EAAE,kBAAkB;IAC7B,SAAS,EAAE,4DAA4D;IACvE,IAAI,EAAE,CAAC,OAAe,EAAW,EAAE;QACjC,OAAO,4BAA4B,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;IACpD,CAAC;IACD,OAAO,EAAE,CAAC,GAAW,EAAE,OAAe,EAAE,GAA0B,EAAgB,EAAE;QAClF,IAAI,CAAC,GAAG;YAAE,OAAO,EAAE,CAAC;QACpB,MAAM,eAAe,GAAG,uBAAuB,CAAC;YAC9C,OAAO,EAAE,OAAO;YAChB,QAAQ,EAAE,GAAG;YACb,OAAO;SACR,CAAC,CAAC;QACH,MAAM,SAAS,GAA2B,EAAE,CAAC;QAC7C,IAAI,CAAC;YAEH,2BAA2B,CAAC,GAAG,EAAE,SAAS,EAAE,OAAO,CAAC,CAAC;YAGrD,IAAI,GAAG,EAAE,CAAC;gBACR,gCAAgC,CAAC,GAAG,EAAE,SAAS,CAAC,CAAC;YACnD,CAAC;YAGD,MAAM,WAAW,GAAiB,EAAE,CAAC;YAGrC,MAAM,aAAa,GAAG,oBAAoB,CAAC,SAAS,CAAC,CAAC;YACtD,KAAK,MAAM,CAAC,UAAU,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,aAAa,CAAC,EAAE,CAAC;gBAChE,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBACrB,MAAM,KAAK,GAAG,yBAAyB,CAAC,UAAgD,CAAC,CAAC;oBAG1F,MAAM,aAAa,GAAG,CAAC,eAAe,CAAC,MAAM,IAAI,eAAe,CAAC,cAAc,CAAC,IAAI,KAAK,KAAK,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,KAAK,CAAC;oBACvH,MAAM,MAAM,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;oBACzE,WAAW,CAAC,IAAI,CAAC,eAAe,CAAC;wBAC/B,IAAI,EAAE,uBAAuB;wBAC7B,KAAK,EAAE,aAAa;wBACpB,QAAQ,EAAE,QAAQ,CAAC,0BAA0B,CAAC,2BAA2B,CAAC,UAAU,EAAE,MAAM,EAAE,KAAK,CAAC,MAAM,CAAC;wBAC3G,OAAO;wBACP,KAAK,EAAE,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK;qBACtB,CAAC,CAAC,CAAC;gBACN,CAAC;YACH,CAAC;YAGD,OAAO,4BAA4B,CAAC,WAAW,EAAE,cAAc,EAAE,GAAG,CAAC,CAAC;QACxE,CAAC;QAAC,OAAO,IAAI,EAAE,CAAC;YACd,OAAO,CAAC,eAAe,CAAC;oBACtB,IAAI,EAAE,cAAc;oBACpB,KAAK,EAAE,OAAO;oBACd,QAAQ,EAAE,QAAQ,CAAC,0BAA0B,CAAC,wBAAwB,CAAC,IAAI,CAAC;oBAC5E,OAAO;oBACP,KAAK,EAAE,CAAC;iBACT,CAAC,CAAC,CAAC;QACN,CAAC;IACH,CAAC;CACF,CAAC;AACF,SAAS,2BAA2B,CAAC,GAAW,EAAE,SAAiC,EAAE,OAAe;IAClG,MAAM,MAAM,GAAG,GAAG,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAQ/B,MAAM,gBAAgB,GAAG,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC;IAGtH,MAAM,iBAAiB,GAAG,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAC,CAAC;IACjT,IAAI,oBAAoB,GAAG,KAAK,CAAC;IACjC,IAAI,QAAQ,GAAG,KAAK,CAAC;IACrB,IAAI,aAAa,GAAG,KAAK,CAAC;IAC1B,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAC9B,MAAM,WAAW,GAAG,KAAK,GAAG,CAAC,CAAC;QAG9B,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,QAAQ,GAAG,IAAI,CAAC;YAChB,aAAa,GAAG,IAAI,CAAC;QACvB,CAAC;QAGD,MAAM,UAAU,GAAG,aAAa,IAAI,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACzD,IAAI,UAAU,EAAE,CAAC;YAEf,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;gBACvB,aAAa,GAAG,KAAK,CAAC;YACxB,CAAC;YACD,OAAO;QACT,CAAC;QAGD,IAAI,kDAAkD,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,EAAE,CAAC;YAC1E,oBAAoB,GAAG,IAAI,CAAC;QAC9B,CAAC;QAGD,MAAM,iBAAiB,GAAG,iCAAiC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QACxE,IAAI,iBAAiB,IAAI,CAAC,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9E,MAAM,OAAO,GAAG,iBAAiB,CAAC,CAAC,CAAC,CAAC;YAErC,MAAM,aAAa,GAAG,qBAAqB,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,oBAAoB,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YAC5F,MAAM,UAAU,GAAG,UAAU,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACvE,IAAI,CAAC,aAAa,IAAI,CAAC,UAAU,EAAE,CAAC;gBAClC,SAAS,CAAC,IAAI,CAAC;oBACb,IAAI,EAAE,aAAa;oBACnB,SAAS,EAAE,aAAa,OAAO,+CAA+C;oBAC9E,UAAU,EAAE,OAAO;oBACnB,KAAK,EAAE,WAAW;oBAClB,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,iBAAiB,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;oBAC/C,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE;oBACtB,QAAQ,EAAE,sCAAsC;iBACjD,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAGD,MAAM,SAAS,GAAG,cAAc,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,IAAI,SAAS,IAAI,CAAC,8BAA8B,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,QAAQ,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC;YAC5H,SAAS,CAAC,IAAI,CAAC;gBACb,IAAI,EAAE,iBAAiB;gBACvB,SAAS,EAAE,iBAAiB,SAAS,CAAC,CAAC,CAAC,iBAAiB;gBACzD,UAAU,EAAE,OAAO;gBACnB,KAAK,EAAE,WAAW;gBAClB,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC;gBACvC,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE;gBACtB,QAAQ,EAAE,+CAA+C;aAC1D,CAAC,CAAC;QACL,CAAC;QAGD,IAAI,aAAa,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAC9B,MAAM,GAAG,GAAG,eAAe,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC;YAC7C,MAAM,QAAQ,GAAG,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC;YAC1C,IAAI,GAAG,IAAI,QAAQ,GAAG,QAAQ,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC;gBACxC,SAAS,CAAC,IAAI,CAAC;oBACb,IAAI,EAAE,mBAAmB;oBACzB,SAAS,EAAE,WAAW,GAAG,2BAA2B;oBACpD,UAAU,EAAE,OAAO;oBACnB,KAAK,EAAE,WAAW;oBAClB,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,GAAG,CAAC;oBACjC,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE;oBACtB,QAAQ,EAAE,gDAAgD;iBAC3D,CAAC,CAAC;YACL,CAAC;QACH,CAAC;QAGD,IAAI,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC;YAExD,MAAM,QAAQ,GAAG,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;YACzC,IAAI,QAAQ,EAAE,CAAC;gBACb,MAAM,QAAQ,GAAG,QAAQ,CAAC,KAAK,CAAC;gBAChC,MAAM,MAAM,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;gBAE5C,MAAM,YAAY,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;gBACvD,MAAM,YAAY,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;gBACvD,MAAM,SAAS,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC;gBAGpD,MAAM,cAAc,GAAG,YAAY,GAAG,CAAC,KAAK,CAAC,IAAI,YAAY,GAAG,CAAC,KAAK,CAAC,IAAI,SAAS,GAAG,CAAC,KAAK,CAAC,CAAC;gBAC/F,IAAI,CAAC,cAAc,EAAE,CAAC;oBACpB,SAAS,CAAC,IAAI,CAAC;wBACb,IAAI,EAAE,eAAe;wBACrB,SAAS,EAAE,2CAA2C;wBACtD,UAAU,EAAE,OAAO;wBACnB,KAAK,EAAE,WAAW;wBAClB,MAAM,EAAE,QAAQ,GAAG,CAAC;wBACpB,QAAQ,EAAE,KAAK,CAAC,IAAI,EAAE;wBACtB,QAAQ,EAAE,uEAAuE;qBAClF,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;IACH,CAAC,CAAC,CAAC;IAQH,IAAI,gBAAgB,IAAI,oBAAoB,IAAI,CAAC,QAAQ,IAAI,CAAC,iBAAiB,IAAI,GAAG,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QAEpG,SAAS,CAAC,IAAI,CAAC;YACb,IAAI,EAAE,eAAe;YACrB,SAAS,EAAE,gDAAgD;YAC3D,UAAU,EAAE,OAAO;YAEnB,KAAK,EAAE,CAAC;YACR,MAAM,EAAE,CAAC;YACT,QAAQ,EAAE,uBAAuB;YACjC,QAAQ,EAAE,sFAAsF;SACjG,CAAC,CAAC;IACL,CAAC;AACH,CAAC;AACD,SAAS,gCAAgC,CAAC,GAAmB,EAAE,SAAiC;IAC9F,IAAI,CAAC;QACH,GAAG,CAAC,QAAQ,CAAC;YAGX,wBAAwB,CAAC,IAAI;gBAC3B,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,qBAAqB,IAAI,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,IAAI,KAAK,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC;oBACxL,SAAS,CAAC,IAAI,CAAC;wBACb,IAAI,EAAE,eAAe;wBACrB,SAAS,EAAE,sCAAsC;wBACjD,UAAU,EAAE,OAAO;wBAEnB,KAAK,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC;wBACrC,MAAM,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC;wBACxC,QAAQ,EAAE,gBAAgB;wBAC1B,QAAQ,EAAE,wDAAwD;qBACnE,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;YAED,gBAAgB,CAAC,IAAI;gBACnB,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC;gBACvB,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC;oBAE7B,CAAC,IAAI,CAAC,eAAe,EAAE,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,IAAI,CAAC,EAAE,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,MAAM,CAAC,EAAE,CAAC;oBAEjL,MAAM,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;oBAC3B,MAAM,UAAU,GAAG,MAAM,CAAC,IAAI,KAAK,wBAAwB,IAAI,MAAM,CAAC,IAAI,KAAK,0BAA0B,CAAC;oBAC1G,IAAI,UAAU,EAAE,CAAC;wBACf,SAAS,CAAC,IAAI,CAAC;4BACb,IAAI,EAAE,eAAe;4BACrB,SAAS,EAAE,kBAAkB,IAAI,CAAC,EAAE,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,MAAM,4BAA4B;4BAC/F,UAAU,EAAE,OAAO;4BACnB,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,IAAI,CAAC;4BAChC,MAAM,EAAE,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,MAAM,IAAI,CAAC;4BACnC,QAAQ,EAAE,kBAAkB;4BAC5B,QAAQ,EAAE,gEAAgE;yBAC3E,CAAC,CAAC;oBACL,CAAC;gBACH,CAAC;YACH,CAAC;SAKF,CAAC,CAAC;IACL,CAAC;IAAC,MAAM,CAAC;IAET,CAAC;AACH,CAAC;AACD,SAAS,oBAAoB,CAAC,SAAiC;IAC7D,OAAO,SAAS,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,QAAQ,EAAE,EAAE;QACxC,MAAM,UAAU,GAAG,QAAQ,CAAC,UAAU,CAAC;QACvC,IAAI,UAAU,EAAE,CAAC;YACf,IAAI,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,CAAC;gBACrB,GAAG,CAAC,UAAU,CAAC,GAAG,EAAE,CAAC;YACvB,CAAC;YACD,GAAG,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACjC,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,EAAE,EAA4C,CAAC,CAAC;AACnD,CAAC;AACD,SAAS,yBAAyB,CAAC,UAA8C;IAC/E,QAAQ,UAAU,EAAE,CAAC;QACnB,KAAK,MAAM;YACT,OAAO,OAAO,CAAC;QAEjB,KAAK,OAAO;YACV,OAAO,OAAO,CAAC;QACjB,KAAK,OAAO,CAAC;QACb;YACE,OAAO,MAAM,CAAC;IAClB,CAAC;AACH,CAAC","sourcesContent":["// SPDX-License-Identifier: MIT\nimport type { NodePath } from '@babel/traverse';\nimport type { Node } from '@babel/types';\nimport { messages } from '@core/messages';\nimport { detectarContextoProjeto } from '@shared';\nimport { filtrarOcorrenciasSuprimidas } from '@shared/helpers';\n\nimport type { Analista, Ocorrencia, ProblemaDocumentacao } from '@';\nimport { criarOcorrencia } from '@';\n\nexport const analistaDocumentacao: Analista = {\n nome: 'documentacao',\n categoria: 'manutenibilidade',\n descricao: 'Detecta problemas de documentação e legibilidade do código',\n test: (relPath: string): boolean => {\n return /\\.(js|jsx|ts|tsx|mjs|cjs)$/.test(relPath);\n },\n aplicar: (src: string, relPath: string, ast: NodePath<Node> | null): Ocorrencia[] => {\n if (!src) return [];\n const contextoArquivo = detectarContextoProjeto({\n arquivo: relPath,\n conteudo: src,\n relPath\n });\n const problemas: ProblemaDocumentacao[] = [];\n try {\n // Detectar problemas por padrões de texto\n detectarPadroesDocumentacao(src, problemas, relPath);\n\n // Detectar problemas via AST quando disponível\n if (ast) {\n detectarProblemasDocumentacaoAST(ast, problemas);\n }\n\n // Converter para ocorrências\n const ocorrencias: Ocorrencia[] = [];\n\n // Agrupar por prioridade\n const porPrioridade = agruparPorPrioridade(problemas);\n for (const [prioridade, items] of Object.entries(porPrioridade)) {\n if (items.length > 0) {\n const nivel = mapearPrioridadeParaNivel(prioridade as ProblemaDocumentacao['prioridade']);\n\n // Ser mais relaxado com testes e arquivos de configuração\n const nivelAjustado = (contextoArquivo.isTest || contextoArquivo.isConfiguracao) && nivel === 'aviso' ? 'info' : nivel;\n const resumo = items.slice(0, 3).map(caminho => caminho.tipo).join(', ');\n ocorrencias.push(criarOcorrencia({\n tipo: 'problema-documentacao',\n nivel: nivelAjustado,\n mensagem: messages.DetectorAgregadosMensagens.problemasDocumentacaoResumo(prioridade, resumo, items.length),\n relPath,\n linha: items[0].linha\n }));\n }\n }\n\n // Aplicar supressões inline antes de retornar\n return filtrarOcorrenciasSuprimidas(ocorrencias, 'documentacao', src);\n } catch (erro) {\n return [criarOcorrencia({\n tipo: 'ERRO_ANALISE',\n nivel: 'aviso',\n mensagem: messages.DetectorAgregadosMensagens.erroAnalisarDocumentacao(erro),\n relPath,\n linha: 1\n })];\n }\n }\n};\nfunction detectarPadroesDocumentacao(src: string, problemas: ProblemaDocumentacao[], relPath: string): void {\n const linhas = src.split('\\n');\n\n // [ALVO] FILOSOFIA: Documentação é importante mas não deve poluir\n // - Detectar apenas problemas reais, não ausência de JSDoc em código interno\n // - Priorizar qualidade do código sobre quantidade de comentários\n // - Arquivos de biblioteca pública precisam mais documentação que utils internos\n\n // Verificar se é arquivo de biblioteca pública (requer documentação rigorosa)\n const isLibraryArquivo = relPath.includes('src/shared/') || relPath.includes('src/core/') || relPath.includes('lib/');\n\n // Arquivos que não precisam JSDoc rigoroso\n const isInternalArquivo = relPath.includes('/cli/') || relPath.includes('/test') || relPath.includes('/spec') || relPath.includes('/__tests__/') || relPath.includes('/fixtures/') || relPath.includes('/mocks/') || relPath.includes('config.') || relPath.includes('setup.') || relPath.includes('/messages/');\n let temExportacaoPublica = false;\n let temJSDoc = false;\n let dentroDeJSDoc = false;\n linhas.forEach((linha, index) => {\n const numeroLinha = index + 1;\n\n // Rastrear contexto JSDoc\n if (/\\/\\*\\*/.test(linha)) {\n temJSDoc = true;\n dentroDeJSDoc = true;\n }\n\n // Pular análise de problemas se estiver dentro de JSDoc ou linha começa com * (JSDoc)\n const linhaJSDoc = dentroDeJSDoc || /^\\s*\\*/.test(linha);\n if (linhaJSDoc) {\n // Verificar fechamento depois de pular análise\n if (/\\*\\//.test(linha)) {\n dentroDeJSDoc = false;\n }\n return; // Não analisar código dentro de comentários JSDoc\n }\n\n // Detectar exportações\n if (/^export\\s+(function|class|const|let|var|default)/.test(linha.trim())) {\n temExportacaoPublica = true;\n }\n\n // Variáveis com nomes de uma letra (exceto loops, cast types, e contextos legítimos)\n const singleLetterMatch = /\\b(const|let|var)\\s+([a-z])\\s*=/.exec(linha);\n if (singleLetterMatch && !/for\\s*\\(/.test(linha) && !/while\\s*\\(/.test(linha)) {\n const varNome = singleLetterMatch[2];\n // Excluir variáveis legítimas: i, j, k em contexto de iteração, tipos (x as Type)\n const isLoopContext = /\\b(i|j|k)\\s*=\\s*\\d+/.test(linha) || /\\b(i|j|k)\\s*[+\\-]=/.test(linha);\n const isTipoCast = /as\\s+\\w+/.test(linha) || /:\\s*\\w+\\s*=/.test(linha);\n if (!isLoopContext && !isTipoCast) {\n problemas.push({\n tipo: 'poor-naming',\n descricao: `Variável '${varNome}' com nome de uma letra dificulta compreensão`,\n prioridade: 'media',\n linha: numeroLinha,\n coluna: linha.indexOf(singleLetterMatch[0]) + 1,\n contexto: linha.trim(),\n sugestao: 'Use nomes descritivos para variáveis'\n });\n }\n }\n\n // Números mágicos (não em arrays ou comparações simples)\n const numMagico = /\\b(\\d{2,})\\b/.exec(linha);\n if (numMagico && !/(length|size|count)\\s*[=><!]/.test(linha) && !/\\[\\s*\\d+\\s*\\]/.test(linha) && parseInt(numMagico[1]) > 10) {\n problemas.push({\n tipo: 'magic-constants',\n descricao: `Número mágico ${numMagico[1]} sem explicação`,\n prioridade: 'baixa',\n linha: numeroLinha,\n coluna: linha.indexOf(numMagico[0]) + 1,\n contexto: linha.trim(),\n sugestao: 'Extraia para constante nomeada com comentário'\n });\n }\n\n // Comentários TODO antigos (aproximação heurística)\n if (/TODO.*\\d{4}/.test(linha)) {\n const ano = /TODO.*(\\d{4})/.exec(linha)?.[1];\n const anoAtual = new Date().getFullYear();\n if (ano && anoAtual - parseInt(ano) > 1) {\n problemas.push({\n tipo: 'outdated-comments',\n descricao: `TODO de ${ano} pode estar desatualizado`,\n prioridade: 'baixa',\n linha: numeroLinha,\n coluna: linha.indexOf('TODO') + 1,\n contexto: linha.trim(),\n sugestao: 'Revisar e atualizar ou implementar TODO antigo'\n });\n }\n }\n\n // TypeScript: tipos 'any' sem comentário explicativo (exceto em strings literais)\n if (/:\\s*any\\b/.test(linha) && !/\\/\\/|\\/\\*/.test(linha)) {\n // Verificar se não está dentro de string (ex: const code = 'x: any')\n const anyMatch = /:\\s*any\\b/.exec(linha);\n if (anyMatch) {\n const position = anyMatch.index;\n const before = linha.substring(0, position);\n // Contar aspas antes da posição\n const singleQuotes = (before.match(/'/g) || []).length;\n const doubleQuotes = (before.match(/\"/g) || []).length;\n const backticks = (before.match(/`/g) || []).length;\n\n // Se número ímpar de aspas, está dentro de string\n const dentroDeString = singleQuotes % 2 !== 0 || doubleQuotes % 2 !== 0 || backticks % 2 !== 0;\n if (!dentroDeString) {\n problemas.push({\n tipo: 'missing-types',\n descricao: 'Tipo any sem justificativa via comentário',\n prioridade: 'media',\n linha: numeroLinha,\n coluna: position + 1,\n contexto: linha.trim(),\n sugestao: 'Adicione comentário explicando uso de any ou use tipo mais específico'\n });\n }\n }\n }\n });\n\n // [BIBLIOTECA] DETECÇÃO INTELIGENTE DE FALTA DE DOCUMENTAÇÃO\n // Apenas reportar se:\n // 1. É arquivo de biblioteca pública (shared/, core/, lib/) E\n // 2. Tem exportações públicas E\n // 3. Não tem nenhum JSDoc E\n // 4. Não é arquivo de teste/config/setup\n if (isLibraryArquivo && temExportacaoPublica && !temJSDoc && !isInternalArquivo && src.length > 200) {\n // Arquivo grande o suficiente para justificar documentação\n problemas.push({\n tipo: 'missing-jsdoc',\n descricao: 'Arquivo de biblioteca pública sem documentação',\n prioridade: 'media',\n // Reduzido de 'alta' para 'media'\n linha: 1,\n coluna: 1,\n contexto: 'Arquivo de biblioteca',\n sugestao: 'Considere adicionar JSDoc para APIs públicas (funções/classes exportadas principais)'\n });\n }\n}\nfunction detectarProblemasDocumentacaoAST(ast: NodePath<Node>, problemas: ProblemaDocumentacao[]): void {\n try {\n ast.traverse({\n // [ALVO] FILOSOFIA: Detectar apenas exports DEFAULT sem JSDoc\n // Exports nomeados podem ser auto-explicativos pelo nome\n ExportDefaultDeclaration(path) {\n if ((path.node.declaration.type === 'FunctionDeclaration' || path.node.declaration.type === 'ClassDeclaration') && !path.node.leadingComments?.some(elem => elem.value.startsWith('*'))) {\n problemas.push({\n tipo: 'missing-jsdoc',\n descricao: 'Export default (principal) sem JSDoc',\n prioridade: 'media',\n // Reduzido de 'alta'\n linha: path.node.loc?.start.line || 0,\n coluna: path.node.loc?.start.column || 0,\n contexto: 'Export default',\n sugestao: 'Documente a API principal do módulo para facilitar uso'\n });\n }\n },\n // Classes públicas complexas (>3 métodos) sem documentação\n ClassDeclaration(path) {\n const node = path.node;\n if (node.body.body.length > 3 &&\n // Apenas classes não-triviais\n !node.leadingComments?.some(elem => elem.value.startsWith('*')) && node.id?.name && !node.id.name.toLowerCase().includes('test') && !node.id.name.toLowerCase().includes('mock')) {\n // Verificar se é exportada\n const parent = path.parent;\n const isExported = parent.type === 'ExportNamedDeclaration' || parent.type === 'ExportDefaultDeclaration';\n if (isExported) {\n problemas.push({\n tipo: 'missing-jsdoc',\n descricao: `Classe pública ${node.id.name} (${node.body.body.length} membros) sem documentação`,\n prioridade: 'media',\n linha: node.loc?.start.line || 0,\n coluna: node.loc?.start.column || 0,\n contexto: 'ClassDeclaration',\n sugestao: 'Documente o propósito e principais responsabilidades da classe'\n });\n }\n }\n }\n\n // [NO] REMOVIDO: Detecção de funções com muitos parâmetros\n // Motivo: Gera muito ruído em código interno/utils\n // Alternativa: Revisar code review manual ou usar linter específico\n });\n } catch {\n // Ignorar erros de traverse\n }\n}\nfunction agruparPorPrioridade(problemas: ProblemaDocumentacao[]): Record<string, ProblemaDocumentacao[]> {\n return problemas.reduce((acc, problema) => {\n const prioridade = problema.prioridade;\n if (prioridade) {\n if (!acc[prioridade]) {\n acc[prioridade] = [];\n }\n acc[prioridade].push(problema);\n }\n return acc;\n }, {} as Record<string, ProblemaDocumentacao[]>);\n}\nfunction mapearPrioridadeParaNivel(prioridade: ProblemaDocumentacao['prioridade']): 'info' | 'aviso' | 'erro' {\n switch (prioridade) {\n case 'alta':\n return 'aviso';\n // Documentação raramente é erro crítico\n case 'media':\n return 'aviso';\n case 'baixa':\n default:\n return 'info';\n }\n}"]}
|