driftdetect-core 0.4.0 → 0.4.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/boundaries/boundary-scanner.d.ts +76 -0
- package/dist/boundaries/boundary-scanner.d.ts.map +1 -0
- package/dist/boundaries/boundary-scanner.js +801 -0
- package/dist/boundaries/boundary-scanner.js.map +1 -0
- package/dist/boundaries/data-access-learner.d.ts +126 -0
- package/dist/boundaries/data-access-learner.d.ts.map +1 -0
- package/dist/boundaries/data-access-learner.js +486 -0
- package/dist/boundaries/data-access-learner.js.map +1 -0
- package/dist/boundaries/index.d.ts +6 -0
- package/dist/boundaries/index.d.ts.map +1 -1
- package/dist/boundaries/index.js +6 -0
- package/dist/boundaries/index.js.map +1 -1
- package/dist/boundaries/security-prioritizer.d.ts +118 -0
- package/dist/boundaries/security-prioritizer.d.ts.map +1 -0
- package/dist/boundaries/security-prioritizer.js +316 -0
- package/dist/boundaries/security-prioritizer.js.map +1 -0
- package/dist/call-graph/analysis/coverage-analyzer.d.ts +201 -0
- package/dist/call-graph/analysis/coverage-analyzer.d.ts.map +1 -0
- package/dist/call-graph/analysis/coverage-analyzer.js +553 -0
- package/dist/call-graph/analysis/coverage-analyzer.js.map +1 -0
- package/dist/call-graph/analysis/dead-code-detector.d.ts +145 -0
- package/dist/call-graph/analysis/dead-code-detector.d.ts.map +1 -0
- package/dist/call-graph/analysis/dead-code-detector.js +391 -0
- package/dist/call-graph/analysis/dead-code-detector.js.map +1 -0
- package/dist/call-graph/analysis/graph-builder.d.ts +142 -0
- package/dist/call-graph/analysis/graph-builder.d.ts.map +1 -0
- package/dist/call-graph/analysis/graph-builder.js +624 -0
- package/dist/call-graph/analysis/graph-builder.js.map +1 -0
- package/dist/call-graph/analysis/impact-analyzer.d.ts +150 -0
- package/dist/call-graph/analysis/impact-analyzer.d.ts.map +1 -0
- package/dist/call-graph/analysis/impact-analyzer.js +329 -0
- package/dist/call-graph/analysis/impact-analyzer.js.map +1 -0
- package/dist/call-graph/analysis/index.d.ts +11 -0
- package/dist/call-graph/analysis/index.d.ts.map +1 -0
- package/dist/call-graph/analysis/index.js +9 -0
- package/dist/call-graph/analysis/index.js.map +1 -0
- package/dist/call-graph/analysis/path-finder.d.ts +117 -0
- package/dist/call-graph/analysis/path-finder.d.ts.map +1 -0
- package/dist/call-graph/analysis/path-finder.js +360 -0
- package/dist/call-graph/analysis/path-finder.js.map +1 -0
- package/dist/call-graph/analysis/reachability.d.ts +56 -0
- package/dist/call-graph/analysis/reachability.d.ts.map +1 -0
- package/dist/call-graph/analysis/reachability.js +357 -0
- package/dist/call-graph/analysis/reachability.js.map +1 -0
- package/dist/call-graph/demo.d.ts +11 -0
- package/dist/call-graph/demo.d.ts.map +1 -0
- package/dist/call-graph/demo.js +339 -0
- package/dist/call-graph/demo.js.map +1 -0
- package/dist/call-graph/enrichment/enrichment-engine.d.ts +126 -0
- package/dist/call-graph/enrichment/enrichment-engine.d.ts.map +1 -0
- package/dist/call-graph/enrichment/enrichment-engine.js +760 -0
- package/dist/call-graph/enrichment/enrichment-engine.js.map +1 -0
- package/dist/call-graph/enrichment/impact-scorer.d.ts +59 -0
- package/dist/call-graph/enrichment/impact-scorer.d.ts.map +1 -0
- package/dist/call-graph/enrichment/impact-scorer.js +328 -0
- package/dist/call-graph/enrichment/impact-scorer.js.map +1 -0
- package/dist/call-graph/enrichment/index.d.ts +12 -0
- package/dist/call-graph/enrichment/index.d.ts.map +1 -0
- package/dist/call-graph/enrichment/index.js +15 -0
- package/dist/call-graph/enrichment/index.js.map +1 -0
- package/dist/call-graph/enrichment/remediation-generator.d.ts +41 -0
- package/dist/call-graph/enrichment/remediation-generator.d.ts.map +1 -0
- package/dist/call-graph/enrichment/remediation-generator.js +609 -0
- package/dist/call-graph/enrichment/remediation-generator.js.map +1 -0
- package/dist/call-graph/enrichment/sensitivity-classifier.d.ts +71 -0
- package/dist/call-graph/enrichment/sensitivity-classifier.d.ts.map +1 -0
- package/dist/call-graph/enrichment/sensitivity-classifier.js +454 -0
- package/dist/call-graph/enrichment/sensitivity-classifier.js.map +1 -0
- package/dist/call-graph/enrichment/types.d.ts +402 -0
- package/dist/call-graph/enrichment/types.d.ts.map +1 -0
- package/dist/call-graph/enrichment/types.js +9 -0
- package/dist/call-graph/enrichment/types.js.map +1 -0
- package/dist/call-graph/extractors/base-extractor.d.ts +112 -0
- package/dist/call-graph/extractors/base-extractor.d.ts.map +1 -0
- package/dist/call-graph/extractors/base-extractor.js +140 -0
- package/dist/call-graph/extractors/base-extractor.js.map +1 -0
- package/dist/call-graph/extractors/csharp-data-access-extractor.d.ts +76 -0
- package/dist/call-graph/extractors/csharp-data-access-extractor.d.ts.map +1 -0
- package/dist/call-graph/extractors/csharp-data-access-extractor.js +387 -0
- package/dist/call-graph/extractors/csharp-data-access-extractor.js.map +1 -0
- package/dist/call-graph/extractors/csharp-extractor.d.ts +87 -0
- package/dist/call-graph/extractors/csharp-extractor.d.ts.map +1 -0
- package/dist/call-graph/extractors/csharp-extractor.js +470 -0
- package/dist/call-graph/extractors/csharp-extractor.js.map +1 -0
- package/dist/call-graph/extractors/data-access-extractor.d.ts +76 -0
- package/dist/call-graph/extractors/data-access-extractor.d.ts.map +1 -0
- package/dist/call-graph/extractors/data-access-extractor.js +234 -0
- package/dist/call-graph/extractors/data-access-extractor.js.map +1 -0
- package/dist/call-graph/extractors/index.d.ts +26 -0
- package/dist/call-graph/extractors/index.d.ts.map +1 -0
- package/dist/call-graph/extractors/index.js +36 -0
- package/dist/call-graph/extractors/index.js.map +1 -0
- package/dist/call-graph/extractors/java-data-access-extractor.d.ts +101 -0
- package/dist/call-graph/extractors/java-data-access-extractor.d.ts.map +1 -0
- package/dist/call-graph/extractors/java-data-access-extractor.js +611 -0
- package/dist/call-graph/extractors/java-data-access-extractor.js.map +1 -0
- package/dist/call-graph/extractors/java-extractor.d.ts +87 -0
- package/dist/call-graph/extractors/java-extractor.d.ts.map +1 -0
- package/dist/call-graph/extractors/java-extractor.js +510 -0
- package/dist/call-graph/extractors/java-extractor.js.map +1 -0
- package/dist/call-graph/extractors/php-data-access-extractor.d.ts +93 -0
- package/dist/call-graph/extractors/php-data-access-extractor.d.ts.map +1 -0
- package/dist/call-graph/extractors/php-data-access-extractor.js +589 -0
- package/dist/call-graph/extractors/php-data-access-extractor.js.map +1 -0
- package/dist/call-graph/extractors/php-extractor.d.ts +104 -0
- package/dist/call-graph/extractors/php-extractor.d.ts.map +1 -0
- package/dist/call-graph/extractors/php-extractor.js +619 -0
- package/dist/call-graph/extractors/php-extractor.js.map +1 -0
- package/dist/call-graph/extractors/python-data-access-extractor.d.ts +90 -0
- package/dist/call-graph/extractors/python-data-access-extractor.d.ts.map +1 -0
- package/dist/call-graph/extractors/python-data-access-extractor.js +537 -0
- package/dist/call-graph/extractors/python-data-access-extractor.js.map +1 -0
- package/dist/call-graph/extractors/python-extractor.d.ts +98 -0
- package/dist/call-graph/extractors/python-extractor.d.ts.map +1 -0
- package/dist/call-graph/extractors/python-extractor.js +681 -0
- package/dist/call-graph/extractors/python-extractor.js.map +1 -0
- package/dist/call-graph/extractors/semantic-data-access-scanner.d.ts +91 -0
- package/dist/call-graph/extractors/semantic-data-access-scanner.d.ts.map +1 -0
- package/dist/call-graph/extractors/semantic-data-access-scanner.js +498 -0
- package/dist/call-graph/extractors/semantic-data-access-scanner.js.map +1 -0
- package/dist/call-graph/extractors/typescript-data-access-extractor.d.ts +122 -0
- package/dist/call-graph/extractors/typescript-data-access-extractor.d.ts.map +1 -0
- package/dist/call-graph/extractors/typescript-data-access-extractor.js +788 -0
- package/dist/call-graph/extractors/typescript-data-access-extractor.js.map +1 -0
- package/dist/call-graph/extractors/typescript-extractor.d.ts +145 -0
- package/dist/call-graph/extractors/typescript-extractor.d.ts.map +1 -0
- package/dist/call-graph/extractors/typescript-extractor.js +904 -0
- package/dist/call-graph/extractors/typescript-extractor.js.map +1 -0
- package/dist/call-graph/index.d.ts +127 -0
- package/dist/call-graph/index.d.ts.map +1 -0
- package/dist/call-graph/index.js +247 -0
- package/dist/call-graph/index.js.map +1 -0
- package/dist/call-graph/store/call-graph-store.d.ts +70 -0
- package/dist/call-graph/store/call-graph-store.d.ts.map +1 -0
- package/dist/call-graph/store/call-graph-store.js +210 -0
- package/dist/call-graph/store/call-graph-store.js.map +1 -0
- package/dist/call-graph/store/index.d.ts +7 -0
- package/dist/call-graph/store/index.d.ts.map +1 -0
- package/dist/call-graph/store/index.js +7 -0
- package/dist/call-graph/store/index.js.map +1 -0
- package/dist/call-graph/types.d.ts +376 -0
- package/dist/call-graph/types.d.ts.map +1 -0
- package/dist/call-graph/types.js +8 -0
- package/dist/call-graph/types.js.map +1 -0
- package/dist/index.d.ts +8 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +12 -0
- package/dist/index.js.map +1 -1
- package/dist/lake/callgraph-shard-store.d.ts +168 -0
- package/dist/lake/callgraph-shard-store.d.ts.map +1 -0
- package/dist/lake/callgraph-shard-store.js +466 -0
- package/dist/lake/callgraph-shard-store.js.map +1 -0
- package/dist/lake/examples-store.d.ts +127 -0
- package/dist/lake/examples-store.d.ts.map +1 -0
- package/dist/lake/examples-store.js +389 -0
- package/dist/lake/examples-store.js.map +1 -0
- package/dist/lake/index-store.d.ts +82 -0
- package/dist/lake/index-store.d.ts.map +1 -0
- package/dist/lake/index-store.js +359 -0
- package/dist/lake/index-store.js.map +1 -0
- package/dist/lake/index.d.ts +93 -0
- package/dist/lake/index.d.ts.map +1 -0
- package/dist/lake/index.js +138 -0
- package/dist/lake/index.js.map +1 -0
- package/dist/lake/lake.bak/index-store.d.ts +82 -0
- package/dist/lake/lake.bak/index-store.d.ts.map +1 -0
- package/dist/lake/lake.bak/index-store.js +357 -0
- package/dist/lake/lake.bak/index-store.js.map +1 -0
- package/dist/lake/lake.bak/index.d.ts +81 -0
- package/dist/lake/lake.bak/index.d.ts.map +1 -0
- package/dist/lake/lake.bak/index.js +114 -0
- package/dist/lake/lake.bak/index.js.map +1 -0
- package/dist/lake/lake.bak/manifest-store.d.ts +51 -0
- package/dist/lake/lake.bak/manifest-store.d.ts.map +1 -0
- package/dist/lake/lake.bak/manifest-store.js +347 -0
- package/dist/lake/lake.bak/manifest-store.js.map +1 -0
- package/dist/lake/lake.bak/query-engine.d.ts +112 -0
- package/dist/lake/lake.bak/query-engine.d.ts.map +1 -0
- package/dist/lake/lake.bak/query-engine.js +370 -0
- package/dist/lake/lake.bak/query-engine.js.map +1 -0
- package/dist/lake/lake.bak/types.d.ts +428 -0
- package/dist/lake/lake.bak/types.d.ts.map +1 -0
- package/dist/lake/lake.bak/types.js +46 -0
- package/dist/lake/lake.bak/types.js.map +1 -0
- package/dist/lake/lake.bak/view-materializer.d.ts +70 -0
- package/dist/lake/lake.bak/view-materializer.d.ts.map +1 -0
- package/dist/lake/lake.bak/view-materializer.js +314 -0
- package/dist/lake/lake.bak/view-materializer.js.map +1 -0
- package/dist/lake/lake.bak/view-store.d.ts +57 -0
- package/dist/lake/lake.bak/view-store.d.ts.map +1 -0
- package/dist/lake/lake.bak/view-store.js +348 -0
- package/dist/lake/lake.bak/view-store.js.map +1 -0
- package/dist/lake/manifest-store.d.ts +51 -0
- package/dist/lake/manifest-store.d.ts.map +1 -0
- package/dist/lake/manifest-store.js +348 -0
- package/dist/lake/manifest-store.js.map +1 -0
- package/dist/lake/pattern-shard-store.d.ts +87 -0
- package/dist/lake/pattern-shard-store.d.ts.map +1 -0
- package/dist/lake/pattern-shard-store.js +347 -0
- package/dist/lake/pattern-shard-store.js.map +1 -0
- package/dist/lake/query-engine.d.ts +124 -0
- package/dist/lake/query-engine.d.ts.map +1 -0
- package/dist/lake/query-engine.js +453 -0
- package/dist/lake/query-engine.js.map +1 -0
- package/dist/lake/security-shard-store.d.ts +156 -0
- package/dist/lake/security-shard-store.d.ts.map +1 -0
- package/dist/lake/security-shard-store.js +498 -0
- package/dist/lake/security-shard-store.js.map +1 -0
- package/dist/lake/types.d.ts +428 -0
- package/dist/lake/types.d.ts.map +1 -0
- package/dist/lake/types.js +46 -0
- package/dist/lake/types.js.map +1 -0
- package/dist/lake/view-materializer.d.ts +70 -0
- package/dist/lake/view-materializer.d.ts.map +1 -0
- package/dist/lake/view-materializer.js +314 -0
- package/dist/lake/view-materializer.js.map +1 -0
- package/dist/lake/view-store.d.ts +57 -0
- package/dist/lake/view-store.d.ts.map +1 -0
- package/dist/lake/view-store.js +348 -0
- package/dist/lake/view-store.js.map +1 -0
- package/dist/parsers/tree-sitter/index.d.ts +1 -0
- package/dist/parsers/tree-sitter/index.d.ts.map +1 -1
- package/dist/parsers/tree-sitter/index.js +4 -0
- package/dist/parsers/tree-sitter/index.js.map +1 -1
- package/dist/parsers/tree-sitter/typescript-loader.d.ts +58 -0
- package/dist/parsers/tree-sitter/typescript-loader.d.ts.map +1 -0
- package/dist/parsers/tree-sitter/typescript-loader.js +250 -0
- package/dist/parsers/tree-sitter/typescript-loader.js.map +1 -0
- package/dist/store/project-config.d.ts +154 -0
- package/dist/store/project-config.d.ts.map +1 -0
- package/dist/store/project-config.js +235 -0
- package/dist/store/project-config.js.map +1 -0
- package/dist/store/project-registry.d.ts +241 -0
- package/dist/store/project-registry.d.ts.map +1 -0
- package/dist/store/project-registry.js +557 -0
- package/dist/store/project-registry.js.map +1 -0
- package/package.json +7 -7
|
@@ -0,0 +1,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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"}
|