driftdetect-core 0.4.1 → 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 +4 -2
@@ -0,0 +1,357 @@
1
+ /**
2
+ * Reachability Analysis Engine
3
+ *
4
+ * Answers the core question: "What data can this line of code ultimately access?"
5
+ * Uses BFS traversal through the call graph to find all reachable data access points.
6
+ */
7
+ /**
8
+ * Reachability Analysis Engine
9
+ */
10
+ export class ReachabilityEngine {
11
+ graph;
12
+ constructor(graph) {
13
+ this.graph = graph;
14
+ }
15
+ /**
16
+ * Get all data reachable from a specific code location
17
+ */
18
+ getReachableData(file, line, options = {}) {
19
+ // Find the containing function
20
+ const func = this.findContainingFunction(file, line);
21
+ if (!func) {
22
+ return this.createEmptyResult({ file, line });
23
+ }
24
+ return this.getReachableDataFromFunction(func.id, options);
25
+ }
26
+ /**
27
+ * Get all data reachable from a function
28
+ */
29
+ getReachableDataFromFunction(functionId, options = {}) {
30
+ const func = this.graph.functions.get(functionId);
31
+ if (!func) {
32
+ return this.createEmptyResult({ file: '', line: 0, functionId });
33
+ }
34
+ const { maxDepth = Infinity, sensitiveOnly = false, tables = [], includeUnresolved = false, } = options;
35
+ const visited = new Set();
36
+ const reachableAccess = [];
37
+ const queue = [];
38
+ // Start BFS from the given function
39
+ queue.push({
40
+ funcId: functionId,
41
+ path: [],
42
+ depth: 0,
43
+ });
44
+ while (queue.length > 0) {
45
+ const current = queue.shift();
46
+ const { funcId, path, depth } = current;
47
+ if (visited.has(funcId) || depth > maxDepth) {
48
+ continue;
49
+ }
50
+ visited.add(funcId);
51
+ const currentFunc = this.graph.functions.get(funcId);
52
+ if (!currentFunc)
53
+ continue;
54
+ // Build current path
55
+ const currentPath = [
56
+ ...path,
57
+ {
58
+ functionId: funcId,
59
+ functionName: currentFunc.qualifiedName,
60
+ file: currentFunc.file,
61
+ line: currentFunc.startLine,
62
+ },
63
+ ];
64
+ // Collect data access from this function
65
+ for (const access of currentFunc.dataAccess) {
66
+ // Filter by tables if specified
67
+ if (tables.length > 0 && !tables.includes(access.table)) {
68
+ continue;
69
+ }
70
+ reachableAccess.push({
71
+ access,
72
+ path: currentPath,
73
+ depth,
74
+ });
75
+ }
76
+ // Follow calls to other functions
77
+ for (const call of currentFunc.calls) {
78
+ if (!call.resolved && !includeUnresolved) {
79
+ continue;
80
+ }
81
+ // Add all resolved candidates to the queue
82
+ for (const candidateId of call.resolvedCandidates) {
83
+ if (!visited.has(candidateId)) {
84
+ queue.push({
85
+ funcId: candidateId,
86
+ path: currentPath,
87
+ depth: depth + 1,
88
+ });
89
+ }
90
+ }
91
+ }
92
+ }
93
+ // Build result
94
+ return this.buildResult({ file: func.file, line: func.startLine, functionId }, reachableAccess, sensitiveOnly);
95
+ }
96
+ /**
97
+ * Get the call path from a location to a specific data access point
98
+ */
99
+ getCallPath(from, toTable, toField) {
100
+ const result = this.getReachableData(from.file, from.line, {
101
+ tables: [toTable],
102
+ });
103
+ const paths = [];
104
+ for (const access of result.reachableAccess) {
105
+ // If field specified, filter by field
106
+ if (toField && !access.access.fields.includes(toField)) {
107
+ continue;
108
+ }
109
+ paths.push(access.path);
110
+ }
111
+ return paths;
112
+ }
113
+ /**
114
+ * Inverse query: "Who can reach this data?"
115
+ * Find all code paths that can access a specific table/field
116
+ */
117
+ getCodePathsToData(options) {
118
+ const { table, field, maxDepth = Infinity } = options;
119
+ // Find all functions that directly access this table
120
+ const directAccessors = [];
121
+ for (const funcId of this.graph.dataAccessors) {
122
+ const func = this.graph.functions.get(funcId);
123
+ if (!func)
124
+ continue;
125
+ for (const access of func.dataAccess) {
126
+ if (access.table === table) {
127
+ if (!field || access.fields.includes(field)) {
128
+ directAccessors.push(funcId);
129
+ break;
130
+ }
131
+ }
132
+ }
133
+ }
134
+ // For each direct accessor, find all paths from entry points
135
+ const accessPaths = [];
136
+ const reachingEntryPoints = new Set();
137
+ for (const accessorId of directAccessors) {
138
+ const accessor = this.graph.functions.get(accessorId);
139
+ if (!accessor)
140
+ continue;
141
+ // Find the specific access point
142
+ const accessPoint = accessor.dataAccess.find((a) => a.table === table && (!field || a.fields.includes(field)));
143
+ if (!accessPoint)
144
+ continue;
145
+ // BFS backwards from accessor to find entry points
146
+ const pathsToAccessor = this.findPathsToFunction(accessorId, maxDepth);
147
+ for (const { entryPoint, path } of pathsToAccessor) {
148
+ reachingEntryPoints.add(entryPoint);
149
+ accessPaths.push({
150
+ entryPoint,
151
+ path,
152
+ accessPoint,
153
+ });
154
+ }
155
+ }
156
+ return {
157
+ target: { table, field: field ?? undefined },
158
+ accessPaths,
159
+ entryPoints: Array.from(reachingEntryPoints),
160
+ totalAccessors: directAccessors.length,
161
+ };
162
+ }
163
+ /**
164
+ * Find all paths from entry points to a specific function
165
+ */
166
+ findPathsToFunction(targetId, maxDepth) {
167
+ const results = [];
168
+ // For each entry point, try to find a path to the target
169
+ for (const entryPointId of this.graph.entryPoints) {
170
+ const paths = this.findPathsBFS(entryPointId, targetId, maxDepth);
171
+ for (const path of paths) {
172
+ results.push({
173
+ entryPoint: entryPointId,
174
+ path,
175
+ });
176
+ }
177
+ }
178
+ return results;
179
+ }
180
+ /**
181
+ * BFS to find paths between two functions
182
+ */
183
+ findPathsBFS(fromId, toId, maxDepth) {
184
+ const paths = [];
185
+ const queue = [];
186
+ const visited = new Map(); // Track minimum depth to reach each node
187
+ const fromFunc = this.graph.functions.get(fromId);
188
+ if (!fromFunc)
189
+ return paths;
190
+ queue.push({
191
+ funcId: fromId,
192
+ path: [{
193
+ functionId: fromId,
194
+ functionName: fromFunc.qualifiedName,
195
+ file: fromFunc.file,
196
+ line: fromFunc.startLine,
197
+ }],
198
+ depth: 0,
199
+ });
200
+ while (queue.length > 0) {
201
+ const current = queue.shift();
202
+ const { funcId, path, depth } = current;
203
+ if (depth > maxDepth)
204
+ continue;
205
+ // Check if we've reached the target
206
+ if (funcId === toId) {
207
+ paths.push(path);
208
+ continue; // Don't stop - there might be other paths
209
+ }
210
+ // Skip if we've visited this node at a lower depth
211
+ const previousDepth = visited.get(funcId);
212
+ if (previousDepth !== undefined && previousDepth <= depth) {
213
+ continue;
214
+ }
215
+ visited.set(funcId, depth);
216
+ const currentFunc = this.graph.functions.get(funcId);
217
+ if (!currentFunc)
218
+ continue;
219
+ // Follow calls
220
+ for (const call of currentFunc.calls) {
221
+ if (!call.resolved)
222
+ continue;
223
+ for (const candidateId of call.resolvedCandidates) {
224
+ const candidate = this.graph.functions.get(candidateId);
225
+ if (!candidate)
226
+ continue;
227
+ queue.push({
228
+ funcId: candidateId,
229
+ path: [
230
+ ...path,
231
+ {
232
+ functionId: candidateId,
233
+ functionName: candidate.qualifiedName,
234
+ file: candidate.file,
235
+ line: candidate.startLine,
236
+ },
237
+ ],
238
+ depth: depth + 1,
239
+ });
240
+ }
241
+ }
242
+ }
243
+ return paths;
244
+ }
245
+ /**
246
+ * Find the function containing a specific line
247
+ */
248
+ findContainingFunction(file, line) {
249
+ let best = null;
250
+ let bestSize = Infinity;
251
+ for (const [, func] of this.graph.functions) {
252
+ if (func.file === file && line >= func.startLine && line <= func.endLine) {
253
+ const size = func.endLine - func.startLine;
254
+ if (size < bestSize) {
255
+ best = func;
256
+ bestSize = size;
257
+ }
258
+ }
259
+ }
260
+ return best;
261
+ }
262
+ /**
263
+ * Build the reachability result
264
+ */
265
+ buildResult(origin, reachableAccess, sensitiveOnly) {
266
+ // Collect unique tables
267
+ const tablesSet = new Set();
268
+ for (const access of reachableAccess) {
269
+ tablesSet.add(access.access.table);
270
+ }
271
+ // Group sensitive fields
272
+ const sensitiveFieldsMap = new Map();
273
+ for (const access of reachableAccess) {
274
+ // Check if any fields are sensitive (simplified - real impl would check against known sensitive fields)
275
+ const sensitivePatterns = [
276
+ 'password', 'secret', 'token', 'key', 'ssn', 'social_security',
277
+ 'credit_card', 'card_number', 'cvv', 'pin', 'dob', 'date_of_birth',
278
+ 'email', 'phone', 'address', 'salary', 'income',
279
+ ];
280
+ for (const field of access.access.fields) {
281
+ const fieldLower = field.toLowerCase();
282
+ const isSensitive = sensitivePatterns.some((p) => fieldLower.includes(p));
283
+ if (isSensitive) {
284
+ const key = `${access.access.table}.${field}`;
285
+ const existing = sensitiveFieldsMap.get(key);
286
+ if (existing) {
287
+ existing.paths.push(access.path);
288
+ existing.accessCount++;
289
+ }
290
+ else {
291
+ sensitiveFieldsMap.set(key, {
292
+ field: {
293
+ field,
294
+ table: access.access.table,
295
+ sensitivityType: this.classifySensitivity(field),
296
+ file: access.access.file,
297
+ line: access.access.line,
298
+ confidence: 0.8,
299
+ },
300
+ paths: [access.path],
301
+ accessCount: 1,
302
+ });
303
+ }
304
+ }
305
+ }
306
+ }
307
+ // Filter if sensitiveOnly
308
+ let filteredAccess = reachableAccess;
309
+ if (sensitiveOnly) {
310
+ const sensitiveKeys = new Set(sensitiveFieldsMap.keys());
311
+ filteredAccess = reachableAccess.filter((a) => a.access.fields.some((f) => sensitiveKeys.has(`${a.access.table}.${f}`)));
312
+ }
313
+ // Calculate max depth
314
+ const maxDepth = filteredAccess.reduce((max, a) => Math.max(max, a.depth), 0);
315
+ return {
316
+ origin,
317
+ reachableAccess: filteredAccess,
318
+ tables: Array.from(tablesSet),
319
+ sensitiveFields: Array.from(sensitiveFieldsMap.values()),
320
+ maxDepth,
321
+ functionsTraversed: new Set(filteredAccess.flatMap((a) => a.path.map((p) => p.functionId))).size,
322
+ };
323
+ }
324
+ /**
325
+ * Classify sensitivity type based on field name
326
+ */
327
+ classifySensitivity(field) {
328
+ const fieldLower = field.toLowerCase();
329
+ if (['password', 'secret', 'token', 'key', 'api_key', 'auth'].some((p) => fieldLower.includes(p))) {
330
+ return 'credentials';
331
+ }
332
+ if (['credit_card', 'card_number', 'cvv', 'account_number', 'salary', 'income', 'bank'].some((p) => fieldLower.includes(p))) {
333
+ return 'financial';
334
+ }
335
+ if (['diagnosis', 'medical', 'health', 'prescription', 'condition'].some((p) => fieldLower.includes(p))) {
336
+ return 'health';
337
+ }
338
+ if (['ssn', 'social_security', 'email', 'phone', 'address', 'dob', 'name', 'birth'].some((p) => fieldLower.includes(p))) {
339
+ return 'pii';
340
+ }
341
+ return 'unknown';
342
+ }
343
+ /**
344
+ * Create an empty result
345
+ */
346
+ createEmptyResult(origin) {
347
+ return {
348
+ origin,
349
+ reachableAccess: [],
350
+ tables: [],
351
+ sensitiveFields: [],
352
+ maxDepth: 0,
353
+ functionsTraversed: 0,
354
+ };
355
+ }
356
+ }
357
+ //# sourceMappingURL=reachability.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reachability.js","sourceRoot":"","sources":["../../../src/call-graph/analysis/reachability.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Call Graph Demo Script
4
+ *
5
+ * Demonstrates the call-graph system's capabilities on a real Python codebase.
6
+ * Shows: extraction, graph building, reachability analysis, and data flow mapping.
7
+ *
8
+ * Run: node drift/packages/core/dist/call-graph/demo.js
9
+ */
10
+ export {};
11
+ //# sourceMappingURL=demo.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"demo.d.ts","sourceRoot":"","sources":["../../src/call-graph/demo.ts"],"names":[],"mappings":";AACA;;;;;;;GAOG"}