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.
- 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 +4 -2
|
@@ -0,0 +1,347 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pattern Shard Store
|
|
3
|
+
*
|
|
4
|
+
* Manages sharded pattern storage - one file per category.
|
|
5
|
+
* This allows loading only the patterns you need instead of all patterns.
|
|
6
|
+
*
|
|
7
|
+
* Storage structure:
|
|
8
|
+
* .drift/lake/patterns/
|
|
9
|
+
* ├── api.json
|
|
10
|
+
* ├── auth.json
|
|
11
|
+
* ├── security.json
|
|
12
|
+
* └── ...
|
|
13
|
+
*
|
|
14
|
+
* Key features:
|
|
15
|
+
* - Load patterns by category (not all at once)
|
|
16
|
+
* - Incremental updates per category
|
|
17
|
+
* - Category-level checksums for cache invalidation
|
|
18
|
+
*/
|
|
19
|
+
import * as fs from 'node:fs/promises';
|
|
20
|
+
import * as path from 'node:path';
|
|
21
|
+
import * as crypto from 'node:crypto';
|
|
22
|
+
import { EventEmitter } from 'node:events';
|
|
23
|
+
import { LAKE_DIRS, DEFAULT_DATA_LAKE_CONFIG, } from './types.js';
|
|
24
|
+
// ============================================================================
|
|
25
|
+
// Constants
|
|
26
|
+
// ============================================================================
|
|
27
|
+
const PATTERNS_SHARD_DIR = 'patterns';
|
|
28
|
+
const SHARD_VERSION = '1.0.0';
|
|
29
|
+
// ============================================================================
|
|
30
|
+
// Helper Functions
|
|
31
|
+
// ============================================================================
|
|
32
|
+
async function fileExists(filePath) {
|
|
33
|
+
try {
|
|
34
|
+
await fs.access(filePath);
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return false;
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async function ensureDir(dirPath) {
|
|
42
|
+
await fs.mkdir(dirPath, { recursive: true });
|
|
43
|
+
}
|
|
44
|
+
function generateChecksum(data) {
|
|
45
|
+
const content = JSON.stringify(data);
|
|
46
|
+
return crypto.createHash('sha256').update(content).digest('hex').slice(0, 16);
|
|
47
|
+
}
|
|
48
|
+
// ============================================================================
|
|
49
|
+
// Pattern Shard Store Class
|
|
50
|
+
// ============================================================================
|
|
51
|
+
export class PatternShardStore extends EventEmitter {
|
|
52
|
+
config;
|
|
53
|
+
shardsDir;
|
|
54
|
+
// In-memory cache of loaded shards
|
|
55
|
+
shardCache = new Map();
|
|
56
|
+
shardChecksums = new Map();
|
|
57
|
+
constructor(config = {}) {
|
|
58
|
+
super();
|
|
59
|
+
this.config = { ...DEFAULT_DATA_LAKE_CONFIG, ...config };
|
|
60
|
+
this.shardsDir = path.join(this.config.rootDir, LAKE_DIRS.root, LAKE_DIRS.lake, PATTERNS_SHARD_DIR);
|
|
61
|
+
}
|
|
62
|
+
// ==========================================================================
|
|
63
|
+
// Initialization
|
|
64
|
+
// ==========================================================================
|
|
65
|
+
async initialize() {
|
|
66
|
+
await ensureDir(this.shardsDir);
|
|
67
|
+
}
|
|
68
|
+
// ==========================================================================
|
|
69
|
+
// Reading Shards
|
|
70
|
+
// ==========================================================================
|
|
71
|
+
/**
|
|
72
|
+
* Get patterns for a specific category (loads shard if needed)
|
|
73
|
+
*/
|
|
74
|
+
async getByCategory(category) {
|
|
75
|
+
const shard = await this.loadShard(category);
|
|
76
|
+
return shard?.patterns ?? [];
|
|
77
|
+
}
|
|
78
|
+
/**
|
|
79
|
+
* Get patterns for multiple categories
|
|
80
|
+
*/
|
|
81
|
+
async getByCategories(categories) {
|
|
82
|
+
const results = [];
|
|
83
|
+
// Load shards in parallel
|
|
84
|
+
const shards = await Promise.all(categories.map(cat => this.loadShard(cat)));
|
|
85
|
+
for (const shard of shards) {
|
|
86
|
+
if (shard) {
|
|
87
|
+
results.push(...shard.patterns);
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
return results;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Get a single pattern by ID (searches all shards or specific category)
|
|
94
|
+
*/
|
|
95
|
+
async getById(id, category) {
|
|
96
|
+
if (category) {
|
|
97
|
+
const patterns = await this.getByCategory(category);
|
|
98
|
+
return patterns.find(p => p.id === id) ?? null;
|
|
99
|
+
}
|
|
100
|
+
// Search all cached shards first
|
|
101
|
+
for (const shard of this.shardCache.values()) {
|
|
102
|
+
const pattern = shard.patterns.find(p => p.id === id);
|
|
103
|
+
if (pattern)
|
|
104
|
+
return pattern;
|
|
105
|
+
}
|
|
106
|
+
// Load all shards and search
|
|
107
|
+
const categories = await this.listCategories();
|
|
108
|
+
for (const cat of categories) {
|
|
109
|
+
const patterns = await this.getByCategory(cat);
|
|
110
|
+
const pattern = patterns.find(p => p.id === id);
|
|
111
|
+
if (pattern)
|
|
112
|
+
return pattern;
|
|
113
|
+
}
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
/**
|
|
117
|
+
* Get all patterns (loads all shards)
|
|
118
|
+
*/
|
|
119
|
+
async getAll() {
|
|
120
|
+
const categories = await this.listCategories();
|
|
121
|
+
return this.getByCategories(categories);
|
|
122
|
+
}
|
|
123
|
+
/**
|
|
124
|
+
* List available categories (based on shard files)
|
|
125
|
+
*/
|
|
126
|
+
async listCategories() {
|
|
127
|
+
if (!(await fileExists(this.shardsDir))) {
|
|
128
|
+
return [];
|
|
129
|
+
}
|
|
130
|
+
const files = await fs.readdir(this.shardsDir);
|
|
131
|
+
return files
|
|
132
|
+
.filter(f => f.endsWith('.json'))
|
|
133
|
+
.map(f => f.replace('.json', ''));
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Get pattern count by category (without loading full patterns)
|
|
137
|
+
*/
|
|
138
|
+
async getCategoryCounts() {
|
|
139
|
+
const counts = {};
|
|
140
|
+
const categories = await this.listCategories();
|
|
141
|
+
for (const category of categories) {
|
|
142
|
+
const shard = await this.loadShard(category);
|
|
143
|
+
counts[category] = shard?.patterns.length ?? 0;
|
|
144
|
+
}
|
|
145
|
+
return counts;
|
|
146
|
+
}
|
|
147
|
+
// ==========================================================================
|
|
148
|
+
// Writing Shards
|
|
149
|
+
// ==========================================================================
|
|
150
|
+
/**
|
|
151
|
+
* Save patterns for a category (creates/updates shard)
|
|
152
|
+
*/
|
|
153
|
+
async saveShard(category, patterns) {
|
|
154
|
+
await ensureDir(this.shardsDir);
|
|
155
|
+
const shard = {
|
|
156
|
+
category,
|
|
157
|
+
patterns,
|
|
158
|
+
};
|
|
159
|
+
const filePath = path.join(this.shardsDir, `${category}.json`);
|
|
160
|
+
const checksum = generateChecksum(patterns);
|
|
161
|
+
const shardFile = {
|
|
162
|
+
version: SHARD_VERSION,
|
|
163
|
+
generatedAt: new Date().toISOString(),
|
|
164
|
+
checksum,
|
|
165
|
+
...shard,
|
|
166
|
+
};
|
|
167
|
+
await fs.writeFile(filePath, JSON.stringify(shardFile, null, 2));
|
|
168
|
+
// Update cache
|
|
169
|
+
this.shardCache.set(category, shard);
|
|
170
|
+
this.shardChecksums.set(category, checksum);
|
|
171
|
+
this.emit('shard:saved', category, patterns.length);
|
|
172
|
+
}
|
|
173
|
+
/**
|
|
174
|
+
* Save all patterns (shards by category)
|
|
175
|
+
*/
|
|
176
|
+
async saveAll(patterns) {
|
|
177
|
+
// Group patterns by category
|
|
178
|
+
const byCategory = new Map();
|
|
179
|
+
for (const pattern of patterns) {
|
|
180
|
+
if (!byCategory.has(pattern.category)) {
|
|
181
|
+
byCategory.set(pattern.category, []);
|
|
182
|
+
}
|
|
183
|
+
byCategory.get(pattern.category).push(this.patternToShardEntry(pattern));
|
|
184
|
+
}
|
|
185
|
+
// Save each category shard
|
|
186
|
+
const savePromises = [];
|
|
187
|
+
for (const [category, categoryPatterns] of byCategory) {
|
|
188
|
+
savePromises.push(this.saveShard(category, categoryPatterns));
|
|
189
|
+
}
|
|
190
|
+
await Promise.all(savePromises);
|
|
191
|
+
this.emit('shards:saved', byCategory.size);
|
|
192
|
+
}
|
|
193
|
+
/**
|
|
194
|
+
* Delete a category shard
|
|
195
|
+
*/
|
|
196
|
+
async deleteShard(category) {
|
|
197
|
+
const filePath = path.join(this.shardsDir, `${category}.json`);
|
|
198
|
+
try {
|
|
199
|
+
await fs.unlink(filePath);
|
|
200
|
+
this.shardCache.delete(category);
|
|
201
|
+
this.shardChecksums.delete(category);
|
|
202
|
+
this.emit('shard:deleted', category);
|
|
203
|
+
}
|
|
204
|
+
catch {
|
|
205
|
+
// Ignore if doesn't exist
|
|
206
|
+
}
|
|
207
|
+
}
|
|
208
|
+
// ==========================================================================
|
|
209
|
+
// Cache Management
|
|
210
|
+
// ==========================================================================
|
|
211
|
+
/**
|
|
212
|
+
* Check if a shard has changed (by checksum)
|
|
213
|
+
*/
|
|
214
|
+
async hasShardChanged(category, newChecksum) {
|
|
215
|
+
const currentChecksum = this.shardChecksums.get(category);
|
|
216
|
+
if (!currentChecksum) {
|
|
217
|
+
// Load from disk to get checksum
|
|
218
|
+
await this.loadShard(category);
|
|
219
|
+
return this.shardChecksums.get(category) !== newChecksum;
|
|
220
|
+
}
|
|
221
|
+
return currentChecksum !== newChecksum;
|
|
222
|
+
}
|
|
223
|
+
/**
|
|
224
|
+
* Invalidate cache for a category
|
|
225
|
+
*/
|
|
226
|
+
invalidateCache(category) {
|
|
227
|
+
if (category) {
|
|
228
|
+
this.shardCache.delete(category);
|
|
229
|
+
this.shardChecksums.delete(category);
|
|
230
|
+
}
|
|
231
|
+
else {
|
|
232
|
+
this.shardCache.clear();
|
|
233
|
+
this.shardChecksums.clear();
|
|
234
|
+
}
|
|
235
|
+
}
|
|
236
|
+
/**
|
|
237
|
+
* Get cache stats
|
|
238
|
+
*/
|
|
239
|
+
getCacheStats() {
|
|
240
|
+
let totalPatterns = 0;
|
|
241
|
+
for (const shard of this.shardCache.values()) {
|
|
242
|
+
totalPatterns += shard.patterns.length;
|
|
243
|
+
}
|
|
244
|
+
return {
|
|
245
|
+
cachedCategories: this.shardCache.size,
|
|
246
|
+
totalPatterns,
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
// ==========================================================================
|
|
250
|
+
// Private Helpers
|
|
251
|
+
// ==========================================================================
|
|
252
|
+
async loadShard(category) {
|
|
253
|
+
// Check cache first
|
|
254
|
+
const cached = this.shardCache.get(category);
|
|
255
|
+
if (cached) {
|
|
256
|
+
return cached;
|
|
257
|
+
}
|
|
258
|
+
const filePath = path.join(this.shardsDir, `${category}.json`);
|
|
259
|
+
if (!(await fileExists(filePath))) {
|
|
260
|
+
return null;
|
|
261
|
+
}
|
|
262
|
+
try {
|
|
263
|
+
const content = await fs.readFile(filePath, 'utf-8');
|
|
264
|
+
const data = JSON.parse(content);
|
|
265
|
+
const shard = {
|
|
266
|
+
category: data.category,
|
|
267
|
+
patterns: data.patterns,
|
|
268
|
+
};
|
|
269
|
+
// Cache it
|
|
270
|
+
this.shardCache.set(category, shard);
|
|
271
|
+
if (data.checksum) {
|
|
272
|
+
this.shardChecksums.set(category, data.checksum);
|
|
273
|
+
}
|
|
274
|
+
return shard;
|
|
275
|
+
}
|
|
276
|
+
catch {
|
|
277
|
+
return null;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
280
|
+
/**
|
|
281
|
+
* Convert a full Pattern to a PatternShardEntry
|
|
282
|
+
*/
|
|
283
|
+
patternToShardEntry(pattern) {
|
|
284
|
+
// Build metadata object, only including defined optional properties
|
|
285
|
+
const metadata = {
|
|
286
|
+
firstSeen: pattern.metadata.firstSeen,
|
|
287
|
+
lastSeen: pattern.metadata.lastSeen,
|
|
288
|
+
};
|
|
289
|
+
if (pattern.metadata.approvedAt !== undefined) {
|
|
290
|
+
metadata.approvedAt = pattern.metadata.approvedAt;
|
|
291
|
+
}
|
|
292
|
+
if (pattern.metadata.approvedBy !== undefined) {
|
|
293
|
+
metadata.approvedBy = pattern.metadata.approvedBy;
|
|
294
|
+
}
|
|
295
|
+
if (pattern.metadata.tags !== undefined) {
|
|
296
|
+
metadata.tags = pattern.metadata.tags;
|
|
297
|
+
}
|
|
298
|
+
return {
|
|
299
|
+
id: pattern.id,
|
|
300
|
+
name: pattern.name,
|
|
301
|
+
description: pattern.description,
|
|
302
|
+
subcategory: pattern.subcategory,
|
|
303
|
+
status: pattern.status,
|
|
304
|
+
confidence: {
|
|
305
|
+
score: pattern.confidence.score,
|
|
306
|
+
level: pattern.confidence.level,
|
|
307
|
+
},
|
|
308
|
+
severity: pattern.severity,
|
|
309
|
+
locations: pattern.locations.map(loc => {
|
|
310
|
+
const result = {
|
|
311
|
+
file: loc.file,
|
|
312
|
+
line: loc.line,
|
|
313
|
+
column: loc.column,
|
|
314
|
+
};
|
|
315
|
+
if (loc.endLine !== undefined) {
|
|
316
|
+
result.endLine = loc.endLine;
|
|
317
|
+
}
|
|
318
|
+
if (loc.endColumn !== undefined) {
|
|
319
|
+
result.endColumn = loc.endColumn;
|
|
320
|
+
}
|
|
321
|
+
return result;
|
|
322
|
+
}),
|
|
323
|
+
outliers: pattern.outliers.map(out => {
|
|
324
|
+
const result = {
|
|
325
|
+
file: out.file,
|
|
326
|
+
line: out.line,
|
|
327
|
+
column: out.column,
|
|
328
|
+
};
|
|
329
|
+
if (out.endLine !== undefined) {
|
|
330
|
+
result.endLine = out.endLine;
|
|
331
|
+
}
|
|
332
|
+
if (out.endColumn !== undefined) {
|
|
333
|
+
result.endColumn = out.endColumn;
|
|
334
|
+
}
|
|
335
|
+
return result;
|
|
336
|
+
}),
|
|
337
|
+
metadata,
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
}
|
|
341
|
+
// ============================================================================
|
|
342
|
+
// Factory Function
|
|
343
|
+
// ============================================================================
|
|
344
|
+
export function createPatternShardStore(config = {}) {
|
|
345
|
+
return new PatternShardStore(config);
|
|
346
|
+
}
|
|
347
|
+
//# sourceMappingURL=pattern-shard-store.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pattern-shard-store.js","sourceRoot":"","sources":["../../src/lake/pattern-shard-store.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,124 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Query Engine
|
|
3
|
+
*
|
|
4
|
+
* Unified query API that knows the optimal path to answer any query.
|
|
5
|
+
* Routes queries to views, indexes, or raw data based on availability.
|
|
6
|
+
*
|
|
7
|
+
* Key features:
|
|
8
|
+
* - Automatic view/index selection
|
|
9
|
+
* - Fallback to raw data when views unavailable
|
|
10
|
+
* - Pagination with cursor support
|
|
11
|
+
* - Query result caching
|
|
12
|
+
*/
|
|
13
|
+
import { EventEmitter } from 'node:events';
|
|
14
|
+
import type { StatusView, PatternSummary, SecuritySummaryView, TrendsView, DataLakeConfig, ViewType } from './types.js';
|
|
15
|
+
import { ManifestStore } from './manifest-store.js';
|
|
16
|
+
import { ViewStore } from './view-store.js';
|
|
17
|
+
import { IndexStore } from './index-store.js';
|
|
18
|
+
import { PatternShardStore } from './pattern-shard-store.js';
|
|
19
|
+
import type { Pattern, PatternCategory, PatternStatus } from '../store/types.js';
|
|
20
|
+
export interface PaginationOptions {
|
|
21
|
+
limit?: number;
|
|
22
|
+
cursor?: string;
|
|
23
|
+
offset?: number;
|
|
24
|
+
}
|
|
25
|
+
export interface PaginatedResult<T> {
|
|
26
|
+
items: T[];
|
|
27
|
+
total: number;
|
|
28
|
+
hasMore: boolean;
|
|
29
|
+
nextCursor?: string | undefined;
|
|
30
|
+
executionTime: number;
|
|
31
|
+
source: 'view' | 'index' | 'raw';
|
|
32
|
+
}
|
|
33
|
+
export interface PatternQueryOptions extends PaginationOptions {
|
|
34
|
+
categories?: PatternCategory[];
|
|
35
|
+
status?: PatternStatus;
|
|
36
|
+
minConfidence?: number;
|
|
37
|
+
search?: string;
|
|
38
|
+
file?: string;
|
|
39
|
+
}
|
|
40
|
+
export interface QueryStats {
|
|
41
|
+
viewHits: number;
|
|
42
|
+
indexHits: number;
|
|
43
|
+
rawHits: number;
|
|
44
|
+
shardHits: number;
|
|
45
|
+
avgResponseTime: number;
|
|
46
|
+
}
|
|
47
|
+
export declare class QueryEngine extends EventEmitter {
|
|
48
|
+
private readonly config;
|
|
49
|
+
private readonly manifestStore;
|
|
50
|
+
private readonly viewStore;
|
|
51
|
+
private readonly indexStore;
|
|
52
|
+
private readonly patternShardStore;
|
|
53
|
+
private stats;
|
|
54
|
+
private queryCount;
|
|
55
|
+
private rawPatternLoader?;
|
|
56
|
+
constructor(config?: Partial<DataLakeConfig>, manifestStore?: ManifestStore, viewStore?: ViewStore, indexStore?: IndexStore, patternShardStore?: PatternShardStore);
|
|
57
|
+
initialize(): Promise<void>;
|
|
58
|
+
/**
|
|
59
|
+
* Set the raw pattern loader for fallback queries
|
|
60
|
+
*/
|
|
61
|
+
setRawPatternLoader(loader: () => Promise<Pattern[]>): void;
|
|
62
|
+
/**
|
|
63
|
+
* Get status - uses pre-computed view if available
|
|
64
|
+
*/
|
|
65
|
+
getStatus(): Promise<StatusView | null>;
|
|
66
|
+
/**
|
|
67
|
+
* Get pattern list with pagination
|
|
68
|
+
*
|
|
69
|
+
* Query strategy:
|
|
70
|
+
* 1. If pattern index view is fresh, use it (fastest for full list)
|
|
71
|
+
* 2. If querying specific categories, use pattern shards (loads only needed data)
|
|
72
|
+
* 3. Fall back to raw data loader
|
|
73
|
+
*/
|
|
74
|
+
getPatterns(options?: PatternQueryOptions): Promise<PaginatedResult<PatternSummary>>;
|
|
75
|
+
/**
|
|
76
|
+
* Get patterns for a specific file
|
|
77
|
+
*/
|
|
78
|
+
getFilePatterns(file: string): Promise<PatternSummary[]>;
|
|
79
|
+
/**
|
|
80
|
+
* Get patterns by category (uses shards for efficiency)
|
|
81
|
+
*/
|
|
82
|
+
getCategoryPatterns(category: PatternCategory): Promise<PatternSummary[]>;
|
|
83
|
+
/**
|
|
84
|
+
* Get security summary - uses pre-computed view if available
|
|
85
|
+
*/
|
|
86
|
+
getSecuritySummary(): Promise<SecuritySummaryView | null>;
|
|
87
|
+
/**
|
|
88
|
+
* Get trends - uses pre-computed view if available
|
|
89
|
+
*/
|
|
90
|
+
getTrends(): Promise<TrendsView | null>;
|
|
91
|
+
/**
|
|
92
|
+
* Get quick stats from manifest (instant)
|
|
93
|
+
*/
|
|
94
|
+
getQuickStats(): import("./types.js").ManifestStats;
|
|
95
|
+
/**
|
|
96
|
+
* Get pattern stats from manifest (instant)
|
|
97
|
+
*/
|
|
98
|
+
getPatternStats(): import("./types.js").PatternStats;
|
|
99
|
+
/**
|
|
100
|
+
* Get security stats from manifest (instant)
|
|
101
|
+
*/
|
|
102
|
+
getSecurityStats(): import("./types.js").SecurityStats;
|
|
103
|
+
/**
|
|
104
|
+
* Check if a view is stale
|
|
105
|
+
*/
|
|
106
|
+
isViewStale(view: ViewType): boolean;
|
|
107
|
+
/**
|
|
108
|
+
* Invalidate views (triggers rebuild on next query)
|
|
109
|
+
*/
|
|
110
|
+
invalidateViews(views?: ViewType[]): void;
|
|
111
|
+
getQueryStats(): QueryStats;
|
|
112
|
+
resetStats(): void;
|
|
113
|
+
/**
|
|
114
|
+
* Convert a PatternShardEntry to PatternSummary
|
|
115
|
+
*/
|
|
116
|
+
private shardEntryToSummary;
|
|
117
|
+
private filterPatternSummaries;
|
|
118
|
+
private encodeCursor;
|
|
119
|
+
/** Decode cursor - kept for future pagination implementation */
|
|
120
|
+
private decodeCursor;
|
|
121
|
+
private recordQuery;
|
|
122
|
+
}
|
|
123
|
+
export declare function createQueryEngine(config?: Partial<DataLakeConfig>, manifestStore?: ManifestStore, viewStore?: ViewStore, indexStore?: IndexStore, patternShardStore?: PatternShardStore): QueryEngine;
|
|
124
|
+
//# sourceMappingURL=query-engine.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"query-engine.d.ts","sourceRoot":"","sources":["../../src/lake/query-engine.ts"],"names":[],"mappings":"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"}
|