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,466 @@
1
+ /**
2
+ * Call Graph Shard Store
3
+ *
4
+ * Manages sharded call graph storage - one file per source file.
5
+ * This allows loading only the call graph data you need.
6
+ *
7
+ * Storage structure:
8
+ * .drift/lake/callgraph/
9
+ * ├── index.json # Call graph summary index
10
+ * ├── entry-points.json # API entry points
11
+ * └── files/
12
+ * ├── {file-hash}.json # Functions in each source file
13
+ * └── ...
14
+ *
15
+ * Key features:
16
+ * - Load call graph by file (not all at once)
17
+ * - Pre-computed entry points
18
+ * - Incremental updates per file
19
+ */
20
+ import * as fs from 'node:fs/promises';
21
+ import * as path from 'node:path';
22
+ import * as crypto from 'node:crypto';
23
+ import { EventEmitter } from 'node:events';
24
+ import { LAKE_DIRS, DEFAULT_DATA_LAKE_CONFIG, } from './types.js';
25
+ // ============================================================================
26
+ // Constants
27
+ // ============================================================================
28
+ const CALLGRAPH_DIR = 'callgraph';
29
+ const FILES_SUBDIR = 'files';
30
+ const INDEX_FILE = 'index.json';
31
+ const ENTRY_POINTS_FILE = 'entry-points.json';
32
+ const STORE_VERSION = '1.0.0';
33
+ // ============================================================================
34
+ // Helper Functions
35
+ // ============================================================================
36
+ async function fileExists(filePath) {
37
+ try {
38
+ await fs.access(filePath);
39
+ return true;
40
+ }
41
+ catch {
42
+ return false;
43
+ }
44
+ }
45
+ async function ensureDir(dirPath) {
46
+ await fs.mkdir(dirPath, { recursive: true });
47
+ }
48
+ function generateChecksum(data) {
49
+ const content = JSON.stringify(data);
50
+ return crypto.createHash('sha256').update(content).digest('hex').slice(0, 16);
51
+ }
52
+ function hashFilePath(file) {
53
+ return crypto.createHash('sha256').update(file).digest('hex').slice(0, 12);
54
+ }
55
+ // ============================================================================
56
+ // Call Graph Shard Store Class
57
+ // ============================================================================
58
+ export class CallGraphShardStore extends EventEmitter {
59
+ config;
60
+ callgraphDir;
61
+ filesDir;
62
+ // In-memory cache
63
+ indexCache = null;
64
+ entryPointsCache = null;
65
+ fileCache = new Map();
66
+ constructor(config = {}) {
67
+ super();
68
+ this.config = { ...DEFAULT_DATA_LAKE_CONFIG, ...config };
69
+ this.callgraphDir = path.join(this.config.rootDir, LAKE_DIRS.root, LAKE_DIRS.lake, CALLGRAPH_DIR);
70
+ this.filesDir = path.join(this.callgraphDir, FILES_SUBDIR);
71
+ }
72
+ // ==========================================================================
73
+ // Initialization
74
+ // ==========================================================================
75
+ async initialize() {
76
+ await ensureDir(this.callgraphDir);
77
+ await ensureDir(this.filesDir);
78
+ }
79
+ // ==========================================================================
80
+ // Index Operations
81
+ // ==========================================================================
82
+ /**
83
+ * Get the call graph index
84
+ */
85
+ async getIndex() {
86
+ if (this.indexCache) {
87
+ return this.indexCache;
88
+ }
89
+ const indexPath = path.join(this.callgraphDir, INDEX_FILE);
90
+ if (!(await fileExists(indexPath))) {
91
+ return null;
92
+ }
93
+ try {
94
+ const content = await fs.readFile(indexPath, 'utf-8');
95
+ this.indexCache = JSON.parse(content);
96
+ return this.indexCache;
97
+ }
98
+ catch {
99
+ return null;
100
+ }
101
+ }
102
+ /**
103
+ * Save the call graph index
104
+ */
105
+ async saveIndex(index) {
106
+ await ensureDir(this.callgraphDir);
107
+ const indexPath = path.join(this.callgraphDir, INDEX_FILE);
108
+ await fs.writeFile(indexPath, JSON.stringify(index, null, 2));
109
+ this.indexCache = index;
110
+ this.emit('index:saved');
111
+ }
112
+ /**
113
+ * Build call graph index from file shards
114
+ */
115
+ async buildIndex() {
116
+ const fileHashes = await this.listFiles();
117
+ const fileEntries = [];
118
+ const entryPoints = [];
119
+ const dataAccessors = [];
120
+ let totalFunctions = 0;
121
+ let totalCalls = 0;
122
+ let totalEntryPoints = 0;
123
+ let totalDataAccessors = 0;
124
+ let totalDepth = 0;
125
+ for (const fileHash of fileHashes) {
126
+ const shard = await this.getFileShard(fileHash);
127
+ if (!shard)
128
+ continue;
129
+ const entryPointCount = shard.functions.filter(f => f.isEntryPoint).length;
130
+ const dataAccessorCount = shard.functions.filter(f => f.isDataAccessor).length;
131
+ const callCount = shard.functions.reduce((sum, f) => sum + f.calls.length, 0);
132
+ totalFunctions += shard.functions.length;
133
+ totalCalls += callCount;
134
+ totalEntryPoints += entryPointCount;
135
+ totalDataAccessors += dataAccessorCount;
136
+ fileEntries.push({
137
+ file: shard.file,
138
+ fileHash,
139
+ functionCount: shard.functions.length,
140
+ entryPointCount,
141
+ dataAccessorCount,
142
+ lastUpdated: new Date().toISOString(),
143
+ });
144
+ // Collect entry points
145
+ for (const fn of shard.functions.filter(f => f.isEntryPoint)) {
146
+ entryPoints.push({
147
+ id: fn.id,
148
+ name: fn.name,
149
+ file: shard.file,
150
+ line: fn.startLine,
151
+ reachableFunctions: 0, // Would need full graph traversal
152
+ reachableTables: fn.dataAccess.length,
153
+ });
154
+ }
155
+ // Collect data accessors
156
+ for (const fn of shard.functions.filter(f => f.isDataAccessor)) {
157
+ const tables = [...new Set(fn.dataAccess.map(da => da.table))];
158
+ const operations = [...new Set(fn.dataAccess.map(da => da.operation))];
159
+ dataAccessors.push({
160
+ id: fn.id,
161
+ name: fn.name,
162
+ file: shard.file,
163
+ line: fn.startLine,
164
+ tables,
165
+ operations,
166
+ });
167
+ }
168
+ }
169
+ // Calculate average depth (simplified)
170
+ const avgDepth = totalFunctions > 0 ? totalCalls / totalFunctions : 0;
171
+ totalDepth = avgDepth;
172
+ // Sort and limit
173
+ entryPoints.sort((a, b) => b.reachableTables - a.reachableTables);
174
+ dataAccessors.sort((a, b) => b.tables.length - a.tables.length);
175
+ const index = {
176
+ version: STORE_VERSION,
177
+ generatedAt: new Date().toISOString(),
178
+ summary: {
179
+ totalFiles: fileEntries.length,
180
+ totalFunctions,
181
+ totalCalls,
182
+ entryPoints: totalEntryPoints,
183
+ dataAccessors: totalDataAccessors,
184
+ avgDepth: Math.round(totalDepth * 100) / 100,
185
+ },
186
+ files: fileEntries,
187
+ topEntryPoints: entryPoints.slice(0, 10),
188
+ topDataAccessors: dataAccessors.slice(0, 10),
189
+ };
190
+ await this.saveIndex(index);
191
+ return index;
192
+ }
193
+ // ==========================================================================
194
+ // File Shard Operations
195
+ // ==========================================================================
196
+ /**
197
+ * Get call graph data for a specific file
198
+ */
199
+ async getFileShard(fileHash) {
200
+ // Check cache first
201
+ const cached = this.fileCache.get(fileHash);
202
+ if (cached) {
203
+ return cached;
204
+ }
205
+ const filePath = path.join(this.filesDir, `${fileHash}.json`);
206
+ if (!(await fileExists(filePath))) {
207
+ return null;
208
+ }
209
+ try {
210
+ const content = await fs.readFile(filePath, 'utf-8');
211
+ const data = JSON.parse(content);
212
+ const shard = {
213
+ file: data.file,
214
+ functions: data.functions,
215
+ };
216
+ this.fileCache.set(fileHash, shard);
217
+ return shard;
218
+ }
219
+ catch {
220
+ return null;
221
+ }
222
+ }
223
+ /**
224
+ * Get call graph data for a file by path
225
+ */
226
+ async getFileShardByPath(file) {
227
+ const fileHash = hashFilePath(file);
228
+ return this.getFileShard(fileHash);
229
+ }
230
+ /**
231
+ * Save call graph data for a file
232
+ */
233
+ async saveFileShard(shard) {
234
+ await ensureDir(this.filesDir);
235
+ const fileHash = hashFilePath(shard.file);
236
+ const filePath = path.join(this.filesDir, `${fileHash}.json`);
237
+ const shardFile = {
238
+ version: STORE_VERSION,
239
+ generatedAt: new Date().toISOString(),
240
+ checksum: generateChecksum(shard.functions),
241
+ ...shard,
242
+ };
243
+ await fs.writeFile(filePath, JSON.stringify(shardFile, null, 2));
244
+ this.fileCache.set(fileHash, shard);
245
+ this.emit('file:saved', shard.file);
246
+ }
247
+ /**
248
+ * Get call graph data for multiple files
249
+ */
250
+ async getFileShards(fileHashes) {
251
+ const results = [];
252
+ const shards = await Promise.all(fileHashes.map(h => this.getFileShard(h)));
253
+ for (const shard of shards) {
254
+ if (shard) {
255
+ results.push(shard);
256
+ }
257
+ }
258
+ return results;
259
+ }
260
+ /**
261
+ * List all file hashes with call graph data
262
+ */
263
+ async listFiles() {
264
+ if (!(await fileExists(this.filesDir))) {
265
+ return [];
266
+ }
267
+ const files = await fs.readdir(this.filesDir);
268
+ return files
269
+ .filter(f => f.endsWith('.json'))
270
+ .map(f => f.replace('.json', ''));
271
+ }
272
+ /**
273
+ * Delete call graph data for a file
274
+ */
275
+ async deleteFileShard(fileHash) {
276
+ const filePath = path.join(this.filesDir, `${fileHash}.json`);
277
+ try {
278
+ await fs.unlink(filePath);
279
+ this.fileCache.delete(fileHash);
280
+ this.emit('file:deleted', fileHash);
281
+ }
282
+ catch {
283
+ // Ignore if doesn't exist
284
+ }
285
+ }
286
+ // ==========================================================================
287
+ // Entry Points Operations
288
+ // ==========================================================================
289
+ /**
290
+ * Get entry points data
291
+ */
292
+ async getEntryPoints() {
293
+ if (this.entryPointsCache) {
294
+ return this.entryPointsCache;
295
+ }
296
+ const filePath = path.join(this.callgraphDir, ENTRY_POINTS_FILE);
297
+ if (!(await fileExists(filePath))) {
298
+ return null;
299
+ }
300
+ try {
301
+ const content = await fs.readFile(filePath, 'utf-8');
302
+ this.entryPointsCache = JSON.parse(content);
303
+ return this.entryPointsCache;
304
+ }
305
+ catch {
306
+ return null;
307
+ }
308
+ }
309
+ /**
310
+ * Save entry points data
311
+ */
312
+ async saveEntryPoints(data) {
313
+ await ensureDir(this.callgraphDir);
314
+ const filePath = path.join(this.callgraphDir, ENTRY_POINTS_FILE);
315
+ await fs.writeFile(filePath, JSON.stringify(data, null, 2));
316
+ this.entryPointsCache = data;
317
+ this.emit('entrypoints:saved');
318
+ }
319
+ /**
320
+ * Build entry points from file shards
321
+ */
322
+ async buildEntryPoints() {
323
+ const fileHashes = await this.listFiles();
324
+ const entryPoints = [];
325
+ for (const fileHash of fileHashes) {
326
+ const shard = await this.getFileShard(fileHash);
327
+ if (!shard)
328
+ continue;
329
+ for (const fn of shard.functions.filter(f => f.isEntryPoint)) {
330
+ const tables = [...new Set(fn.dataAccess.map(da => da.table))];
331
+ const sensitiveFields = []; // Would need security data
332
+ entryPoints.push({
333
+ id: fn.id,
334
+ name: fn.name,
335
+ file: shard.file,
336
+ line: fn.startLine,
337
+ endLine: fn.endLine,
338
+ type: this.inferEntryPointType(fn.name, shard.file),
339
+ reachableFunctions: fn.calls,
340
+ reachableTables: tables,
341
+ reachableSensitiveFields: sensitiveFields,
342
+ });
343
+ }
344
+ }
345
+ const data = {
346
+ version: STORE_VERSION,
347
+ generatedAt: new Date().toISOString(),
348
+ entryPoints,
349
+ };
350
+ await this.saveEntryPoints(data);
351
+ return data;
352
+ }
353
+ // ==========================================================================
354
+ // Query Helpers
355
+ // ==========================================================================
356
+ /**
357
+ * Get function by ID
358
+ */
359
+ async getFunction(functionId) {
360
+ const fileHashes = await this.listFiles();
361
+ for (const fileHash of fileHashes) {
362
+ const shard = await this.getFileShard(fileHash);
363
+ if (!shard)
364
+ continue;
365
+ const fn = shard.functions.find(f => f.id === functionId);
366
+ if (fn)
367
+ return fn;
368
+ }
369
+ return null;
370
+ }
371
+ /**
372
+ * Get all functions that access a specific table
373
+ */
374
+ async getFunctionsByTable(table) {
375
+ const fileHashes = await this.listFiles();
376
+ const results = [];
377
+ for (const fileHash of fileHashes) {
378
+ const shard = await this.getFileShard(fileHash);
379
+ if (!shard)
380
+ continue;
381
+ for (const fn of shard.functions) {
382
+ if (fn.dataAccess.some(da => da.table === table)) {
383
+ results.push({ ...fn, file: shard.file });
384
+ }
385
+ }
386
+ }
387
+ return results;
388
+ }
389
+ /**
390
+ * Get all data access for a specific table
391
+ */
392
+ async getDataAccessByTable(table) {
393
+ const fileHashes = await this.listFiles();
394
+ const results = [];
395
+ for (const fileHash of fileHashes) {
396
+ const shard = await this.getFileShard(fileHash);
397
+ if (!shard)
398
+ continue;
399
+ for (const fn of shard.functions) {
400
+ for (const da of fn.dataAccess) {
401
+ if (da.table === table) {
402
+ results.push({ ...da, functionId: fn.id, file: shard.file });
403
+ }
404
+ }
405
+ }
406
+ }
407
+ return results;
408
+ }
409
+ // ==========================================================================
410
+ // Cache Management
411
+ // ==========================================================================
412
+ /**
413
+ * Invalidate caches
414
+ */
415
+ invalidateCache(fileHash) {
416
+ if (fileHash) {
417
+ this.fileCache.delete(fileHash);
418
+ }
419
+ else {
420
+ this.indexCache = null;
421
+ this.entryPointsCache = null;
422
+ this.fileCache.clear();
423
+ }
424
+ }
425
+ /**
426
+ * Get cache stats
427
+ */
428
+ getCacheStats() {
429
+ return {
430
+ cachedFiles: this.fileCache.size,
431
+ hasIndex: this.indexCache !== null,
432
+ hasEntryPoints: this.entryPointsCache !== null,
433
+ };
434
+ }
435
+ // ==========================================================================
436
+ // Private Helpers
437
+ // ==========================================================================
438
+ inferEntryPointType(name, file) {
439
+ const nameLower = name.toLowerCase();
440
+ const fileLower = file.toLowerCase();
441
+ if (fileLower.includes('controller'))
442
+ return 'controller';
443
+ if (fileLower.includes('route'))
444
+ return 'route';
445
+ if (fileLower.includes('handler'))
446
+ return 'handler';
447
+ if (fileLower.includes('api'))
448
+ return 'api';
449
+ if (nameLower.includes('handler'))
450
+ return 'handler';
451
+ if (nameLower.includes('controller'))
452
+ return 'controller';
453
+ if (nameLower.startsWith('get') || nameLower.startsWith('post') ||
454
+ nameLower.startsWith('put') || nameLower.startsWith('delete')) {
455
+ return 'api';
456
+ }
457
+ return 'other';
458
+ }
459
+ }
460
+ // ============================================================================
461
+ // Factory Function
462
+ // ============================================================================
463
+ export function createCallGraphShardStore(config = {}) {
464
+ return new CallGraphShardStore(config);
465
+ }
466
+ //# sourceMappingURL=callgraph-shard-store.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"callgraph-shard-store.js","sourceRoot":"","sources":["../../src/lake/callgraph-shard-store.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,127 @@
1
+ /**
2
+ * Examples Store
3
+ *
4
+ * Manages pre-extracted code examples for patterns.
5
+ * This allows drift_code_examples to return instantly without reading source files.
6
+ *
7
+ * Storage structure:
8
+ * .drift/lake/examples/
9
+ * ├── index.json # Example index (pattern -> file mapping)
10
+ * └── patterns/
11
+ * ├── {pattern-id}.json # Pre-extracted examples for each pattern
12
+ * └── ...
13
+ *
14
+ * Key features:
15
+ * - Pre-extracted code snippets with context
16
+ * - Quality scoring for example selection
17
+ * - Incremental updates per pattern
18
+ */
19
+ import { EventEmitter } from 'node:events';
20
+ import type { PatternExamples, DataLakeConfig } from './types.js';
21
+ import type { PatternCategory } from '../store/types.js';
22
+ export interface ExamplesIndex {
23
+ version: string;
24
+ generatedAt: string;
25
+ totalPatterns: number;
26
+ totalExamples: number;
27
+ patterns: ExampleIndexEntry[];
28
+ }
29
+ export interface ExampleIndexEntry {
30
+ patternId: string;
31
+ patternName: string;
32
+ category: PatternCategory;
33
+ exampleCount: number;
34
+ bestQuality: number;
35
+ lastUpdated: string;
36
+ }
37
+ export interface ExampleExtractionOptions {
38
+ /** Maximum examples per pattern */
39
+ maxExamples?: number;
40
+ /** Lines of context around each example */
41
+ contextLines?: number;
42
+ /** Minimum quality score to include */
43
+ minQuality?: number;
44
+ /** Include outlier examples */
45
+ includeOutliers?: boolean;
46
+ }
47
+ export declare class ExamplesStore extends EventEmitter {
48
+ private readonly config;
49
+ private readonly examplesDir;
50
+ private readonly patternsDir;
51
+ private indexCache;
52
+ private examplesCache;
53
+ constructor(config?: Partial<DataLakeConfig>);
54
+ initialize(): Promise<void>;
55
+ /**
56
+ * Get the examples index
57
+ */
58
+ getIndex(): Promise<ExamplesIndex | null>;
59
+ /**
60
+ * Save the examples index
61
+ */
62
+ saveIndex(index: ExamplesIndex): Promise<void>;
63
+ /**
64
+ * Build examples index from pattern examples
65
+ */
66
+ buildIndex(): Promise<ExamplesIndex>;
67
+ /**
68
+ * Get examples for a specific pattern
69
+ */
70
+ getPatternExamples(patternId: string): Promise<PatternExamples | null>;
71
+ /**
72
+ * Save examples for a pattern
73
+ */
74
+ savePatternExamples(examples: PatternExamples): Promise<void>;
75
+ /**
76
+ * Get examples for multiple patterns
77
+ */
78
+ getMultiplePatternExamples(patternIds: string[]): Promise<PatternExamples[]>;
79
+ /**
80
+ * Get examples by category
81
+ */
82
+ getExamplesByCategory(category: PatternCategory): Promise<PatternExamples[]>;
83
+ /**
84
+ * List all patterns with examples
85
+ */
86
+ listPatterns(): Promise<string[]>;
87
+ /**
88
+ * Delete examples for a pattern
89
+ */
90
+ deletePatternExamples(patternId: string): Promise<void>;
91
+ /**
92
+ * Extract examples from source code for a pattern
93
+ *
94
+ * This method reads source files and extracts code snippets with context.
95
+ * It's called during scan/materialize, not at query time.
96
+ */
97
+ extractExamples(patternId: string, patternName: string, category: PatternCategory, locations: Array<{
98
+ file: string;
99
+ line: number;
100
+ endLine?: number;
101
+ }>, outliers: Array<{
102
+ file: string;
103
+ line: number;
104
+ endLine?: number;
105
+ }>, options?: ExampleExtractionOptions): Promise<PatternExamples>;
106
+ /**
107
+ * Extract a single example from a source file
108
+ */
109
+ private extractSingleExample;
110
+ /**
111
+ * Calculate quality score for an example
112
+ */
113
+ private calculateExampleQuality;
114
+ /**
115
+ * Invalidate caches
116
+ */
117
+ invalidateCache(patternId?: string): void;
118
+ /**
119
+ * Get cache stats
120
+ */
121
+ getCacheStats(): {
122
+ cachedPatterns: number;
123
+ hasIndex: boolean;
124
+ };
125
+ }
126
+ export declare function createExamplesStore(config?: Partial<DataLakeConfig>): ExamplesStore;
127
+ //# sourceMappingURL=examples-store.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"examples-store.d.ts","sourceRoot":"","sources":["../../src/lake/examples-store.ts"],"names":[],"mappings":"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"}