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,624 @@
1
+ /**
2
+ * Call Graph Builder
3
+ *
4
+ * Builds the complete call graph from extracted file information.
5
+ * Handles function registration, call resolution, and graph construction.
6
+ */
7
+ /**
8
+ * Call Graph Builder
9
+ */
10
+ export class GraphBuilder {
11
+ functions = new Map();
12
+ classes = new Map();
13
+ imports = new Map();
14
+ pendingCalls = new Map();
15
+ dataAccessPoints = new Map();
16
+ options;
17
+ constructor(options) {
18
+ this.options = {
19
+ includeUnresolved: true,
20
+ minConfidence: 0.5,
21
+ ...options,
22
+ };
23
+ }
24
+ /**
25
+ * Add extraction results from a file
26
+ */
27
+ addFile(extraction) {
28
+ const { file, functions, calls, imports, classes } = extraction;
29
+ // Store imports for resolution
30
+ this.imports.set(file, imports);
31
+ // Register classes
32
+ for (const cls of classes) {
33
+ const classKey = `${file}:${cls.name}`;
34
+ this.classes.set(classKey, cls);
35
+ }
36
+ // Register functions
37
+ for (const func of functions) {
38
+ const funcNode = this.createFunctionNode(func, file, extraction.language);
39
+ this.functions.set(funcNode.id, funcNode);
40
+ }
41
+ // Store calls for later resolution
42
+ this.storePendingCalls(calls, file, functions);
43
+ }
44
+ /**
45
+ * Add data access points for a file
46
+ */
47
+ addDataAccess(file, accessPoints) {
48
+ this.dataAccessPoints.set(file, accessPoints);
49
+ }
50
+ /**
51
+ * Build the complete call graph
52
+ */
53
+ build() {
54
+ // Resolve all pending calls
55
+ this.resolveAllCalls();
56
+ // Associate data access with functions
57
+ this.associateDataAccess();
58
+ // Identify entry points
59
+ const entryPoints = this.identifyEntryPoints();
60
+ // Identify data accessors
61
+ const dataAccessors = this.identifyDataAccessors();
62
+ // Calculate stats
63
+ const stats = this.calculateStats();
64
+ return {
65
+ version: '1.0',
66
+ generatedAt: new Date().toISOString(),
67
+ projectRoot: this.options.projectRoot,
68
+ functions: this.functions,
69
+ entryPoints,
70
+ dataAccessors,
71
+ stats,
72
+ };
73
+ }
74
+ /**
75
+ * Create a FunctionNode from extraction
76
+ */
77
+ createFunctionNode(func, file, language) {
78
+ const id = this.generateFunctionId(file, func.qualifiedName, func.startLine);
79
+ return {
80
+ id,
81
+ name: func.name,
82
+ qualifiedName: func.qualifiedName,
83
+ file,
84
+ startLine: func.startLine,
85
+ endLine: func.endLine,
86
+ language,
87
+ calls: [],
88
+ calledBy: [],
89
+ dataAccess: [],
90
+ className: func.className,
91
+ moduleName: func.moduleName,
92
+ isExported: func.isExported,
93
+ isConstructor: func.isConstructor,
94
+ isAsync: func.isAsync,
95
+ decorators: func.decorators,
96
+ parameters: func.parameters,
97
+ returnType: func.returnType,
98
+ };
99
+ }
100
+ /**
101
+ * Store calls for later resolution
102
+ */
103
+ storePendingCalls(calls, file, functions) {
104
+ for (const call of calls) {
105
+ // Find the containing function
106
+ const containingFunc = this.findContainingFunction(call.line, functions);
107
+ if (!containingFunc)
108
+ continue;
109
+ const containingFunctionId = this.generateFunctionId(file, containingFunc.qualifiedName, containingFunc.startLine);
110
+ const pending = this.pendingCalls.get(file) ?? [];
111
+ pending.push({ call, file, containingFunction: containingFunctionId });
112
+ this.pendingCalls.set(file, pending);
113
+ }
114
+ }
115
+ /**
116
+ * Find the function containing a given line
117
+ * Includes parameter default values (which are before the body)
118
+ */
119
+ findContainingFunction(line, functions) {
120
+ // Find the innermost function containing this line
121
+ let best = null;
122
+ let bestSize = Infinity;
123
+ for (const func of functions) {
124
+ // Check full function range (startLine to endLine) to include:
125
+ // - Parameter default values (e.g., Depends(get_current_user))
126
+ // - Function body
127
+ // - Decorators are before startLine, so they're handled separately
128
+ if (line >= func.startLine && line <= func.endLine) {
129
+ const size = func.endLine - func.startLine;
130
+ if (size < bestSize) {
131
+ best = func;
132
+ bestSize = size;
133
+ }
134
+ }
135
+ }
136
+ return best;
137
+ }
138
+ /**
139
+ * Resolve all pending calls
140
+ */
141
+ resolveAllCalls() {
142
+ for (const [file, pending] of this.pendingCalls) {
143
+ const fileImports = this.imports.get(file) ?? [];
144
+ for (const { call, containingFunction } of pending) {
145
+ const resolved = this.resolveCall(call, file, fileImports, containingFunction);
146
+ const callSite = this.createCallSite(call, file, containingFunction, resolved);
147
+ // Add to caller's calls
148
+ const caller = this.functions.get(containingFunction);
149
+ if (caller) {
150
+ caller.calls.push(callSite);
151
+ }
152
+ // Add to callee's calledBy (if resolved)
153
+ if (resolved.resolved && resolved.candidates.length > 0) {
154
+ for (const candidateId of resolved.candidates) {
155
+ const callee = this.functions.get(candidateId);
156
+ if (callee) {
157
+ callee.calledBy.push(callSite);
158
+ }
159
+ }
160
+ }
161
+ }
162
+ }
163
+ }
164
+ /**
165
+ * Resolve a call to its target function(s)
166
+ */
167
+ resolveCall(call, file, imports, callerId) {
168
+ const candidates = [];
169
+ let confidence = 0;
170
+ let reason = 'unresolved';
171
+ // Strategy 1: Local function in same file (with nested function awareness)
172
+ const localMatch = this.findLocalFunction(call, file, callerId);
173
+ if (localMatch) {
174
+ candidates.push(localMatch);
175
+ confidence = 0.95;
176
+ reason = 'local-function';
177
+ }
178
+ // Strategy 2: Method on known class
179
+ if (candidates.length === 0 && call.receiver) {
180
+ const methodMatches = this.findMethodByReceiver(call, file, imports);
181
+ if (methodMatches.length > 0) {
182
+ candidates.push(...methodMatches);
183
+ confidence = methodMatches.length === 1 ? 0.85 : 0.6;
184
+ reason = methodMatches.length === 1 ? 'method-single' : 'method-multiple';
185
+ }
186
+ }
187
+ // Strategy 3: Dependency Injection patterns
188
+ if (candidates.length === 0) {
189
+ const diMatch = this.resolveDependencyInjection(call, file, imports);
190
+ if (diMatch.length > 0) {
191
+ candidates.push(...diMatch);
192
+ confidence = diMatch.length === 1 ? 0.9 : 0.7;
193
+ reason = 'dependency-injection';
194
+ }
195
+ }
196
+ // Strategy 4: Imported function
197
+ if (candidates.length === 0) {
198
+ const importMatch = this.findImportedFunction(call, imports);
199
+ if (importMatch) {
200
+ candidates.push(importMatch);
201
+ confidence = 0.8;
202
+ reason = 'imported';
203
+ }
204
+ }
205
+ // Strategy 5: Fuzzy match by name
206
+ if (candidates.length === 0) {
207
+ const fuzzyMatches = this.findByName(call.calleeName);
208
+ if (fuzzyMatches.length > 0) {
209
+ candidates.push(...fuzzyMatches.slice(0, 3)); // Limit to top 3
210
+ confidence = fuzzyMatches.length === 1 ? 0.5 : 0.3;
211
+ reason = 'fuzzy-match';
212
+ }
213
+ }
214
+ return {
215
+ resolved: candidates.length > 0,
216
+ candidates,
217
+ confidence,
218
+ reason,
219
+ };
220
+ }
221
+ /**
222
+ * Resolve Dependency Injection patterns
223
+ * Handles: FastAPI Depends(), Flask inject, Spring @Autowired, etc.
224
+ */
225
+ resolveDependencyInjection(call, _file, _imports) {
226
+ const matches = [];
227
+ // Pattern 1: FastAPI Depends(function_name)
228
+ // The call looks like: Depends(get_current_user)
229
+ if (call.calleeName === 'Depends' && call.fullExpression) {
230
+ const dependsMatch = call.fullExpression.match(/Depends\s*\(\s*([a-zA-Z_][a-zA-Z0-9_]*)/);
231
+ if (dependsMatch) {
232
+ const depFuncName = dependsMatch[1];
233
+ // Find the function being depended on
234
+ for (const [id, func] of this.functions) {
235
+ if (func.name === depFuncName) {
236
+ matches.push(id);
237
+ }
238
+ }
239
+ }
240
+ }
241
+ // Pattern 2: Function parameter with type hint that matches a class
242
+ // e.g., def route(user: User = Depends(get_user))
243
+ // The actual dependency is get_user, which we handle above
244
+ // Pattern 3: Direct function reference passed as argument
245
+ // e.g., app.add_middleware(AuthMiddleware)
246
+ if (call.isConstructorCall || /^[A-Z]/.test(call.calleeName)) {
247
+ // This might be a class being instantiated for DI
248
+ for (const [id, func] of this.functions) {
249
+ if (func.className === call.calleeName && func.isConstructor) {
250
+ matches.push(id);
251
+ }
252
+ }
253
+ }
254
+ // Pattern 4: Service locator pattern
255
+ // e.g., container.get(UserService), injector.get('user_service')
256
+ if (call.calleeName === 'get' && call.receiver) {
257
+ const containerPatterns = ['container', 'injector', 'locator', 'provider', 'services'];
258
+ if (containerPatterns.some(p => call.receiver.toLowerCase().includes(p))) {
259
+ // Try to find the service being requested
260
+ // This is heuristic - we look for classes/functions matching the argument
261
+ for (const [id, func] of this.functions) {
262
+ if (func.className && call.fullExpression.includes(func.className)) {
263
+ matches.push(id);
264
+ }
265
+ }
266
+ }
267
+ }
268
+ // Pattern 5: Decorator-based injection
269
+ // Functions with @inject, @autowired decorators are called by the framework
270
+ // We handle this in entry point detection, but also track the injected function
271
+ return matches;
272
+ }
273
+ /**
274
+ * Find a local function in the same file
275
+ * Prioritizes nested functions within the caller's scope
276
+ */
277
+ findLocalFunction(call, file, callerId) {
278
+ // For method calls on self/this, look for method in same class
279
+ if (call.receiver === 'self' || call.receiver === 'this') {
280
+ // Find the class context from the containing function
281
+ for (const [id, func] of this.functions) {
282
+ if (func.file === file && func.name === call.calleeName && func.className) {
283
+ return id;
284
+ }
285
+ }
286
+ }
287
+ // If we have a caller, first look for nested functions within that caller's scope
288
+ if (callerId) {
289
+ const caller = this.functions.get(callerId);
290
+ if (caller) {
291
+ // Look for a nested function with qualifiedName like "ParentFunc.childFunc"
292
+ const nestedQualifiedName = `${caller.qualifiedName}.${call.calleeName}`;
293
+ for (const [id, func] of this.functions) {
294
+ if (func.file === file && func.qualifiedName === nestedQualifiedName) {
295
+ return id;
296
+ }
297
+ }
298
+ // Also check if the caller is itself nested and look for sibling functions
299
+ // e.g., if caller is "Parent.child1", look for "Parent.child2"
300
+ const callerParts = caller.qualifiedName.split('.');
301
+ if (callerParts.length > 1) {
302
+ const parentName = callerParts.slice(0, -1).join('.');
303
+ const siblingQualifiedName = `${parentName}.${call.calleeName}`;
304
+ for (const [id, func] of this.functions) {
305
+ if (func.file === file && func.qualifiedName === siblingQualifiedName) {
306
+ return id;
307
+ }
308
+ }
309
+ }
310
+ }
311
+ }
312
+ // Direct function call - find top-level function
313
+ for (const [id, func] of this.functions) {
314
+ if (func.file === file && func.name === call.calleeName && !func.className) {
315
+ // Prefer non-nested functions (no dots in qualifiedName except for class methods)
316
+ if (!func.qualifiedName.includes('.') || func.className) {
317
+ return id;
318
+ }
319
+ }
320
+ }
321
+ // Fallback: any function with matching name in the file
322
+ for (const [id, func] of this.functions) {
323
+ if (func.file === file && func.name === call.calleeName && !func.className) {
324
+ return id;
325
+ }
326
+ }
327
+ return null;
328
+ }
329
+ /**
330
+ * Find method by receiver type
331
+ */
332
+ findMethodByReceiver(call, file, imports) {
333
+ const matches = [];
334
+ // Try to resolve receiver to a class
335
+ const receiverClass = this.resolveReceiverType(call.receiver, file, imports);
336
+ if (receiverClass) {
337
+ // Find method in that class
338
+ for (const [id, func] of this.functions) {
339
+ if (func.className === receiverClass && func.name === call.calleeName) {
340
+ matches.push(id);
341
+ }
342
+ }
343
+ }
344
+ // If no specific class found, find all methods with this name
345
+ if (matches.length === 0) {
346
+ for (const [id, func] of this.functions) {
347
+ if (func.name === call.calleeName && func.className) {
348
+ matches.push(id);
349
+ }
350
+ }
351
+ }
352
+ return matches;
353
+ }
354
+ /**
355
+ * Try to resolve a receiver to a class name
356
+ */
357
+ resolveReceiverType(receiver, _file, _imports) {
358
+ // Simple heuristics:
359
+ // - If receiver is PascalCase, it might be a class name
360
+ if (/^[A-Z][a-zA-Z0-9]*$/.test(receiver)) {
361
+ return receiver;
362
+ }
363
+ // - Common patterns like user_service -> UserService
364
+ const camelCase = receiver
365
+ .split('_')
366
+ .map((part) => part.charAt(0).toUpperCase() + part.slice(1))
367
+ .join('');
368
+ if (this.classExists(camelCase)) {
369
+ return camelCase;
370
+ }
371
+ return null;
372
+ }
373
+ /**
374
+ * Check if a class exists
375
+ */
376
+ classExists(name) {
377
+ for (const [, cls] of this.classes) {
378
+ if (cls.name === name)
379
+ return true;
380
+ }
381
+ return false;
382
+ }
383
+ /**
384
+ * Find an imported function
385
+ */
386
+ findImportedFunction(call, imports) {
387
+ // Check if the callee name matches an import
388
+ for (const imp of imports) {
389
+ for (const name of imp.names) {
390
+ if (name.local === call.calleeName || name.imported === call.calleeName) {
391
+ // Try to find the function in the imported module
392
+ // This is simplified - real implementation would resolve paths
393
+ for (const [id, func] of this.functions) {
394
+ if (func.name === name.imported && func.isExported) {
395
+ return id;
396
+ }
397
+ }
398
+ }
399
+ }
400
+ }
401
+ return null;
402
+ }
403
+ /**
404
+ * Find functions by name (fuzzy match)
405
+ */
406
+ findByName(name) {
407
+ const matches = [];
408
+ for (const [id, func] of this.functions) {
409
+ if (func.name === name) {
410
+ matches.push(id);
411
+ }
412
+ }
413
+ return matches;
414
+ }
415
+ /**
416
+ * Create a CallSite from extraction and resolution
417
+ */
418
+ createCallSite(call, file, callerId, resolved) {
419
+ return {
420
+ callerId,
421
+ calleeId: resolved.candidates[0] ?? null,
422
+ calleeName: call.calleeName,
423
+ receiver: call.receiver,
424
+ file,
425
+ line: call.line,
426
+ column: call.column,
427
+ resolved: resolved.resolved,
428
+ resolvedCandidates: resolved.candidates,
429
+ confidence: resolved.confidence,
430
+ resolutionReason: resolved.reason,
431
+ argumentCount: call.argumentCount,
432
+ };
433
+ }
434
+ /**
435
+ * Associate data access points with functions
436
+ */
437
+ associateDataAccess() {
438
+ for (const [file, accessPoints] of this.dataAccessPoints) {
439
+ for (const access of accessPoints) {
440
+ // Find the function containing this access
441
+ const containingFunc = this.findFunctionAtLine(file, access.line);
442
+ if (containingFunc) {
443
+ containingFunc.dataAccess.push(access);
444
+ }
445
+ }
446
+ }
447
+ }
448
+ /**
449
+ * Find function at a specific line
450
+ */
451
+ findFunctionAtLine(file, line) {
452
+ let best = null;
453
+ let bestSize = Infinity;
454
+ for (const [, func] of this.functions) {
455
+ if (func.file === file && line >= func.startLine && line <= func.endLine) {
456
+ const size = func.endLine - func.startLine;
457
+ if (size < bestSize) {
458
+ best = func;
459
+ bestSize = size;
460
+ }
461
+ }
462
+ }
463
+ return best;
464
+ }
465
+ /**
466
+ * Identify entry points (exported functions, API handlers, main)
467
+ *
468
+ * Entry points are functions that can be called from outside the codebase:
469
+ * - Exported module functions
470
+ * - API route handlers (detected by decorators/attributes)
471
+ * - Main/entry functions
472
+ * - Controller methods in web frameworks
473
+ */
474
+ identifyEntryPoints() {
475
+ const entryPoints = [];
476
+ for (const [id, func] of this.functions) {
477
+ // Exported functions (not class methods)
478
+ if (func.isExported && !func.className) {
479
+ entryPoints.push(id);
480
+ continue;
481
+ }
482
+ // Check decorators/attributes for API route patterns
483
+ if (this.isApiRouteHandler(func)) {
484
+ entryPoints.push(id);
485
+ continue;
486
+ }
487
+ // Check if this is a controller method (PHP Laravel, etc.)
488
+ if (this.isControllerMethod(func)) {
489
+ entryPoints.push(id);
490
+ continue;
491
+ }
492
+ // Main functions
493
+ if (func.name === 'main' || func.name === '__main__') {
494
+ entryPoints.push(id);
495
+ }
496
+ }
497
+ return entryPoints;
498
+ }
499
+ /**
500
+ * Check if a function is an API route handler based on decorators/attributes
501
+ */
502
+ isApiRouteHandler(func) {
503
+ if (func.decorators.length === 0)
504
+ return false;
505
+ // Python/FastAPI/Flask patterns
506
+ const pythonRoutePatterns = [
507
+ '@app.route', '@router.', '@app.get', '@app.post', '@app.put', '@app.delete', '@app.patch',
508
+ '@blueprint.route', '@api.route',
509
+ ];
510
+ // Java Spring patterns
511
+ const javaRoutePatterns = [
512
+ '@GetMapping', '@PostMapping', '@PutMapping', '@DeleteMapping', '@PatchMapping',
513
+ '@RequestMapping', '@RestController',
514
+ ];
515
+ // C# ASP.NET patterns (attributes use square brackets)
516
+ const csharpRoutePatterns = [
517
+ '[HttpGet', '[HttpPost', '[HttpPut', '[HttpDelete', '[HttpPatch',
518
+ '[Route', '[ApiController',
519
+ ];
520
+ // TypeScript/NestJS patterns
521
+ const nestjsPatterns = [
522
+ '@Get', '@Post', '@Put', '@Delete', '@Patch', '@Controller',
523
+ ];
524
+ const allPatterns = [
525
+ ...pythonRoutePatterns,
526
+ ...javaRoutePatterns,
527
+ ...csharpRoutePatterns,
528
+ ...nestjsPatterns,
529
+ ];
530
+ return func.decorators.some((d) => allPatterns.some((pattern) => d.includes(pattern)));
531
+ }
532
+ /**
533
+ * Check if a function is a controller method (for frameworks without decorators)
534
+ *
535
+ * This handles:
536
+ * - PHP Laravel controllers (public methods in classes extending Controller)
537
+ * - Ruby Rails controllers
538
+ * - Other MVC frameworks
539
+ */
540
+ isControllerMethod(func) {
541
+ // Must be a public method in a class
542
+ if (!func.className || !func.isExported)
543
+ return false;
544
+ // Check if the class name suggests it's a controller
545
+ const controllerPatterns = [
546
+ /Controller$/i,
547
+ /Handler$/i,
548
+ /Resource$/i, // Laravel API Resources
549
+ /Endpoint$/i,
550
+ ];
551
+ const isControllerClass = controllerPatterns.some(pattern => pattern.test(func.className));
552
+ if (!isControllerClass)
553
+ return false;
554
+ // Exclude common non-route methods
555
+ const excludedMethods = [
556
+ 'constructor', '__construct', '__destruct',
557
+ 'middleware', 'authorize', 'rules', 'messages',
558
+ 'boot', 'register', 'handle',
559
+ ];
560
+ if (excludedMethods.includes(func.name.toLowerCase()))
561
+ return false;
562
+ // For PHP, check if it's a standard CRUD method or custom action
563
+ // Laravel convention: index, show, store, update, destroy, create, edit
564
+ const laravelCrudMethods = ['index', 'show', 'store', 'update', 'destroy', 'create', 'edit'];
565
+ // If it's a Laravel CRUD method, it's definitely an entry point
566
+ if (func.language === 'php' && laravelCrudMethods.includes(func.name.toLowerCase())) {
567
+ return true;
568
+ }
569
+ // For other public methods in controllers, they're likely entry points
570
+ // This is a heuristic - in real apps, routes are defined in route files
571
+ return true;
572
+ }
573
+ /**
574
+ * Identify functions with direct data access
575
+ */
576
+ identifyDataAccessors() {
577
+ const accessors = [];
578
+ for (const [id, func] of this.functions) {
579
+ if (func.dataAccess.length > 0) {
580
+ accessors.push(id);
581
+ }
582
+ }
583
+ return accessors;
584
+ }
585
+ /**
586
+ * Calculate graph statistics
587
+ */
588
+ calculateStats() {
589
+ let totalCallSites = 0;
590
+ let resolvedCallSites = 0;
591
+ const byLanguage = {
592
+ python: 0,
593
+ typescript: 0,
594
+ javascript: 0,
595
+ java: 0,
596
+ csharp: 0,
597
+ php: 0,
598
+ };
599
+ for (const [, func] of this.functions) {
600
+ byLanguage[func.language]++;
601
+ for (const call of func.calls) {
602
+ totalCallSites++;
603
+ if (call.resolved) {
604
+ resolvedCallSites++;
605
+ }
606
+ }
607
+ }
608
+ return {
609
+ totalFunctions: this.functions.size,
610
+ totalCallSites,
611
+ resolvedCallSites,
612
+ unresolvedCallSites: totalCallSites - resolvedCallSites,
613
+ totalDataAccessors: this.identifyDataAccessors().length,
614
+ byLanguage,
615
+ };
616
+ }
617
+ /**
618
+ * Generate a unique function ID
619
+ */
620
+ generateFunctionId(file, qualifiedName, line) {
621
+ return `${file}:${qualifiedName}:${line}`;
622
+ }
623
+ }
624
+ //# sourceMappingURL=graph-builder.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"graph-builder.js","sourceRoot":"","sources":["../../../src/call-graph/analysis/graph-builder.ts"],"names":[],"mappings":"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"}