driftdetect-lsp 0.9.31 → 0.9.33
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/capabilities.d.ts.map +1 -0
- package/dist/capabilities.js +183 -0
- package/dist/capabilities.js.map +1 -0
- package/dist/commands/show-patterns.d.ts +30 -0
- package/dist/commands/show-patterns.d.ts.map +1 -1
- package/dist/commands/show-patterns.js +175 -0
- package/dist/commands/show-patterns.js.map +1 -0
- package/dist/handlers/code-actions.d.ts +32 -0
- package/dist/handlers/code-actions.d.ts.map +1 -1
- package/dist/handlers/code-actions.js +184 -0
- package/dist/handlers/code-actions.js.map +1 -0
- package/dist/handlers/code-lens.d.ts +32 -0
- package/dist/handlers/code-lens.d.ts.map +1 -1
- package/dist/handlers/code-lens.js +162 -0
- package/dist/handlers/code-lens.js.map +1 -0
- package/dist/handlers/commands.d.ts +48 -0
- package/dist/handlers/commands.d.ts.map +1 -1
- package/dist/handlers/commands.js +360 -0
- package/dist/handlers/commands.js.map +1 -0
- package/dist/handlers/diagnostics.d.ts +73 -0
- package/dist/handlers/diagnostics.d.ts.map +1 -1
- package/dist/handlers/diagnostics.js +259 -0
- package/dist/handlers/diagnostics.js.map +1 -0
- package/dist/handlers/document-sync.d.ts +37 -0
- package/dist/handlers/document-sync.d.ts.map +1 -1
- package/dist/handlers/document-sync.js +49 -0
- package/dist/handlers/document-sync.js.map +1 -0
- package/dist/handlers/hover.d.ts +30 -0
- package/dist/handlers/hover.d.ts.map +1 -1
- package/dist/handlers/hover.js +119 -0
- package/dist/handlers/hover.js.map +1 -0
- package/dist/integration/core-scanner.d.ts.map +1 -1
- package/dist/integration/core-scanner.js +309 -0
- package/dist/integration/core-scanner.js.map +1 -0
- package/dist/integration/pattern-store-adapter.d.ts +117 -0
- package/dist/integration/pattern-store-adapter.d.ts.map +1 -1
- package/dist/integration/pattern-store-adapter.js +349 -0
- package/dist/integration/pattern-store-adapter.js.map +1 -0
- package/dist/integration/types.d.ts +134 -0
- package/dist/integration/types.d.ts.map +1 -1
- package/dist/integration/types.js +39 -0
- package/dist/integration/types.js.map +1 -0
- package/dist/server/types.d.ts +139 -0
- package/dist/server/types.d.ts.map +1 -1
- package/dist/server/types.js +8 -0
- package/dist/server/types.js.map +1 -0
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +208 -0
- package/dist/server.js.map +1 -0
- package/dist/utils/diagnostic.js +263 -0
- package/dist/utils/diagnostic.js.map +1 -0
- package/dist/utils/document.d.ts +40 -0
- package/dist/utils/document.d.ts.map +1 -0
- package/dist/utils/document.js +138 -0
- package/dist/utils/document.js.map +1 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/workspace.d.ts.map +1 -1
- package/dist/utils/workspace.js +241 -0
- package/dist/utils/workspace.js.map +1 -0
- package/package.json +1 -1
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Core Scanner Integration
|
|
3
|
+
*
|
|
4
|
+
* Connects the LSP diagnostics handler to driftdetect-core scanner
|
|
5
|
+
* and driftdetect-detectors for pattern detection and violation generation.
|
|
6
|
+
*
|
|
7
|
+
* @requirements 27.3 - THE LSP_Server SHALL publish diagnostics for violations
|
|
8
|
+
* @requirements 27.7 - THE LSP_Server SHALL respond to diagnostics within 200ms of file change
|
|
9
|
+
*/
|
|
10
|
+
import { PatternStore, Evaluator, ParserManager, TypeScriptParser, PythonParser, CSSParser, JSONParser, MarkdownParser, } from 'driftdetect-core';
|
|
11
|
+
import { URI } from 'vscode-uri';
|
|
12
|
+
import { DEFAULT_CORE_INTEGRATION_CONFIG } from './types.js';
|
|
13
|
+
/**
|
|
14
|
+
* Core Scanner - Integrates driftdetect-core with LSP diagnostics
|
|
15
|
+
*
|
|
16
|
+
* This class bridges the LSP server with the core drift detection engine.
|
|
17
|
+
* It manages the pattern store, parser manager, evaluator, and detector registry
|
|
18
|
+
* to scan documents and generate violations.
|
|
19
|
+
*/
|
|
20
|
+
export class CoreScanner {
|
|
21
|
+
config;
|
|
22
|
+
logger;
|
|
23
|
+
patternStore = null;
|
|
24
|
+
parserManager = null;
|
|
25
|
+
evaluator = null;
|
|
26
|
+
initialized = false;
|
|
27
|
+
scanCache = new Map();
|
|
28
|
+
cacheTimeout = 5000; // 5 seconds cache
|
|
29
|
+
constructor(config = {}, logger) {
|
|
30
|
+
this.config = { ...DEFAULT_CORE_INTEGRATION_CONFIG, ...config };
|
|
31
|
+
this.logger = logger;
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Initialize the core scanner
|
|
35
|
+
*
|
|
36
|
+
* Sets up the pattern store, parser manager, evaluator, and detector registry.
|
|
37
|
+
*/
|
|
38
|
+
async initialize() {
|
|
39
|
+
if (this.initialized) {
|
|
40
|
+
return;
|
|
41
|
+
}
|
|
42
|
+
this.logger.info('Initializing core scanner...');
|
|
43
|
+
try {
|
|
44
|
+
// Initialize pattern store
|
|
45
|
+
const storeConfig = {
|
|
46
|
+
rootDir: this.config.rootDir,
|
|
47
|
+
validateSchema: this.config.validateSchema,
|
|
48
|
+
trackHistory: this.config.trackHistory,
|
|
49
|
+
autoSave: this.config.autoSave,
|
|
50
|
+
};
|
|
51
|
+
this.patternStore = new PatternStore(storeConfig);
|
|
52
|
+
await this.patternStore.initialize();
|
|
53
|
+
this.logger.info('Pattern store initialized');
|
|
54
|
+
// Initialize parser manager with language parsers
|
|
55
|
+
this.parserManager = new ParserManager();
|
|
56
|
+
this.parserManager.registerParser(new TypeScriptParser());
|
|
57
|
+
this.parserManager.registerParser(new PythonParser());
|
|
58
|
+
this.parserManager.registerParser(new CSSParser());
|
|
59
|
+
this.parserManager.registerParser(new JSONParser());
|
|
60
|
+
this.parserManager.registerParser(new MarkdownParser());
|
|
61
|
+
this.logger.info('Parser manager initialized');
|
|
62
|
+
// Initialize evaluator
|
|
63
|
+
const evaluatorConfig = {
|
|
64
|
+
aiExplainAvailable: this.config.aiEnabled,
|
|
65
|
+
aiFixAvailable: this.config.aiEnabled,
|
|
66
|
+
minConfidence: this.config.minConfidence,
|
|
67
|
+
projectRoot: this.config.rootDir,
|
|
68
|
+
};
|
|
69
|
+
this.evaluator = new Evaluator(evaluatorConfig);
|
|
70
|
+
this.logger.info('Evaluator initialized');
|
|
71
|
+
this.initialized = true;
|
|
72
|
+
this.logger.info('Core scanner initialization complete');
|
|
73
|
+
}
|
|
74
|
+
catch (error) {
|
|
75
|
+
this.logger.error(`Failed to initialize core scanner: ${error}`);
|
|
76
|
+
throw error;
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Check if the scanner is initialized
|
|
81
|
+
*/
|
|
82
|
+
isInitialized() {
|
|
83
|
+
return this.initialized;
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* Get the pattern store instance
|
|
87
|
+
*/
|
|
88
|
+
getPatternStore() {
|
|
89
|
+
return this.patternStore;
|
|
90
|
+
}
|
|
91
|
+
/**
|
|
92
|
+
* Scan a document for violations
|
|
93
|
+
*
|
|
94
|
+
* @requirements 27.3 - Publish diagnostics for violations
|
|
95
|
+
* @requirements 27.7 - Respond within 200ms
|
|
96
|
+
*/
|
|
97
|
+
async scan(uri, content, options = {}) {
|
|
98
|
+
const startTime = Date.now();
|
|
99
|
+
const errors = [];
|
|
100
|
+
const violations = [];
|
|
101
|
+
let patterns = [];
|
|
102
|
+
// Check cache unless force rescan
|
|
103
|
+
if (!options.force) {
|
|
104
|
+
const cached = this.scanCache.get(uri);
|
|
105
|
+
if (cached && Date.now() - cached.timestamp < this.cacheTimeout) {
|
|
106
|
+
this.logger.debug(`Using cached scan result for ${uri}`);
|
|
107
|
+
return {
|
|
108
|
+
uri,
|
|
109
|
+
violations: cached.violations,
|
|
110
|
+
patterns: [],
|
|
111
|
+
duration: Date.now() - startTime,
|
|
112
|
+
errors: [],
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
if (!this.initialized) {
|
|
117
|
+
errors.push({
|
|
118
|
+
message: 'Core scanner not initialized',
|
|
119
|
+
code: 'NOT_INITIALIZED',
|
|
120
|
+
recoverable: false,
|
|
121
|
+
});
|
|
122
|
+
return { uri, violations, patterns, duration: Date.now() - startTime, errors };
|
|
123
|
+
}
|
|
124
|
+
try {
|
|
125
|
+
// Parse the document
|
|
126
|
+
const filePath = this.uriToPath(uri);
|
|
127
|
+
const language = this.getLanguageFromUri(uri);
|
|
128
|
+
this.logger.debug(`Scanning ${filePath} (${language})`);
|
|
129
|
+
// Get AST if parser is available
|
|
130
|
+
let ast = null;
|
|
131
|
+
if (this.parserManager && language) {
|
|
132
|
+
try {
|
|
133
|
+
const parseResult = this.parserManager.parse(content, language);
|
|
134
|
+
if (parseResult.success && parseResult.ast) {
|
|
135
|
+
ast = parseResult.ast;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
catch (parseError) {
|
|
139
|
+
this.logger.warn(`Parse error for ${uri}: ${parseError}`);
|
|
140
|
+
errors.push({
|
|
141
|
+
message: `Parse error: ${parseError}`,
|
|
142
|
+
code: 'PARSE_ERROR',
|
|
143
|
+
recoverable: true,
|
|
144
|
+
});
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
// Get approved patterns to evaluate against
|
|
148
|
+
const approvedPatterns = this.patternStore?.getApproved() ?? [];
|
|
149
|
+
// Filter patterns by options
|
|
150
|
+
let patternsToEvaluate = approvedPatterns;
|
|
151
|
+
if (options.categories && options.categories.length > 0) {
|
|
152
|
+
patternsToEvaluate = patternsToEvaluate.filter((p) => options.categories.includes(p.category));
|
|
153
|
+
}
|
|
154
|
+
if (options.patternIds && options.patternIds.length > 0) {
|
|
155
|
+
patternsToEvaluate = patternsToEvaluate.filter((p) => options.patternIds.includes(p.id));
|
|
156
|
+
}
|
|
157
|
+
// Evaluate patterns against the document
|
|
158
|
+
if (this.evaluator && patternsToEvaluate.length > 0) {
|
|
159
|
+
const evaluationInput = {
|
|
160
|
+
file: filePath,
|
|
161
|
+
content,
|
|
162
|
+
ast,
|
|
163
|
+
language: language || 'unknown',
|
|
164
|
+
};
|
|
165
|
+
const results = this.evaluator.evaluateAll(evaluationInput, patternsToEvaluate);
|
|
166
|
+
// Convert evaluation results to ViolationInfo
|
|
167
|
+
for (const result of results) {
|
|
168
|
+
for (const violation of result.violations) {
|
|
169
|
+
// Apply minimum confidence filter
|
|
170
|
+
const minConf = options.minConfidence ?? this.config.minConfidence;
|
|
171
|
+
const pattern = patternsToEvaluate.find((p) => p.id === violation.patternId);
|
|
172
|
+
if (pattern && pattern.confidence.score >= minConf) {
|
|
173
|
+
violations.push(this.violationToInfo(violation, uri));
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
// Pattern discovery would be handled by detectors
|
|
179
|
+
// For now, we just return the violations from approved patterns
|
|
180
|
+
patterns = [];
|
|
181
|
+
// Cache the result
|
|
182
|
+
this.scanCache.set(uri, { violations, timestamp: Date.now() });
|
|
183
|
+
const duration = Date.now() - startTime;
|
|
184
|
+
this.logger.debug(`Scan complete for ${uri}: ${violations.length} violations in ${duration}ms`);
|
|
185
|
+
// Warn if we exceeded the 200ms target
|
|
186
|
+
if (duration > 200) {
|
|
187
|
+
this.logger.warn(`Scan latency exceeded 200ms target: ${duration}ms for ${uri}`);
|
|
188
|
+
}
|
|
189
|
+
return { uri, violations, patterns, duration, errors };
|
|
190
|
+
}
|
|
191
|
+
catch (error) {
|
|
192
|
+
const errorMessage = error instanceof Error ? error.message : String(error);
|
|
193
|
+
this.logger.error(`Scan error for ${uri}: ${errorMessage}`);
|
|
194
|
+
errors.push({
|
|
195
|
+
message: errorMessage,
|
|
196
|
+
code: 'SCAN_ERROR',
|
|
197
|
+
recoverable: true,
|
|
198
|
+
});
|
|
199
|
+
return { uri, violations, patterns, duration: Date.now() - startTime, errors };
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
/**
|
|
203
|
+
* Invalidate cache for a document
|
|
204
|
+
*/
|
|
205
|
+
invalidateCache(uri) {
|
|
206
|
+
this.scanCache.delete(uri);
|
|
207
|
+
}
|
|
208
|
+
/**
|
|
209
|
+
* Clear all cached scan results
|
|
210
|
+
*/
|
|
211
|
+
clearCache() {
|
|
212
|
+
this.scanCache.clear();
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Convert a driftdetect-core Violation to ViolationInfo
|
|
216
|
+
*/
|
|
217
|
+
violationToInfo(violation, uri) {
|
|
218
|
+
return {
|
|
219
|
+
id: violation.id,
|
|
220
|
+
patternId: violation.patternId,
|
|
221
|
+
message: violation.message,
|
|
222
|
+
severity: violation.severity,
|
|
223
|
+
file: uri,
|
|
224
|
+
range: violation.range,
|
|
225
|
+
expected: violation.expected,
|
|
226
|
+
actual: violation.actual,
|
|
227
|
+
explanation: violation.explanation,
|
|
228
|
+
quickFix: violation.quickFix
|
|
229
|
+
? {
|
|
230
|
+
title: violation.quickFix.title,
|
|
231
|
+
isPreferred: violation.quickFix.isPreferred,
|
|
232
|
+
confidence: violation.quickFix.confidence,
|
|
233
|
+
}
|
|
234
|
+
: undefined,
|
|
235
|
+
aiExplainAvailable: violation.aiExplainAvailable,
|
|
236
|
+
aiFixAvailable: violation.aiFixAvailable,
|
|
237
|
+
};
|
|
238
|
+
}
|
|
239
|
+
/**
|
|
240
|
+
* Convert a URI to a file path
|
|
241
|
+
*/
|
|
242
|
+
uriToPath(uri) {
|
|
243
|
+
try {
|
|
244
|
+
return URI.parse(uri).fsPath;
|
|
245
|
+
}
|
|
246
|
+
catch {
|
|
247
|
+
// If URI parsing fails, assume it's already a path
|
|
248
|
+
return uri;
|
|
249
|
+
}
|
|
250
|
+
}
|
|
251
|
+
/**
|
|
252
|
+
* Get the language from a URI based on file extension
|
|
253
|
+
*/
|
|
254
|
+
getLanguageFromUri(uri) {
|
|
255
|
+
const ext = uri.split('.').pop()?.toLowerCase();
|
|
256
|
+
switch (ext) {
|
|
257
|
+
case 'ts':
|
|
258
|
+
case 'tsx':
|
|
259
|
+
return 'typescript';
|
|
260
|
+
case 'js':
|
|
261
|
+
case 'jsx':
|
|
262
|
+
case 'mjs':
|
|
263
|
+
case 'cjs':
|
|
264
|
+
return 'javascript';
|
|
265
|
+
case 'py':
|
|
266
|
+
return 'python';
|
|
267
|
+
case 'css':
|
|
268
|
+
case 'scss':
|
|
269
|
+
case 'sass':
|
|
270
|
+
case 'less':
|
|
271
|
+
return 'css';
|
|
272
|
+
case 'json':
|
|
273
|
+
return 'json';
|
|
274
|
+
case 'yaml':
|
|
275
|
+
case 'yml':
|
|
276
|
+
return 'yaml';
|
|
277
|
+
case 'md':
|
|
278
|
+
case 'markdown':
|
|
279
|
+
return 'markdown';
|
|
280
|
+
default:
|
|
281
|
+
return null;
|
|
282
|
+
}
|
|
283
|
+
}
|
|
284
|
+
/**
|
|
285
|
+
* Shutdown the core scanner
|
|
286
|
+
*/
|
|
287
|
+
async shutdown() {
|
|
288
|
+
this.logger.info('Shutting down core scanner...');
|
|
289
|
+
// Save pattern store if auto-save is enabled
|
|
290
|
+
if (this.patternStore && this.config.autoSave) {
|
|
291
|
+
try {
|
|
292
|
+
await this.patternStore.saveAll();
|
|
293
|
+
}
|
|
294
|
+
catch (error) {
|
|
295
|
+
this.logger.error(`Error saving pattern store: ${error}`);
|
|
296
|
+
}
|
|
297
|
+
}
|
|
298
|
+
this.scanCache.clear();
|
|
299
|
+
this.initialized = false;
|
|
300
|
+
this.logger.info('Core scanner shutdown complete');
|
|
301
|
+
}
|
|
302
|
+
}
|
|
303
|
+
/**
|
|
304
|
+
* Create a core scanner instance
|
|
305
|
+
*/
|
|
306
|
+
export function createCoreScanner(config = {}, logger) {
|
|
307
|
+
return new CoreScanner(config, logger);
|
|
308
|
+
}
|
|
309
|
+
//# sourceMappingURL=core-scanner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"core-scanner.js","sourceRoot":"","sources":["../../src/integration/core-scanner.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Pattern Store Adapter
|
|
3
|
+
*
|
|
4
|
+
* Adapts driftdetect-core PatternStore and VariantManager for use in LSP commands.
|
|
5
|
+
* Provides approve, ignore, and variant operations that persist to disk.
|
|
6
|
+
*
|
|
7
|
+
* @requirements 28.1 - drift.approvePattern
|
|
8
|
+
* @requirements 28.2 - drift.ignorePattern
|
|
9
|
+
* @requirements 28.3 - drift.ignoreOnce
|
|
10
|
+
* @requirements 28.4 - drift.createVariant
|
|
11
|
+
*/
|
|
12
|
+
import { PatternStore, VariantManager } from 'driftdetect-core';
|
|
13
|
+
import type { ApproveResult, IgnoreResult, CreateVariantResult, CreateVariantInput, CoreIntegrationConfig } from './types.js';
|
|
14
|
+
import type { ViolationInfo, PatternInfo } from '../types/lsp-types.js';
|
|
15
|
+
/**
|
|
16
|
+
* Logger interface
|
|
17
|
+
*/
|
|
18
|
+
interface Logger {
|
|
19
|
+
error(message: string): void;
|
|
20
|
+
warn(message: string): void;
|
|
21
|
+
info(message: string): void;
|
|
22
|
+
debug(message: string): void;
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Pattern Store Adapter
|
|
26
|
+
*
|
|
27
|
+
* Provides a simplified interface for LSP commands to interact with
|
|
28
|
+
* the driftdetect-core PatternStore and VariantManager.
|
|
29
|
+
*/
|
|
30
|
+
export declare class PatternStoreAdapter {
|
|
31
|
+
private config;
|
|
32
|
+
private logger;
|
|
33
|
+
private patternStore;
|
|
34
|
+
private variantManager;
|
|
35
|
+
private initialized;
|
|
36
|
+
constructor(config: Partial<CoreIntegrationConfig> | undefined, logger: Logger);
|
|
37
|
+
/**
|
|
38
|
+
* Initialize the adapter
|
|
39
|
+
*/
|
|
40
|
+
initialize(): Promise<void>;
|
|
41
|
+
/**
|
|
42
|
+
* Check if the adapter is initialized
|
|
43
|
+
*/
|
|
44
|
+
isInitialized(): boolean;
|
|
45
|
+
/**
|
|
46
|
+
* Get the pattern store instance
|
|
47
|
+
*/
|
|
48
|
+
getPatternStore(): PatternStore | null;
|
|
49
|
+
/**
|
|
50
|
+
* Get the variant manager instance
|
|
51
|
+
*/
|
|
52
|
+
getVariantManager(): VariantManager | null;
|
|
53
|
+
/**
|
|
54
|
+
* Approve a pattern
|
|
55
|
+
*
|
|
56
|
+
* Moves the pattern from discovered to approved status and persists the change.
|
|
57
|
+
*
|
|
58
|
+
* @requirements 28.1 - drift.approvePattern
|
|
59
|
+
*/
|
|
60
|
+
approve(patternId: string, approvedBy?: string): Promise<ApproveResult>;
|
|
61
|
+
/**
|
|
62
|
+
* Ignore a pattern
|
|
63
|
+
*
|
|
64
|
+
* Moves the pattern to ignored status and persists the change.
|
|
65
|
+
*
|
|
66
|
+
* @requirements 28.2 - drift.ignorePattern
|
|
67
|
+
*/
|
|
68
|
+
ignore(patternId: string): Promise<IgnoreResult>;
|
|
69
|
+
/**
|
|
70
|
+
* Create a variant for a pattern
|
|
71
|
+
*
|
|
72
|
+
* Creates an intentional deviation from a pattern and persists it.
|
|
73
|
+
*
|
|
74
|
+
* @requirements 28.4 - drift.createVariant
|
|
75
|
+
*/
|
|
76
|
+
createVariant(input: CreateVariantInput): Promise<CreateVariantResult>;
|
|
77
|
+
/**
|
|
78
|
+
* Check if a location is covered by a variant
|
|
79
|
+
*
|
|
80
|
+
* Used to filter out violations that are covered by variants.
|
|
81
|
+
*/
|
|
82
|
+
isLocationCovered(patternId: string, file: string, line: number, column: number): boolean;
|
|
83
|
+
/**
|
|
84
|
+
* Get all patterns
|
|
85
|
+
*/
|
|
86
|
+
getAllPatterns(): PatternInfo[];
|
|
87
|
+
/**
|
|
88
|
+
* Get approved patterns
|
|
89
|
+
*/
|
|
90
|
+
getApprovedPatterns(): PatternInfo[];
|
|
91
|
+
/**
|
|
92
|
+
* Get discovered patterns
|
|
93
|
+
*/
|
|
94
|
+
getDiscoveredPatterns(): PatternInfo[];
|
|
95
|
+
/**
|
|
96
|
+
* Get ignored patterns
|
|
97
|
+
*/
|
|
98
|
+
getIgnoredPatterns(): PatternInfo[];
|
|
99
|
+
/**
|
|
100
|
+
* Get a pattern by ID
|
|
101
|
+
*/
|
|
102
|
+
getPattern(patternId: string): PatternInfo | undefined;
|
|
103
|
+
/**
|
|
104
|
+
* Filter violations by removing those covered by variants
|
|
105
|
+
*/
|
|
106
|
+
filterViolationsByVariants(violations: ViolationInfo[]): ViolationInfo[];
|
|
107
|
+
/**
|
|
108
|
+
* Shutdown the adapter
|
|
109
|
+
*/
|
|
110
|
+
shutdown(): Promise<void>;
|
|
111
|
+
}
|
|
112
|
+
/**
|
|
113
|
+
* Create a pattern store adapter instance
|
|
114
|
+
*/
|
|
115
|
+
export declare function createPatternStoreAdapter(config: Partial<CoreIntegrationConfig> | undefined, logger: Logger): PatternStoreAdapter;
|
|
116
|
+
export {};
|
|
117
|
+
//# sourceMappingURL=pattern-store-adapter.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"pattern-store-adapter.d.ts","sourceRoot":"","sources":["../../src/integration/pattern-store-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACL,YAAY,EACZ,cAAc,EAKf,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"pattern-store-adapter.d.ts","sourceRoot":"","sources":["../../src/integration/pattern-store-adapter.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG;AAEH,OAAO,EACL,YAAY,EACZ,cAAc,EAKf,MAAM,kBAAkB,CAAC;AAI1B,OAAO,KAAK,EACV,aAAa,EACb,YAAY,EACZ,mBAAmB,EACnB,kBAAkB,EAClB,qBAAqB,EACtB,MAAM,YAAY,CAAC;AACpB,OAAO,KAAK,EAAE,aAAa,EAAE,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAExE;;GAEG;AACH,UAAU,MAAM;IACd,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,IAAI,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IAC5B,KAAK,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B;AAED;;;;;GAKG;AACH,qBAAa,mBAAmB;IAC9B,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,cAAc,CAA+B;IACrD,OAAO,CAAC,WAAW,CAAkB;gBAEzB,MAAM,EAAE,OAAO,CAAC,qBAAqB,CAAC,YAAK,EAAE,MAAM,EAAE,MAAM;IAKvE;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAoCjC;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACH,eAAe,IAAI,YAAY,GAAG,IAAI;IAItC;;OAEG;IACH,iBAAiB,IAAI,cAAc,GAAG,IAAI;IAI1C;;;;;;OAMG;IACG,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,aAAa,CAAC;IAiD7E;;;;;;OAMG;IACG,MAAM,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAiDtD;;;;;;OAMG;IACG,aAAa,CAAC,KAAK,EAAE,kBAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA4D5E;;;;OAIG;IACH,iBAAiB,CAAC,SAAS,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO;IASzF;;OAEG;IACH,cAAc,IAAI,WAAW,EAAE;IAQ/B;;OAEG;IACH,mBAAmB,IAAI,WAAW,EAAE;IAQpC;;OAEG;IACH,qBAAqB,IAAI,WAAW,EAAE;IAQtC;;OAEG;IACH,kBAAkB,IAAI,WAAW,EAAE;IAQnC;;OAEG;IACH,UAAU,CAAC,SAAS,EAAE,MAAM,GAAG,WAAW,GAAG,SAAS;IAStD;;OAEG;IACH,0BAA0B,CAAC,UAAU,EAAE,aAAa,EAAE,GAAG,aAAa,EAAE;IAexE;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAwBhC;AAED;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,MAAM,EAAE,OAAO,CAAC,qBAAqB,CAAC,YAAK,EAC3C,MAAM,EAAE,MAAM,GACb,mBAAmB,CAErB"}
|