tailwind-typescript-plugin 1.4.0-beta.1 → 1.4.0-beta.11

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 (77) hide show
  1. package/CHANGELOG.md +73 -0
  2. package/README.md +373 -34
  3. package/lib/core/interfaces.d.ts +2 -2
  4. package/lib/core/interfaces.d.ts.map +1 -1
  5. package/lib/core/types.d.ts +27 -1
  6. package/lib/core/types.d.ts.map +1 -1
  7. package/lib/extractors/BaseExtractor.d.ts +49 -2
  8. package/lib/extractors/BaseExtractor.d.ts.map +1 -1
  9. package/lib/extractors/BaseExtractor.js +184 -5
  10. package/lib/extractors/BaseExtractor.js.map +1 -1
  11. package/lib/extractors/CvaExtractor.d.ts.map +1 -1
  12. package/lib/extractors/CvaExtractor.js +7 -3
  13. package/lib/extractors/CvaExtractor.js.map +1 -1
  14. package/lib/extractors/ExpressionExtractor.d.ts.map +1 -1
  15. package/lib/extractors/ExpressionExtractor.js +35 -5
  16. package/lib/extractors/ExpressionExtractor.js.map +1 -1
  17. package/lib/extractors/JsxAttributeExtractor.js +1 -1
  18. package/lib/extractors/JsxAttributeExtractor.js.map +1 -1
  19. package/lib/extractors/TailwindVariantsExtractor.d.ts +2 -0
  20. package/lib/extractors/TailwindVariantsExtractor.d.ts.map +1 -1
  21. package/lib/extractors/TailwindVariantsExtractor.js +12 -8
  22. package/lib/extractors/TailwindVariantsExtractor.js.map +1 -1
  23. package/lib/extractors/VariableReferenceExtractor.d.ts.map +1 -1
  24. package/lib/extractors/VariableReferenceExtractor.js +21 -0
  25. package/lib/extractors/VariableReferenceExtractor.js.map +1 -1
  26. package/lib/infrastructure/TailwindConflictDetector.d.ts +83 -0
  27. package/lib/infrastructure/TailwindConflictDetector.d.ts.map +1 -0
  28. package/lib/infrastructure/TailwindConflictDetector.js +342 -0
  29. package/lib/infrastructure/TailwindConflictDetector.js.map +1 -0
  30. package/lib/infrastructure/TailwindValidator.d.ts +15 -0
  31. package/lib/infrastructure/TailwindValidator.d.ts.map +1 -1
  32. package/lib/infrastructure/TailwindValidator.js +84 -5
  33. package/lib/infrastructure/TailwindValidator.js.map +1 -1
  34. package/lib/infrastructure/TailwindValidator.spec.js +194 -0
  35. package/lib/infrastructure/TailwindValidator.spec.js.map +1 -1
  36. package/lib/plugin/TailwindTypescriptPlugin.d.ts +26 -0
  37. package/lib/plugin/TailwindTypescriptPlugin.d.ts.map +1 -1
  38. package/lib/plugin/TailwindTypescriptPlugin.js +180 -1
  39. package/lib/plugin/TailwindTypescriptPlugin.js.map +1 -1
  40. package/lib/services/ClassNameExtractionService.d.ts +2 -2
  41. package/lib/services/ClassNameExtractionService.d.ts.map +1 -1
  42. package/lib/services/ClassNameExtractionService.js.map +1 -1
  43. package/lib/services/CompletionService.d.ts +98 -0
  44. package/lib/services/CompletionService.d.ts.map +1 -0
  45. package/lib/services/CompletionService.js +484 -0
  46. package/lib/services/CompletionService.js.map +1 -0
  47. package/lib/services/CompletionService.spec.d.ts +2 -0
  48. package/lib/services/CompletionService.spec.d.ts.map +1 -0
  49. package/lib/services/CompletionService.spec.js +334 -0
  50. package/lib/services/CompletionService.spec.js.map +1 -0
  51. package/lib/services/ConflictClassDetection.spec.d.ts +2 -0
  52. package/lib/services/ConflictClassDetection.spec.d.ts.map +1 -0
  53. package/lib/services/ConflictClassDetection.spec.js +477 -0
  54. package/lib/services/ConflictClassDetection.spec.js.map +1 -0
  55. package/lib/services/DiagnosticService.d.ts +14 -0
  56. package/lib/services/DiagnosticService.d.ts.map +1 -1
  57. package/lib/services/DiagnosticService.js +32 -1
  58. package/lib/services/DiagnosticService.js.map +1 -1
  59. package/lib/services/DuplicateClassDetection.spec.js +41 -60
  60. package/lib/services/DuplicateClassDetection.spec.js.map +1 -1
  61. package/lib/services/PluginConfigService.d.ts +2 -1
  62. package/lib/services/PluginConfigService.d.ts.map +1 -1
  63. package/lib/services/PluginConfigService.js +19 -12
  64. package/lib/services/PluginConfigService.js.map +1 -1
  65. package/lib/services/ValidationService.d.ts +5 -2
  66. package/lib/services/ValidationService.d.ts.map +1 -1
  67. package/lib/services/ValidationService.js +22 -9
  68. package/lib/services/ValidationService.js.map +1 -1
  69. package/package.json +4 -2
  70. package/lib/extractors/StringLiteralExtractor.d.ts +0 -12
  71. package/lib/extractors/StringLiteralExtractor.d.ts.map +0 -1
  72. package/lib/extractors/StringLiteralExtractor.js +0 -21
  73. package/lib/extractors/StringLiteralExtractor.js.map +0 -1
  74. package/lib/services/ClassNameExtractionService.original.d.ts +0 -20
  75. package/lib/services/ClassNameExtractionService.original.d.ts.map +0 -1
  76. package/lib/services/ClassNameExtractionService.original.js +0 -48
  77. package/lib/services/ClassNameExtractionService.original.js.map +0 -1
@@ -0,0 +1,477 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
15
+ }) : function(o, v) {
16
+ o["default"] = v;
17
+ });
18
+ var __importStar = (this && this.__importStar) || (function () {
19
+ var ownKeys = function(o) {
20
+ ownKeys = Object.getOwnPropertyNames || function (o) {
21
+ var ar = [];
22
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
+ return ar;
24
+ };
25
+ return ownKeys(o);
26
+ };
27
+ return function (mod) {
28
+ if (mod && mod.__esModule) return mod;
29
+ var result = {};
30
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
+ __setModuleDefault(result, mod);
32
+ return result;
33
+ };
34
+ })();
35
+ var __importDefault = (this && this.__importDefault) || function (mod) {
36
+ return (mod && mod.__esModule) ? mod : { "default": mod };
37
+ };
38
+ Object.defineProperty(exports, "__esModule", { value: true });
39
+ const ts = __importStar(require("typescript/lib/tsserverlibrary"));
40
+ const fs_1 = __importDefault(require("fs"));
41
+ const path_1 = __importDefault(require("path"));
42
+ const TailwindValidator_1 = require("../infrastructure/TailwindValidator");
43
+ const Logger_1 = require("../utils/Logger");
44
+ const ClassNameExtractionService_1 = require("./ClassNameExtractionService");
45
+ const DiagnosticService_1 = require("./DiagnosticService");
46
+ const ValidationService_1 = require("./ValidationService");
47
+ describe('Conflicting Class Detection', () => {
48
+ let validationService;
49
+ let diagnosticService;
50
+ let extractionService;
51
+ let validator;
52
+ let logger;
53
+ const testCssFile = path_1.default.join(__dirname, '../../test-conflict-global.css');
54
+ beforeAll(async () => {
55
+ // Create a simple CSS file for testing
56
+ fs_1.default.writeFileSync(testCssFile, '@import "tailwindcss";');
57
+ // Initialize the real validator
58
+ logger = new Logger_1.NoOpLogger();
59
+ validator = new TailwindValidator_1.TailwindValidator(testCssFile, logger);
60
+ await validator.initialize();
61
+ });
62
+ afterAll(() => {
63
+ // Clean up test CSS file
64
+ if (fs_1.default.existsSync(testCssFile)) {
65
+ fs_1.default.unlinkSync(testCssFile);
66
+ }
67
+ });
68
+ beforeEach(() => {
69
+ diagnosticService = new DiagnosticService_1.DiagnosticService();
70
+ extractionService = new ClassNameExtractionService_1.ClassNameExtractionService();
71
+ validationService = new ValidationService_1.ValidationService(extractionService, diagnosticService, validator, logger, validator // Pass as CSS provider for conflict detection
72
+ );
73
+ });
74
+ describe('text-align conflicts', () => {
75
+ it('should detect conflicting text alignment classes on ALL classes', () => {
76
+ const sourceCode = '<div className="text-left text-center">Hello</div>';
77
+ const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
78
+ const diagnostics = validationService.validateFile(ts, sourceFile, []);
79
+ const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
80
+ // Both text-left and text-center should be flagged
81
+ expect(conflicts.length).toBe(2);
82
+ expect(conflicts.every(c => c.category === ts.DiagnosticCategory.Warning)).toBe(true);
83
+ expect(conflicts.some(c => c.messageText.includes('text-left'))).toBe(true);
84
+ expect(conflicts.some(c => c.messageText.includes('text-center'))).toBe(true);
85
+ expect(conflicts.every(c => c.messageText.includes('text-align'))).toBe(true);
86
+ });
87
+ it('should detect multiple text alignment conflicts on ALL classes', () => {
88
+ const sourceCode = '<div className="text-left text-center text-right">Hello</div>';
89
+ const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
90
+ const diagnostics = validationService.validateFile(ts, sourceFile, []);
91
+ const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
92
+ // All three classes should be flagged
93
+ expect(conflicts.length).toBe(3);
94
+ });
95
+ });
96
+ describe('display conflicts', () => {
97
+ it('should detect conflicting display classes on both', () => {
98
+ const sourceCode = '<div className="flex block">Hello</div>';
99
+ const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
100
+ const diagnostics = validationService.validateFile(ts, sourceFile, []);
101
+ const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
102
+ expect(conflicts.length).toBe(2);
103
+ expect(conflicts.some(c => c.messageText.includes('block'))).toBe(true);
104
+ expect(conflicts.some(c => c.messageText.includes('flex'))).toBe(true);
105
+ expect(conflicts.every(c => c.messageText.includes('display'))).toBe(true);
106
+ });
107
+ it('should detect grid vs flex conflict on both', () => {
108
+ const sourceCode = '<div className="grid flex">Hello</div>';
109
+ const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
110
+ const diagnostics = validationService.validateFile(ts, sourceFile, []);
111
+ const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
112
+ expect(conflicts.length).toBe(2);
113
+ });
114
+ it('should detect hidden vs flex display conflict on both', () => {
115
+ const sourceCode = '<div className="flex hidden">Hello</div>';
116
+ const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
117
+ const diagnostics = validationService.validateFile(ts, sourceFile, []);
118
+ const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
119
+ expect(conflicts.length).toBe(2);
120
+ });
121
+ });
122
+ describe('position conflicts', () => {
123
+ it('should detect conflicting position classes on both', () => {
124
+ const sourceCode = '<div className="absolute relative">Hello</div>';
125
+ const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
126
+ const diagnostics = validationService.validateFile(ts, sourceFile, []);
127
+ const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
128
+ expect(conflicts.length).toBe(2);
129
+ expect(conflicts.every(c => c.messageText.includes('position'))).toBe(true);
130
+ });
131
+ it('should detect sticky vs fixed conflict on both', () => {
132
+ const sourceCode = '<div className="sticky fixed">Hello</div>';
133
+ const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
134
+ const diagnostics = validationService.validateFile(ts, sourceFile, []);
135
+ const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
136
+ expect(conflicts.length).toBe(2);
137
+ });
138
+ });
139
+ describe('flex-direction conflicts', () => {
140
+ it('should detect conflicting flex direction classes on both', () => {
141
+ const sourceCode = '<div className="flex-row flex-col">Hello</div>';
142
+ const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
143
+ const diagnostics = validationService.validateFile(ts, sourceFile, []);
144
+ const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
145
+ expect(conflicts.length).toBe(2);
146
+ expect(conflicts.every(c => c.messageText.includes('flex-direction'))).toBe(true);
147
+ });
148
+ });
149
+ describe('justify-content conflicts', () => {
150
+ it('should detect conflicting justify classes on both', () => {
151
+ const sourceCode = '<div className="justify-start justify-center">Hello</div>';
152
+ const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
153
+ const diagnostics = validationService.validateFile(ts, sourceFile, []);
154
+ const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
155
+ expect(conflicts.length).toBe(2);
156
+ expect(conflicts.every(c => c.messageText.includes('justify-content'))).toBe(true);
157
+ });
158
+ });
159
+ describe('align-items conflicts', () => {
160
+ it('should detect conflicting align-items classes on both', () => {
161
+ const sourceCode = '<div className="items-start items-center">Hello</div>';
162
+ const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
163
+ const diagnostics = validationService.validateFile(ts, sourceFile, []);
164
+ const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
165
+ expect(conflicts.length).toBe(2);
166
+ expect(conflicts.every(c => c.messageText.includes('align-items'))).toBe(true);
167
+ });
168
+ });
169
+ describe('no false positives', () => {
170
+ it('should not flag different utility types', () => {
171
+ const sourceCode = '<div className="flex items-center justify-between p-4">Hello</div>';
172
+ const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
173
+ const diagnostics = validationService.validateFile(ts, sourceFile, []);
174
+ const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
175
+ expect(conflicts.length).toBe(0);
176
+ });
177
+ it('should not flag same class in different elements', () => {
178
+ const sourceCode = `
179
+ <div className="text-left">
180
+ <span className="text-center">Hello</span>
181
+ </div>
182
+ `;
183
+ const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
184
+ const diagnostics = validationService.validateFile(ts, sourceFile, []);
185
+ const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
186
+ expect(conflicts.length).toBe(0);
187
+ });
188
+ it('should not flag duplicate classes as conflicts', () => {
189
+ // Same class repeated is a duplicate, not a conflict
190
+ const sourceCode = '<div className="text-left text-left">Hello</div>';
191
+ const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
192
+ const diagnostics = validationService.validateFile(ts, sourceFile, []);
193
+ const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
194
+ expect(conflicts.length).toBe(0); // Should be duplicate, not conflict
195
+ });
196
+ it('should not flag similar but non-conflicting classes', () => {
197
+ // p-4 and pt-4 don't conflict - they're different properties
198
+ const sourceCode = '<div className="p-4 pt-8">Hello</div>';
199
+ const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
200
+ const diagnostics = validationService.validateFile(ts, sourceFile, []);
201
+ const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
202
+ expect(conflicts.length).toBe(0);
203
+ });
204
+ });
205
+ describe('ternary conditional expressions', () => {
206
+ it('should NOT flag conflicts in different ternary branches', () => {
207
+ // text-left in true branch, text-center in false branch = no conflict (mutually exclusive)
208
+ const sourceCode = "<div className={isActive ? 'text-left' : 'text-center'}>Hello</div>";
209
+ const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
210
+ const diagnostics = validationService.validateFile(ts, sourceFile, []);
211
+ const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
212
+ expect(conflicts.length).toBe(0);
213
+ });
214
+ it('should flag conflict when root class conflicts with branch class (both flagged)', () => {
215
+ // Root 'text-left' + branch 'text-center' = conflict on both
216
+ const sourceCode = "<div className={clsx('text-left', isActive && 'text-center')}>Hello</div>";
217
+ const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
218
+ const diagnostics = validationService.validateFile(ts, sourceFile, ['clsx']);
219
+ const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
220
+ expect(conflicts.length).toBe(2);
221
+ });
222
+ it('should flag conflicts within same branch (both flagged)', () => {
223
+ // Both text-left and text-center in the true branch = conflict
224
+ const sourceCode = "<div className={isActive ? 'text-left text-center' : 'text-right'}>Hello</div>";
225
+ const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
226
+ const diagnostics = validationService.validateFile(ts, sourceFile, []);
227
+ const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
228
+ expect(conflicts.length).toBe(2);
229
+ });
230
+ });
231
+ describe('utility function calls', () => {
232
+ it('should detect conflicts in clsx arguments (both flagged)', () => {
233
+ const sourceCode = "<div className={clsx('flex', 'block', 'items-center')}>Hello</div>";
234
+ const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
235
+ const diagnostics = validationService.validateFile(ts, sourceFile, ['clsx']);
236
+ const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
237
+ expect(conflicts.length).toBe(2);
238
+ });
239
+ it('should detect conflicts in cn function (both flagged)', () => {
240
+ const sourceCode = "<div className={cn('text-left text-right')}>Hello</div>";
241
+ const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
242
+ const diagnostics = validationService.validateFile(ts, sourceFile, ['cn']);
243
+ const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
244
+ expect(conflicts.length).toBe(2);
245
+ });
246
+ });
247
+ describe('responsive variants', () => {
248
+ it('should detect conflicts with responsive variants (both flagged)', () => {
249
+ const sourceCode = '<div className="md:text-left md:text-center">Hello</div>';
250
+ const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
251
+ const diagnostics = validationService.validateFile(ts, sourceFile, []);
252
+ const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
253
+ expect(conflicts.length).toBe(2);
254
+ });
255
+ it('should NOT flag same utility with different breakpoints as conflict', () => {
256
+ // sm:text-left and md:text-center apply at different breakpoints
257
+ const sourceCode = '<div className="sm:text-left md:text-center">Hello</div>';
258
+ const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
259
+ const diagnostics = validationService.validateFile(ts, sourceFile, []);
260
+ const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
261
+ // Different prefixes mean different media queries, so no conflict
262
+ expect(conflicts.length).toBe(0);
263
+ });
264
+ });
265
+ describe('overflow conflicts', () => {
266
+ it('should detect conflicting overflow classes on both', () => {
267
+ const sourceCode = '<div className="overflow-hidden overflow-scroll">Hello</div>';
268
+ const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
269
+ const diagnostics = validationService.validateFile(ts, sourceFile, []);
270
+ const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
271
+ expect(conflicts.length).toBe(2);
272
+ expect(conflicts.every(c => c.messageText.includes('overflow'))).toBe(true);
273
+ });
274
+ });
275
+ describe('visibility conflicts', () => {
276
+ it('should detect conflicting visibility classes on both', () => {
277
+ const sourceCode = '<div className="visible invisible">Hello</div>';
278
+ const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
279
+ const diagnostics = validationService.validateFile(ts, sourceFile, []);
280
+ const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
281
+ expect(conflicts.length).toBe(2);
282
+ expect(conflicts.every(c => c.messageText.includes('visibility'))).toBe(true);
283
+ });
284
+ });
285
+ describe('font style conflicts', () => {
286
+ it('should detect conflicting font style classes on both', () => {
287
+ const sourceCode = '<div className="italic not-italic">Hello</div>';
288
+ const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
289
+ const diagnostics = validationService.validateFile(ts, sourceFile, []);
290
+ const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
291
+ expect(conflicts.length).toBe(2);
292
+ expect(conflicts.every(c => c.messageText.includes('font-style'))).toBe(true);
293
+ });
294
+ });
295
+ describe('text transform conflicts', () => {
296
+ it('should detect conflicting text transform classes on both', () => {
297
+ const sourceCode = '<div className="uppercase lowercase">Hello</div>';
298
+ const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
299
+ const diagnostics = validationService.validateFile(ts, sourceFile, []);
300
+ const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
301
+ expect(conflicts.length).toBe(2);
302
+ expect(conflicts.every(c => c.messageText.includes('text-transform'))).toBe(true);
303
+ });
304
+ });
305
+ describe('diagnostic message format', () => {
306
+ it('should have correct warning message format on both classes', () => {
307
+ const sourceCode = '<div className="flex grid">Hello</div>';
308
+ const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
309
+ const diagnostics = validationService.validateFile(ts, sourceFile, []);
310
+ const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
311
+ expect(conflicts.length).toBe(2);
312
+ // One should say flex conflicts with grid, other says grid conflicts with flex
313
+ expect(conflicts.some(c => c.messageText.includes('"flex" conflicts with "grid"'))).toBe(true);
314
+ expect(conflicts.some(c => c.messageText.includes('"grid" conflicts with "flex"'))).toBe(true);
315
+ expect(conflicts.every(c => c.messageText.includes('display property'))).toBe(true);
316
+ });
317
+ it('should have source set to tw-plugin', () => {
318
+ const sourceCode = '<div className="text-left text-right">Hello</div>';
319
+ const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
320
+ const diagnostics = validationService.validateFile(ts, sourceFile, []);
321
+ const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
322
+ expect(conflicts.every(c => c.source === 'tw-plugin')).toBe(true);
323
+ });
324
+ });
325
+ describe('tailwind-variants tv() conflict detection', () => {
326
+ it('should detect conflicts in tv() base property (both flagged)', () => {
327
+ const sourceCode = `
328
+ import { tv } from 'tailwind-variants';
329
+ const button = tv({
330
+ base: 'flex block items-center'
331
+ });
332
+ `;
333
+ const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
334
+ const diagnostics = validationService.validateFile(ts, sourceFile, []);
335
+ const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
336
+ expect(conflicts.length).toBe(2);
337
+ expect(conflicts.every(c => c.messageText.includes('display'))).toBe(true);
338
+ });
339
+ it('should NOT detect conflicts between tv() base and variants (variants are designed to override)', () => {
340
+ const sourceCode = `
341
+ import { tv } from 'tailwind-variants';
342
+ const button = tv({
343
+ base: 'text-left items-center',
344
+ variants: {
345
+ align: {
346
+ center: 'text-center'
347
+ }
348
+ }
349
+ });
350
+ `;
351
+ const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
352
+ const diagnostics = validationService.validateFile(ts, sourceFile, []);
353
+ // Base vs variant classes should NOT conflict - variants are designed to override base styles
354
+ const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
355
+ expect(conflicts.length).toBe(0);
356
+ });
357
+ it('should NOT flag conflicts between different tv() calls', () => {
358
+ const sourceCode = `
359
+ import { tv } from 'tailwind-variants';
360
+ const button = tv({
361
+ base: 'text-left'
362
+ });
363
+ const card = tv({
364
+ base: 'text-center'
365
+ });
366
+ `;
367
+ const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
368
+ const diagnostics = validationService.validateFile(ts, sourceFile, []);
369
+ // Each tv() call has its own scope, so no conflicts
370
+ expect(diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE).length).toBe(0);
371
+ });
372
+ });
373
+ describe('class-variance-authority cva() conflict detection', () => {
374
+ it('should detect conflicts in cva() base array (both flagged)', () => {
375
+ const sourceCode = `
376
+ import { cva } from 'class-variance-authority';
377
+ const button = cva(['flex', 'grid', 'items-center']);
378
+ `;
379
+ const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
380
+ const diagnostics = validationService.validateFile(ts, sourceFile, []);
381
+ const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
382
+ expect(conflicts.length).toBe(2);
383
+ expect(conflicts.every(c => c.messageText.includes('display'))).toBe(true);
384
+ });
385
+ it('should NOT detect conflicts between cva() base and variants (variants are designed to override)', () => {
386
+ const sourceCode = `
387
+ import { cva } from 'class-variance-authority';
388
+ const button = cva(['justify-start'], {
389
+ variants: {
390
+ centered: {
391
+ true: ['justify-center']
392
+ }
393
+ }
394
+ });
395
+ `;
396
+ const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
397
+ const diagnostics = validationService.validateFile(ts, sourceFile, []);
398
+ // Base vs variant classes should NOT conflict - variants are designed to override base styles
399
+ const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
400
+ expect(conflicts.length).toBe(0);
401
+ });
402
+ it('should NOT flag conflicts between different cva() calls', () => {
403
+ const sourceCode = `
404
+ import { cva } from 'class-variance-authority';
405
+ const button = cva(['flex']);
406
+ const card = cva(['grid']);
407
+ `;
408
+ const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
409
+ const diagnostics = validationService.validateFile(ts, sourceFile, []);
410
+ // Each cva() call has its own scope, so no conflicts
411
+ expect(diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE).length).toBe(0);
412
+ });
413
+ it('should detect conflicts within same variant option in cva()', () => {
414
+ const sourceCode = `
415
+ import { cva } from 'class-variance-authority';
416
+ const button = cva(['items-center'], {
417
+ variants: {
418
+ align: {
419
+ left: ['text-left', 'text-center']
420
+ }
421
+ }
422
+ });
423
+ `;
424
+ const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
425
+ const diagnostics = validationService.validateFile(ts, sourceFile, []);
426
+ // Conflicts within the same variant option SHOULD be flagged
427
+ const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
428
+ expect(conflicts.length).toBe(2);
429
+ expect(conflicts.every(c => c.messageText.includes('text-align'))).toBe(true);
430
+ });
431
+ });
432
+ describe('tv() variant conflict edge cases', () => {
433
+ it('should detect conflicts within same variant option in tv()', () => {
434
+ const sourceCode = `
435
+ import { tv } from 'tailwind-variants';
436
+ const button = tv({
437
+ base: 'items-center',
438
+ variants: {
439
+ align: {
440
+ weird: 'text-left text-center'
441
+ }
442
+ }
443
+ });
444
+ `;
445
+ const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
446
+ const diagnostics = validationService.validateFile(ts, sourceFile, []);
447
+ // Conflicts within the same variant option SHOULD be flagged
448
+ const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
449
+ expect(conflicts.length).toBe(2);
450
+ expect(conflicts.every(c => c.messageText.includes('text-align'))).toBe(true);
451
+ });
452
+ it('should flag conflicts between different variant options in tv() (known limitation)', () => {
453
+ const sourceCode = `
454
+ import { tv } from 'tailwind-variants';
455
+ const button = tv({
456
+ base: 'items-center',
457
+ variants: {
458
+ align: {
459
+ left: 'text-left',
460
+ center: 'text-center',
461
+ right: 'text-right'
462
+ }
463
+ }
464
+ });
465
+ `;
466
+ const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
467
+ const diagnostics = validationService.validateFile(ts, sourceFile, []);
468
+ // Note: Ideally different variant options are mutually exclusive (only one active at runtime),
469
+ // so they shouldn't conflict. However, this would require tracking which variant OPTION
470
+ // each class belongs to, which adds complexity. For now, we flag these as conflicts.
471
+ // This is a known false positive - users can safely ignore these warnings for variant options.
472
+ const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
473
+ expect(conflicts.length).toBe(3); // All three options flagged
474
+ });
475
+ });
476
+ });
477
+ //# sourceMappingURL=ConflictClassDetection.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ConflictClassDetection.spec.js","sourceRoot":"","sources":["../../src/services/ConflictClassDetection.spec.ts"],"names":[],"mappings":"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"}
@@ -1,6 +1,7 @@
1
1
  import * as ts from 'typescript/lib/tsserverlibrary';
2
2
  import { IDiagnosticService } from '../core/interfaces';
3
3
  import { ClassNameInfo } from '../core/types';
4
+ import { ConflictInfo } from '../infrastructure/TailwindConflictDetector';
4
5
  /**
5
6
  * Diagnostic code for Tailwind plugin errors (invalid class)
6
7
  * Used to identify our diagnostics for code actions
@@ -15,6 +16,11 @@ export declare const TAILWIND_DUPLICATE_CODE = 90002;
15
16
  * Used when a class appears in all branches of a ternary but not at root level
16
17
  */
17
18
  export declare const TAILWIND_EXTRACTABLE_CLASS_CODE = 90003;
19
+ /**
20
+ * Diagnostic code for conflicting class warnings
21
+ * Used when classes that affect the same CSS property are used together
22
+ */
23
+ export declare const TAILWIND_CONFLICT_CODE = 90004;
18
24
  /**
19
25
  * Service responsible for creating TypeScript diagnostics
20
26
  */
@@ -40,5 +46,13 @@ export declare class DiagnosticService implements IDiagnosticService {
40
46
  * Create multiple extractable class hint diagnostics
41
47
  */
42
48
  createExtractableClassDiagnostics(classInfos: ClassNameInfo[], sourceFile: ts.SourceFile): ts.Diagnostic[];
49
+ /**
50
+ * Create a warning diagnostic for conflicting class
51
+ */
52
+ createConflictDiagnostic(conflictInfo: ConflictInfo, sourceFile: ts.SourceFile): ts.Diagnostic;
53
+ /**
54
+ * Create multiple conflict warning diagnostics
55
+ */
56
+ createConflictDiagnostics(conflictInfos: ConflictInfo[], sourceFile: ts.SourceFile): ts.Diagnostic[];
43
57
  }
44
58
  //# sourceMappingURL=DiagnosticService.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"DiagnosticService.d.ts","sourceRoot":"","sources":["../../src/services/DiagnosticService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,gCAAgC,CAAC;AAErD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAE9C;;;GAGG;AACH,eAAO,MAAM,wBAAwB,QAAQ,CAAC;AAE9C;;GAEG;AACH,eAAO,MAAM,uBAAuB,QAAQ,CAAC;AAE7C;;;GAGG;AACH,eAAO,MAAM,+BAA+B,QAAQ,CAAC;AAErD;;GAEG;AACH,qBAAa,iBAAkB,YAAW,kBAAkB;IAC3D,gBAAgB,CAAC,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,UAAU;IAmBpF;;OAEG;IACH,yBAAyB,CAAC,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,UAAU;IAmB7F;;OAEG;IACH,iBAAiB,CAAC,UAAU,EAAE,aAAa,EAAE,EAAE,UAAU,EAAE,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,UAAU,EAAE;IAI1F;;OAEG;IACH,0BAA0B,CACzB,UAAU,EAAE,aAAa,EAAE,EAC3B,UAAU,EAAE,EAAE,CAAC,UAAU,GACvB,EAAE,CAAC,UAAU,EAAE;IAIlB;;OAEG;IACH,gCAAgC,CAC/B,SAAS,EAAE,aAAa,EACxB,UAAU,EAAE,EAAE,CAAC,UAAU,GACvB,EAAE,CAAC,UAAU;IAchB;;OAEG;IACH,iCAAiC,CAChC,UAAU,EAAE,aAAa,EAAE,EAC3B,UAAU,EAAE,EAAE,CAAC,UAAU,GACvB,EAAE,CAAC,UAAU,EAAE;CAKlB"}
1
+ {"version":3,"file":"DiagnosticService.d.ts","sourceRoot":"","sources":["../../src/services/DiagnosticService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,gCAAgC,CAAC;AAErD,OAAO,EAAE,kBAAkB,EAAE,MAAM,oBAAoB,CAAC;AACxD,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,YAAY,EAAE,MAAM,4CAA4C,CAAC;AAE1E;;;GAGG;AACH,eAAO,MAAM,wBAAwB,QAAQ,CAAC;AAE9C;;GAEG;AACH,eAAO,MAAM,uBAAuB,QAAQ,CAAC;AAE7C;;;GAGG;AACH,eAAO,MAAM,+BAA+B,QAAQ,CAAC;AAErD;;;GAGG;AACH,eAAO,MAAM,sBAAsB,QAAQ,CAAC;AAE5C;;GAEG;AACH,qBAAa,iBAAkB,YAAW,kBAAkB;IAC3D,gBAAgB,CAAC,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,UAAU;IAmBpF;;OAEG;IACH,yBAAyB,CAAC,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,UAAU;IAmB7F;;OAEG;IACH,iBAAiB,CAAC,UAAU,EAAE,aAAa,EAAE,EAAE,UAAU,EAAE,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,UAAU,EAAE;IAI1F;;OAEG;IACH,0BAA0B,CACzB,UAAU,EAAE,aAAa,EAAE,EAC3B,UAAU,EAAE,EAAE,CAAC,UAAU,GACvB,EAAE,CAAC,UAAU,EAAE;IAIlB;;OAEG;IACH,gCAAgC,CAC/B,SAAS,EAAE,aAAa,EACxB,UAAU,EAAE,EAAE,CAAC,UAAU,GACvB,EAAE,CAAC,UAAU;IAchB;;OAEG;IACH,iCAAiC,CAChC,UAAU,EAAE,aAAa,EAAE,EAC3B,UAAU,EAAE,EAAE,CAAC,UAAU,GACvB,EAAE,CAAC,UAAU,EAAE;IAMlB;;OAEG;IACH,wBAAwB,CAAC,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,UAAU;IAoB9F;;OAEG;IACH,yBAAyB,CACxB,aAAa,EAAE,YAAY,EAAE,EAC7B,UAAU,EAAE,EAAE,CAAC,UAAU,GACvB,EAAE,CAAC,UAAU,EAAE;CAKlB"}
@@ -33,7 +33,7 @@ var __importStar = (this && this.__importStar) || (function () {
33
33
  };
34
34
  })();
35
35
  Object.defineProperty(exports, "__esModule", { value: true });
36
- exports.DiagnosticService = exports.TAILWIND_EXTRACTABLE_CLASS_CODE = exports.TAILWIND_DUPLICATE_CODE = exports.TAILWIND_DIAGNOSTIC_CODE = void 0;
36
+ exports.DiagnosticService = exports.TAILWIND_CONFLICT_CODE = exports.TAILWIND_EXTRACTABLE_CLASS_CODE = exports.TAILWIND_DUPLICATE_CODE = exports.TAILWIND_DIAGNOSTIC_CODE = void 0;
37
37
  const ts = __importStar(require("typescript/lib/tsserverlibrary"));
38
38
  /**
39
39
  * Diagnostic code for Tailwind plugin errors (invalid class)
@@ -49,6 +49,11 @@ exports.TAILWIND_DUPLICATE_CODE = 90002;
49
49
  * Used when a class appears in all branches of a ternary but not at root level
50
50
  */
51
51
  exports.TAILWIND_EXTRACTABLE_CLASS_CODE = 90003;
52
+ /**
53
+ * Diagnostic code for conflicting class warnings
54
+ * Used when classes that affect the same CSS property are used together
55
+ */
56
+ exports.TAILWIND_CONFLICT_CODE = 90004;
52
57
  /**
53
58
  * Service responsible for creating TypeScript diagnostics
54
59
  */
@@ -121,6 +126,32 @@ class DiagnosticService {
121
126
  createExtractableClassDiagnostics(classInfos, sourceFile) {
122
127
  return classInfos.map(classInfo => this.createExtractableClassDiagnostic(classInfo, sourceFile));
123
128
  }
129
+ /**
130
+ * Create a warning diagnostic for conflicting class
131
+ */
132
+ createConflictDiagnostic(conflictInfo, sourceFile) {
133
+ const conflictingClassList = conflictInfo.conflictsWith.join(', ');
134
+ let messageText = `Class "${conflictInfo.classInfo.className}" conflicts with "${conflictingClassList}". Both affect the ${conflictInfo.cssProperty} property.`;
135
+ // Add context for variable references
136
+ if (conflictInfo.classInfo.variableUsage) {
137
+ messageText += ` This value comes from variable "${conflictInfo.classInfo.variableUsage.variableName}" used on line ${conflictInfo.classInfo.variableUsage.usageLine}`;
138
+ }
139
+ return {
140
+ file: sourceFile,
141
+ start: conflictInfo.classInfo.absoluteStart,
142
+ length: conflictInfo.classInfo.length,
143
+ messageText,
144
+ category: ts.DiagnosticCategory.Warning,
145
+ code: exports.TAILWIND_CONFLICT_CODE,
146
+ source: 'tw-plugin'
147
+ };
148
+ }
149
+ /**
150
+ * Create multiple conflict warning diagnostics
151
+ */
152
+ createConflictDiagnostics(conflictInfos, sourceFile) {
153
+ return conflictInfos.map(conflictInfo => this.createConflictDiagnostic(conflictInfo, sourceFile));
154
+ }
124
155
  }
125
156
  exports.DiagnosticService = DiagnosticService;
126
157
  //# sourceMappingURL=DiagnosticService.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"DiagnosticService.js","sourceRoot":"","sources":["../../src/services/DiagnosticService.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mEAAqD;AAKrD;;;GAGG;AACU,QAAA,wBAAwB,GAAG,KAAK,CAAC;AAE9C;;GAEG;AACU,QAAA,uBAAuB,GAAG,KAAK,CAAC;AAE7C;;;GAGG;AACU,QAAA,+BAA+B,GAAG,KAAK,CAAC;AAErD;;GAEG;AACH,MAAa,iBAAiB;IAC7B,gBAAgB,CAAC,SAAwB,EAAE,UAAyB;QACnE,IAAI,WAAW,GAAG,cAAc,SAAS,CAAC,SAAS,iCAAiC,CAAC;QAErF,sCAAsC;QACtC,IAAI,SAAS,CAAC,aAAa,EAAE,CAAC;YAC7B,WAAW,IAAI,mDAAmD,SAAS,CAAC,aAAa,CAAC,YAAY,aAAa,SAAS,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;QACxJ,CAAC;QAED,OAAO;YACN,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,SAAS,CAAC,aAAa;YAC9B,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,WAAW;YACX,QAAQ,EAAE,EAAE,CAAC,kBAAkB,CAAC,KAAK;YACrC,IAAI,EAAE,gCAAwB;YAC9B,MAAM,EAAE,WAAW;SACnB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,yBAAyB,CAAC,SAAwB,EAAE,UAAyB;QAC5E,IAAI,WAAW,GAAG,oBAAoB,SAAS,CAAC,SAAS,GAAG,CAAC;QAE7D,sCAAsC;QACtC,IAAI,SAAS,CAAC,aAAa,EAAE,CAAC;YAC7B,WAAW,IAAI,qCAAqC,SAAS,CAAC,aAAa,CAAC,YAAY,kBAAkB,SAAS,CAAC,aAAa,CAAC,SAAS,EAAE,CAAC;QAC/I,CAAC;QAED,OAAO;YACN,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,SAAS,CAAC,aAAa;YAC9B,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,WAAW;YACX,QAAQ,EAAE,EAAE,CAAC,kBAAkB,CAAC,OAAO;YACvC,IAAI,EAAE,+BAAuB;YAC7B,MAAM,EAAE,WAAW;SACnB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,iBAAiB,CAAC,UAA2B,EAAE,UAAyB;QACvE,OAAO,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,gBAAgB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;IAClF,CAAC;IAED;;OAEG;IACH,0BAA0B,CACzB,UAA2B,EAC3B,UAAyB;QAEzB,OAAO,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CAAC,IAAI,CAAC,yBAAyB,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC;IAC3F,CAAC;IAED;;OAEG;IACH,gCAAgC,CAC/B,SAAwB,EACxB,UAAyB;QAEzB,MAAM,WAAW,GAAG,UAAU,SAAS,CAAC,SAAS,6EAA6E,CAAC;QAE/H,OAAO;YACN,IAAI,EAAE,UAAU;YAChB,KAAK,EAAE,SAAS,CAAC,aAAa;YAC9B,MAAM,EAAE,SAAS,CAAC,MAAM;YACxB,WAAW;YACX,QAAQ,EAAE,EAAE,CAAC,kBAAkB,CAAC,OAAO;YACvC,IAAI,EAAE,uCAA+B;YACrC,MAAM,EAAE,WAAW;SACnB,CAAC;IACH,CAAC;IAED;;OAEG;IACH,iCAAiC,CAChC,UAA2B,EAC3B,UAAyB;QAEzB,OAAO,UAAU,CAAC,GAAG,CAAC,SAAS,CAAC,EAAE,CACjC,IAAI,CAAC,gCAAgC,CAAC,SAAS,EAAE,UAAU,CAAC,CAC5D,CAAC;IACH,CAAC;CACD;AA1FD,8CA0FC"}
1
+ {"version":3,"file":"DiagnosticService.js","sourceRoot":"","sources":["../../src/services/DiagnosticService.ts"],"names":[],"mappings":"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"}