@jterrats/smart-deployment 1.0.3 → 1.0.5
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/LICENSE +29 -0
- package/README.md +6 -0
- package/lib/ai/wave-validation-service.d.ts +21 -0
- package/lib/ai/wave-validation-service.js +189 -114
- package/lib/ai/wave-validation-service.js.map +1 -1
- package/lib/analysis/analysis-reporter.d.ts +12 -0
- package/lib/analysis/analysis-reporter.js +61 -0
- package/lib/analysis/analysis-reporter.js.map +1 -1
- package/lib/analysis/analyze-artifact-service.d.ts +25 -0
- package/lib/analysis/analyze-artifact-service.js +50 -0
- package/lib/analysis/analyze-artifact-service.js.map +1 -0
- package/lib/analysis/analyze-context-service.d.ts +25 -0
- package/lib/analysis/analyze-context-service.js +28 -0
- package/lib/analysis/analyze-context-service.js.map +1 -0
- package/lib/analysis/project-analysis-service.d.ts +48 -0
- package/lib/analysis/project-analysis-service.js +134 -0
- package/lib/analysis/project-analysis-service.js.map +1 -0
- package/lib/commands/analyze.d.ts +0 -2
- package/lib/commands/analyze.js +31 -162
- package/lib/commands/analyze.js.map +1 -1
- package/lib/commands/config.d.ts +0 -4
- package/lib/commands/config.js +25 -95
- package/lib/commands/config.js.map +1 -1
- package/lib/commands/resume.js +6 -16
- package/lib/commands/resume.js.map +1 -1
- package/lib/commands/start.d.ts +0 -11
- package/lib/commands/start.js +38 -550
- package/lib/commands/start.js.map +1 -1
- package/lib/commands/status.js +36 -12
- package/lib/commands/status.js.map +1 -1
- package/lib/commands/validate.d.ts +3 -0
- package/lib/commands/validate.js +5 -7
- package/lib/commands/validate.js.map +1 -1
- package/lib/config/config-mutation-service.d.ts +21 -0
- package/lib/config/config-mutation-service.js +61 -0
- package/lib/config/config-mutation-service.js.map +1 -0
- package/lib/dependencies/circular-dependency-detector.d.ts +5 -0
- package/lib/dependencies/circular-dependency-detector.js +67 -72
- package/lib/dependencies/circular-dependency-detector.js.map +1 -1
- package/lib/dependencies/dependency-depth-calculator.d.ts +28 -0
- package/lib/dependencies/dependency-depth-calculator.js +86 -39
- package/lib/dependencies/dependency-depth-calculator.js.map +1 -1
- package/lib/dependencies/dependency-graph-builder.d.ts +45 -13
- package/lib/dependencies/dependency-graph-builder.js +228 -123
- package/lib/dependencies/dependency-graph-builder.js.map +1 -1
- package/lib/dependencies/dependency-impact-analyzer.d.ts +13 -0
- package/lib/dependencies/dependency-impact-analyzer.js +146 -102
- package/lib/dependencies/dependency-impact-analyzer.js.map +1 -1
- package/lib/dependencies/dependency-merger.d.ts +10 -0
- package/lib/dependencies/dependency-merger.js +123 -61
- package/lib/dependencies/dependency-merger.js.map +1 -1
- package/lib/dependencies/dependency-resolver.d.ts +34 -9
- package/lib/dependencies/dependency-resolver.js +181 -112
- package/lib/dependencies/dependency-resolver.js.map +1 -1
- package/lib/dependencies/dependency-semantics.d.ts +20 -0
- package/lib/dependencies/dependency-semantics.js +55 -0
- package/lib/dependencies/dependency-semantics.js.map +1 -0
- package/lib/dependencies/graph-visualizer.d.ts +6 -1
- package/lib/dependencies/graph-visualizer.js +38 -4
- package/lib/dependencies/graph-visualizer.js.map +1 -1
- package/lib/dependencies/heuristic-inference.d.ts +2 -53
- package/lib/dependencies/heuristic-inference.js +8 -317
- package/lib/dependencies/heuristic-inference.js.map +1 -1
- package/lib/dependencies/heuristic-patterns.d.ts +14 -0
- package/lib/dependencies/heuristic-patterns.js +247 -0
- package/lib/dependencies/heuristic-patterns.js.map +1 -0
- package/lib/deployment/cycle-remediation-runner.d.ts +36 -0
- package/lib/deployment/cycle-remediation-runner.js +262 -0
- package/lib/deployment/cycle-remediation-runner.js.map +1 -0
- package/lib/deployment/deployment-context-service.d.ts +24 -0
- package/lib/deployment/deployment-context-service.js +17 -0
- package/lib/deployment/deployment-context-service.js.map +1 -0
- package/lib/deployment/deployment-runner.d.ts +37 -0
- package/lib/deployment/deployment-runner.js +94 -0
- package/lib/deployment/deployment-runner.js.map +1 -0
- package/lib/deployment/deployment-status-service.d.ts +5 -0
- package/lib/deployment/deployment-status-service.js +39 -18
- package/lib/deployment/deployment-status-service.js.map +1 -1
- package/lib/deployment/deployment-validation-service.d.ts +5 -2
- package/lib/deployment/deployment-validation-service.js +48 -45
- package/lib/deployment/deployment-validation-service.js.map +1 -1
- package/lib/deployment/resume-deployment-service.d.ts +14 -0
- package/lib/deployment/resume-deployment-service.js +25 -0
- package/lib/deployment/resume-deployment-service.js.map +1 -0
- package/lib/deployment/start-execution-service.d.ts +44 -0
- package/lib/deployment/start-execution-service.js +94 -0
- package/lib/deployment/start-execution-service.js.map +1 -0
- package/lib/deployment/test-executor.d.ts +60 -1
- package/lib/deployment/test-executor.js +180 -12
- package/lib/deployment/test-executor.js.map +1 -1
- package/lib/deployment/test-plan-service.d.ts +8 -0
- package/lib/deployment/test-plan-service.js +26 -0
- package/lib/deployment/test-plan-service.js.map +1 -0
- package/lib/deployment/wave-manifest-service.d.ts +11 -0
- package/lib/deployment/wave-manifest-service.js +41 -0
- package/lib/deployment/wave-manifest-service.js.map +1 -0
- package/lib/parsers/apex-class-parser.js +180 -98
- package/lib/parsers/apex-class-parser.js.map +1 -1
- package/lib/parsers/apex-trigger-parser.js +56 -7
- package/lib/parsers/apex-trigger-parser.js.map +1 -1
- package/lib/parsers/aura-parser.js +2 -2
- package/lib/parsers/aura-parser.js.map +1 -1
- package/lib/parsers/bot-parser.js +31 -4
- package/lib/parsers/bot-parser.js.map +1 -1
- package/lib/parsers/custom-metadata-parser.js +37 -3
- package/lib/parsers/custom-metadata-parser.js.map +1 -1
- package/lib/parsers/custom-object-parser.js +284 -150
- package/lib/parsers/custom-object-parser.js.map +1 -1
- package/lib/parsers/email-template-parser.js +115 -58
- package/lib/parsers/email-template-parser.js.map +1 -1
- package/lib/parsers/flexipage-parser.js +41 -16
- package/lib/parsers/flexipage-parser.js.map +1 -1
- package/lib/parsers/flow-parser.js +73 -63
- package/lib/parsers/flow-parser.js.map +1 -1
- package/lib/parsers/genai-prompt-parser.js +16 -4
- package/lib/parsers/genai-prompt-parser.js.map +1 -1
- package/lib/parsers/layout-parser.d.ts +11 -0
- package/lib/parsers/layout-parser.js +143 -68
- package/lib/parsers/layout-parser.js.map +1 -1
- package/lib/parsers/lwc-parser.d.ts +0 -9
- package/lib/parsers/lwc-parser.js +245 -100
- package/lib/parsers/lwc-parser.js.map +1 -1
- package/lib/parsers/parser-utils.d.ts +3 -0
- package/lib/parsers/parser-utils.js +16 -0
- package/lib/parsers/parser-utils.js.map +1 -0
- package/lib/parsers/permission-set-parser.d.ts +6 -0
- package/lib/parsers/permission-set-parser.js +31 -40
- package/lib/parsers/permission-set-parser.js.map +1 -1
- package/lib/parsers/profile-parser.d.ts +13 -0
- package/lib/parsers/profile-parser.js +39 -34
- package/lib/parsers/profile-parser.js.map +1 -1
- package/lib/parsers/visualforce-parser.js +2 -1
- package/lib/parsers/visualforce-parser.js.map +1 -1
- package/lib/presentation/analyze-command-presenter.d.ts +10 -0
- package/lib/presentation/analyze-command-presenter.js +30 -0
- package/lib/presentation/analyze-command-presenter.js.map +1 -0
- package/lib/presentation/config-command-presenter.d.ts +15 -0
- package/lib/presentation/config-command-presenter.js +50 -0
- package/lib/presentation/config-command-presenter.js.map +1 -0
- package/lib/presentation/project-analysis-presenter.d.ts +9 -0
- package/lib/presentation/project-analysis-presenter.js +9 -0
- package/lib/presentation/project-analysis-presenter.js.map +1 -0
- package/lib/presentation/resume-command-presenter.d.ts +7 -0
- package/lib/presentation/resume-command-presenter.js +12 -0
- package/lib/presentation/resume-command-presenter.js.map +1 -0
- package/lib/presentation/start-command-presenter.d.ts +15 -0
- package/lib/presentation/start-command-presenter.js +29 -0
- package/lib/presentation/start-command-presenter.js.map +1 -0
- package/lib/presentation/status-command-presenter.d.ts +7 -0
- package/lib/presentation/status-command-presenter.js +16 -0
- package/lib/presentation/status-command-presenter.js.map +1 -0
- package/lib/presentation/validate-command-presenter.d.ts +9 -0
- package/lib/presentation/validate-command-presenter.js +50 -0
- package/lib/presentation/validate-command-presenter.js.map +1 -0
- package/lib/services/metadata-scanner-service.d.ts +8 -12
- package/lib/services/metadata-scanner-service.js +55 -533
- package/lib/services/metadata-scanner-service.js.map +1 -1
- package/lib/services/scanners/automation-ai-metadata-scanner.d.ts +4 -0
- package/lib/services/scanners/automation-ai-metadata-scanner.js +61 -0
- package/lib/services/scanners/automation-ai-metadata-scanner.js.map +1 -0
- package/lib/services/scanners/code-metadata-scanner.d.ts +23 -0
- package/lib/services/scanners/code-metadata-scanner.js +149 -0
- package/lib/services/scanners/code-metadata-scanner.js.map +1 -0
- package/lib/services/scanners/data-metadata-scanner.d.ts +3 -0
- package/lib/services/scanners/data-metadata-scanner.js +82 -0
- package/lib/services/scanners/data-metadata-scanner.js.map +1 -0
- package/lib/services/scanners/experience-metadata-scanner.d.ts +5 -0
- package/lib/services/scanners/experience-metadata-scanner.js +123 -0
- package/lib/services/scanners/experience-metadata-scanner.js.map +1 -0
- package/lib/services/scanners/scanner-runtime.d.ts +11 -0
- package/lib/services/scanners/scanner-runtime.js +115 -0
- package/lib/services/scanners/scanner-runtime.js.map +1 -0
- package/lib/services/scanners/security-metadata-scanner.d.ts +3 -0
- package/lib/services/scanners/security-metadata-scanner.js +71 -0
- package/lib/services/scanners/security-metadata-scanner.js.map +1 -0
- package/lib/types/dependency.d.ts +11 -1
- package/lib/types/metadata.d.ts +17 -0
- package/lib/types/salesforce/flow/actions.d.ts +108 -0
- package/lib/types/salesforce/flow/actions.js +2 -0
- package/lib/types/salesforce/flow/actions.js.map +1 -0
- package/lib/types/salesforce/flow/common.d.ts +36 -0
- package/lib/types/salesforce/flow/common.js +5 -0
- package/lib/types/salesforce/flow/common.js.map +1 -0
- package/lib/types/salesforce/flow/metadata.d.ts +37 -0
- package/lib/types/salesforce/flow/metadata.js +2 -0
- package/lib/types/salesforce/flow/metadata.js.map +1 -0
- package/lib/types/salesforce/flow/records.d.ts +38 -0
- package/lib/types/salesforce/flow/records.js +2 -0
- package/lib/types/salesforce/flow/records.js.map +1 -0
- package/lib/types/salesforce/flow/resources.d.ts +44 -0
- package/lib/types/salesforce/flow/resources.js +2 -0
- package/lib/types/salesforce/flow/resources.js.map +1 -0
- package/lib/types/salesforce/flow/screens.d.ts +56 -0
- package/lib/types/salesforce/flow/screens.js +2 -0
- package/lib/types/salesforce/flow/screens.js.map +1 -0
- package/lib/types/salesforce/flow/start.d.ts +24 -0
- package/lib/types/salesforce/flow/start.js +2 -0
- package/lib/types/salesforce/flow/start.js.map +1 -0
- package/lib/types/salesforce/flow.d.ts +9 -514
- package/lib/types/salesforce/flow.js +1 -1
- package/lib/types/salesforce/object/core.d.ts +68 -0
- package/lib/types/salesforce/object/core.js +5 -0
- package/lib/types/salesforce/object/core.js.map +1 -0
- package/lib/types/salesforce/object/field.d.ts +155 -0
- package/lib/types/salesforce/object/field.js +5 -0
- package/lib/types/salesforce/object/field.js.map +1 -0
- package/lib/types/salesforce/object/filter.d.ts +16 -0
- package/lib/types/salesforce/object/filter.js +5 -0
- package/lib/types/salesforce/object/filter.js.map +1 -0
- package/lib/types/salesforce/object/policy.d.ts +27 -0
- package/lib/types/salesforce/object/policy.js +5 -0
- package/lib/types/salesforce/object/policy.js.map +1 -0
- package/lib/types/salesforce/object/record.d.ts +44 -0
- package/lib/types/salesforce/object/record.js +5 -0
- package/lib/types/salesforce/object/record.js.map +1 -0
- package/lib/types/salesforce/object/view.d.ts +71 -0
- package/lib/types/salesforce/object/view.js +5 -0
- package/lib/types/salesforce/object/view.js.map +1 -0
- package/lib/types/salesforce/object/weblink.d.ts +70 -0
- package/lib/types/salesforce/object/weblink.js +5 -0
- package/lib/types/salesforce/object/weblink.js.map +1 -0
- package/lib/types/salesforce/object.d.ts +7 -423
- package/lib/types/salesforce/object.js +7 -1
- package/lib/types/salesforce/object.js.map +1 -1
- package/lib/utils/cache-manager.d.ts +16 -15
- package/lib/utils/cache-manager.js +290 -188
- package/lib/utils/cache-manager.js.map +1 -1
- package/lib/utils/logger.d.ts +8 -0
- package/lib/utils/logger.js +82 -69
- package/lib/utils/logger.js.map +1 -1
- package/lib/validators/xml/xml-reference-rules.d.ts +3 -0
- package/lib/validators/xml/xml-reference-rules.js +173 -0
- package/lib/validators/xml/xml-reference-rules.js.map +1 -0
- package/lib/validators/xml/xml-report-formatter.d.ts +2 -0
- package/lib/validators/xml/xml-report-formatter.js +47 -0
- package/lib/validators/xml/xml-report-formatter.js.map +1 -0
- package/lib/validators/xml/xml-schema-rules.d.ts +3 -0
- package/lib/validators/xml/xml-schema-rules.js +75 -0
- package/lib/validators/xml/xml-schema-rules.js.map +1 -0
- package/lib/validators/xml/xml-validation-types.d.ts +25 -0
- package/lib/validators/xml/xml-validation-types.js +2 -0
- package/lib/validators/xml/xml-validation-types.js.map +1 -0
- package/lib/validators/xml-metadata-validator.d.ts +2 -63
- package/lib/validators/xml-metadata-validator.js +7 -338
- package/lib/validators/xml-metadata-validator.js.map +1 -1
- package/lib/waves/test-optimizer.d.ts +13 -0
- package/lib/waves/test-optimizer.js +124 -63
- package/lib/waves/test-optimizer.js.map +1 -1
- package/lib/waves/wave-builder.d.ts +17 -21
- package/lib/waves/wave-builder.js +199 -135
- package/lib/waves/wave-builder.js.map +1 -1
- package/lib/waves/wave-splitter.d.ts +12 -8
- package/lib/waves/wave-splitter.js +156 -115
- package/lib/waves/wave-splitter.js.map +1 -1
- package/npm-shrinkwrap.json +959 -422
- package/oclif.lock +294 -57
- package/oclif.manifest.json +1 -1
- package/package.json +21 -9
|
@@ -88,6 +88,7 @@ export declare class DependencyResolver {
|
|
|
88
88
|
private graph;
|
|
89
89
|
private components;
|
|
90
90
|
private options;
|
|
91
|
+
private cachedResult?;
|
|
91
92
|
constructor(graph: DependencyGraph, components: Map<NodeId, MetadataComponent>, options?: ResolverOptions);
|
|
92
93
|
/**
|
|
93
94
|
* Resolve all dependencies and generate deployment order
|
|
@@ -98,27 +99,45 @@ export declare class DependencyResolver {
|
|
|
98
99
|
*/
|
|
99
100
|
resolve(): ResolutionResult;
|
|
100
101
|
/**
|
|
101
|
-
*
|
|
102
|
+
* Orchestrate the staged resolution pipeline.
|
|
103
|
+
*/
|
|
104
|
+
private runResolutionPipeline;
|
|
105
|
+
/**
|
|
106
|
+
* Stage 1: build a graph filtered by component/dependency classification.
|
|
102
107
|
*/
|
|
103
108
|
private buildFilteredGraph;
|
|
104
109
|
/**
|
|
105
|
-
*
|
|
106
|
-
*
|
|
107
|
-
* @ac US-033-AC-5: Support manual ordering constraints
|
|
110
|
+
* Stage 2: apply manual ordering constraints after filtering.
|
|
108
111
|
*/
|
|
109
112
|
private applyOrderingConstraints;
|
|
110
113
|
/**
|
|
111
|
-
*
|
|
114
|
+
* Stage 3: perform topological ordering on the filtered graph.
|
|
112
115
|
*/
|
|
113
116
|
private topologicalSort;
|
|
114
117
|
/**
|
|
115
|
-
*
|
|
118
|
+
* Stage 4: project the deployment order into resolved entries.
|
|
116
119
|
*/
|
|
117
|
-
private
|
|
120
|
+
private buildResolvedMap;
|
|
118
121
|
/**
|
|
119
|
-
*
|
|
122
|
+
* Create the mutable state used by Kahn's topological traversal.
|
|
120
123
|
*/
|
|
121
|
-
private
|
|
124
|
+
private createTopologicalTraversalState;
|
|
125
|
+
/**
|
|
126
|
+
* Drain the topological queue and update in-degree state.
|
|
127
|
+
*/
|
|
128
|
+
private processTopologicalQueue;
|
|
129
|
+
/**
|
|
130
|
+
* Lower in-degree counts after resolving one node and enqueue newly unblocked nodes.
|
|
131
|
+
*/
|
|
132
|
+
private releaseResolvedDependencies;
|
|
133
|
+
/**
|
|
134
|
+
* Collect nodes that remain blocked after traversal.
|
|
135
|
+
*/
|
|
136
|
+
private collectUnresolvedNodes;
|
|
137
|
+
/**
|
|
138
|
+
* Find missing dependencies for a node
|
|
139
|
+
*/
|
|
140
|
+
private findMissingDependencies;
|
|
122
141
|
/**
|
|
123
142
|
* @ac US-033-AC-3: Handle optional dependencies
|
|
124
143
|
* Note: Current MetadataComponent doesn't track dependency types
|
|
@@ -142,6 +161,12 @@ export declare class DependencyResolver {
|
|
|
142
161
|
* @ac US-033-AC-6: Generate dependency report
|
|
143
162
|
*/
|
|
144
163
|
private generateReport;
|
|
164
|
+
private calculateDeploymentLevels;
|
|
165
|
+
private shouldIncludeNode;
|
|
166
|
+
private collectIncludedDependencies;
|
|
167
|
+
private classifyDependency;
|
|
168
|
+
private calculateInDegree;
|
|
169
|
+
private collectZeroDegreeNodes;
|
|
145
170
|
/**
|
|
146
171
|
* Get resolution status for a specific component
|
|
147
172
|
*/
|
|
@@ -12,6 +12,7 @@
|
|
|
12
12
|
* @issue #33
|
|
13
13
|
*/
|
|
14
14
|
import { getLogger } from '../utils/logger.js';
|
|
15
|
+
import { getComponentDependencyKind, isSoftDependencyKind, shouldIncludeDependencyInResolution, } from './dependency-semantics.js';
|
|
15
16
|
const logger = getLogger('DependencyResolver');
|
|
16
17
|
/**
|
|
17
18
|
* Dependency Resolver
|
|
@@ -31,6 +32,7 @@ export class DependencyResolver {
|
|
|
31
32
|
graph;
|
|
32
33
|
components;
|
|
33
34
|
options;
|
|
35
|
+
cachedResult;
|
|
34
36
|
constructor(graph, components, options = {}) {
|
|
35
37
|
this.graph = graph;
|
|
36
38
|
this.components = components;
|
|
@@ -55,71 +57,65 @@ export class DependencyResolver {
|
|
|
55
57
|
* @ac US-033-AC-6: Generate dependency report
|
|
56
58
|
*/
|
|
57
59
|
resolve() {
|
|
60
|
+
if (this.cachedResult !== undefined) {
|
|
61
|
+
return this.cachedResult;
|
|
62
|
+
}
|
|
58
63
|
const startTime = Date.now();
|
|
59
|
-
|
|
60
|
-
const
|
|
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);
|
|
64
|
+
const pipelineState = this.runResolutionPipeline();
|
|
65
|
+
const report = this.generateReport(pipelineState.resolved, pipelineState.unresolved, pipelineState.optional, pipelineState.managed);
|
|
70
66
|
const duration = Date.now() - startTime;
|
|
71
67
|
logger.info('Dependency resolution completed', {
|
|
72
68
|
totalComponents: this.components.size,
|
|
73
|
-
resolved: resolved.size,
|
|
74
|
-
unresolved: unresolved.length,
|
|
69
|
+
resolved: pipelineState.resolved.size,
|
|
70
|
+
unresolved: pipelineState.unresolved.length,
|
|
75
71
|
deploymentLevels: report.deploymentLevels,
|
|
76
72
|
durationMs: duration,
|
|
77
73
|
});
|
|
74
|
+
this.cachedResult = {
|
|
75
|
+
resolved: pipelineState.resolved,
|
|
76
|
+
deploymentOrder: pipelineState.deploymentOrder,
|
|
77
|
+
unresolved: pipelineState.unresolved,
|
|
78
|
+
optional: pipelineState.optional,
|
|
79
|
+
managed: pipelineState.managed,
|
|
80
|
+
circular: this.options.circularDependencies,
|
|
81
|
+
report,
|
|
82
|
+
};
|
|
83
|
+
return this.cachedResult;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Orchestrate the staged resolution pipeline.
|
|
87
|
+
*/
|
|
88
|
+
runResolutionPipeline() {
|
|
89
|
+
const filteredGraph = this.buildFilteredGraph();
|
|
90
|
+
const { deploymentOrder, unresolved } = this.topologicalSort(filteredGraph);
|
|
91
|
+
const resolved = this.buildResolvedMap(deploymentOrder, filteredGraph);
|
|
92
|
+
const optional = this.findOptionalDependencies();
|
|
93
|
+
const managed = this.findManagedPackages();
|
|
78
94
|
return {
|
|
79
|
-
|
|
95
|
+
filteredGraph,
|
|
80
96
|
deploymentOrder,
|
|
81
97
|
unresolved,
|
|
98
|
+
resolved,
|
|
82
99
|
optional,
|
|
83
100
|
managed,
|
|
84
|
-
circular: this.options.circularDependencies,
|
|
85
|
-
report,
|
|
86
101
|
};
|
|
87
102
|
}
|
|
88
103
|
/**
|
|
89
|
-
*
|
|
104
|
+
* Stage 1: build a graph filtered by component/dependency classification.
|
|
90
105
|
*/
|
|
91
106
|
buildFilteredGraph() {
|
|
92
107
|
const filtered = new Map();
|
|
93
108
|
for (const [nodeId, deps] of this.graph.entries()) {
|
|
94
|
-
|
|
95
|
-
if (this.options.skipManaged && this.isManagedPackage(nodeId)) {
|
|
109
|
+
if (!this.shouldIncludeNode(nodeId)) {
|
|
96
110
|
continue;
|
|
97
111
|
}
|
|
98
|
-
|
|
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);
|
|
112
|
+
filtered.set(nodeId, this.collectIncludedDependencies(nodeId, deps));
|
|
114
113
|
}
|
|
115
|
-
// Apply ordering constraints
|
|
116
114
|
this.applyOrderingConstraints(filtered);
|
|
117
115
|
return filtered;
|
|
118
116
|
}
|
|
119
117
|
/**
|
|
120
|
-
*
|
|
121
|
-
*
|
|
122
|
-
* @ac US-033-AC-5: Support manual ordering constraints
|
|
118
|
+
* Stage 2: apply manual ordering constraints after filtering.
|
|
123
119
|
*/
|
|
124
120
|
applyOrderingConstraints(graph) {
|
|
125
121
|
for (const { before, after } of this.options.orderingConstraints) {
|
|
@@ -131,57 +127,85 @@ export class DependencyResolver {
|
|
|
131
127
|
}
|
|
132
128
|
}
|
|
133
129
|
/**
|
|
134
|
-
*
|
|
130
|
+
* Stage 3: perform topological ordering on the filtered graph.
|
|
135
131
|
*/
|
|
136
132
|
topologicalSort(graph) {
|
|
137
|
-
const
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
133
|
+
const traversalState = this.createTopologicalTraversalState(graph);
|
|
134
|
+
this.processTopologicalQueue(graph, traversalState);
|
|
135
|
+
return {
|
|
136
|
+
deploymentOrder: traversalState.deploymentOrder,
|
|
137
|
+
unresolved: this.collectUnresolvedNodes(graph, traversalState.inDegree),
|
|
138
|
+
};
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Stage 4: project the deployment order into resolved entries.
|
|
142
|
+
*/
|
|
143
|
+
buildResolvedMap(deploymentOrder, graph) {
|
|
144
|
+
const resolved = new Map();
|
|
145
|
+
for (let i = 0; i < deploymentOrder.length; i++) {
|
|
146
|
+
const nodeId = deploymentOrder[i];
|
|
147
|
+
const deps = Array.from(graph.get(nodeId) ?? []);
|
|
148
|
+
resolved.set(nodeId, {
|
|
149
|
+
nodeId,
|
|
150
|
+
dependencies: deps,
|
|
151
|
+
status: 'resolved',
|
|
152
|
+
order: i,
|
|
153
|
+
});
|
|
143
154
|
}
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
155
|
+
return resolved;
|
|
156
|
+
}
|
|
157
|
+
/**
|
|
158
|
+
* Create the mutable state used by Kahn's topological traversal.
|
|
159
|
+
*/
|
|
160
|
+
createTopologicalTraversalState(graph) {
|
|
161
|
+
const inDegree = this.calculateInDegree(graph);
|
|
162
|
+
return {
|
|
163
|
+
deploymentOrder: [],
|
|
164
|
+
inDegree,
|
|
165
|
+
queue: this.collectZeroDegreeNodes(inDegree),
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
/**
|
|
169
|
+
* Drain the topological queue and update in-degree state.
|
|
170
|
+
*/
|
|
171
|
+
processTopologicalQueue(graph, state) {
|
|
172
|
+
while (state.queue.length > 0) {
|
|
173
|
+
const nodeId = state.queue.shift();
|
|
174
|
+
state.deploymentOrder.push(nodeId);
|
|
175
|
+
this.releaseResolvedDependencies(nodeId, graph, state);
|
|
152
176
|
}
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
177
|
+
}
|
|
178
|
+
/**
|
|
179
|
+
* Lower in-degree counts after resolving one node and enqueue newly unblocked nodes.
|
|
180
|
+
*/
|
|
181
|
+
releaseResolvedDependencies(nodeId, graph, state) {
|
|
182
|
+
const deps = graph.get(nodeId) ?? new Set();
|
|
183
|
+
for (const dep of deps) {
|
|
184
|
+
if (!state.inDegree.has(dep)) {
|
|
185
|
+
continue;
|
|
158
186
|
}
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
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
|
-
}
|
|
187
|
+
const newDegree = (state.inDegree.get(dep) ?? 0) - 1;
|
|
188
|
+
state.inDegree.set(dep, newDegree);
|
|
189
|
+
if (newDegree === 0) {
|
|
190
|
+
state.queue.push(dep);
|
|
174
191
|
}
|
|
175
192
|
}
|
|
176
|
-
|
|
193
|
+
}
|
|
194
|
+
/**
|
|
195
|
+
* Collect nodes that remain blocked after traversal.
|
|
196
|
+
*/
|
|
197
|
+
collectUnresolvedNodes(graph, inDegree) {
|
|
198
|
+
const unresolved = [];
|
|
177
199
|
for (const [nodeId, degree] of inDegree.entries()) {
|
|
178
|
-
if (degree
|
|
179
|
-
|
|
180
|
-
const missingDeps = this.findMissingDependencies(nodeId, graph);
|
|
181
|
-
unresolved.push({ nodeId, missingDependencies: missingDeps });
|
|
200
|
+
if (degree <= 0) {
|
|
201
|
+
continue;
|
|
182
202
|
}
|
|
203
|
+
unresolved.push({
|
|
204
|
+
nodeId,
|
|
205
|
+
missingDependencies: this.findMissingDependencies(nodeId, graph),
|
|
206
|
+
});
|
|
183
207
|
}
|
|
184
|
-
return
|
|
208
|
+
return unresolved;
|
|
185
209
|
}
|
|
186
210
|
/**
|
|
187
211
|
* Find missing dependencies for a node
|
|
@@ -196,30 +220,29 @@ export class DependencyResolver {
|
|
|
196
220
|
}
|
|
197
221
|
return missing;
|
|
198
222
|
}
|
|
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
223
|
/**
|
|
217
224
|
* @ac US-033-AC-3: Handle optional dependencies
|
|
218
225
|
* Note: Current MetadataComponent doesn't track dependency types
|
|
219
226
|
*/
|
|
220
227
|
findOptionalDependencies() {
|
|
221
|
-
|
|
222
|
-
|
|
228
|
+
if (this.options.includeOptional) {
|
|
229
|
+
return [];
|
|
230
|
+
}
|
|
231
|
+
const optional = [];
|
|
232
|
+
for (const [nodeId, deps] of this.graph.entries()) {
|
|
233
|
+
for (const dep of deps) {
|
|
234
|
+
if (!this.isOptionalDependency(nodeId, dep)) {
|
|
235
|
+
continue;
|
|
236
|
+
}
|
|
237
|
+
if (this.options.skipManaged && this.isManagedPackage(dep)) {
|
|
238
|
+
continue;
|
|
239
|
+
}
|
|
240
|
+
if (!optional.includes(dep)) {
|
|
241
|
+
optional.push(dep);
|
|
242
|
+
}
|
|
243
|
+
}
|
|
244
|
+
}
|
|
245
|
+
return optional;
|
|
223
246
|
}
|
|
224
247
|
/**
|
|
225
248
|
* @ac US-033-AC-4: Skip managed package dependencies
|
|
@@ -245,19 +268,14 @@ export class DependencyResolver {
|
|
|
245
268
|
* Note: Current MetadataComponent uses Set<string> for dependencies
|
|
246
269
|
* For now, we'll return false as type info is not available
|
|
247
270
|
*/
|
|
248
|
-
isOptionalDependency() {
|
|
249
|
-
|
|
250
|
-
return
|
|
271
|
+
isOptionalDependency(nodeId, dependencyId) {
|
|
272
|
+
const component = this.components.get(nodeId);
|
|
273
|
+
return isSoftDependencyKind(getComponentDependencyKind(component, dependencyId));
|
|
251
274
|
}
|
|
252
275
|
/**
|
|
253
276
|
* @ac US-033-AC-6: Generate dependency report
|
|
254
277
|
*/
|
|
255
278
|
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
279
|
return {
|
|
262
280
|
totalComponents: this.components.size,
|
|
263
281
|
resolvedCount: resolved.size,
|
|
@@ -265,22 +283,73 @@ export class DependencyResolver {
|
|
|
265
283
|
optionalCount: optional.length,
|
|
266
284
|
managedCount: managed.length,
|
|
267
285
|
circularCount: this.options.circularDependencies.length,
|
|
268
|
-
deploymentLevels:
|
|
286
|
+
deploymentLevels: this.calculateDeploymentLevels(resolved),
|
|
269
287
|
};
|
|
270
288
|
}
|
|
289
|
+
calculateDeploymentLevels(resolved) {
|
|
290
|
+
let maxOrder = 0;
|
|
291
|
+
for (const dep of resolved.values()) {
|
|
292
|
+
maxOrder = Math.max(maxOrder, dep.order);
|
|
293
|
+
}
|
|
294
|
+
return maxOrder + 1;
|
|
295
|
+
}
|
|
296
|
+
shouldIncludeNode(nodeId) {
|
|
297
|
+
return !(this.options.skipManaged && this.isManagedPackage(nodeId));
|
|
298
|
+
}
|
|
299
|
+
collectIncludedDependencies(nodeId, dependencies) {
|
|
300
|
+
const filteredDependencies = new Set();
|
|
301
|
+
for (const dependencyId of dependencies) {
|
|
302
|
+
const decision = this.classifyDependency(nodeId, dependencyId);
|
|
303
|
+
if (decision === 'include') {
|
|
304
|
+
filteredDependencies.add(dependencyId);
|
|
305
|
+
}
|
|
306
|
+
}
|
|
307
|
+
return filteredDependencies;
|
|
308
|
+
}
|
|
309
|
+
classifyDependency(nodeId, dependencyId) {
|
|
310
|
+
if (this.options.skipManaged && this.isManagedPackage(dependencyId)) {
|
|
311
|
+
return 'exclude-managed';
|
|
312
|
+
}
|
|
313
|
+
if (!shouldIncludeDependencyInResolution(getComponentDependencyKind(this.components.get(nodeId), dependencyId), this.options.includeOptional)) {
|
|
314
|
+
return 'exclude-optional';
|
|
315
|
+
}
|
|
316
|
+
return 'include';
|
|
317
|
+
}
|
|
318
|
+
calculateInDegree(graph) {
|
|
319
|
+
const inDegree = new Map();
|
|
320
|
+
for (const nodeId of graph.keys()) {
|
|
321
|
+
inDegree.set(nodeId, 0);
|
|
322
|
+
}
|
|
323
|
+
for (const dependencies of graph.values()) {
|
|
324
|
+
for (const dependencyId of dependencies) {
|
|
325
|
+
if (!inDegree.has(dependencyId)) {
|
|
326
|
+
continue;
|
|
327
|
+
}
|
|
328
|
+
inDegree.set(dependencyId, (inDegree.get(dependencyId) ?? 0) + 1);
|
|
329
|
+
}
|
|
330
|
+
}
|
|
331
|
+
return inDegree;
|
|
332
|
+
}
|
|
333
|
+
collectZeroDegreeNodes(inDegree) {
|
|
334
|
+
const queue = [];
|
|
335
|
+
for (const [nodeId, degree] of inDegree.entries()) {
|
|
336
|
+
if (degree === 0) {
|
|
337
|
+
queue.push(nodeId);
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
return queue;
|
|
341
|
+
}
|
|
271
342
|
/**
|
|
272
343
|
* Get resolution status for a specific component
|
|
273
344
|
*/
|
|
274
345
|
getResolution(nodeId) {
|
|
275
|
-
|
|
276
|
-
return result.resolved.get(nodeId);
|
|
346
|
+
return this.resolve().resolved.get(nodeId);
|
|
277
347
|
}
|
|
278
348
|
/**
|
|
279
349
|
* Check if a component can be resolved
|
|
280
350
|
*/
|
|
281
351
|
canResolve(nodeId) {
|
|
282
|
-
|
|
283
|
-
return result.resolved.has(nodeId);
|
|
352
|
+
return this.resolve().resolved.has(nodeId);
|
|
284
353
|
}
|
|
285
354
|
/**
|
|
286
355
|
* Get deployment order for specific components
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dependency-resolver.js","sourceRoot":"","sources":["../../src/dependencies/dependency-resolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"dependency-resolver.js","sourceRoot":"","sources":["../../src/dependencies/dependency-resolver.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { NodeId } from '../types/dependency.js';
|
|
2
|
+
import type { MetadataComponent, MetadataDependencyKind, MetadataDependencyReference } from '../types/metadata.js';
|
|
3
|
+
export declare const DEFAULT_GRAPH_DEPENDENCY_KIND: MetadataDependencyKind;
|
|
4
|
+
export type NormalizedDependencyReference = {
|
|
5
|
+
nodeId: NodeId;
|
|
6
|
+
kind: MetadataDependencyKind;
|
|
7
|
+
source?: MetadataDependencyReference['source'];
|
|
8
|
+
reason?: string;
|
|
9
|
+
confidence?: number;
|
|
10
|
+
};
|
|
11
|
+
export declare function getDependencySourceForKind(kind: MetadataDependencyKind): MetadataDependencyReference['source'];
|
|
12
|
+
export declare function isSoftDependencyKind(kind: MetadataDependencyKind): boolean;
|
|
13
|
+
export declare function isInferredDependencyKind(kind: MetadataDependencyKind): boolean;
|
|
14
|
+
export declare function shouldIncludeDependencyInResolution(kind: MetadataDependencyKind, includeOptional: boolean): boolean;
|
|
15
|
+
export declare function shouldTraverseDependencyKind(kind: MetadataDependencyKind, options?: {
|
|
16
|
+
includeSoft?: boolean;
|
|
17
|
+
includeInferred?: boolean;
|
|
18
|
+
}): boolean;
|
|
19
|
+
export declare function getComponentDependencyKind(component: MetadataComponent | undefined, dependencyId: NodeId, defaultKind?: MetadataDependencyKind): MetadataDependencyKind;
|
|
20
|
+
export declare function expandComponentDependencyReferences(component: MetadataComponent, defaultKind?: MetadataDependencyKind): NormalizedDependencyReference[];
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
export const DEFAULT_GRAPH_DEPENDENCY_KIND = 'hard';
|
|
2
|
+
export function getDependencySourceForKind(kind) {
|
|
3
|
+
return kind === 'inferred' ? 'ai' : 'parser';
|
|
4
|
+
}
|
|
5
|
+
export function isSoftDependencyKind(kind) {
|
|
6
|
+
return kind === 'soft';
|
|
7
|
+
}
|
|
8
|
+
export function isInferredDependencyKind(kind) {
|
|
9
|
+
return kind === 'inferred';
|
|
10
|
+
}
|
|
11
|
+
export function shouldIncludeDependencyInResolution(kind, includeOptional) {
|
|
12
|
+
return includeOptional || !isSoftDependencyKind(kind);
|
|
13
|
+
}
|
|
14
|
+
export function shouldTraverseDependencyKind(kind, options = {}) {
|
|
15
|
+
const includeSoft = options.includeSoft ?? true;
|
|
16
|
+
const includeInferred = options.includeInferred ?? true;
|
|
17
|
+
if (isSoftDependencyKind(kind) && !includeSoft) {
|
|
18
|
+
return false;
|
|
19
|
+
}
|
|
20
|
+
if (isInferredDependencyKind(kind) && !includeInferred) {
|
|
21
|
+
return false;
|
|
22
|
+
}
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
export function getComponentDependencyKind(component, dependencyId, defaultKind = DEFAULT_GRAPH_DEPENDENCY_KIND) {
|
|
26
|
+
const explicitDetail = component?.dependencyDetails?.find((dependency) => dependency.nodeId === dependencyId);
|
|
27
|
+
if (explicitDetail) {
|
|
28
|
+
return explicitDetail.kind;
|
|
29
|
+
}
|
|
30
|
+
if (component?.optionalDependencies?.has(dependencyId)) {
|
|
31
|
+
return 'soft';
|
|
32
|
+
}
|
|
33
|
+
return defaultKind;
|
|
34
|
+
}
|
|
35
|
+
export function expandComponentDependencyReferences(component, defaultKind = DEFAULT_GRAPH_DEPENDENCY_KIND) {
|
|
36
|
+
if (component.dependencyDetails && component.dependencyDetails.length > 0) {
|
|
37
|
+
return component.dependencyDetails.map((dependency) => ({
|
|
38
|
+
nodeId: dependency.nodeId,
|
|
39
|
+
kind: dependency.kind,
|
|
40
|
+
source: dependency.source,
|
|
41
|
+
reason: dependency.reason,
|
|
42
|
+
confidence: dependency.confidence,
|
|
43
|
+
}));
|
|
44
|
+
}
|
|
45
|
+
return [...component.dependencies].map((dependencyId) => {
|
|
46
|
+
const kind = getComponentDependencyKind(component, dependencyId, defaultKind);
|
|
47
|
+
return {
|
|
48
|
+
nodeId: dependencyId,
|
|
49
|
+
kind,
|
|
50
|
+
source: getDependencySourceForKind(kind),
|
|
51
|
+
reason: isSoftDependencyKind(kind) ? 'Declared optional dependency' : 'Declared dependency',
|
|
52
|
+
};
|
|
53
|
+
});
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=dependency-semantics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"dependency-semantics.js","sourceRoot":"","sources":["../../src/dependencies/dependency-semantics.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,MAAM,6BAA6B,GAA2B,MAAM,CAAC;AAU5E,MAAM,UAAU,0BAA0B,CAAC,IAA4B;IACrE,OAAO,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,QAAQ,CAAC;AAC/C,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,IAA4B;IAC/D,OAAO,IAAI,KAAK,MAAM,CAAC;AACzB,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,IAA4B;IACnE,OAAO,IAAI,KAAK,UAAU,CAAC;AAC7B,CAAC;AAED,MAAM,UAAU,mCAAmC,CAAC,IAA4B,EAAE,eAAwB;IACxG,OAAO,eAAe,IAAI,CAAC,oBAAoB,CAAC,IAAI,CAAC,CAAC;AACxD,CAAC;AAED,MAAM,UAAU,4BAA4B,CAC1C,IAA4B,EAC5B,UAAgE,EAAE;IAElE,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,IAAI,IAAI,CAAC;IAChD,MAAM,eAAe,GAAG,OAAO,CAAC,eAAe,IAAI,IAAI,CAAC;IAExD,IAAI,oBAAoB,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;QAC/C,OAAO,KAAK,CAAC;IACf,CAAC;IAED,IAAI,wBAAwB,CAAC,IAAI,CAAC,IAAI,CAAC,eAAe,EAAE,CAAC;QACvD,OAAO,KAAK,CAAC;IACf,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;AAED,MAAM,UAAU,0BAA0B,CACxC,SAAwC,EACxC,YAAoB,EACpB,cAAsC,6BAA6B;IAEnE,MAAM,cAAc,GAAG,SAAS,EAAE,iBAAiB,EAAE,IAAI,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,UAAU,CAAC,MAAM,KAAK,YAAY,CAAC,CAAC;IAC9G,IAAI,cAAc,EAAE,CAAC;QACnB,OAAO,cAAc,CAAC,IAAI,CAAC;IAC7B,CAAC;IAED,IAAI,SAAS,EAAE,oBAAoB,EAAE,GAAG,CAAC,YAAY,CAAC,EAAE,CAAC;QACvD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,OAAO,WAAW,CAAC;AACrB,CAAC;AAED,MAAM,UAAU,mCAAmC,CACjD,SAA4B,EAC5B,cAAsC,6BAA6B;IAEnE,IAAI,SAAS,CAAC,iBAAiB,IAAI,SAAS,CAAC,iBAAiB,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC1E,OAAO,SAAS,CAAC,iBAAiB,CAAC,GAAG,CAAC,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;YACtD,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,IAAI,EAAE,UAAU,CAAC,IAAI;YACrB,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,MAAM,EAAE,UAAU,CAAC,MAAM;YACzB,UAAU,EAAE,UAAU,CAAC,UAAU;SAClC,CAAC,CAAC,CAAC;IACN,CAAC;IAED,OAAO,CAAC,GAAG,SAAS,CAAC,YAAY,CAAC,CAAC,GAAG,CAAC,CAAC,YAAY,EAAE,EAAE;QACtD,MAAM,IAAI,GAAG,0BAA0B,CAAC,SAAS,EAAE,YAAY,EAAE,WAAW,CAAC,CAAC;QAE9E,OAAO;YACL,MAAM,EAAE,YAAY;YACpB,IAAI;YACJ,MAAM,EAAE,0BAA0B,CAAC,IAAI,CAAC;YACxC,MAAM,EAAE,oBAAoB,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,8BAA8B,CAAC,CAAC,CAAC,qBAAqB;SAC5F,CAAC;IACJ,CAAC,CAAC,CAAC;AACL,CAAC"}
|
|
@@ -11,7 +11,7 @@
|
|
|
11
11
|
*
|
|
12
12
|
* @issue #35
|
|
13
13
|
*/
|
|
14
|
-
import type { NodeId, DependencyGraph } from '../types/dependency.js';
|
|
14
|
+
import type { DependencyEdge, NodeId, DependencyGraph } from '../types/dependency.js';
|
|
15
15
|
import type { MetadataType } from '../types/metadata.js';
|
|
16
16
|
/**
|
|
17
17
|
* Visualization format
|
|
@@ -33,6 +33,8 @@ export type VisualizationOptions = {
|
|
|
33
33
|
showLabels?: boolean;
|
|
34
34
|
/** Color scheme */
|
|
35
35
|
colorScheme?: 'default' | 'type' | 'depth';
|
|
36
|
+
/** Edge metadata for styling/labels */
|
|
37
|
+
edgeMetadata?: DependencyEdge[];
|
|
36
38
|
};
|
|
37
39
|
/**
|
|
38
40
|
* Graph Visualizer
|
|
@@ -52,6 +54,7 @@ export type VisualizationOptions = {
|
|
|
52
54
|
*/
|
|
53
55
|
export declare class GraphVisualizer {
|
|
54
56
|
private graph;
|
|
57
|
+
private edgeMetadata;
|
|
55
58
|
private options;
|
|
56
59
|
constructor(graph: DependencyGraph, options?: VisualizationOptions);
|
|
57
60
|
/**
|
|
@@ -76,6 +79,8 @@ export declare class GraphVisualizer {
|
|
|
76
79
|
* Check if node matches any of the given types
|
|
77
80
|
*/
|
|
78
81
|
private matchesType;
|
|
82
|
+
private getMermaidEdgeStyle;
|
|
83
|
+
private getDotEdgeAttributes;
|
|
79
84
|
/**
|
|
80
85
|
* Get Mermaid node styling
|
|
81
86
|
*/
|