tailwind-typescript-plugin 1.4.0-beta.1 → 1.4.0-beta.3
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/CHANGELOG.md +12 -0
- package/README.md +195 -0
- package/lib/core/types.d.ts +8 -0
- package/lib/core/types.d.ts.map +1 -1
- package/lib/extractors/CvaExtractor.d.ts.map +1 -1
- package/lib/extractors/CvaExtractor.js +6 -2
- package/lib/extractors/CvaExtractor.js.map +1 -1
- package/lib/extractors/TailwindVariantsExtractor.d.ts +2 -0
- package/lib/extractors/TailwindVariantsExtractor.d.ts.map +1 -1
- package/lib/extractors/TailwindVariantsExtractor.js +11 -3
- package/lib/extractors/TailwindVariantsExtractor.js.map +1 -1
- package/lib/infrastructure/TailwindConflictDetector.d.ts +73 -0
- package/lib/infrastructure/TailwindConflictDetector.d.ts.map +1 -0
- package/lib/infrastructure/TailwindConflictDetector.js +612 -0
- package/lib/infrastructure/TailwindConflictDetector.js.map +1 -0
- package/lib/infrastructure/TailwindValidator.spec.js +151 -0
- package/lib/infrastructure/TailwindValidator.spec.js.map +1 -1
- package/lib/plugin/TailwindTypescriptPlugin.d.ts +12 -0
- package/lib/plugin/TailwindTypescriptPlugin.d.ts.map +1 -1
- package/lib/plugin/TailwindTypescriptPlugin.js +105 -0
- package/lib/plugin/TailwindTypescriptPlugin.js.map +1 -1
- package/lib/services/ConflictClassDetection.spec.d.ts +2 -0
- package/lib/services/ConflictClassDetection.spec.d.ts.map +1 -0
- package/lib/services/ConflictClassDetection.spec.js +472 -0
- package/lib/services/ConflictClassDetection.spec.js.map +1 -0
- package/lib/services/DiagnosticService.d.ts +14 -0
- package/lib/services/DiagnosticService.d.ts.map +1 -1
- package/lib/services/DiagnosticService.js +32 -1
- package/lib/services/DiagnosticService.js.map +1 -1
- package/lib/services/ValidationService.d.ts +1 -0
- package/lib/services/ValidationService.d.ts.map +1 -1
- package/lib/services/ValidationService.js +12 -2
- package/lib/services/ValidationService.js.map +1 -1
- package/package.json +1 -1
|
@@ -0,0 +1,472 @@
|
|
|
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
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const ts = __importStar(require("typescript/lib/tsserverlibrary"));
|
|
37
|
+
const Logger_1 = require("../utils/Logger");
|
|
38
|
+
const ClassNameExtractionService_1 = require("./ClassNameExtractionService");
|
|
39
|
+
const DiagnosticService_1 = require("./DiagnosticService");
|
|
40
|
+
const ValidationService_1 = require("./ValidationService");
|
|
41
|
+
// Mock validator that considers all classes valid (for testing conflicts only)
|
|
42
|
+
class MockValidator {
|
|
43
|
+
isInitialized() {
|
|
44
|
+
return true;
|
|
45
|
+
}
|
|
46
|
+
isValidClass() {
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
getInvalidClasses() {
|
|
50
|
+
return [];
|
|
51
|
+
}
|
|
52
|
+
setAllowedClasses() {
|
|
53
|
+
// No-op for testing
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
describe('Conflicting Class Detection', () => {
|
|
57
|
+
let validationService;
|
|
58
|
+
let diagnosticService;
|
|
59
|
+
let extractionService;
|
|
60
|
+
let mockValidator;
|
|
61
|
+
let logger;
|
|
62
|
+
beforeEach(() => {
|
|
63
|
+
diagnosticService = new DiagnosticService_1.DiagnosticService();
|
|
64
|
+
extractionService = new ClassNameExtractionService_1.ClassNameExtractionService();
|
|
65
|
+
mockValidator = new MockValidator();
|
|
66
|
+
logger = new Logger_1.NoOpLogger();
|
|
67
|
+
validationService = new ValidationService_1.ValidationService(extractionService, diagnosticService, mockValidator, logger);
|
|
68
|
+
});
|
|
69
|
+
describe('text-align conflicts', () => {
|
|
70
|
+
it('should detect conflicting text alignment classes on ALL classes', () => {
|
|
71
|
+
const sourceCode = '<div className="text-left text-center">Hello</div>';
|
|
72
|
+
const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
73
|
+
const diagnostics = validationService.validateFile(ts, sourceFile, []);
|
|
74
|
+
const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
|
|
75
|
+
// Both text-left and text-center should be flagged
|
|
76
|
+
expect(conflicts.length).toBe(2);
|
|
77
|
+
expect(conflicts.every(c => c.category === ts.DiagnosticCategory.Warning)).toBe(true);
|
|
78
|
+
expect(conflicts.some(c => c.messageText.includes('text-left'))).toBe(true);
|
|
79
|
+
expect(conflicts.some(c => c.messageText.includes('text-center'))).toBe(true);
|
|
80
|
+
expect(conflicts.every(c => c.messageText.includes('text-align'))).toBe(true);
|
|
81
|
+
});
|
|
82
|
+
it('should detect multiple text alignment conflicts on ALL classes', () => {
|
|
83
|
+
const sourceCode = '<div className="text-left text-center text-right">Hello</div>';
|
|
84
|
+
const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
85
|
+
const diagnostics = validationService.validateFile(ts, sourceFile, []);
|
|
86
|
+
const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
|
|
87
|
+
// All three classes should be flagged
|
|
88
|
+
expect(conflicts.length).toBe(3);
|
|
89
|
+
});
|
|
90
|
+
});
|
|
91
|
+
describe('display conflicts', () => {
|
|
92
|
+
it('should detect conflicting display classes on both', () => {
|
|
93
|
+
const sourceCode = '<div className="flex block">Hello</div>';
|
|
94
|
+
const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
95
|
+
const diagnostics = validationService.validateFile(ts, sourceFile, []);
|
|
96
|
+
const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
|
|
97
|
+
expect(conflicts.length).toBe(2);
|
|
98
|
+
expect(conflicts.some(c => c.messageText.includes('block'))).toBe(true);
|
|
99
|
+
expect(conflicts.some(c => c.messageText.includes('flex'))).toBe(true);
|
|
100
|
+
expect(conflicts.every(c => c.messageText.includes('display'))).toBe(true);
|
|
101
|
+
});
|
|
102
|
+
it('should detect grid vs flex conflict on both', () => {
|
|
103
|
+
const sourceCode = '<div className="grid flex">Hello</div>';
|
|
104
|
+
const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
105
|
+
const diagnostics = validationService.validateFile(ts, sourceFile, []);
|
|
106
|
+
const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
|
|
107
|
+
expect(conflicts.length).toBe(2);
|
|
108
|
+
});
|
|
109
|
+
it('should detect hidden vs flex display conflict on both', () => {
|
|
110
|
+
const sourceCode = '<div className="flex hidden">Hello</div>';
|
|
111
|
+
const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
112
|
+
const diagnostics = validationService.validateFile(ts, sourceFile, []);
|
|
113
|
+
const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
|
|
114
|
+
expect(conflicts.length).toBe(2);
|
|
115
|
+
});
|
|
116
|
+
});
|
|
117
|
+
describe('position conflicts', () => {
|
|
118
|
+
it('should detect conflicting position classes on both', () => {
|
|
119
|
+
const sourceCode = '<div className="absolute relative">Hello</div>';
|
|
120
|
+
const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
121
|
+
const diagnostics = validationService.validateFile(ts, sourceFile, []);
|
|
122
|
+
const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
|
|
123
|
+
expect(conflicts.length).toBe(2);
|
|
124
|
+
expect(conflicts.every(c => c.messageText.includes('position'))).toBe(true);
|
|
125
|
+
});
|
|
126
|
+
it('should detect sticky vs fixed conflict on both', () => {
|
|
127
|
+
const sourceCode = '<div className="sticky fixed">Hello</div>';
|
|
128
|
+
const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
129
|
+
const diagnostics = validationService.validateFile(ts, sourceFile, []);
|
|
130
|
+
const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
|
|
131
|
+
expect(conflicts.length).toBe(2);
|
|
132
|
+
});
|
|
133
|
+
});
|
|
134
|
+
describe('flex-direction conflicts', () => {
|
|
135
|
+
it('should detect conflicting flex direction classes on both', () => {
|
|
136
|
+
const sourceCode = '<div className="flex-row flex-col">Hello</div>';
|
|
137
|
+
const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
138
|
+
const diagnostics = validationService.validateFile(ts, sourceFile, []);
|
|
139
|
+
const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
|
|
140
|
+
expect(conflicts.length).toBe(2);
|
|
141
|
+
expect(conflicts.every(c => c.messageText.includes('flex-direction'))).toBe(true);
|
|
142
|
+
});
|
|
143
|
+
});
|
|
144
|
+
describe('justify-content conflicts', () => {
|
|
145
|
+
it('should detect conflicting justify classes on both', () => {
|
|
146
|
+
const sourceCode = '<div className="justify-start justify-center">Hello</div>';
|
|
147
|
+
const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
148
|
+
const diagnostics = validationService.validateFile(ts, sourceFile, []);
|
|
149
|
+
const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
|
|
150
|
+
expect(conflicts.length).toBe(2);
|
|
151
|
+
expect(conflicts.every(c => c.messageText.includes('justify-content'))).toBe(true);
|
|
152
|
+
});
|
|
153
|
+
});
|
|
154
|
+
describe('align-items conflicts', () => {
|
|
155
|
+
it('should detect conflicting align-items classes on both', () => {
|
|
156
|
+
const sourceCode = '<div className="items-start items-center">Hello</div>';
|
|
157
|
+
const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
158
|
+
const diagnostics = validationService.validateFile(ts, sourceFile, []);
|
|
159
|
+
const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
|
|
160
|
+
expect(conflicts.length).toBe(2);
|
|
161
|
+
expect(conflicts.every(c => c.messageText.includes('align-items'))).toBe(true);
|
|
162
|
+
});
|
|
163
|
+
});
|
|
164
|
+
describe('no false positives', () => {
|
|
165
|
+
it('should not flag different utility types', () => {
|
|
166
|
+
const sourceCode = '<div className="flex items-center justify-between p-4">Hello</div>';
|
|
167
|
+
const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
168
|
+
const diagnostics = validationService.validateFile(ts, sourceFile, []);
|
|
169
|
+
const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
|
|
170
|
+
expect(conflicts.length).toBe(0);
|
|
171
|
+
});
|
|
172
|
+
it('should not flag same class in different elements', () => {
|
|
173
|
+
const sourceCode = `
|
|
174
|
+
<div className="text-left">
|
|
175
|
+
<span className="text-center">Hello</span>
|
|
176
|
+
</div>
|
|
177
|
+
`;
|
|
178
|
+
const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
179
|
+
const diagnostics = validationService.validateFile(ts, sourceFile, []);
|
|
180
|
+
const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
|
|
181
|
+
expect(conflicts.length).toBe(0);
|
|
182
|
+
});
|
|
183
|
+
it('should not flag duplicate classes as conflicts', () => {
|
|
184
|
+
// Same class repeated is a duplicate, not a conflict
|
|
185
|
+
const sourceCode = '<div className="text-left text-left">Hello</div>';
|
|
186
|
+
const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
187
|
+
const diagnostics = validationService.validateFile(ts, sourceFile, []);
|
|
188
|
+
const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
|
|
189
|
+
expect(conflicts.length).toBe(0); // Should be duplicate, not conflict
|
|
190
|
+
});
|
|
191
|
+
it('should not flag similar but non-conflicting classes', () => {
|
|
192
|
+
// p-4 and pt-4 don't conflict - they're different properties
|
|
193
|
+
const sourceCode = '<div className="p-4 pt-8">Hello</div>';
|
|
194
|
+
const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
195
|
+
const diagnostics = validationService.validateFile(ts, sourceFile, []);
|
|
196
|
+
const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
|
|
197
|
+
expect(conflicts.length).toBe(0);
|
|
198
|
+
});
|
|
199
|
+
});
|
|
200
|
+
describe('ternary conditional expressions', () => {
|
|
201
|
+
it('should NOT flag conflicts in different ternary branches', () => {
|
|
202
|
+
// text-left in true branch, text-center in false branch = no conflict (mutually exclusive)
|
|
203
|
+
const sourceCode = "<div className={isActive ? 'text-left' : 'text-center'}>Hello</div>";
|
|
204
|
+
const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
205
|
+
const diagnostics = validationService.validateFile(ts, sourceFile, []);
|
|
206
|
+
const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
|
|
207
|
+
expect(conflicts.length).toBe(0);
|
|
208
|
+
});
|
|
209
|
+
it('should flag conflict when root class conflicts with branch class (both flagged)', () => {
|
|
210
|
+
// Root 'text-left' + branch 'text-center' = conflict on both
|
|
211
|
+
const sourceCode = "<div className={clsx('text-left', isActive && 'text-center')}>Hello</div>";
|
|
212
|
+
const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
213
|
+
const diagnostics = validationService.validateFile(ts, sourceFile, ['clsx']);
|
|
214
|
+
const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
|
|
215
|
+
expect(conflicts.length).toBe(2);
|
|
216
|
+
});
|
|
217
|
+
it('should flag conflicts within same branch (both flagged)', () => {
|
|
218
|
+
// Both text-left and text-center in the true branch = conflict
|
|
219
|
+
const sourceCode = "<div className={isActive ? 'text-left text-center' : 'text-right'}>Hello</div>";
|
|
220
|
+
const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
221
|
+
const diagnostics = validationService.validateFile(ts, sourceFile, []);
|
|
222
|
+
const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
|
|
223
|
+
expect(conflicts.length).toBe(2);
|
|
224
|
+
});
|
|
225
|
+
});
|
|
226
|
+
describe('utility function calls', () => {
|
|
227
|
+
it('should detect conflicts in clsx arguments (both flagged)', () => {
|
|
228
|
+
const sourceCode = "<div className={clsx('flex', 'block', 'items-center')}>Hello</div>";
|
|
229
|
+
const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
230
|
+
const diagnostics = validationService.validateFile(ts, sourceFile, ['clsx']);
|
|
231
|
+
const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
|
|
232
|
+
expect(conflicts.length).toBe(2);
|
|
233
|
+
});
|
|
234
|
+
it('should detect conflicts in cn function (both flagged)', () => {
|
|
235
|
+
const sourceCode = "<div className={cn('text-left text-right')}>Hello</div>";
|
|
236
|
+
const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
237
|
+
const diagnostics = validationService.validateFile(ts, sourceFile, ['cn']);
|
|
238
|
+
const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
|
|
239
|
+
expect(conflicts.length).toBe(2);
|
|
240
|
+
});
|
|
241
|
+
});
|
|
242
|
+
describe('responsive variants', () => {
|
|
243
|
+
it('should detect conflicts with responsive variants (both flagged)', () => {
|
|
244
|
+
const sourceCode = '<div className="md:text-left md:text-center">Hello</div>';
|
|
245
|
+
const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
246
|
+
const diagnostics = validationService.validateFile(ts, sourceFile, []);
|
|
247
|
+
const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
|
|
248
|
+
expect(conflicts.length).toBe(2);
|
|
249
|
+
});
|
|
250
|
+
it('should NOT flag same utility with different breakpoints as conflict', () => {
|
|
251
|
+
// sm:text-left and md:text-center apply at different breakpoints
|
|
252
|
+
const sourceCode = '<div className="sm:text-left md:text-center">Hello</div>';
|
|
253
|
+
const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
254
|
+
const diagnostics = validationService.validateFile(ts, sourceFile, []);
|
|
255
|
+
const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
|
|
256
|
+
// Different prefixes mean different media queries, so no conflict
|
|
257
|
+
expect(conflicts.length).toBe(0);
|
|
258
|
+
});
|
|
259
|
+
});
|
|
260
|
+
describe('overflow conflicts', () => {
|
|
261
|
+
it('should detect conflicting overflow classes on both', () => {
|
|
262
|
+
const sourceCode = '<div className="overflow-hidden overflow-scroll">Hello</div>';
|
|
263
|
+
const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
264
|
+
const diagnostics = validationService.validateFile(ts, sourceFile, []);
|
|
265
|
+
const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
|
|
266
|
+
expect(conflicts.length).toBe(2);
|
|
267
|
+
expect(conflicts.every(c => c.messageText.includes('overflow'))).toBe(true);
|
|
268
|
+
});
|
|
269
|
+
});
|
|
270
|
+
describe('visibility conflicts', () => {
|
|
271
|
+
it('should detect conflicting visibility classes on both', () => {
|
|
272
|
+
const sourceCode = '<div className="visible invisible">Hello</div>';
|
|
273
|
+
const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
274
|
+
const diagnostics = validationService.validateFile(ts, sourceFile, []);
|
|
275
|
+
const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
|
|
276
|
+
expect(conflicts.length).toBe(2);
|
|
277
|
+
expect(conflicts.every(c => c.messageText.includes('visibility'))).toBe(true);
|
|
278
|
+
});
|
|
279
|
+
});
|
|
280
|
+
describe('font style conflicts', () => {
|
|
281
|
+
it('should detect conflicting font style classes on both', () => {
|
|
282
|
+
const sourceCode = '<div className="italic not-italic">Hello</div>';
|
|
283
|
+
const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
284
|
+
const diagnostics = validationService.validateFile(ts, sourceFile, []);
|
|
285
|
+
const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
|
|
286
|
+
expect(conflicts.length).toBe(2);
|
|
287
|
+
expect(conflicts.every(c => c.messageText.includes('font-style'))).toBe(true);
|
|
288
|
+
});
|
|
289
|
+
});
|
|
290
|
+
describe('text transform conflicts', () => {
|
|
291
|
+
it('should detect conflicting text transform classes on both', () => {
|
|
292
|
+
const sourceCode = '<div className="uppercase lowercase">Hello</div>';
|
|
293
|
+
const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
294
|
+
const diagnostics = validationService.validateFile(ts, sourceFile, []);
|
|
295
|
+
const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
|
|
296
|
+
expect(conflicts.length).toBe(2);
|
|
297
|
+
expect(conflicts.every(c => c.messageText.includes('text-transform'))).toBe(true);
|
|
298
|
+
});
|
|
299
|
+
});
|
|
300
|
+
describe('diagnostic message format', () => {
|
|
301
|
+
it('should have correct warning message format on both classes', () => {
|
|
302
|
+
const sourceCode = '<div className="flex grid">Hello</div>';
|
|
303
|
+
const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
304
|
+
const diagnostics = validationService.validateFile(ts, sourceFile, []);
|
|
305
|
+
const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
|
|
306
|
+
expect(conflicts.length).toBe(2);
|
|
307
|
+
// One should say flex conflicts with grid, other says grid conflicts with flex
|
|
308
|
+
expect(conflicts.some(c => c.messageText.includes('"flex" conflicts with "grid"'))).toBe(true);
|
|
309
|
+
expect(conflicts.some(c => c.messageText.includes('"grid" conflicts with "flex"'))).toBe(true);
|
|
310
|
+
expect(conflicts.every(c => c.messageText.includes('display property'))).toBe(true);
|
|
311
|
+
});
|
|
312
|
+
it('should have source set to tw-plugin', () => {
|
|
313
|
+
const sourceCode = '<div className="text-left text-right">Hello</div>';
|
|
314
|
+
const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
315
|
+
const diagnostics = validationService.validateFile(ts, sourceFile, []);
|
|
316
|
+
const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
|
|
317
|
+
expect(conflicts.every(c => c.source === 'tw-plugin')).toBe(true);
|
|
318
|
+
});
|
|
319
|
+
});
|
|
320
|
+
describe('tailwind-variants tv() conflict detection', () => {
|
|
321
|
+
it('should detect conflicts in tv() base property (both flagged)', () => {
|
|
322
|
+
const sourceCode = `
|
|
323
|
+
import { tv } from 'tailwind-variants';
|
|
324
|
+
const button = tv({
|
|
325
|
+
base: 'flex block items-center'
|
|
326
|
+
});
|
|
327
|
+
`;
|
|
328
|
+
const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
329
|
+
const diagnostics = validationService.validateFile(ts, sourceFile, []);
|
|
330
|
+
const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
|
|
331
|
+
expect(conflicts.length).toBe(2);
|
|
332
|
+
expect(conflicts.every(c => c.messageText.includes('display'))).toBe(true);
|
|
333
|
+
});
|
|
334
|
+
it('should NOT detect conflicts between tv() base and variants (variants are designed to override)', () => {
|
|
335
|
+
const sourceCode = `
|
|
336
|
+
import { tv } from 'tailwind-variants';
|
|
337
|
+
const button = tv({
|
|
338
|
+
base: 'text-left items-center',
|
|
339
|
+
variants: {
|
|
340
|
+
align: {
|
|
341
|
+
center: 'text-center'
|
|
342
|
+
}
|
|
343
|
+
}
|
|
344
|
+
});
|
|
345
|
+
`;
|
|
346
|
+
const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
347
|
+
const diagnostics = validationService.validateFile(ts, sourceFile, []);
|
|
348
|
+
// Base vs variant classes should NOT conflict - variants are designed to override base styles
|
|
349
|
+
const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
|
|
350
|
+
expect(conflicts.length).toBe(0);
|
|
351
|
+
});
|
|
352
|
+
it('should NOT flag conflicts between different tv() calls', () => {
|
|
353
|
+
const sourceCode = `
|
|
354
|
+
import { tv } from 'tailwind-variants';
|
|
355
|
+
const button = tv({
|
|
356
|
+
base: 'text-left'
|
|
357
|
+
});
|
|
358
|
+
const card = tv({
|
|
359
|
+
base: 'text-center'
|
|
360
|
+
});
|
|
361
|
+
`;
|
|
362
|
+
const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
363
|
+
const diagnostics = validationService.validateFile(ts, sourceFile, []);
|
|
364
|
+
// Each tv() call has its own scope, so no conflicts
|
|
365
|
+
expect(diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE).length).toBe(0);
|
|
366
|
+
});
|
|
367
|
+
});
|
|
368
|
+
describe('class-variance-authority cva() conflict detection', () => {
|
|
369
|
+
it('should detect conflicts in cva() base array (both flagged)', () => {
|
|
370
|
+
const sourceCode = `
|
|
371
|
+
import { cva } from 'class-variance-authority';
|
|
372
|
+
const button = cva(['flex', 'grid', 'items-center']);
|
|
373
|
+
`;
|
|
374
|
+
const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
375
|
+
const diagnostics = validationService.validateFile(ts, sourceFile, []);
|
|
376
|
+
const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
|
|
377
|
+
expect(conflicts.length).toBe(2);
|
|
378
|
+
expect(conflicts.every(c => c.messageText.includes('display'))).toBe(true);
|
|
379
|
+
});
|
|
380
|
+
it('should NOT detect conflicts between cva() base and variants (variants are designed to override)', () => {
|
|
381
|
+
const sourceCode = `
|
|
382
|
+
import { cva } from 'class-variance-authority';
|
|
383
|
+
const button = cva(['justify-start'], {
|
|
384
|
+
variants: {
|
|
385
|
+
centered: {
|
|
386
|
+
true: ['justify-center']
|
|
387
|
+
}
|
|
388
|
+
}
|
|
389
|
+
});
|
|
390
|
+
`;
|
|
391
|
+
const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
392
|
+
const diagnostics = validationService.validateFile(ts, sourceFile, []);
|
|
393
|
+
// Base vs variant classes should NOT conflict - variants are designed to override base styles
|
|
394
|
+
const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
|
|
395
|
+
expect(conflicts.length).toBe(0);
|
|
396
|
+
});
|
|
397
|
+
it('should NOT flag conflicts between different cva() calls', () => {
|
|
398
|
+
const sourceCode = `
|
|
399
|
+
import { cva } from 'class-variance-authority';
|
|
400
|
+
const button = cva(['flex']);
|
|
401
|
+
const card = cva(['grid']);
|
|
402
|
+
`;
|
|
403
|
+
const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
404
|
+
const diagnostics = validationService.validateFile(ts, sourceFile, []);
|
|
405
|
+
// Each cva() call has its own scope, so no conflicts
|
|
406
|
+
expect(diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE).length).toBe(0);
|
|
407
|
+
});
|
|
408
|
+
it('should detect conflicts within same variant option in cva()', () => {
|
|
409
|
+
const sourceCode = `
|
|
410
|
+
import { cva } from 'class-variance-authority';
|
|
411
|
+
const button = cva(['items-center'], {
|
|
412
|
+
variants: {
|
|
413
|
+
align: {
|
|
414
|
+
left: ['text-left', 'text-center']
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
});
|
|
418
|
+
`;
|
|
419
|
+
const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
420
|
+
const diagnostics = validationService.validateFile(ts, sourceFile, []);
|
|
421
|
+
// Conflicts within the same variant option SHOULD be flagged
|
|
422
|
+
const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
|
|
423
|
+
expect(conflicts.length).toBe(2);
|
|
424
|
+
expect(conflicts.every(c => c.messageText.includes('text-align'))).toBe(true);
|
|
425
|
+
});
|
|
426
|
+
});
|
|
427
|
+
describe('tv() variant conflict edge cases', () => {
|
|
428
|
+
it('should detect conflicts within same variant option in tv()', () => {
|
|
429
|
+
const sourceCode = `
|
|
430
|
+
import { tv } from 'tailwind-variants';
|
|
431
|
+
const button = tv({
|
|
432
|
+
base: 'items-center',
|
|
433
|
+
variants: {
|
|
434
|
+
align: {
|
|
435
|
+
weird: 'text-left text-center'
|
|
436
|
+
}
|
|
437
|
+
}
|
|
438
|
+
});
|
|
439
|
+
`;
|
|
440
|
+
const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
441
|
+
const diagnostics = validationService.validateFile(ts, sourceFile, []);
|
|
442
|
+
// Conflicts within the same variant option SHOULD be flagged
|
|
443
|
+
const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
|
|
444
|
+
expect(conflicts.length).toBe(2);
|
|
445
|
+
expect(conflicts.every(c => c.messageText.includes('text-align'))).toBe(true);
|
|
446
|
+
});
|
|
447
|
+
it('should flag conflicts between different variant options in tv() (known limitation)', () => {
|
|
448
|
+
const sourceCode = `
|
|
449
|
+
import { tv } from 'tailwind-variants';
|
|
450
|
+
const button = tv({
|
|
451
|
+
base: 'items-center',
|
|
452
|
+
variants: {
|
|
453
|
+
align: {
|
|
454
|
+
left: 'text-left',
|
|
455
|
+
center: 'text-center',
|
|
456
|
+
right: 'text-right'
|
|
457
|
+
}
|
|
458
|
+
}
|
|
459
|
+
});
|
|
460
|
+
`;
|
|
461
|
+
const sourceFile = ts.createSourceFile('test.tsx', sourceCode, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
462
|
+
const diagnostics = validationService.validateFile(ts, sourceFile, []);
|
|
463
|
+
// Note: Ideally different variant options are mutually exclusive (only one active at runtime),
|
|
464
|
+
// so they shouldn't conflict. However, this would require tracking which variant OPTION
|
|
465
|
+
// each class belongs to, which adds complexity. For now, we flag these as conflicts.
|
|
466
|
+
// This is a known false positive - users can safely ignore these warnings for variant options.
|
|
467
|
+
const conflicts = diagnostics.filter(d => d.code === DiagnosticService_1.TAILWIND_CONFLICT_CODE);
|
|
468
|
+
expect(conflicts.length).toBe(3); // All three options flagged
|
|
469
|
+
});
|
|
470
|
+
});
|
|
471
|
+
});
|
|
472
|
+
//# 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;
|
|
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;
|
|
1
|
+
{"version":3,"file":"DiagnosticService.js","sourceRoot":"","sources":["../../src/services/DiagnosticService.ts"],"names":[],"mappings":"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"}
|
|
@@ -12,6 +12,7 @@ export declare class ValidationService {
|
|
|
12
12
|
private readonly diagnosticService;
|
|
13
13
|
private readonly validator;
|
|
14
14
|
private readonly logger;
|
|
15
|
+
private readonly conflictDetector;
|
|
15
16
|
constructor(extractionService: ClassNameExtractionService, diagnosticService: DiagnosticService, validator: IClassNameValidator, logger: Logger);
|
|
16
17
|
/**
|
|
17
18
|
* Validate a source file and return diagnostics
|