tailwind-typescript-plugin 1.4.1-beta.1 → 1.4.1-beta.10

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 (69) hide show
  1. package/CHANGELOG.md +67 -0
  2. package/README.md +206 -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 +19 -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.js +1 -1
  12. package/lib/extractors/CvaExtractor.js.map +1 -1
  13. package/lib/extractors/ExpressionExtractor.d.ts.map +1 -1
  14. package/lib/extractors/ExpressionExtractor.js +35 -5
  15. package/lib/extractors/ExpressionExtractor.js.map +1 -1
  16. package/lib/extractors/JsxAttributeExtractor.js +1 -1
  17. package/lib/extractors/JsxAttributeExtractor.js.map +1 -1
  18. package/lib/extractors/TailwindVariantsExtractor.d.ts.map +1 -1
  19. package/lib/extractors/TailwindVariantsExtractor.js +1 -5
  20. package/lib/extractors/TailwindVariantsExtractor.js.map +1 -1
  21. package/lib/extractors/VariableReferenceExtractor.d.ts.map +1 -1
  22. package/lib/extractors/VariableReferenceExtractor.js +21 -0
  23. package/lib/extractors/VariableReferenceExtractor.js.map +1 -1
  24. package/lib/infrastructure/TailwindConflictDetector.d.ts +28 -18
  25. package/lib/infrastructure/TailwindConflictDetector.d.ts.map +1 -1
  26. package/lib/infrastructure/TailwindConflictDetector.js +216 -486
  27. package/lib/infrastructure/TailwindConflictDetector.js.map +1 -1
  28. package/lib/infrastructure/TailwindValidator.d.ts +15 -0
  29. package/lib/infrastructure/TailwindValidator.d.ts.map +1 -1
  30. package/lib/infrastructure/TailwindValidator.js +84 -5
  31. package/lib/infrastructure/TailwindValidator.js.map +1 -1
  32. package/lib/infrastructure/TailwindValidator.spec.js +194 -0
  33. package/lib/infrastructure/TailwindValidator.spec.js.map +1 -1
  34. package/lib/plugin/TailwindTypescriptPlugin.d.ts +26 -0
  35. package/lib/plugin/TailwindTypescriptPlugin.d.ts.map +1 -1
  36. package/lib/plugin/TailwindTypescriptPlugin.js +180 -1
  37. package/lib/plugin/TailwindTypescriptPlugin.js.map +1 -1
  38. package/lib/services/ClassNameExtractionService.d.ts +2 -2
  39. package/lib/services/ClassNameExtractionService.d.ts.map +1 -1
  40. package/lib/services/ClassNameExtractionService.js.map +1 -1
  41. package/lib/services/CompletionService.d.ts +98 -0
  42. package/lib/services/CompletionService.d.ts.map +1 -0
  43. package/lib/services/CompletionService.js +484 -0
  44. package/lib/services/CompletionService.js.map +1 -0
  45. package/lib/services/CompletionService.spec.d.ts +2 -0
  46. package/lib/services/CompletionService.spec.d.ts.map +1 -0
  47. package/lib/services/CompletionService.spec.js +334 -0
  48. package/lib/services/CompletionService.spec.js.map +1 -0
  49. package/lib/services/ConflictClassDetection.spec.js +24 -19
  50. package/lib/services/ConflictClassDetection.spec.js.map +1 -1
  51. package/lib/services/DuplicateClassDetection.spec.js +41 -60
  52. package/lib/services/DuplicateClassDetection.spec.js.map +1 -1
  53. package/lib/services/PluginConfigService.d.ts +2 -1
  54. package/lib/services/PluginConfigService.d.ts.map +1 -1
  55. package/lib/services/PluginConfigService.js +19 -12
  56. package/lib/services/PluginConfigService.js.map +1 -1
  57. package/lib/services/ValidationService.d.ts +4 -2
  58. package/lib/services/ValidationService.d.ts.map +1 -1
  59. package/lib/services/ValidationService.js +10 -7
  60. package/lib/services/ValidationService.js.map +1 -1
  61. package/package.json +4 -2
  62. package/lib/extractors/StringLiteralExtractor.d.ts +0 -12
  63. package/lib/extractors/StringLiteralExtractor.d.ts.map +0 -1
  64. package/lib/extractors/StringLiteralExtractor.js +0 -21
  65. package/lib/extractors/StringLiteralExtractor.js.map +0 -1
  66. package/lib/services/ClassNameExtractionService.original.d.ts +0 -20
  67. package/lib/services/ClassNameExtractionService.original.d.ts.map +0 -1
  68. package/lib/services/ClassNameExtractionService.original.js +0 -48
  69. package/lib/services/ClassNameExtractionService.original.js.map +0 -1
@@ -0,0 +1,484 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CompletionService = void 0;
4
+ /**
5
+ * Service that provides autocompletion for Tailwind CSS class names
6
+ *
7
+ * Provides completions when:
8
+ * - Cursor is inside a className attribute's string literal
9
+ * - Cursor is inside a utility function argument (clsx, cn, classnames, etc.)
10
+ * - Cursor is inside tv() or cva() class strings
11
+ *
12
+ * Features:
13
+ * - Filters completions based on what's already typed
14
+ * - Excludes classes already present in the same className
15
+ * - Handles space-separated class lists properly
16
+ */
17
+ class CompletionService {
18
+ constructor(validator, logger) {
19
+ this.validator = validator;
20
+ this.logger = logger;
21
+ /** Cached sorted class list for faster completion generation */
22
+ this.cachedClassList = null;
23
+ }
24
+ /**
25
+ * Get completions at the given position
26
+ */
27
+ getCompletionsAtPosition(typescript, sourceFile, position, existingCompletions) {
28
+ const context = this.getCompletionContext(typescript, sourceFile, position);
29
+ if (!context.isInClassNameContext) {
30
+ this.logger.log('[CompletionService] Not in className context, returning original completions');
31
+ return existingCompletions;
32
+ }
33
+ this.logger.log(`[CompletionService] In className context, prefix="${context.currentPrefix}", existingClasses=${context.existingClasses.size}`);
34
+ const tailwindCompletions = this.generateCompletions(typescript, context);
35
+ if (tailwindCompletions.length === 0) {
36
+ return existingCompletions;
37
+ }
38
+ // Create completion info with Tailwind classes
39
+ const completionInfo = {
40
+ isGlobalCompletion: false,
41
+ isMemberCompletion: false,
42
+ isNewIdentifierLocation: false,
43
+ entries: tailwindCompletions
44
+ };
45
+ return completionInfo;
46
+ }
47
+ /**
48
+ * Get completion entry details for a specific completion item
49
+ * Formats the documentation with markdown CSS code blocks for syntax highlighting
50
+ */
51
+ getCompletionEntryDetails(typescript, sourceFile, position, entryName) {
52
+ // Check if this is a Tailwind class completion
53
+ if (!this.isTailwindClass(entryName)) {
54
+ return undefined;
55
+ }
56
+ // Get the CSS for this class
57
+ const cssResults = this.validator.getCssForClasses([entryName]);
58
+ const css = cssResults[0];
59
+ const documentation = [];
60
+ if (css) {
61
+ // Format the CSS with proper structure like Tailwind IntelliSense
62
+ const formattedCss = this.formatCssForDisplay(css);
63
+ // Use markdown code block for syntax highlighting
64
+ documentation.push({
65
+ kind: 'text',
66
+ text: '```css\n' + formattedCss + '\n```'
67
+ });
68
+ }
69
+ // Extract just the declarations for the detail (short summary)
70
+ const detail = css ? this.extractCssDeclarations(css) : undefined;
71
+ // Check if this is a color class for the icon
72
+ const isColor = this.isColorClass(entryName);
73
+ return {
74
+ name: entryName,
75
+ kind: typescript.ScriptElementKind.string,
76
+ // Set 'color' kindModifier for color classes so VS Code shows color icon
77
+ kindModifiers: isColor ? 'color' : '',
78
+ displayParts: detail ? [{ kind: 'text', text: detail }] : [{ kind: 'text', text: entryName }],
79
+ documentation
80
+ };
81
+ }
82
+ /**
83
+ * Format CSS output for display in the completion documentation
84
+ * Transforms the raw Tailwind CSS output into a nicely formatted rule block
85
+ */
86
+ formatCssForDisplay(css) {
87
+ // The CSS from Tailwind typically looks like:
88
+ // .flex { display: flex; }
89
+ // We want to format it nicely with proper indentation
90
+ // First, let's clean up and format the CSS
91
+ const formatted = css.trim();
92
+ // If it's already well-formatted, return as-is
93
+ if (formatted.includes('\n')) {
94
+ return formatted;
95
+ }
96
+ // Single-line CSS: format it nicely
97
+ // Match pattern: .selector { declarations }
98
+ const singleLineMatch = formatted.match(/^([^{]+)\{([^}]+)\}$/);
99
+ if (singleLineMatch) {
100
+ const selector = singleLineMatch[1].trim();
101
+ const declarations = singleLineMatch[2].trim();
102
+ // Split declarations and format each on its own line
103
+ const declParts = declarations
104
+ .split(';')
105
+ .map(d => d.trim())
106
+ .filter(d => d.length > 0);
107
+ if (declParts.length === 1) {
108
+ // Single declaration: keep on one line
109
+ return `${selector} {\n ${declParts[0]};\n}`;
110
+ }
111
+ else {
112
+ // Multiple declarations: each on its own line
113
+ const formattedDecls = declParts.map(d => ` ${d};`).join('\n');
114
+ return `${selector} {\n${formattedDecls}\n}`;
115
+ }
116
+ }
117
+ return formatted;
118
+ }
119
+ /**
120
+ * Extract just the CSS declarations from a CSS rule for the detail summary
121
+ * e.g., ".flex { display: flex; }" -> "display: flex;"
122
+ */
123
+ extractCssDeclarations(css) {
124
+ // Match the content inside the curly braces
125
+ const match = css.match(/\{([^}]+)\}/);
126
+ if (match) {
127
+ // Clean up the declarations
128
+ return (match[1]
129
+ .trim()
130
+ .split(';')
131
+ .map(d => d.trim())
132
+ .filter(d => d.length > 0)
133
+ .join('; ') + ';');
134
+ }
135
+ return css.trim();
136
+ }
137
+ /**
138
+ * Check if a name is a valid Tailwind class
139
+ */
140
+ isTailwindClass(name) {
141
+ return this.validator.isValidClass(name);
142
+ }
143
+ /**
144
+ * Analyze the source file at the given position to determine completion context
145
+ */
146
+ getCompletionContext(typescript, sourceFile, position) {
147
+ const defaultContext = {
148
+ isInClassNameContext: false,
149
+ currentPrefix: '',
150
+ prefixStart: position,
151
+ stringStart: position,
152
+ existingClasses: new Set()
153
+ };
154
+ // Find the node at the current position
155
+ let node = this.findNodeAtPosition(typescript, sourceFile, position);
156
+ if (!node) {
157
+ this.logger.log(`[CompletionService] No node found at position ${position}`);
158
+ return defaultContext;
159
+ }
160
+ this.logger.log(`[CompletionService] Found node kind: ${typescript.SyntaxKind[node.kind]} at position ${position}`);
161
+ // If we found a JsxAttribute, look for its string literal initializer
162
+ if (typescript.isJsxAttribute(node)) {
163
+ const initializer = node.initializer;
164
+ if (initializer && typescript.isStringLiteral(initializer)) {
165
+ node = initializer;
166
+ this.logger.log(`[CompletionService] Found string literal in JsxAttribute initializer`);
167
+ }
168
+ }
169
+ // Check if we're in a string literal
170
+ if (!typescript.isStringLiteral(node) && !typescript.isNoSubstitutionTemplateLiteral(node)) {
171
+ this.logger.log(`[CompletionService] Node is not a string literal: ${typescript.SyntaxKind[node.kind]}`);
172
+ return defaultContext;
173
+ }
174
+ // Check if this string is in a className context
175
+ if (!this.isClassNameContext(typescript, node)) {
176
+ this.logger.log(`[CompletionService] Node is not in className context`);
177
+ return defaultContext;
178
+ }
179
+ // We're in a className context! Now extract the completion details
180
+ const stringContent = node.text;
181
+ const stringStart = node.getStart(sourceFile) + 1; // +1 to skip the opening quote
182
+ const positionInString = position - stringStart;
183
+ // Handle cursor at or before string start
184
+ if (positionInString < 0) {
185
+ return defaultContext;
186
+ }
187
+ // Find the current "word" being typed (from last space to cursor)
188
+ const textBeforeCursor = stringContent.substring(0, positionInString);
189
+ const lastSpaceIndex = textBeforeCursor.lastIndexOf(' ');
190
+ const currentPrefix = lastSpaceIndex === -1 ? textBeforeCursor : textBeforeCursor.substring(lastSpaceIndex + 1);
191
+ const prefixStart = stringStart + (lastSpaceIndex === -1 ? 0 : lastSpaceIndex + 1);
192
+ // Get all existing classes in this attribute (for duplicate filtering)
193
+ const existingClasses = new Set(stringContent.split(/\s+/).filter(c => c.length > 0));
194
+ // Remove the current prefix from existing classes if it's a partial match
195
+ // (so we can still suggest completions for partially typed classes)
196
+ if (currentPrefix) {
197
+ existingClasses.delete(currentPrefix);
198
+ }
199
+ return {
200
+ isInClassNameContext: true,
201
+ currentPrefix,
202
+ prefixStart,
203
+ stringStart,
204
+ existingClasses
205
+ };
206
+ }
207
+ /**
208
+ * Find the deepest node at the given position
209
+ * Uses TypeScript's built-in method which handles edge cases better
210
+ */
211
+ findNodeAtPosition(typescript, sourceFile, position) {
212
+ function find(node) {
213
+ // Use getStart without sourceFile to include trivia, which helps with edge positions
214
+ const start = node.getStart(sourceFile);
215
+ const end = node.getEnd();
216
+ // Position must be within the node's range (inclusive of end for completions)
217
+ if (position < start || position > end) {
218
+ return undefined;
219
+ }
220
+ // Check children first to find the deepest matching node
221
+ let result;
222
+ typescript.forEachChild(node, child => {
223
+ const found = find(child);
224
+ if (found) {
225
+ result = found;
226
+ }
227
+ });
228
+ return result || node;
229
+ }
230
+ return find(sourceFile);
231
+ }
232
+ /**
233
+ * Check if a string literal node is in a className-like context
234
+ */
235
+ isClassNameContext(typescript, node) {
236
+ const parent = node.parent;
237
+ // Case 1: JSX attribute like className="..."
238
+ if (typescript.isJsxAttribute(parent)) {
239
+ const attrName = parent.name.getText();
240
+ return this.isClassNameAttribute(attrName);
241
+ }
242
+ // Case 2: Property assignment like { className: "..." }
243
+ if (typescript.isPropertyAssignment(parent)) {
244
+ const propName = parent.name.getText();
245
+ return this.isClassNameAttribute(propName);
246
+ }
247
+ // Case 3: Inside a call expression (utility function like clsx, cn, etc.)
248
+ // Check parent chain for call expression
249
+ let current = node;
250
+ while (current.parent) {
251
+ current = current.parent;
252
+ if (typescript.isCallExpression(current)) {
253
+ const callName = this.getCallExpressionName(typescript, current);
254
+ if (callName && this.isUtilityFunction(callName)) {
255
+ return true;
256
+ }
257
+ }
258
+ // Case 4: Inside tv() or cva() variant definitions
259
+ if (typescript.isPropertyAssignment(current)) {
260
+ const parentCall = this.findParentCallExpression(typescript, current);
261
+ if (parentCall) {
262
+ const callName = this.getCallExpressionName(typescript, parentCall);
263
+ if (callName === 'tv' || callName === 'cva') {
264
+ return true;
265
+ }
266
+ }
267
+ }
268
+ // Stop at certain boundaries
269
+ if (typescript.isBlock(current) ||
270
+ typescript.isSourceFile(current) ||
271
+ typescript.isFunctionDeclaration(current) ||
272
+ typescript.isArrowFunction(current)) {
273
+ break;
274
+ }
275
+ }
276
+ return false;
277
+ }
278
+ /**
279
+ * Check if an attribute name is a className-like attribute
280
+ */
281
+ isClassNameAttribute(name) {
282
+ const classNameAttributes = [
283
+ 'className',
284
+ 'class',
285
+ 'classname', // case variations
286
+ 'classList'
287
+ ];
288
+ return classNameAttributes.includes(name) || classNameAttributes.includes(name.toLowerCase());
289
+ }
290
+ /**
291
+ * Check if a function name is a common utility function for class names
292
+ */
293
+ isUtilityFunction(name) {
294
+ const utilityFunctions = [
295
+ 'clsx',
296
+ 'cn',
297
+ 'classnames',
298
+ 'classNames',
299
+ 'cx',
300
+ 'cva',
301
+ 'tv',
302
+ 'twMerge',
303
+ 'twJoin'
304
+ ];
305
+ return utilityFunctions.includes(name);
306
+ }
307
+ /**
308
+ * Get the name of a call expression
309
+ */
310
+ getCallExpressionName(typescript, callExpr) {
311
+ const expr = callExpr.expression;
312
+ if (typescript.isIdentifier(expr)) {
313
+ return expr.text;
314
+ }
315
+ if (typescript.isPropertyAccessExpression(expr)) {
316
+ return expr.name.text;
317
+ }
318
+ return undefined;
319
+ }
320
+ /**
321
+ * Find the parent call expression of a node
322
+ */
323
+ findParentCallExpression(typescript, node) {
324
+ let current = node.parent;
325
+ while (current) {
326
+ if (typescript.isCallExpression(current)) {
327
+ return current;
328
+ }
329
+ if (typescript.isBlock(current) ||
330
+ typescript.isSourceFile(current) ||
331
+ typescript.isFunctionDeclaration(current)) {
332
+ break;
333
+ }
334
+ current = current.parent;
335
+ }
336
+ return undefined;
337
+ }
338
+ /**
339
+ * Generate completion entries for Tailwind classes
340
+ */
341
+ generateCompletions(typescript, context) {
342
+ // Get all classes from the validator
343
+ const allClasses = this.getClassList();
344
+ const prefix = context.currentPrefix.toLowerCase();
345
+ // Filter and create completion entries
346
+ const entries = [];
347
+ for (const className of allClasses) {
348
+ // Skip classes that are already in the attribute
349
+ if (context.existingClasses.has(className)) {
350
+ continue;
351
+ }
352
+ // Filter by prefix if one is being typed
353
+ if (prefix && !className.toLowerCase().startsWith(prefix)) {
354
+ continue;
355
+ }
356
+ // Check if this is a color-related class
357
+ const isColorClass = this.isColorClass(className);
358
+ entries.push({
359
+ name: className,
360
+ kind: typescript.ScriptElementKind.string,
361
+ // VS Code recognizes 'color' kindModifier and shows a color icon
362
+ kindModifiers: isColorClass ? 'color' : '',
363
+ sortText: this.getSortText(className, prefix),
364
+ insertText: className,
365
+ replacementSpan: {
366
+ start: context.prefixStart,
367
+ length: context.currentPrefix.length
368
+ }
369
+ });
370
+ }
371
+ this.logger.log(`[CompletionService] Generated ${entries.length} completions for prefix "${prefix}"`);
372
+ return entries;
373
+ }
374
+ /**
375
+ * Get the cached class list, initializing if necessary
376
+ */
377
+ getClassList() {
378
+ if (this.cachedClassList === null) {
379
+ this.cachedClassList = this.validator.getAllClasses().sort();
380
+ this.logger.log(`[CompletionService] Cached ${this.cachedClassList.length} classes`);
381
+ }
382
+ return this.cachedClassList;
383
+ }
384
+ /**
385
+ * Clear the cached class list (call when design system reloads)
386
+ */
387
+ clearCache() {
388
+ this.cachedClassList = null;
389
+ }
390
+ /**
391
+ * Check if a class name is related to colors
392
+ * Uses a pattern-based approach to detect color classes efficiently
393
+ */
394
+ isColorClass(className) {
395
+ // Color-related prefixes in Tailwind CSS
396
+ // These patterns match classes that typically set colors
397
+ const colorPrefixes = [
398
+ 'bg-', // background-color
399
+ 'text-', // color (text color)
400
+ 'border-', // border-color (but not border-0, border-2, etc.)
401
+ 'ring-', // ring-color (but not ring-0, ring-1, etc.)
402
+ 'outline-', // outline-color (but not outline-0, outline-1, etc.)
403
+ 'shadow-', // box-shadow colors (but not shadow-sm, shadow-lg, etc.)
404
+ 'accent-', // accent-color
405
+ 'caret-', // caret-color
406
+ 'fill-', // SVG fill
407
+ 'stroke-', // SVG stroke
408
+ 'from-', // gradient from color
409
+ 'via-', // gradient via color
410
+ 'to-', // gradient to color
411
+ 'divide-', // divide color (but not divide-x, divide-y)
412
+ 'placeholder-', // placeholder color
413
+ 'decoration-' // text-decoration-color
414
+ ];
415
+ // Check if class starts with any color prefix
416
+ const hasColorPrefix = colorPrefixes.some(prefix => className.startsWith(prefix));
417
+ if (!hasColorPrefix) {
418
+ return false;
419
+ }
420
+ // Filter out non-color variants of these prefixes
421
+ // These are utilities that use the same prefix but aren't colors
422
+ const nonColorPatterns = [
423
+ // Border utilities that aren't colors
424
+ /^border-[0-8]$/,
425
+ /^border-(collapse|separate|spacing|none|hidden|solid|dashed|dotted|double)$/,
426
+ /^border-(x|y|t|r|b|l|s|e)-[0-8]$/,
427
+ // Ring utilities that aren't colors
428
+ /^ring-[0-8]$/,
429
+ /^ring-(inset|offset-[0-8])$/,
430
+ // Outline utilities that aren't colors
431
+ /^outline-[0-8]$/,
432
+ /^outline-(none|dashed|dotted|double|offset-[0-8])$/,
433
+ // Shadow utilities that aren't colors
434
+ /^shadow-(sm|md|lg|xl|2xl|inner|none)$/,
435
+ // Divide utilities that aren't colors
436
+ /^divide-(x|y)(-[0-8]|-reverse)?$/,
437
+ /^divide-(solid|dashed|dotted|double|none)$/,
438
+ // Text utilities that aren't colors (sizes, alignment, etc.)
439
+ /^text-(xs|sm|base|lg|xl|[2-9]xl|left|center|right|justify|start|end|wrap|nowrap|balance|pretty)$/,
440
+ // Stroke width
441
+ /^stroke-[0-2]$/,
442
+ // Decoration utilities that aren't colors
443
+ /^decoration-(slice|clone|solid|double|dotted|dashed|wavy|auto|from-font|[0-8])$/
444
+ ];
445
+ // If it matches any non-color pattern, it's not a color class
446
+ if (nonColorPatterns.some(pattern => pattern.test(className))) {
447
+ return false;
448
+ }
449
+ // Additional check: color classes typically have a color name or number
450
+ // e.g., bg-red-500, text-blue-200, border-gray-300
451
+ // or named colors like bg-white, text-black, bg-transparent
452
+ const afterPrefix = className.replace(/^[a-z]+-/, '');
453
+ // Common color indicators
454
+ const colorIndicators = [
455
+ // Color names
456
+ /^(slate|gray|zinc|neutral|stone|red|orange|amber|yellow|lime|green|emerald|teal|cyan|sky|blue|indigo|violet|purple|fuchsia|pink|rose)-\d+$/,
457
+ // Special colors
458
+ /^(black|white|transparent|current|inherit)$/,
459
+ // Arbitrary colors
460
+ /^\[.*\]$/,
461
+ // Opacity variants on colors
462
+ /^.*\/\d+$/
463
+ ];
464
+ return colorIndicators.some(pattern => pattern.test(afterPrefix));
465
+ }
466
+ /**
467
+ * Generate sort text for completion ordering
468
+ * Classes that start with the prefix get priority
469
+ */
470
+ getSortText(className, prefix) {
471
+ // Exact match gets highest priority
472
+ if (className === prefix) {
473
+ return '0' + className;
474
+ }
475
+ // Prefix match gets high priority
476
+ if (prefix && className.toLowerCase().startsWith(prefix.toLowerCase())) {
477
+ return '1' + className;
478
+ }
479
+ // Everything else sorted alphabetically
480
+ return '2' + className;
481
+ }
482
+ }
483
+ exports.CompletionService = CompletionService;
484
+ //# sourceMappingURL=CompletionService.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CompletionService.js","sourceRoot":"","sources":["../../src/services/CompletionService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=CompletionService.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CompletionService.spec.d.ts","sourceRoot":"","sources":["../../src/services/CompletionService.spec.ts"],"names":[],"mappings":""}