@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,298 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency Resolver
|
|
3
|
+
* Resolves component dependencies and generates deployment order
|
|
4
|
+
*
|
|
5
|
+
* @ac US-033-AC-1: Resolve direct dependencies
|
|
6
|
+
* @ac US-033-AC-2: Resolve transitive dependencies
|
|
7
|
+
* @ac US-033-AC-3: Handle optional dependencies
|
|
8
|
+
* @ac US-033-AC-4: Skip managed package dependencies
|
|
9
|
+
* @ac US-033-AC-5: Report unresolved dependencies
|
|
10
|
+
* @ac US-033-AC-6: Generate dependency report
|
|
11
|
+
*
|
|
12
|
+
* @issue #33
|
|
13
|
+
*/
|
|
14
|
+
import { getLogger } from '../utils/logger.js';
|
|
15
|
+
const logger = getLogger('DependencyResolver');
|
|
16
|
+
/**
|
|
17
|
+
* Dependency Resolver
|
|
18
|
+
*
|
|
19
|
+
* Resolves dependencies and generates deployment order using topological sort.
|
|
20
|
+
* Handles circular dependencies, optional dependencies, and managed packages.
|
|
21
|
+
*
|
|
22
|
+
* Performance: O(V + E) using Kahn's algorithm
|
|
23
|
+
*
|
|
24
|
+
* @example
|
|
25
|
+
* const resolver = new DependencyResolver(graph, components);
|
|
26
|
+
* const result = resolver.resolve();
|
|
27
|
+
* console.log(`Deployment order: ${result.deploymentOrder.join(' → ')}`);
|
|
28
|
+
* console.log(`Unresolved: ${result.unresolved.length}`);
|
|
29
|
+
*/
|
|
30
|
+
export class DependencyResolver {
|
|
31
|
+
graph;
|
|
32
|
+
components;
|
|
33
|
+
options;
|
|
34
|
+
constructor(graph, components, options = {}) {
|
|
35
|
+
this.graph = graph;
|
|
36
|
+
this.components = components;
|
|
37
|
+
this.options = {
|
|
38
|
+
includeOptional: options.includeOptional ?? false,
|
|
39
|
+
skipManaged: options.skipManaged ?? true,
|
|
40
|
+
circularDependencies: options.circularDependencies ?? [],
|
|
41
|
+
orderingConstraints: options.orderingConstraints ?? [],
|
|
42
|
+
};
|
|
43
|
+
logger.debug('Initialized DependencyResolver', {
|
|
44
|
+
components: this.components.size,
|
|
45
|
+
includeOptional: this.options.includeOptional,
|
|
46
|
+
skipManaged: this.options.skipManaged,
|
|
47
|
+
circularDeps: this.options.circularDependencies.length,
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
/**
|
|
51
|
+
* Resolve all dependencies and generate deployment order
|
|
52
|
+
*
|
|
53
|
+
* @ac US-033-AC-1: Resolve direct dependencies
|
|
54
|
+
* @ac US-033-AC-2: Resolve transitive dependencies
|
|
55
|
+
* @ac US-033-AC-6: Generate dependency report
|
|
56
|
+
*/
|
|
57
|
+
resolve() {
|
|
58
|
+
const startTime = Date.now();
|
|
59
|
+
// Build filtered graph
|
|
60
|
+
const filteredGraph = this.buildFilteredGraph();
|
|
61
|
+
// Perform topological sort
|
|
62
|
+
const { deploymentOrder, unresolved } = this.topologicalSort(filteredGraph);
|
|
63
|
+
// Build resolved dependencies map
|
|
64
|
+
const resolved = this.buildResolvedMap(deploymentOrder, filteredGraph);
|
|
65
|
+
// Categorize components
|
|
66
|
+
const optional = this.findOptionalDependencies();
|
|
67
|
+
const managed = this.findManagedPackages();
|
|
68
|
+
// Generate report
|
|
69
|
+
const report = this.generateReport(resolved, unresolved, optional, managed);
|
|
70
|
+
const duration = Date.now() - startTime;
|
|
71
|
+
logger.info('Dependency resolution completed', {
|
|
72
|
+
totalComponents: this.components.size,
|
|
73
|
+
resolved: resolved.size,
|
|
74
|
+
unresolved: unresolved.length,
|
|
75
|
+
deploymentLevels: report.deploymentLevels,
|
|
76
|
+
durationMs: duration,
|
|
77
|
+
});
|
|
78
|
+
return {
|
|
79
|
+
resolved,
|
|
80
|
+
deploymentOrder,
|
|
81
|
+
unresolved,
|
|
82
|
+
optional,
|
|
83
|
+
managed,
|
|
84
|
+
circular: this.options.circularDependencies,
|
|
85
|
+
report,
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
/**
|
|
89
|
+
* Build filtered graph based on options
|
|
90
|
+
*/
|
|
91
|
+
buildFilteredGraph() {
|
|
92
|
+
const filtered = new Map();
|
|
93
|
+
for (const [nodeId, deps] of this.graph.entries()) {
|
|
94
|
+
// Skip managed packages if configured
|
|
95
|
+
if (this.options.skipManaged && this.isManagedPackage(nodeId)) {
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
const filteredDeps = new Set();
|
|
99
|
+
for (const dep of deps) {
|
|
100
|
+
// Skip managed dependencies
|
|
101
|
+
if (this.options.skipManaged && this.isManagedPackage(dep)) {
|
|
102
|
+
continue;
|
|
103
|
+
}
|
|
104
|
+
// Handle optional dependencies
|
|
105
|
+
if (this.isOptionalDependency()) {
|
|
106
|
+
if (this.options.includeOptional) {
|
|
107
|
+
filteredDeps.add(dep);
|
|
108
|
+
}
|
|
109
|
+
continue;
|
|
110
|
+
}
|
|
111
|
+
filteredDeps.add(dep);
|
|
112
|
+
}
|
|
113
|
+
filtered.set(nodeId, filteredDeps);
|
|
114
|
+
}
|
|
115
|
+
// Apply ordering constraints
|
|
116
|
+
this.applyOrderingConstraints(filtered);
|
|
117
|
+
return filtered;
|
|
118
|
+
}
|
|
119
|
+
/**
|
|
120
|
+
* Apply manual ordering constraints to the graph
|
|
121
|
+
*
|
|
122
|
+
* @ac US-033-AC-5: Support manual ordering constraints
|
|
123
|
+
*/
|
|
124
|
+
applyOrderingConstraints(graph) {
|
|
125
|
+
for (const { before, after } of this.options.orderingConstraints) {
|
|
126
|
+
// Ensure 'before' depends on 'after' (before must be deployed after 'after')
|
|
127
|
+
if (!graph.has(before)) {
|
|
128
|
+
graph.set(before, new Set());
|
|
129
|
+
}
|
|
130
|
+
graph.get(before).add(after);
|
|
131
|
+
}
|
|
132
|
+
}
|
|
133
|
+
/**
|
|
134
|
+
* Perform topological sort using Kahn's algorithm
|
|
135
|
+
*/
|
|
136
|
+
topologicalSort(graph) {
|
|
137
|
+
const deploymentOrder = [];
|
|
138
|
+
const unresolved = [];
|
|
139
|
+
// Calculate in-degree for each node
|
|
140
|
+
const inDegree = new Map();
|
|
141
|
+
for (const nodeId of graph.keys()) {
|
|
142
|
+
inDegree.set(nodeId, 0);
|
|
143
|
+
}
|
|
144
|
+
for (const deps of graph.values()) {
|
|
145
|
+
for (const dep of deps) {
|
|
146
|
+
if (!inDegree.has(dep)) {
|
|
147
|
+
// Dependency not in graph - external/missing
|
|
148
|
+
continue;
|
|
149
|
+
}
|
|
150
|
+
inDegree.set(dep, (inDegree.get(dep) ?? 0) + 1);
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
// Start with nodes that have no dependencies (in-degree = 0)
|
|
154
|
+
const queue = [];
|
|
155
|
+
for (const [nodeId, degree] of inDegree.entries()) {
|
|
156
|
+
if (degree === 0) {
|
|
157
|
+
queue.push(nodeId);
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
// Process nodes in topological order
|
|
161
|
+
while (queue.length > 0) {
|
|
162
|
+
const nodeId = queue.shift();
|
|
163
|
+
deploymentOrder.push(nodeId);
|
|
164
|
+
const deps = graph.get(nodeId) ?? new Set();
|
|
165
|
+
for (const dep of deps) {
|
|
166
|
+
if (!inDegree.has(dep)) {
|
|
167
|
+
continue; // External dependency
|
|
168
|
+
}
|
|
169
|
+
const newDegree = (inDegree.get(dep) ?? 0) - 1;
|
|
170
|
+
inDegree.set(dep, newDegree);
|
|
171
|
+
if (newDegree === 0) {
|
|
172
|
+
queue.push(dep);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
// Check for unresolved dependencies (cycles or missing)
|
|
177
|
+
for (const [nodeId, degree] of inDegree.entries()) {
|
|
178
|
+
if (degree > 0) {
|
|
179
|
+
// Node not processed - part of cycle or has missing deps
|
|
180
|
+
const missingDeps = this.findMissingDependencies(nodeId, graph);
|
|
181
|
+
unresolved.push({ nodeId, missingDependencies: missingDeps });
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
return { deploymentOrder, unresolved };
|
|
185
|
+
}
|
|
186
|
+
/**
|
|
187
|
+
* Find missing dependencies for a node
|
|
188
|
+
*/
|
|
189
|
+
findMissingDependencies(nodeId, graph) {
|
|
190
|
+
const deps = graph.get(nodeId) ?? new Set();
|
|
191
|
+
const missing = [];
|
|
192
|
+
for (const dep of deps) {
|
|
193
|
+
if (!graph.has(dep)) {
|
|
194
|
+
missing.push(dep);
|
|
195
|
+
}
|
|
196
|
+
}
|
|
197
|
+
return missing;
|
|
198
|
+
}
|
|
199
|
+
/**
|
|
200
|
+
* Build resolved dependencies map with deployment order
|
|
201
|
+
*/
|
|
202
|
+
buildResolvedMap(deploymentOrder, graph) {
|
|
203
|
+
const resolved = new Map();
|
|
204
|
+
for (let i = 0; i < deploymentOrder.length; i++) {
|
|
205
|
+
const nodeId = deploymentOrder[i];
|
|
206
|
+
const deps = Array.from(graph.get(nodeId) ?? []);
|
|
207
|
+
resolved.set(nodeId, {
|
|
208
|
+
nodeId,
|
|
209
|
+
dependencies: deps,
|
|
210
|
+
status: 'resolved',
|
|
211
|
+
order: i,
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
return resolved;
|
|
215
|
+
}
|
|
216
|
+
/**
|
|
217
|
+
* @ac US-033-AC-3: Handle optional dependencies
|
|
218
|
+
* Note: Current MetadataComponent doesn't track dependency types
|
|
219
|
+
*/
|
|
220
|
+
findOptionalDependencies() {
|
|
221
|
+
// TODO: When MetadataComponent includes dependency types, implement this properly
|
|
222
|
+
return [];
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* @ac US-033-AC-4: Skip managed package dependencies
|
|
226
|
+
*/
|
|
227
|
+
findManagedPackages() {
|
|
228
|
+
const managed = [];
|
|
229
|
+
for (const nodeId of this.components.keys()) {
|
|
230
|
+
if (this.isManagedPackage(nodeId)) {
|
|
231
|
+
managed.push(nodeId);
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
return managed;
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Check if a component is from a managed package
|
|
238
|
+
*/
|
|
239
|
+
isManagedPackage(nodeId) {
|
|
240
|
+
// Check for namespace prefix (e.g., "ns__ObjectName")
|
|
241
|
+
return nodeId.includes('__') || (this.components.get(nodeId)?.name.includes('__') ?? false);
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Check if a dependency is optional (soft dependency)
|
|
245
|
+
* Note: Current MetadataComponent uses Set<string> for dependencies
|
|
246
|
+
* For now, we'll return false as type info is not available
|
|
247
|
+
*/
|
|
248
|
+
isOptionalDependency() {
|
|
249
|
+
// TODO: When MetadataComponent includes dependency types, implement this properly
|
|
250
|
+
return false;
|
|
251
|
+
}
|
|
252
|
+
/**
|
|
253
|
+
* @ac US-033-AC-6: Generate dependency report
|
|
254
|
+
*/
|
|
255
|
+
generateReport(resolved, unresolved, optional, managed) {
|
|
256
|
+
// Calculate deployment levels
|
|
257
|
+
let maxOrder = 0;
|
|
258
|
+
for (const dep of resolved.values()) {
|
|
259
|
+
maxOrder = Math.max(maxOrder, dep.order);
|
|
260
|
+
}
|
|
261
|
+
return {
|
|
262
|
+
totalComponents: this.components.size,
|
|
263
|
+
resolvedCount: resolved.size,
|
|
264
|
+
unresolvedCount: unresolved.length,
|
|
265
|
+
optionalCount: optional.length,
|
|
266
|
+
managedCount: managed.length,
|
|
267
|
+
circularCount: this.options.circularDependencies.length,
|
|
268
|
+
deploymentLevels: maxOrder + 1,
|
|
269
|
+
};
|
|
270
|
+
}
|
|
271
|
+
/**
|
|
272
|
+
* Get resolution status for a specific component
|
|
273
|
+
*/
|
|
274
|
+
getResolution(nodeId) {
|
|
275
|
+
const result = this.resolve();
|
|
276
|
+
return result.resolved.get(nodeId);
|
|
277
|
+
}
|
|
278
|
+
/**
|
|
279
|
+
* Check if a component can be resolved
|
|
280
|
+
*/
|
|
281
|
+
canResolve(nodeId) {
|
|
282
|
+
const result = this.resolve();
|
|
283
|
+
return result.resolved.has(nodeId);
|
|
284
|
+
}
|
|
285
|
+
/**
|
|
286
|
+
* Get deployment order for specific components
|
|
287
|
+
*/
|
|
288
|
+
getDeploymentOrder(nodeIds) {
|
|
289
|
+
const result = this.resolve();
|
|
290
|
+
const orderMap = new Map();
|
|
291
|
+
for (const dep of result.resolved.values()) {
|
|
292
|
+
orderMap.set(dep.nodeId, dep.order);
|
|
293
|
+
}
|
|
294
|
+
// Sort by order
|
|
295
|
+
return nodeIds.filter((id) => orderMap.has(id)).sort((a, b) => (orderMap.get(a) ?? 0) - (orderMap.get(b) ?? 0));
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
//# sourceMappingURL=dependency-resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-resolver.js","sourceRoot":"","sources":["../../src/dependencies/dependency-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,123 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency Validator
|
|
3
|
+
* Validates the dependency graph for correctness and consistency
|
|
4
|
+
*
|
|
5
|
+
* @ac US-034-AC-1: Validate no dangling references
|
|
6
|
+
* @ac US-034-AC-2: Validate all nodes have types
|
|
7
|
+
* @ac US-034-AC-3: Validate no self-loops (except cycles)
|
|
8
|
+
* @ac US-034-AC-4: Validate edge consistency
|
|
9
|
+
* @ac US-034-AC-5: Generate validation report
|
|
10
|
+
* @ac US-034-AC-6: Fail on critical issues
|
|
11
|
+
*
|
|
12
|
+
* @issue #34
|
|
13
|
+
*/
|
|
14
|
+
import type { NodeId, DependencyGraph, CircularDependency } from '../types/dependency.js';
|
|
15
|
+
import type { MetadataComponent } from '../types/metadata.js';
|
|
16
|
+
/**
|
|
17
|
+
* Validation severity
|
|
18
|
+
*/
|
|
19
|
+
export type ValidationSeverity = 'info' | 'warning' | 'error' | 'critical';
|
|
20
|
+
/**
|
|
21
|
+
* Validation issue
|
|
22
|
+
*/
|
|
23
|
+
export type ValidationIssue = {
|
|
24
|
+
severity: ValidationSeverity;
|
|
25
|
+
code: string;
|
|
26
|
+
message: string;
|
|
27
|
+
nodeId?: NodeId;
|
|
28
|
+
relatedNodes?: NodeId[];
|
|
29
|
+
suggestion?: string;
|
|
30
|
+
};
|
|
31
|
+
/**
|
|
32
|
+
* Validation result
|
|
33
|
+
*/
|
|
34
|
+
export type ValidationResult = {
|
|
35
|
+
isValid: boolean;
|
|
36
|
+
issues: ValidationIssue[];
|
|
37
|
+
errors: ValidationIssue[];
|
|
38
|
+
warnings: ValidationIssue[];
|
|
39
|
+
critical: ValidationIssue[];
|
|
40
|
+
stats: ValidationStats;
|
|
41
|
+
};
|
|
42
|
+
/**
|
|
43
|
+
* Validation statistics
|
|
44
|
+
*/
|
|
45
|
+
export type ValidationStats = {
|
|
46
|
+
totalNodes: number;
|
|
47
|
+
totalEdges: number;
|
|
48
|
+
danglingReferences: number;
|
|
49
|
+
selfLoops: number;
|
|
50
|
+
invalidNodes: number;
|
|
51
|
+
edgeInconsistencies: number;
|
|
52
|
+
};
|
|
53
|
+
/**
|
|
54
|
+
* Validator options
|
|
55
|
+
*/
|
|
56
|
+
export type ValidatorOptions = {
|
|
57
|
+
/** Fail on warnings (not just errors) */
|
|
58
|
+
strictMode?: boolean;
|
|
59
|
+
/** Known circular dependencies to ignore for self-loop checks */
|
|
60
|
+
circularDependencies?: CircularDependency[];
|
|
61
|
+
/** Allow self-loops in specific node types */
|
|
62
|
+
allowSelfLoops?: boolean;
|
|
63
|
+
};
|
|
64
|
+
/**
|
|
65
|
+
* Dependency Validator
|
|
66
|
+
*
|
|
67
|
+
* Validates dependency graph integrity:
|
|
68
|
+
* - No dangling references (edges to non-existent nodes)
|
|
69
|
+
* - All nodes have valid types
|
|
70
|
+
* - No self-loops (unless in known cycles)
|
|
71
|
+
* - Edge consistency (graph ↔ components)
|
|
72
|
+
*
|
|
73
|
+
* Performance: O(V + E)
|
|
74
|
+
*
|
|
75
|
+
* @example
|
|
76
|
+
* const validator = new DependencyValidator(graph, components);
|
|
77
|
+
* const result = validator.validate();
|
|
78
|
+
* if (!result.isValid) {
|
|
79
|
+
* console.error(`Found ${result.errors.length} errors`);
|
|
80
|
+
* result.errors.forEach(e => console.error(e.message));
|
|
81
|
+
* }
|
|
82
|
+
*/
|
|
83
|
+
export declare class DependencyValidator {
|
|
84
|
+
private graph;
|
|
85
|
+
private components;
|
|
86
|
+
private options;
|
|
87
|
+
constructor(graph: DependencyGraph, components: Map<NodeId, MetadataComponent>, options?: ValidatorOptions);
|
|
88
|
+
/**
|
|
89
|
+
* Validate the dependency graph
|
|
90
|
+
*
|
|
91
|
+
* @ac US-034-AC-5: Generate validation report
|
|
92
|
+
* @ac US-034-AC-6: Fail on critical issues
|
|
93
|
+
*/
|
|
94
|
+
validate(): ValidationResult;
|
|
95
|
+
/**
|
|
96
|
+
* @ac US-034-AC-1: Validate no dangling references
|
|
97
|
+
*/
|
|
98
|
+
private validateDanglingReferences;
|
|
99
|
+
/**
|
|
100
|
+
* @ac US-034-AC-2: Validate all nodes have types
|
|
101
|
+
*/
|
|
102
|
+
private validateNodeTypes;
|
|
103
|
+
/**
|
|
104
|
+
* @ac US-034-AC-3: Validate no self-loops (except cycles)
|
|
105
|
+
*/
|
|
106
|
+
private validateSelfLoops;
|
|
107
|
+
/**
|
|
108
|
+
* @ac US-034-AC-4: Validate edge consistency
|
|
109
|
+
*/
|
|
110
|
+
private validateEdgeConsistency;
|
|
111
|
+
/**
|
|
112
|
+
* Calculate validation statistics
|
|
113
|
+
*/
|
|
114
|
+
private calculateStats;
|
|
115
|
+
/**
|
|
116
|
+
* Validate a specific component
|
|
117
|
+
*/
|
|
118
|
+
validateComponent(nodeId: NodeId): ValidationIssue[];
|
|
119
|
+
/**
|
|
120
|
+
* Check if validation would pass
|
|
121
|
+
*/
|
|
122
|
+
isValid(): boolean;
|
|
123
|
+
}
|