@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,134 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency Cache
|
|
3
|
+
* Caches dependency analysis results for faster subsequent runs
|
|
4
|
+
*
|
|
5
|
+
* @ac US-036-AC-1: Cache graph structure
|
|
6
|
+
* @ac US-036-AC-2: Invalidate cache on file changes
|
|
7
|
+
* @ac US-036-AC-3: Cache topological sort results
|
|
8
|
+
* @ac US-036-AC-4: Cache cycle detection results
|
|
9
|
+
* @ac US-036-AC-5: Cache heuristic inferences
|
|
10
|
+
* @ac US-036-AC-6: Configurable cache TTL
|
|
11
|
+
*
|
|
12
|
+
* @issue #36
|
|
13
|
+
*/
|
|
14
|
+
/**
|
|
15
|
+
* Cache entry structure
|
|
16
|
+
*/
|
|
17
|
+
export type CacheEntry<T> = {
|
|
18
|
+
data: T;
|
|
19
|
+
timestamp: number;
|
|
20
|
+
version: string;
|
|
21
|
+
fileHashes: Map<string, string>;
|
|
22
|
+
};
|
|
23
|
+
/**
|
|
24
|
+
* Cache key types
|
|
25
|
+
*/
|
|
26
|
+
export type CacheKey = 'graph' | 'topological-sort' | 'circular-dependencies' | 'heuristic-inferences' | 'depth-analysis' | 'impact-analysis';
|
|
27
|
+
/**
|
|
28
|
+
* Cache options
|
|
29
|
+
*/
|
|
30
|
+
export type CacheOptions = {
|
|
31
|
+
/** Cache directory */
|
|
32
|
+
cacheDir?: string;
|
|
33
|
+
/** Time to live in seconds (default: 3600 = 1 hour) */
|
|
34
|
+
ttl?: number;
|
|
35
|
+
/** Enable cache (default: true) */
|
|
36
|
+
enabled?: boolean;
|
|
37
|
+
/** Cache version (for invalidation) */
|
|
38
|
+
version?: string;
|
|
39
|
+
};
|
|
40
|
+
/**
|
|
41
|
+
* Dependency Cache
|
|
42
|
+
*
|
|
43
|
+
* Caches dependency analysis results to speed up subsequent runs.
|
|
44
|
+
* Automatically invalidates cache when files change.
|
|
45
|
+
*
|
|
46
|
+
* Performance: O(1) read/write
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* const cache = new DependencyCache({ ttl: 3600 });
|
|
50
|
+
*
|
|
51
|
+
* // Try to load from cache
|
|
52
|
+
* const graph = await cache.get('graph', filePaths);
|
|
53
|
+
* if (graph) {
|
|
54
|
+
* console.log('Using cached graph');
|
|
55
|
+
* } else {
|
|
56
|
+
* const newGraph = buildGraph();
|
|
57
|
+
* await cache.set('graph', newGraph, filePaths);
|
|
58
|
+
* }
|
|
59
|
+
*/
|
|
60
|
+
export declare class DependencyCache {
|
|
61
|
+
private options;
|
|
62
|
+
private memoryCache;
|
|
63
|
+
constructor(options?: CacheOptions);
|
|
64
|
+
/**
|
|
65
|
+
* @ac US-036-AC-1: Cache graph structure
|
|
66
|
+
*/
|
|
67
|
+
get<T>(key: CacheKey, filePaths: string[]): Promise<T | undefined>;
|
|
68
|
+
/**
|
|
69
|
+
* @ac US-036-AC-1: Cache graph structure
|
|
70
|
+
* @ac US-036-AC-3: Cache topological sort results
|
|
71
|
+
* @ac US-036-AC-4: Cache cycle detection results
|
|
72
|
+
* @ac US-036-AC-5: Cache heuristic inferences
|
|
73
|
+
*/
|
|
74
|
+
set<T>(key: CacheKey, data: T, filePaths: string[]): Promise<void>;
|
|
75
|
+
/**
|
|
76
|
+
* @ac US-036-AC-2: Invalidate cache on file changes
|
|
77
|
+
*/
|
|
78
|
+
invalidate(key: CacheKey): Promise<void>;
|
|
79
|
+
/**
|
|
80
|
+
* Invalidate all cache entries
|
|
81
|
+
*/
|
|
82
|
+
invalidateAll(): Promise<void>;
|
|
83
|
+
/**
|
|
84
|
+
* Delete a cache entry
|
|
85
|
+
*/
|
|
86
|
+
private delete;
|
|
87
|
+
/**
|
|
88
|
+
* @ac US-036-AC-2: Invalidate cache on file changes
|
|
89
|
+
* @ac US-036-AC-6: Configurable cache TTL
|
|
90
|
+
*/
|
|
91
|
+
private isValid;
|
|
92
|
+
/**
|
|
93
|
+
* Hash files for change detection
|
|
94
|
+
*/
|
|
95
|
+
private hashFiles;
|
|
96
|
+
/**
|
|
97
|
+
* Get cache file path
|
|
98
|
+
*/
|
|
99
|
+
private getCacheFilePath;
|
|
100
|
+
/**
|
|
101
|
+
* JSON replacer for Sets and Maps
|
|
102
|
+
*/
|
|
103
|
+
private replacer;
|
|
104
|
+
/**
|
|
105
|
+
* JSON reviver for Sets and Maps
|
|
106
|
+
*/
|
|
107
|
+
private reviver;
|
|
108
|
+
private isSerializedSet;
|
|
109
|
+
private isSerializedMap;
|
|
110
|
+
/**
|
|
111
|
+
* Get cache statistics
|
|
112
|
+
*/
|
|
113
|
+
getStats(): {
|
|
114
|
+
memoryEntries: number;
|
|
115
|
+
enabled: boolean;
|
|
116
|
+
ttl: number;
|
|
117
|
+
};
|
|
118
|
+
/**
|
|
119
|
+
* Check if cache is enabled
|
|
120
|
+
*/
|
|
121
|
+
isEnabled(): boolean;
|
|
122
|
+
/**
|
|
123
|
+
* Enable cache
|
|
124
|
+
*/
|
|
125
|
+
enable(): void;
|
|
126
|
+
/**
|
|
127
|
+
* Disable cache
|
|
128
|
+
*/
|
|
129
|
+
disable(): void;
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Helper: Create a cache key from file paths
|
|
133
|
+
*/
|
|
134
|
+
export declare function createCacheKey(baseKey: CacheKey, filePaths: string[]): string;
|
|
@@ -0,0 +1,303 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency Cache
|
|
3
|
+
* Caches dependency analysis results for faster subsequent runs
|
|
4
|
+
*
|
|
5
|
+
* @ac US-036-AC-1: Cache graph structure
|
|
6
|
+
* @ac US-036-AC-2: Invalidate cache on file changes
|
|
7
|
+
* @ac US-036-AC-3: Cache topological sort results
|
|
8
|
+
* @ac US-036-AC-4: Cache cycle detection results
|
|
9
|
+
* @ac US-036-AC-5: Cache heuristic inferences
|
|
10
|
+
* @ac US-036-AC-6: Configurable cache TTL
|
|
11
|
+
*
|
|
12
|
+
* @issue #36
|
|
13
|
+
*/
|
|
14
|
+
import fs from 'node:fs/promises';
|
|
15
|
+
import path from 'node:path';
|
|
16
|
+
import crypto from 'node:crypto';
|
|
17
|
+
import { getLogger } from '../utils/logger.js';
|
|
18
|
+
const logger = getLogger('DependencyCache');
|
|
19
|
+
/**
|
|
20
|
+
* Dependency Cache
|
|
21
|
+
*
|
|
22
|
+
* Caches dependency analysis results to speed up subsequent runs.
|
|
23
|
+
* Automatically invalidates cache when files change.
|
|
24
|
+
*
|
|
25
|
+
* Performance: O(1) read/write
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* const cache = new DependencyCache({ ttl: 3600 });
|
|
29
|
+
*
|
|
30
|
+
* // Try to load from cache
|
|
31
|
+
* const graph = await cache.get('graph', filePaths);
|
|
32
|
+
* if (graph) {
|
|
33
|
+
* console.log('Using cached graph');
|
|
34
|
+
* } else {
|
|
35
|
+
* const newGraph = buildGraph();
|
|
36
|
+
* await cache.set('graph', newGraph, filePaths);
|
|
37
|
+
* }
|
|
38
|
+
*/
|
|
39
|
+
export class DependencyCache {
|
|
40
|
+
options;
|
|
41
|
+
memoryCache;
|
|
42
|
+
constructor(options = {}) {
|
|
43
|
+
this.options = {
|
|
44
|
+
cacheDir: options.cacheDir ?? path.join(process.cwd(), '.sf-deploy-cache'),
|
|
45
|
+
ttl: options.ttl ?? 3600,
|
|
46
|
+
enabled: options.enabled ?? true,
|
|
47
|
+
version: options.version ?? '1.0.0',
|
|
48
|
+
};
|
|
49
|
+
this.memoryCache = new Map();
|
|
50
|
+
logger.debug('Initialized DependencyCache', {
|
|
51
|
+
cacheDir: this.options.cacheDir,
|
|
52
|
+
ttl: this.options.ttl,
|
|
53
|
+
enabled: this.options.enabled,
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
/**
|
|
57
|
+
* @ac US-036-AC-1: Cache graph structure
|
|
58
|
+
*/
|
|
59
|
+
async get(key, filePaths) {
|
|
60
|
+
if (!this.options.enabled) {
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
// Try memory cache first
|
|
64
|
+
const memEntry = this.memoryCache.get(key);
|
|
65
|
+
if (memEntry && (await this.isValid(memEntry, filePaths))) {
|
|
66
|
+
logger.debug('Cache hit (memory)', { key });
|
|
67
|
+
return memEntry.data;
|
|
68
|
+
}
|
|
69
|
+
// Try disk cache
|
|
70
|
+
try {
|
|
71
|
+
const cacheFile = this.getCacheFilePath(key);
|
|
72
|
+
const content = await fs.readFile(cacheFile, 'utf-8');
|
|
73
|
+
const entry = JSON.parse(content, (_key, value) => this.reviver(_key, value));
|
|
74
|
+
if (await this.isValid(entry, filePaths)) {
|
|
75
|
+
// Store in memory for faster access
|
|
76
|
+
this.memoryCache.set(key, entry);
|
|
77
|
+
logger.debug('Cache hit (disk)', { key });
|
|
78
|
+
return entry.data;
|
|
79
|
+
}
|
|
80
|
+
else {
|
|
81
|
+
logger.debug('Cache invalid', { key });
|
|
82
|
+
await this.delete(key);
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
if (error.code !== 'ENOENT') {
|
|
87
|
+
logger.warn('Failed to read cache', { key, error });
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
logger.debug('Cache miss', { key });
|
|
91
|
+
return undefined;
|
|
92
|
+
}
|
|
93
|
+
/**
|
|
94
|
+
* @ac US-036-AC-1: Cache graph structure
|
|
95
|
+
* @ac US-036-AC-3: Cache topological sort results
|
|
96
|
+
* @ac US-036-AC-4: Cache cycle detection results
|
|
97
|
+
* @ac US-036-AC-5: Cache heuristic inferences
|
|
98
|
+
*/
|
|
99
|
+
async set(key, data, filePaths) {
|
|
100
|
+
if (!this.options.enabled) {
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
const fileHashes = await this.hashFiles(filePaths);
|
|
104
|
+
const entry = {
|
|
105
|
+
data,
|
|
106
|
+
timestamp: Date.now(),
|
|
107
|
+
version: this.options.version,
|
|
108
|
+
fileHashes,
|
|
109
|
+
};
|
|
110
|
+
// Store in memory
|
|
111
|
+
this.memoryCache.set(key, entry);
|
|
112
|
+
// Store on disk
|
|
113
|
+
try {
|
|
114
|
+
await fs.mkdir(this.options.cacheDir, { recursive: true });
|
|
115
|
+
const cacheFile = this.getCacheFilePath(key);
|
|
116
|
+
const content = JSON.stringify(entry, (_key, value) => this.replacer(_key, value), 2);
|
|
117
|
+
await fs.writeFile(cacheFile, content, 'utf-8');
|
|
118
|
+
logger.debug('Cache stored', { key, files: filePaths.length });
|
|
119
|
+
}
|
|
120
|
+
catch (error) {
|
|
121
|
+
logger.warn('Failed to write cache', { key, error });
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
/**
|
|
125
|
+
* @ac US-036-AC-2: Invalidate cache on file changes
|
|
126
|
+
*/
|
|
127
|
+
async invalidate(key) {
|
|
128
|
+
await this.delete(key);
|
|
129
|
+
logger.debug('Cache invalidated', { key });
|
|
130
|
+
}
|
|
131
|
+
/**
|
|
132
|
+
* Invalidate all cache entries
|
|
133
|
+
*/
|
|
134
|
+
async invalidateAll() {
|
|
135
|
+
this.memoryCache.clear();
|
|
136
|
+
try {
|
|
137
|
+
await fs.rm(this.options.cacheDir, { recursive: true, force: true });
|
|
138
|
+
logger.debug('All cache invalidated');
|
|
139
|
+
}
|
|
140
|
+
catch (error) {
|
|
141
|
+
logger.warn('Failed to invalidate all cache', { error });
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
/**
|
|
145
|
+
* Delete a cache entry
|
|
146
|
+
*/
|
|
147
|
+
async delete(key) {
|
|
148
|
+
this.memoryCache.delete(key);
|
|
149
|
+
try {
|
|
150
|
+
const cacheFile = this.getCacheFilePath(key);
|
|
151
|
+
await fs.unlink(cacheFile);
|
|
152
|
+
}
|
|
153
|
+
catch (error) {
|
|
154
|
+
if (error.code !== 'ENOENT') {
|
|
155
|
+
logger.warn('Failed to delete cache file', { key, error });
|
|
156
|
+
}
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
/**
|
|
160
|
+
* @ac US-036-AC-2: Invalidate cache on file changes
|
|
161
|
+
* @ac US-036-AC-6: Configurable cache TTL
|
|
162
|
+
*/
|
|
163
|
+
async isValid(entry, filePaths) {
|
|
164
|
+
// Check version
|
|
165
|
+
if (entry.version !== this.options.version) {
|
|
166
|
+
logger.debug('Cache version mismatch', {
|
|
167
|
+
cached: entry.version,
|
|
168
|
+
current: this.options.version,
|
|
169
|
+
});
|
|
170
|
+
return false;
|
|
171
|
+
}
|
|
172
|
+
// Check TTL
|
|
173
|
+
const age = (Date.now() - entry.timestamp) / 1000;
|
|
174
|
+
if (age > this.options.ttl) {
|
|
175
|
+
logger.debug('Cache expired', { age, ttl: this.options.ttl });
|
|
176
|
+
return false;
|
|
177
|
+
}
|
|
178
|
+
// Check file hashes
|
|
179
|
+
const currentHashes = await this.hashFiles(filePaths);
|
|
180
|
+
if (currentHashes.size !== entry.fileHashes.size) {
|
|
181
|
+
logger.debug('File count changed', {
|
|
182
|
+
cached: entry.fileHashes.size,
|
|
183
|
+
current: currentHashes.size,
|
|
184
|
+
});
|
|
185
|
+
return false;
|
|
186
|
+
}
|
|
187
|
+
for (const [file, hash] of currentHashes.entries()) {
|
|
188
|
+
if (entry.fileHashes.get(file) !== hash) {
|
|
189
|
+
logger.debug('File modified', { file });
|
|
190
|
+
return false;
|
|
191
|
+
}
|
|
192
|
+
}
|
|
193
|
+
return true;
|
|
194
|
+
}
|
|
195
|
+
/**
|
|
196
|
+
* Hash files for change detection
|
|
197
|
+
*/
|
|
198
|
+
async hashFiles(filePaths) {
|
|
199
|
+
const hashes = new Map();
|
|
200
|
+
let chain = Promise.resolve();
|
|
201
|
+
filePaths.forEach((filePath) => {
|
|
202
|
+
chain = chain.then(async () => {
|
|
203
|
+
try {
|
|
204
|
+
const stat = await fs.stat(filePath);
|
|
205
|
+
// Simple hash: mtime + size
|
|
206
|
+
const hash = crypto.createHash('md5').update(`${stat.mtimeMs}-${stat.size}`).digest('hex');
|
|
207
|
+
hashes.set(filePath, hash);
|
|
208
|
+
}
|
|
209
|
+
catch (error) {
|
|
210
|
+
logger.warn('Failed to hash file', { filePath, error });
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
await chain;
|
|
215
|
+
return hashes;
|
|
216
|
+
}
|
|
217
|
+
/**
|
|
218
|
+
* Get cache file path
|
|
219
|
+
*/
|
|
220
|
+
getCacheFilePath(key) {
|
|
221
|
+
return path.join(this.options.cacheDir, `${key}.json`);
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* JSON replacer for Sets and Maps
|
|
225
|
+
*/
|
|
226
|
+
replacer(_key, value) {
|
|
227
|
+
if (value instanceof Set) {
|
|
228
|
+
return { kind: 'Set', data: Array.from(value) };
|
|
229
|
+
}
|
|
230
|
+
if (value instanceof Map) {
|
|
231
|
+
return { kind: 'Map', data: Array.from(value.entries()) };
|
|
232
|
+
}
|
|
233
|
+
return value;
|
|
234
|
+
}
|
|
235
|
+
/**
|
|
236
|
+
* JSON reviver for Sets and Maps
|
|
237
|
+
*/
|
|
238
|
+
reviver(_key, value) {
|
|
239
|
+
if (typeof value === 'object' && value !== null) {
|
|
240
|
+
if (this.isSerializedSet(value)) {
|
|
241
|
+
return new Set(value.data);
|
|
242
|
+
}
|
|
243
|
+
if (this.isSerializedMap(value)) {
|
|
244
|
+
return new Map(value.data);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
return value;
|
|
248
|
+
}
|
|
249
|
+
isSerializedSet(value) {
|
|
250
|
+
return (typeof value === 'object' &&
|
|
251
|
+
value !== null &&
|
|
252
|
+
'kind' in value &&
|
|
253
|
+
'data' in value &&
|
|
254
|
+
value.kind === 'Set' &&
|
|
255
|
+
Array.isArray(value.data));
|
|
256
|
+
}
|
|
257
|
+
isSerializedMap(value) {
|
|
258
|
+
return (typeof value === 'object' &&
|
|
259
|
+
value !== null &&
|
|
260
|
+
'kind' in value &&
|
|
261
|
+
'data' in value &&
|
|
262
|
+
value.kind === 'Map' &&
|
|
263
|
+
Array.isArray(value.data));
|
|
264
|
+
}
|
|
265
|
+
/**
|
|
266
|
+
* Get cache statistics
|
|
267
|
+
*/
|
|
268
|
+
getStats() {
|
|
269
|
+
return {
|
|
270
|
+
memoryEntries: this.memoryCache.size,
|
|
271
|
+
enabled: this.options.enabled,
|
|
272
|
+
ttl: this.options.ttl,
|
|
273
|
+
};
|
|
274
|
+
}
|
|
275
|
+
/**
|
|
276
|
+
* Check if cache is enabled
|
|
277
|
+
*/
|
|
278
|
+
isEnabled() {
|
|
279
|
+
return this.options.enabled;
|
|
280
|
+
}
|
|
281
|
+
/**
|
|
282
|
+
* Enable cache
|
|
283
|
+
*/
|
|
284
|
+
enable() {
|
|
285
|
+
this.options.enabled = true;
|
|
286
|
+
logger.debug('Cache enabled');
|
|
287
|
+
}
|
|
288
|
+
/**
|
|
289
|
+
* Disable cache
|
|
290
|
+
*/
|
|
291
|
+
disable() {
|
|
292
|
+
this.options.enabled = false;
|
|
293
|
+
logger.debug('Cache disabled');
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
/**
|
|
297
|
+
* Helper: Create a cache key from file paths
|
|
298
|
+
*/
|
|
299
|
+
export function createCacheKey(baseKey, filePaths) {
|
|
300
|
+
const hash = crypto.createHash('md5').update(filePaths.sort().join('|')).digest('hex');
|
|
301
|
+
return `${baseKey}-${hash.substring(0, 8)}`;
|
|
302
|
+
}
|
|
303
|
+
//# sourceMappingURL=dependency-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-cache.js","sourceRoot":"","sources":["../../src/dependencies/dependency-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,145 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Dependency Depth Calculator
|
|
3
|
+
* Calculates dependency depth for each component to identify high-risk components
|
|
4
|
+
*
|
|
5
|
+
* @ac US-031-AC-1: Calculate depth from leaf nodes
|
|
6
|
+
* @ac US-031-AC-2: Identify components with depth > 10 (warning)
|
|
7
|
+
* @ac US-031-AC-3: Generate depth distribution report
|
|
8
|
+
* @ac US-031-AC-4: Highlight critical path components
|
|
9
|
+
* @ac US-031-AC-5: Consider cycle depth as infinite
|
|
10
|
+
*
|
|
11
|
+
* @issue #31
|
|
12
|
+
*/
|
|
13
|
+
import type { NodeId, DependencyGraph, CircularDependency } from '../types/dependency.js';
|
|
14
|
+
/**
|
|
15
|
+
* Depth information for a component
|
|
16
|
+
*/
|
|
17
|
+
export type ComponentDepth = {
|
|
18
|
+
nodeId: NodeId;
|
|
19
|
+
depth: number;
|
|
20
|
+
isInCycle: boolean;
|
|
21
|
+
isLeaf: boolean;
|
|
22
|
+
isHighRisk: boolean;
|
|
23
|
+
isCriticalPath: boolean;
|
|
24
|
+
pathToLeaf: NodeId[];
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* Depth distribution report
|
|
28
|
+
*/
|
|
29
|
+
export type DepthDistribution = {
|
|
30
|
+
depthRange: string;
|
|
31
|
+
count: number;
|
|
32
|
+
percentage: number;
|
|
33
|
+
components: NodeId[];
|
|
34
|
+
};
|
|
35
|
+
/**
|
|
36
|
+
* Complete depth analysis result
|
|
37
|
+
*/
|
|
38
|
+
export type DepthAnalysisResult = {
|
|
39
|
+
/** Depth information for each component */
|
|
40
|
+
depths: Map<NodeId, ComponentDepth>;
|
|
41
|
+
/** Components with depth > 10 */
|
|
42
|
+
highRiskComponents: ComponentDepth[];
|
|
43
|
+
/** Critical path (longest dependency chain) */
|
|
44
|
+
criticalPath: NodeId[];
|
|
45
|
+
/** Maximum depth in the graph */
|
|
46
|
+
maxDepth: number;
|
|
47
|
+
/** Average depth */
|
|
48
|
+
averageDepth: number;
|
|
49
|
+
/** Depth distribution */
|
|
50
|
+
distribution: DepthDistribution[];
|
|
51
|
+
/** Components in cycles (infinite depth) */
|
|
52
|
+
cyclicComponents: NodeId[];
|
|
53
|
+
};
|
|
54
|
+
/**
|
|
55
|
+
* Options for depth calculation
|
|
56
|
+
*/
|
|
57
|
+
export type DepthCalculationOptions = {
|
|
58
|
+
/** Circular dependencies to consider */
|
|
59
|
+
circularDependencies?: CircularDependency[];
|
|
60
|
+
/** Depth threshold for high-risk warning */
|
|
61
|
+
highRiskThreshold?: number;
|
|
62
|
+
};
|
|
63
|
+
/**
|
|
64
|
+
* Dependency Depth Calculator
|
|
65
|
+
*
|
|
66
|
+
* Calculates the dependency depth of each component from leaf nodes.
|
|
67
|
+
* Leaf nodes (no dependencies) have depth 0.
|
|
68
|
+
* Components depending on others have depth = max(dep.depth) + 1.
|
|
69
|
+
*
|
|
70
|
+
* Performance: O(V + E) using topological sort
|
|
71
|
+
*
|
|
72
|
+
* @example
|
|
73
|
+
* const calculator = new DependencyDepthCalculator(graph);
|
|
74
|
+
* const result = calculator.calculate();
|
|
75
|
+
* console.log(`Max depth: ${result.maxDepth}`);
|
|
76
|
+
* console.log(`High-risk: ${result.highRiskComponents.length}`);
|
|
77
|
+
*/
|
|
78
|
+
export declare class DependencyDepthCalculator {
|
|
79
|
+
private graph;
|
|
80
|
+
private options;
|
|
81
|
+
private cyclicNodes;
|
|
82
|
+
constructor(graph: DependencyGraph, options?: DepthCalculationOptions);
|
|
83
|
+
/**
|
|
84
|
+
* @ac US-031-AC-4: Highlight critical path components
|
|
85
|
+
*
|
|
86
|
+
* Find the critical path (longest dependency chain)
|
|
87
|
+
*/
|
|
88
|
+
private static findCriticalPath;
|
|
89
|
+
/**
|
|
90
|
+
* @ac US-031-AC-3: Generate depth distribution report
|
|
91
|
+
*/
|
|
92
|
+
private static generateDistribution;
|
|
93
|
+
/**
|
|
94
|
+
* Calculate maximum depth
|
|
95
|
+
*/
|
|
96
|
+
private static calculateMaxDepth;
|
|
97
|
+
/**
|
|
98
|
+
* Calculate average depth (excluding cyclic nodes)
|
|
99
|
+
*/
|
|
100
|
+
private static calculateAverageDepth;
|
|
101
|
+
/**
|
|
102
|
+
* Calculate depths for all components
|
|
103
|
+
*
|
|
104
|
+
* @ac US-031-AC-1: Calculate depth from leaf nodes
|
|
105
|
+
* @ac US-031-AC-2: Identify components with depth > 10
|
|
106
|
+
* @ac US-031-AC-5: Consider cycle depth as infinite
|
|
107
|
+
*/
|
|
108
|
+
calculate(): DepthAnalysisResult;
|
|
109
|
+
/**
|
|
110
|
+
* Calculate depth for all nodes using BFS from leaf nodes
|
|
111
|
+
*/
|
|
112
|
+
private calculateDepths;
|
|
113
|
+
/**
|
|
114
|
+
* Calculate in-degree for each node
|
|
115
|
+
*/
|
|
116
|
+
private calculateInDegree;
|
|
117
|
+
/**
|
|
118
|
+
* Initialize leaf nodes in the queue
|
|
119
|
+
*/
|
|
120
|
+
private initializeLeafNodes;
|
|
121
|
+
/**
|
|
122
|
+
* Process nodes in BFS order
|
|
123
|
+
*/
|
|
124
|
+
private processNodesInBFS;
|
|
125
|
+
/**
|
|
126
|
+
* Update candidate node depth if this path is longer
|
|
127
|
+
*/
|
|
128
|
+
private updateCandidateDepth;
|
|
129
|
+
/**
|
|
130
|
+
* Process remaining nodes not yet in depths map
|
|
131
|
+
*/
|
|
132
|
+
private processRemainingNodes;
|
|
133
|
+
/**
|
|
134
|
+
* Calculate depth for a single node based on its dependencies
|
|
135
|
+
*/
|
|
136
|
+
private calculateNodeDepth;
|
|
137
|
+
/**
|
|
138
|
+
* @ac US-031-AC-2: Identify components with depth > 10
|
|
139
|
+
*/
|
|
140
|
+
private findHighRiskComponents;
|
|
141
|
+
/**
|
|
142
|
+
* Get depth for a specific component
|
|
143
|
+
*/
|
|
144
|
+
getDepth(nodeId: NodeId): ComponentDepth | undefined;
|
|
145
|
+
}
|