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,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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"}