@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,282 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Metadata API Format Scanner - US-080
|
|
3
|
+
* Supports legacy Metadata API format (package.xml + src/)
|
|
4
|
+
*
|
|
5
|
+
* @ac US-080-AC-1: Detect package.xml
|
|
6
|
+
* @ac US-080-AC-2: Scan src/ directory
|
|
7
|
+
* @ac US-080-AC-3: Parse metadata format files
|
|
8
|
+
* @ac US-080-AC-4: Convert to source format internally
|
|
9
|
+
* @ac US-080-AC-5: Handle Documents folder structure
|
|
10
|
+
* @ac US-080-AC-6: Handle DigitalExperience bundles
|
|
11
|
+
* @issue #80
|
|
12
|
+
*/
|
|
13
|
+
import * as fs from 'node:fs';
|
|
14
|
+
import * as path from 'node:path';
|
|
15
|
+
import { getLogger } from '../utils/logger.js';
|
|
16
|
+
import { ErrorAggregator } from '../utils/error-aggregator.js';
|
|
17
|
+
const logger = getLogger('MetadataFormatScanner');
|
|
18
|
+
/**
|
|
19
|
+
* @ac US-080-AC-1: Detect package.xml
|
|
20
|
+
* @ac US-080-AC-2: Scan src/ directory
|
|
21
|
+
*/
|
|
22
|
+
export class MetadataFormatScanner {
|
|
23
|
+
errorAggregator = new ErrorAggregator();
|
|
24
|
+
/**
|
|
25
|
+
* @ac US-080-AC-1: Detect package.xml
|
|
26
|
+
* Check if project uses Metadata API format
|
|
27
|
+
*/
|
|
28
|
+
detectFormat(projectRoot) {
|
|
29
|
+
const hasPackageXml = fs.existsSync(path.join(projectRoot, 'package.xml'));
|
|
30
|
+
const hasSrcDir = fs.existsSync(path.join(projectRoot, 'src'));
|
|
31
|
+
const hasSfdxProject = fs.existsSync(path.join(projectRoot, 'sfdx-project.json'));
|
|
32
|
+
logger.info('Detecting project format', {
|
|
33
|
+
hasPackageXml,
|
|
34
|
+
hasSrcDir,
|
|
35
|
+
hasSfdxProject,
|
|
36
|
+
});
|
|
37
|
+
if (hasPackageXml && hasSrcDir && !hasSfdxProject) {
|
|
38
|
+
return 'metadata-api';
|
|
39
|
+
}
|
|
40
|
+
if (hasSfdxProject && !hasPackageXml) {
|
|
41
|
+
return 'source-format';
|
|
42
|
+
}
|
|
43
|
+
if (hasPackageXml && hasSfdxProject) {
|
|
44
|
+
return 'mixed';
|
|
45
|
+
}
|
|
46
|
+
return 'source-format'; // Default
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* @ac US-080-AC-2: Scan src/ directory
|
|
50
|
+
* Scan Metadata API format project
|
|
51
|
+
*/
|
|
52
|
+
async scan(projectRoot) {
|
|
53
|
+
const startTime = Date.now();
|
|
54
|
+
const result = {
|
|
55
|
+
format: this.detectFormat(projectRoot),
|
|
56
|
+
components: [],
|
|
57
|
+
warnings: [],
|
|
58
|
+
executionTime: 0,
|
|
59
|
+
};
|
|
60
|
+
if (result.format !== 'metadata-api' && result.format !== 'mixed') {
|
|
61
|
+
result.warnings.push('Project is not in Metadata API format');
|
|
62
|
+
result.executionTime = Date.now() - startTime;
|
|
63
|
+
return result;
|
|
64
|
+
}
|
|
65
|
+
try {
|
|
66
|
+
// Find package.xml
|
|
67
|
+
const packageXmlPath = path.join(projectRoot, 'package.xml');
|
|
68
|
+
if (fs.existsSync(packageXmlPath)) {
|
|
69
|
+
result.packageXmlPath = packageXmlPath;
|
|
70
|
+
const packageEntries = this.parsePackageXml(packageXmlPath);
|
|
71
|
+
logger.info('Parsed package.xml', { entries: packageEntries.length });
|
|
72
|
+
}
|
|
73
|
+
// Scan src/ directory
|
|
74
|
+
const srcDir = path.join(projectRoot, 'src');
|
|
75
|
+
if (fs.existsSync(srcDir)) {
|
|
76
|
+
result.srcDirectory = srcDir;
|
|
77
|
+
const components = await this.scanSrcDirectory(srcDir);
|
|
78
|
+
result.components = components;
|
|
79
|
+
logger.info('Scanned src/ directory', { components: components.length });
|
|
80
|
+
}
|
|
81
|
+
result.executionTime = Date.now() - startTime;
|
|
82
|
+
logger.info('Metadata format scan complete', {
|
|
83
|
+
format: result.format,
|
|
84
|
+
components: result.components.length,
|
|
85
|
+
executionTime: result.executionTime,
|
|
86
|
+
});
|
|
87
|
+
return result;
|
|
88
|
+
}
|
|
89
|
+
catch (error) {
|
|
90
|
+
this.errorAggregator.addError({
|
|
91
|
+
severity: 'HIGH',
|
|
92
|
+
message: 'Failed to scan Metadata API format',
|
|
93
|
+
context: { error: error instanceof Error ? error.message : String(error) },
|
|
94
|
+
});
|
|
95
|
+
result.warnings.push('Scan failed: ' + (error instanceof Error ? error.message : String(error)));
|
|
96
|
+
result.executionTime = Date.now() - startTime;
|
|
97
|
+
return result;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* @ac US-080-AC-3: Parse metadata format files
|
|
102
|
+
* Parse package.xml
|
|
103
|
+
*/
|
|
104
|
+
parsePackageXml(packageXmlPath) {
|
|
105
|
+
try {
|
|
106
|
+
const content = fs.readFileSync(packageXmlPath, 'utf-8');
|
|
107
|
+
const entries = [];
|
|
108
|
+
// Simple XML parsing for <types> elements
|
|
109
|
+
const typeBlocks = content.match(/<types>[\s\S]*?<\/types>/g) ?? [];
|
|
110
|
+
for (const block of typeBlocks) {
|
|
111
|
+
const typeMatch = /<name>(.*?)<\/name>/.exec(block);
|
|
112
|
+
const memberMatches = block.match(/<members>(.*?)<\/members>/g) ?? [];
|
|
113
|
+
if (typeMatch) {
|
|
114
|
+
const type = typeMatch[1];
|
|
115
|
+
for (const memberMatch of memberMatches) {
|
|
116
|
+
const nameMatch = /<members>(.*?)<\/members>/.exec(memberMatch);
|
|
117
|
+
if (nameMatch) {
|
|
118
|
+
entries.push({
|
|
119
|
+
type,
|
|
120
|
+
name: nameMatch[1],
|
|
121
|
+
});
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
logger.debug('Parsed package.xml', { entries: entries.length });
|
|
127
|
+
return entries;
|
|
128
|
+
}
|
|
129
|
+
catch (error) {
|
|
130
|
+
logger.error('Failed to parse package.xml', {
|
|
131
|
+
error: error instanceof Error ? error.message : String(error),
|
|
132
|
+
});
|
|
133
|
+
return [];
|
|
134
|
+
}
|
|
135
|
+
}
|
|
136
|
+
/**
|
|
137
|
+
* @ac US-080-AC-2: Scan src/ directory
|
|
138
|
+
* @ac US-080-AC-4: Convert to source format internally
|
|
139
|
+
* Scan Metadata API src/ directory
|
|
140
|
+
*/
|
|
141
|
+
async scanSrcDirectory(srcDir) {
|
|
142
|
+
const components = [];
|
|
143
|
+
try {
|
|
144
|
+
const entries = fs.readdirSync(srcDir, { withFileTypes: true });
|
|
145
|
+
const typeComponents = await Promise.all(entries.map((entry) => {
|
|
146
|
+
if (!entry.isDirectory()) {
|
|
147
|
+
return Promise.resolve([]);
|
|
148
|
+
}
|
|
149
|
+
const typeDir = path.join(srcDir, entry.name);
|
|
150
|
+
const metadataType = this.mapDirectoryToType(entry.name);
|
|
151
|
+
if (!metadataType) {
|
|
152
|
+
logger.debug('Unknown metadata type directory', { dir: entry.name });
|
|
153
|
+
return Promise.resolve([]);
|
|
154
|
+
}
|
|
155
|
+
return this.scanTypeDirectory(typeDir, metadataType);
|
|
156
|
+
}));
|
|
157
|
+
components.push(...typeComponents.flat());
|
|
158
|
+
return components;
|
|
159
|
+
}
|
|
160
|
+
catch (error) {
|
|
161
|
+
logger.error('Failed to scan src/ directory', {
|
|
162
|
+
error: error instanceof Error ? error.message : String(error),
|
|
163
|
+
});
|
|
164
|
+
return [];
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* @ac US-080-AC-3: Parse metadata format files
|
|
169
|
+
* Scan specific metadata type directory
|
|
170
|
+
*/
|
|
171
|
+
scanTypeDirectory(typeDir, metadataType) {
|
|
172
|
+
const components = [];
|
|
173
|
+
try {
|
|
174
|
+
const files = fs.readdirSync(typeDir);
|
|
175
|
+
for (const file of files) {
|
|
176
|
+
// Skip meta.xml files
|
|
177
|
+
if (file.endsWith('-meta.xml'))
|
|
178
|
+
continue;
|
|
179
|
+
const filePath = path.join(typeDir, file);
|
|
180
|
+
const stat = fs.statSync(filePath);
|
|
181
|
+
if (stat.isFile()) {
|
|
182
|
+
const name = this.extractComponentName(file, metadataType);
|
|
183
|
+
components.push({
|
|
184
|
+
name,
|
|
185
|
+
type: metadataType,
|
|
186
|
+
filePath,
|
|
187
|
+
dependencies: new Set(),
|
|
188
|
+
dependents: new Set(),
|
|
189
|
+
priorityBoost: 0,
|
|
190
|
+
});
|
|
191
|
+
}
|
|
192
|
+
else if (stat.isDirectory()) {
|
|
193
|
+
// Handle bundle types (e.g., Documents, DigitalExperience)
|
|
194
|
+
const bundleComponents = this.scanBundleDirectory(filePath, metadataType);
|
|
195
|
+
components.push(...bundleComponents);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
return components;
|
|
199
|
+
}
|
|
200
|
+
catch (error) {
|
|
201
|
+
logger.error('Failed to scan type directory', {
|
|
202
|
+
typeDir,
|
|
203
|
+
error: error instanceof Error ? error.message : String(error),
|
|
204
|
+
});
|
|
205
|
+
return [];
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* @ac US-080-AC-5: Handle Documents folder structure
|
|
210
|
+
* @ac US-080-AC-6: Handle DigitalExperience bundles
|
|
211
|
+
* Scan bundle directory (for Documents, DigitalExperience, etc.)
|
|
212
|
+
*/
|
|
213
|
+
scanBundleDirectory(bundleDir, metadataType) {
|
|
214
|
+
const components = [];
|
|
215
|
+
try {
|
|
216
|
+
const bundleName = path.basename(bundleDir);
|
|
217
|
+
// For bundles, create a single component representing the bundle
|
|
218
|
+
components.push({
|
|
219
|
+
name: bundleName,
|
|
220
|
+
type: metadataType,
|
|
221
|
+
filePath: bundleDir,
|
|
222
|
+
dependencies: new Set(),
|
|
223
|
+
dependents: new Set(),
|
|
224
|
+
priorityBoost: 0,
|
|
225
|
+
});
|
|
226
|
+
logger.debug('Scanned bundle directory', { bundleName, type: metadataType });
|
|
227
|
+
return components;
|
|
228
|
+
}
|
|
229
|
+
catch (error) {
|
|
230
|
+
logger.error('Failed to scan bundle directory', {
|
|
231
|
+
bundleDir,
|
|
232
|
+
error: error instanceof Error ? error.message : String(error),
|
|
233
|
+
});
|
|
234
|
+
return [];
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
/**
|
|
238
|
+
* @ac US-080-AC-4: Convert to source format internally
|
|
239
|
+
* Map Metadata API directory name to MetadataType
|
|
240
|
+
*/
|
|
241
|
+
mapDirectoryToType(dirName) {
|
|
242
|
+
const mappings = {
|
|
243
|
+
classes: 'ApexClass',
|
|
244
|
+
triggers: 'ApexTrigger',
|
|
245
|
+
pages: 'VisualforcePage',
|
|
246
|
+
components: 'VisualforceComponent',
|
|
247
|
+
objects: 'CustomObject',
|
|
248
|
+
layouts: 'Layout',
|
|
249
|
+
profiles: 'Profile',
|
|
250
|
+
permissionsets: 'PermissionSet',
|
|
251
|
+
flows: 'Flow',
|
|
252
|
+
documents: 'Document',
|
|
253
|
+
email: 'EmailTemplate',
|
|
254
|
+
staticresources: 'StaticResource',
|
|
255
|
+
labels: 'CustomLabels',
|
|
256
|
+
quickActions: 'QuickAction',
|
|
257
|
+
flexipages: 'FlexiPage',
|
|
258
|
+
aura: 'AuraDefinitionBundle',
|
|
259
|
+
lwc: 'LightningComponentBundle',
|
|
260
|
+
sites: 'DigitalExperience',
|
|
261
|
+
experiences: 'DigitalExperience',
|
|
262
|
+
};
|
|
263
|
+
return mappings[dirName] ?? null;
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Extract component name from filename
|
|
267
|
+
*/
|
|
268
|
+
extractComponentName(filename, metadataType) {
|
|
269
|
+
void metadataType;
|
|
270
|
+
// Remove extension
|
|
271
|
+
const withoutExt = filename.replace(/\.[^.]+$/, '');
|
|
272
|
+
// For some types, remove suffix (e.g., .cls, .trigger, .page)
|
|
273
|
+
return withoutExt;
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Get error report
|
|
277
|
+
*/
|
|
278
|
+
getErrorReport() {
|
|
279
|
+
return this.errorAggregator.formatReport();
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
//# sourceMappingURL=metadata-format-scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"metadata-format-scanner.js","sourceRoot":"","sources":["../../src/scanner/metadata-format-scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Monorepo Scanner - US-082
|
|
3
|
+
* Support monorepo structures with multiple SF projects
|
|
4
|
+
*
|
|
5
|
+
* @ac US-082-AC-1: Detect multiple SFDX projects
|
|
6
|
+
* @ac US-082-AC-2: Scan each project independently
|
|
7
|
+
* @ac US-082-AC-3: Support shared dependencies
|
|
8
|
+
* @ac US-082-AC-4: Handle cross-project references
|
|
9
|
+
* @ac US-082-AC-5: Generate monorepo report
|
|
10
|
+
* @ac US-082-AC-6: Support workspace configuration
|
|
11
|
+
* @issue #82
|
|
12
|
+
*/
|
|
13
|
+
export type SfdxProject = {
|
|
14
|
+
name: string;
|
|
15
|
+
path: string;
|
|
16
|
+
sfdxProjectPath: string;
|
|
17
|
+
packageDirectories: string[];
|
|
18
|
+
};
|
|
19
|
+
export type MonorepoStructure = {
|
|
20
|
+
isMonorepo: boolean;
|
|
21
|
+
projects: SfdxProject[];
|
|
22
|
+
sharedDependencies: string[];
|
|
23
|
+
crossProjectRefs: Array<{
|
|
24
|
+
from: string;
|
|
25
|
+
to: string;
|
|
26
|
+
component: string;
|
|
27
|
+
}>;
|
|
28
|
+
};
|
|
29
|
+
export type MonorepoReport = {
|
|
30
|
+
structure: MonorepoStructure;
|
|
31
|
+
warnings: string[];
|
|
32
|
+
recommendations: string[];
|
|
33
|
+
};
|
|
34
|
+
/**
|
|
35
|
+
* @ac US-082-AC-1: Detect multiple SFDX projects
|
|
36
|
+
*/
|
|
37
|
+
export declare class MonorepoScanner {
|
|
38
|
+
/**
|
|
39
|
+
* @ac US-082-AC-1: Detect multiple SFDX projects
|
|
40
|
+
* Find all sfdx-project.json files in directory tree
|
|
41
|
+
*/
|
|
42
|
+
detectProjects(rootDir: string, maxDepth?: number): Promise<SfdxProject[]>;
|
|
43
|
+
/**
|
|
44
|
+
* Recursively scan directory for sfdx-project.json
|
|
45
|
+
*/
|
|
46
|
+
private scanDirectory;
|
|
47
|
+
/**
|
|
48
|
+
* @ac US-082-AC-3: Support shared dependencies
|
|
49
|
+
* Detect shared dependencies between projects
|
|
50
|
+
*/
|
|
51
|
+
detectSharedDependencies(projects: SfdxProject[]): Promise<string[]>;
|
|
52
|
+
/**
|
|
53
|
+
* @ac US-082-AC-4: Handle cross-project references
|
|
54
|
+
* Detect cross-project references (simplified)
|
|
55
|
+
*/
|
|
56
|
+
detectCrossProjectRefs(projects: SfdxProject[]): Array<{
|
|
57
|
+
from: string;
|
|
58
|
+
to: string;
|
|
59
|
+
component: string;
|
|
60
|
+
}>;
|
|
61
|
+
/**
|
|
62
|
+
* @ac US-082-AC-5: Generate monorepo report
|
|
63
|
+
* @ac US-082-AC-6: Support workspace configuration
|
|
64
|
+
* Scan monorepo and generate report
|
|
65
|
+
*/
|
|
66
|
+
scanMonorepo(rootDir: string): Promise<MonorepoReport>;
|
|
67
|
+
/**
|
|
68
|
+
* Format monorepo report
|
|
69
|
+
*/
|
|
70
|
+
formatReport(report: MonorepoReport): string;
|
|
71
|
+
}
|
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Monorepo Scanner - US-082
|
|
3
|
+
* Support monorepo structures with multiple SF projects
|
|
4
|
+
*
|
|
5
|
+
* @ac US-082-AC-1: Detect multiple SFDX projects
|
|
6
|
+
* @ac US-082-AC-2: Scan each project independently
|
|
7
|
+
* @ac US-082-AC-3: Support shared dependencies
|
|
8
|
+
* @ac US-082-AC-4: Handle cross-project references
|
|
9
|
+
* @ac US-082-AC-5: Generate monorepo report
|
|
10
|
+
* @ac US-082-AC-6: Support workspace configuration
|
|
11
|
+
* @issue #82
|
|
12
|
+
*/
|
|
13
|
+
import { promises as fs } from 'node:fs';
|
|
14
|
+
import * as path from 'node:path';
|
|
15
|
+
import { getLogger } from '../utils/logger.js';
|
|
16
|
+
const logger = getLogger('MonorepoScanner');
|
|
17
|
+
/**
|
|
18
|
+
* @ac US-082-AC-1: Detect multiple SFDX projects
|
|
19
|
+
*/
|
|
20
|
+
export class MonorepoScanner {
|
|
21
|
+
/**
|
|
22
|
+
* @ac US-082-AC-1: Detect multiple SFDX projects
|
|
23
|
+
* Find all sfdx-project.json files in directory tree
|
|
24
|
+
*/
|
|
25
|
+
async detectProjects(rootDir, maxDepth = 3) {
|
|
26
|
+
logger.info('Detecting SFDX projects', { rootDir, maxDepth });
|
|
27
|
+
const projects = [];
|
|
28
|
+
await this.scanDirectory(rootDir, 0, maxDepth, projects);
|
|
29
|
+
logger.info('Projects detected', { count: projects.length });
|
|
30
|
+
return projects;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Recursively scan directory for sfdx-project.json
|
|
34
|
+
*/
|
|
35
|
+
async scanDirectory(dir, depth, maxDepth, projects) {
|
|
36
|
+
if (depth > maxDepth)
|
|
37
|
+
return;
|
|
38
|
+
try {
|
|
39
|
+
const entries = await fs.readdir(dir, { withFileTypes: true });
|
|
40
|
+
// Check for sfdx-project.json
|
|
41
|
+
const hasSfdxProject = entries.some((e) => e.name === 'sfdx-project.json');
|
|
42
|
+
if (hasSfdxProject) {
|
|
43
|
+
const sfdxProjectPath = path.join(dir, 'sfdx-project.json');
|
|
44
|
+
try {
|
|
45
|
+
const content = await fs.readFile(sfdxProjectPath, 'utf-8');
|
|
46
|
+
const config = JSON.parse(content);
|
|
47
|
+
const packageDirs = config.packageDirectories ? config.packageDirectories.map((p) => p.path) : [];
|
|
48
|
+
projects.push({
|
|
49
|
+
name: config.name ?? path.basename(dir),
|
|
50
|
+
path: dir,
|
|
51
|
+
sfdxProjectPath,
|
|
52
|
+
packageDirectories: packageDirs,
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
catch (error) {
|
|
56
|
+
logger.warn('Failed to parse sfdx-project.json', {
|
|
57
|
+
path: sfdxProjectPath,
|
|
58
|
+
error: error instanceof Error ? error.message : String(error),
|
|
59
|
+
});
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
// Scan subdirectories (skip node_modules, .git, etc.)
|
|
63
|
+
const dirsToScan = entries.filter((e) => e.isDirectory() && !['node_modules', '.git', '.sfdx', 'dist', 'build', 'coverage'].includes(e.name));
|
|
64
|
+
await Promise.all(dirsToScan.map(async (entry) => this.scanDirectory(path.join(dir, entry.name), depth + 1, maxDepth, projects)));
|
|
65
|
+
}
|
|
66
|
+
catch (error) {
|
|
67
|
+
logger.warn('Failed to scan directory', {
|
|
68
|
+
dir,
|
|
69
|
+
error: error instanceof Error ? error.message : String(error),
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* @ac US-082-AC-3: Support shared dependencies
|
|
75
|
+
* Detect shared dependencies between projects
|
|
76
|
+
*/
|
|
77
|
+
async detectSharedDependencies(projects) {
|
|
78
|
+
const sharedDeps = new Set();
|
|
79
|
+
await Promise.all(projects.map(async (project) => {
|
|
80
|
+
try {
|
|
81
|
+
const content = await fs.readFile(project.sfdxProjectPath, 'utf-8');
|
|
82
|
+
const config = JSON.parse(content);
|
|
83
|
+
if (config.plugins) {
|
|
84
|
+
for (const plugin of Object.keys(config.plugins)) {
|
|
85
|
+
sharedDeps.add(plugin);
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
if (config.packageAliases) {
|
|
89
|
+
for (const alias of Object.keys(config.packageAliases)) {
|
|
90
|
+
sharedDeps.add(alias);
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
catch {
|
|
95
|
+
// Skip errors
|
|
96
|
+
}
|
|
97
|
+
}));
|
|
98
|
+
return Array.from(sharedDeps);
|
|
99
|
+
}
|
|
100
|
+
/**
|
|
101
|
+
* @ac US-082-AC-4: Handle cross-project references
|
|
102
|
+
* Detect cross-project references (simplified)
|
|
103
|
+
*/
|
|
104
|
+
detectCrossProjectRefs(projects) {
|
|
105
|
+
const refs = [];
|
|
106
|
+
// Simplified: Check if projects reference each other in config
|
|
107
|
+
for (const project of projects) {
|
|
108
|
+
for (const otherProject of projects) {
|
|
109
|
+
if (project !== otherProject) {
|
|
110
|
+
// Check if project path is mentioned in other project's package dirs
|
|
111
|
+
const isReferenced = otherProject.packageDirectories.some((dir) => dir.includes(path.basename(project.path)));
|
|
112
|
+
if (isReferenced) {
|
|
113
|
+
refs.push({ from: project.name, to: otherProject.name, component: 'package' });
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
}
|
|
118
|
+
return refs;
|
|
119
|
+
}
|
|
120
|
+
/**
|
|
121
|
+
* @ac US-082-AC-5: Generate monorepo report
|
|
122
|
+
* @ac US-082-AC-6: Support workspace configuration
|
|
123
|
+
* Scan monorepo and generate report
|
|
124
|
+
*/
|
|
125
|
+
async scanMonorepo(rootDir) {
|
|
126
|
+
logger.info('Scanning monorepo', { rootDir });
|
|
127
|
+
const projects = await this.detectProjects(rootDir);
|
|
128
|
+
const isMonorepo = projects.length > 1;
|
|
129
|
+
const sharedDependencies = await this.detectSharedDependencies(projects);
|
|
130
|
+
const crossProjectRefs = this.detectCrossProjectRefs(projects);
|
|
131
|
+
const warnings = [];
|
|
132
|
+
const recommendations = [];
|
|
133
|
+
// Generate warnings
|
|
134
|
+
if (isMonorepo && crossProjectRefs.length > 0) {
|
|
135
|
+
warnings.push(`Cross-project references detected: ${crossProjectRefs.length}`);
|
|
136
|
+
recommendations.push('Consider consolidating shared code into a shared package');
|
|
137
|
+
}
|
|
138
|
+
if (isMonorepo && projects.length > 10) {
|
|
139
|
+
warnings.push(`Many projects detected: ${projects.length}`);
|
|
140
|
+
recommendations.push('Consider organizing projects into workspaces');
|
|
141
|
+
}
|
|
142
|
+
// Check for workspace configuration
|
|
143
|
+
try {
|
|
144
|
+
const workspaceConfig = path.join(rootDir, 'workspace.json');
|
|
145
|
+
await fs.access(workspaceConfig);
|
|
146
|
+
logger.info('Workspace configuration found');
|
|
147
|
+
}
|
|
148
|
+
catch {
|
|
149
|
+
if (isMonorepo) {
|
|
150
|
+
recommendations.push('Consider adding workspace.json for better monorepo management');
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
const structure = {
|
|
154
|
+
isMonorepo,
|
|
155
|
+
projects,
|
|
156
|
+
sharedDependencies,
|
|
157
|
+
crossProjectRefs,
|
|
158
|
+
};
|
|
159
|
+
logger.info('Monorepo scan complete', {
|
|
160
|
+
isMonorepo,
|
|
161
|
+
projectCount: projects.length,
|
|
162
|
+
sharedDeps: sharedDependencies.length,
|
|
163
|
+
crossRefs: crossProjectRefs.length,
|
|
164
|
+
});
|
|
165
|
+
return {
|
|
166
|
+
structure,
|
|
167
|
+
warnings,
|
|
168
|
+
recommendations,
|
|
169
|
+
};
|
|
170
|
+
}
|
|
171
|
+
/**
|
|
172
|
+
* Format monorepo report
|
|
173
|
+
*/
|
|
174
|
+
formatReport(report) {
|
|
175
|
+
const lines = [];
|
|
176
|
+
lines.push('📦 Monorepo Structure Report');
|
|
177
|
+
lines.push('═══════════════════════════════════════');
|
|
178
|
+
lines.push(`Is Monorepo: ${report.structure.isMonorepo ? 'Yes' : 'No'}`);
|
|
179
|
+
lines.push(`Projects: ${report.structure.projects.length}`);
|
|
180
|
+
lines.push('');
|
|
181
|
+
if (report.structure.projects.length > 0) {
|
|
182
|
+
lines.push('Projects:');
|
|
183
|
+
for (const project of report.structure.projects) {
|
|
184
|
+
lines.push(` • ${project.name} (${project.path})`);
|
|
185
|
+
lines.push(` Package Dirs: ${project.packageDirectories.length}`);
|
|
186
|
+
}
|
|
187
|
+
lines.push('');
|
|
188
|
+
}
|
|
189
|
+
if (report.structure.sharedDependencies.length > 0) {
|
|
190
|
+
lines.push(`Shared Dependencies: ${report.structure.sharedDependencies.length}`);
|
|
191
|
+
for (const dep of report.structure.sharedDependencies.slice(0, 5)) {
|
|
192
|
+
lines.push(` • ${dep}`);
|
|
193
|
+
}
|
|
194
|
+
if (report.structure.sharedDependencies.length > 5) {
|
|
195
|
+
lines.push(` ... and ${report.structure.sharedDependencies.length - 5} more`);
|
|
196
|
+
}
|
|
197
|
+
lines.push('');
|
|
198
|
+
}
|
|
199
|
+
if (report.structure.crossProjectRefs.length > 0) {
|
|
200
|
+
lines.push(`Cross-Project References: ${report.structure.crossProjectRefs.length}`);
|
|
201
|
+
for (const ref of report.structure.crossProjectRefs.slice(0, 3)) {
|
|
202
|
+
lines.push(` • ${ref.from} → ${ref.to} (${ref.component})`);
|
|
203
|
+
}
|
|
204
|
+
if (report.structure.crossProjectRefs.length > 3) {
|
|
205
|
+
lines.push(` ... and ${report.structure.crossProjectRefs.length - 3} more`);
|
|
206
|
+
}
|
|
207
|
+
lines.push('');
|
|
208
|
+
}
|
|
209
|
+
if (report.warnings.length > 0) {
|
|
210
|
+
lines.push('⚠️ Warnings:');
|
|
211
|
+
for (const warning of report.warnings) {
|
|
212
|
+
lines.push(` • ${warning}`);
|
|
213
|
+
}
|
|
214
|
+
lines.push('');
|
|
215
|
+
}
|
|
216
|
+
if (report.recommendations.length > 0) {
|
|
217
|
+
lines.push('💡 Recommendations:');
|
|
218
|
+
for (const rec of report.recommendations) {
|
|
219
|
+
lines.push(` • ${rec}`);
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
return lines.join('\n');
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
//# sourceMappingURL=monorepo-scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"monorepo-scanner.js","sourceRoot":"","sources":["../../src/scanner/monorepo-scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,55 @@
|
|
|
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
|
+
export type ValidationIssue = {
|
|
14
|
+
severity: 'error' | 'warning' | 'info';
|
|
15
|
+
message: string;
|
|
16
|
+
path?: string;
|
|
17
|
+
suggestion?: string;
|
|
18
|
+
};
|
|
19
|
+
export type ValidationReport = {
|
|
20
|
+
isValid: boolean;
|
|
21
|
+
issues: ValidationIssue[];
|
|
22
|
+
checkedItems: string[];
|
|
23
|
+
executionTime: number;
|
|
24
|
+
};
|
|
25
|
+
/**
|
|
26
|
+
* @ac US-084-AC-1: Validate sfdx-project.json schema
|
|
27
|
+
*/
|
|
28
|
+
export declare class ProjectValidator {
|
|
29
|
+
/**
|
|
30
|
+
* Validate project structure
|
|
31
|
+
*/
|
|
32
|
+
validate(projectRoot: string): Promise<ValidationReport>;
|
|
33
|
+
/**
|
|
34
|
+
* @ac US-084-AC-1: Validate sfdx-project.json schema
|
|
35
|
+
*/
|
|
36
|
+
private validateSfdxProjectJson;
|
|
37
|
+
/**
|
|
38
|
+
* @ac US-084-AC-2: Validate package directories exist
|
|
39
|
+
*/
|
|
40
|
+
private validatePackageDirectories;
|
|
41
|
+
/**
|
|
42
|
+
* @ac US-084-AC-3: Validate metadata structure
|
|
43
|
+
*/
|
|
44
|
+
private validateMetadataStructure;
|
|
45
|
+
/**
|
|
46
|
+
* @ac US-084-AC-4: Check for required files
|
|
47
|
+
*/
|
|
48
|
+
private validateRequiredFiles;
|
|
49
|
+
/**
|
|
50
|
+
* @ac US-084-AC-5: Generate validation report
|
|
51
|
+
* @ac US-084-AC-6: Suggest fixes for issues
|
|
52
|
+
* Format validation report
|
|
53
|
+
*/
|
|
54
|
+
formatReport(report: ValidationReport): string;
|
|
55
|
+
}
|