tailwind-typescript-plugin 0.0.2-beta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (88) hide show
  1. package/CHANGELOG.md +42 -0
  2. package/LICENSE +21 -0
  3. package/README.md +538 -0
  4. package/lib/core/interfaces.d.ts +45 -0
  5. package/lib/core/interfaces.d.ts.map +1 -0
  6. package/lib/core/interfaces.js +3 -0
  7. package/lib/core/interfaces.js.map +1 -0
  8. package/lib/core/types.d.ts +27 -0
  9. package/lib/core/types.d.ts.map +1 -0
  10. package/lib/core/types.js +3 -0
  11. package/lib/core/types.js.map +1 -0
  12. package/lib/extractors/BaseExtractor.d.ts +20 -0
  13. package/lib/extractors/BaseExtractor.d.ts.map +1 -0
  14. package/lib/extractors/BaseExtractor.js +83 -0
  15. package/lib/extractors/BaseExtractor.js.map +1 -0
  16. package/lib/extractors/CvaExtractor.d.ts +88 -0
  17. package/lib/extractors/CvaExtractor.d.ts.map +1 -0
  18. package/lib/extractors/CvaExtractor.js +425 -0
  19. package/lib/extractors/CvaExtractor.js.map +1 -0
  20. package/lib/extractors/ExpressionExtractor.d.ts +16 -0
  21. package/lib/extractors/ExpressionExtractor.d.ts.map +1 -0
  22. package/lib/extractors/ExpressionExtractor.js +132 -0
  23. package/lib/extractors/ExpressionExtractor.js.map +1 -0
  24. package/lib/extractors/JsxAttributeExtractor.d.ts +20 -0
  25. package/lib/extractors/JsxAttributeExtractor.d.ts.map +1 -0
  26. package/lib/extractors/JsxAttributeExtractor.js +107 -0
  27. package/lib/extractors/JsxAttributeExtractor.js.map +1 -0
  28. package/lib/extractors/JsxAttributeExtractor.original.d.ts +15 -0
  29. package/lib/extractors/JsxAttributeExtractor.original.d.ts.map +1 -0
  30. package/lib/extractors/JsxAttributeExtractor.original.js +84 -0
  31. package/lib/extractors/JsxAttributeExtractor.original.js.map +1 -0
  32. package/lib/extractors/StringLiteralExtractor.d.ts +12 -0
  33. package/lib/extractors/StringLiteralExtractor.d.ts.map +1 -0
  34. package/lib/extractors/StringLiteralExtractor.js +21 -0
  35. package/lib/extractors/StringLiteralExtractor.js.map +1 -0
  36. package/lib/extractors/TailwindVariantsExtractor.d.ts +87 -0
  37. package/lib/extractors/TailwindVariantsExtractor.d.ts.map +1 -0
  38. package/lib/extractors/TailwindVariantsExtractor.js +447 -0
  39. package/lib/extractors/TailwindVariantsExtractor.js.map +1 -0
  40. package/lib/extractors/TemplateExpressionExtractor.d.ts +14 -0
  41. package/lib/extractors/TemplateExpressionExtractor.d.ts.map +1 -0
  42. package/lib/extractors/TemplateExpressionExtractor.js +66 -0
  43. package/lib/extractors/TemplateExpressionExtractor.js.map +1 -0
  44. package/lib/index.d.ts +65 -0
  45. package/lib/index.d.ts.map +1 -0
  46. package/lib/index.js +4 -0
  47. package/lib/index.js.map +1 -0
  48. package/lib/infrastructure/TailwindValidator.d.ts +42 -0
  49. package/lib/infrastructure/TailwindValidator.d.ts.map +1 -0
  50. package/lib/infrastructure/TailwindValidator.js +152 -0
  51. package/lib/infrastructure/TailwindValidator.js.map +1 -0
  52. package/lib/infrastructure/TailwindValidator.spec.d.ts +2 -0
  53. package/lib/infrastructure/TailwindValidator.spec.d.ts.map +1 -0
  54. package/lib/infrastructure/TailwindValidator.spec.js +219 -0
  55. package/lib/infrastructure/TailwindValidator.spec.js.map +1 -0
  56. package/lib/plugin/TailwindTypescriptPlugin.d.ts +52 -0
  57. package/lib/plugin/TailwindTypescriptPlugin.d.ts.map +1 -0
  58. package/lib/plugin/TailwindTypescriptPlugin.js +142 -0
  59. package/lib/plugin/TailwindTypescriptPlugin.js.map +1 -0
  60. package/lib/services/ClassNameExtractionService.d.ts +37 -0
  61. package/lib/services/ClassNameExtractionService.d.ts.map +1 -0
  62. package/lib/services/ClassNameExtractionService.js +98 -0
  63. package/lib/services/ClassNameExtractionService.js.map +1 -0
  64. package/lib/services/ClassNameExtractionService.original.d.ts +20 -0
  65. package/lib/services/ClassNameExtractionService.original.d.ts.map +1 -0
  66. package/lib/services/ClassNameExtractionService.original.js +48 -0
  67. package/lib/services/ClassNameExtractionService.original.js.map +1 -0
  68. package/lib/services/DiagnosticService.d.ts +14 -0
  69. package/lib/services/DiagnosticService.d.ts.map +1 -0
  70. package/lib/services/DiagnosticService.js +61 -0
  71. package/lib/services/DiagnosticService.js.map +1 -0
  72. package/lib/services/PerformanceCache.d.ts +15 -0
  73. package/lib/services/PerformanceCache.d.ts.map +1 -0
  74. package/lib/services/PerformanceCache.js +44 -0
  75. package/lib/services/PerformanceCache.js.map +1 -0
  76. package/lib/services/PluginConfigService.d.ts +22 -0
  77. package/lib/services/PluginConfigService.d.ts.map +1 -0
  78. package/lib/services/PluginConfigService.js +86 -0
  79. package/lib/services/PluginConfigService.js.map +1 -0
  80. package/lib/services/ValidationService.d.ts +25 -0
  81. package/lib/services/ValidationService.d.ts.map +1 -0
  82. package/lib/services/ValidationService.js +50 -0
  83. package/lib/services/ValidationService.js.map +1 -0
  84. package/lib/utils/Logger.d.ts +10 -0
  85. package/lib/utils/Logger.d.ts.map +1 -0
  86. package/lib/utils/Logger.js +13 -0
  87. package/lib/utils/Logger.js.map +1 -0
  88. package/package.json +84 -0
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/core/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,20 @@
1
+ import * as ts from 'typescript/lib/tsserverlibrary';
2
+ import { IClassNameExtractor } from '../core/interfaces';
3
+ import { ClassNameInfo, ExtractionContext } from '../core/types';
4
+ /**
5
+ * Abstract base class for all extractors
6
+ * Provides common functionality and enforces the contract
7
+ */
8
+ export declare abstract class BaseExtractor implements IClassNameExtractor {
9
+ abstract canHandle(node: ts.Node, context: ExtractionContext): boolean;
10
+ abstract extract(node: ts.Node, context: ExtractionContext): ClassNameInfo[];
11
+ /**
12
+ * Helper method to create ClassNameInfo from a string literal
13
+ */
14
+ protected extractFromStringLiteral(literal: ts.StringLiteral | ts.NoSubstitutionTemplateLiteral, context: ExtractionContext): ClassNameInfo[];
15
+ /**
16
+ * Helper method to check if a function call should be validated
17
+ */
18
+ protected shouldValidateFunctionCall(callExpression: ts.CallExpression, utilityFunctions: string[]): boolean;
19
+ }
20
+ //# sourceMappingURL=BaseExtractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseExtractor.d.ts","sourceRoot":"","sources":["../../src/extractors/BaseExtractor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,gCAAgC,CAAC;AAErD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEjE;;;GAGG;AACH,8BAAsB,aAAc,YAAW,mBAAmB;IACjE,QAAQ,CAAC,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO;IACtE,QAAQ,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,iBAAiB,GAAG,aAAa,EAAE;IAE5E;;OAEG;IACH,SAAS,CAAC,wBAAwB,CACjC,OAAO,EAAE,EAAE,CAAC,aAAa,GAAG,EAAE,CAAC,6BAA6B,EAC5D,OAAO,EAAE,iBAAiB,GACxB,aAAa,EAAE;IAsBlB;;OAEG;IACH,SAAS,CAAC,0BAA0B,CACnC,cAAc,EAAE,EAAE,CAAC,cAAc,EACjC,gBAAgB,EAAE,MAAM,EAAE,GACxB,OAAO;CAgBV"}
@@ -0,0 +1,83 @@
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
+ exports.BaseExtractor = void 0;
37
+ const ts = __importStar(require("typescript/lib/tsserverlibrary"));
38
+ /**
39
+ * Abstract base class for all extractors
40
+ * Provides common functionality and enforces the contract
41
+ */
42
+ class BaseExtractor {
43
+ /**
44
+ * Helper method to create ClassNameInfo from a string literal
45
+ */
46
+ extractFromStringLiteral(literal, context) {
47
+ const classNames = [];
48
+ const fullText = literal.text;
49
+ const stringContentStart = literal.getStart() + 1;
50
+ let offset = 0;
51
+ fullText.split(' ').forEach(className => {
52
+ if (className) {
53
+ classNames.push({
54
+ className: className,
55
+ absoluteStart: stringContentStart + offset,
56
+ length: className.length,
57
+ line: context.sourceFile.getLineAndCharacterOfPosition(literal.getStart()).line + 1,
58
+ file: context.sourceFile.fileName
59
+ });
60
+ }
61
+ offset += className.length + 1;
62
+ });
63
+ return classNames;
64
+ }
65
+ /**
66
+ * Helper method to check if a function call should be validated
67
+ */
68
+ shouldValidateFunctionCall(callExpression, utilityFunctions) {
69
+ const expr = callExpression.expression;
70
+ // Handle simple function calls: clsx('flex')
71
+ if (ts.isIdentifier(expr)) {
72
+ return utilityFunctions.includes(expr.text);
73
+ }
74
+ // Handle member expressions: utils.cn('flex'), lib.clsx('flex')
75
+ if (ts.isPropertyAccessExpression(expr)) {
76
+ return utilityFunctions.includes(expr.name.text);
77
+ }
78
+ // Ignore element access expressions and other types
79
+ return false;
80
+ }
81
+ }
82
+ exports.BaseExtractor = BaseExtractor;
83
+ //# sourceMappingURL=BaseExtractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BaseExtractor.js","sourceRoot":"","sources":["../../src/extractors/BaseExtractor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mEAAqD;AAKrD;;;GAGG;AACH,MAAsB,aAAa;IAIlC;;OAEG;IACO,wBAAwB,CACjC,OAA4D,EAC5D,OAA0B;QAE1B,MAAM,UAAU,GAAoB,EAAE,CAAC;QACvC,MAAM,QAAQ,GAAG,OAAO,CAAC,IAAI,CAAC;QAC9B,MAAM,kBAAkB,GAAG,OAAO,CAAC,QAAQ,EAAE,GAAG,CAAC,CAAC;QAClD,IAAI,MAAM,GAAG,CAAC,CAAC;QAEf,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EAAE;YACvC,IAAI,SAAS,EAAE,CAAC;gBACf,UAAU,CAAC,IAAI,CAAC;oBACf,SAAS,EAAE,SAAS;oBACpB,aAAa,EAAE,kBAAkB,GAAG,MAAM;oBAC1C,MAAM,EAAE,SAAS,CAAC,MAAM;oBACxB,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,6BAA6B,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,GAAG,CAAC;oBACnF,IAAI,EAAE,OAAO,CAAC,UAAU,CAAC,QAAQ;iBACjC,CAAC,CAAC;YACJ,CAAC;YACD,MAAM,IAAI,SAAS,CAAC,MAAM,GAAG,CAAC,CAAC;QAChC,CAAC,CAAC,CAAC;QAEH,OAAO,UAAU,CAAC;IACnB,CAAC;IAED;;OAEG;IACO,0BAA0B,CACnC,cAAiC,EACjC,gBAA0B;QAE1B,MAAM,IAAI,GAAG,cAAc,CAAC,UAAU,CAAC;QAEvC,6CAA6C;QAC7C,IAAI,EAAE,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,CAAC;YAC3B,OAAO,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC7C,CAAC;QAED,gEAAgE;QAChE,IAAI,EAAE,CAAC,0BAA0B,CAAC,IAAI,CAAC,EAAE,CAAC;YACzC,OAAO,gBAAgB,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAClD,CAAC;QAED,oDAAoD;QACpD,OAAO,KAAK,CAAC;IACd,CAAC;CACD;AAtDD,sCAsDC"}
@@ -0,0 +1,88 @@
1
+ import * as ts from 'typescript/lib/tsserverlibrary';
2
+ import { ClassNameInfo, ExtractionContext } from '../core/types';
3
+ import { BaseExtractor } from './BaseExtractor';
4
+ /**
5
+ * Extracts class names from class-variance-authority cva() function calls
6
+ *
7
+ * Supports:
8
+ * - base: array of strings or single string (first argument)
9
+ * - variants: nested object with string/array values containing classes
10
+ * - compoundVariants: array of objects with class/className properties
11
+ * - boolean variants: { disabled: { true: [...], false: null } }
12
+ * - Import aliasing: import { cva as myCva } from 'class-variance-authority'
13
+ * - class property overrides: button({ intent: 'primary', class: 'extra-class' })
14
+ *
15
+ * PERFORMANCE OPTIMIZATIONS:
16
+ * - ✅ Import detection cached per file (one-time AST scan)
17
+ * - ✅ Early exits for non-cva calls (fast path)
18
+ * - ✅ Direct property access (no unnecessary traversal)
19
+ * - ✅ Inline hot paths (string literal extraction)
20
+ * - ✅ Short-circuit evaluation (skip work when possible)
21
+ * - ✅ TypeChecker-based origin tracking (cached per symbol)
22
+ */
23
+ export declare class CvaExtractor extends BaseExtractor {
24
+ private cvaImportCache;
25
+ private cvaVariableCache;
26
+ canHandle(node: ts.Node, context: ExtractionContext): boolean;
27
+ extract(node: ts.Node, context: ExtractionContext): ClassNameInfo[];
28
+ /**
29
+ * Check if this call expression is a cva() call from class-variance-authority
30
+ * Supports import aliasing: import { cva as myCva } from 'class-variance-authority'
31
+ */
32
+ private isCvaCall;
33
+ /**
34
+ * Get all local names for cva imports from class-variance-authority
35
+ * Supports aliasing: import { cva as myCva } -> returns Set(['myCva'])
36
+ * Caches result per file for performance
37
+ */
38
+ private getCvaImportNames;
39
+ /**
40
+ * Extract class names from cva() definition
41
+ * cva(['base', 'classes'], { variants: {...}, compoundVariants: [...] })
42
+ */
43
+ private extractFromCvaDefinition;
44
+ /**
45
+ * Extract class names from cva() configuration object
46
+ */
47
+ private extractFromCvaConfig;
48
+ /**
49
+ * Extract class names from the variants object
50
+ * Structure: { variantName: { optionName: 'classes' | ['classes'] | null } }
51
+ */
52
+ private extractFromVariants;
53
+ /**
54
+ * Extract class names from compoundVariants array
55
+ * Structure: [{ condition: value, class: 'classes' | className: 'classes' }]
56
+ */
57
+ private extractFromCompoundVariants;
58
+ /**
59
+ * Extract class names from any expression value
60
+ * Handles: strings, arrays, template literals
61
+ */
62
+ private extractFromValue;
63
+ /**
64
+ * Check if this call expression is calling a function created by cva()
65
+ * Uses TypeChecker for accurate origin tracking
66
+ * IMPORTANT: Returns false for utility functions
67
+ */
68
+ private isCvaCreatedFunctionCall;
69
+ /**
70
+ * Check if a symbol's declaration is from a cva() call
71
+ * Handles: const button = cva(...), export const button = cva(...), etc.
72
+ */
73
+ private isSymbolFromCvaCall;
74
+ /**
75
+ * Extract class names from a cva() function call
76
+ * Example: button({ intent: 'primary', class: 'extra-class' })
77
+ */
78
+ private extractFromCvaFunctionCall;
79
+ /**
80
+ * Get property name from a property assignment
81
+ */
82
+ private getPropertyName;
83
+ /**
84
+ * Clear the import cache (useful for testing or when files change)
85
+ */
86
+ clearCache(): void;
87
+ }
88
+ //# sourceMappingURL=CvaExtractor.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CvaExtractor.d.ts","sourceRoot":"","sources":["../../src/extractors/CvaExtractor.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,gCAAgC,CAAC;AAErD,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AACjE,OAAO,EAAE,aAAa,EAAE,MAAM,iBAAiB,CAAC;AAEhD;;;;;;;;;;;;;;;;;;GAkBG;AACH,qBAAa,YAAa,SAAQ,aAAa;IAC9C,OAAO,CAAC,cAAc,CAAkC;IACxD,OAAO,CAAC,gBAAgB,CAAiC;IAEzD,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO;IAI7D,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,iBAAiB,GAAG,aAAa,EAAE;IAsBnE;;;OAGG;IACH,OAAO,CAAC,SAAS;IAsBjB;;;;OAIG;IACH,OAAO,CAAC,iBAAiB;IAmDzB;;;OAGG;IACH,OAAO,CAAC,wBAAwB;IA0BhC;;OAEG;IACH,OAAO,CAAC,oBAAoB;IA0C5B;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IAwC3B;;;OAGG;IACH,OAAO,CAAC,2BAA2B;IAgCnC;;;OAGG;IACH,OAAO,CAAC,gBAAgB;IA2ExB;;;;OAIG;IACH,OAAO,CAAC,wBAAwB;IAiDhC;;;OAGG;IACH,OAAO,CAAC,mBAAmB;IA+B3B;;;OAGG;IACH,OAAO,CAAC,0BAA0B;IAkClC;;OAEG;IACH,OAAO,CAAC,eAAe;IAiBvB;;OAEG;IACH,UAAU,IAAI,IAAI;CAIlB"}
@@ -0,0 +1,425 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.CvaExtractor = void 0;
4
+ const BaseExtractor_1 = require("./BaseExtractor");
5
+ /**
6
+ * Extracts class names from class-variance-authority cva() function calls
7
+ *
8
+ * Supports:
9
+ * - base: array of strings or single string (first argument)
10
+ * - variants: nested object with string/array values containing classes
11
+ * - compoundVariants: array of objects with class/className properties
12
+ * - boolean variants: { disabled: { true: [...], false: null } }
13
+ * - Import aliasing: import { cva as myCva } from 'class-variance-authority'
14
+ * - class property overrides: button({ intent: 'primary', class: 'extra-class' })
15
+ *
16
+ * PERFORMANCE OPTIMIZATIONS:
17
+ * - ✅ Import detection cached per file (one-time AST scan)
18
+ * - ✅ Early exits for non-cva calls (fast path)
19
+ * - ✅ Direct property access (no unnecessary traversal)
20
+ * - ✅ Inline hot paths (string literal extraction)
21
+ * - ✅ Short-circuit evaluation (skip work when possible)
22
+ * - ✅ TypeChecker-based origin tracking (cached per symbol)
23
+ */
24
+ class CvaExtractor extends BaseExtractor_1.BaseExtractor {
25
+ constructor() {
26
+ super(...arguments);
27
+ this.cvaImportCache = new Map();
28
+ this.cvaVariableCache = new Map();
29
+ }
30
+ canHandle(node, context) {
31
+ return context.typescript.isCallExpression(node);
32
+ }
33
+ extract(node, context) {
34
+ // OPTIMIZATION: Type guard first (fastest check)
35
+ if (!context.typescript.isCallExpression(node)) {
36
+ return [];
37
+ }
38
+ const callExpression = node;
39
+ // OPTIMIZATION: Check if this is a cva() definition call
40
+ if (this.isCvaCall(callExpression, context)) {
41
+ return this.extractFromCvaDefinition(callExpression, context);
42
+ }
43
+ // Check if this is a call to a function created by cva() (e.g., button({ class: '...' }))
44
+ // IMPORTANT: Only validate if NOT a utility function
45
+ if (this.isCvaCreatedFunctionCall(callExpression, context)) {
46
+ return this.extractFromCvaFunctionCall(callExpression, context);
47
+ }
48
+ return [];
49
+ }
50
+ /**
51
+ * Check if this call expression is a cva() call from class-variance-authority
52
+ * Supports import aliasing: import { cva as myCva } from 'class-variance-authority'
53
+ */
54
+ isCvaCall(callExpression, context) {
55
+ const expr = callExpression.expression;
56
+ const cvaNames = this.getCvaImportNames(context);
57
+ // No cva imports found
58
+ if (cvaNames.size === 0) {
59
+ return false;
60
+ }
61
+ // Handle simple calls: cva(...) or myCva(...)
62
+ if (context.typescript.isIdentifier(expr)) {
63
+ return cvaNames.has(expr.text);
64
+ }
65
+ // Handle member expressions: variants.cva(...), utils.myCva(...)
66
+ if (context.typescript.isPropertyAccessExpression(expr)) {
67
+ return cvaNames.has(expr.name.text);
68
+ }
69
+ return false;
70
+ }
71
+ /**
72
+ * Get all local names for cva imports from class-variance-authority
73
+ * Supports aliasing: import { cva as myCva } -> returns Set(['myCva'])
74
+ * Caches result per file for performance
75
+ */
76
+ getCvaImportNames(context) {
77
+ const fileName = context.sourceFile.fileName;
78
+ // Check cache first
79
+ if (this.cvaImportCache.has(fileName)) {
80
+ return this.cvaImportCache.get(fileName);
81
+ }
82
+ // Search for import statement
83
+ const cvaNames = new Set();
84
+ for (const statement of context.sourceFile.statements) {
85
+ if (!context.typescript.isImportDeclaration(statement)) {
86
+ continue;
87
+ }
88
+ const moduleSpecifier = statement.moduleSpecifier;
89
+ if (!context.typescript.isStringLiteral(moduleSpecifier) ||
90
+ moduleSpecifier.text !== 'class-variance-authority') {
91
+ continue;
92
+ }
93
+ const importClause = statement.importClause;
94
+ if (!importClause) {
95
+ continue;
96
+ }
97
+ // Check named imports: import { cva } or import { cva as myCva }
98
+ const namedBindings = importClause.namedBindings;
99
+ if (namedBindings && context.typescript.isNamedImports(namedBindings)) {
100
+ for (const element of namedBindings.elements) {
101
+ // Check if the original export name is 'cva'
102
+ // For: import { cva } -> propertyName is undefined, name is 'cva'
103
+ // For: import { cva as myCva } -> propertyName is 'cva', name is 'myCva'
104
+ const originalName = element.propertyName?.text || element.name.text;
105
+ if (originalName === 'cva') {
106
+ // Add the local name (what it's called in this file)
107
+ cvaNames.add(element.name.text);
108
+ }
109
+ }
110
+ }
111
+ }
112
+ // Cache the result
113
+ this.cvaImportCache.set(fileName, cvaNames);
114
+ return cvaNames;
115
+ }
116
+ /**
117
+ * Extract class names from cva() definition
118
+ * cva(['base', 'classes'], { variants: {...}, compoundVariants: [...] })
119
+ */
120
+ extractFromCvaDefinition(callExpression, context) {
121
+ const classNames = [];
122
+ // OPTIMIZATION: Early exit for empty arguments
123
+ if (callExpression.arguments.length === 0) {
124
+ return [];
125
+ }
126
+ // First argument: base classes (array or string)
127
+ const baseArg = callExpression.arguments[0];
128
+ classNames.push(...this.extractFromValue(baseArg, context));
129
+ // Second argument: config object (optional)
130
+ if (callExpression.arguments.length > 1) {
131
+ const configArg = callExpression.arguments[1];
132
+ if (context.typescript.isObjectLiteralExpression(configArg)) {
133
+ classNames.push(...this.extractFromCvaConfig(configArg, context));
134
+ }
135
+ }
136
+ return classNames;
137
+ }
138
+ /**
139
+ * Extract class names from cva() configuration object
140
+ */
141
+ extractFromCvaConfig(config, context) {
142
+ const classNames = [];
143
+ for (const property of config.properties) {
144
+ if (!context.typescript.isPropertyAssignment(property)) {
145
+ continue;
146
+ }
147
+ const propertyName = this.getPropertyName(property, context);
148
+ if (!propertyName) {
149
+ continue;
150
+ }
151
+ // Handle different cva() properties
152
+ switch (propertyName) {
153
+ case 'variants':
154
+ // variants: { intent: { primary: [...], secondary: [...] } }
155
+ classNames.push(...this.extractFromVariants(property.initializer, context));
156
+ break;
157
+ case 'compoundVariants':
158
+ // compoundVariants: [{ intent: 'primary', class: '...' }]
159
+ classNames.push(...this.extractFromCompoundVariants(property.initializer, context));
160
+ break;
161
+ case 'defaultVariants':
162
+ // defaultVariants doesn't contain classes, skip
163
+ break;
164
+ default:
165
+ // Other properties might contain classes, try to extract
166
+ classNames.push(...this.extractFromValue(property.initializer, context));
167
+ break;
168
+ }
169
+ }
170
+ return classNames;
171
+ }
172
+ /**
173
+ * Extract class names from the variants object
174
+ * Structure: { variantName: { optionName: 'classes' | ['classes'] | null } }
175
+ */
176
+ extractFromVariants(node, context) {
177
+ if (!context.typescript.isObjectLiteralExpression(node)) {
178
+ return [];
179
+ }
180
+ const classNames = [];
181
+ // Iterate through each variant (e.g., intent, size, disabled)
182
+ for (const variantProp of node.properties) {
183
+ if (!context.typescript.isPropertyAssignment(variantProp)) {
184
+ continue;
185
+ }
186
+ // Each variant value should be an object with options
187
+ if (context.typescript.isObjectLiteralExpression(variantProp.initializer)) {
188
+ // Iterate through each option (e.g., primary, secondary, true, false)
189
+ for (const optionProp of variantProp.initializer.properties) {
190
+ if (!context.typescript.isPropertyAssignment(optionProp)) {
191
+ continue;
192
+ }
193
+ // Extract classes from the option value (can be string, array, or null)
194
+ const value = optionProp.initializer;
195
+ // Skip null values (common for boolean variants: { false: null })
196
+ if (context.typescript.isToken(value) &&
197
+ value.kind === context.typescript.SyntaxKind.NullKeyword) {
198
+ continue;
199
+ }
200
+ classNames.push(...this.extractFromValue(value, context));
201
+ }
202
+ }
203
+ }
204
+ return classNames;
205
+ }
206
+ /**
207
+ * Extract class names from compoundVariants array
208
+ * Structure: [{ condition: value, class: 'classes' | className: 'classes' }]
209
+ */
210
+ extractFromCompoundVariants(node, context) {
211
+ if (!context.typescript.isArrayLiteralExpression(node)) {
212
+ return [];
213
+ }
214
+ const classNames = [];
215
+ // Iterate through each compound variant object
216
+ for (const element of node.elements) {
217
+ if (!context.typescript.isObjectLiteralExpression(element)) {
218
+ continue;
219
+ }
220
+ // Look for 'class' or 'className' property
221
+ for (const prop of element.properties) {
222
+ if (!context.typescript.isPropertyAssignment(prop)) {
223
+ continue;
224
+ }
225
+ const propName = this.getPropertyName(prop, context);
226
+ if (propName === 'class' || propName === 'className') {
227
+ classNames.push(...this.extractFromValue(prop.initializer, context));
228
+ }
229
+ }
230
+ }
231
+ return classNames;
232
+ }
233
+ /**
234
+ * Extract class names from any expression value
235
+ * Handles: strings, arrays, template literals
236
+ */
237
+ extractFromValue(node, context) {
238
+ // String literal: 'flex items-center'
239
+ if (context.typescript.isStringLiteral(node)) {
240
+ return this.extractFromStringLiteral(node, context);
241
+ }
242
+ // No-substitution template literal: `flex items-center`
243
+ if (context.typescript.isNoSubstitutionTemplateLiteral(node)) {
244
+ return this.extractFromStringLiteral(node, context);
245
+ }
246
+ // Array: ['flex', 'items-center']
247
+ if (context.typescript.isArrayLiteralExpression(node)) {
248
+ const classNames = [];
249
+ for (const element of node.elements) {
250
+ if (context.typescript.isStringLiteral(element)) {
251
+ classNames.push(...this.extractFromStringLiteral(element, context));
252
+ }
253
+ }
254
+ return classNames;
255
+ }
256
+ // Template expression with variables: `flex ${something}`
257
+ // For now, we extract only the static parts
258
+ if (context.typescript.isTemplateExpression(node)) {
259
+ const classNames = [];
260
+ const lineNumber = context.sourceFile.getLineAndCharacterOfPosition(node.getStart()).line + 1;
261
+ // Extract from head
262
+ if (node.head.text) {
263
+ const headText = node.head.text;
264
+ const headStart = node.head.getStart() + 1; // +1 to skip backtick
265
+ let offset = 0;
266
+ headText.split(' ').forEach(className => {
267
+ if (className) {
268
+ classNames.push({
269
+ className,
270
+ absoluteStart: headStart + offset,
271
+ length: className.length,
272
+ line: lineNumber,
273
+ file: context.sourceFile.fileName
274
+ });
275
+ }
276
+ offset += className.length + 1;
277
+ });
278
+ }
279
+ // Extract from template spans
280
+ for (const span of node.templateSpans) {
281
+ if (span.literal.text) {
282
+ const spanText = span.literal.text;
283
+ const spanStart = span.literal.getStart() + 1;
284
+ let offset = 0;
285
+ spanText.split(' ').forEach(className => {
286
+ if (className) {
287
+ classNames.push({
288
+ className,
289
+ absoluteStart: spanStart + offset,
290
+ length: className.length,
291
+ line: lineNumber,
292
+ file: context.sourceFile.fileName
293
+ });
294
+ }
295
+ offset += className.length + 1;
296
+ });
297
+ }
298
+ }
299
+ return classNames;
300
+ }
301
+ return [];
302
+ }
303
+ /**
304
+ * Check if this call expression is calling a function created by cva()
305
+ * Uses TypeChecker for accurate origin tracking
306
+ * IMPORTANT: Returns false for utility functions
307
+ */
308
+ isCvaCreatedFunctionCall(callExpression, context) {
309
+ // OPTIMIZATION: Early exit if no type checker available
310
+ if (!context.typeChecker) {
311
+ return false;
312
+ }
313
+ const expr = callExpression.expression;
314
+ // OPTIMIZATION: Only handle simple identifiers and property access
315
+ // This covers: button(...), variants.button(...), etc.
316
+ if (!context.typescript.isIdentifier(expr) &&
317
+ !context.typescript.isPropertyAccessExpression(expr)) {
318
+ return false;
319
+ }
320
+ // OPTIMIZATION: Check if this is a utility function (exclude from validation)
321
+ const functionName = context.typescript.isIdentifier(expr)
322
+ ? expr.text
323
+ : context.typescript.isPropertyAccessExpression(expr)
324
+ ? expr.name.text
325
+ : null;
326
+ if (functionName && context.utilityFunctions.includes(functionName)) {
327
+ return false;
328
+ }
329
+ // Get the symbol for the called function
330
+ const symbol = context.typeChecker.getSymbolAtLocation(expr);
331
+ if (!symbol) {
332
+ return false;
333
+ }
334
+ // OPTIMIZATION: Check cache first
335
+ if (this.cvaVariableCache.has(symbol)) {
336
+ return this.cvaVariableCache.get(symbol);
337
+ }
338
+ // Check if this symbol's declaration is assigned from a cva() call
339
+ const isCvaCreated = this.isSymbolFromCvaCall(symbol, context);
340
+ this.cvaVariableCache.set(symbol, isCvaCreated);
341
+ return isCvaCreated;
342
+ }
343
+ /**
344
+ * Check if a symbol's declaration is from a cva() call
345
+ * Handles: const button = cva(...), export const button = cva(...), etc.
346
+ */
347
+ isSymbolFromCvaCall(symbol, context) {
348
+ const declarations = symbol.getDeclarations();
349
+ if (!declarations || declarations.length === 0) {
350
+ return false;
351
+ }
352
+ // Check each declaration to see if it's assigned from cva()
353
+ for (const declaration of declarations) {
354
+ // Handle: const button = cva(...)
355
+ if (context.typescript.isVariableDeclaration(declaration)) {
356
+ const initializer = declaration.initializer;
357
+ if (initializer && context.typescript.isCallExpression(initializer)) {
358
+ if (this.isCvaCall(initializer, context)) {
359
+ return true;
360
+ }
361
+ }
362
+ }
363
+ // Handle: export default cva(...) or similar patterns
364
+ else if (context.typescript.isExportAssignment(declaration)) {
365
+ const expr = declaration.expression;
366
+ if (context.typescript.isCallExpression(expr)) {
367
+ if (this.isCvaCall(expr, context)) {
368
+ return true;
369
+ }
370
+ }
371
+ }
372
+ }
373
+ return false;
374
+ }
375
+ /**
376
+ * Extract class names from a cva() function call
377
+ * Example: button({ intent: 'primary', class: 'extra-class' })
378
+ */
379
+ extractFromCvaFunctionCall(callExpression, context) {
380
+ // OPTIMIZATION: Early exit for empty arguments
381
+ if (callExpression.arguments.length === 0) {
382
+ return [];
383
+ }
384
+ const arg = callExpression.arguments[0];
385
+ // The argument should be an object literal with properties like { intent: 'primary', class: '...' }
386
+ if (!context.typescript.isObjectLiteralExpression(arg)) {
387
+ return [];
388
+ }
389
+ const classNames = [];
390
+ // Look for 'class' or 'className' properties
391
+ for (const property of arg.properties) {
392
+ if (!context.typescript.isPropertyAssignment(property)) {
393
+ continue;
394
+ }
395
+ const propName = this.getPropertyName(property, context);
396
+ if (propName === 'class' || propName === 'className') {
397
+ // Extract classes from the value
398
+ classNames.push(...this.extractFromValue(property.initializer, context));
399
+ }
400
+ }
401
+ return classNames;
402
+ }
403
+ /**
404
+ * Get property name from a property assignment
405
+ */
406
+ getPropertyName(property, context) {
407
+ const name = property.name;
408
+ if (context.typescript.isIdentifier(name)) {
409
+ return name.text;
410
+ }
411
+ if (context.typescript.isStringLiteral(name)) {
412
+ return name.text;
413
+ }
414
+ return null;
415
+ }
416
+ /**
417
+ * Clear the import cache (useful for testing or when files change)
418
+ */
419
+ clearCache() {
420
+ this.cvaImportCache.clear();
421
+ this.cvaVariableCache.clear();
422
+ }
423
+ }
424
+ exports.CvaExtractor = CvaExtractor;
425
+ //# sourceMappingURL=CvaExtractor.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"CvaExtractor.js","sourceRoot":"","sources":["../../src/extractors/CvaExtractor.ts"],"names":[],"mappings":"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"}