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.
Files changed (237) hide show
  1. package/dist/boundaries/boundary-scanner.d.ts +76 -0
  2. package/dist/boundaries/boundary-scanner.d.ts.map +1 -0
  3. package/dist/boundaries/boundary-scanner.js +801 -0
  4. package/dist/boundaries/boundary-scanner.js.map +1 -0
  5. package/dist/boundaries/data-access-learner.d.ts +126 -0
  6. package/dist/boundaries/data-access-learner.d.ts.map +1 -0
  7. package/dist/boundaries/data-access-learner.js +486 -0
  8. package/dist/boundaries/data-access-learner.js.map +1 -0
  9. package/dist/boundaries/index.d.ts +6 -0
  10. package/dist/boundaries/index.d.ts.map +1 -1
  11. package/dist/boundaries/index.js +6 -0
  12. package/dist/boundaries/index.js.map +1 -1
  13. package/dist/boundaries/security-prioritizer.d.ts +118 -0
  14. package/dist/boundaries/security-prioritizer.d.ts.map +1 -0
  15. package/dist/boundaries/security-prioritizer.js +316 -0
  16. package/dist/boundaries/security-prioritizer.js.map +1 -0
  17. package/dist/call-graph/analysis/coverage-analyzer.d.ts +201 -0
  18. package/dist/call-graph/analysis/coverage-analyzer.d.ts.map +1 -0
  19. package/dist/call-graph/analysis/coverage-analyzer.js +553 -0
  20. package/dist/call-graph/analysis/coverage-analyzer.js.map +1 -0
  21. package/dist/call-graph/analysis/dead-code-detector.d.ts +145 -0
  22. package/dist/call-graph/analysis/dead-code-detector.d.ts.map +1 -0
  23. package/dist/call-graph/analysis/dead-code-detector.js +391 -0
  24. package/dist/call-graph/analysis/dead-code-detector.js.map +1 -0
  25. package/dist/call-graph/analysis/graph-builder.d.ts +142 -0
  26. package/dist/call-graph/analysis/graph-builder.d.ts.map +1 -0
  27. package/dist/call-graph/analysis/graph-builder.js +624 -0
  28. package/dist/call-graph/analysis/graph-builder.js.map +1 -0
  29. package/dist/call-graph/analysis/impact-analyzer.d.ts +150 -0
  30. package/dist/call-graph/analysis/impact-analyzer.d.ts.map +1 -0
  31. package/dist/call-graph/analysis/impact-analyzer.js +329 -0
  32. package/dist/call-graph/analysis/impact-analyzer.js.map +1 -0
  33. package/dist/call-graph/analysis/index.d.ts +11 -0
  34. package/dist/call-graph/analysis/index.d.ts.map +1 -0
  35. package/dist/call-graph/analysis/index.js +9 -0
  36. package/dist/call-graph/analysis/index.js.map +1 -0
  37. package/dist/call-graph/analysis/path-finder.d.ts +117 -0
  38. package/dist/call-graph/analysis/path-finder.d.ts.map +1 -0
  39. package/dist/call-graph/analysis/path-finder.js +360 -0
  40. package/dist/call-graph/analysis/path-finder.js.map +1 -0
  41. package/dist/call-graph/analysis/reachability.d.ts +56 -0
  42. package/dist/call-graph/analysis/reachability.d.ts.map +1 -0
  43. package/dist/call-graph/analysis/reachability.js +357 -0
  44. package/dist/call-graph/analysis/reachability.js.map +1 -0
  45. package/dist/call-graph/demo.d.ts +11 -0
  46. package/dist/call-graph/demo.d.ts.map +1 -0
  47. package/dist/call-graph/demo.js +339 -0
  48. package/dist/call-graph/demo.js.map +1 -0
  49. package/dist/call-graph/enrichment/enrichment-engine.d.ts +126 -0
  50. package/dist/call-graph/enrichment/enrichment-engine.d.ts.map +1 -0
  51. package/dist/call-graph/enrichment/enrichment-engine.js +760 -0
  52. package/dist/call-graph/enrichment/enrichment-engine.js.map +1 -0
  53. package/dist/call-graph/enrichment/impact-scorer.d.ts +59 -0
  54. package/dist/call-graph/enrichment/impact-scorer.d.ts.map +1 -0
  55. package/dist/call-graph/enrichment/impact-scorer.js +328 -0
  56. package/dist/call-graph/enrichment/impact-scorer.js.map +1 -0
  57. package/dist/call-graph/enrichment/index.d.ts +12 -0
  58. package/dist/call-graph/enrichment/index.d.ts.map +1 -0
  59. package/dist/call-graph/enrichment/index.js +15 -0
  60. package/dist/call-graph/enrichment/index.js.map +1 -0
  61. package/dist/call-graph/enrichment/remediation-generator.d.ts +41 -0
  62. package/dist/call-graph/enrichment/remediation-generator.d.ts.map +1 -0
  63. package/dist/call-graph/enrichment/remediation-generator.js +609 -0
  64. package/dist/call-graph/enrichment/remediation-generator.js.map +1 -0
  65. package/dist/call-graph/enrichment/sensitivity-classifier.d.ts +71 -0
  66. package/dist/call-graph/enrichment/sensitivity-classifier.d.ts.map +1 -0
  67. package/dist/call-graph/enrichment/sensitivity-classifier.js +454 -0
  68. package/dist/call-graph/enrichment/sensitivity-classifier.js.map +1 -0
  69. package/dist/call-graph/enrichment/types.d.ts +402 -0
  70. package/dist/call-graph/enrichment/types.d.ts.map +1 -0
  71. package/dist/call-graph/enrichment/types.js +9 -0
  72. package/dist/call-graph/enrichment/types.js.map +1 -0
  73. package/dist/call-graph/extractors/base-extractor.d.ts +112 -0
  74. package/dist/call-graph/extractors/base-extractor.d.ts.map +1 -0
  75. package/dist/call-graph/extractors/base-extractor.js +140 -0
  76. package/dist/call-graph/extractors/base-extractor.js.map +1 -0
  77. package/dist/call-graph/extractors/csharp-data-access-extractor.d.ts +76 -0
  78. package/dist/call-graph/extractors/csharp-data-access-extractor.d.ts.map +1 -0
  79. package/dist/call-graph/extractors/csharp-data-access-extractor.js +387 -0
  80. package/dist/call-graph/extractors/csharp-data-access-extractor.js.map +1 -0
  81. package/dist/call-graph/extractors/csharp-extractor.d.ts +87 -0
  82. package/dist/call-graph/extractors/csharp-extractor.d.ts.map +1 -0
  83. package/dist/call-graph/extractors/csharp-extractor.js +470 -0
  84. package/dist/call-graph/extractors/csharp-extractor.js.map +1 -0
  85. package/dist/call-graph/extractors/data-access-extractor.d.ts +76 -0
  86. package/dist/call-graph/extractors/data-access-extractor.d.ts.map +1 -0
  87. package/dist/call-graph/extractors/data-access-extractor.js +234 -0
  88. package/dist/call-graph/extractors/data-access-extractor.js.map +1 -0
  89. package/dist/call-graph/extractors/index.d.ts +26 -0
  90. package/dist/call-graph/extractors/index.d.ts.map +1 -0
  91. package/dist/call-graph/extractors/index.js +36 -0
  92. package/dist/call-graph/extractors/index.js.map +1 -0
  93. package/dist/call-graph/extractors/java-data-access-extractor.d.ts +101 -0
  94. package/dist/call-graph/extractors/java-data-access-extractor.d.ts.map +1 -0
  95. package/dist/call-graph/extractors/java-data-access-extractor.js +611 -0
  96. package/dist/call-graph/extractors/java-data-access-extractor.js.map +1 -0
  97. package/dist/call-graph/extractors/java-extractor.d.ts +87 -0
  98. package/dist/call-graph/extractors/java-extractor.d.ts.map +1 -0
  99. package/dist/call-graph/extractors/java-extractor.js +510 -0
  100. package/dist/call-graph/extractors/java-extractor.js.map +1 -0
  101. package/dist/call-graph/extractors/php-data-access-extractor.d.ts +93 -0
  102. package/dist/call-graph/extractors/php-data-access-extractor.d.ts.map +1 -0
  103. package/dist/call-graph/extractors/php-data-access-extractor.js +589 -0
  104. package/dist/call-graph/extractors/php-data-access-extractor.js.map +1 -0
  105. package/dist/call-graph/extractors/php-extractor.d.ts +104 -0
  106. package/dist/call-graph/extractors/php-extractor.d.ts.map +1 -0
  107. package/dist/call-graph/extractors/php-extractor.js +619 -0
  108. package/dist/call-graph/extractors/php-extractor.js.map +1 -0
  109. package/dist/call-graph/extractors/python-data-access-extractor.d.ts +90 -0
  110. package/dist/call-graph/extractors/python-data-access-extractor.d.ts.map +1 -0
  111. package/dist/call-graph/extractors/python-data-access-extractor.js +537 -0
  112. package/dist/call-graph/extractors/python-data-access-extractor.js.map +1 -0
  113. package/dist/call-graph/extractors/python-extractor.d.ts +98 -0
  114. package/dist/call-graph/extractors/python-extractor.d.ts.map +1 -0
  115. package/dist/call-graph/extractors/python-extractor.js +681 -0
  116. package/dist/call-graph/extractors/python-extractor.js.map +1 -0
  117. package/dist/call-graph/extractors/semantic-data-access-scanner.d.ts +91 -0
  118. package/dist/call-graph/extractors/semantic-data-access-scanner.d.ts.map +1 -0
  119. package/dist/call-graph/extractors/semantic-data-access-scanner.js +498 -0
  120. package/dist/call-graph/extractors/semantic-data-access-scanner.js.map +1 -0
  121. package/dist/call-graph/extractors/typescript-data-access-extractor.d.ts +122 -0
  122. package/dist/call-graph/extractors/typescript-data-access-extractor.d.ts.map +1 -0
  123. package/dist/call-graph/extractors/typescript-data-access-extractor.js +788 -0
  124. package/dist/call-graph/extractors/typescript-data-access-extractor.js.map +1 -0
  125. package/dist/call-graph/extractors/typescript-extractor.d.ts +145 -0
  126. package/dist/call-graph/extractors/typescript-extractor.d.ts.map +1 -0
  127. package/dist/call-graph/extractors/typescript-extractor.js +904 -0
  128. package/dist/call-graph/extractors/typescript-extractor.js.map +1 -0
  129. package/dist/call-graph/index.d.ts +127 -0
  130. package/dist/call-graph/index.d.ts.map +1 -0
  131. package/dist/call-graph/index.js +247 -0
  132. package/dist/call-graph/index.js.map +1 -0
  133. package/dist/call-graph/store/call-graph-store.d.ts +70 -0
  134. package/dist/call-graph/store/call-graph-store.d.ts.map +1 -0
  135. package/dist/call-graph/store/call-graph-store.js +210 -0
  136. package/dist/call-graph/store/call-graph-store.js.map +1 -0
  137. package/dist/call-graph/store/index.d.ts +7 -0
  138. package/dist/call-graph/store/index.d.ts.map +1 -0
  139. package/dist/call-graph/store/index.js +7 -0
  140. package/dist/call-graph/store/index.js.map +1 -0
  141. package/dist/call-graph/types.d.ts +376 -0
  142. package/dist/call-graph/types.d.ts.map +1 -0
  143. package/dist/call-graph/types.js +8 -0
  144. package/dist/call-graph/types.js.map +1 -0
  145. package/dist/index.d.ts +8 -0
  146. package/dist/index.d.ts.map +1 -1
  147. package/dist/index.js +12 -0
  148. package/dist/index.js.map +1 -1
  149. package/dist/lake/callgraph-shard-store.d.ts +168 -0
  150. package/dist/lake/callgraph-shard-store.d.ts.map +1 -0
  151. package/dist/lake/callgraph-shard-store.js +466 -0
  152. package/dist/lake/callgraph-shard-store.js.map +1 -0
  153. package/dist/lake/examples-store.d.ts +127 -0
  154. package/dist/lake/examples-store.d.ts.map +1 -0
  155. package/dist/lake/examples-store.js +389 -0
  156. package/dist/lake/examples-store.js.map +1 -0
  157. package/dist/lake/index-store.d.ts +82 -0
  158. package/dist/lake/index-store.d.ts.map +1 -0
  159. package/dist/lake/index-store.js +359 -0
  160. package/dist/lake/index-store.js.map +1 -0
  161. package/dist/lake/index.d.ts +93 -0
  162. package/dist/lake/index.d.ts.map +1 -0
  163. package/dist/lake/index.js +138 -0
  164. package/dist/lake/index.js.map +1 -0
  165. package/dist/lake/lake.bak/index-store.d.ts +82 -0
  166. package/dist/lake/lake.bak/index-store.d.ts.map +1 -0
  167. package/dist/lake/lake.bak/index-store.js +357 -0
  168. package/dist/lake/lake.bak/index-store.js.map +1 -0
  169. package/dist/lake/lake.bak/index.d.ts +81 -0
  170. package/dist/lake/lake.bak/index.d.ts.map +1 -0
  171. package/dist/lake/lake.bak/index.js +114 -0
  172. package/dist/lake/lake.bak/index.js.map +1 -0
  173. package/dist/lake/lake.bak/manifest-store.d.ts +51 -0
  174. package/dist/lake/lake.bak/manifest-store.d.ts.map +1 -0
  175. package/dist/lake/lake.bak/manifest-store.js +347 -0
  176. package/dist/lake/lake.bak/manifest-store.js.map +1 -0
  177. package/dist/lake/lake.bak/query-engine.d.ts +112 -0
  178. package/dist/lake/lake.bak/query-engine.d.ts.map +1 -0
  179. package/dist/lake/lake.bak/query-engine.js +370 -0
  180. package/dist/lake/lake.bak/query-engine.js.map +1 -0
  181. package/dist/lake/lake.bak/types.d.ts +428 -0
  182. package/dist/lake/lake.bak/types.d.ts.map +1 -0
  183. package/dist/lake/lake.bak/types.js +46 -0
  184. package/dist/lake/lake.bak/types.js.map +1 -0
  185. package/dist/lake/lake.bak/view-materializer.d.ts +70 -0
  186. package/dist/lake/lake.bak/view-materializer.d.ts.map +1 -0
  187. package/dist/lake/lake.bak/view-materializer.js +314 -0
  188. package/dist/lake/lake.bak/view-materializer.js.map +1 -0
  189. package/dist/lake/lake.bak/view-store.d.ts +57 -0
  190. package/dist/lake/lake.bak/view-store.d.ts.map +1 -0
  191. package/dist/lake/lake.bak/view-store.js +348 -0
  192. package/dist/lake/lake.bak/view-store.js.map +1 -0
  193. package/dist/lake/manifest-store.d.ts +51 -0
  194. package/dist/lake/manifest-store.d.ts.map +1 -0
  195. package/dist/lake/manifest-store.js +348 -0
  196. package/dist/lake/manifest-store.js.map +1 -0
  197. package/dist/lake/pattern-shard-store.d.ts +87 -0
  198. package/dist/lake/pattern-shard-store.d.ts.map +1 -0
  199. package/dist/lake/pattern-shard-store.js +347 -0
  200. package/dist/lake/pattern-shard-store.js.map +1 -0
  201. package/dist/lake/query-engine.d.ts +124 -0
  202. package/dist/lake/query-engine.d.ts.map +1 -0
  203. package/dist/lake/query-engine.js +453 -0
  204. package/dist/lake/query-engine.js.map +1 -0
  205. package/dist/lake/security-shard-store.d.ts +156 -0
  206. package/dist/lake/security-shard-store.d.ts.map +1 -0
  207. package/dist/lake/security-shard-store.js +498 -0
  208. package/dist/lake/security-shard-store.js.map +1 -0
  209. package/dist/lake/types.d.ts +428 -0
  210. package/dist/lake/types.d.ts.map +1 -0
  211. package/dist/lake/types.js +46 -0
  212. package/dist/lake/types.js.map +1 -0
  213. package/dist/lake/view-materializer.d.ts +70 -0
  214. package/dist/lake/view-materializer.d.ts.map +1 -0
  215. package/dist/lake/view-materializer.js +314 -0
  216. package/dist/lake/view-materializer.js.map +1 -0
  217. package/dist/lake/view-store.d.ts +57 -0
  218. package/dist/lake/view-store.d.ts.map +1 -0
  219. package/dist/lake/view-store.js +348 -0
  220. package/dist/lake/view-store.js.map +1 -0
  221. package/dist/parsers/tree-sitter/index.d.ts +1 -0
  222. package/dist/parsers/tree-sitter/index.d.ts.map +1 -1
  223. package/dist/parsers/tree-sitter/index.js +4 -0
  224. package/dist/parsers/tree-sitter/index.js.map +1 -1
  225. package/dist/parsers/tree-sitter/typescript-loader.d.ts +58 -0
  226. package/dist/parsers/tree-sitter/typescript-loader.d.ts.map +1 -0
  227. package/dist/parsers/tree-sitter/typescript-loader.js +250 -0
  228. package/dist/parsers/tree-sitter/typescript-loader.js.map +1 -0
  229. package/dist/store/project-config.d.ts +154 -0
  230. package/dist/store/project-config.d.ts.map +1 -0
  231. package/dist/store/project-config.js +235 -0
  232. package/dist/store/project-config.js.map +1 -0
  233. package/dist/store/project-registry.d.ts +241 -0
  234. package/dist/store/project-registry.d.ts.map +1 -0
  235. package/dist/store/project-registry.js +557 -0
  236. package/dist/store/project-registry.js.map +1 -0
  237. 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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"}