@nielspeter/sonarlint-mcp-server 0.1.3 → 0.2.1

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 (84) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/errors.d.ts +22 -0
  3. package/dist/errors.d.ts.map +1 -0
  4. package/dist/errors.js +44 -0
  5. package/dist/errors.js.map +1 -0
  6. package/dist/index.js +115 -1330
  7. package/dist/index.js.map +1 -1
  8. package/dist/resources/session.d.ts +18 -0
  9. package/dist/resources/session.d.ts.map +1 -0
  10. package/dist/resources/session.js +84 -0
  11. package/dist/resources/session.js.map +1 -0
  12. package/dist/sloop-bridge.d.ts +0 -3
  13. package/dist/sloop-bridge.d.ts.map +1 -1
  14. package/dist/sloop-bridge.js +0 -19
  15. package/dist/sloop-bridge.js.map +1 -1
  16. package/dist/state.d.ts +19 -0
  17. package/dist/state.d.ts.map +1 -0
  18. package/dist/state.js +25 -0
  19. package/dist/state.js.map +1 -0
  20. package/dist/tools/analyze-content.d.ts +7 -0
  21. package/dist/tools/analyze-content.d.ts.map +1 -0
  22. package/dist/tools/analyze-content.js +78 -0
  23. package/dist/tools/analyze-content.js.map +1 -0
  24. package/dist/tools/analyze-file.d.ts +7 -0
  25. package/dist/tools/analyze-file.d.ts.map +1 -0
  26. package/dist/tools/analyze-file.js +66 -0
  27. package/dist/tools/analyze-file.js.map +1 -0
  28. package/dist/tools/analyze-files.d.ts +7 -0
  29. package/dist/tools/analyze-files.d.ts.map +1 -0
  30. package/dist/tools/analyze-files.js +106 -0
  31. package/dist/tools/analyze-files.js.map +1 -0
  32. package/dist/tools/analyze-project.d.ts +7 -0
  33. package/dist/tools/analyze-project.d.ts.map +1 -0
  34. package/dist/tools/analyze-project.js +109 -0
  35. package/dist/tools/analyze-project.js.map +1 -0
  36. package/dist/tools/apply-all-quick-fixes.d.ts +7 -0
  37. package/dist/tools/apply-all-quick-fixes.d.ts.map +1 -0
  38. package/dist/tools/apply-all-quick-fixes.js +166 -0
  39. package/dist/tools/apply-all-quick-fixes.js.map +1 -0
  40. package/dist/tools/apply-quick-fix.d.ts +7 -0
  41. package/dist/tools/apply-quick-fix.d.ts.map +1 -0
  42. package/dist/tools/apply-quick-fix.js +113 -0
  43. package/dist/tools/apply-quick-fix.js.map +1 -0
  44. package/dist/tools/health-check.d.ts +7 -0
  45. package/dist/tools/health-check.d.ts.map +1 -0
  46. package/dist/tools/health-check.js +113 -0
  47. package/dist/tools/health-check.js.map +1 -0
  48. package/dist/tools/list-active-rules.d.ts +7 -0
  49. package/dist/tools/list-active-rules.d.ts.map +1 -0
  50. package/dist/tools/list-active-rules.js +48 -0
  51. package/dist/tools/list-active-rules.js.map +1 -0
  52. package/dist/types.d.ts +62 -0
  53. package/dist/types.d.ts.map +1 -0
  54. package/dist/types.js +5 -0
  55. package/dist/types.js.map +1 -0
  56. package/dist/utils/filesystem.d.ts +8 -0
  57. package/dist/utils/filesystem.d.ts.map +1 -0
  58. package/dist/utils/filesystem.js +74 -0
  59. package/dist/utils/filesystem.js.map +1 -0
  60. package/dist/utils/formatting.d.ts +13 -0
  61. package/dist/utils/formatting.d.ts.map +1 -0
  62. package/dist/utils/formatting.js +94 -0
  63. package/dist/utils/formatting.js.map +1 -0
  64. package/dist/utils/language.d.ts +12 -0
  65. package/dist/utils/language.d.ts.map +1 -0
  66. package/dist/utils/language.js +44 -0
  67. package/dist/utils/language.js.map +1 -0
  68. package/dist/utils/scope.d.ts +8 -0
  69. package/dist/utils/scope.d.ts.map +1 -0
  70. package/dist/utils/scope.js +30 -0
  71. package/dist/utils/scope.js.map +1 -0
  72. package/dist/utils/sloop.d.ts +10 -0
  73. package/dist/utils/sloop.d.ts.map +1 -0
  74. package/dist/utils/sloop.js +39 -0
  75. package/dist/utils/sloop.js.map +1 -0
  76. package/dist/utils/transforms.d.ts +23 -0
  77. package/dist/utils/transforms.d.ts.map +1 -0
  78. package/dist/utils/transforms.js +64 -0
  79. package/dist/utils/transforms.js.map +1 -0
  80. package/package.json +8 -6
  81. package/dist/sonarlint-bridge.d.ts +0 -33
  82. package/dist/sonarlint-bridge.d.ts.map +0 -1
  83. package/dist/sonarlint-bridge.js +0 -91
  84. package/dist/sonarlint-bridge.js.map +0 -1
@@ -0,0 +1,39 @@
1
+ /**
2
+ * SLOOP bridge initialization and management
3
+ */
4
+ import { join, dirname } from "path";
5
+ import { existsSync } from "fs";
6
+ import { fileURLToPath } from "url";
7
+ import { SloopBridge } from "../sloop-bridge.js";
8
+ import { setSloopBridge, getSloopBridge } from "../state.js";
9
+ import { SloopError } from "../errors.js";
10
+ // Get package root directory (where sonarlint-backend is installed)
11
+ const __filename = fileURLToPath(import.meta.url);
12
+ const __dirname = dirname(__filename);
13
+ export const PACKAGE_ROOT = join(__dirname, '../..'); // Go up from dist/utils/ to package root
14
+ /**
15
+ * Ensure SLOOP bridge is initialized
16
+ */
17
+ export async function ensureSloopBridge() {
18
+ const existing = getSloopBridge();
19
+ if (existing) {
20
+ return existing;
21
+ }
22
+ console.error("[MCP] Initializing SLOOP bridge...");
23
+ // Check if plugins are downloaded
24
+ const pluginsDir = join(PACKAGE_ROOT, "sonarlint-backend", "plugins");
25
+ if (!existsSync(pluginsDir)) {
26
+ throw new SloopError("Backend not found", "SonarLint backend not installed. The postinstall script may have failed. Try reinstalling: npm install -g @nielspeter/sonarlint-mcp-server", false);
27
+ }
28
+ try {
29
+ const bridge = new SloopBridge(PACKAGE_ROOT);
30
+ await bridge.connect();
31
+ setSloopBridge(bridge);
32
+ console.error("[MCP] SLOOP bridge initialized successfully");
33
+ return bridge;
34
+ }
35
+ catch (error) {
36
+ throw new SloopError(`Failed to initialize SLOOP: ${error}`, "Failed to start SonarLint backend. Please check that Java is installed and try again.", true);
37
+ }
38
+ }
39
+ //# sourceMappingURL=sloop.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sloop.js","sourceRoot":"","sources":["../../src/utils/sloop.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,IAAI,CAAC;AAChC,OAAO,EAAE,aAAa,EAAE,MAAM,KAAK,CAAC;AACpC,OAAO,EAAE,WAAW,EAAE,MAAM,oBAAoB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C,oEAAoE;AACpE,MAAM,UAAU,GAAG,aAAa,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;AAClD,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,CAAC,CAAC;AACtC,MAAM,CAAC,MAAM,YAAY,GAAG,IAAI,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC,CAAE,yCAAyC;AAEhG;;GAEG;AACH,MAAM,CAAC,KAAK,UAAU,iBAAiB;IACrC,MAAM,QAAQ,GAAG,cAAc,EAAE,CAAC;IAClC,IAAI,QAAQ,EAAE,CAAC;QACb,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,OAAO,CAAC,KAAK,CAAC,oCAAoC,CAAC,CAAC;IAEpD,kCAAkC;IAClC,MAAM,UAAU,GAAG,IAAI,CAAC,YAAY,EAAE,mBAAmB,EAAE,SAAS,CAAC,CAAC;IACtE,IAAI,CAAC,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC5B,MAAM,IAAI,UAAU,CAClB,mBAAmB,EACnB,4IAA4I,EAC5I,KAAK,CACN,CAAC;IACJ,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,WAAW,CAAC,YAAY,CAAC,CAAC;QAC7C,MAAM,MAAM,CAAC,OAAO,EAAE,CAAC;QACvB,cAAc,CAAC,MAAM,CAAC,CAAC;QACvB,OAAO,CAAC,KAAK,CAAC,6CAA6C,CAAC,CAAC;QAC7D,OAAO,MAAM,CAAC;IAChB,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,MAAM,IAAI,UAAU,CAClB,+BAA+B,KAAK,EAAE,EACtC,uFAAuF,EACvF,IAAI,CACL,CAAC;IACJ,CAAC;AACH,CAAC"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Data transformation utilities
3
+ */
4
+ import type { AnalysisIssue } from "../types.js";
5
+ /**
6
+ * Transform raw SLOOP issues to simplified format
7
+ */
8
+ export declare function transformSloopIssues(rawIssues: any[]): AnalysisIssue[];
9
+ /**
10
+ * Create analysis summary from issues
11
+ */
12
+ export declare function createSummary(issues: AnalysisIssue[], rulesChecked: number): {
13
+ total: number;
14
+ bySeverity: {
15
+ blocker: number;
16
+ critical: number;
17
+ major: number;
18
+ minor: number;
19
+ info: number;
20
+ };
21
+ rulesChecked: number;
22
+ };
23
+ //# sourceMappingURL=transforms.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transforms.d.ts","sourceRoot":"","sources":["../../src/utils/transforms.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAEjD;;GAEG;AACH,wBAAgB,oBAAoB,CAAC,SAAS,EAAE,GAAG,EAAE,GAAG,aAAa,EAAE,CAsCtE;AAED;;GAEG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,aAAa,EAAE,EAAE,YAAY,EAAE,MAAM;;;;;;;;;;EAqB1E"}
@@ -0,0 +1,64 @@
1
+ /**
2
+ * Data transformation utilities
3
+ */
4
+ /**
5
+ * Transform raw SLOOP issues to simplified format
6
+ */
7
+ export function transformSloopIssues(rawIssues) {
8
+ return rawIssues.map((issue) => {
9
+ // Debug: Log raw issue to understand structure
10
+ if (!issue.startLine && !issue.textRange?.startLine) {
11
+ console.error('[DEBUG] Issue missing line info:', JSON.stringify(issue, null, 2).substring(0, 500));
12
+ }
13
+ const transformed = {
14
+ line: issue.textRange?.startLine || issue.startLine || 1,
15
+ column: issue.textRange?.startLineOffset || issue.startColumn || 0,
16
+ endLine: issue.textRange?.endLine || issue.endLine || issue.textRange?.startLine || issue.startLine || 1,
17
+ endColumn: issue.textRange?.endLineOffset || issue.endColumn || issue.textRange?.startLineOffset || issue.startColumn || 0,
18
+ severity: issue.severity || 'MAJOR',
19
+ rule: issue.ruleKey || 'unknown',
20
+ ruleDescription: issue.ruleDescriptionContextKey || '',
21
+ message: issue.primaryMessage || issue.message || 'No description',
22
+ };
23
+ // Add quick fix if available
24
+ if (issue.quickFixes && issue.quickFixes.length > 0) {
25
+ const firstFix = issue.quickFixes[0];
26
+ const fileEdits = firstFix.inputFileEdits || firstFix.fileEdits || [];
27
+ transformed.quickFix = {
28
+ description: firstFix.message || 'Apply fix',
29
+ edits: fileEdits.flatMap((fileEdit) => (fileEdit.textEdits || []).map((edit) => ({
30
+ startLine: edit.range?.startLine || 1,
31
+ startColumn: edit.range?.startLineOffset || 0,
32
+ endLine: edit.range?.endLine || 1,
33
+ endColumn: edit.range?.endLineOffset || 0,
34
+ newText: edit.newText || '',
35
+ }))),
36
+ };
37
+ }
38
+ return transformed;
39
+ });
40
+ }
41
+ /**
42
+ * Create analysis summary from issues
43
+ */
44
+ export function createSummary(issues, rulesChecked) {
45
+ const summary = {
46
+ total: issues.length,
47
+ bySeverity: {
48
+ blocker: 0,
49
+ critical: 0,
50
+ major: 0,
51
+ minor: 0,
52
+ info: 0,
53
+ },
54
+ rulesChecked,
55
+ };
56
+ for (const issue of issues) {
57
+ const severity = issue.severity.toLowerCase();
58
+ if (severity in summary.bySeverity) {
59
+ summary.bySeverity[severity]++;
60
+ }
61
+ }
62
+ return summary;
63
+ }
64
+ //# sourceMappingURL=transforms.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transforms.js","sourceRoot":"","sources":["../../src/utils/transforms.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,11 +1,11 @@
1
1
  {
2
2
  "name": "@nielspeter/sonarlint-mcp-server",
3
- "version": "0.1.3",
3
+ "version": "0.2.1",
4
4
  "description": "MCP server providing SonarLint code analysis for Claude Desktop and other MCP clients",
5
5
  "main": "dist/index.js",
6
6
  "type": "module",
7
7
  "engines": {
8
- "node": ">=20.0.0"
8
+ "node": ">=22.7.5"
9
9
  },
10
10
  "repository": {
11
11
  "type": "git",
@@ -22,6 +22,9 @@
22
22
  "test:ui": "vitest --ui",
23
23
  "test:run": "vitest run",
24
24
  "test:coverage": "vitest run --coverage",
25
+ "test:e2e": "vitest run tests/e2e",
26
+ "test:unit": "vitest run tests/unit",
27
+ "test:integration": "vitest run tests/integration",
25
28
  "inspect": "mcp-inspector dist/index.js",
26
29
  "release": "standard-version",
27
30
  "release:minor": "standard-version --release-as minor",
@@ -53,13 +56,12 @@
53
56
  },
54
57
  "homepage": "https://github.com/nielspeter/sonarlint-mcp-server#readme",
55
58
  "dependencies": {
56
- "@modelcontextprotocol/sdk": "^0.5.0",
57
- "ws": "^8.16.0"
59
+ "@modelcontextprotocol/sdk": "^1.21.1",
60
+ "zod": "^3.25.76"
58
61
  },
59
62
  "devDependencies": {
60
- "@modelcontextprotocol/inspector": "^0.15.0",
63
+ "@modelcontextprotocol/inspector": "^0.16.6",
61
64
  "@types/node": "^20.10.0",
62
- "@types/ws": "^8.5.10",
63
65
  "@vitest/ui": "^4.0.8",
64
66
  "standard-version": "^9.5.0",
65
67
  "tsx": "^4.6.0",
@@ -1,33 +0,0 @@
1
- import { EventEmitter } from "events";
2
- interface SonarLintStatus {
3
- ideName: string;
4
- description: string;
5
- needsToken: boolean;
6
- capabilities: {
7
- canOpenFixSuggestion: boolean;
8
- };
9
- }
10
- export declare class SonarLintBridge extends EventEmitter {
11
- private readonly host;
12
- private readonly port;
13
- private readonly timeout;
14
- private connected;
15
- private readonly baseUrl;
16
- private readonly sonarQubeServerUrl;
17
- constructor(host: string, port: number, timeout?: number, sonarQubeServerUrl?: string);
18
- connect(): Promise<void>;
19
- private fetchAPI;
20
- getStatus(): Promise<SonarLintStatus>;
21
- isConnected(): boolean;
22
- disconnect(): Promise<void>;
23
- getCurrentIssues(filters?: any): Promise<any[]>;
24
- requestAnalysis(filePaths: string[]): Promise<string>;
25
- waitForAnalysisResults(analysisId: string): Promise<any>;
26
- getFileIssues(filePath: string, includeFixed?: boolean): Promise<any[]>;
27
- getProjectMetrics(options?: any): Promise<any>;
28
- toggleAutoAnalysis(enabled: boolean): Promise<void>;
29
- getRuleDetails(ruleKey: string): Promise<any>;
30
- getSecurityHotspots(filters?: any): Promise<any[]>;
31
- }
32
- export {};
33
- //# sourceMappingURL=sonarlint-bridge.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sonarlint-bridge.d.ts","sourceRoot":"","sources":["../src/sonarlint-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAEtC,UAAU,eAAe;IACvB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,OAAO,CAAC;IACpB,YAAY,EAAE;QACZ,oBAAoB,EAAE,OAAO,CAAC;KAC/B,CAAC;CACH;AAED,qBAAa,eAAgB,SAAQ,YAAY;IAM7C,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,IAAI;IACrB,OAAO,CAAC,QAAQ,CAAC,OAAO;IAP1B,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAS;IACjC,OAAO,CAAC,QAAQ,CAAC,kBAAkB,CAAS;gBAGzB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,MAAM,EACZ,OAAO,SAAQ,EAChC,kBAAkB,CAAC,EAAE,MAAM;IAQvB,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;YAchB,QAAQ;IA0BhB,SAAS,IAAI,OAAO,CAAC,eAAe,CAAC;IAI3C,WAAW,IAAI,OAAO;IAIhB,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAW3B,gBAAgB,CAAC,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAI/C,eAAe,CAAC,SAAS,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC;IAIrD,sBAAsB,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAIxD,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,YAAY,UAAQ,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;IAIrE,iBAAiB,CAAC,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,CAAC;IAI9C,kBAAkB,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,IAAI,CAAC;IAInD,cAAc,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC;IAI7C,mBAAmB,CAAC,OAAO,CAAC,EAAE,GAAG,GAAG,OAAO,CAAC,GAAG,EAAE,CAAC;CAGzD"}
@@ -1,91 +0,0 @@
1
- import { EventEmitter } from "events";
2
- export class SonarLintBridge extends EventEmitter {
3
- host;
4
- port;
5
- timeout;
6
- connected = false;
7
- baseUrl;
8
- sonarQubeServerUrl;
9
- constructor(host, port, timeout = 30000, sonarQubeServerUrl) {
10
- super();
11
- this.host = host;
12
- this.port = port;
13
- this.timeout = timeout;
14
- this.baseUrl = `http://${host}:${port}`;
15
- // Default to common SonarQube server URL
16
- this.sonarQubeServerUrl = sonarQubeServerUrl || "http://localhost:9000";
17
- }
18
- async connect() {
19
- if (this.connected)
20
- return;
21
- try {
22
- // Test connection by calling the status endpoint
23
- const status = await this.getStatus();
24
- this.connected = true;
25
- console.log(`Connected to ${status.ideName}`);
26
- }
27
- catch (error) {
28
- this.connected = false;
29
- throw new Error(`Failed to connect to SonarLint IDE at ${this.baseUrl}: ${error}`);
30
- }
31
- }
32
- async fetchAPI(endpoint, options = {}) {
33
- const url = `${this.baseUrl}${endpoint}`;
34
- // Always include the Origin header - required by SonarLint IDE
35
- const headers = {
36
- 'Origin': this.sonarQubeServerUrl,
37
- ...options.headers,
38
- };
39
- const response = await fetch(url, {
40
- ...options,
41
- headers,
42
- });
43
- if (!response.ok && response.status !== 400) {
44
- throw new Error(`HTTP ${response.status}: ${response.statusText}`);
45
- }
46
- const contentType = response.headers.get('content-type');
47
- if (contentType?.includes('application/json')) {
48
- return response.json();
49
- }
50
- return response.text();
51
- }
52
- async getStatus() {
53
- return this.fetchAPI('/sonarlint/api/status');
54
- }
55
- isConnected() {
56
- return this.connected;
57
- }
58
- async disconnect() {
59
- this.connected = false;
60
- }
61
- // NOTE: The SonarLint IDE API is primarily designed for "Open in IDE" functionality
62
- // from SonarQube Server/Cloud. The following methods are placeholders that would need
63
- // proper endpoint discovery and authentication tokens to work.
64
- // The actual endpoints and their full capabilities are not publicly documented.
65
- // This implementation shows what we've discovered so far.
66
- async getCurrentIssues(filters) {
67
- throw new Error("Direct issue querying not supported by SonarLint IDE API. Use SonarQube Server API instead.");
68
- }
69
- async requestAnalysis(filePaths) {
70
- throw new Error("Analysis triggering not supported by SonarLint IDE API.");
71
- }
72
- async waitForAnalysisResults(analysisId) {
73
- throw new Error("Analysis results not available from IDE API.");
74
- }
75
- async getFileIssues(filePath, includeFixed = false) {
76
- throw new Error("Direct file issue querying not supported. Use SonarQube Server API.");
77
- }
78
- async getProjectMetrics(options) {
79
- throw new Error("Project metrics not available from IDE API. Use SonarQube Server API.");
80
- }
81
- async toggleAutoAnalysis(enabled) {
82
- throw new Error("Auto-analysis toggle not available via API.");
83
- }
84
- async getRuleDetails(ruleKey) {
85
- throw new Error("Rule details not available from IDE API. Use SonarQube Server API.");
86
- }
87
- async getSecurityHotspots(filters) {
88
- throw new Error("Security hotspots not available from IDE API. Use SonarQube Server API.");
89
- }
90
- }
91
- //# sourceMappingURL=sonarlint-bridge.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"sonarlint-bridge.js","sourceRoot":"","sources":["../src/sonarlint-bridge.ts"],"names":[],"mappings":"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"}