tailwind-typescript-plugin 1.4.1-beta.3 → 1.4.1-beta.31

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 (152) hide show
  1. package/CHANGELOG.md +155 -0
  2. package/README.md +369 -71
  3. package/lib/core/interfaces.d.ts +40 -13
  4. package/lib/core/interfaces.d.ts.map +1 -1
  5. package/lib/core/types.d.ts +112 -1
  6. package/lib/core/types.d.ts.map +1 -1
  7. package/lib/extractors/BaseExtractor.d.ts +56 -3
  8. package/lib/extractors/BaseExtractor.d.ts.map +1 -1
  9. package/lib/extractors/BaseExtractor.js +194 -5
  10. package/lib/extractors/BaseExtractor.js.map +1 -1
  11. package/lib/extractors/BaseExtractor.spec.d.ts +2 -0
  12. package/lib/extractors/BaseExtractor.spec.d.ts.map +1 -0
  13. package/lib/extractors/BaseExtractor.spec.js +421 -0
  14. package/lib/extractors/BaseExtractor.spec.js.map +1 -0
  15. package/lib/extractors/CvaExtractor.js +1 -1
  16. package/lib/extractors/CvaExtractor.js.map +1 -1
  17. package/lib/extractors/CvaExtractor.spec.d.ts +2 -0
  18. package/lib/extractors/CvaExtractor.spec.d.ts.map +1 -0
  19. package/lib/extractors/CvaExtractor.spec.js +1177 -0
  20. package/lib/extractors/CvaExtractor.spec.js.map +1 -0
  21. package/lib/extractors/ExpressionExtractor.d.ts.map +1 -1
  22. package/lib/extractors/ExpressionExtractor.js +35 -5
  23. package/lib/extractors/ExpressionExtractor.js.map +1 -1
  24. package/lib/extractors/ExpressionExtractor.spec.d.ts +2 -0
  25. package/lib/extractors/ExpressionExtractor.spec.d.ts.map +1 -0
  26. package/lib/extractors/ExpressionExtractor.spec.js +316 -0
  27. package/lib/extractors/ExpressionExtractor.spec.js.map +1 -0
  28. package/lib/extractors/JsxAttributeExtractor.d.ts +7 -1
  29. package/lib/extractors/JsxAttributeExtractor.d.ts.map +1 -1
  30. package/lib/extractors/JsxAttributeExtractor.js +21 -8
  31. package/lib/extractors/JsxAttributeExtractor.js.map +1 -1
  32. package/lib/extractors/JsxAttributeExtractor.spec.d.ts +2 -0
  33. package/lib/extractors/JsxAttributeExtractor.spec.d.ts.map +1 -0
  34. package/lib/extractors/JsxAttributeExtractor.spec.js +430 -0
  35. package/lib/extractors/JsxAttributeExtractor.spec.js.map +1 -0
  36. package/lib/extractors/TailwindVariantsExtractor.d.ts.map +1 -1
  37. package/lib/extractors/TailwindVariantsExtractor.js +1 -5
  38. package/lib/extractors/TailwindVariantsExtractor.js.map +1 -1
  39. package/lib/extractors/TailwindVariantsExtractor.spec.d.ts +2 -0
  40. package/lib/extractors/TailwindVariantsExtractor.spec.d.ts.map +1 -0
  41. package/lib/extractors/TailwindVariantsExtractor.spec.js +1407 -0
  42. package/lib/extractors/TailwindVariantsExtractor.spec.js.map +1 -0
  43. package/lib/extractors/TemplateExpressionExtractor.spec.d.ts +2 -0
  44. package/lib/extractors/TemplateExpressionExtractor.spec.d.ts.map +1 -0
  45. package/lib/extractors/TemplateExpressionExtractor.spec.js +240 -0
  46. package/lib/extractors/TemplateExpressionExtractor.spec.js.map +1 -0
  47. package/lib/extractors/VariableReferenceExtractor.d.ts.map +1 -1
  48. package/lib/extractors/VariableReferenceExtractor.js +21 -0
  49. package/lib/extractors/VariableReferenceExtractor.js.map +1 -1
  50. package/lib/extractors/VariableReferenceExtractor.spec.d.ts +2 -0
  51. package/lib/extractors/VariableReferenceExtractor.spec.d.ts.map +1 -0
  52. package/lib/extractors/VariableReferenceExtractor.spec.js +138 -0
  53. package/lib/extractors/VariableReferenceExtractor.spec.js.map +1 -0
  54. package/lib/extractors/VueAttributeExtractor.d.ts +202 -0
  55. package/lib/extractors/VueAttributeExtractor.d.ts.map +1 -0
  56. package/lib/extractors/VueAttributeExtractor.js +1691 -0
  57. package/lib/extractors/VueAttributeExtractor.js.map +1 -0
  58. package/lib/extractors/VueExpressionExtractor.d.ts +34 -0
  59. package/lib/extractors/VueExpressionExtractor.d.ts.map +1 -0
  60. package/lib/extractors/VueExpressionExtractor.js +171 -0
  61. package/lib/extractors/VueExpressionExtractor.js.map +1 -0
  62. package/lib/infrastructure/TailwindValidator.css-vars.spec.js +1 -11
  63. package/lib/infrastructure/TailwindValidator.css-vars.spec.js.map +1 -1
  64. package/lib/infrastructure/TailwindValidator.d.ts +10 -3
  65. package/lib/infrastructure/TailwindValidator.d.ts.map +1 -1
  66. package/lib/infrastructure/TailwindValidator.js +68 -28
  67. package/lib/infrastructure/TailwindValidator.js.map +1 -1
  68. package/lib/infrastructure/TailwindValidator.spec.js +50 -17
  69. package/lib/infrastructure/TailwindValidator.spec.js.map +1 -1
  70. package/lib/plugin/TailwindTypescriptPlugin.d.ts +22 -1
  71. package/lib/plugin/TailwindTypescriptPlugin.d.ts.map +1 -1
  72. package/lib/plugin/TailwindTypescriptPlugin.js +133 -50
  73. package/lib/plugin/TailwindTypescriptPlugin.js.map +1 -1
  74. package/lib/services/ClassNameExtractionService.d.ts +27 -6
  75. package/lib/services/ClassNameExtractionService.d.ts.map +1 -1
  76. package/lib/services/ClassNameExtractionService.js +80 -17
  77. package/lib/services/ClassNameExtractionService.js.map +1 -1
  78. package/lib/services/ClassNameExtractionService.spec.d.ts +2 -0
  79. package/lib/services/ClassNameExtractionService.spec.d.ts.map +1 -0
  80. package/lib/services/ClassNameExtractionService.spec.js +215 -0
  81. package/lib/services/ClassNameExtractionService.spec.js.map +1 -0
  82. package/lib/services/CodeActionService.spec.js +1 -2
  83. package/lib/services/CodeActionService.spec.js.map +1 -1
  84. package/lib/services/CompletionService.d.ts +121 -0
  85. package/lib/services/CompletionService.d.ts.map +1 -0
  86. package/lib/services/CompletionService.js +573 -0
  87. package/lib/services/CompletionService.js.map +1 -0
  88. package/lib/services/CompletionService.spec.d.ts +2 -0
  89. package/lib/services/CompletionService.spec.d.ts.map +1 -0
  90. package/lib/services/CompletionService.spec.js +1182 -0
  91. package/lib/services/CompletionService.spec.js.map +1 -0
  92. package/lib/services/ConfigSchemaValidator.d.ts +40 -0
  93. package/lib/services/ConfigSchemaValidator.d.ts.map +1 -0
  94. package/lib/services/ConfigSchemaValidator.js +139 -0
  95. package/lib/services/ConfigSchemaValidator.js.map +1 -0
  96. package/lib/services/ConfigSchemaValidator.spec.d.ts +2 -0
  97. package/lib/services/ConfigSchemaValidator.spec.d.ts.map +1 -0
  98. package/lib/services/ConfigSchemaValidator.spec.js +344 -0
  99. package/lib/services/ConfigSchemaValidator.spec.js.map +1 -0
  100. package/lib/services/ConflictClassDetection.spec.js +53 -5
  101. package/lib/services/ConflictClassDetection.spec.js.map +1 -1
  102. package/lib/services/DiagnosticService.d.ts +8 -8
  103. package/lib/services/DiagnosticService.d.ts.map +1 -1
  104. package/lib/services/DiagnosticService.js +29 -13
  105. package/lib/services/DiagnosticService.js.map +1 -1
  106. package/lib/services/DiagnosticService.spec.d.ts +2 -0
  107. package/lib/services/DiagnosticService.spec.d.ts.map +1 -0
  108. package/lib/services/DiagnosticService.spec.js +259 -0
  109. package/lib/services/DiagnosticService.spec.js.map +1 -0
  110. package/lib/services/DuplicateClassDetection.spec.js +20 -21
  111. package/lib/services/DuplicateClassDetection.spec.js.map +1 -1
  112. package/lib/services/FileDiagnosticCache.spec.d.ts +2 -0
  113. package/lib/services/FileDiagnosticCache.spec.d.ts.map +1 -0
  114. package/lib/services/FileDiagnosticCache.spec.js +213 -0
  115. package/lib/services/FileDiagnosticCache.spec.js.map +1 -0
  116. package/lib/services/PerformanceCache.spec.d.ts +2 -0
  117. package/lib/services/PerformanceCache.spec.d.ts.map +1 -0
  118. package/lib/services/PerformanceCache.spec.js +168 -0
  119. package/lib/services/PerformanceCache.spec.js.map +1 -0
  120. package/lib/services/PluginConfigService.d.ts +66 -15
  121. package/lib/services/PluginConfigService.d.ts.map +1 -1
  122. package/lib/services/PluginConfigService.js +230 -73
  123. package/lib/services/PluginConfigService.js.map +1 -1
  124. package/lib/services/PluginConfigService.spec.d.ts +2 -0
  125. package/lib/services/PluginConfigService.spec.d.ts.map +1 -0
  126. package/lib/services/PluginConfigService.spec.js +93 -0
  127. package/lib/services/PluginConfigService.spec.js.map +1 -0
  128. package/lib/services/ValidationService.d.ts +7 -5
  129. package/lib/services/ValidationService.d.ts.map +1 -1
  130. package/lib/services/ValidationService.js +40 -43
  131. package/lib/services/ValidationService.js.map +1 -1
  132. package/lib/services/ValidationService.spec.d.ts +2 -0
  133. package/lib/services/ValidationService.spec.d.ts.map +1 -0
  134. package/lib/services/ValidationService.spec.js +289 -0
  135. package/lib/services/ValidationService.spec.js.map +1 -0
  136. package/lib/utils/FrameworkDetector.d.ts +23 -0
  137. package/lib/utils/FrameworkDetector.d.ts.map +1 -0
  138. package/lib/utils/FrameworkDetector.js +47 -0
  139. package/lib/utils/FrameworkDetector.js.map +1 -0
  140. package/lib/utils/FrameworkDetector.spec.d.ts +2 -0
  141. package/lib/utils/FrameworkDetector.spec.d.ts.map +1 -0
  142. package/lib/utils/FrameworkDetector.spec.js +67 -0
  143. package/lib/utils/FrameworkDetector.spec.js.map +1 -0
  144. package/package.json +11 -4
  145. package/lib/extractors/StringLiteralExtractor.d.ts +0 -12
  146. package/lib/extractors/StringLiteralExtractor.d.ts.map +0 -1
  147. package/lib/extractors/StringLiteralExtractor.js +0 -21
  148. package/lib/extractors/StringLiteralExtractor.js.map +0 -1
  149. package/lib/services/ClassNameExtractionService.original.d.ts +0 -20
  150. package/lib/services/ClassNameExtractionService.original.d.ts.map +0 -1
  151. package/lib/services/ClassNameExtractionService.original.js +0 -48
  152. package/lib/services/ClassNameExtractionService.original.js.map +0 -1
@@ -1,102 +1,259 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.PluginConfigService = void 0;
4
+ const ConfigSchemaValidator_1 = require("./ConfigSchemaValidator");
4
5
  /**
5
- * Default utility functions to validate
6
+ * Default utilities configuration
7
+ * Key is function name, value is import source ("*" = any source, "off" = disabled)
6
8
  */
7
- const DEFAULT_UTILITY_FUNCTIONS = [
8
- 'clsx',
9
- 'cn',
10
- 'classnames',
11
- 'classNames',
12
- 'cx',
13
- 'cva',
14
- 'twMerge',
15
- 'tv'
16
- ];
9
+ const DEFAULT_UTILITIES = {
10
+ cn: '*', // Custom wrapper pattern (e.g., shadcn), any source
11
+ clsx: 'clsx',
12
+ classnames: 'classnames',
13
+ classNames: 'classnames',
14
+ cx: 'classnames',
15
+ twMerge: 'tailwind-merge'
16
+ };
17
+ /**
18
+ * Default variants configuration
19
+ */
20
+ const DEFAULT_VARIANTS = {
21
+ tailwindVariants: true,
22
+ classVarianceAuthority: true
23
+ };
24
+ /**
25
+ * Default validation configuration
26
+ */
27
+ const DEFAULT_VALIDATION = {
28
+ enabled: true,
29
+ severity: 'error',
30
+ allowedClasses: []
31
+ };
32
+ /**
33
+ * Default lint configuration
34
+ */
35
+ const DEFAULT_LINT = {
36
+ enabled: true,
37
+ conflictingClasses: {
38
+ enabled: true,
39
+ severity: 'warning'
40
+ },
41
+ repeatedClasses: {
42
+ enabled: true,
43
+ severity: 'warning'
44
+ }
45
+ };
46
+ /**
47
+ * Default class attributes
48
+ * These are the JSX/HTML attributes that will be treated as class attributes
49
+ */
50
+ const DEFAULT_CLASS_ATTRIBUTES = ['className', 'class', 'classList'];
17
51
  /**
18
52
  * Service responsible for managing plugin configuration
19
53
  * Follows Single Responsibility Principle
20
54
  */
21
55
  class PluginConfigService {
22
- constructor(config, logger) {
23
- this.logger = logger;
24
- this.loggingEnabled = config.enableLogging === true;
25
- this.utilityFunctions = this.initializeUtilityFunctions(config);
56
+ constructor(config) {
57
+ // Validate configuration schema first
58
+ this.schemaValidator = new ConfigSchemaValidator_1.ConfigSchemaValidator();
59
+ this.configValidationResult = this.schemaValidator.validate(config);
26
60
  this.cssFilePath = config.globalCss;
27
- this.allowedClasses = this.initializeAllowedClasses(config);
28
- // If ANY variant config is defined, only enable those explicitly set to true
29
- // If NO variant config is defined, enable both by default
30
- const variantsConfig = config.variants;
31
- const hasAnyVariantConfig = variantsConfig &&
32
- (variantsConfig.tailwindVariants !== undefined ||
33
- variantsConfig.classVarianceAuthority !== undefined);
34
- if (hasAnyVariantConfig) {
35
- // User specified at least one variant - only enable those explicitly set to true
36
- this.tailwindVariantsEnabled = variantsConfig.tailwindVariants === true;
37
- this.classVarianceAuthorityEnabled = variantsConfig.classVarianceAuthority === true;
38
- }
39
- else {
40
- // No variants configured - enable both by default
41
- this.tailwindVariantsEnabled = true;
42
- this.classVarianceAuthorityEnabled = true;
43
- }
44
- this.logExtractorConfig();
45
- }
46
- initializeUtilityFunctions(config) {
47
- if (config.utilityFunctions && Array.isArray(config.utilityFunctions)) {
48
- // Merge user-provided functions with defaults (remove duplicates)
49
- const merged = [...new Set([...DEFAULT_UTILITY_FUNCTIONS, ...config.utilityFunctions])];
50
- this.logger.log(`Using utility functions (defaults + custom): ${merged.join(', ')}`);
51
- return merged;
52
- }
53
- else {
54
- this.logger.log(`Using default utility functions: ${DEFAULT_UTILITY_FUNCTIONS.join(', ')}`);
55
- return DEFAULT_UTILITY_FUNCTIONS;
61
+ // Initialize configuration with backwards compatibility
62
+ this.utilitiesConfig = this.initializeUtilities(config);
63
+ this.variantsConfig = this.initializeVariants(config);
64
+ this.validationConfig = this.initializeValidation(config);
65
+ this.lintConfig = this.initializeLint(config);
66
+ this.editorConfig = this.initializeEditor(config);
67
+ this.classAttributes = this.initializeClassAttributes(config);
68
+ // Convert to legacy format for extractors
69
+ this.utilityFunctionsLegacy = this.convertToLegacyFormat(this.utilitiesConfig);
70
+ }
71
+ initializeUtilities(config) {
72
+ if (config.libraries?.utilities) {
73
+ // Merge with defaults (user config overrides defaults)
74
+ return { ...DEFAULT_UTILITIES, ...config.libraries.utilities };
56
75
  }
76
+ return { ...DEFAULT_UTILITIES };
57
77
  }
58
- initializeAllowedClasses(config) {
59
- if (config.allowedClasses && Array.isArray(config.allowedClasses)) {
60
- this.logger.log(`Custom allowed classes: ${config.allowedClasses.join(', ')}`);
61
- return config.allowedClasses;
78
+ initializeVariants(config) {
79
+ if (config.libraries?.variants) {
80
+ const userVariants = config.libraries.variants;
81
+ const hasAnyConfig = userVariants.tailwindVariants !== undefined ||
82
+ userVariants.classVarianceAuthority !== undefined;
83
+ if (hasAnyConfig) {
84
+ // User specified at least one - only enable those explicitly set to true
85
+ return {
86
+ tailwindVariants: userVariants.tailwindVariants === true,
87
+ classVarianceAuthority: userVariants.classVarianceAuthority === true
88
+ };
89
+ }
62
90
  }
63
- else {
64
- return [];
91
+ return { ...DEFAULT_VARIANTS };
92
+ }
93
+ initializeValidation(config) {
94
+ const validation = config.validation || {};
95
+ return {
96
+ enabled: validation.enabled !== false, // default true
97
+ severity: validation.severity || DEFAULT_VALIDATION.severity,
98
+ allowedClasses: validation.allowedClasses || []
99
+ };
100
+ }
101
+ initializeLint(config) {
102
+ const lint = config.lint || {};
103
+ return {
104
+ enabled: lint.enabled !== false, // default true
105
+ conflictingClasses: {
106
+ enabled: lint.conflictingClasses?.enabled !== false, // default true
107
+ severity: lint.conflictingClasses?.severity || DEFAULT_LINT.conflictingClasses.severity
108
+ },
109
+ repeatedClasses: {
110
+ enabled: lint.repeatedClasses?.enabled !== false, // default true
111
+ severity: lint.repeatedClasses?.severity || DEFAULT_LINT.repeatedClasses.severity
112
+ }
113
+ };
114
+ }
115
+ initializeEditor(config) {
116
+ const editor = config.editor || {};
117
+ return {
118
+ enabled: editor.enabled !== false, // default true
119
+ autocomplete: {
120
+ enabled: editor.autocomplete?.enabled !== false // default true
121
+ },
122
+ hover: {
123
+ enabled: editor.hover?.enabled !== false // default true
124
+ }
125
+ };
126
+ }
127
+ initializeClassAttributes(config) {
128
+ const userAttributes = config.classAttributes || [];
129
+ // Merge default attributes with user-provided ones
130
+ // Use Set to avoid duplicates
131
+ return [...new Set([...DEFAULT_CLASS_ATTRIBUTES, ...userAttributes])];
132
+ }
133
+ /**
134
+ * Convert new utilities config to legacy UtilityFunction[] format
135
+ * This is needed for backwards compatibility with extractors
136
+ */
137
+ convertToLegacyFormat(utilities) {
138
+ const result = [];
139
+ for (const [name, source] of Object.entries(utilities)) {
140
+ if (source === 'off') {
141
+ continue; // Skip disabled utilities
142
+ }
143
+ if (source === '*') {
144
+ result.push(name); // Simple string = any source
145
+ }
146
+ else {
147
+ result.push({ name, from: source });
148
+ }
65
149
  }
150
+ return result;
66
151
  }
152
+ // ---- Getters for utilities ----
153
+ getUtilitiesConfig() {
154
+ return this.utilitiesConfig;
155
+ }
156
+ /**
157
+ * Get utility functions in legacy format (for extractors)
158
+ */
67
159
  getUtilityFunctions() {
68
- return this.utilityFunctions;
160
+ return this.utilityFunctionsLegacy;
161
+ }
162
+ // ---- Getters for variants ----
163
+ getVariantsConfig() {
164
+ return this.variantsConfig;
165
+ }
166
+ isTailwindVariantsEnabled() {
167
+ return this.variantsConfig.tailwindVariants === true;
168
+ }
169
+ isClassVarianceAuthorityEnabled() {
170
+ return this.variantsConfig.classVarianceAuthority === true;
171
+ }
172
+ // ---- Getters for validation ----
173
+ getValidationConfig() {
174
+ return this.validationConfig;
175
+ }
176
+ isValidationEnabled() {
177
+ return this.validationConfig.enabled;
178
+ }
179
+ getValidationSeverity() {
180
+ return this.validationConfig.severity;
181
+ }
182
+ getAllowedClasses() {
183
+ return this.validationConfig.allowedClasses;
184
+ }
185
+ // ---- Getters for lint ----
186
+ getLintConfig() {
187
+ return this.lintConfig;
188
+ }
189
+ isLintEnabled() {
190
+ return this.lintConfig.enabled !== false;
191
+ }
192
+ isConflictingClassesEnabled() {
193
+ return this.isLintEnabled() && this.lintConfig.conflictingClasses?.enabled !== false;
194
+ }
195
+ getConflictingClassesSeverity() {
196
+ return this.lintConfig.conflictingClasses?.severity || 'warning';
197
+ }
198
+ isRepeatedClassesEnabled() {
199
+ return this.isLintEnabled() && this.lintConfig.repeatedClasses?.enabled !== false;
200
+ }
201
+ getRepeatedClassesSeverity() {
202
+ return this.lintConfig.repeatedClasses?.severity || 'warning';
69
203
  }
204
+ // ---- Getters for editor ----
205
+ getEditorConfig() {
206
+ return this.editorConfig;
207
+ }
208
+ isEditorEnabled() {
209
+ return this.editorConfig.enabled !== false;
210
+ }
211
+ isAutocompleteEnabled() {
212
+ return this.isEditorEnabled() && this.editorConfig.autocomplete?.enabled !== false;
213
+ }
214
+ isHoverEnabled() {
215
+ return this.isEditorEnabled() && this.editorConfig.hover?.enabled !== false;
216
+ }
217
+ // ---- Getters for global settings ----
70
218
  getCssFilePath() {
71
219
  return this.cssFilePath;
72
220
  }
73
221
  hasValidCssPath() {
74
222
  return this.cssFilePath !== undefined && this.cssFilePath.length > 0;
75
223
  }
76
- isTailwindVariantsEnabled() {
77
- return this.tailwindVariantsEnabled;
224
+ // ---- Getters for class attributes ----
225
+ /**
226
+ * Get the configured class attributes
227
+ * Returns an array of attribute names that should be treated as class attributes
228
+ * Includes default attributes (className, class, classList) plus user-configured ones
229
+ */
230
+ getClassAttributes() {
231
+ return this.classAttributes;
78
232
  }
79
- isClassVarianceAuthorityEnabled() {
80
- return this.classVarianceAuthorityEnabled;
233
+ // ---- Configuration validation ----
234
+ /**
235
+ * Check if the configuration is valid according to the schema
236
+ */
237
+ isConfigValid() {
238
+ return this.configValidationResult.valid;
81
239
  }
82
- getAllowedClasses() {
83
- return this.allowedClasses;
84
- }
85
- isLoggingEnabled() {
86
- return this.loggingEnabled;
87
- }
88
- logExtractorConfig() {
89
- const enabled = [];
90
- if (this.tailwindVariantsEnabled)
91
- enabled.push('tailwind-variants');
92
- if (this.classVarianceAuthorityEnabled)
93
- enabled.push('class-variance-authority');
94
- if (enabled.length === 0) {
95
- this.logger.log('⚠️ No variant library extractors enabled');
96
- }
97
- else {
98
- this.logger.log(`✓ Enabled variant extractors: ${enabled.join(', ')}`);
99
- }
240
+ /**
241
+ * Get configuration validation errors
242
+ */
243
+ getConfigValidationErrors() {
244
+ return this.configValidationResult.errors;
245
+ }
246
+ /**
247
+ * Get formatted validation error messages
248
+ */
249
+ getFormattedConfigErrors() {
250
+ return this.schemaValidator.formatErrors(this.configValidationResult.errors);
251
+ }
252
+ /**
253
+ * Get a summary of all validation errors for logging
254
+ */
255
+ getConfigErrorSummary() {
256
+ return this.schemaValidator.getErrorSummary(this.configValidationResult.errors);
100
257
  }
101
258
  }
102
259
  exports.PluginConfigService = PluginConfigService;
@@ -1 +1 @@
1
- {"version":3,"file":"PluginConfigService.js","sourceRoot":"","sources":["../../src/services/PluginConfigService.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"PluginConfigService.js","sourceRoot":"","sources":["../../src/services/PluginConfigService.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=PluginConfigService.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PluginConfigService.spec.d.ts","sourceRoot":"","sources":["../../src/services/PluginConfigService.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,93 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ const PluginConfigService_1 = require("./PluginConfigService");
4
+ describe('PluginConfigService', () => {
5
+ describe('classAttributes', () => {
6
+ it('should return default class attributes when not configured', () => {
7
+ const service = new PluginConfigService_1.PluginConfigService({});
8
+ const classAttributes = service.getClassAttributes();
9
+ expect(classAttributes).toContain('className');
10
+ expect(classAttributes).toContain('class');
11
+ expect(classAttributes).toContain('classList');
12
+ expect(classAttributes).toHaveLength(3);
13
+ });
14
+ it('should merge user attributes with defaults', () => {
15
+ const service = new PluginConfigService_1.PluginConfigService({
16
+ classAttributes: ['colorStyles', 'textStyles']
17
+ });
18
+ const classAttributes = service.getClassAttributes();
19
+ expect(classAttributes).toContain('className');
20
+ expect(classAttributes).toContain('class');
21
+ expect(classAttributes).toContain('classList');
22
+ expect(classAttributes).toContain('colorStyles');
23
+ expect(classAttributes).toContain('textStyles');
24
+ expect(classAttributes).toHaveLength(5);
25
+ });
26
+ it('should deduplicate attributes when user provides defaults', () => {
27
+ const service = new PluginConfigService_1.PluginConfigService({
28
+ classAttributes: ['className', 'colorStyles', 'class']
29
+ });
30
+ const classAttributes = service.getClassAttributes();
31
+ // Should not have duplicates
32
+ const uniqueAttributes = [...new Set(classAttributes)];
33
+ expect(classAttributes).toHaveLength(uniqueAttributes.length);
34
+ // Should contain all expected attributes
35
+ expect(classAttributes).toContain('className');
36
+ expect(classAttributes).toContain('class');
37
+ expect(classAttributes).toContain('classList');
38
+ expect(classAttributes).toContain('colorStyles');
39
+ });
40
+ it('should handle empty user attributes array', () => {
41
+ const service = new PluginConfigService_1.PluginConfigService({
42
+ classAttributes: []
43
+ });
44
+ const classAttributes = service.getClassAttributes();
45
+ expect(classAttributes).toContain('className');
46
+ expect(classAttributes).toContain('class');
47
+ expect(classAttributes).toContain('classList');
48
+ expect(classAttributes).toHaveLength(3);
49
+ });
50
+ it('should preserve order with defaults first', () => {
51
+ const service = new PluginConfigService_1.PluginConfigService({
52
+ classAttributes: ['colorStyles']
53
+ });
54
+ const classAttributes = service.getClassAttributes();
55
+ // Default attributes should come first
56
+ expect(classAttributes[0]).toBe('className');
57
+ expect(classAttributes[1]).toBe('class');
58
+ expect(classAttributes[2]).toBe('classList');
59
+ expect(classAttributes[3]).toBe('colorStyles');
60
+ });
61
+ });
62
+ describe('other configurations', () => {
63
+ it('should initialize with default utilities', () => {
64
+ const service = new PluginConfigService_1.PluginConfigService({});
65
+ const utilities = service.getUtilityFunctions();
66
+ expect(utilities).toContainEqual('cn');
67
+ expect(utilities).toContainEqual({ name: 'clsx', from: 'clsx' });
68
+ });
69
+ it('should enable variants by default', () => {
70
+ const service = new PluginConfigService_1.PluginConfigService({});
71
+ expect(service.isTailwindVariantsEnabled()).toBe(true);
72
+ expect(service.isClassVarianceAuthorityEnabled()).toBe(true);
73
+ });
74
+ it('should enable validation by default', () => {
75
+ const service = new PluginConfigService_1.PluginConfigService({});
76
+ expect(service.isValidationEnabled()).toBe(true);
77
+ expect(service.getValidationSeverity()).toBe('error');
78
+ });
79
+ it('should enable lint by default', () => {
80
+ const service = new PluginConfigService_1.PluginConfigService({});
81
+ expect(service.isLintEnabled()).toBe(true);
82
+ expect(service.isConflictingClassesEnabled()).toBe(true);
83
+ expect(service.isRepeatedClassesEnabled()).toBe(true);
84
+ });
85
+ it('should enable editor features by default', () => {
86
+ const service = new PluginConfigService_1.PluginConfigService({});
87
+ expect(service.isEditorEnabled()).toBe(true);
88
+ expect(service.isAutocompleteEnabled()).toBe(true);
89
+ expect(service.isHoverEnabled()).toBe(true);
90
+ });
91
+ });
92
+ });
93
+ //# sourceMappingURL=PluginConfigService.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PluginConfigService.spec.js","sourceRoot":"","sources":["../../src/services/PluginConfigService.spec.ts"],"names":[],"mappings":"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"}
@@ -1,9 +1,10 @@
1
1
  import * as ts from 'typescript/lib/tsserverlibrary';
2
2
  import { IClassNameValidator } from '../core/interfaces';
3
+ import { UtilityFunction } from '../core/types';
3
4
  import { ICssProvider } from '../infrastructure/TailwindConflictDetector';
4
- import { Logger } from '../utils/Logger';
5
5
  import { ClassNameExtractionService } from './ClassNameExtractionService';
6
6
  import { DiagnosticService } from './DiagnosticService';
7
+ import { PluginConfigService } from './PluginConfigService';
7
8
  /**
8
9
  * Service responsible for validating class names and creating diagnostics
9
10
  * Orchestrates the validation workflow
@@ -12,21 +13,22 @@ export declare class ValidationService {
12
13
  private readonly extractionService;
13
14
  private readonly diagnosticService;
14
15
  private readonly validator;
15
- private readonly logger;
16
+ private readonly configService;
16
17
  private readonly conflictDetector;
17
- constructor(extractionService: ClassNameExtractionService, diagnosticService: DiagnosticService, validator: IClassNameValidator, logger: Logger, cssProvider?: ICssProvider);
18
+ constructor(extractionService: ClassNameExtractionService, diagnosticService: DiagnosticService, validator: IClassNameValidator, configService: PluginConfigService, cssProvider?: ICssProvider);
18
19
  /**
19
20
  * Validate a source file and return diagnostics
20
21
  * PERFORMANCE OPTIMIZED: Minimal logging overhead
21
22
  */
22
- validateFile(typescript: typeof ts, sourceFile: ts.SourceFile, utilityFunctions: string[], typeChecker?: ts.TypeChecker): ts.Diagnostic[];
23
+ validateFile(typescript: typeof ts, sourceFile: ts.SourceFile, utilityFunctions: UtilityFunction[], typeChecker?: ts.TypeChecker): ts.Diagnostic[];
23
24
  /**
24
25
  * Filter out valid classes and return only invalid ones
25
26
  * PERFORMANCE OPTIMIZED: No logging in hot path
26
27
  */
27
28
  private filterInvalidClasses;
28
29
  /**
29
- * Result of duplicate detection with separate categories
30
+ * Find duplicate and extractable classes within the same attribute
31
+ * Returns true duplicates and extractable classes (same class in both ternary branches)
30
32
  */
31
33
  private findDuplicateClasses;
32
34
  }
@@ -1 +1 @@
1
- {"version":3,"file":"ValidationService.d.ts","sourceRoot":"","sources":["../../src/services/ValidationService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,gCAAgC,CAAC;AAErD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAEzD,OAAO,EAAE,YAAY,EAA4B,MAAM,4CAA4C,CAAC;AACpG,OAAO,EAAE,MAAM,EAAE,MAAM,iBAAiB,CAAC;AACzC,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD;;;GAGG;AACH,qBAAa,iBAAiB;IAI5B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,MAAM;IANxB,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA2B;gBAG1C,iBAAiB,EAAE,0BAA0B,EAC7C,iBAAiB,EAAE,iBAAiB,EACpC,SAAS,EAAE,mBAAmB,EAC9B,MAAM,EAAE,MAAM,EAC/B,WAAW,CAAC,EAAE,YAAY;IAQ3B;;;OAGG;IACH,YAAY,CACX,UAAU,EAAE,OAAO,EAAE,EACrB,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,gBAAgB,EAAE,MAAM,EAAE,EAC1B,WAAW,CAAC,EAAE,EAAE,CAAC,WAAW,GAC1B,EAAE,CAAC,UAAU,EAAE;IA4ElB;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAM5B;;OAEG;IACH,OAAO,CAAC,oBAAoB;CAiG5B"}
1
+ {"version":3,"file":"ValidationService.d.ts","sourceRoot":"","sources":["../../src/services/ValidationService.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,gCAAgC,CAAC;AAErD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAiB,eAAe,EAAE,MAAM,eAAe,CAAC;AAC/D,OAAO,EAAE,YAAY,EAA4B,MAAM,4CAA4C,CAAC;AACpG,OAAO,EAAE,0BAA0B,EAAE,MAAM,8BAA8B,CAAC;AAC1E,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AACxD,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAE5D;;;GAGG;AACH,qBAAa,iBAAiB;IAI5B,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,iBAAiB;IAClC,OAAO,CAAC,QAAQ,CAAC,SAAS;IAC1B,OAAO,CAAC,QAAQ,CAAC,aAAa;IAN/B,OAAO,CAAC,QAAQ,CAAC,gBAAgB,CAA2B;gBAG1C,iBAAiB,EAAE,0BAA0B,EAC7C,iBAAiB,EAAE,iBAAiB,EACpC,SAAS,EAAE,mBAAmB,EAC9B,aAAa,EAAE,mBAAmB,EACnD,WAAW,CAAC,EAAE,YAAY;IAQ3B;;;OAGG;IACH,YAAY,CACX,UAAU,EAAE,OAAO,EAAE,EACrB,UAAU,EAAE,EAAE,CAAC,UAAU,EACzB,gBAAgB,EAAE,eAAe,EAAE,EACnC,WAAW,CAAC,EAAE,EAAE,CAAC,WAAW,GAC1B,EAAE,CAAC,UAAU,EAAE;IA6ElB;;;OAGG;IACH,OAAO,CAAC,oBAAoB;IAI5B;;;OAGG;IACH,OAAO,CAAC,oBAAoB;CAiG5B"}
@@ -7,11 +7,11 @@ const TailwindConflictDetector_1 = require("../infrastructure/TailwindConflictDe
7
7
  * Orchestrates the validation workflow
8
8
  */
9
9
  class ValidationService {
10
- constructor(extractionService, diagnosticService, validator, logger, cssProvider) {
10
+ constructor(extractionService, diagnosticService, validator, configService, cssProvider) {
11
11
  this.extractionService = extractionService;
12
12
  this.diagnosticService = diagnosticService;
13
13
  this.validator = validator;
14
- this.logger = logger;
14
+ this.configService = configService;
15
15
  this.conflictDetector = new TailwindConflictDetector_1.TailwindConflictDetector();
16
16
  if (cssProvider) {
17
17
  this.conflictDetector.setCssProvider(cssProvider);
@@ -23,50 +23,48 @@ class ValidationService {
23
23
  */
24
24
  validateFile(typescript, sourceFile, utilityFunctions, typeChecker) {
25
25
  if (!this.validator.isInitialized()) {
26
- this.logger.log(`[ValidationService] Validator not initialized yet for ${sourceFile.fileName}`);
27
26
  return [];
28
27
  }
29
- // PERFORMANCE: Only log if enabled
30
- if (this.logger.isEnabled()) {
31
- this.logger.log(`[ValidationService] Processing file: ${sourceFile.fileName}`);
32
- }
33
28
  // Extract all class names from the file
34
- const classNames = this.extractionService.extractFromSourceFile(typescript, sourceFile, utilityFunctions, typeChecker);
35
- // PERFORMANCE: Only log if enabled
36
- if (this.logger.isEnabled()) {
37
- this.logger.log(`[ValidationService] Found ${classNames.length} class names to validate`);
29
+ const classNames = this.extractionService.extractFromSourceFile(typescript, sourceFile, utilityFunctions, typeChecker, this.configService.getClassAttributes());
30
+ const diagnostics = [];
31
+ // Validation diagnostics (invalid class detection)
32
+ if (this.configService.isValidationEnabled()) {
33
+ const severity = this.configService.getValidationSeverity();
34
+ if (severity !== 'off') {
35
+ const invalidClasses = this.filterInvalidClasses(classNames);
36
+ if (invalidClasses.length > 0) {
37
+ diagnostics.push(...this.diagnosticService.createDiagnostics(invalidClasses, sourceFile, severity));
38
+ }
39
+ }
38
40
  }
39
- // Filter invalid class names
40
- const invalidClasses = this.filterInvalidClasses(classNames);
41
- // Detect duplicate classes (only for valid classes, to avoid double-reporting)
42
- const { trueDuplicates, extractableClasses } = this.findDuplicateClasses(classNames);
43
- // Detect conflicting classes (only for valid, non-duplicate classes)
44
- const conflicts = this.conflictDetector.findConflicts(classNames);
45
- // PERFORMANCE: Only log if enabled
46
- if (this.logger.isEnabled()) {
47
- const totalIssues = invalidClasses.length +
48
- trueDuplicates.length +
49
- extractableClasses.length +
50
- conflicts.length;
51
- if (totalIssues > 0) {
52
- this.logger.log(`[ValidationService] Returning ${invalidClasses.length} invalid + ${trueDuplicates.length} duplicate + ${extractableClasses.length} extractable + ${conflicts.length} conflict diagnostics`);
41
+ // Lint diagnostics (only if lint is enabled globally)
42
+ if (this.configService.isLintEnabled()) {
43
+ // Detect duplicate and extractable classes
44
+ const { trueDuplicates, extractableClasses } = this.findDuplicateClasses(classNames);
45
+ // Repeated classes
46
+ if (this.configService.isRepeatedClassesEnabled()) {
47
+ const severity = this.configService.getRepeatedClassesSeverity();
48
+ if (severity !== 'off') {
49
+ if (trueDuplicates.length > 0) {
50
+ diagnostics.push(...this.diagnosticService.createDuplicateDiagnostics(trueDuplicates, sourceFile, severity));
51
+ }
52
+ }
53
53
  }
54
- else {
55
- this.logger.log(`[ValidationService] No issues found`);
54
+ // Extractable classes (always enabled when lint is enabled, no config option)
55
+ if (extractableClasses.length > 0) {
56
+ diagnostics.push(...this.diagnosticService.createExtractableClassDiagnostics(extractableClasses, sourceFile));
57
+ }
58
+ // Conflicting classes
59
+ if (this.configService.isConflictingClassesEnabled()) {
60
+ const severity = this.configService.getConflictingClassesSeverity();
61
+ if (severity !== 'off') {
62
+ const conflicts = this.conflictDetector.findConflicts(classNames);
63
+ if (conflicts.length > 0) {
64
+ diagnostics.push(...this.diagnosticService.createConflictDiagnostics(conflicts, sourceFile, severity));
65
+ }
66
+ }
56
67
  }
57
- }
58
- const diagnostics = [];
59
- if (invalidClasses.length > 0) {
60
- diagnostics.push(...this.diagnosticService.createDiagnostics(invalidClasses, sourceFile));
61
- }
62
- if (trueDuplicates.length > 0) {
63
- diagnostics.push(...this.diagnosticService.createDuplicateDiagnostics(trueDuplicates, sourceFile));
64
- }
65
- if (extractableClasses.length > 0) {
66
- diagnostics.push(...this.diagnosticService.createExtractableClassDiagnostics(extractableClasses, sourceFile));
67
- }
68
- if (conflicts.length > 0) {
69
- diagnostics.push(...this.diagnosticService.createConflictDiagnostics(conflicts, sourceFile));
70
68
  }
71
69
  return diagnostics;
72
70
  }
@@ -75,12 +73,11 @@ class ValidationService {
75
73
  * PERFORMANCE OPTIMIZED: No logging in hot path
76
74
  */
77
75
  filterInvalidClasses(classNames) {
78
- // PERFORMANCE: Skip logging each class validation (hot path)
79
- // This method is called for every class in every file
80
76
  return classNames.filter(classInfo => !this.validator.isValidClass(classInfo.className));
81
77
  }
82
78
  /**
83
- * Result of duplicate detection with separate categories
79
+ * Find duplicate and extractable classes within the same attribute
80
+ * Returns true duplicates and extractable classes (same class in both ternary branches)
84
81
  */
85
82
  findDuplicateClasses(classNames) {
86
83
  const trueDuplicates = [];