@jterrats/smart-deployment 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +193 -0
- package/lib/ai/agentforce-error-handler.d.ts +81 -0
- package/lib/ai/agentforce-error-handler.js +196 -0
- package/lib/ai/agentforce-error-handler.js.map +1 -0
- package/lib/ai/agentforce-priority-service.d.ts +82 -0
- package/lib/ai/agentforce-priority-service.js +257 -0
- package/lib/ai/agentforce-priority-service.js.map +1 -0
- package/lib/ai/agentforce-service.d.ts +99 -0
- package/lib/ai/agentforce-service.js +300 -0
- package/lib/ai/agentforce-service.js.map +1 -0
- package/lib/ai/circuit-breaker.d.ts +115 -0
- package/lib/ai/circuit-breaker.js +277 -0
- package/lib/ai/circuit-breaker.js.map +1 -0
- package/lib/ai/dependency-inference-service.d.ts +76 -0
- package/lib/ai/dependency-inference-service.js +220 -0
- package/lib/ai/dependency-inference-service.js.map +1 -0
- package/lib/ai/llm-provider-factory.d.ts +15 -0
- package/lib/ai/llm-provider-factory.js +36 -0
- package/lib/ai/llm-provider-factory.js.map +1 -0
- package/lib/ai/llm-provider.d.ts +27 -0
- package/lib/ai/llm-provider.js +2 -0
- package/lib/ai/llm-provider.js.map +1 -0
- package/lib/ai/openai-service.d.ts +20 -0
- package/lib/ai/openai-service.js +89 -0
- package/lib/ai/openai-service.js.map +1 -0
- package/lib/ai/prompt-builder.d.ts +79 -0
- package/lib/ai/prompt-builder.js +180 -0
- package/lib/ai/prompt-builder.js.map +1 -0
- package/lib/ai/response-parser.d.ts +67 -0
- package/lib/ai/response-parser.js +234 -0
- package/lib/ai/response-parser.js.map +1 -0
- package/lib/ai/wave-validation-service.d.ts +111 -0
- package/lib/ai/wave-validation-service.js +381 -0
- package/lib/ai/wave-validation-service.js.map +1 -0
- package/lib/analysis/analysis-reporter.d.ts +56 -0
- package/lib/analysis/analysis-reporter.js +170 -0
- package/lib/analysis/analysis-reporter.js.map +1 -0
- package/lib/analytics/error-analytics.d.ts +80 -0
- package/lib/analytics/error-analytics.js +162 -0
- package/lib/analytics/error-analytics.js.map +1 -0
- package/lib/commands/analyze.d.ts +49 -0
- package/lib/commands/analyze.js +232 -0
- package/lib/commands/analyze.js.map +1 -0
- package/lib/commands/config.d.ts +42 -0
- package/lib/commands/config.js +219 -0
- package/lib/commands/config.js.map +1 -0
- package/lib/commands/resume.d.ts +26 -0
- package/lib/commands/resume.js +69 -0
- package/lib/commands/resume.js.map +1 -0
- package/lib/commands/start.d.ts +70 -0
- package/lib/commands/start.js +659 -0
- package/lib/commands/start.js.map +1 -0
- package/lib/commands/status.d.ts +37 -0
- package/lib/commands/status.js +69 -0
- package/lib/commands/status.js.map +1 -0
- package/lib/commands/validate.d.ts +33 -0
- package/lib/commands/validate.js +66 -0
- package/lib/commands/validate.js.map +1 -0
- package/lib/config/repo-config.d.ts +22 -0
- package/lib/config/repo-config.js +31 -0
- package/lib/config/repo-config.js.map +1 -0
- package/lib/constants/agentforce-limits.d.ts +174 -0
- package/lib/constants/agentforce-limits.js +262 -0
- package/lib/constants/agentforce-limits.js.map +1 -0
- package/lib/constants/api-version.d.ts +70 -0
- package/lib/constants/api-version.js +122 -0
- package/lib/constants/api-version.js.map +1 -0
- package/lib/constants/deployment-order.d.ts +68 -0
- package/lib/constants/deployment-order.js +162 -0
- package/lib/constants/deployment-order.js.map +1 -0
- package/lib/constants/salesforce-limits.d.ts +107 -0
- package/lib/constants/salesforce-limits.js +104 -0
- package/lib/constants/salesforce-limits.js.map +1 -0
- package/lib/dependencies/circular-dependency-detector.d.ts +137 -0
- package/lib/dependencies/circular-dependency-detector.js +329 -0
- package/lib/dependencies/circular-dependency-detector.js.map +1 -0
- package/lib/dependencies/cycle-remediation-planner.d.ts +50 -0
- package/lib/dependencies/cycle-remediation-planner.js +192 -0
- package/lib/dependencies/cycle-remediation-planner.js.map +1 -0
- package/lib/dependencies/dependency-cache.d.ts +134 -0
- package/lib/dependencies/dependency-cache.js +303 -0
- package/lib/dependencies/dependency-cache.js.map +1 -0
- package/lib/dependencies/dependency-depth-calculator.d.ts +145 -0
- package/lib/dependencies/dependency-depth-calculator.js +368 -0
- package/lib/dependencies/dependency-depth-calculator.js.map +1 -0
- package/lib/dependencies/dependency-graph-builder.d.ts +151 -0
- package/lib/dependencies/dependency-graph-builder.js +411 -0
- package/lib/dependencies/dependency-graph-builder.js.map +1 -0
- package/lib/dependencies/dependency-impact-analyzer.d.ts +145 -0
- package/lib/dependencies/dependency-impact-analyzer.js +330 -0
- package/lib/dependencies/dependency-impact-analyzer.js.map +1 -0
- package/lib/dependencies/dependency-merger.d.ts +122 -0
- package/lib/dependencies/dependency-merger.js +245 -0
- package/lib/dependencies/dependency-merger.js.map +1 -0
- package/lib/dependencies/dependency-resolver.d.ts +157 -0
- package/lib/dependencies/dependency-resolver.js +298 -0
- package/lib/dependencies/dependency-resolver.js.map +1 -0
- package/lib/dependencies/dependency-validator.d.ts +123 -0
- package/lib/dependencies/dependency-validator.js +291 -0
- package/lib/dependencies/dependency-validator.js.map +1 -0
- package/lib/dependencies/graph-visualizer.d.ts +110 -0
- package/lib/dependencies/graph-visualizer.js +262 -0
- package/lib/dependencies/graph-visualizer.js.map +1 -0
- package/lib/dependencies/heuristic-inference.d.ts +136 -0
- package/lib/dependencies/heuristic-inference.js +430 -0
- package/lib/dependencies/heuristic-inference.js.map +1 -0
- package/lib/deployment/cycle-source-editor.d.ts +34 -0
- package/lib/deployment/cycle-source-editor.js +121 -0
- package/lib/deployment/cycle-source-editor.js.map +1 -0
- package/lib/deployment/deployment-error-handler.d.ts +38 -0
- package/lib/deployment/deployment-error-handler.js +79 -0
- package/lib/deployment/deployment-error-handler.js.map +1 -0
- package/lib/deployment/deployment-reporter.d.ts +63 -0
- package/lib/deployment/deployment-reporter.js +150 -0
- package/lib/deployment/deployment-reporter.js.map +1 -0
- package/lib/deployment/deployment-state-summary.d.ts +38 -0
- package/lib/deployment/deployment-state-summary.js +209 -0
- package/lib/deployment/deployment-state-summary.js.map +1 -0
- package/lib/deployment/deployment-status-service.d.ts +36 -0
- package/lib/deployment/deployment-status-service.js +128 -0
- package/lib/deployment/deployment-status-service.js.map +1 -0
- package/lib/deployment/deployment-tracker.d.ts +42 -0
- package/lib/deployment/deployment-tracker.js +79 -0
- package/lib/deployment/deployment-tracker.js.map +1 -0
- package/lib/deployment/deployment-validation-service.d.ts +28 -0
- package/lib/deployment/deployment-validation-service.js +161 -0
- package/lib/deployment/deployment-validation-service.js.map +1 -0
- package/lib/deployment/retry-handler.d.ts +37 -0
- package/lib/deployment/retry-handler.js +86 -0
- package/lib/deployment/retry-handler.js.map +1 -0
- package/lib/deployment/sf-cli-integration.d.ts +42 -0
- package/lib/deployment/sf-cli-integration.js +105 -0
- package/lib/deployment/sf-cli-integration.js.map +1 -0
- package/lib/deployment/state-manager.d.ts +61 -0
- package/lib/deployment/state-manager.js +83 -0
- package/lib/deployment/state-manager.js.map +1 -0
- package/lib/deployment/test-executor.d.ts +41 -0
- package/lib/deployment/test-executor.js +87 -0
- package/lib/deployment/test-executor.js.map +1 -0
- package/lib/errors/base-error.d.ts +24 -0
- package/lib/errors/base-error.js +66 -0
- package/lib/errors/base-error.js.map +1 -0
- package/lib/errors/dependency-error.d.ts +37 -0
- package/lib/errors/dependency-error.js +76 -0
- package/lib/errors/dependency-error.js.map +1 -0
- package/lib/errors/deployment-error.d.ts +55 -0
- package/lib/errors/deployment-error.js +132 -0
- package/lib/errors/deployment-error.js.map +1 -0
- package/lib/errors/index.d.ts +45 -0
- package/lib/errors/index.js +71 -0
- package/lib/errors/index.js.map +1 -0
- package/lib/errors/network-error.d.ts +53 -0
- package/lib/errors/network-error.js +111 -0
- package/lib/errors/network-error.js.map +1 -0
- package/lib/errors/parsing-error.d.ts +41 -0
- package/lib/errors/parsing-error.js +69 -0
- package/lib/errors/parsing-error.js.map +1 -0
- package/lib/errors/validation-error-reporter.d.ts +34 -0
- package/lib/errors/validation-error-reporter.js +99 -0
- package/lib/errors/validation-error-reporter.js.map +1 -0
- package/lib/errors/validation-error.d.ts +58 -0
- package/lib/errors/validation-error.js +131 -0
- package/lib/errors/validation-error.js.map +1 -0
- package/lib/index.d.ts +2 -0
- package/lib/index.js +2 -0
- package/lib/index.js.map +1 -0
- package/lib/monitoring/performance-monitor.d.ts +98 -0
- package/lib/monitoring/performance-monitor.js +260 -0
- package/lib/monitoring/performance-monitor.js.map +1 -0
- package/lib/parsers/apex-class-parser.d.ts +47 -0
- package/lib/parsers/apex-class-parser.js +368 -0
- package/lib/parsers/apex-class-parser.js.map +1 -0
- package/lib/parsers/apex-trigger-parser.d.ts +48 -0
- package/lib/parsers/apex-trigger-parser.js +229 -0
- package/lib/parsers/apex-trigger-parser.js.map +1 -0
- package/lib/parsers/aura-parser.d.ts +55 -0
- package/lib/parsers/aura-parser.js +229 -0
- package/lib/parsers/aura-parser.js.map +1 -0
- package/lib/parsers/bot-parser.d.ts +65 -0
- package/lib/parsers/bot-parser.js +225 -0
- package/lib/parsers/bot-parser.js.map +1 -0
- package/lib/parsers/custom-metadata-parser.d.ts +94 -0
- package/lib/parsers/custom-metadata-parser.js +199 -0
- package/lib/parsers/custom-metadata-parser.js.map +1 -0
- package/lib/parsers/custom-object-parser.d.ts +62 -0
- package/lib/parsers/custom-object-parser.js +297 -0
- package/lib/parsers/custom-object-parser.js.map +1 -0
- package/lib/parsers/email-template-parser.d.ts +64 -0
- package/lib/parsers/email-template-parser.js +238 -0
- package/lib/parsers/email-template-parser.js.map +1 -0
- package/lib/parsers/error-resilient-parser.d.ts +110 -0
- package/lib/parsers/error-resilient-parser.js +277 -0
- package/lib/parsers/error-resilient-parser.js.map +1 -0
- package/lib/parsers/flexipage-parser.d.ts +64 -0
- package/lib/parsers/flexipage-parser.js +196 -0
- package/lib/parsers/flexipage-parser.js.map +1 -0
- package/lib/parsers/flow-parser.d.ts +54 -0
- package/lib/parsers/flow-parser.js +287 -0
- package/lib/parsers/flow-parser.js.map +1 -0
- package/lib/parsers/genai-prompt-parser.d.ts +67 -0
- package/lib/parsers/genai-prompt-parser.js +160 -0
- package/lib/parsers/genai-prompt-parser.js.map +1 -0
- package/lib/parsers/layout-parser.d.ts +64 -0
- package/lib/parsers/layout-parser.js +267 -0
- package/lib/parsers/layout-parser.js.map +1 -0
- package/lib/parsers/lwc-parser.d.ts +60 -0
- package/lib/parsers/lwc-parser.js +264 -0
- package/lib/parsers/lwc-parser.js.map +1 -0
- package/lib/parsers/permission-set-parser.d.ts +86 -0
- package/lib/parsers/permission-set-parser.js +152 -0
- package/lib/parsers/permission-set-parser.js.map +1 -0
- package/lib/parsers/profile-parser.d.ts +81 -0
- package/lib/parsers/profile-parser.js +141 -0
- package/lib/parsers/profile-parser.js.map +1 -0
- package/lib/parsers/visualforce-parser.d.ts +47 -0
- package/lib/parsers/visualforce-parser.js +180 -0
- package/lib/parsers/visualforce-parser.js.map +1 -0
- package/lib/provisioning/data-provisioner.d.ts +88 -0
- package/lib/provisioning/data-provisioner.js +257 -0
- package/lib/provisioning/data-provisioner.js.map +1 -0
- package/lib/scanner/custom-structure-scanner.d.ts +66 -0
- package/lib/scanner/custom-structure-scanner.js +229 -0
- package/lib/scanner/custom-structure-scanner.js.map +1 -0
- package/lib/scanner/forceignore-parser.d.ts +69 -0
- package/lib/scanner/forceignore-parser.js +195 -0
- package/lib/scanner/forceignore-parser.js.map +1 -0
- package/lib/scanner/metadata-format-scanner.d.ts +77 -0
- package/lib/scanner/metadata-format-scanner.js +282 -0
- package/lib/scanner/metadata-format-scanner.js.map +1 -0
- package/lib/scanner/monorepo-scanner.d.ts +71 -0
- package/lib/scanner/monorepo-scanner.js +225 -0
- package/lib/scanner/monorepo-scanner.js.map +1 -0
- package/lib/scanner/project-validator.d.ts +55 -0
- package/lib/scanner/project-validator.js +235 -0
- package/lib/scanner/project-validator.js.map +1 -0
- package/lib/scanner/sfdx-project-detector.d.ts +86 -0
- package/lib/scanner/sfdx-project-detector.js +240 -0
- package/lib/scanner/sfdx-project-detector.js.map +1 -0
- package/lib/scanner/structure-validator.d.ts +64 -0
- package/lib/scanner/structure-validator.js +296 -0
- package/lib/scanner/structure-validator.js.map +1 -0
- package/lib/services/metadata-scanner-service.d.ts +64 -0
- package/lib/services/metadata-scanner-service.js +651 -0
- package/lib/services/metadata-scanner-service.js.map +1 -0
- package/lib/types/agentforce.d.ts +157 -0
- package/lib/types/agentforce.js +2 -0
- package/lib/types/agentforce.js.map +1 -0
- package/lib/types/dependency.d.ts +98 -0
- package/lib/types/dependency.js +5 -0
- package/lib/types/dependency.js.map +1 -0
- package/lib/types/deployment-plan.d.ts +81 -0
- package/lib/types/deployment-plan.js +6 -0
- package/lib/types/deployment-plan.js.map +1 -0
- package/lib/types/deployment.d.ts +88 -0
- package/lib/types/deployment.js +5 -0
- package/lib/types/deployment.js.map +1 -0
- package/lib/types/graph.d.ts +35 -0
- package/lib/types/graph.js +5 -0
- package/lib/types/graph.js.map +1 -0
- package/lib/types/index.d.ts +12 -0
- package/lib/types/index.js +17 -0
- package/lib/types/index.js.map +1 -0
- package/lib/types/metadata.d.ts +101 -0
- package/lib/types/metadata.js +13 -0
- package/lib/types/metadata.js.map +1 -0
- package/lib/types/project.d.ts +156 -0
- package/lib/types/project.js +56 -0
- package/lib/types/project.js.map +1 -0
- package/lib/types/salesforce/apex.d.ts +94 -0
- package/lib/types/salesforce/apex.js +6 -0
- package/lib/types/salesforce/apex.js.map +1 -0
- package/lib/types/salesforce/aura.d.ts +150 -0
- package/lib/types/salesforce/aura.js +6 -0
- package/lib/types/salesforce/aura.js.map +1 -0
- package/lib/types/salesforce/bot.d.ts +293 -0
- package/lib/types/salesforce/bot.js +6 -0
- package/lib/types/salesforce/bot.js.map +1 -0
- package/lib/types/salesforce/common.d.ts +15 -0
- package/lib/types/salesforce/common.js +5 -0
- package/lib/types/salesforce/common.js.map +1 -0
- package/lib/types/salesforce/custom-metadata.d.ts +92 -0
- package/lib/types/salesforce/custom-metadata.js +6 -0
- package/lib/types/salesforce/custom-metadata.js.map +1 -0
- package/lib/types/salesforce/email.d.ts +56 -0
- package/lib/types/salesforce/email.js +6 -0
- package/lib/types/salesforce/email.js.map +1 -0
- package/lib/types/salesforce/flexipage.d.ts +149 -0
- package/lib/types/salesforce/flexipage.js +6 -0
- package/lib/types/salesforce/flexipage.js.map +1 -0
- package/lib/types/salesforce/flow.d.ts +516 -0
- package/lib/types/salesforce/flow.js +6 -0
- package/lib/types/salesforce/flow.js.map +1 -0
- package/lib/types/salesforce/genai.d.ts +67 -0
- package/lib/types/salesforce/genai.js +6 -0
- package/lib/types/salesforce/genai.js.map +1 -0
- package/lib/types/salesforce/index.d.ts +27 -0
- package/lib/types/salesforce/index.js +43 -0
- package/lib/types/salesforce/index.js.map +1 -0
- package/lib/types/salesforce/layout.d.ts +236 -0
- package/lib/types/salesforce/layout.js +6 -0
- package/lib/types/salesforce/layout.js.map +1 -0
- package/lib/types/salesforce/lwc.d.ts +123 -0
- package/lib/types/salesforce/lwc.js +6 -0
- package/lib/types/salesforce/lwc.js.map +1 -0
- package/lib/types/salesforce/object.d.ts +427 -0
- package/lib/types/salesforce/object.js +6 -0
- package/lib/types/salesforce/object.js.map +1 -0
- package/lib/types/salesforce/parser-types.d.ts +79 -0
- package/lib/types/salesforce/parser-types.js +80 -0
- package/lib/types/salesforce/parser-types.js.map +1 -0
- package/lib/types/salesforce/permission.d.ts +289 -0
- package/lib/types/salesforce/permission.js +6 -0
- package/lib/types/salesforce/permission.js.map +1 -0
- package/lib/types/salesforce/resource.d.ts +93 -0
- package/lib/types/salesforce/resource.js +6 -0
- package/lib/types/salesforce/resource.js.map +1 -0
- package/lib/types/salesforce/visualforce.d.ts +70 -0
- package/lib/types/salesforce/visualforce.js +6 -0
- package/lib/types/salesforce/visualforce.js.map +1 -0
- package/lib/utils/cache-manager.d.ts +158 -0
- package/lib/utils/cache-manager.js +429 -0
- package/lib/utils/cache-manager.js.map +1 -0
- package/lib/utils/deployment-plan-manager.d.ts +40 -0
- package/lib/utils/deployment-plan-manager.js +183 -0
- package/lib/utils/deployment-plan-manager.js.map +1 -0
- package/lib/utils/error-aggregator.d.ts +117 -0
- package/lib/utils/error-aggregator.js +268 -0
- package/lib/utils/error-aggregator.js.map +1 -0
- package/lib/utils/file-system.d.ts +62 -0
- package/lib/utils/file-system.js +167 -0
- package/lib/utils/file-system.js.map +1 -0
- package/lib/utils/functional.d.ts +52 -0
- package/lib/utils/functional.js +61 -0
- package/lib/utils/functional.js.map +1 -0
- package/lib/utils/graph-algorithms.d.ts +53 -0
- package/lib/utils/graph-algorithms.js +177 -0
- package/lib/utils/graph-algorithms.js.map +1 -0
- package/lib/utils/logger.d.ts +154 -0
- package/lib/utils/logger.js +327 -0
- package/lib/utils/logger.js.map +1 -0
- package/lib/utils/network-handler.d.ts +64 -0
- package/lib/utils/network-handler.js +147 -0
- package/lib/utils/network-handler.js.map +1 -0
- package/lib/utils/performance.d.ts +148 -0
- package/lib/utils/performance.js +294 -0
- package/lib/utils/performance.js.map +1 -0
- package/lib/utils/string.d.ts +197 -0
- package/lib/utils/string.js +331 -0
- package/lib/utils/string.js.map +1 -0
- package/lib/utils/xml.d.ts +97 -0
- package/lib/utils/xml.js +227 -0
- package/lib/utils/xml.js.map +1 -0
- package/lib/validators/xml-metadata-validator.d.ts +106 -0
- package/lib/validators/xml-metadata-validator.js +509 -0
- package/lib/validators/xml-metadata-validator.js.map +1 -0
- package/lib/waves/priority-wave-generator-ai.d.ts +85 -0
- package/lib/waves/priority-wave-generator-ai.js +191 -0
- package/lib/waves/priority-wave-generator-ai.js.map +1 -0
- package/lib/waves/priority-wave-generator.d.ts +47 -0
- package/lib/waves/priority-wave-generator.js +88 -0
- package/lib/waves/priority-wave-generator.js.map +1 -0
- package/lib/waves/test-optimizer.d.ts +155 -0
- package/lib/waves/test-optimizer.js +290 -0
- package/lib/waves/test-optimizer.js.map +1 -0
- package/lib/waves/wave-builder.d.ts +147 -0
- package/lib/waves/wave-builder.js +286 -0
- package/lib/waves/wave-builder.js.map +1 -0
- package/lib/waves/wave-diff-generator.d.ts +17 -0
- package/lib/waves/wave-diff-generator.js +6 -0
- package/lib/waves/wave-diff-generator.js.map +1 -0
- package/lib/waves/wave-executor.d.ts +33 -0
- package/lib/waves/wave-executor.js +50 -0
- package/lib/waves/wave-executor.js.map +1 -0
- package/lib/waves/wave-merger.d.ts +96 -0
- package/lib/waves/wave-merger.js +181 -0
- package/lib/waves/wave-merger.js.map +1 -0
- package/lib/waves/wave-metadata-generator.d.ts +13 -0
- package/lib/waves/wave-metadata-generator.js +12 -0
- package/lib/waves/wave-metadata-generator.js.map +1 -0
- package/lib/waves/wave-splitter.d.ts +154 -0
- package/lib/waves/wave-splitter.js +307 -0
- package/lib/waves/wave-splitter.js.map +1 -0
- package/lib/waves/wave-validator.d.ts +17 -0
- package/lib/waves/wave-validator.js +15 -0
- package/lib/waves/wave-validator.js.map +1 -0
- package/messages/analyze.json +18 -0
- package/messages/config.json +29 -0
- package/messages/resume.json +9 -0
- package/messages/start.json +24 -0
- package/messages/status.json +8 -0
- package/messages/validate.json +9 -0
- package/npm-shrinkwrap.json +25676 -0
- package/oclif.lock +11988 -0
- package/oclif.manifest.json +589 -0
- package/package.json +224 -0
|
@@ -0,0 +1,235 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project Structure Validator - US-084
|
|
3
|
+
* Validates SFDX project structure
|
|
4
|
+
*
|
|
5
|
+
* @ac US-084-AC-1: Validate sfdx-project.json schema
|
|
6
|
+
* @ac US-084-AC-2: Validate package directories exist
|
|
7
|
+
* @ac US-084-AC-3: Validate metadata structure
|
|
8
|
+
* @ac US-084-AC-4: Check for required files
|
|
9
|
+
* @ac US-084-AC-5: Generate validation report
|
|
10
|
+
* @ac US-084-AC-6: Suggest fixes for issues
|
|
11
|
+
* @issue #84
|
|
12
|
+
*/
|
|
13
|
+
import * as fs from 'node:fs';
|
|
14
|
+
import * as path from 'node:path';
|
|
15
|
+
import { getLogger } from '../utils/logger.js';
|
|
16
|
+
import { SfdxProjectDetector } from './sfdx-project-detector.js';
|
|
17
|
+
const logger = getLogger('ProjectValidator');
|
|
18
|
+
/**
|
|
19
|
+
* @ac US-084-AC-1: Validate sfdx-project.json schema
|
|
20
|
+
*/
|
|
21
|
+
export class ProjectValidator {
|
|
22
|
+
/**
|
|
23
|
+
* Validate project structure
|
|
24
|
+
*/
|
|
25
|
+
async validate(projectRoot) {
|
|
26
|
+
const startTime = Date.now();
|
|
27
|
+
const report = {
|
|
28
|
+
isValid: true,
|
|
29
|
+
issues: [],
|
|
30
|
+
checkedItems: [],
|
|
31
|
+
executionTime: 0,
|
|
32
|
+
};
|
|
33
|
+
try {
|
|
34
|
+
// Check 1: sfdx-project.json exists
|
|
35
|
+
this.validateSfdxProjectJson(projectRoot, report);
|
|
36
|
+
// Check 2: Package directories exist
|
|
37
|
+
await this.validatePackageDirectories(projectRoot, report);
|
|
38
|
+
// Check 3: Metadata structure
|
|
39
|
+
await this.validateMetadataStructure(projectRoot, report);
|
|
40
|
+
// Check 4: Required files
|
|
41
|
+
this.validateRequiredFiles(projectRoot, report);
|
|
42
|
+
// Determine overall validity
|
|
43
|
+
report.isValid = !report.issues.some((i) => i.severity === 'error');
|
|
44
|
+
report.executionTime = Date.now() - startTime;
|
|
45
|
+
logger.info('Project validation complete', {
|
|
46
|
+
isValid: report.isValid,
|
|
47
|
+
issues: report.issues.length,
|
|
48
|
+
executionTime: report.executionTime,
|
|
49
|
+
});
|
|
50
|
+
return report;
|
|
51
|
+
}
|
|
52
|
+
catch (error) {
|
|
53
|
+
report.isValid = false;
|
|
54
|
+
report.issues.push({
|
|
55
|
+
severity: 'error',
|
|
56
|
+
message: 'Validation failed: ' + (error instanceof Error ? error.message : String(error)),
|
|
57
|
+
});
|
|
58
|
+
report.executionTime = Date.now() - startTime;
|
|
59
|
+
return report;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* @ac US-084-AC-1: Validate sfdx-project.json schema
|
|
64
|
+
*/
|
|
65
|
+
validateSfdxProjectJson(projectRoot, report) {
|
|
66
|
+
report.checkedItems.push('sfdx-project.json existence');
|
|
67
|
+
const sfdxProjectPath = path.join(projectRoot, 'sfdx-project.json');
|
|
68
|
+
if (!fs.existsSync(sfdxProjectPath)) {
|
|
69
|
+
report.issues.push({
|
|
70
|
+
severity: 'error',
|
|
71
|
+
message: 'sfdx-project.json not found',
|
|
72
|
+
path: sfdxProjectPath,
|
|
73
|
+
suggestion: 'Run: sfdx force:project:create to initialize a new project',
|
|
74
|
+
});
|
|
75
|
+
return;
|
|
76
|
+
}
|
|
77
|
+
// Validate JSON structure
|
|
78
|
+
try {
|
|
79
|
+
const content = fs.readFileSync(sfdxProjectPath, 'utf-8');
|
|
80
|
+
const config = JSON.parse(content);
|
|
81
|
+
report.checkedItems.push('sfdx-project.json valid JSON');
|
|
82
|
+
// Check required fields
|
|
83
|
+
if (!config.packageDirectories) {
|
|
84
|
+
report.issues.push({
|
|
85
|
+
severity: 'error',
|
|
86
|
+
message: 'packageDirectories field missing in sfdx-project.json',
|
|
87
|
+
path: sfdxProjectPath,
|
|
88
|
+
suggestion: 'Add packageDirectories array to sfdx-project.json',
|
|
89
|
+
});
|
|
90
|
+
}
|
|
91
|
+
if (!config.namespace && !config.sfdcLoginUrl) {
|
|
92
|
+
report.issues.push({
|
|
93
|
+
severity: 'warning',
|
|
94
|
+
message: 'Neither namespace nor sfdcLoginUrl defined',
|
|
95
|
+
path: sfdxProjectPath,
|
|
96
|
+
suggestion: 'Consider adding sfdcLoginUrl for proper authentication',
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
report.checkedItems.push('sfdx-project.json schema');
|
|
100
|
+
}
|
|
101
|
+
catch {
|
|
102
|
+
report.issues.push({
|
|
103
|
+
severity: 'error',
|
|
104
|
+
message: 'Invalid JSON in sfdx-project.json',
|
|
105
|
+
path: sfdxProjectPath,
|
|
106
|
+
suggestion: 'Fix JSON syntax errors',
|
|
107
|
+
});
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
/**
|
|
111
|
+
* @ac US-084-AC-2: Validate package directories exist
|
|
112
|
+
*/
|
|
113
|
+
async validatePackageDirectories(projectRoot, report) {
|
|
114
|
+
report.checkedItems.push('package directories');
|
|
115
|
+
const projectInfo = await SfdxProjectDetector.detect(projectRoot);
|
|
116
|
+
for (const packageDir of projectInfo.packageDirectories) {
|
|
117
|
+
const fullPath = path.join(projectRoot, packageDir);
|
|
118
|
+
if (!fs.existsSync(fullPath)) {
|
|
119
|
+
report.issues.push({
|
|
120
|
+
severity: 'error',
|
|
121
|
+
message: `Package directory does not exist: ${packageDir}`,
|
|
122
|
+
path: fullPath,
|
|
123
|
+
suggestion: `Create directory: mkdir -p ${packageDir}`,
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
/**
|
|
129
|
+
* @ac US-084-AC-3: Validate metadata structure
|
|
130
|
+
*/
|
|
131
|
+
async validateMetadataStructure(projectRoot, report) {
|
|
132
|
+
report.checkedItems.push('metadata structure');
|
|
133
|
+
const projectInfo = await SfdxProjectDetector.detect(projectRoot);
|
|
134
|
+
for (const packageDir of projectInfo.packageDirectories) {
|
|
135
|
+
const packagePath = path.join(projectRoot, packageDir);
|
|
136
|
+
if (!fs.existsSync(packagePath))
|
|
137
|
+
continue;
|
|
138
|
+
// Check for common metadata folders
|
|
139
|
+
const commonFolders = ['classes', 'triggers', 'objects', 'lwc', 'aura'];
|
|
140
|
+
let hasMetadata = false;
|
|
141
|
+
for (const folder of commonFolders) {
|
|
142
|
+
const folderPath = path.join(packagePath, 'main', 'default', folder);
|
|
143
|
+
if (fs.existsSync(folderPath)) {
|
|
144
|
+
hasMetadata = true;
|
|
145
|
+
break;
|
|
146
|
+
}
|
|
147
|
+
}
|
|
148
|
+
if (!hasMetadata) {
|
|
149
|
+
report.issues.push({
|
|
150
|
+
severity: 'info',
|
|
151
|
+
message: `No metadata found in package: ${packageDir}`,
|
|
152
|
+
path: packagePath,
|
|
153
|
+
suggestion: 'This might be intentional for a new project',
|
|
154
|
+
});
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* @ac US-084-AC-4: Check for required files
|
|
160
|
+
*/
|
|
161
|
+
validateRequiredFiles(projectRoot, report) {
|
|
162
|
+
report.checkedItems.push('required files');
|
|
163
|
+
const recommendedFiles = [
|
|
164
|
+
{ file: '.gitignore', severity: 'warning', suggestion: 'Add .gitignore to exclude build artifacts' },
|
|
165
|
+
{
|
|
166
|
+
file: '.forceignore',
|
|
167
|
+
severity: 'warning',
|
|
168
|
+
suggestion: 'Add .forceignore to exclude files from deployment',
|
|
169
|
+
},
|
|
170
|
+
{ file: 'README.md', severity: 'info', suggestion: 'Add README.md to document your project' },
|
|
171
|
+
];
|
|
172
|
+
for (const { file, severity, suggestion } of recommendedFiles) {
|
|
173
|
+
const filePath = path.join(projectRoot, file);
|
|
174
|
+
if (!fs.existsSync(filePath)) {
|
|
175
|
+
report.issues.push({
|
|
176
|
+
severity,
|
|
177
|
+
message: `${file} not found`,
|
|
178
|
+
path: filePath,
|
|
179
|
+
suggestion,
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
/**
|
|
185
|
+
* @ac US-084-AC-5: Generate validation report
|
|
186
|
+
* @ac US-084-AC-6: Suggest fixes for issues
|
|
187
|
+
* Format validation report
|
|
188
|
+
*/
|
|
189
|
+
formatReport(report) {
|
|
190
|
+
const lines = [];
|
|
191
|
+
lines.push('✓ Project Validation Report');
|
|
192
|
+
lines.push('═══════════════════════════════════════');
|
|
193
|
+
lines.push(`Status: ${report.isValid ? '✅ VALID' : '❌ INVALID'}`);
|
|
194
|
+
lines.push(`Checks Performed: ${report.checkedItems.length}`);
|
|
195
|
+
lines.push(`Issues Found: ${report.issues.length}`);
|
|
196
|
+
lines.push(`Execution Time: ${report.executionTime}ms`);
|
|
197
|
+
lines.push('');
|
|
198
|
+
if (report.issues.length > 0) {
|
|
199
|
+
const errors = report.issues.filter((i) => i.severity === 'error');
|
|
200
|
+
const warnings = report.issues.filter((i) => i.severity === 'warning');
|
|
201
|
+
const info = report.issues.filter((i) => i.severity === 'info');
|
|
202
|
+
if (errors.length > 0) {
|
|
203
|
+
lines.push(`❌ Errors (${errors.length}):`);
|
|
204
|
+
for (const issue of errors) {
|
|
205
|
+
lines.push(` ${issue.message}`);
|
|
206
|
+
if (issue.suggestion) {
|
|
207
|
+
lines.push(` 💡 ${issue.suggestion}`);
|
|
208
|
+
}
|
|
209
|
+
}
|
|
210
|
+
lines.push('');
|
|
211
|
+
}
|
|
212
|
+
if (warnings.length > 0) {
|
|
213
|
+
lines.push(`⚠️ Warnings (${warnings.length}):`);
|
|
214
|
+
for (const issue of warnings) {
|
|
215
|
+
lines.push(` ${issue.message}`);
|
|
216
|
+
if (issue.suggestion) {
|
|
217
|
+
lines.push(` 💡 ${issue.suggestion}`);
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
lines.push('');
|
|
221
|
+
}
|
|
222
|
+
if (info.length > 0) {
|
|
223
|
+
lines.push(`ℹ️ Info (${info.length}):`);
|
|
224
|
+
for (const issue of info) {
|
|
225
|
+
lines.push(` ${issue.message}`);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
else {
|
|
230
|
+
lines.push('✅ No issues found - project structure is valid!');
|
|
231
|
+
}
|
|
232
|
+
return lines.join('\n');
|
|
233
|
+
}
|
|
234
|
+
}
|
|
235
|
+
//# sourceMappingURL=project-validator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"project-validator.js","sourceRoot":"","sources":["../../src/scanner/project-validator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,86 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SFDX Project Detector - US-079
|
|
3
|
+
* Detects and validates Salesforce DX project structure
|
|
4
|
+
*
|
|
5
|
+
* @ac US-079-AC-1: Detect sfdx-project.json
|
|
6
|
+
* @ac US-079-AC-2: Parse project configuration
|
|
7
|
+
* @ac US-079-AC-3: Validate project structure
|
|
8
|
+
* @ac US-079-AC-4: Detect package directories
|
|
9
|
+
* @ac US-079-AC-5: Support multi-package projects
|
|
10
|
+
* @ac US-079-AC-6: Report project metadata
|
|
11
|
+
* @issue #79
|
|
12
|
+
*/
|
|
13
|
+
export type SfdxProjectJson = {
|
|
14
|
+
packageDirectories: PackageDirectory[];
|
|
15
|
+
namespace?: string;
|
|
16
|
+
sourceApiVersion: string;
|
|
17
|
+
sfdcLoginUrl?: string;
|
|
18
|
+
plugins?: Record<string, unknown>;
|
|
19
|
+
[key: string]: unknown;
|
|
20
|
+
};
|
|
21
|
+
export type PackageDirectory = {
|
|
22
|
+
path: string;
|
|
23
|
+
default?: boolean;
|
|
24
|
+
package?: string;
|
|
25
|
+
versionName?: string;
|
|
26
|
+
versionNumber?: string;
|
|
27
|
+
dependencies?: PackageDependency[];
|
|
28
|
+
};
|
|
29
|
+
export type PackageDependency = {
|
|
30
|
+
package: string;
|
|
31
|
+
versionNumber: string;
|
|
32
|
+
};
|
|
33
|
+
export type ProjectDetectionResult = {
|
|
34
|
+
detected: boolean;
|
|
35
|
+
projectRoot: string;
|
|
36
|
+
projectFile: string;
|
|
37
|
+
projectConfig?: SfdxProjectJson;
|
|
38
|
+
packageDirectories: string[];
|
|
39
|
+
defaultPackageDirectory?: string;
|
|
40
|
+
isMultiPackage: boolean;
|
|
41
|
+
apiVersion: string;
|
|
42
|
+
namespace?: string;
|
|
43
|
+
errors: string[];
|
|
44
|
+
warnings: string[];
|
|
45
|
+
};
|
|
46
|
+
/**
|
|
47
|
+
* @ac US-079-AC-1: Detect sfdx-project.json
|
|
48
|
+
* @ac US-079-AC-2: Parse project configuration
|
|
49
|
+
*/
|
|
50
|
+
export declare class SfdxProjectDetector {
|
|
51
|
+
private static readonly PROJECT_FILE_NAME;
|
|
52
|
+
private static readonly MAX_SEARCH_DEPTH;
|
|
53
|
+
/**
|
|
54
|
+
* Detect SFDX project starting from a given directory
|
|
55
|
+
* Searches up the directory tree until finding sfdx-project.json
|
|
56
|
+
*/
|
|
57
|
+
static detect(startPath: string): Promise<ProjectDetectionResult>;
|
|
58
|
+
/**
|
|
59
|
+
* @ac US-079-AC-1: Detect sfdx-project.json
|
|
60
|
+
* Search up the directory tree for sfdx-project.json
|
|
61
|
+
*/
|
|
62
|
+
private static findProjectFile;
|
|
63
|
+
private static findProjectFileRecursive;
|
|
64
|
+
/**
|
|
65
|
+
* @ac US-079-AC-2: Parse project configuration
|
|
66
|
+
*/
|
|
67
|
+
private static parseProjectFile;
|
|
68
|
+
/**
|
|
69
|
+
* @ac US-079-AC-3: Validate project structure
|
|
70
|
+
* @ac US-079-AC-4: Detect package directories
|
|
71
|
+
* @ac US-079-AC-5: Support multi-package projects
|
|
72
|
+
*/
|
|
73
|
+
private static validateProjectStructure;
|
|
74
|
+
/**
|
|
75
|
+
* @ac US-079-AC-6: Report project metadata
|
|
76
|
+
*/
|
|
77
|
+
static formatDetectionReport(result: ProjectDetectionResult): string;
|
|
78
|
+
/**
|
|
79
|
+
* Check if a path is within an SFDX project
|
|
80
|
+
*/
|
|
81
|
+
static isInProject(path: string): Promise<boolean>;
|
|
82
|
+
/**
|
|
83
|
+
* Get project root for a given path
|
|
84
|
+
*/
|
|
85
|
+
static getProjectRoot(path: string): Promise<string | null>;
|
|
86
|
+
}
|
|
@@ -0,0 +1,240 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* SFDX Project Detector - US-079
|
|
3
|
+
* Detects and validates Salesforce DX project structure
|
|
4
|
+
*
|
|
5
|
+
* @ac US-079-AC-1: Detect sfdx-project.json
|
|
6
|
+
* @ac US-079-AC-2: Parse project configuration
|
|
7
|
+
* @ac US-079-AC-3: Validate project structure
|
|
8
|
+
* @ac US-079-AC-4: Detect package directories
|
|
9
|
+
* @ac US-079-AC-5: Support multi-package projects
|
|
10
|
+
* @ac US-079-AC-6: Report project metadata
|
|
11
|
+
* @issue #79
|
|
12
|
+
*/
|
|
13
|
+
import { readFile, access } from 'node:fs/promises';
|
|
14
|
+
import { resolve, dirname, join } from 'node:path';
|
|
15
|
+
import { getLogger } from '../utils/logger.js';
|
|
16
|
+
const logger = getLogger('SfdxProjectDetector');
|
|
17
|
+
/**
|
|
18
|
+
* @ac US-079-AC-1: Detect sfdx-project.json
|
|
19
|
+
* @ac US-079-AC-2: Parse project configuration
|
|
20
|
+
*/
|
|
21
|
+
export class SfdxProjectDetector {
|
|
22
|
+
static PROJECT_FILE_NAME = 'sfdx-project.json';
|
|
23
|
+
static MAX_SEARCH_DEPTH = 5;
|
|
24
|
+
/**
|
|
25
|
+
* Detect SFDX project starting from a given directory
|
|
26
|
+
* Searches up the directory tree until finding sfdx-project.json
|
|
27
|
+
*/
|
|
28
|
+
static async detect(startPath) {
|
|
29
|
+
logger.info('Detecting SFDX project', { startPath });
|
|
30
|
+
const result = {
|
|
31
|
+
detected: false,
|
|
32
|
+
projectRoot: '',
|
|
33
|
+
projectFile: '',
|
|
34
|
+
packageDirectories: [],
|
|
35
|
+
isMultiPackage: false,
|
|
36
|
+
apiVersion: '',
|
|
37
|
+
errors: [],
|
|
38
|
+
warnings: [],
|
|
39
|
+
};
|
|
40
|
+
try {
|
|
41
|
+
// Search for sfdx-project.json
|
|
42
|
+
const projectFile = await this.findProjectFile(startPath);
|
|
43
|
+
if (!projectFile) {
|
|
44
|
+
result.errors.push('sfdx-project.json not found');
|
|
45
|
+
logger.warn('SFDX project not detected', { startPath });
|
|
46
|
+
return result;
|
|
47
|
+
}
|
|
48
|
+
result.detected = true;
|
|
49
|
+
result.projectFile = projectFile;
|
|
50
|
+
result.projectRoot = dirname(projectFile);
|
|
51
|
+
// Parse and validate project configuration
|
|
52
|
+
const projectConfig = await this.parseProjectFile(projectFile);
|
|
53
|
+
result.projectConfig = projectConfig;
|
|
54
|
+
result.apiVersion = projectConfig.sourceApiVersion;
|
|
55
|
+
result.namespace = projectConfig.namespace;
|
|
56
|
+
// Extract package directories
|
|
57
|
+
const validation = this.validateProjectStructure(projectConfig, result.projectRoot);
|
|
58
|
+
result.packageDirectories = validation.packagePaths;
|
|
59
|
+
result.defaultPackageDirectory = validation.defaultPath;
|
|
60
|
+
result.isMultiPackage = validation.isMultiPackage;
|
|
61
|
+
result.errors.push(...validation.errors);
|
|
62
|
+
result.warnings.push(...validation.warnings);
|
|
63
|
+
logger.info('SFDX project detected', {
|
|
64
|
+
projectRoot: result.projectRoot,
|
|
65
|
+
packages: result.packageDirectories.length,
|
|
66
|
+
apiVersion: result.apiVersion,
|
|
67
|
+
});
|
|
68
|
+
return result;
|
|
69
|
+
}
|
|
70
|
+
catch (error) {
|
|
71
|
+
result.errors.push(`Detection failed: ${error instanceof Error ? error.message : String(error)}`);
|
|
72
|
+
logger.error('Project detection failed', { error, startPath });
|
|
73
|
+
return result;
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* @ac US-079-AC-1: Detect sfdx-project.json
|
|
78
|
+
* Search up the directory tree for sfdx-project.json
|
|
79
|
+
*/
|
|
80
|
+
static async findProjectFile(startPath) {
|
|
81
|
+
return this.findProjectFileRecursive(resolve(startPath), 0);
|
|
82
|
+
}
|
|
83
|
+
static async findProjectFileRecursive(currentPath, depth) {
|
|
84
|
+
if (depth >= this.MAX_SEARCH_DEPTH) {
|
|
85
|
+
return null;
|
|
86
|
+
}
|
|
87
|
+
const projectFilePath = join(currentPath, this.PROJECT_FILE_NAME);
|
|
88
|
+
try {
|
|
89
|
+
await access(projectFilePath);
|
|
90
|
+
logger.debug('Found sfdx-project.json', { path: projectFilePath });
|
|
91
|
+
return projectFilePath;
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
const parentPath = dirname(currentPath);
|
|
95
|
+
if (parentPath === currentPath) {
|
|
96
|
+
return null;
|
|
97
|
+
}
|
|
98
|
+
return this.findProjectFileRecursive(parentPath, depth + 1);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* @ac US-079-AC-2: Parse project configuration
|
|
103
|
+
*/
|
|
104
|
+
static async parseProjectFile(filePath) {
|
|
105
|
+
logger.debug('Parsing sfdx-project.json', { filePath });
|
|
106
|
+
try {
|
|
107
|
+
const content = await readFile(filePath, 'utf-8');
|
|
108
|
+
const config = JSON.parse(content);
|
|
109
|
+
// Validate required fields
|
|
110
|
+
if (!config.packageDirectories || !Array.isArray(config.packageDirectories)) {
|
|
111
|
+
throw new Error('Missing or invalid packageDirectories');
|
|
112
|
+
}
|
|
113
|
+
if (!config.sourceApiVersion) {
|
|
114
|
+
throw new Error('Missing sourceApiVersion');
|
|
115
|
+
}
|
|
116
|
+
return config;
|
|
117
|
+
}
|
|
118
|
+
catch (error) {
|
|
119
|
+
throw new Error(`Failed to parse sfdx-project.json: ${error instanceof Error ? error.message : String(error)}`);
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
/**
|
|
123
|
+
* @ac US-079-AC-3: Validate project structure
|
|
124
|
+
* @ac US-079-AC-4: Detect package directories
|
|
125
|
+
* @ac US-079-AC-5: Support multi-package projects
|
|
126
|
+
*/
|
|
127
|
+
static validateProjectStructure(config, projectRoot) {
|
|
128
|
+
const errors = [];
|
|
129
|
+
const warnings = [];
|
|
130
|
+
const packagePaths = [];
|
|
131
|
+
let defaultPath;
|
|
132
|
+
// Validate package directories
|
|
133
|
+
if (config.packageDirectories.length === 0) {
|
|
134
|
+
errors.push('No package directories defined');
|
|
135
|
+
}
|
|
136
|
+
let defaultCount = 0;
|
|
137
|
+
for (const pkgDir of config.packageDirectories) {
|
|
138
|
+
if (!pkgDir.path) {
|
|
139
|
+
errors.push('Package directory missing path');
|
|
140
|
+
continue;
|
|
141
|
+
}
|
|
142
|
+
const fullPath = resolve(projectRoot, pkgDir.path);
|
|
143
|
+
packagePaths.push(fullPath);
|
|
144
|
+
if (pkgDir.default) {
|
|
145
|
+
defaultCount++;
|
|
146
|
+
defaultPath = fullPath;
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
// Validate default package
|
|
150
|
+
if (defaultCount === 0) {
|
|
151
|
+
warnings.push('No default package directory specified');
|
|
152
|
+
// Use first package as default
|
|
153
|
+
if (packagePaths.length > 0) {
|
|
154
|
+
defaultPath = packagePaths[0];
|
|
155
|
+
}
|
|
156
|
+
}
|
|
157
|
+
else if (defaultCount > 1) {
|
|
158
|
+
errors.push('Multiple default package directories found');
|
|
159
|
+
}
|
|
160
|
+
// Check if multi-package
|
|
161
|
+
const isMultiPackage = config.packageDirectories.length > 1;
|
|
162
|
+
if (isMultiPackage) {
|
|
163
|
+
logger.info('Multi-package project detected', {
|
|
164
|
+
packages: config.packageDirectories.length,
|
|
165
|
+
});
|
|
166
|
+
}
|
|
167
|
+
return {
|
|
168
|
+
packagePaths,
|
|
169
|
+
defaultPath,
|
|
170
|
+
isMultiPackage,
|
|
171
|
+
errors,
|
|
172
|
+
warnings,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* @ac US-079-AC-6: Report project metadata
|
|
177
|
+
*/
|
|
178
|
+
static formatDetectionReport(result) {
|
|
179
|
+
const lines = [];
|
|
180
|
+
lines.push('📦 SFDX Project Detection Report');
|
|
181
|
+
lines.push('═══════════════════════════════════════');
|
|
182
|
+
if (!result.detected) {
|
|
183
|
+
lines.push('❌ No SFDX project detected');
|
|
184
|
+
if (result.errors.length > 0) {
|
|
185
|
+
lines.push('\nErrors:');
|
|
186
|
+
for (const error of result.errors) {
|
|
187
|
+
lines.push(` • ${error}`);
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
return lines.join('\n');
|
|
191
|
+
}
|
|
192
|
+
lines.push('✅ Project detected');
|
|
193
|
+
lines.push(` Root: ${result.projectRoot}`);
|
|
194
|
+
lines.push(` Config: ${result.projectFile}`);
|
|
195
|
+
lines.push('');
|
|
196
|
+
lines.push('📋 Configuration:');
|
|
197
|
+
lines.push(` API Version: ${result.apiVersion}`);
|
|
198
|
+
if (result.namespace) {
|
|
199
|
+
lines.push(` Namespace: ${result.namespace}`);
|
|
200
|
+
}
|
|
201
|
+
lines.push(` Multi-Package: ${result.isMultiPackage ? 'Yes' : 'No'}`);
|
|
202
|
+
lines.push('');
|
|
203
|
+
lines.push(`📂 Package Directories (${result.packageDirectories.length}):`);
|
|
204
|
+
for (let i = 0; i < result.packageDirectories.length; i++) {
|
|
205
|
+
const pkgPath = result.packageDirectories[i];
|
|
206
|
+
const isDefault = pkgPath === result.defaultPackageDirectory;
|
|
207
|
+
lines.push(` ${i + 1}. ${pkgPath}${isDefault ? ' (default)' : ''}`);
|
|
208
|
+
}
|
|
209
|
+
if (result.warnings.length > 0) {
|
|
210
|
+
lines.push('');
|
|
211
|
+
lines.push('⚠️ Warnings:');
|
|
212
|
+
for (const warning of result.warnings) {
|
|
213
|
+
lines.push(` • ${warning}`);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
if (result.errors.length > 0) {
|
|
217
|
+
lines.push('');
|
|
218
|
+
lines.push('❌ Errors:');
|
|
219
|
+
for (const error of result.errors) {
|
|
220
|
+
lines.push(` • ${error}`);
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
return lines.join('\n');
|
|
224
|
+
}
|
|
225
|
+
/**
|
|
226
|
+
* Check if a path is within an SFDX project
|
|
227
|
+
*/
|
|
228
|
+
static async isInProject(path) {
|
|
229
|
+
const result = await this.detect(path);
|
|
230
|
+
return result.detected;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Get project root for a given path
|
|
234
|
+
*/
|
|
235
|
+
static async getProjectRoot(path) {
|
|
236
|
+
const result = await this.detect(path);
|
|
237
|
+
return result.detected ? result.projectRoot : null;
|
|
238
|
+
}
|
|
239
|
+
}
|
|
240
|
+
//# sourceMappingURL=sfdx-project-detector.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"sfdx-project-detector.js","sourceRoot":"","sources":["../../src/scanner/sfdx-project-detector.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,64 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Project Structure Validator - US-084
|
|
3
|
+
* Validates project structure and configuration
|
|
4
|
+
*
|
|
5
|
+
* @ac US-084-AC-1: Validate sfdx-project.json
|
|
6
|
+
* @ac US-084-AC-2: Check package directories exist
|
|
7
|
+
* @ac US-084-AC-3: Validate .forceignore
|
|
8
|
+
* @ac US-084-AC-4: Check for required files
|
|
9
|
+
* @ac US-084-AC-5: Detect structure issues
|
|
10
|
+
* @ac US-084-AC-6: Generate validation report
|
|
11
|
+
* @issue #84
|
|
12
|
+
*/
|
|
13
|
+
export type ValidationIssue = {
|
|
14
|
+
severity: 'error' | 'warning' | 'info';
|
|
15
|
+
code: string;
|
|
16
|
+
message: string;
|
|
17
|
+
path?: string;
|
|
18
|
+
suggestion?: string;
|
|
19
|
+
};
|
|
20
|
+
export type ValidationReport = {
|
|
21
|
+
isValid: boolean;
|
|
22
|
+
issues: ValidationIssue[];
|
|
23
|
+
checkedPaths: string[];
|
|
24
|
+
executionTime: number;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* @ac US-084-AC-1: Validate sfdx-project.json
|
|
28
|
+
*/
|
|
29
|
+
export declare class StructureValidator {
|
|
30
|
+
/**
|
|
31
|
+
* @ac US-084-AC-1: Validate sfdx-project.json
|
|
32
|
+
* Check sfdx-project.json structure and content
|
|
33
|
+
*/
|
|
34
|
+
validateSfdxProject(projectRoot: string): Promise<ValidationIssue[]>;
|
|
35
|
+
/**
|
|
36
|
+
* @ac US-084-AC-2: Check package directories exist
|
|
37
|
+
* Validate package directories exist on filesystem
|
|
38
|
+
*/
|
|
39
|
+
validatePackageDirectories(projectRoot: string): Promise<ValidationIssue[]>;
|
|
40
|
+
/**
|
|
41
|
+
* @ac US-084-AC-3: Validate .forceignore
|
|
42
|
+
* Check .forceignore file
|
|
43
|
+
*/
|
|
44
|
+
validateForceIgnore(projectRoot: string): Promise<ValidationIssue[]>;
|
|
45
|
+
/**
|
|
46
|
+
* @ac US-084-AC-4: Check for required files
|
|
47
|
+
* Check for other important files
|
|
48
|
+
*/
|
|
49
|
+
validateRequiredFiles(projectRoot: string): Promise<ValidationIssue[]>;
|
|
50
|
+
/**
|
|
51
|
+
* @ac US-084-AC-5: Detect structure issues
|
|
52
|
+
* Check for common structure problems
|
|
53
|
+
*/
|
|
54
|
+
detectStructureIssues(projectRoot: string): Promise<ValidationIssue[]>;
|
|
55
|
+
/**
|
|
56
|
+
* @ac US-084-AC-6: Generate validation report
|
|
57
|
+
* Validate entire project structure
|
|
58
|
+
*/
|
|
59
|
+
validate(projectRoot: string): Promise<ValidationReport>;
|
|
60
|
+
/**
|
|
61
|
+
* Format validation report
|
|
62
|
+
*/
|
|
63
|
+
formatReport(report: ValidationReport): string;
|
|
64
|
+
}
|