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.
- package/CHANGELOG.md +42 -0
- package/LICENSE +21 -0
- package/README.md +538 -0
- package/lib/core/interfaces.d.ts +45 -0
- package/lib/core/interfaces.d.ts.map +1 -0
- package/lib/core/interfaces.js +3 -0
- package/lib/core/interfaces.js.map +1 -0
- package/lib/core/types.d.ts +27 -0
- package/lib/core/types.d.ts.map +1 -0
- package/lib/core/types.js +3 -0
- package/lib/core/types.js.map +1 -0
- package/lib/extractors/BaseExtractor.d.ts +20 -0
- package/lib/extractors/BaseExtractor.d.ts.map +1 -0
- package/lib/extractors/BaseExtractor.js +83 -0
- package/lib/extractors/BaseExtractor.js.map +1 -0
- package/lib/extractors/CvaExtractor.d.ts +88 -0
- package/lib/extractors/CvaExtractor.d.ts.map +1 -0
- package/lib/extractors/CvaExtractor.js +425 -0
- package/lib/extractors/CvaExtractor.js.map +1 -0
- package/lib/extractors/ExpressionExtractor.d.ts +16 -0
- package/lib/extractors/ExpressionExtractor.d.ts.map +1 -0
- package/lib/extractors/ExpressionExtractor.js +132 -0
- package/lib/extractors/ExpressionExtractor.js.map +1 -0
- package/lib/extractors/JsxAttributeExtractor.d.ts +20 -0
- package/lib/extractors/JsxAttributeExtractor.d.ts.map +1 -0
- package/lib/extractors/JsxAttributeExtractor.js +107 -0
- package/lib/extractors/JsxAttributeExtractor.js.map +1 -0
- package/lib/extractors/JsxAttributeExtractor.original.d.ts +15 -0
- package/lib/extractors/JsxAttributeExtractor.original.d.ts.map +1 -0
- package/lib/extractors/JsxAttributeExtractor.original.js +84 -0
- package/lib/extractors/JsxAttributeExtractor.original.js.map +1 -0
- package/lib/extractors/StringLiteralExtractor.d.ts +12 -0
- package/lib/extractors/StringLiteralExtractor.d.ts.map +1 -0
- package/lib/extractors/StringLiteralExtractor.js +21 -0
- package/lib/extractors/StringLiteralExtractor.js.map +1 -0
- package/lib/extractors/TailwindVariantsExtractor.d.ts +87 -0
- package/lib/extractors/TailwindVariantsExtractor.d.ts.map +1 -0
- package/lib/extractors/TailwindVariantsExtractor.js +447 -0
- package/lib/extractors/TailwindVariantsExtractor.js.map +1 -0
- package/lib/extractors/TemplateExpressionExtractor.d.ts +14 -0
- package/lib/extractors/TemplateExpressionExtractor.d.ts.map +1 -0
- package/lib/extractors/TemplateExpressionExtractor.js +66 -0
- package/lib/extractors/TemplateExpressionExtractor.js.map +1 -0
- package/lib/index.d.ts +65 -0
- package/lib/index.d.ts.map +1 -0
- package/lib/index.js +4 -0
- package/lib/index.js.map +1 -0
- package/lib/infrastructure/TailwindValidator.d.ts +42 -0
- package/lib/infrastructure/TailwindValidator.d.ts.map +1 -0
- package/lib/infrastructure/TailwindValidator.js +152 -0
- package/lib/infrastructure/TailwindValidator.js.map +1 -0
- package/lib/infrastructure/TailwindValidator.spec.d.ts +2 -0
- package/lib/infrastructure/TailwindValidator.spec.d.ts.map +1 -0
- package/lib/infrastructure/TailwindValidator.spec.js +219 -0
- package/lib/infrastructure/TailwindValidator.spec.js.map +1 -0
- package/lib/plugin/TailwindTypescriptPlugin.d.ts +52 -0
- package/lib/plugin/TailwindTypescriptPlugin.d.ts.map +1 -0
- package/lib/plugin/TailwindTypescriptPlugin.js +142 -0
- package/lib/plugin/TailwindTypescriptPlugin.js.map +1 -0
- package/lib/services/ClassNameExtractionService.d.ts +37 -0
- package/lib/services/ClassNameExtractionService.d.ts.map +1 -0
- package/lib/services/ClassNameExtractionService.js +98 -0
- package/lib/services/ClassNameExtractionService.js.map +1 -0
- package/lib/services/ClassNameExtractionService.original.d.ts +20 -0
- package/lib/services/ClassNameExtractionService.original.d.ts.map +1 -0
- package/lib/services/ClassNameExtractionService.original.js +48 -0
- package/lib/services/ClassNameExtractionService.original.js.map +1 -0
- package/lib/services/DiagnosticService.d.ts +14 -0
- package/lib/services/DiagnosticService.d.ts.map +1 -0
- package/lib/services/DiagnosticService.js +61 -0
- package/lib/services/DiagnosticService.js.map +1 -0
- package/lib/services/PerformanceCache.d.ts +15 -0
- package/lib/services/PerformanceCache.d.ts.map +1 -0
- package/lib/services/PerformanceCache.js +44 -0
- package/lib/services/PerformanceCache.js.map +1 -0
- package/lib/services/PluginConfigService.d.ts +22 -0
- package/lib/services/PluginConfigService.d.ts.map +1 -0
- package/lib/services/PluginConfigService.js +86 -0
- package/lib/services/PluginConfigService.js.map +1 -0
- package/lib/services/ValidationService.d.ts +25 -0
- package/lib/services/ValidationService.d.ts.map +1 -0
- package/lib/services/ValidationService.js +50 -0
- package/lib/services/ValidationService.js.map +1 -0
- package/lib/utils/Logger.d.ts +10 -0
- package/lib/utils/Logger.d.ts.map +1 -0
- package/lib/utils/Logger.js +13 -0
- package/lib/utils/Logger.js.map +1 -0
- package/package.json +84 -0
|
@@ -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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"}
|