driftdetect-lsp 0.9.27 → 0.9.29

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 (111) hide show
  1. package/package.json +3 -3
  2. package/dist/bin/server.d.ts +0 -12
  3. package/dist/bin/server.js +0 -26
  4. package/dist/bin/server.js.map +0 -1
  5. package/dist/capabilities.d.ts +0 -91
  6. package/dist/capabilities.d.ts.map +0 -1
  7. package/dist/capabilities.js +0 -183
  8. package/dist/capabilities.js.map +0 -1
  9. package/dist/commands/approve-pattern.d.ts +0 -15
  10. package/dist/commands/approve-pattern.js +0 -83
  11. package/dist/commands/approve-pattern.js.map +0 -1
  12. package/dist/commands/create-variant.d.ts +0 -22
  13. package/dist/commands/create-variant.js +0 -109
  14. package/dist/commands/create-variant.js.map +0 -1
  15. package/dist/commands/explain-ai.d.ts +0 -11
  16. package/dist/commands/explain-ai.js +0 -144
  17. package/dist/commands/explain-ai.js.map +0 -1
  18. package/dist/commands/fix-ai.d.ts +0 -11
  19. package/dist/commands/fix-ai.js +0 -146
  20. package/dist/commands/fix-ai.js.map +0 -1
  21. package/dist/commands/ignore-once.d.ts +0 -33
  22. package/dist/commands/ignore-once.js +0 -147
  23. package/dist/commands/ignore-once.js.map +0 -1
  24. package/dist/commands/ignore-pattern.d.ts +0 -15
  25. package/dist/commands/ignore-pattern.js +0 -77
  26. package/dist/commands/ignore-pattern.js.map +0 -1
  27. package/dist/commands/index.d.ts +0 -14
  28. package/dist/commands/index.js +0 -14
  29. package/dist/commands/index.js.map +0 -1
  30. package/dist/commands/rescan.d.ts +0 -19
  31. package/dist/commands/rescan.js +0 -125
  32. package/dist/commands/rescan.js.map +0 -1
  33. package/dist/commands/show-patterns.d.ts +0 -30
  34. package/dist/commands/show-patterns.js +0 -175
  35. package/dist/commands/show-patterns.js.map +0 -1
  36. package/dist/commands/show-violations.d.ts +0 -11
  37. package/dist/commands/show-violations.js +0 -259
  38. package/dist/commands/show-violations.js.map +0 -1
  39. package/dist/handlers/code-actions.d.ts +0 -32
  40. package/dist/handlers/code-actions.js +0 -184
  41. package/dist/handlers/code-actions.js.map +0 -1
  42. package/dist/handlers/code-lens.d.ts +0 -32
  43. package/dist/handlers/code-lens.js +0 -162
  44. package/dist/handlers/code-lens.js.map +0 -1
  45. package/dist/handlers/commands.d.ts +0 -48
  46. package/dist/handlers/commands.js +0 -360
  47. package/dist/handlers/commands.js.map +0 -1
  48. package/dist/handlers/diagnostics.d.ts +0 -73
  49. package/dist/handlers/diagnostics.js +0 -259
  50. package/dist/handlers/diagnostics.js.map +0 -1
  51. package/dist/handlers/document-sync.d.ts +0 -37
  52. package/dist/handlers/document-sync.js +0 -49
  53. package/dist/handlers/document-sync.js.map +0 -1
  54. package/dist/handlers/hover.d.ts +0 -30
  55. package/dist/handlers/hover.js +0 -119
  56. package/dist/handlers/hover.js.map +0 -1
  57. package/dist/handlers/index.d.ts +0 -23
  58. package/dist/handlers/index.js +0 -16
  59. package/dist/handlers/index.js.map +0 -1
  60. package/dist/handlers/initialize.d.ts +0 -41
  61. package/dist/handlers/initialize.d.ts.map +0 -1
  62. package/dist/handlers/initialize.js +0 -33
  63. package/dist/handlers/initialize.js.map +0 -1
  64. package/dist/index.d.ts +0 -22
  65. package/dist/index.js +0 -26
  66. package/dist/index.js.map +0 -1
  67. package/dist/integration/core-scanner.d.ts +0 -89
  68. package/dist/integration/core-scanner.js +0 -309
  69. package/dist/integration/core-scanner.js.map +0 -1
  70. package/dist/integration/index.d.ts +0 -11
  71. package/dist/integration/index.js +0 -11
  72. package/dist/integration/index.js.map +0 -1
  73. package/dist/integration/pattern-store-adapter.d.ts +0 -117
  74. package/dist/integration/pattern-store-adapter.js +0 -349
  75. package/dist/integration/pattern-store-adapter.js.map +0 -1
  76. package/dist/integration/types.d.ts +0 -134
  77. package/dist/integration/types.js +0 -39
  78. package/dist/integration/types.js.map +0 -1
  79. package/dist/server/index.d.ts +0 -5
  80. package/dist/server/index.js +0 -5
  81. package/dist/server/index.js.map +0 -1
  82. package/dist/server/types.d.ts +0 -139
  83. package/dist/server/types.js +0 -8
  84. package/dist/server/types.js.map +0 -1
  85. package/dist/server.d.ts +0 -63
  86. package/dist/server.js +0 -208
  87. package/dist/server.js.map +0 -1
  88. package/dist/types/index.d.ts +0 -5
  89. package/dist/types/index.js +0 -5
  90. package/dist/types/index.js.map +0 -1
  91. package/dist/types/lsp-types.d.ts +0 -321
  92. package/dist/types/lsp-types.js +0 -274
  93. package/dist/types/lsp-types.js.map +0 -1
  94. package/dist/utils/diagnostic.d.ts +0 -84
  95. package/dist/utils/diagnostic.js +0 -256
  96. package/dist/utils/diagnostic.js.map +0 -1
  97. package/dist/utils/document.d.ts +0 -40
  98. package/dist/utils/document.d.ts.map +0 -1
  99. package/dist/utils/document.js +0 -138
  100. package/dist/utils/document.js.map +0 -1
  101. package/dist/utils/index.d.ts +0 -8
  102. package/dist/utils/index.d.ts.map +0 -1
  103. package/dist/utils/index.js +0 -8
  104. package/dist/utils/index.js.map +0 -1
  105. package/dist/utils/position.d.ts +0 -44
  106. package/dist/utils/position.d.ts.map +0 -1
  107. package/dist/utils/position.js +0 -96
  108. package/dist/utils/position.js.map +0 -1
  109. package/dist/utils/workspace.d.ts +0 -98
  110. package/dist/utils/workspace.js +0 -241
  111. package/dist/utils/workspace.js.map +0 -1
@@ -1,360 +0,0 @@
1
- /**
2
- * Commands Handler
3
- *
4
- * Handles execution of Drift LSP commands.
5
- * Routes commands to appropriate handlers and returns results.
6
- * Integrates with driftdetect-core pattern store for persistence.
7
- *
8
- * @requirements 28.1 - drift.approvePattern
9
- * @requirements 28.2 - drift.ignorePattern
10
- * @requirements 28.3 - drift.ignoreOnce
11
- * @requirements 28.4 - drift.createVariant
12
- * @requirements 28.5 - drift.explainWithAI
13
- * @requirements 28.6 - drift.fixWithAI
14
- * @requirements 28.7 - drift.rescan
15
- * @requirements 28.8 - drift.showPatterns
16
- * @requirements 28.9 - drift.showViolations
17
- */
18
- import { DRIFT_COMMANDS } from '../capabilities.js';
19
- // ============================================================================
20
- // Command Implementations
21
- // ============================================================================
22
- /**
23
- * Approve a pattern
24
- * @requirements 28.1 - drift.approvePattern
25
- */
26
- async function executeApprovePattern(connection, diagnosticsHandler, logger, patternId) {
27
- logger.info(`Approving pattern: ${patternId}`);
28
- // Get the pattern store adapter from diagnostics handler
29
- const patternStoreAdapter = diagnosticsHandler.getPatternStoreAdapter();
30
- if (patternStoreAdapter && patternStoreAdapter.isInitialized()) {
31
- // Use the pattern store adapter to persist the approval
32
- const result = await patternStoreAdapter.approve(patternId);
33
- if (result.success) {
34
- // Clear diagnostics for all documents to remove violations for this pattern
35
- diagnosticsHandler.clearAllDiagnostics();
36
- connection.window.showInformationMessage(`Pattern "${patternId}" approved. ${result.removedViolations} violation(s) will be cleared.`);
37
- return {
38
- success: true,
39
- message: `Pattern "${patternId}" approved`,
40
- data: { patternId, removedViolations: result.removedViolations },
41
- };
42
- }
43
- else {
44
- connection.window.showErrorMessage(`Failed to approve pattern: ${result.error ?? 'Unknown error'}`);
45
- return {
46
- success: false,
47
- error: result.error ?? 'Unknown error',
48
- };
49
- }
50
- }
51
- // Fallback if pattern store adapter not available
52
- connection.window.showInformationMessage(`Pattern "${patternId}" approved. Violations will be cleared.`);
53
- return {
54
- success: true,
55
- message: `Pattern "${patternId}" approved`,
56
- data: { patternId },
57
- };
58
- }
59
- /**
60
- * Ignore a pattern
61
- * @requirements 28.2 - drift.ignorePattern
62
- */
63
- async function executeIgnorePattern(connection, diagnosticsHandler, logger, patternId) {
64
- logger.info(`Ignoring pattern: ${patternId}`);
65
- // Get the pattern store adapter from diagnostics handler
66
- const patternStoreAdapter = diagnosticsHandler.getPatternStoreAdapter();
67
- if (patternStoreAdapter && patternStoreAdapter.isInitialized()) {
68
- // Use the pattern store adapter to persist the ignore
69
- const result = await patternStoreAdapter.ignore(patternId);
70
- if (result.success) {
71
- // Clear diagnostics for all documents to remove violations for this pattern
72
- diagnosticsHandler.clearAllDiagnostics();
73
- connection.window.showInformationMessage(`Pattern "${patternId}" ignored. ${result.suppressedViolations} violation(s) will be suppressed.`);
74
- return {
75
- success: true,
76
- message: `Pattern "${patternId}" ignored`,
77
- data: { patternId, suppressedViolations: result.suppressedViolations },
78
- };
79
- }
80
- else {
81
- connection.window.showErrorMessage(`Failed to ignore pattern: ${result.error ?? 'Unknown error'}`);
82
- return {
83
- success: false,
84
- error: result.error ?? 'Unknown error',
85
- };
86
- }
87
- }
88
- // Fallback if pattern store adapter not available
89
- connection.window.showInformationMessage(`Pattern "${patternId}" ignored. Violations will be suppressed.`);
90
- return {
91
- success: true,
92
- message: `Pattern "${patternId}" ignored`,
93
- data: { patternId },
94
- };
95
- }
96
- /**
97
- * Ignore a single occurrence
98
- * @requirements 28.3 - drift.ignoreOnce
99
- */
100
- async function executeIgnoreOnce(connection, logger, violationId, uri, line) {
101
- logger.info(`Ignoring violation once: ${violationId} at ${uri}:${line}`);
102
- // TODO: Add ignore comment to the file
103
- // - Insert // drift-ignore-next-line or similar
104
- // - Re-scan the document
105
- connection.window.showInformationMessage(`Violation ignored for this occurrence.`);
106
- return {
107
- success: true,
108
- message: 'Violation ignored',
109
- data: { violationId, uri, line },
110
- };
111
- }
112
- /**
113
- * Create a variant
114
- * @requirements 28.4 - drift.createVariant
115
- */
116
- async function executeCreateVariant(connection, diagnosticsHandler, logger, patternId, violationId, file, line, column) {
117
- logger.info(`Creating variant for pattern: ${patternId}`);
118
- // Get the pattern store adapter from diagnostics handler
119
- const patternStoreAdapter = diagnosticsHandler.getPatternStoreAdapter();
120
- if (patternStoreAdapter && patternStoreAdapter.isInitialized()) {
121
- // Generate a variant name
122
- const variantName = `variant-${Date.now().toString(36)}`;
123
- // Build the variant input, conditionally including scopeValue
124
- const variantInput = {
125
- patternId,
126
- name: variantName,
127
- reason: 'Intentional deviation from pattern',
128
- scope: file ? 'file' : 'global',
129
- file: file || '',
130
- line: line || 1,
131
- column: column || 1,
132
- };
133
- // Only add scopeValue if file is provided
134
- if (file) {
135
- variantInput.scopeValue = file;
136
- }
137
- // Create the variant
138
- const result = await patternStoreAdapter.createVariant(variantInput);
139
- if (result.success) {
140
- connection.window.showInformationMessage(`Variant "${variantName}" created for pattern "${patternId}". Configure it in .drift/patterns/variants/`);
141
- return {
142
- success: true,
143
- message: `Variant "${variantName}" created`,
144
- data: { patternId, variantName, variantId: result.variantId, violationId },
145
- };
146
- }
147
- else {
148
- connection.window.showErrorMessage(`Failed to create variant: ${result.error ?? 'Unknown error'}`);
149
- return {
150
- success: false,
151
- error: result.error ?? 'Unknown error',
152
- };
153
- }
154
- }
155
- // Fallback if pattern store adapter not available
156
- const variantName = `variant-${Date.now()}`;
157
- connection.window.showInformationMessage(`Variant "${variantName}" created for pattern "${patternId}". Configure it in .drift/patterns/variants/`);
158
- return {
159
- success: true,
160
- message: `Variant "${variantName}" created`,
161
- data: { patternId, variantName, violationId },
162
- };
163
- }
164
- /**
165
- * Explain with AI
166
- * @requirements 28.5 - drift.explainWithAI
167
- */
168
- async function executeExplainAI(connection, logger, violationId, patternId) {
169
- logger.info(`AI explain requested for violation: ${violationId}`);
170
- // TODO: Integrate with @drift/ai
171
- // - Build context from violation and pattern
172
- // - Send to AI provider
173
- // - Display explanation to user
174
- connection.window.showInformationMessage('AI explanation feature requires @drift/ai integration. Coming soon!');
175
- return {
176
- success: true,
177
- message: 'AI explain requested',
178
- data: { violationId, patternId },
179
- };
180
- }
181
- /**
182
- * Fix with AI
183
- * @requirements 28.6 - drift.fixWithAI
184
- */
185
- async function executeFixAI(connection, logger, violationId, uri) {
186
- logger.info(`AI fix requested for violation: ${violationId}`);
187
- // TODO: Integrate with @drift/ai
188
- // - Build context from violation
189
- // - Generate fix with AI
190
- // - Show diff preview
191
- // - Apply fix if confirmed
192
- connection.window.showInformationMessage('AI fix feature requires @drift/ai integration. Coming soon!');
193
- return {
194
- success: true,
195
- message: 'AI fix requested',
196
- data: { violationId, uri },
197
- };
198
- }
199
- /**
200
- * Rescan workspace
201
- * @requirements 28.7 - drift.rescan
202
- */
203
- async function executeRescan(connection, documents, diagnosticsHandler, logger, uri) {
204
- logger.info(`Rescan requested${uri ? ` for: ${uri}` : ' for all documents'}`);
205
- // Get documents to scan
206
- const documentsToScan = uri
207
- ? [documents.get(uri)].filter((d) => d !== undefined)
208
- : documents.all();
209
- if (documentsToScan.length === 0) {
210
- return {
211
- success: true,
212
- message: 'No documents to scan',
213
- data: { scannedCount: 0 },
214
- };
215
- }
216
- // Note: withProgress is not available in vscode-languageserver
217
- // Show a simple message instead
218
- connection.window.showInformationMessage(`Rescanning ${documentsToScan.length} document(s)...`);
219
- for (const doc of documentsToScan) {
220
- await diagnosticsHandler.publishDiagnostics(doc.uri);
221
- }
222
- connection.window.showInformationMessage(`Rescan complete: ${documentsToScan.length} document(s) scanned.`);
223
- return {
224
- success: true,
225
- message: 'Rescan complete',
226
- data: { scannedCount: documentsToScan.length },
227
- };
228
- }
229
- /**
230
- * Show patterns
231
- * @requirements 28.8 - drift.showPatterns
232
- */
233
- async function executeShowPatterns(connection, diagnosticsHandler, logger, patternId) {
234
- logger.info(`Show patterns requested${patternId ? `: ${patternId}` : ''}`);
235
- // Get the pattern store adapter from diagnostics handler
236
- const patternStoreAdapter = diagnosticsHandler.getPatternStoreAdapter();
237
- if (patternStoreAdapter && patternStoreAdapter.isInitialized()) {
238
- if (patternId) {
239
- // Get specific pattern
240
- const pattern = patternStoreAdapter.getPattern(patternId);
241
- if (pattern) {
242
- connection.window.showInformationMessage(`Pattern "${pattern.name}": ${pattern.description || 'No description'} (confidence: ${(pattern.confidence ?? 0) * 100}%)`);
243
- return {
244
- success: true,
245
- message: 'Pattern found',
246
- data: { pattern },
247
- };
248
- }
249
- else {
250
- connection.window.showWarningMessage(`Pattern not found: ${patternId}`);
251
- return {
252
- success: false,
253
- error: `Pattern not found: ${patternId}`,
254
- };
255
- }
256
- }
257
- else {
258
- // Get all patterns
259
- const approved = patternStoreAdapter.getApprovedPatterns();
260
- const discovered = patternStoreAdapter.getDiscoveredPatterns();
261
- const ignored = patternStoreAdapter.getIgnoredPatterns();
262
- connection.window.showInformationMessage(`Patterns: ${approved.length} approved, ${discovered.length} discovered, ${ignored.length} ignored`);
263
- return {
264
- success: true,
265
- message: 'Patterns retrieved',
266
- data: {
267
- approved: approved.length,
268
- discovered: discovered.length,
269
- ignored: ignored.length,
270
- patterns: [...approved, ...discovered],
271
- },
272
- };
273
- }
274
- }
275
- // Fallback if pattern store adapter not available
276
- connection.window.showInformationMessage('Pattern viewer coming soon! Patterns are stored in .drift/patterns/');
277
- return {
278
- success: true,
279
- message: 'Show patterns',
280
- data: { patternId },
281
- };
282
- }
283
- /**
284
- * Show violations
285
- * @requirements 28.9 - drift.showViolations
286
- */
287
- async function executeShowViolations(connection, diagnosticsHandler, logger, uri, patternId, violationId) {
288
- logger.info(`Show violations requested${uri ? ` for: ${uri}` : ''}${patternId ? ` pattern: ${patternId}` : ''}`);
289
- // Get violations
290
- if (uri) {
291
- const diagnostics = diagnosticsHandler.getDiagnostics(uri);
292
- const filtered = patternId
293
- ? diagnostics.filter((d) => d.data?.patternId === patternId)
294
- : diagnostics;
295
- connection.window.showInformationMessage(`Found ${filtered.length} violation(s) in this file.`);
296
- return {
297
- success: true,
298
- message: `${filtered.length} violations`,
299
- data: { uri, patternId, count: filtered.length },
300
- };
301
- }
302
- // TODO: Show all violations across workspace
303
- connection.window.showInformationMessage('Violation viewer coming soon!');
304
- return {
305
- success: true,
306
- message: 'Show violations',
307
- data: { patternId, violationId },
308
- };
309
- }
310
- // ============================================================================
311
- // Handler Factory
312
- // ============================================================================
313
- /**
314
- * Create the commands handler
315
- */
316
- export function createCommandsHandler(connection, documents, diagnosticsHandler, logger) {
317
- return {
318
- async onExecuteCommand(params) {
319
- const { command, arguments: args = [] } = params;
320
- logger.debug(`Executing command: ${command}`);
321
- try {
322
- switch (command) {
323
- case DRIFT_COMMANDS.APPROVE_PATTERN:
324
- return await executeApprovePattern(connection, diagnosticsHandler, logger, args[0]);
325
- case DRIFT_COMMANDS.IGNORE_PATTERN:
326
- return await executeIgnorePattern(connection, diagnosticsHandler, logger, args[0]);
327
- case DRIFT_COMMANDS.IGNORE_ONCE:
328
- return await executeIgnoreOnce(connection, logger, args[0], args[1], args[2]);
329
- case DRIFT_COMMANDS.CREATE_VARIANT:
330
- return await executeCreateVariant(connection, diagnosticsHandler, logger, args[0], args[1], args[2], args[3], args[4]);
331
- case DRIFT_COMMANDS.EXPLAIN_AI:
332
- return await executeExplainAI(connection, logger, args[0], args[1]);
333
- case DRIFT_COMMANDS.FIX_AI:
334
- return await executeFixAI(connection, logger, args[0], args[1]);
335
- case DRIFT_COMMANDS.RESCAN:
336
- return await executeRescan(connection, documents, diagnosticsHandler, logger, args[0]);
337
- case DRIFT_COMMANDS.SHOW_PATTERNS:
338
- return await executeShowPatterns(connection, diagnosticsHandler, logger, args[0]);
339
- case DRIFT_COMMANDS.SHOW_VIOLATIONS:
340
- return await executeShowViolations(connection, diagnosticsHandler, logger, args[0], args[1], args[2]);
341
- default:
342
- logger.warn(`Unknown command: ${command}`);
343
- return {
344
- success: false,
345
- error: `Unknown command: ${command}`,
346
- };
347
- }
348
- }
349
- catch (error) {
350
- const errorMessage = error instanceof Error ? error.message : String(error);
351
- logger.error(`Command ${command} failed: ${errorMessage}`);
352
- return {
353
- success: false,
354
- error: errorMessage,
355
- };
356
- }
357
- },
358
- };
359
- }
360
- //# sourceMappingURL=commands.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"commands.js","sourceRoot":"","sources":["../../src/handlers/commands.ts"],"names":[],"mappings":"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"}
@@ -1,73 +0,0 @@
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 type { Connection, Diagnostic, TextDocuments } from 'vscode-languageserver';
12
- import type { TextDocument } from 'vscode-languageserver-textdocument';
13
- import type { Violation } from 'driftdetect-core';
14
- import { CoreScanner, PatternStoreAdapter, type CoreIntegrationConfig } from '../integration/index.js';
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