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,73 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Diagnostics Handler
|
|
3
|
+
*
|
|
4
|
+
* Publishes diagnostics (squiggly lines) for pattern violations.
|
|
5
|
+
* Manages diagnostic state and provides incremental updates.
|
|
6
|
+
* Integrates with driftdetect-core scanner for pattern detection.
|
|
7
|
+
*
|
|
8
|
+
* @requirements 27.3 - THE LSP_Server SHALL publish diagnostics for violations
|
|
9
|
+
* @requirements 27.7 - THE LSP_Server SHALL respond to diagnostics within 200ms of file change
|
|
10
|
+
*/
|
|
11
|
+
import { CoreScanner, PatternStoreAdapter, type CoreIntegrationConfig } from '../integration/index.js';
|
|
12
|
+
import type { Violation } from 'driftdetect-core';
|
|
13
|
+
import type { Connection, Diagnostic, TextDocuments } from 'vscode-languageserver';
|
|
14
|
+
import type { TextDocument } from 'vscode-languageserver-textdocument';
|
|
15
|
+
interface ServerState {
|
|
16
|
+
initialized: boolean;
|
|
17
|
+
workspaceFolders: Array<{
|
|
18
|
+
uri: string;
|
|
19
|
+
name: string;
|
|
20
|
+
}>;
|
|
21
|
+
}
|
|
22
|
+
interface Logger {
|
|
23
|
+
error(message: string): void;
|
|
24
|
+
warn(message: string): void;
|
|
25
|
+
info(message: string): void;
|
|
26
|
+
debug(message: string): void;
|
|
27
|
+
}
|
|
28
|
+
/**
|
|
29
|
+
* Extended diagnostic with Drift-specific data
|
|
30
|
+
*/
|
|
31
|
+
export interface ViolationDiagnostic extends Diagnostic {
|
|
32
|
+
data?: {
|
|
33
|
+
violationId: string;
|
|
34
|
+
patternId: string;
|
|
35
|
+
file: string;
|
|
36
|
+
hasQuickFix: boolean;
|
|
37
|
+
aiExplainAvailable: boolean;
|
|
38
|
+
aiFixAvailable: boolean;
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
/**
|
|
42
|
+
* Diagnostics handler interface
|
|
43
|
+
*/
|
|
44
|
+
export interface DiagnosticsHandler {
|
|
45
|
+
/** Publish diagnostics for a document */
|
|
46
|
+
publishDiagnostics(uri: string): Promise<void>;
|
|
47
|
+
/** Clear diagnostics for a document */
|
|
48
|
+
clearDiagnostics(uri: string): void;
|
|
49
|
+
/** Clear all diagnostics */
|
|
50
|
+
clearAllDiagnostics(): void;
|
|
51
|
+
/** Get diagnostics for a document */
|
|
52
|
+
getDiagnostics(uri: string): ViolationDiagnostic[];
|
|
53
|
+
/** Get diagnostic at a specific position */
|
|
54
|
+
getDiagnosticAtPosition(uri: string, line: number, character: number): ViolationDiagnostic | undefined;
|
|
55
|
+
/** Get all violations for a document */
|
|
56
|
+
getViolations(uri: string): Violation[];
|
|
57
|
+
/** Schedule a diagnostic update with debouncing */
|
|
58
|
+
scheduleUpdate(uri: string, delayMs?: number): void;
|
|
59
|
+
/** Cancel a scheduled update */
|
|
60
|
+
cancelUpdate(uri: string): void;
|
|
61
|
+
/** Get the core scanner instance */
|
|
62
|
+
getCoreScanner(): CoreScanner | null;
|
|
63
|
+
/** Get the pattern store adapter instance */
|
|
64
|
+
getPatternStoreAdapter(): PatternStoreAdapter | null;
|
|
65
|
+
/** Initialize the core integration */
|
|
66
|
+
initializeCoreIntegration(config?: Partial<CoreIntegrationConfig>): Promise<void>;
|
|
67
|
+
}
|
|
68
|
+
/**
|
|
69
|
+
* Create the diagnostics handler
|
|
70
|
+
*/
|
|
71
|
+
export declare function createDiagnosticsHandler(connection: Connection, documents: TextDocuments<TextDocument>, state: ServerState, logger: Logger): DiagnosticsHandler;
|
|
72
|
+
export {};
|
|
73
|
+
//# sourceMappingURL=diagnostics.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/handlers/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;
|
|
1
|
+
{"version":3,"file":"diagnostics.d.ts","sourceRoot":"","sources":["../../src/handlers/diagnostics.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAAE,WAAW,EAAE,mBAAmB,EAAE,KAAK,qBAAqB,EAAE,MAAM,yBAAyB,CAAC;AAGvG,OAAO,KAAK,EAAE,SAAS,EAAY,MAAM,kBAAkB,CAAC;AAC5D,OAAO,KAAK,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,uBAAuB,CAAC;AACnF,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAOvE,UAAU,WAAW;IACnB,WAAW,EAAE,OAAO,CAAC;IACrB,gBAAgB,EAAE,KAAK,CAAC;QAAE,GAAG,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CACxD;AAED,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;;GAEG;AACH,MAAM,WAAW,mBAAoB,SAAQ,UAAU;IACrD,IAAI,CAAC,EAAE;QACL,WAAW,EAAE,MAAM,CAAC;QACpB,SAAS,EAAE,MAAM,CAAC;QAClB,IAAI,EAAE,MAAM,CAAC;QACb,WAAW,EAAE,OAAO,CAAC;QACrB,kBAAkB,EAAE,OAAO,CAAC;QAC5B,cAAc,EAAE,OAAO,CAAC;KACzB,CAAC;CACH;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IACjC,yCAAyC;IACzC,kBAAkB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC/C,uCAAuC;IACvC,gBAAgB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IACpC,4BAA4B;IAC5B,mBAAmB,IAAI,IAAI,CAAC;IAC5B,qCAAqC;IACrC,cAAc,CAAC,GAAG,EAAE,MAAM,GAAG,mBAAmB,EAAE,CAAC;IACnD,4CAA4C;IAC5C,uBAAuB,CACrB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,MAAM,GAChB,mBAAmB,GAAG,SAAS,CAAC;IACnC,wCAAwC;IACxC,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,SAAS,EAAE,CAAC;IACxC,mDAAmD;IACnD,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACpD,gCAAgC;IAChC,YAAY,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAAC;IAChC,oCAAoC;IACpC,cAAc,IAAI,WAAW,GAAG,IAAI,CAAC;IACrC,6CAA6C;IAC7C,sBAAsB,IAAI,mBAAmB,GAAG,IAAI,CAAC;IACrD,sCAAsC;IACtC,yBAAyB,CAAC,MAAM,CAAC,EAAE,OAAO,CAAC,qBAAqB,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;CACnF;AAsCD;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,UAAU,EACtB,SAAS,EAAE,aAAa,CAAC,YAAY,CAAC,EACtC,KAAK,EAAE,WAAW,EAClB,MAAM,EAAE,MAAM,GACb,kBAAkB,CAiQpB"}
|
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Diagnostics Handler
|
|
3
|
+
*
|
|
4
|
+
* Publishes diagnostics (squiggly lines) for pattern violations.
|
|
5
|
+
* Manages diagnostic state and provides incremental updates.
|
|
6
|
+
* Integrates with driftdetect-core scanner for pattern detection.
|
|
7
|
+
*
|
|
8
|
+
* @requirements 27.3 - THE LSP_Server SHALL publish diagnostics for violations
|
|
9
|
+
* @requirements 27.7 - THE LSP_Server SHALL respond to diagnostics within 200ms of file change
|
|
10
|
+
*/
|
|
11
|
+
import { DiagnosticSeverity } from 'vscode-languageserver';
|
|
12
|
+
import { CoreScanner, PatternStoreAdapter } from '../integration/index.js';
|
|
13
|
+
// ============================================================================
|
|
14
|
+
// Constants
|
|
15
|
+
// ============================================================================
|
|
16
|
+
/** Default delay before publishing diagnostics (ms) */
|
|
17
|
+
const DEFAULT_DIAGNOSTIC_DELAY = 200;
|
|
18
|
+
/** Maximum diagnostics per file */
|
|
19
|
+
const MAX_DIAGNOSTICS_PER_FILE = 100;
|
|
20
|
+
// ============================================================================
|
|
21
|
+
// Severity Mapping
|
|
22
|
+
// ============================================================================
|
|
23
|
+
/**
|
|
24
|
+
* Map Drift severity to LSP DiagnosticSeverity
|
|
25
|
+
*/
|
|
26
|
+
function mapSeverity(severity) {
|
|
27
|
+
switch (severity) {
|
|
28
|
+
case 'error':
|
|
29
|
+
return DiagnosticSeverity.Error;
|
|
30
|
+
case 'warning':
|
|
31
|
+
return DiagnosticSeverity.Warning;
|
|
32
|
+
case 'info':
|
|
33
|
+
return DiagnosticSeverity.Information;
|
|
34
|
+
case 'hint':
|
|
35
|
+
return DiagnosticSeverity.Hint;
|
|
36
|
+
default:
|
|
37
|
+
return DiagnosticSeverity.Warning;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
// ============================================================================
|
|
41
|
+
// Handler Factory
|
|
42
|
+
// ============================================================================
|
|
43
|
+
/**
|
|
44
|
+
* Create the diagnostics handler
|
|
45
|
+
*/
|
|
46
|
+
export function createDiagnosticsHandler(connection, documents, state, logger) {
|
|
47
|
+
// Store diagnostics by document URI
|
|
48
|
+
const diagnosticsMap = new Map();
|
|
49
|
+
// Store violations by document URI
|
|
50
|
+
const violationsMap = new Map();
|
|
51
|
+
// Timers for debounced updates
|
|
52
|
+
const updateTimers = new Map();
|
|
53
|
+
// Core integration instances
|
|
54
|
+
let coreScanner = null;
|
|
55
|
+
let patternStoreAdapter = null;
|
|
56
|
+
/**
|
|
57
|
+
* Convert a ViolationInfo to an LSP Diagnostic
|
|
58
|
+
*/
|
|
59
|
+
function violationInfoToDiagnostic(violation) {
|
|
60
|
+
return {
|
|
61
|
+
range: violation.range,
|
|
62
|
+
severity: mapSeverity(violation.severity),
|
|
63
|
+
code: violation.patternId,
|
|
64
|
+
source: 'drift',
|
|
65
|
+
message: violation.message,
|
|
66
|
+
data: {
|
|
67
|
+
violationId: violation.id,
|
|
68
|
+
patternId: violation.patternId,
|
|
69
|
+
file: violation.file,
|
|
70
|
+
hasQuickFix: violation.quickFix !== undefined,
|
|
71
|
+
aiExplainAvailable: violation.aiExplainAvailable ?? false,
|
|
72
|
+
aiFixAvailable: violation.aiFixAvailable ?? false,
|
|
73
|
+
},
|
|
74
|
+
};
|
|
75
|
+
}
|
|
76
|
+
/**
|
|
77
|
+
* Convert ViolationInfo to Violation for backward compatibility
|
|
78
|
+
*/
|
|
79
|
+
function violationInfoToViolation(info) {
|
|
80
|
+
const violation = {
|
|
81
|
+
id: info.id,
|
|
82
|
+
patternId: info.patternId,
|
|
83
|
+
severity: info.severity,
|
|
84
|
+
file: info.file,
|
|
85
|
+
range: info.range,
|
|
86
|
+
message: info.message,
|
|
87
|
+
expected: info.expected ?? '',
|
|
88
|
+
actual: info.actual ?? '',
|
|
89
|
+
aiExplainAvailable: info.aiExplainAvailable ?? false,
|
|
90
|
+
aiFixAvailable: info.aiFixAvailable ?? false,
|
|
91
|
+
firstSeen: new Date(),
|
|
92
|
+
occurrences: 1,
|
|
93
|
+
};
|
|
94
|
+
// Add optional properties only if defined
|
|
95
|
+
if (info.explanation !== undefined) {
|
|
96
|
+
violation.explanation = info.explanation;
|
|
97
|
+
}
|
|
98
|
+
if (info.quickFix) {
|
|
99
|
+
violation.quickFix = {
|
|
100
|
+
title: info.quickFix.title,
|
|
101
|
+
kind: 'quickfix',
|
|
102
|
+
edit: { changes: {} },
|
|
103
|
+
isPreferred: info.quickFix.isPreferred,
|
|
104
|
+
confidence: info.quickFix.confidence,
|
|
105
|
+
};
|
|
106
|
+
}
|
|
107
|
+
return violation;
|
|
108
|
+
}
|
|
109
|
+
/**
|
|
110
|
+
* Scan a document for violations using the core scanner
|
|
111
|
+
*/
|
|
112
|
+
async function scanDocument(document) {
|
|
113
|
+
const uri = document.uri;
|
|
114
|
+
const content = document.getText();
|
|
115
|
+
logger.debug(`Scanning document: ${uri} (${content.length} chars)`);
|
|
116
|
+
// If core scanner is initialized, use it
|
|
117
|
+
if (coreScanner && coreScanner.isInitialized()) {
|
|
118
|
+
const result = await coreScanner.scan(uri, content);
|
|
119
|
+
// Filter violations by variants if pattern store adapter is available
|
|
120
|
+
let violations = result.violations;
|
|
121
|
+
if (patternStoreAdapter && patternStoreAdapter.isInitialized()) {
|
|
122
|
+
violations = patternStoreAdapter.filterViolationsByVariants(violations);
|
|
123
|
+
}
|
|
124
|
+
return violations;
|
|
125
|
+
}
|
|
126
|
+
// Fallback: return empty array if core scanner not initialized
|
|
127
|
+
logger.debug('Core scanner not initialized, returning empty violations');
|
|
128
|
+
return [];
|
|
129
|
+
}
|
|
130
|
+
return {
|
|
131
|
+
async publishDiagnostics(uri) {
|
|
132
|
+
if (!state.initialized) {
|
|
133
|
+
logger.debug('Server not initialized, skipping diagnostics');
|
|
134
|
+
return;
|
|
135
|
+
}
|
|
136
|
+
const document = documents.get(uri);
|
|
137
|
+
if (!document) {
|
|
138
|
+
logger.debug(`Document not found: ${uri}`);
|
|
139
|
+
return;
|
|
140
|
+
}
|
|
141
|
+
const startTime = Date.now();
|
|
142
|
+
try {
|
|
143
|
+
// Scan for violations using core scanner
|
|
144
|
+
const violationInfos = await scanDocument(document);
|
|
145
|
+
// Convert ViolationInfo to Violation for backward compatibility
|
|
146
|
+
const violations = violationInfos.map(violationInfoToViolation);
|
|
147
|
+
violationsMap.set(uri, violations);
|
|
148
|
+
// Convert to diagnostics
|
|
149
|
+
const diagnostics = violationInfos
|
|
150
|
+
.slice(0, MAX_DIAGNOSTICS_PER_FILE)
|
|
151
|
+
.map(violationInfoToDiagnostic);
|
|
152
|
+
diagnosticsMap.set(uri, diagnostics);
|
|
153
|
+
// Publish to client
|
|
154
|
+
connection.sendDiagnostics({
|
|
155
|
+
uri,
|
|
156
|
+
version: document.version,
|
|
157
|
+
diagnostics,
|
|
158
|
+
});
|
|
159
|
+
const elapsed = Date.now() - startTime;
|
|
160
|
+
logger.debug(`Published ${diagnostics.length} diagnostics for ${uri} in ${elapsed}ms`);
|
|
161
|
+
// Warn if we exceeded the 200ms target
|
|
162
|
+
if (elapsed > 200) {
|
|
163
|
+
logger.warn(`Diagnostic latency exceeded 200ms target: ${elapsed}ms`);
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
catch (error) {
|
|
167
|
+
logger.error(`Error publishing diagnostics for ${uri}: ${error}`);
|
|
168
|
+
}
|
|
169
|
+
},
|
|
170
|
+
clearDiagnostics(uri) {
|
|
171
|
+
diagnosticsMap.delete(uri);
|
|
172
|
+
violationsMap.delete(uri);
|
|
173
|
+
connection.sendDiagnostics({ uri, diagnostics: [] });
|
|
174
|
+
logger.debug(`Cleared diagnostics for ${uri}`);
|
|
175
|
+
},
|
|
176
|
+
clearAllDiagnostics() {
|
|
177
|
+
for (const uri of diagnosticsMap.keys()) {
|
|
178
|
+
connection.sendDiagnostics({ uri, diagnostics: [] });
|
|
179
|
+
}
|
|
180
|
+
diagnosticsMap.clear();
|
|
181
|
+
violationsMap.clear();
|
|
182
|
+
logger.debug('Cleared all diagnostics');
|
|
183
|
+
},
|
|
184
|
+
getDiagnostics(uri) {
|
|
185
|
+
return diagnosticsMap.get(uri) ?? [];
|
|
186
|
+
},
|
|
187
|
+
getDiagnosticAtPosition(uri, line, character) {
|
|
188
|
+
const diagnostics = diagnosticsMap.get(uri) ?? [];
|
|
189
|
+
return diagnostics.find((d) => {
|
|
190
|
+
const { start, end } = d.range;
|
|
191
|
+
// Check if position is within range
|
|
192
|
+
if (line < start.line || line > end.line) {
|
|
193
|
+
return false;
|
|
194
|
+
}
|
|
195
|
+
if (line === start.line && character < start.character) {
|
|
196
|
+
return false;
|
|
197
|
+
}
|
|
198
|
+
if (line === end.line && character > end.character) {
|
|
199
|
+
return false;
|
|
200
|
+
}
|
|
201
|
+
return true;
|
|
202
|
+
});
|
|
203
|
+
},
|
|
204
|
+
getViolations(uri) {
|
|
205
|
+
return violationsMap.get(uri) ?? [];
|
|
206
|
+
},
|
|
207
|
+
scheduleUpdate(uri, delayMs = DEFAULT_DIAGNOSTIC_DELAY) {
|
|
208
|
+
// Cancel any existing timer
|
|
209
|
+
const existingTimer = updateTimers.get(uri);
|
|
210
|
+
if (existingTimer) {
|
|
211
|
+
clearTimeout(existingTimer);
|
|
212
|
+
}
|
|
213
|
+
// Schedule new update
|
|
214
|
+
const timer = setTimeout(() => {
|
|
215
|
+
updateTimers.delete(uri);
|
|
216
|
+
this.publishDiagnostics(uri);
|
|
217
|
+
}, delayMs);
|
|
218
|
+
updateTimers.set(uri, timer);
|
|
219
|
+
},
|
|
220
|
+
cancelUpdate(uri) {
|
|
221
|
+
const timer = updateTimers.get(uri);
|
|
222
|
+
if (timer) {
|
|
223
|
+
clearTimeout(timer);
|
|
224
|
+
updateTimers.delete(uri);
|
|
225
|
+
}
|
|
226
|
+
},
|
|
227
|
+
getCoreScanner() {
|
|
228
|
+
return coreScanner;
|
|
229
|
+
},
|
|
230
|
+
getPatternStoreAdapter() {
|
|
231
|
+
return patternStoreAdapter;
|
|
232
|
+
},
|
|
233
|
+
async initializeCoreIntegration(config) {
|
|
234
|
+
logger.info('Initializing core integration...');
|
|
235
|
+
// Determine root directory from workspace folders
|
|
236
|
+
const rootDir = state.workspaceFolders[0]?.uri
|
|
237
|
+
? state.workspaceFolders[0].uri.replace('file://', '')
|
|
238
|
+
: '.';
|
|
239
|
+
const integrationConfig = {
|
|
240
|
+
rootDir,
|
|
241
|
+
...config,
|
|
242
|
+
};
|
|
243
|
+
try {
|
|
244
|
+
// Initialize core scanner
|
|
245
|
+
coreScanner = new CoreScanner(integrationConfig, logger);
|
|
246
|
+
await coreScanner.initialize();
|
|
247
|
+
// Initialize pattern store adapter
|
|
248
|
+
patternStoreAdapter = new PatternStoreAdapter(integrationConfig, logger);
|
|
249
|
+
await patternStoreAdapter.initialize();
|
|
250
|
+
logger.info('Core integration initialized successfully');
|
|
251
|
+
}
|
|
252
|
+
catch (error) {
|
|
253
|
+
logger.error(`Failed to initialize core integration: ${error}`);
|
|
254
|
+
// Don't throw - allow LSP to continue without core integration
|
|
255
|
+
}
|
|
256
|
+
},
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=diagnostics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"diagnostics.js","sourceRoot":"","sources":["../../src/handlers/diagnostics.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Document Sync Handler
|
|
3
|
+
*
|
|
4
|
+
* Handles document synchronization events: open, change, save, close.
|
|
5
|
+
* Triggers diagnostic updates when documents change.
|
|
6
|
+
*
|
|
7
|
+
* @requirements 27.2 - THE LSP_Server SHALL support document synchronization (open, change, save, close)
|
|
8
|
+
* @requirements 27.7 - THE LSP_Server SHALL respond to diagnostics within 200ms of file change
|
|
9
|
+
*/
|
|
10
|
+
import type { DiagnosticsHandler } from './diagnostics.js';
|
|
11
|
+
import type { Connection, TextDocuments, TextDocumentChangeEvent } from 'vscode-languageserver';
|
|
12
|
+
import type { TextDocument } from 'vscode-languageserver-textdocument';
|
|
13
|
+
interface Logger {
|
|
14
|
+
error(message: string): void;
|
|
15
|
+
warn(message: string): void;
|
|
16
|
+
info(message: string): void;
|
|
17
|
+
debug(message: string): void;
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Document sync handler interface
|
|
21
|
+
*/
|
|
22
|
+
export interface DocumentSyncHandler {
|
|
23
|
+
/** Handle document open */
|
|
24
|
+
onDidOpen(document: TextDocument): void;
|
|
25
|
+
/** Handle document content change */
|
|
26
|
+
onDidChangeContent(event: TextDocumentChangeEvent<TextDocument>): void;
|
|
27
|
+
/** Handle document save */
|
|
28
|
+
onDidSave(document: TextDocument): void;
|
|
29
|
+
/** Handle document close */
|
|
30
|
+
onDidClose(document: TextDocument): void;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Create the document sync handler
|
|
34
|
+
*/
|
|
35
|
+
export declare function createDocumentSyncHandler(_connection: Connection, _documents: TextDocuments<TextDocument>, diagnosticsHandler: DiagnosticsHandler, logger: Logger): DocumentSyncHandler;
|
|
36
|
+
export {};
|
|
37
|
+
//# sourceMappingURL=document-sync.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"document-sync.d.ts","sourceRoot":"","sources":["../../src/handlers/document-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"document-sync.d.ts","sourceRoot":"","sources":["../../src/handlers/document-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAC3D,OAAO,KAAK,EAAE,UAAU,EAAE,aAAa,EAAE,uBAAuB,EAAE,MAAM,uBAAuB,CAAC;AAChG,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAMvE,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;;GAEG;AACH,MAAM,WAAW,mBAAmB;IAClC,2BAA2B;IAC3B,SAAS,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IACxC,qCAAqC;IACrC,kBAAkB,CAAC,KAAK,EAAE,uBAAuB,CAAC,YAAY,CAAC,GAAG,IAAI,CAAC;IACvE,2BAA2B;IAC3B,SAAS,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;IACxC,4BAA4B;IAC5B,UAAU,CAAC,QAAQ,EAAE,YAAY,GAAG,IAAI,CAAC;CAC1C;AAMD;;GAEG;AACH,wBAAgB,yBAAyB,CACvC,WAAW,EAAE,UAAU,EACvB,UAAU,EAAE,aAAa,CAAC,YAAY,CAAC,EACvC,kBAAkB,EAAE,kBAAkB,EACtC,MAAM,EAAE,MAAM,GACb,mBAAmB,CAyCrB"}
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Document Sync Handler
|
|
3
|
+
*
|
|
4
|
+
* Handles document synchronization events: open, change, save, close.
|
|
5
|
+
* Triggers diagnostic updates when documents change.
|
|
6
|
+
*
|
|
7
|
+
* @requirements 27.2 - THE LSP_Server SHALL support document synchronization (open, change, save, close)
|
|
8
|
+
* @requirements 27.7 - THE LSP_Server SHALL respond to diagnostics within 200ms of file change
|
|
9
|
+
*/
|
|
10
|
+
// ============================================================================
|
|
11
|
+
// Handler Factory
|
|
12
|
+
// ============================================================================
|
|
13
|
+
/**
|
|
14
|
+
* Create the document sync handler
|
|
15
|
+
*/
|
|
16
|
+
export function createDocumentSyncHandler(_connection, _documents, diagnosticsHandler, logger) {
|
|
17
|
+
return {
|
|
18
|
+
onDidOpen(document) {
|
|
19
|
+
const uri = document.uri;
|
|
20
|
+
logger.debug(`Document opened: ${uri}`);
|
|
21
|
+
// Publish diagnostics immediately for newly opened documents
|
|
22
|
+
diagnosticsHandler.scheduleUpdate(uri, 0);
|
|
23
|
+
},
|
|
24
|
+
onDidChangeContent(event) {
|
|
25
|
+
const document = event.document;
|
|
26
|
+
const uri = document.uri;
|
|
27
|
+
logger.debug(`Document changed: ${uri} (v${document.version})`);
|
|
28
|
+
// Schedule diagnostic update with debouncing
|
|
29
|
+
// This ensures we meet the 200ms latency requirement while
|
|
30
|
+
// avoiding excessive updates during rapid typing
|
|
31
|
+
diagnosticsHandler.scheduleUpdate(uri);
|
|
32
|
+
},
|
|
33
|
+
onDidSave(document) {
|
|
34
|
+
const uri = document.uri;
|
|
35
|
+
logger.debug(`Document saved: ${uri}`);
|
|
36
|
+
// Publish diagnostics immediately on save
|
|
37
|
+
diagnosticsHandler.publishDiagnostics(uri);
|
|
38
|
+
},
|
|
39
|
+
onDidClose(document) {
|
|
40
|
+
const uri = document.uri;
|
|
41
|
+
logger.debug(`Document closed: ${uri}`);
|
|
42
|
+
// Cancel any pending updates
|
|
43
|
+
diagnosticsHandler.cancelUpdate(uri);
|
|
44
|
+
// Clear diagnostics for closed document
|
|
45
|
+
diagnosticsHandler.clearDiagnostics(uri);
|
|
46
|
+
},
|
|
47
|
+
};
|
|
48
|
+
}
|
|
49
|
+
//# sourceMappingURL=document-sync.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"document-sync.js","sourceRoot":"","sources":["../../src/handlers/document-sync.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AA+BH,+EAA+E;AAC/E,kBAAkB;AAClB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,yBAAyB,CACvC,WAAuB,EACvB,UAAuC,EACvC,kBAAsC,EACtC,MAAc;IAEd,OAAO;QACL,SAAS,CAAC,QAAsB;YAC9B,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;YACzB,MAAM,CAAC,KAAK,CAAC,oBAAoB,GAAG,EAAE,CAAC,CAAC;YAExC,6DAA6D;YAC7D,kBAAkB,CAAC,cAAc,CAAC,GAAG,EAAE,CAAC,CAAC,CAAC;QAC5C,CAAC;QAED,kBAAkB,CAAC,KAA4C;YAC7D,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;YAChC,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;YAEzB,MAAM,CAAC,KAAK,CAAC,qBAAqB,GAAG,MAAM,QAAQ,CAAC,OAAO,GAAG,CAAC,CAAC;YAEhE,6CAA6C;YAC7C,2DAA2D;YAC3D,iDAAiD;YACjD,kBAAkB,CAAC,cAAc,CAAC,GAAG,CAAC,CAAC;QACzC,CAAC;QAED,SAAS,CAAC,QAAsB;YAC9B,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;YACzB,MAAM,CAAC,KAAK,CAAC,mBAAmB,GAAG,EAAE,CAAC,CAAC;YAEvC,0CAA0C;YAC1C,kBAAkB,CAAC,kBAAkB,CAAC,GAAG,CAAC,CAAC;QAC7C,CAAC;QAED,UAAU,CAAC,QAAsB;YAC/B,MAAM,GAAG,GAAG,QAAQ,CAAC,GAAG,CAAC;YACzB,MAAM,CAAC,KAAK,CAAC,oBAAoB,GAAG,EAAE,CAAC,CAAC;YAExC,6BAA6B;YAC7B,kBAAkB,CAAC,YAAY,CAAC,GAAG,CAAC,CAAC;YAErC,wCAAwC;YACxC,kBAAkB,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QAC3C,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hover Handler
|
|
3
|
+
*
|
|
4
|
+
* Provides hover information for pattern violations.
|
|
5
|
+
* Shows violation details, pattern information, and available actions.
|
|
6
|
+
*
|
|
7
|
+
* @requirements 27.5 - THE LSP_Server SHALL provide hover information for violations
|
|
8
|
+
*/
|
|
9
|
+
import type { DiagnosticsHandler } from './diagnostics.js';
|
|
10
|
+
import type { Connection, TextDocuments, Hover, HoverParams } from 'vscode-languageserver';
|
|
11
|
+
import type { TextDocument } from 'vscode-languageserver-textdocument';
|
|
12
|
+
interface Logger {
|
|
13
|
+
error(message: string): void;
|
|
14
|
+
warn(message: string): void;
|
|
15
|
+
info(message: string): void;
|
|
16
|
+
debug(message: string): void;
|
|
17
|
+
}
|
|
18
|
+
/**
|
|
19
|
+
* Hover handler interface
|
|
20
|
+
*/
|
|
21
|
+
export interface HoverHandler {
|
|
22
|
+
/** Handle hover request */
|
|
23
|
+
onHover(params: HoverParams): Hover | null;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Create the hover handler
|
|
27
|
+
*/
|
|
28
|
+
export declare function createHoverHandler(_connection: Connection, _documents: TextDocuments<TextDocument>, diagnosticsHandler: DiagnosticsHandler, logger: Logger): HoverHandler;
|
|
29
|
+
export {};
|
|
30
|
+
//# sourceMappingURL=hover.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"hover.d.ts","sourceRoot":"","sources":["../../src/handlers/hover.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EACb,KAAK,EACL,WAAW,EACZ,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;
|
|
1
|
+
{"version":3,"file":"hover.d.ts","sourceRoot":"","sources":["../../src/handlers/hover.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,kBAAkB,EAAuB,MAAM,kBAAkB,CAAC;AAChF,OAAO,KAAK,EACV,UAAU,EACV,aAAa,EACb,KAAK,EACL,WAAW,EACZ,MAAM,uBAAuB,CAAC;AAC/B,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,oCAAoC,CAAC;AAMvE,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;;GAEG;AACH,MAAM,WAAW,YAAY;IAC3B,2BAA2B;IAC3B,OAAO,CAAC,MAAM,EAAE,WAAW,GAAG,KAAK,GAAG,IAAI,CAAC;CAC5C;AAqGD;;GAEG;AACH,wBAAgB,kBAAkB,CAChC,WAAW,EAAE,UAAU,EACvB,UAAU,EAAE,aAAa,CAAC,YAAY,CAAC,EACvC,kBAAkB,EAAE,kBAAkB,EACtC,MAAM,EAAE,MAAM,GACb,YAAY,CAgCd"}
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hover Handler
|
|
3
|
+
*
|
|
4
|
+
* Provides hover information for pattern violations.
|
|
5
|
+
* Shows violation details, pattern information, and available actions.
|
|
6
|
+
*
|
|
7
|
+
* @requirements 27.5 - THE LSP_Server SHALL provide hover information for violations
|
|
8
|
+
*/
|
|
9
|
+
// ============================================================================
|
|
10
|
+
// Helpers
|
|
11
|
+
// ============================================================================
|
|
12
|
+
/**
|
|
13
|
+
* Get severity icon for display
|
|
14
|
+
*/
|
|
15
|
+
function getSeverityIcon(severity) {
|
|
16
|
+
switch (severity) {
|
|
17
|
+
case 1: // Error
|
|
18
|
+
return '🔴';
|
|
19
|
+
case 2: // Warning
|
|
20
|
+
return '🟡';
|
|
21
|
+
case 3: // Information
|
|
22
|
+
return '🔵';
|
|
23
|
+
case 4: // Hint
|
|
24
|
+
return '💡';
|
|
25
|
+
default:
|
|
26
|
+
return '⚪';
|
|
27
|
+
}
|
|
28
|
+
}
|
|
29
|
+
/**
|
|
30
|
+
* Get severity name for display
|
|
31
|
+
*/
|
|
32
|
+
function getSeverityName(severity) {
|
|
33
|
+
switch (severity) {
|
|
34
|
+
case 1:
|
|
35
|
+
return 'Error';
|
|
36
|
+
case 2:
|
|
37
|
+
return 'Warning';
|
|
38
|
+
case 3:
|
|
39
|
+
return 'Info';
|
|
40
|
+
case 4:
|
|
41
|
+
return 'Hint';
|
|
42
|
+
default:
|
|
43
|
+
return 'Unknown';
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Generate hover content for a diagnostic
|
|
48
|
+
*/
|
|
49
|
+
function generateHoverContent(diagnostic) {
|
|
50
|
+
const lines = [];
|
|
51
|
+
const data = diagnostic.data;
|
|
52
|
+
// Header with severity icon
|
|
53
|
+
const icon = getSeverityIcon(diagnostic.severity);
|
|
54
|
+
const severityName = getSeverityName(diagnostic.severity);
|
|
55
|
+
lines.push(`## ${icon} Drift Violation (${severityName})`);
|
|
56
|
+
lines.push('');
|
|
57
|
+
// Message
|
|
58
|
+
lines.push(`**Message:** ${diagnostic.message}`);
|
|
59
|
+
lines.push('');
|
|
60
|
+
// Pattern information
|
|
61
|
+
if (data) {
|
|
62
|
+
lines.push(`**Pattern:** \`${data.patternId}\``);
|
|
63
|
+
lines.push('');
|
|
64
|
+
}
|
|
65
|
+
// Divider
|
|
66
|
+
lines.push('---');
|
|
67
|
+
lines.push('');
|
|
68
|
+
// Available actions
|
|
69
|
+
lines.push('### Available Actions');
|
|
70
|
+
lines.push('');
|
|
71
|
+
if (data?.hasQuickFix) {
|
|
72
|
+
lines.push('- 💡 **Quick Fix** available');
|
|
73
|
+
}
|
|
74
|
+
lines.push('- ✅ **Approve** this pattern');
|
|
75
|
+
lines.push('- 🚫 **Ignore** this pattern');
|
|
76
|
+
lines.push('- 📝 **Create Variant** for intentional deviation');
|
|
77
|
+
if (data?.aiExplainAvailable) {
|
|
78
|
+
lines.push('- 🤖 **Explain with AI**');
|
|
79
|
+
}
|
|
80
|
+
if (data?.aiFixAvailable) {
|
|
81
|
+
lines.push('- 🔧 **Fix with AI**');
|
|
82
|
+
}
|
|
83
|
+
lines.push('');
|
|
84
|
+
lines.push('---');
|
|
85
|
+
lines.push('');
|
|
86
|
+
lines.push('*Use Quick Fix (Ctrl+.) to see available actions*');
|
|
87
|
+
return lines.join('\n');
|
|
88
|
+
}
|
|
89
|
+
// ============================================================================
|
|
90
|
+
// Handler Factory
|
|
91
|
+
// ============================================================================
|
|
92
|
+
/**
|
|
93
|
+
* Create the hover handler
|
|
94
|
+
*/
|
|
95
|
+
export function createHoverHandler(_connection, _documents, diagnosticsHandler, logger) {
|
|
96
|
+
return {
|
|
97
|
+
onHover(params) {
|
|
98
|
+
const uri = params.textDocument.uri;
|
|
99
|
+
const position = params.position;
|
|
100
|
+
logger.debug(`Hover request at ${uri}:${position.line}:${position.character}`);
|
|
101
|
+
// Find diagnostic at this position
|
|
102
|
+
const diagnostic = diagnosticsHandler.getDiagnosticAtPosition(uri, position.line, position.character);
|
|
103
|
+
if (!diagnostic) {
|
|
104
|
+
// No violation at this position
|
|
105
|
+
return null;
|
|
106
|
+
}
|
|
107
|
+
// Generate hover content
|
|
108
|
+
const content = generateHoverContent(diagnostic);
|
|
109
|
+
return {
|
|
110
|
+
contents: {
|
|
111
|
+
kind: 'markdown',
|
|
112
|
+
value: content,
|
|
113
|
+
},
|
|
114
|
+
range: diagnostic.range,
|
|
115
|
+
};
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
//# sourceMappingURL=hover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hover.js","sourceRoot":"","sources":["../../src/handlers/hover.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AA8BH,+EAA+E;AAC/E,UAAU;AACV,+EAA+E;AAE/E;;GAEG;AACH,SAAS,eAAe,CAAC,QAA4B;IACnD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,CAAC,EAAE,QAAQ;YACd,OAAO,IAAI,CAAC;QACd,KAAK,CAAC,EAAE,UAAU;YAChB,OAAO,IAAI,CAAC;QACd,KAAK,CAAC,EAAE,cAAc;YACpB,OAAO,IAAI,CAAC;QACd,KAAK,CAAC,EAAE,OAAO;YACb,OAAO,IAAI,CAAC;QACd;YACE,OAAO,GAAG,CAAC;IACf,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,eAAe,CAAC,QAA4B;IACnD,QAAQ,QAAQ,EAAE,CAAC;QACjB,KAAK,CAAC;YACJ,OAAO,OAAO,CAAC;QACjB,KAAK,CAAC;YACJ,OAAO,SAAS,CAAC;QACnB,KAAK,CAAC;YACJ,OAAO,MAAM,CAAC;QAChB,KAAK,CAAC;YACJ,OAAO,MAAM,CAAC;QAChB;YACE,OAAO,SAAS,CAAC;IACrB,CAAC;AACH,CAAC;AAED;;GAEG;AACH,SAAS,oBAAoB,CAAC,UAA+B;IAC3D,MAAM,KAAK,GAAa,EAAE,CAAC;IAC3B,MAAM,IAAI,GAAG,UAAU,CAAC,IAAI,CAAC;IAE7B,4BAA4B;IAC5B,MAAM,IAAI,GAAG,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAClD,MAAM,YAAY,GAAG,eAAe,CAAC,UAAU,CAAC,QAAQ,CAAC,CAAC;IAC1D,KAAK,CAAC,IAAI,CAAC,MAAM,IAAI,qBAAqB,YAAY,GAAG,CAAC,CAAC;IAC3D,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,UAAU;IACV,KAAK,CAAC,IAAI,CAAC,gBAAgB,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC;IACjD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,sBAAsB;IACtB,IAAI,IAAI,EAAE,CAAC;QACT,KAAK,CAAC,IAAI,CAAC,kBAAkB,IAAI,CAAC,SAAS,IAAI,CAAC,CAAC;QACjD,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACjB,CAAC;IAED,UAAU;IACV,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,oBAAoB;IACpB,KAAK,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC;IACpC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAEf,IAAI,IAAI,EAAE,WAAW,EAAE,CAAC;QACtB,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC3C,KAAK,CAAC,IAAI,CAAC,8BAA8B,CAAC,CAAC;IAC3C,KAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;IAEhE,IAAI,IAAI,EAAE,kBAAkB,EAAE,CAAC;QAC7B,KAAK,CAAC,IAAI,CAAC,0BAA0B,CAAC,CAAC;IACzC,CAAC;IAED,IAAI,IAAI,EAAE,cAAc,EAAE,CAAC;QACzB,KAAK,CAAC,IAAI,CAAC,sBAAsB,CAAC,CAAC;IACrC,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IAClB,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IACf,KAAK,CAAC,IAAI,CAAC,mDAAmD,CAAC,CAAC;IAEhE,OAAO,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AAC1B,CAAC;AAED,+EAA+E;AAC/E,kBAAkB;AAClB,+EAA+E;AAE/E;;GAEG;AACH,MAAM,UAAU,kBAAkB,CAChC,WAAuB,EACvB,UAAuC,EACvC,kBAAsC,EACtC,MAAc;IAEd,OAAO;QACL,OAAO,CAAC,MAAmB;YACzB,MAAM,GAAG,GAAG,MAAM,CAAC,YAAY,CAAC,GAAG,CAAC;YACpC,MAAM,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;YAEjC,MAAM,CAAC,KAAK,CAAC,oBAAoB,GAAG,IAAI,QAAQ,CAAC,IAAI,IAAI,QAAQ,CAAC,SAAS,EAAE,CAAC,CAAC;YAE/E,mCAAmC;YACnC,MAAM,UAAU,GAAG,kBAAkB,CAAC,uBAAuB,CAC3D,GAAG,EACH,QAAQ,CAAC,IAAI,EACb,QAAQ,CAAC,SAAS,CACnB,CAAC;YAEF,IAAI,CAAC,UAAU,EAAE,CAAC;gBAChB,gCAAgC;gBAChC,OAAO,IAAI,CAAC;YACd,CAAC;YAED,yBAAyB;YACzB,MAAM,OAAO,GAAG,oBAAoB,CAAC,UAAU,CAAC,CAAC;YAEjD,OAAO;gBACL,QAAQ,EAAE;oBACR,IAAI,EAAE,UAAU;oBAChB,KAAK,EAAE,OAAO;iBACf;gBACD,KAAK,EAAE,UAAU,CAAC,KAAK;aACxB,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"core-scanner.d.ts","sourceRoot":"","sources":["../../src/integration/core-scanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;
|
|
1
|
+
{"version":3,"file":"core-scanner.d.ts","sourceRoot":"","sources":["../../src/integration/core-scanner.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,YAAY,EAWb,MAAM,kBAAkB,CAAC;AAK1B,OAAO,KAAK,EACV,qBAAqB,EACrB,UAAU,EACV,WAAW,EAEZ,MAAM,YAAY,CAAC;AAGpB;;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;;;;;;GAMG;AACH,qBAAa,WAAW;IACtB,OAAO,CAAC,MAAM,CAAwB;IACtC,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,YAAY,CAA6B;IACjD,OAAO,CAAC,aAAa,CAA8B;IACnD,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,WAAW,CAAkB;IACrC,OAAO,CAAC,SAAS,CAA8E;IAC/F,OAAO,CAAC,YAAY,CAAgB;gBAExB,MAAM,EAAE,OAAO,CAAC,qBAAqB,CAAC,YAAK,EAAE,MAAM,EAAE,MAAM;IAKvE;;;;OAIG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IA8CjC;;OAEG;IACH,aAAa,IAAI,OAAO;IAIxB;;OAEG;IACH,eAAe,IAAI,YAAY,GAAG,IAAI;IAItC;;;;;OAKG;IACG,IAAI,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,GAAE,WAAgB,GAAG,OAAO,CAAC,UAAU,CAAC;IA2HxF;;OAEG;IACH,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI;IAIlC;;OAEG;IACH,UAAU,IAAI,IAAI;IAIlB;;OAEG;IACH,OAAO,CAAC,eAAe;IA0BvB;;OAEG;IACH,OAAO,CAAC,SAAS;IASjB;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA+B1B;;OAEG;IACG,QAAQ,IAAI,OAAO,CAAC,IAAI,CAAC;CAgBhC;AAED;;GAEG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,OAAO,CAAC,qBAAqB,CAAC,YAAK,EAC3C,MAAM,EAAE,MAAM,GACb,WAAW,CAEb"}
|