driftdetect-core 0.4.0 → 0.4.2
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/dist/boundaries/boundary-scanner.d.ts +76 -0
- package/dist/boundaries/boundary-scanner.d.ts.map +1 -0
- package/dist/boundaries/boundary-scanner.js +801 -0
- package/dist/boundaries/boundary-scanner.js.map +1 -0
- package/dist/boundaries/data-access-learner.d.ts +126 -0
- package/dist/boundaries/data-access-learner.d.ts.map +1 -0
- package/dist/boundaries/data-access-learner.js +486 -0
- package/dist/boundaries/data-access-learner.js.map +1 -0
- package/dist/boundaries/index.d.ts +6 -0
- package/dist/boundaries/index.d.ts.map +1 -1
- package/dist/boundaries/index.js +6 -0
- package/dist/boundaries/index.js.map +1 -1
- package/dist/boundaries/security-prioritizer.d.ts +118 -0
- package/dist/boundaries/security-prioritizer.d.ts.map +1 -0
- package/dist/boundaries/security-prioritizer.js +316 -0
- package/dist/boundaries/security-prioritizer.js.map +1 -0
- package/dist/call-graph/analysis/coverage-analyzer.d.ts +201 -0
- package/dist/call-graph/analysis/coverage-analyzer.d.ts.map +1 -0
- package/dist/call-graph/analysis/coverage-analyzer.js +553 -0
- package/dist/call-graph/analysis/coverage-analyzer.js.map +1 -0
- package/dist/call-graph/analysis/dead-code-detector.d.ts +145 -0
- package/dist/call-graph/analysis/dead-code-detector.d.ts.map +1 -0
- package/dist/call-graph/analysis/dead-code-detector.js +391 -0
- package/dist/call-graph/analysis/dead-code-detector.js.map +1 -0
- package/dist/call-graph/analysis/graph-builder.d.ts +142 -0
- package/dist/call-graph/analysis/graph-builder.d.ts.map +1 -0
- package/dist/call-graph/analysis/graph-builder.js +624 -0
- package/dist/call-graph/analysis/graph-builder.js.map +1 -0
- package/dist/call-graph/analysis/impact-analyzer.d.ts +150 -0
- package/dist/call-graph/analysis/impact-analyzer.d.ts.map +1 -0
- package/dist/call-graph/analysis/impact-analyzer.js +329 -0
- package/dist/call-graph/analysis/impact-analyzer.js.map +1 -0
- package/dist/call-graph/analysis/index.d.ts +11 -0
- package/dist/call-graph/analysis/index.d.ts.map +1 -0
- package/dist/call-graph/analysis/index.js +9 -0
- package/dist/call-graph/analysis/index.js.map +1 -0
- package/dist/call-graph/analysis/path-finder.d.ts +117 -0
- package/dist/call-graph/analysis/path-finder.d.ts.map +1 -0
- package/dist/call-graph/analysis/path-finder.js +360 -0
- package/dist/call-graph/analysis/path-finder.js.map +1 -0
- package/dist/call-graph/analysis/reachability.d.ts +56 -0
- package/dist/call-graph/analysis/reachability.d.ts.map +1 -0
- package/dist/call-graph/analysis/reachability.js +357 -0
- package/dist/call-graph/analysis/reachability.js.map +1 -0
- package/dist/call-graph/demo.d.ts +11 -0
- package/dist/call-graph/demo.d.ts.map +1 -0
- package/dist/call-graph/demo.js +339 -0
- package/dist/call-graph/demo.js.map +1 -0
- package/dist/call-graph/enrichment/enrichment-engine.d.ts +126 -0
- package/dist/call-graph/enrichment/enrichment-engine.d.ts.map +1 -0
- package/dist/call-graph/enrichment/enrichment-engine.js +760 -0
- package/dist/call-graph/enrichment/enrichment-engine.js.map +1 -0
- package/dist/call-graph/enrichment/impact-scorer.d.ts +59 -0
- package/dist/call-graph/enrichment/impact-scorer.d.ts.map +1 -0
- package/dist/call-graph/enrichment/impact-scorer.js +328 -0
- package/dist/call-graph/enrichment/impact-scorer.js.map +1 -0
- package/dist/call-graph/enrichment/index.d.ts +12 -0
- package/dist/call-graph/enrichment/index.d.ts.map +1 -0
- package/dist/call-graph/enrichment/index.js +15 -0
- package/dist/call-graph/enrichment/index.js.map +1 -0
- package/dist/call-graph/enrichment/remediation-generator.d.ts +41 -0
- package/dist/call-graph/enrichment/remediation-generator.d.ts.map +1 -0
- package/dist/call-graph/enrichment/remediation-generator.js +609 -0
- package/dist/call-graph/enrichment/remediation-generator.js.map +1 -0
- package/dist/call-graph/enrichment/sensitivity-classifier.d.ts +71 -0
- package/dist/call-graph/enrichment/sensitivity-classifier.d.ts.map +1 -0
- package/dist/call-graph/enrichment/sensitivity-classifier.js +454 -0
- package/dist/call-graph/enrichment/sensitivity-classifier.js.map +1 -0
- package/dist/call-graph/enrichment/types.d.ts +402 -0
- package/dist/call-graph/enrichment/types.d.ts.map +1 -0
- package/dist/call-graph/enrichment/types.js +9 -0
- package/dist/call-graph/enrichment/types.js.map +1 -0
- package/dist/call-graph/extractors/base-extractor.d.ts +112 -0
- package/dist/call-graph/extractors/base-extractor.d.ts.map +1 -0
- package/dist/call-graph/extractors/base-extractor.js +140 -0
- package/dist/call-graph/extractors/base-extractor.js.map +1 -0
- package/dist/call-graph/extractors/csharp-data-access-extractor.d.ts +76 -0
- package/dist/call-graph/extractors/csharp-data-access-extractor.d.ts.map +1 -0
- package/dist/call-graph/extractors/csharp-data-access-extractor.js +387 -0
- package/dist/call-graph/extractors/csharp-data-access-extractor.js.map +1 -0
- package/dist/call-graph/extractors/csharp-extractor.d.ts +87 -0
- package/dist/call-graph/extractors/csharp-extractor.d.ts.map +1 -0
- package/dist/call-graph/extractors/csharp-extractor.js +470 -0
- package/dist/call-graph/extractors/csharp-extractor.js.map +1 -0
- package/dist/call-graph/extractors/data-access-extractor.d.ts +76 -0
- package/dist/call-graph/extractors/data-access-extractor.d.ts.map +1 -0
- package/dist/call-graph/extractors/data-access-extractor.js +234 -0
- package/dist/call-graph/extractors/data-access-extractor.js.map +1 -0
- package/dist/call-graph/extractors/index.d.ts +26 -0
- package/dist/call-graph/extractors/index.d.ts.map +1 -0
- package/dist/call-graph/extractors/index.js +36 -0
- package/dist/call-graph/extractors/index.js.map +1 -0
- package/dist/call-graph/extractors/java-data-access-extractor.d.ts +101 -0
- package/dist/call-graph/extractors/java-data-access-extractor.d.ts.map +1 -0
- package/dist/call-graph/extractors/java-data-access-extractor.js +611 -0
- package/dist/call-graph/extractors/java-data-access-extractor.js.map +1 -0
- package/dist/call-graph/extractors/java-extractor.d.ts +87 -0
- package/dist/call-graph/extractors/java-extractor.d.ts.map +1 -0
- package/dist/call-graph/extractors/java-extractor.js +510 -0
- package/dist/call-graph/extractors/java-extractor.js.map +1 -0
- package/dist/call-graph/extractors/php-data-access-extractor.d.ts +93 -0
- package/dist/call-graph/extractors/php-data-access-extractor.d.ts.map +1 -0
- package/dist/call-graph/extractors/php-data-access-extractor.js +589 -0
- package/dist/call-graph/extractors/php-data-access-extractor.js.map +1 -0
- package/dist/call-graph/extractors/php-extractor.d.ts +104 -0
- package/dist/call-graph/extractors/php-extractor.d.ts.map +1 -0
- package/dist/call-graph/extractors/php-extractor.js +619 -0
- package/dist/call-graph/extractors/php-extractor.js.map +1 -0
- package/dist/call-graph/extractors/python-data-access-extractor.d.ts +90 -0
- package/dist/call-graph/extractors/python-data-access-extractor.d.ts.map +1 -0
- package/dist/call-graph/extractors/python-data-access-extractor.js +537 -0
- package/dist/call-graph/extractors/python-data-access-extractor.js.map +1 -0
- package/dist/call-graph/extractors/python-extractor.d.ts +98 -0
- package/dist/call-graph/extractors/python-extractor.d.ts.map +1 -0
- package/dist/call-graph/extractors/python-extractor.js +681 -0
- package/dist/call-graph/extractors/python-extractor.js.map +1 -0
- package/dist/call-graph/extractors/semantic-data-access-scanner.d.ts +91 -0
- package/dist/call-graph/extractors/semantic-data-access-scanner.d.ts.map +1 -0
- package/dist/call-graph/extractors/semantic-data-access-scanner.js +498 -0
- package/dist/call-graph/extractors/semantic-data-access-scanner.js.map +1 -0
- package/dist/call-graph/extractors/typescript-data-access-extractor.d.ts +122 -0
- package/dist/call-graph/extractors/typescript-data-access-extractor.d.ts.map +1 -0
- package/dist/call-graph/extractors/typescript-data-access-extractor.js +788 -0
- package/dist/call-graph/extractors/typescript-data-access-extractor.js.map +1 -0
- package/dist/call-graph/extractors/typescript-extractor.d.ts +145 -0
- package/dist/call-graph/extractors/typescript-extractor.d.ts.map +1 -0
- package/dist/call-graph/extractors/typescript-extractor.js +904 -0
- package/dist/call-graph/extractors/typescript-extractor.js.map +1 -0
- package/dist/call-graph/index.d.ts +127 -0
- package/dist/call-graph/index.d.ts.map +1 -0
- package/dist/call-graph/index.js +247 -0
- package/dist/call-graph/index.js.map +1 -0
- package/dist/call-graph/store/call-graph-store.d.ts +70 -0
- package/dist/call-graph/store/call-graph-store.d.ts.map +1 -0
- package/dist/call-graph/store/call-graph-store.js +210 -0
- package/dist/call-graph/store/call-graph-store.js.map +1 -0
- package/dist/call-graph/store/index.d.ts +7 -0
- package/dist/call-graph/store/index.d.ts.map +1 -0
- package/dist/call-graph/store/index.js +7 -0
- package/dist/call-graph/store/index.js.map +1 -0
- package/dist/call-graph/types.d.ts +376 -0
- package/dist/call-graph/types.d.ts.map +1 -0
- package/dist/call-graph/types.js +8 -0
- package/dist/call-graph/types.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -1
- package/dist/lake/callgraph-shard-store.d.ts +168 -0
- package/dist/lake/callgraph-shard-store.d.ts.map +1 -0
- package/dist/lake/callgraph-shard-store.js +466 -0
- package/dist/lake/callgraph-shard-store.js.map +1 -0
- package/dist/lake/examples-store.d.ts +127 -0
- package/dist/lake/examples-store.d.ts.map +1 -0
- package/dist/lake/examples-store.js +389 -0
- package/dist/lake/examples-store.js.map +1 -0
- package/dist/lake/index-store.d.ts +82 -0
- package/dist/lake/index-store.d.ts.map +1 -0
- package/dist/lake/index-store.js +359 -0
- package/dist/lake/index-store.js.map +1 -0
- package/dist/lake/index.d.ts +93 -0
- package/dist/lake/index.d.ts.map +1 -0
- package/dist/lake/index.js +138 -0
- package/dist/lake/index.js.map +1 -0
- package/dist/lake/lake.bak/index-store.d.ts +82 -0
- package/dist/lake/lake.bak/index-store.d.ts.map +1 -0
- package/dist/lake/lake.bak/index-store.js +357 -0
- package/dist/lake/lake.bak/index-store.js.map +1 -0
- package/dist/lake/lake.bak/index.d.ts +81 -0
- package/dist/lake/lake.bak/index.d.ts.map +1 -0
- package/dist/lake/lake.bak/index.js +114 -0
- package/dist/lake/lake.bak/index.js.map +1 -0
- package/dist/lake/lake.bak/manifest-store.d.ts +51 -0
- package/dist/lake/lake.bak/manifest-store.d.ts.map +1 -0
- package/dist/lake/lake.bak/manifest-store.js +347 -0
- package/dist/lake/lake.bak/manifest-store.js.map +1 -0
- package/dist/lake/lake.bak/query-engine.d.ts +112 -0
- package/dist/lake/lake.bak/query-engine.d.ts.map +1 -0
- package/dist/lake/lake.bak/query-engine.js +370 -0
- package/dist/lake/lake.bak/query-engine.js.map +1 -0
- package/dist/lake/lake.bak/types.d.ts +428 -0
- package/dist/lake/lake.bak/types.d.ts.map +1 -0
- package/dist/lake/lake.bak/types.js +46 -0
- package/dist/lake/lake.bak/types.js.map +1 -0
- package/dist/lake/lake.bak/view-materializer.d.ts +70 -0
- package/dist/lake/lake.bak/view-materializer.d.ts.map +1 -0
- package/dist/lake/lake.bak/view-materializer.js +314 -0
- package/dist/lake/lake.bak/view-materializer.js.map +1 -0
- package/dist/lake/lake.bak/view-store.d.ts +57 -0
- package/dist/lake/lake.bak/view-store.d.ts.map +1 -0
- package/dist/lake/lake.bak/view-store.js +348 -0
- package/dist/lake/lake.bak/view-store.js.map +1 -0
- package/dist/lake/manifest-store.d.ts +51 -0
- package/dist/lake/manifest-store.d.ts.map +1 -0
- package/dist/lake/manifest-store.js +348 -0
- package/dist/lake/manifest-store.js.map +1 -0
- package/dist/lake/pattern-shard-store.d.ts +87 -0
- package/dist/lake/pattern-shard-store.d.ts.map +1 -0
- package/dist/lake/pattern-shard-store.js +347 -0
- package/dist/lake/pattern-shard-store.js.map +1 -0
- package/dist/lake/query-engine.d.ts +124 -0
- package/dist/lake/query-engine.d.ts.map +1 -0
- package/dist/lake/query-engine.js +453 -0
- package/dist/lake/query-engine.js.map +1 -0
- package/dist/lake/security-shard-store.d.ts +156 -0
- package/dist/lake/security-shard-store.d.ts.map +1 -0
- package/dist/lake/security-shard-store.js +498 -0
- package/dist/lake/security-shard-store.js.map +1 -0
- package/dist/lake/types.d.ts +428 -0
- package/dist/lake/types.d.ts.map +1 -0
- package/dist/lake/types.js +46 -0
- package/dist/lake/types.js.map +1 -0
- package/dist/lake/view-materializer.d.ts +70 -0
- package/dist/lake/view-materializer.d.ts.map +1 -0
- package/dist/lake/view-materializer.js +314 -0
- package/dist/lake/view-materializer.js.map +1 -0
- package/dist/lake/view-store.d.ts +57 -0
- package/dist/lake/view-store.d.ts.map +1 -0
- package/dist/lake/view-store.js +348 -0
- package/dist/lake/view-store.js.map +1 -0
- package/dist/parsers/tree-sitter/index.d.ts +1 -0
- package/dist/parsers/tree-sitter/index.d.ts.map +1 -1
- package/dist/parsers/tree-sitter/index.js +4 -0
- package/dist/parsers/tree-sitter/index.js.map +1 -1
- package/dist/parsers/tree-sitter/typescript-loader.d.ts +58 -0
- package/dist/parsers/tree-sitter/typescript-loader.d.ts.map +1 -0
- package/dist/parsers/tree-sitter/typescript-loader.js +250 -0
- package/dist/parsers/tree-sitter/typescript-loader.js.map +1 -0
- package/dist/store/project-config.d.ts +154 -0
- package/dist/store/project-config.d.ts.map +1 -0
- package/dist/store/project-config.js +235 -0
- package/dist/store/project-config.js.map +1 -0
- package/dist/store/project-registry.d.ts +241 -0
- package/dist/store/project-registry.d.ts.map +1 -0
- package/dist/store/project-registry.js +557 -0
- package/dist/store/project-registry.js.map +1 -0
- package/package.json +7 -7
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Impact Analyzer
|
|
3
|
+
*
|
|
4
|
+
* Answers: "If I change this code, what else is affected?"
|
|
5
|
+
*
|
|
6
|
+
* Uses reverse call graph traversal to find:
|
|
7
|
+
* - Direct callers (immediate impact)
|
|
8
|
+
* - Transitive callers (ripple effect)
|
|
9
|
+
* - Affected entry points (user-facing impact)
|
|
10
|
+
* - Sensitive data paths affected (security impact)
|
|
11
|
+
*/
|
|
12
|
+
import type { CallGraph, CallPathNode } from '../types.js';
|
|
13
|
+
/**
|
|
14
|
+
* Risk level for impact assessment
|
|
15
|
+
*/
|
|
16
|
+
export type ImpactRisk = 'critical' | 'high' | 'medium' | 'low';
|
|
17
|
+
/**
|
|
18
|
+
* A single affected function with context
|
|
19
|
+
*/
|
|
20
|
+
export interface AffectedFunction {
|
|
21
|
+
/** Function ID */
|
|
22
|
+
id: string;
|
|
23
|
+
/** Function name */
|
|
24
|
+
name: string;
|
|
25
|
+
/** Qualified name */
|
|
26
|
+
qualifiedName: string;
|
|
27
|
+
/** File path */
|
|
28
|
+
file: string;
|
|
29
|
+
/** Line number */
|
|
30
|
+
line: number;
|
|
31
|
+
/** How many hops from the changed code */
|
|
32
|
+
depth: number;
|
|
33
|
+
/** Is this an entry point? */
|
|
34
|
+
isEntryPoint: boolean;
|
|
35
|
+
/** Does this function access sensitive data? */
|
|
36
|
+
accessesSensitiveData: boolean;
|
|
37
|
+
/** Call path from this function to the changed code */
|
|
38
|
+
pathToChange: CallPathNode[];
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* Sensitive data path that could be affected
|
|
42
|
+
*/
|
|
43
|
+
export interface AffectedDataPath {
|
|
44
|
+
/** The data being accessed */
|
|
45
|
+
table: string;
|
|
46
|
+
/** Fields accessed */
|
|
47
|
+
fields: string[];
|
|
48
|
+
/** Operation type */
|
|
49
|
+
operation: 'read' | 'write' | 'delete' | 'unknown';
|
|
50
|
+
/** Entry point that reaches this data through the changed code */
|
|
51
|
+
entryPoint: string;
|
|
52
|
+
/** Full path: entry → changed code → data */
|
|
53
|
+
fullPath: CallPathNode[];
|
|
54
|
+
/** Sensitivity classification */
|
|
55
|
+
sensitivity: 'credentials' | 'financial' | 'health' | 'pii' | 'unknown';
|
|
56
|
+
}
|
|
57
|
+
/**
|
|
58
|
+
* Complete impact analysis result
|
|
59
|
+
*/
|
|
60
|
+
export interface ImpactAnalysisResult {
|
|
61
|
+
/** What was analyzed */
|
|
62
|
+
target: {
|
|
63
|
+
type: 'file' | 'function';
|
|
64
|
+
file: string;
|
|
65
|
+
functionId?: string;
|
|
66
|
+
functionName?: string;
|
|
67
|
+
};
|
|
68
|
+
/** Overall risk assessment */
|
|
69
|
+
risk: ImpactRisk;
|
|
70
|
+
/** Risk score (0-100) */
|
|
71
|
+
riskScore: number;
|
|
72
|
+
/** Summary statistics */
|
|
73
|
+
summary: {
|
|
74
|
+
directCallers: number;
|
|
75
|
+
transitiveCallers: number;
|
|
76
|
+
affectedEntryPoints: number;
|
|
77
|
+
affectedDataPaths: number;
|
|
78
|
+
maxDepth: number;
|
|
79
|
+
};
|
|
80
|
+
/** All affected functions */
|
|
81
|
+
affected: AffectedFunction[];
|
|
82
|
+
/** Entry points that are affected */
|
|
83
|
+
entryPoints: AffectedFunction[];
|
|
84
|
+
/** Sensitive data paths affected */
|
|
85
|
+
sensitiveDataPaths: AffectedDataPath[];
|
|
86
|
+
/** Functions in the changed file/function */
|
|
87
|
+
changedFunctions: string[];
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Options for impact analysis
|
|
91
|
+
*/
|
|
92
|
+
export interface ImpactAnalysisOptions {
|
|
93
|
+
/** Maximum depth to traverse (default: unlimited) */
|
|
94
|
+
maxDepth?: number;
|
|
95
|
+
/** Include functions with no callers */
|
|
96
|
+
includeOrphans?: boolean;
|
|
97
|
+
}
|
|
98
|
+
/**
|
|
99
|
+
* Analyzes the impact of code changes
|
|
100
|
+
*/
|
|
101
|
+
export declare class ImpactAnalyzer {
|
|
102
|
+
private graph;
|
|
103
|
+
private entryPointSet;
|
|
104
|
+
constructor(graph: CallGraph);
|
|
105
|
+
/**
|
|
106
|
+
* Analyze impact of changing a file
|
|
107
|
+
*/
|
|
108
|
+
analyzeFile(file: string, options?: ImpactAnalysisOptions): ImpactAnalysisResult;
|
|
109
|
+
/**
|
|
110
|
+
* Analyze impact of changing a specific function
|
|
111
|
+
*/
|
|
112
|
+
analyzeFunction(functionId: string, options?: ImpactAnalysisOptions): ImpactAnalysisResult;
|
|
113
|
+
/**
|
|
114
|
+
* Find function by name and analyze it
|
|
115
|
+
*/
|
|
116
|
+
analyzeFunctionByName(name: string, options?: ImpactAnalysisOptions): ImpactAnalysisResult;
|
|
117
|
+
/**
|
|
118
|
+
* Core analysis: find all callers of given functions
|
|
119
|
+
*/
|
|
120
|
+
private analyzeMultipleFunctions;
|
|
121
|
+
/**
|
|
122
|
+
* Find sensitive data paths that go through the changed code
|
|
123
|
+
*/
|
|
124
|
+
private findAffectedDataPaths;
|
|
125
|
+
/**
|
|
126
|
+
* Get all data access reachable from a function (forward traversal)
|
|
127
|
+
*/
|
|
128
|
+
private getReachableDataAccess;
|
|
129
|
+
/**
|
|
130
|
+
* Check if a function has sensitive data access
|
|
131
|
+
*/
|
|
132
|
+
private hasSensitiveAccess;
|
|
133
|
+
/**
|
|
134
|
+
* Classify sensitivity of a data access point
|
|
135
|
+
*/
|
|
136
|
+
private classifySensitivity;
|
|
137
|
+
/**
|
|
138
|
+
* Calculate overall risk level
|
|
139
|
+
*/
|
|
140
|
+
private calculateRisk;
|
|
141
|
+
/**
|
|
142
|
+
* Create empty result
|
|
143
|
+
*/
|
|
144
|
+
private createEmptyResult;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* Create an impact analyzer
|
|
148
|
+
*/
|
|
149
|
+
export declare function createImpactAnalyzer(graph: CallGraph): ImpactAnalyzer;
|
|
150
|
+
//# sourceMappingURL=impact-analyzer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"impact-analyzer.d.ts","sourceRoot":"","sources":["../../../src/call-graph/analysis/impact-analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,329 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Impact Analyzer
|
|
3
|
+
*
|
|
4
|
+
* Answers: "If I change this code, what else is affected?"
|
|
5
|
+
*
|
|
6
|
+
* Uses reverse call graph traversal to find:
|
|
7
|
+
* - Direct callers (immediate impact)
|
|
8
|
+
* - Transitive callers (ripple effect)
|
|
9
|
+
* - Affected entry points (user-facing impact)
|
|
10
|
+
* - Sensitive data paths affected (security impact)
|
|
11
|
+
*/
|
|
12
|
+
// ============================================================================
|
|
13
|
+
// Impact Analyzer
|
|
14
|
+
// ============================================================================
|
|
15
|
+
/**
|
|
16
|
+
* Analyzes the impact of code changes
|
|
17
|
+
*/
|
|
18
|
+
export class ImpactAnalyzer {
|
|
19
|
+
graph;
|
|
20
|
+
entryPointSet;
|
|
21
|
+
constructor(graph) {
|
|
22
|
+
this.graph = graph;
|
|
23
|
+
this.entryPointSet = new Set(graph.entryPoints);
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Analyze impact of changing a file
|
|
27
|
+
*/
|
|
28
|
+
analyzeFile(file, options = {}) {
|
|
29
|
+
// Find all functions in this file
|
|
30
|
+
const functionsInFile = [];
|
|
31
|
+
for (const [, func] of this.graph.functions) {
|
|
32
|
+
if (func.file === file) {
|
|
33
|
+
functionsInFile.push(func);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
if (functionsInFile.length === 0) {
|
|
37
|
+
return this.createEmptyResult({ type: 'file', file });
|
|
38
|
+
}
|
|
39
|
+
// Analyze impact of all functions in the file
|
|
40
|
+
return this.analyzeMultipleFunctions(functionsInFile.map(f => f.id), { type: 'file', file }, options);
|
|
41
|
+
}
|
|
42
|
+
/**
|
|
43
|
+
* Analyze impact of changing a specific function
|
|
44
|
+
*/
|
|
45
|
+
analyzeFunction(functionId, options = {}) {
|
|
46
|
+
const func = this.graph.functions.get(functionId);
|
|
47
|
+
if (!func) {
|
|
48
|
+
return this.createEmptyResult({ type: 'function', file: '', functionId });
|
|
49
|
+
}
|
|
50
|
+
return this.analyzeMultipleFunctions([functionId], { type: 'function', file: func.file, functionId, functionName: func.qualifiedName }, options);
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Find function by name and analyze it
|
|
54
|
+
*/
|
|
55
|
+
analyzeFunctionByName(name, options = {}) {
|
|
56
|
+
// Find function by name
|
|
57
|
+
for (const [id, func] of this.graph.functions) {
|
|
58
|
+
if (func.name === name || func.qualifiedName === name) {
|
|
59
|
+
return this.analyzeFunction(id, options);
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
return this.createEmptyResult({ type: 'function', file: '', functionName: name });
|
|
63
|
+
}
|
|
64
|
+
/**
|
|
65
|
+
* Core analysis: find all callers of given functions
|
|
66
|
+
*/
|
|
67
|
+
analyzeMultipleFunctions(functionIds, target, options) {
|
|
68
|
+
const { maxDepth = Infinity } = options;
|
|
69
|
+
const affected = new Map();
|
|
70
|
+
const changedFunctionsSet = new Set(functionIds);
|
|
71
|
+
// BFS backwards through calledBy
|
|
72
|
+
const queue = [];
|
|
73
|
+
const visited = new Set();
|
|
74
|
+
// Initialize queue with direct callers of all changed functions
|
|
75
|
+
for (const funcId of functionIds) {
|
|
76
|
+
const func = this.graph.functions.get(funcId);
|
|
77
|
+
if (!func)
|
|
78
|
+
continue;
|
|
79
|
+
// Add the changed function's path node
|
|
80
|
+
const changedNode = {
|
|
81
|
+
functionId: funcId,
|
|
82
|
+
functionName: func.qualifiedName,
|
|
83
|
+
file: func.file,
|
|
84
|
+
line: func.startLine,
|
|
85
|
+
};
|
|
86
|
+
for (const caller of func.calledBy) {
|
|
87
|
+
if (!visited.has(caller.callerId)) {
|
|
88
|
+
queue.push({
|
|
89
|
+
funcId: caller.callerId,
|
|
90
|
+
depth: 1,
|
|
91
|
+
path: [changedNode],
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
// BFS traversal
|
|
97
|
+
while (queue.length > 0) {
|
|
98
|
+
const { funcId, depth, path } = queue.shift();
|
|
99
|
+
if (visited.has(funcId) || depth > maxDepth) {
|
|
100
|
+
continue;
|
|
101
|
+
}
|
|
102
|
+
visited.add(funcId);
|
|
103
|
+
const func = this.graph.functions.get(funcId);
|
|
104
|
+
if (!func)
|
|
105
|
+
continue;
|
|
106
|
+
// Build path to this function
|
|
107
|
+
const currentPath = [
|
|
108
|
+
{
|
|
109
|
+
functionId: funcId,
|
|
110
|
+
functionName: func.qualifiedName,
|
|
111
|
+
file: func.file,
|
|
112
|
+
line: func.startLine,
|
|
113
|
+
},
|
|
114
|
+
...path,
|
|
115
|
+
];
|
|
116
|
+
// Record this affected function
|
|
117
|
+
affected.set(funcId, {
|
|
118
|
+
id: funcId,
|
|
119
|
+
name: func.name,
|
|
120
|
+
qualifiedName: func.qualifiedName,
|
|
121
|
+
file: func.file,
|
|
122
|
+
line: func.startLine,
|
|
123
|
+
depth,
|
|
124
|
+
isEntryPoint: this.entryPointSet.has(funcId),
|
|
125
|
+
accessesSensitiveData: this.hasSensitiveAccess(func),
|
|
126
|
+
pathToChange: currentPath,
|
|
127
|
+
});
|
|
128
|
+
// Continue to callers of this function
|
|
129
|
+
for (const caller of func.calledBy) {
|
|
130
|
+
if (!visited.has(caller.callerId)) {
|
|
131
|
+
queue.push({
|
|
132
|
+
funcId: caller.callerId,
|
|
133
|
+
depth: depth + 1,
|
|
134
|
+
path: currentPath,
|
|
135
|
+
});
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
// Extract entry points
|
|
140
|
+
const entryPoints = Array.from(affected.values())
|
|
141
|
+
.filter(a => a.isEntryPoint)
|
|
142
|
+
.sort((a, b) => a.depth - b.depth);
|
|
143
|
+
// Find sensitive data paths
|
|
144
|
+
const sensitiveDataPaths = this.findAffectedDataPaths(functionIds, entryPoints);
|
|
145
|
+
// Calculate risk
|
|
146
|
+
const { risk, riskScore } = this.calculateRisk(affected, entryPoints, sensitiveDataPaths);
|
|
147
|
+
// Sort affected by depth
|
|
148
|
+
const sortedAffected = Array.from(affected.values())
|
|
149
|
+
.sort((a, b) => a.depth - b.depth);
|
|
150
|
+
return {
|
|
151
|
+
target,
|
|
152
|
+
risk,
|
|
153
|
+
riskScore,
|
|
154
|
+
summary: {
|
|
155
|
+
directCallers: sortedAffected.filter(a => a.depth === 1).length,
|
|
156
|
+
transitiveCallers: sortedAffected.filter(a => a.depth > 1).length,
|
|
157
|
+
affectedEntryPoints: entryPoints.length,
|
|
158
|
+
affectedDataPaths: sensitiveDataPaths.length,
|
|
159
|
+
maxDepth: Math.max(0, ...sortedAffected.map(a => a.depth)),
|
|
160
|
+
},
|
|
161
|
+
affected: sortedAffected,
|
|
162
|
+
entryPoints,
|
|
163
|
+
sensitiveDataPaths,
|
|
164
|
+
changedFunctions: Array.from(changedFunctionsSet),
|
|
165
|
+
};
|
|
166
|
+
}
|
|
167
|
+
/**
|
|
168
|
+
* Find sensitive data paths that go through the changed code
|
|
169
|
+
*/
|
|
170
|
+
findAffectedDataPaths(changedFunctionIds, affectedEntryPoints) {
|
|
171
|
+
const paths = [];
|
|
172
|
+
// For each changed function, find what data it can reach
|
|
173
|
+
for (const funcId of changedFunctionIds) {
|
|
174
|
+
const dataAccess = this.getReachableDataAccess(funcId);
|
|
175
|
+
for (const access of dataAccess) {
|
|
176
|
+
const sensitivity = this.classifySensitivity(access);
|
|
177
|
+
if (sensitivity === 'unknown')
|
|
178
|
+
continue;
|
|
179
|
+
// Find entry points that can reach this data through the changed code
|
|
180
|
+
for (const entryPoint of affectedEntryPoints) {
|
|
181
|
+
// Build full path: entry → changed → data
|
|
182
|
+
const fullPath = [
|
|
183
|
+
...entryPoint.pathToChange,
|
|
184
|
+
{
|
|
185
|
+
functionId: access.file + ':data',
|
|
186
|
+
functionName: `${access.table}.${access.fields.join(',')}`,
|
|
187
|
+
file: access.file,
|
|
188
|
+
line: access.line,
|
|
189
|
+
},
|
|
190
|
+
];
|
|
191
|
+
paths.push({
|
|
192
|
+
table: access.table,
|
|
193
|
+
fields: access.fields,
|
|
194
|
+
operation: access.operation,
|
|
195
|
+
entryPoint: entryPoint.qualifiedName,
|
|
196
|
+
fullPath,
|
|
197
|
+
sensitivity,
|
|
198
|
+
});
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
return paths;
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Get all data access reachable from a function (forward traversal)
|
|
206
|
+
*/
|
|
207
|
+
getReachableDataAccess(functionId) {
|
|
208
|
+
const access = [];
|
|
209
|
+
const visited = new Set();
|
|
210
|
+
const queue = [functionId];
|
|
211
|
+
while (queue.length > 0) {
|
|
212
|
+
const funcId = queue.shift();
|
|
213
|
+
if (visited.has(funcId))
|
|
214
|
+
continue;
|
|
215
|
+
visited.add(funcId);
|
|
216
|
+
const func = this.graph.functions.get(funcId);
|
|
217
|
+
if (!func)
|
|
218
|
+
continue;
|
|
219
|
+
// Collect data access
|
|
220
|
+
access.push(...func.dataAccess);
|
|
221
|
+
// Follow calls
|
|
222
|
+
for (const call of func.calls) {
|
|
223
|
+
for (const candidate of call.resolvedCandidates) {
|
|
224
|
+
if (!visited.has(candidate)) {
|
|
225
|
+
queue.push(candidate);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
}
|
|
230
|
+
return access;
|
|
231
|
+
}
|
|
232
|
+
/**
|
|
233
|
+
* Check if a function has sensitive data access
|
|
234
|
+
*/
|
|
235
|
+
hasSensitiveAccess(func) {
|
|
236
|
+
for (const access of func.dataAccess) {
|
|
237
|
+
if (this.classifySensitivity(access) !== 'unknown') {
|
|
238
|
+
return true;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return false;
|
|
242
|
+
}
|
|
243
|
+
/**
|
|
244
|
+
* Classify sensitivity of a data access point
|
|
245
|
+
*/
|
|
246
|
+
classifySensitivity(access) {
|
|
247
|
+
const text = `${access.table} ${access.fields.join(' ')}`.toLowerCase();
|
|
248
|
+
if (/password|secret|token|api_key|private_key|auth/.test(text)) {
|
|
249
|
+
return 'credentials';
|
|
250
|
+
}
|
|
251
|
+
if (/credit_card|card_number|cvv|bank|account_number|salary|income|payment|stripe|billing/.test(text)) {
|
|
252
|
+
return 'financial';
|
|
253
|
+
}
|
|
254
|
+
if (/diagnosis|medical|health|prescription|insurance|hipaa/.test(text)) {
|
|
255
|
+
return 'health';
|
|
256
|
+
}
|
|
257
|
+
if (/ssn|social_security|email|phone|address|dob|birth|name/.test(text)) {
|
|
258
|
+
return 'pii';
|
|
259
|
+
}
|
|
260
|
+
return 'unknown';
|
|
261
|
+
}
|
|
262
|
+
/**
|
|
263
|
+
* Calculate overall risk level
|
|
264
|
+
*/
|
|
265
|
+
calculateRisk(affected, entryPoints, sensitiveDataPaths) {
|
|
266
|
+
let score = 0;
|
|
267
|
+
// Base score from number of affected functions
|
|
268
|
+
score += Math.min(30, affected.size * 2);
|
|
269
|
+
// Entry points are high impact
|
|
270
|
+
score += Math.min(25, entryPoints.length * 5);
|
|
271
|
+
// Sensitive data paths are critical
|
|
272
|
+
const credentialPaths = sensitiveDataPaths.filter(p => p.sensitivity === 'credentials').length;
|
|
273
|
+
const financialPaths = sensitiveDataPaths.filter(p => p.sensitivity === 'financial').length;
|
|
274
|
+
const healthPaths = sensitiveDataPaths.filter(p => p.sensitivity === 'health').length;
|
|
275
|
+
const piiPaths = sensitiveDataPaths.filter(p => p.sensitivity === 'pii').length;
|
|
276
|
+
score += credentialPaths * 15;
|
|
277
|
+
score += financialPaths * 12;
|
|
278
|
+
score += healthPaths * 10;
|
|
279
|
+
score += piiPaths * 5;
|
|
280
|
+
// Cap at 100
|
|
281
|
+
score = Math.min(100, score);
|
|
282
|
+
// Determine risk level
|
|
283
|
+
let risk;
|
|
284
|
+
if (score >= 75 || credentialPaths > 0) {
|
|
285
|
+
risk = 'critical';
|
|
286
|
+
}
|
|
287
|
+
else if (score >= 50 || financialPaths > 0 || healthPaths > 0) {
|
|
288
|
+
risk = 'high';
|
|
289
|
+
}
|
|
290
|
+
else if (score >= 25 || piiPaths > 0) {
|
|
291
|
+
risk = 'medium';
|
|
292
|
+
}
|
|
293
|
+
else {
|
|
294
|
+
risk = 'low';
|
|
295
|
+
}
|
|
296
|
+
return { risk, riskScore: score };
|
|
297
|
+
}
|
|
298
|
+
/**
|
|
299
|
+
* Create empty result
|
|
300
|
+
*/
|
|
301
|
+
createEmptyResult(target) {
|
|
302
|
+
return {
|
|
303
|
+
target,
|
|
304
|
+
risk: 'low',
|
|
305
|
+
riskScore: 0,
|
|
306
|
+
summary: {
|
|
307
|
+
directCallers: 0,
|
|
308
|
+
transitiveCallers: 0,
|
|
309
|
+
affectedEntryPoints: 0,
|
|
310
|
+
affectedDataPaths: 0,
|
|
311
|
+
maxDepth: 0,
|
|
312
|
+
},
|
|
313
|
+
affected: [],
|
|
314
|
+
entryPoints: [],
|
|
315
|
+
sensitiveDataPaths: [],
|
|
316
|
+
changedFunctions: [],
|
|
317
|
+
};
|
|
318
|
+
}
|
|
319
|
+
}
|
|
320
|
+
// ============================================================================
|
|
321
|
+
// Factory
|
|
322
|
+
// ============================================================================
|
|
323
|
+
/**
|
|
324
|
+
* Create an impact analyzer
|
|
325
|
+
*/
|
|
326
|
+
export function createImpactAnalyzer(graph) {
|
|
327
|
+
return new ImpactAnalyzer(graph);
|
|
328
|
+
}
|
|
329
|
+
//# sourceMappingURL=impact-analyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"impact-analyzer.js","sourceRoot":"","sources":["../../../src/call-graph/analysis/impact-analyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Call Graph Analysis
|
|
3
|
+
*
|
|
4
|
+
* Graph building, reachability analysis, and path finding.
|
|
5
|
+
*/
|
|
6
|
+
export { GraphBuilder } from './graph-builder.js';
|
|
7
|
+
export type { GraphBuilderOptions } from './graph-builder.js';
|
|
8
|
+
export { ReachabilityEngine } from './reachability.js';
|
|
9
|
+
export { PathFinder, createPathFinder } from './path-finder.js';
|
|
10
|
+
export type { PathFinderOptions, CallPath, PathFinderResult, CriticalPathResult, } from './path-finder.js';
|
|
11
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/call-graph/analysis/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAClD,YAAY,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAC9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAChE,YAAY,EACV,iBAAiB,EACjB,QAAQ,EACR,gBAAgB,EAChB,kBAAkB,GACnB,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Call Graph Analysis
|
|
3
|
+
*
|
|
4
|
+
* Graph building, reachability analysis, and path finding.
|
|
5
|
+
*/
|
|
6
|
+
export { GraphBuilder } from './graph-builder.js';
|
|
7
|
+
export { ReachabilityEngine } from './reachability.js';
|
|
8
|
+
export { PathFinder, createPathFinder } from './path-finder.js';
|
|
9
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/call-graph/analysis/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EAAE,UAAU,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Path Finder
|
|
3
|
+
*
|
|
4
|
+
* Advanced path finding algorithms for call graph traversal.
|
|
5
|
+
* Supports finding shortest paths, all paths, and critical paths
|
|
6
|
+
* between functions in the call graph.
|
|
7
|
+
*/
|
|
8
|
+
import type { CallGraph, CallPathNode, CodeLocation } from '../types.js';
|
|
9
|
+
import type { DataAccessPoint } from '../../boundaries/types.js';
|
|
10
|
+
/**
|
|
11
|
+
* Options for path finding
|
|
12
|
+
*/
|
|
13
|
+
export interface PathFinderOptions {
|
|
14
|
+
/** Maximum depth to search */
|
|
15
|
+
maxDepth?: number | undefined;
|
|
16
|
+
/** Maximum number of paths to return */
|
|
17
|
+
maxPaths?: number | undefined;
|
|
18
|
+
/** Include unresolved calls */
|
|
19
|
+
includeUnresolved?: boolean | undefined;
|
|
20
|
+
/** Minimum confidence for call resolution */
|
|
21
|
+
minConfidence?: number | undefined;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* A complete path with metadata
|
|
25
|
+
*/
|
|
26
|
+
export interface CallPath {
|
|
27
|
+
/** Path nodes */
|
|
28
|
+
nodes: CallPathNode[];
|
|
29
|
+
/** Total depth */
|
|
30
|
+
depth: number;
|
|
31
|
+
/** Minimum confidence along the path */
|
|
32
|
+
minConfidence: number;
|
|
33
|
+
/** Whether path contains unresolved calls */
|
|
34
|
+
hasUnresolved: boolean;
|
|
35
|
+
}
|
|
36
|
+
/**
|
|
37
|
+
* Result of path finding
|
|
38
|
+
*/
|
|
39
|
+
export interface PathFinderResult {
|
|
40
|
+
/** Found paths */
|
|
41
|
+
paths: CallPath[];
|
|
42
|
+
/** Whether search was exhaustive */
|
|
43
|
+
exhaustive: boolean;
|
|
44
|
+
/** Number of nodes visited */
|
|
45
|
+
nodesVisited: number;
|
|
46
|
+
/** Search time in ms */
|
|
47
|
+
searchTimeMs: number;
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Critical path analysis result
|
|
51
|
+
*/
|
|
52
|
+
export interface CriticalPathResult {
|
|
53
|
+
/** The critical path (most impactful) */
|
|
54
|
+
criticalPath: CallPath | null;
|
|
55
|
+
/** All paths sorted by criticality */
|
|
56
|
+
rankedPaths: Array<{
|
|
57
|
+
path: CallPath;
|
|
58
|
+
score: number;
|
|
59
|
+
factors: string[];
|
|
60
|
+
}>;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Advanced path finding for call graphs
|
|
64
|
+
*/
|
|
65
|
+
export declare class PathFinder {
|
|
66
|
+
private readonly graph;
|
|
67
|
+
constructor(graph: CallGraph);
|
|
68
|
+
/**
|
|
69
|
+
* Find the shortest path between two functions
|
|
70
|
+
*/
|
|
71
|
+
findShortestPath(fromId: string, toId: string, options?: PathFinderOptions): CallPath | null;
|
|
72
|
+
/**
|
|
73
|
+
* Find all paths between two functions
|
|
74
|
+
*/
|
|
75
|
+
findAllPaths(fromId: string, toId: string, options?: PathFinderOptions): PathFinderResult;
|
|
76
|
+
/**
|
|
77
|
+
* Find paths from a location to any data access
|
|
78
|
+
*/
|
|
79
|
+
findPathsToData(from: CodeLocation, options?: PathFinderOptions): PathFinderResult;
|
|
80
|
+
/**
|
|
81
|
+
* Find paths from entry points to a specific function
|
|
82
|
+
*/
|
|
83
|
+
findPathsFromEntryPoints(toId: string, options?: PathFinderOptions): PathFinderResult;
|
|
84
|
+
/**
|
|
85
|
+
* Find the critical path (most impactful) to data access
|
|
86
|
+
*/
|
|
87
|
+
findCriticalPath(from: CodeLocation, dataAccessPoints: DataAccessPoint[], options?: PathFinderOptions): CriticalPathResult;
|
|
88
|
+
/**
|
|
89
|
+
* Check if two functions are connected
|
|
90
|
+
*/
|
|
91
|
+
isConnected(fromId: string, toId: string, maxDepth?: number): boolean;
|
|
92
|
+
/**
|
|
93
|
+
* Get all functions reachable from a starting point
|
|
94
|
+
*/
|
|
95
|
+
getReachableFunctions(fromId: string, options?: PathFinderOptions): Set<string>;
|
|
96
|
+
/**
|
|
97
|
+
* Get all functions that can reach a target
|
|
98
|
+
*/
|
|
99
|
+
getCallers(toId: string, options?: PathFinderOptions): Set<string>;
|
|
100
|
+
/**
|
|
101
|
+
* Find paths between two functions using BFS
|
|
102
|
+
*/
|
|
103
|
+
private findPaths;
|
|
104
|
+
/**
|
|
105
|
+
* Score a path based on criticality factors
|
|
106
|
+
*/
|
|
107
|
+
private scorePath;
|
|
108
|
+
/**
|
|
109
|
+
* Find the function containing a location
|
|
110
|
+
*/
|
|
111
|
+
private findContainingFunction;
|
|
112
|
+
}
|
|
113
|
+
/**
|
|
114
|
+
* Create a new path finder
|
|
115
|
+
*/
|
|
116
|
+
export declare function createPathFinder(graph: CallGraph): PathFinder;
|
|
117
|
+
//# sourceMappingURL=path-finder.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"path-finder.d.ts","sourceRoot":"","sources":["../../../src/call-graph/analysis/path-finder.ts"],"names":[],"mappings":"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"}
|