tailwind-typescript-plugin 1.4.0-beta.23 → 1.4.0-beta.25
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 +30 -0
- package/lib/core/interfaces.d.ts +17 -1
- package/lib/core/interfaces.d.ts.map +1 -1
- package/lib/extractors/BaseExtractor.d.ts +7 -1
- package/lib/extractors/BaseExtractor.d.ts.map +1 -1
- package/lib/extractors/BaseExtractor.js +10 -0
- package/lib/extractors/BaseExtractor.js.map +1 -1
- package/lib/extractors/BaseExtractor.spec.d.ts +2 -0
- package/lib/extractors/BaseExtractor.spec.d.ts.map +1 -0
- package/lib/extractors/BaseExtractor.spec.js +421 -0
- package/lib/extractors/BaseExtractor.spec.js.map +1 -0
- package/lib/extractors/CvaExtractor.spec.d.ts +2 -0
- package/lib/extractors/CvaExtractor.spec.d.ts.map +1 -0
- package/lib/extractors/CvaExtractor.spec.js +1177 -0
- package/lib/extractors/CvaExtractor.spec.js.map +1 -0
- package/lib/extractors/ExpressionExtractor.spec.d.ts +2 -0
- package/lib/extractors/ExpressionExtractor.spec.d.ts.map +1 -0
- package/lib/extractors/ExpressionExtractor.spec.js +316 -0
- package/lib/extractors/ExpressionExtractor.spec.js.map +1 -0
- package/lib/extractors/JsxAttributeExtractor.d.ts +5 -0
- package/lib/extractors/JsxAttributeExtractor.d.ts.map +1 -1
- package/lib/extractors/JsxAttributeExtractor.js +6 -0
- package/lib/extractors/JsxAttributeExtractor.js.map +1 -1
- package/lib/extractors/JsxAttributeExtractor.spec.d.ts +2 -0
- package/lib/extractors/JsxAttributeExtractor.spec.d.ts.map +1 -0
- package/lib/extractors/JsxAttributeExtractor.spec.js +430 -0
- package/lib/extractors/JsxAttributeExtractor.spec.js.map +1 -0
- package/lib/extractors/TailwindVariantsExtractor.spec.d.ts +2 -0
- package/lib/extractors/TailwindVariantsExtractor.spec.d.ts.map +1 -0
- package/lib/extractors/TailwindVariantsExtractor.spec.js +1407 -0
- package/lib/extractors/TailwindVariantsExtractor.spec.js.map +1 -0
- package/lib/extractors/TemplateExpressionExtractor.spec.d.ts +2 -0
- package/lib/extractors/TemplateExpressionExtractor.spec.d.ts.map +1 -0
- package/lib/extractors/TemplateExpressionExtractor.spec.js +240 -0
- package/lib/extractors/TemplateExpressionExtractor.spec.js.map +1 -0
- package/lib/extractors/VariableReferenceExtractor.spec.d.ts +2 -0
- package/lib/extractors/VariableReferenceExtractor.spec.d.ts.map +1 -0
- package/lib/extractors/VariableReferenceExtractor.spec.js +138 -0
- package/lib/extractors/VariableReferenceExtractor.spec.js.map +1 -0
- package/lib/extractors/VueAttributeExtractor.d.ts +6 -0
- package/lib/extractors/VueAttributeExtractor.d.ts.map +1 -1
- package/lib/extractors/VueAttributeExtractor.js +7 -0
- package/lib/extractors/VueAttributeExtractor.js.map +1 -1
- package/lib/plugin/TailwindTypescriptPlugin.d.ts +9 -0
- package/lib/plugin/TailwindTypescriptPlugin.d.ts.map +1 -1
- package/lib/plugin/TailwindTypescriptPlugin.js +36 -11
- package/lib/plugin/TailwindTypescriptPlugin.js.map +1 -1
- package/lib/services/ClassNameExtractionService.d.ts +8 -3
- package/lib/services/ClassNameExtractionService.d.ts.map +1 -1
- package/lib/services/ClassNameExtractionService.js +26 -25
- package/lib/services/ClassNameExtractionService.js.map +1 -1
- package/lib/services/ClassNameExtractionService.spec.js +0 -7
- package/lib/services/ClassNameExtractionService.spec.js.map +1 -1
- package/lib/services/ConfigSchemaValidator.d.ts +40 -0
- package/lib/services/ConfigSchemaValidator.d.ts.map +1 -0
- package/lib/services/ConfigSchemaValidator.js +139 -0
- package/lib/services/ConfigSchemaValidator.js.map +1 -0
- package/lib/services/ConfigSchemaValidator.spec.d.ts +2 -0
- package/lib/services/ConfigSchemaValidator.spec.d.ts.map +1 -0
- package/lib/services/ConfigSchemaValidator.spec.js +344 -0
- package/lib/services/ConfigSchemaValidator.spec.js.map +1 -0
- package/lib/services/ConflictClassDetection.spec.js +48 -0
- package/lib/services/ConflictClassDetection.spec.js.map +1 -1
- package/lib/services/DiagnosticService.spec.d.ts +2 -0
- package/lib/services/DiagnosticService.spec.d.ts.map +1 -0
- package/lib/services/DiagnosticService.spec.js +259 -0
- package/lib/services/DiagnosticService.spec.js.map +1 -0
- package/lib/services/FileDiagnosticCache.spec.d.ts +2 -0
- package/lib/services/FileDiagnosticCache.spec.d.ts.map +1 -0
- package/lib/services/FileDiagnosticCache.spec.js +213 -0
- package/lib/services/FileDiagnosticCache.spec.js.map +1 -0
- package/lib/services/PerformanceCache.spec.d.ts +2 -0
- package/lib/services/PerformanceCache.spec.d.ts.map +1 -0
- package/lib/services/PerformanceCache.spec.js +168 -0
- package/lib/services/PerformanceCache.spec.js.map +1 -0
- package/lib/services/PluginConfigService.d.ts +19 -0
- package/lib/services/PluginConfigService.d.ts.map +1 -1
- package/lib/services/PluginConfigService.js +29 -0
- package/lib/services/PluginConfigService.js.map +1 -1
- package/lib/services/ValidationService.spec.d.ts +2 -0
- package/lib/services/ValidationService.spec.d.ts.map +1 -0
- package/lib/services/ValidationService.spec.js +289 -0
- package/lib/services/ValidationService.spec.js.map +1 -0
- package/lib/utils/FrameworkDetector.d.ts +1 -2
- package/lib/utils/FrameworkDetector.d.ts.map +1 -1
- package/lib/utils/FrameworkDetector.js +0 -5
- package/lib/utils/FrameworkDetector.js.map +1 -1
- package/lib/utils/FrameworkDetector.spec.js +1 -9
- package/lib/utils/FrameworkDetector.spec.js.map +1 -1
- package/package.json +10 -3
- package/lib/extractors/SvelteAttributeExtractor.d.ts +0 -17
- package/lib/extractors/SvelteAttributeExtractor.d.ts.map +0 -1
- package/lib/extractors/SvelteAttributeExtractor.js +0 -27
- package/lib/extractors/SvelteAttributeExtractor.js.map +0 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,33 @@
|
|
|
1
|
+
## [1.4.0-beta.25](https://github.com/IvanRodriCalleja/tailwind-typescript-plugin/compare/v1.4.0-beta.24...v1.4.0-beta.25) (2026-02-18)
|
|
2
|
+
|
|
3
|
+
### ✨ Features
|
|
4
|
+
|
|
5
|
+
* add e2e test ([4f021c9](https://github.com/IvanRodriCalleja/tailwind-typescript-plugin/commit/4f021c9cfa82209a6c8bfca1a831d25092c736f7))
|
|
6
|
+
|
|
7
|
+
### ✅ Tests
|
|
8
|
+
|
|
9
|
+
* **conflict-detection:** add tests for nested prefix handling ([302f2ff](https://github.com/IvanRodriCalleja/tailwind-typescript-plugin/commit/302f2ffe5f19041802a83fc8d3a6a54c66f8c507))
|
|
10
|
+
|
|
11
|
+
### 🔧 Chores
|
|
12
|
+
|
|
13
|
+
* add node filter optimization for extractors ([0e419b9](https://github.com/IvanRodriCalleja/tailwind-typescript-plugin/commit/0e419b9e797930673c5a6db679cc85c2c7c9178f))
|
|
14
|
+
* improve error handling ([80566b2](https://github.com/IvanRodriCalleja/tailwind-typescript-plugin/commit/80566b2de85161642dde3fce51b5b1bc910ea1ea))
|
|
15
|
+
* move postcss and tailwindcss to peer dependencies ([9127e95](https://github.com/IvanRodriCalleja/tailwind-typescript-plugin/commit/9127e95738c85192e4fc16190b9a650ba1f4c333))
|
|
16
|
+
|
|
17
|
+
## [1.4.0-beta.24](https://github.com/IvanRodriCalleja/tailwind-typescript-plugin/compare/v1.4.0-beta.23...v1.4.0-beta.24) (2026-01-02)
|
|
18
|
+
|
|
19
|
+
### ✨ Features
|
|
20
|
+
|
|
21
|
+
* add configuration schema validation with Zod ([bfd395e](https://github.com/IvanRodriCalleja/tailwind-typescript-plugin/commit/bfd395e2cbe29b628990bfa3ac97e0aee3b47aae))
|
|
22
|
+
|
|
23
|
+
### ✅ Tests
|
|
24
|
+
|
|
25
|
+
* add comprehensive test coverage for extractors and services ([7839ba9](https://github.com/IvanRodriCalleja/tailwind-typescript-plugin/commit/7839ba964add0a91fdee3b31db9711dcdf47c4ed))
|
|
26
|
+
|
|
27
|
+
### 🔧 Chores
|
|
28
|
+
|
|
29
|
+
* remove Svelte support ([edce4d6](https://github.com/IvanRodriCalleja/tailwind-typescript-plugin/commit/edce4d61cf37bef6224181552d9e56cc0e020472))
|
|
30
|
+
|
|
1
31
|
## [1.4.0-beta.23](https://github.com/IvanRodriCalleja/tailwind-typescript-plugin/compare/v1.4.0-beta.22...v1.4.0-beta.23) (2025-12-29)
|
|
2
32
|
|
|
3
33
|
### ✨ Features
|
package/lib/core/interfaces.d.ts
CHANGED
|
@@ -1,12 +1,28 @@
|
|
|
1
1
|
import * as ts from 'typescript/lib/tsserverlibrary';
|
|
2
2
|
import { ClassAttributesConfig, ClassNameInfo, EditorConfig, ExtractionContext, LibrariesConfig, LintConfig, ValidationConfig } from './types';
|
|
3
|
+
/**
|
|
4
|
+
* Type for node filter functions used by extractors
|
|
5
|
+
* Returns true if the node might contain class names worth extracting
|
|
6
|
+
*/
|
|
7
|
+
export type NodeFilterFn = (node: ts.Node, typescript: typeof ts) => boolean;
|
|
3
8
|
/**
|
|
4
9
|
* Base interface for class name extractors
|
|
5
10
|
* Follows the Strategy pattern for extensibility
|
|
6
11
|
*/
|
|
7
12
|
export interface IClassNameExtractor {
|
|
8
13
|
/**
|
|
9
|
-
*
|
|
14
|
+
* Returns a fast filter function to pre-screen nodes before calling canHandle().
|
|
15
|
+
* This enables ~95-98% of nodes to be skipped with a simple type check,
|
|
16
|
+
* avoiding the overhead of polymorphic canHandle() calls.
|
|
17
|
+
*
|
|
18
|
+
* Each extractor defines its own filter based on the node types it handles:
|
|
19
|
+
* - JSX: Only JsxOpeningElement or JsxSelfClosingElement nodes
|
|
20
|
+
* - Vue: Only CallExpression nodes (Volar transforms templates to calls)
|
|
21
|
+
*/
|
|
22
|
+
getNodeFilter(): NodeFilterFn;
|
|
23
|
+
/**
|
|
24
|
+
* Determines if this extractor can handle the given node.
|
|
25
|
+
* Called only after getNodeFilter() returns true.
|
|
10
26
|
*/
|
|
11
27
|
canHandle(node: ts.Node, context: ExtractionContext): boolean;
|
|
12
28
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/core/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,gCAAgC,CAAC;AAErD,OAAO,EACN,qBAAqB,EACrB,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,MAAM,SAAS,CAAC;AAEjB;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IACnC
|
|
1
|
+
{"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../../src/core/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,gCAAgC,CAAC;AAErD,OAAO,EACN,qBAAqB,EACrB,aAAa,EACb,YAAY,EACZ,iBAAiB,EACjB,eAAe,EACf,UAAU,EACV,gBAAgB,EAChB,MAAM,SAAS,CAAC;AAEjB;;;GAGG;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,KAAK,OAAO,CAAC;AAE7E;;;GAGG;AACH,MAAM,WAAW,mBAAmB;IACnC;;;;;;;;OAQG;IACH,aAAa,IAAI,YAAY,CAAC;IAE9B;;;OAGG;IACH,SAAS,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,iBAAiB,GAAG,OAAO,CAAC;IAE9D;;OAEG;IACH,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,EAAE,OAAO,EAAE,iBAAiB,GAAG,aAAa,EAAE,CAAC;CACpE;AAED;;GAEG;AACH,MAAM,WAAW,mBAAmB;IACnC,YAAY,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC;IACzC,aAAa,IAAI,OAAO,CAAC;IACzB,iBAAiB,CAAC,cAAc,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC;CAClD;AAED;;GAEG;AACH,MAAM,WAAW,aAAa;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IAEnB;;OAEG;IACH,SAAS,CAAC,EAAE,eAAe,CAAC;IAE5B;;OAEG;IACH,UAAU,CAAC,EAAE,gBAAgB,CAAC;IAE9B;;OAEG;IACH,IAAI,CAAC,EAAE,UAAU,CAAC;IAElB;;OAEG;IACH,MAAM,CAAC,EAAE,YAAY,CAAC;IAEtB;;;;OAIG;IACH,eAAe,CAAC,EAAE,qBAAqB,CAAC;CACxC;AAED;;GAEG;AACH,MAAM,WAAW,kBAAkB;IAClC,gBAAgB,CAAC,SAAS,EAAE,aAAa,EAAE,UAAU,EAAE,EAAE,CAAC,UAAU,GAAG,EAAE,CAAC,UAAU,CAAC;CACrF"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import * as ts from 'typescript/lib/tsserverlibrary';
|
|
2
|
-
import { IClassNameExtractor } from '../core/interfaces';
|
|
2
|
+
import { IClassNameExtractor, NodeFilterFn } from '../core/interfaces';
|
|
3
3
|
import { ClassNameInfo, ExtractionContext, UtilityFunction } from '../core/types';
|
|
4
4
|
/**
|
|
5
5
|
* Abstract base class for all extractors
|
|
@@ -16,6 +16,12 @@ export declare abstract class BaseExtractor implements IClassNameExtractor {
|
|
|
16
16
|
* Maps filename -> (namespace identifier -> module specifier)
|
|
17
17
|
*/
|
|
18
18
|
private namespaceImportCache;
|
|
19
|
+
/**
|
|
20
|
+
* Returns a fast filter function to pre-screen nodes.
|
|
21
|
+
* Default implementation accepts all nodes (no filtering).
|
|
22
|
+
* Framework-specific extractors should override this for optimization.
|
|
23
|
+
*/
|
|
24
|
+
getNodeFilter(): NodeFilterFn;
|
|
19
25
|
abstract canHandle(node: ts.Node, context: ExtractionContext): boolean;
|
|
20
26
|
abstract extract(node: ts.Node, context: ExtractionContext): ClassNameInfo[];
|
|
21
27
|
/**
|
|
@@ -1 +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;
|
|
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,YAAY,EAAE,MAAM,oBAAoB,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,eAAe,CAAC;AAclF;;;GAGG;AACH,8BAAsB,aAAc,YAAW,mBAAmB;IACjE;;;OAGG;IACH,OAAO,CAAC,WAAW,CAAgC;IAEnD;;;OAGG;IACH,OAAO,CAAC,oBAAoB,CAAyC;IAErE;;;;OAIG;IACH,aAAa,IAAI,YAAY;IAM7B,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;;;OAGG;IACH,SAAS,CAAC,wBAAwB,CACjC,OAAO,EAAE,EAAE,CAAC,aAAa,GAAG,EAAE,CAAC,6BAA6B,EAC5D,OAAO,EAAE,iBAAiB,GACxB,aAAa,EAAE;IA0BlB;;;OAGG;IACH,SAAS,CAAC,0BAA0B,CACnC,cAAc,EAAE,EAAE,CAAC,cAAc,EACjC,gBAAgB,EAAE,eAAe,EAAE,EACnC,OAAO,CAAC,EAAE,iBAAiB,GACzB,OAAO;IAyDV;;;;;;OAMG;IACH,SAAS,CAAC,cAAc,CACvB,YAAY,EAAE,MAAM,EACpB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,iBAAiB,GACxB,OAAO;IAYV;;;OAGG;IACH,SAAS,CAAC,uBAAuB,CAChC,UAAU,EAAE,MAAM,EAClB,cAAc,EAAE,MAAM,EACtB,OAAO,EAAE,iBAAiB,GACxB,OAAO;IAYV;;;OAGG;IACH,OAAO,CAAC,YAAY;IAcpB;;;OAGG;IACH,OAAO,CAAC,qBAAqB;IAc7B;;OAEG;IACH,OAAO,CAAC,eAAe;IAsDvB;;OAEG;IACH,gBAAgB,IAAI,IAAI;IAKxB;;;OAGG;IACH,SAAS,CAAC,qBAAqB,CAC9B,YAAY,EAAE,MAAM,EACpB,gBAAgB,EAAE,eAAe,EAAE,GACjC,OAAO;CASV"}
|
|
@@ -52,6 +52,16 @@ class BaseExtractor {
|
|
|
52
52
|
*/
|
|
53
53
|
this.namespaceImportCache = new Map();
|
|
54
54
|
}
|
|
55
|
+
/**
|
|
56
|
+
* Returns a fast filter function to pre-screen nodes.
|
|
57
|
+
* Default implementation accepts all nodes (no filtering).
|
|
58
|
+
* Framework-specific extractors should override this for optimization.
|
|
59
|
+
*/
|
|
60
|
+
getNodeFilter() {
|
|
61
|
+
// Default: accept all nodes (no pre-filtering)
|
|
62
|
+
// Framework extractors (JSX, Vue) override this for ~95-98% skip rates
|
|
63
|
+
return () => true;
|
|
64
|
+
}
|
|
55
65
|
/**
|
|
56
66
|
* Helper method to create ClassNameInfo from a string literal
|
|
57
67
|
* Handles both single-line and multiline strings with various whitespace
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"BaseExtractor.js","sourceRoot":"","sources":["../../src/extractors/BaseExtractor.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,mEAAqD;AAiBrD;;;GAGG;AACH,MAAsB,aAAa;IAAnC;QACC;;;WAGG;QACK,gBAAW,GAAG,IAAI,GAAG,EAAqB,CAAC;QAEnD;;;WAGG;QACK,yBAAoB,GAAG,IAAI,GAAG,EAA8B,CAAC;
|
|
1
|
+
{"version":3,"file":"BaseExtractor.js","sourceRoot":"","sources":["../../src/extractors/BaseExtractor.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseExtractor.spec.d.ts","sourceRoot":"","sources":["../../src/extractors/BaseExtractor.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
3
|
+
if (k2 === undefined) k2 = k;
|
|
4
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
5
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
6
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
7
|
+
}
|
|
8
|
+
Object.defineProperty(o, k2, desc);
|
|
9
|
+
}) : (function(o, m, k, k2) {
|
|
10
|
+
if (k2 === undefined) k2 = k;
|
|
11
|
+
o[k2] = m[k];
|
|
12
|
+
}));
|
|
13
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
14
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
15
|
+
}) : function(o, v) {
|
|
16
|
+
o["default"] = v;
|
|
17
|
+
});
|
|
18
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
19
|
+
var ownKeys = function(o) {
|
|
20
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
21
|
+
var ar = [];
|
|
22
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
23
|
+
return ar;
|
|
24
|
+
};
|
|
25
|
+
return ownKeys(o);
|
|
26
|
+
};
|
|
27
|
+
return function (mod) {
|
|
28
|
+
if (mod && mod.__esModule) return mod;
|
|
29
|
+
var result = {};
|
|
30
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
31
|
+
__setModuleDefault(result, mod);
|
|
32
|
+
return result;
|
|
33
|
+
};
|
|
34
|
+
})();
|
|
35
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
36
|
+
const ts = __importStar(require("typescript/lib/tsserverlibrary"));
|
|
37
|
+
const BaseExtractor_1 = require("./BaseExtractor");
|
|
38
|
+
// Create a concrete implementation for testing
|
|
39
|
+
class TestExtractor extends BaseExtractor_1.BaseExtractor {
|
|
40
|
+
canHandle(node) {
|
|
41
|
+
return ts.isStringLiteral(node);
|
|
42
|
+
}
|
|
43
|
+
extract(node, context) {
|
|
44
|
+
if (ts.isStringLiteral(node) || ts.isNoSubstitutionTemplateLiteral(node)) {
|
|
45
|
+
return this.extractFromStringLiteral(node, context);
|
|
46
|
+
}
|
|
47
|
+
return [];
|
|
48
|
+
}
|
|
49
|
+
// Expose protected methods for testing
|
|
50
|
+
testShouldValidateFunctionCall(callExpression, utilityFunctions, context) {
|
|
51
|
+
return this.shouldValidateFunctionCall(callExpression, utilityFunctions, context);
|
|
52
|
+
}
|
|
53
|
+
testIsImportedFrom(functionName, expectedModule, context) {
|
|
54
|
+
return this.isImportedFrom(functionName, expectedModule, context);
|
|
55
|
+
}
|
|
56
|
+
testIsNamespaceImportedFrom(objectName, expectedModule, context) {
|
|
57
|
+
return this.isNamespaceImportedFrom(objectName, expectedModule, context);
|
|
58
|
+
}
|
|
59
|
+
testIsUtilityFunctionName(functionName, utilityFunctions) {
|
|
60
|
+
return this.isUtilityFunctionName(functionName, utilityFunctions);
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
describe('BaseExtractor', () => {
|
|
64
|
+
let extractor;
|
|
65
|
+
const createContext = (code, overrides = {}) => {
|
|
66
|
+
const sourceFile = ts.createSourceFile('test.tsx', code, ts.ScriptTarget.Latest, true, ts.ScriptKind.TSX);
|
|
67
|
+
return {
|
|
68
|
+
typescript: ts,
|
|
69
|
+
sourceFile,
|
|
70
|
+
utilityFunctions: [],
|
|
71
|
+
...overrides
|
|
72
|
+
};
|
|
73
|
+
};
|
|
74
|
+
const findCallExpression = (sourceFile) => {
|
|
75
|
+
let result;
|
|
76
|
+
const visit = (node) => {
|
|
77
|
+
if (ts.isCallExpression(node)) {
|
|
78
|
+
result = node;
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
ts.forEachChild(node, visit);
|
|
82
|
+
};
|
|
83
|
+
visit(sourceFile);
|
|
84
|
+
return result;
|
|
85
|
+
};
|
|
86
|
+
const findStringLiteral = (sourceFile) => {
|
|
87
|
+
let result;
|
|
88
|
+
const visit = (node) => {
|
|
89
|
+
if (ts.isStringLiteral(node)) {
|
|
90
|
+
result = node;
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
ts.forEachChild(node, visit);
|
|
94
|
+
};
|
|
95
|
+
visit(sourceFile);
|
|
96
|
+
return result;
|
|
97
|
+
};
|
|
98
|
+
beforeEach(() => {
|
|
99
|
+
extractor = new TestExtractor();
|
|
100
|
+
});
|
|
101
|
+
describe('extractFromStringLiteral', () => {
|
|
102
|
+
it('should extract single class name', () => {
|
|
103
|
+
const code = 'const x = "flex";';
|
|
104
|
+
const context = createContext(code);
|
|
105
|
+
const literal = findStringLiteral(context.sourceFile);
|
|
106
|
+
const classes = extractor.extract(literal, context);
|
|
107
|
+
expect(classes).toHaveLength(1);
|
|
108
|
+
expect(classes[0].className).toBe('flex');
|
|
109
|
+
});
|
|
110
|
+
it('should extract multiple class names separated by spaces', () => {
|
|
111
|
+
const code = 'const x = "flex items-center justify-between";';
|
|
112
|
+
const context = createContext(code);
|
|
113
|
+
const literal = findStringLiteral(context.sourceFile);
|
|
114
|
+
const classes = extractor.extract(literal, context);
|
|
115
|
+
expect(classes).toHaveLength(3);
|
|
116
|
+
expect(classes.map(c => c.className)).toEqual(['flex', 'items-center', 'justify-between']);
|
|
117
|
+
});
|
|
118
|
+
it('should handle multiple whitespace between classes', () => {
|
|
119
|
+
const code = 'const x = "flex items-center";';
|
|
120
|
+
const context = createContext(code);
|
|
121
|
+
const literal = findStringLiteral(context.sourceFile);
|
|
122
|
+
const classes = extractor.extract(literal, context);
|
|
123
|
+
expect(classes).toHaveLength(2);
|
|
124
|
+
});
|
|
125
|
+
it('should handle newlines in string', () => {
|
|
126
|
+
const code = 'const x = "flex items-center justify-between";';
|
|
127
|
+
const context = createContext(code);
|
|
128
|
+
const literal = findStringLiteral(context.sourceFile);
|
|
129
|
+
const classes = extractor.extract(literal, context);
|
|
130
|
+
expect(classes).toHaveLength(3);
|
|
131
|
+
});
|
|
132
|
+
it('should handle tabs in string', () => {
|
|
133
|
+
const code = 'const x = "flex\titems-center";';
|
|
134
|
+
const context = createContext(code);
|
|
135
|
+
const literal = findStringLiteral(context.sourceFile);
|
|
136
|
+
const classes = extractor.extract(literal, context);
|
|
137
|
+
expect(classes).toHaveLength(2);
|
|
138
|
+
});
|
|
139
|
+
it('should return empty array for empty string', () => {
|
|
140
|
+
const code = 'const x = "";';
|
|
141
|
+
const context = createContext(code);
|
|
142
|
+
const literal = findStringLiteral(context.sourceFile);
|
|
143
|
+
const classes = extractor.extract(literal, context);
|
|
144
|
+
expect(classes).toHaveLength(0);
|
|
145
|
+
});
|
|
146
|
+
it('should return empty array for whitespace-only string', () => {
|
|
147
|
+
const code = 'const x = " ";';
|
|
148
|
+
const context = createContext(code);
|
|
149
|
+
const literal = findStringLiteral(context.sourceFile);
|
|
150
|
+
const classes = extractor.extract(literal, context);
|
|
151
|
+
expect(classes).toHaveLength(0);
|
|
152
|
+
});
|
|
153
|
+
it('should set correct absoluteStart for each class', () => {
|
|
154
|
+
const code = 'const x = "flex items-center";';
|
|
155
|
+
const context = createContext(code);
|
|
156
|
+
const literal = findStringLiteral(context.sourceFile);
|
|
157
|
+
const classes = extractor.extract(literal, context);
|
|
158
|
+
expect(context.sourceFile.text.substring(classes[0].absoluteStart, classes[0].absoluteStart + classes[0].length)).toBe('flex');
|
|
159
|
+
expect(context.sourceFile.text.substring(classes[1].absoluteStart, classes[1].absoluteStart + classes[1].length)).toBe('items-center');
|
|
160
|
+
});
|
|
161
|
+
it('should set correct line number', () => {
|
|
162
|
+
const code = 'const x = "flex";';
|
|
163
|
+
const context = createContext(code);
|
|
164
|
+
const literal = findStringLiteral(context.sourceFile);
|
|
165
|
+
const classes = extractor.extract(literal, context);
|
|
166
|
+
expect(classes[0].line).toBe(1);
|
|
167
|
+
});
|
|
168
|
+
it('should set correct file name', () => {
|
|
169
|
+
const code = 'const x = "flex";';
|
|
170
|
+
const context = createContext(code);
|
|
171
|
+
const literal = findStringLiteral(context.sourceFile);
|
|
172
|
+
const classes = extractor.extract(literal, context);
|
|
173
|
+
expect(classes[0].file).toBe('test.tsx');
|
|
174
|
+
});
|
|
175
|
+
});
|
|
176
|
+
describe('shouldValidateFunctionCall', () => {
|
|
177
|
+
it('should return true for matching simple function name', () => {
|
|
178
|
+
const code = "clsx('flex')";
|
|
179
|
+
const context = createContext(code);
|
|
180
|
+
const callExpr = findCallExpression(context.sourceFile);
|
|
181
|
+
const result = extractor.testShouldValidateFunctionCall(callExpr, ['clsx']);
|
|
182
|
+
expect(result).toBe(true);
|
|
183
|
+
});
|
|
184
|
+
it('should return false for non-matching function name', () => {
|
|
185
|
+
const code = "unknownFn('flex')";
|
|
186
|
+
const context = createContext(code);
|
|
187
|
+
const callExpr = findCallExpression(context.sourceFile);
|
|
188
|
+
const result = extractor.testShouldValidateFunctionCall(callExpr, ['clsx']);
|
|
189
|
+
expect(result).toBe(false);
|
|
190
|
+
});
|
|
191
|
+
it('should return true for utility function with matching import', () => {
|
|
192
|
+
const code = `
|
|
193
|
+
import { clsx } from 'clsx';
|
|
194
|
+
clsx('flex');
|
|
195
|
+
`;
|
|
196
|
+
const context = createContext(code);
|
|
197
|
+
const callExpr = findCallExpression(context.sourceFile);
|
|
198
|
+
const result = extractor.testShouldValidateFunctionCall(callExpr, [{ name: 'clsx', from: 'clsx' }], context);
|
|
199
|
+
expect(result).toBe(true);
|
|
200
|
+
});
|
|
201
|
+
it('should return false for utility function with non-matching import', () => {
|
|
202
|
+
const code = `
|
|
203
|
+
import { clsx } from 'other-package';
|
|
204
|
+
clsx('flex');
|
|
205
|
+
`;
|
|
206
|
+
const context = createContext(code);
|
|
207
|
+
const callExpr = findCallExpression(context.sourceFile);
|
|
208
|
+
const result = extractor.testShouldValidateFunctionCall(callExpr, [{ name: 'clsx', from: 'clsx' }], context);
|
|
209
|
+
expect(result).toBe(false);
|
|
210
|
+
});
|
|
211
|
+
it('should handle aliased imports', () => {
|
|
212
|
+
const code = `
|
|
213
|
+
import { clsx as cx } from 'clsx';
|
|
214
|
+
cx('flex');
|
|
215
|
+
`;
|
|
216
|
+
const context = createContext(code);
|
|
217
|
+
const callExpr = findCallExpression(context.sourceFile);
|
|
218
|
+
const result = extractor.testShouldValidateFunctionCall(callExpr, [{ name: 'cx', from: 'clsx' }], context);
|
|
219
|
+
expect(result).toBe(true);
|
|
220
|
+
});
|
|
221
|
+
it('should handle default imports', () => {
|
|
222
|
+
const code = `
|
|
223
|
+
import clsx from 'clsx';
|
|
224
|
+
clsx('flex');
|
|
225
|
+
`;
|
|
226
|
+
const context = createContext(code);
|
|
227
|
+
const callExpr = findCallExpression(context.sourceFile);
|
|
228
|
+
const result = extractor.testShouldValidateFunctionCall(callExpr, [{ name: 'clsx', from: 'clsx' }], context);
|
|
229
|
+
expect(result).toBe(true);
|
|
230
|
+
});
|
|
231
|
+
it('should handle namespace imports', () => {
|
|
232
|
+
const code = `
|
|
233
|
+
import * as utils from 'clsx';
|
|
234
|
+
utils.clsx('flex');
|
|
235
|
+
`;
|
|
236
|
+
const context = createContext(code);
|
|
237
|
+
const callExpr = findCallExpression(context.sourceFile);
|
|
238
|
+
const result = extractor.testShouldValidateFunctionCall(callExpr, [{ name: 'clsx', from: 'clsx' }], context);
|
|
239
|
+
expect(result).toBe(true);
|
|
240
|
+
});
|
|
241
|
+
it('should handle member expressions with property access', () => {
|
|
242
|
+
const code = `
|
|
243
|
+
import * as lib from 'my-lib';
|
|
244
|
+
lib.cn('flex');
|
|
245
|
+
`;
|
|
246
|
+
const context = createContext(code);
|
|
247
|
+
const callExpr = findCallExpression(context.sourceFile);
|
|
248
|
+
const result = extractor.testShouldValidateFunctionCall(callExpr, [{ name: 'cn', from: 'my-lib' }], context);
|
|
249
|
+
expect(result).toBe(true);
|
|
250
|
+
});
|
|
251
|
+
it('should return true without context when config specifies import', () => {
|
|
252
|
+
const code = "clsx('flex')";
|
|
253
|
+
const context = createContext(code);
|
|
254
|
+
const callExpr = findCallExpression(context.sourceFile);
|
|
255
|
+
const result = extractor.testShouldValidateFunctionCall(callExpr, [{ name: 'clsx', from: 'clsx' }]
|
|
256
|
+
// No context passed
|
|
257
|
+
);
|
|
258
|
+
expect(result).toBe(true);
|
|
259
|
+
});
|
|
260
|
+
it('should handle subpath imports', () => {
|
|
261
|
+
const code = `
|
|
262
|
+
import { tv } from 'tailwind-variants/lite';
|
|
263
|
+
tv('flex');
|
|
264
|
+
`;
|
|
265
|
+
const context = createContext(code);
|
|
266
|
+
const callExpr = findCallExpression(context.sourceFile);
|
|
267
|
+
const result = extractor.testShouldValidateFunctionCall(callExpr, [{ name: 'tv', from: 'tailwind-variants' }], context);
|
|
268
|
+
expect(result).toBe(true);
|
|
269
|
+
});
|
|
270
|
+
});
|
|
271
|
+
describe('isImportedFrom', () => {
|
|
272
|
+
it('should return true for matching named import', () => {
|
|
273
|
+
const code = `
|
|
274
|
+
import { clsx } from 'clsx';
|
|
275
|
+
clsx('flex');
|
|
276
|
+
`;
|
|
277
|
+
const context = createContext(code);
|
|
278
|
+
const result = extractor.testIsImportedFrom('clsx', 'clsx', context);
|
|
279
|
+
expect(result).toBe(true);
|
|
280
|
+
});
|
|
281
|
+
it('should return false for non-existent import', () => {
|
|
282
|
+
const code = `
|
|
283
|
+
import { other } from 'clsx';
|
|
284
|
+
`;
|
|
285
|
+
const context = createContext(code);
|
|
286
|
+
const result = extractor.testIsImportedFrom('clsx', 'clsx', context);
|
|
287
|
+
expect(result).toBe(false);
|
|
288
|
+
});
|
|
289
|
+
it('should return false for wrong module', () => {
|
|
290
|
+
const code = `
|
|
291
|
+
import { clsx } from 'wrong-module';
|
|
292
|
+
`;
|
|
293
|
+
const context = createContext(code);
|
|
294
|
+
const result = extractor.testIsImportedFrom('clsx', 'clsx', context);
|
|
295
|
+
expect(result).toBe(false);
|
|
296
|
+
});
|
|
297
|
+
it('should handle subpath matches', () => {
|
|
298
|
+
const code = `
|
|
299
|
+
import { tv } from 'tailwind-variants/lite';
|
|
300
|
+
`;
|
|
301
|
+
const context = createContext(code);
|
|
302
|
+
const result = extractor.testIsImportedFrom('tv', 'tailwind-variants', context);
|
|
303
|
+
expect(result).toBe(true);
|
|
304
|
+
});
|
|
305
|
+
});
|
|
306
|
+
describe('isNamespaceImportedFrom', () => {
|
|
307
|
+
it('should return true for matching namespace import', () => {
|
|
308
|
+
const code = `
|
|
309
|
+
import * as utils from 'clsx';
|
|
310
|
+
`;
|
|
311
|
+
const context = createContext(code);
|
|
312
|
+
const result = extractor.testIsNamespaceImportedFrom('utils', 'clsx', context);
|
|
313
|
+
expect(result).toBe(true);
|
|
314
|
+
});
|
|
315
|
+
it('should return false for non-existent namespace import', () => {
|
|
316
|
+
const code = `
|
|
317
|
+
import * as other from 'clsx';
|
|
318
|
+
`;
|
|
319
|
+
const context = createContext(code);
|
|
320
|
+
const result = extractor.testIsNamespaceImportedFrom('utils', 'clsx', context);
|
|
321
|
+
expect(result).toBe(false);
|
|
322
|
+
});
|
|
323
|
+
it('should return false for wrong module', () => {
|
|
324
|
+
const code = `
|
|
325
|
+
import * as utils from 'wrong-module';
|
|
326
|
+
`;
|
|
327
|
+
const context = createContext(code);
|
|
328
|
+
const result = extractor.testIsNamespaceImportedFrom('utils', 'clsx', context);
|
|
329
|
+
expect(result).toBe(false);
|
|
330
|
+
});
|
|
331
|
+
it('should handle subpath matches', () => {
|
|
332
|
+
const code = `
|
|
333
|
+
import * as tv from 'tailwind-variants/lite';
|
|
334
|
+
`;
|
|
335
|
+
const context = createContext(code);
|
|
336
|
+
const result = extractor.testIsNamespaceImportedFrom('tv', 'tailwind-variants', context);
|
|
337
|
+
expect(result).toBe(true);
|
|
338
|
+
});
|
|
339
|
+
});
|
|
340
|
+
describe('isUtilityFunctionName', () => {
|
|
341
|
+
it('should return true for matching simple string', () => {
|
|
342
|
+
const result = extractor.testIsUtilityFunctionName('clsx', ['clsx', 'cn']);
|
|
343
|
+
expect(result).toBe(true);
|
|
344
|
+
});
|
|
345
|
+
it('should return true for matching config object', () => {
|
|
346
|
+
const result = extractor.testIsUtilityFunctionName('clsx', [
|
|
347
|
+
{ name: 'clsx', from: 'clsx' },
|
|
348
|
+
{ name: 'cn', from: '@/lib/utils' }
|
|
349
|
+
]);
|
|
350
|
+
expect(result).toBe(true);
|
|
351
|
+
});
|
|
352
|
+
it('should return false for non-matching function name', () => {
|
|
353
|
+
const result = extractor.testIsUtilityFunctionName('unknown', ['clsx', 'cn']);
|
|
354
|
+
expect(result).toBe(false);
|
|
355
|
+
});
|
|
356
|
+
it('should return false for empty array', () => {
|
|
357
|
+
const result = extractor.testIsUtilityFunctionName('clsx', []);
|
|
358
|
+
expect(result).toBe(false);
|
|
359
|
+
});
|
|
360
|
+
});
|
|
361
|
+
describe('import caching', () => {
|
|
362
|
+
it('should cache import mappings', () => {
|
|
363
|
+
const code = `
|
|
364
|
+
import { clsx } from 'clsx';
|
|
365
|
+
clsx('flex');
|
|
366
|
+
`;
|
|
367
|
+
const context = createContext(code);
|
|
368
|
+
// Call twice to test caching
|
|
369
|
+
extractor.testIsImportedFrom('clsx', 'clsx', context);
|
|
370
|
+
const result = extractor.testIsImportedFrom('clsx', 'clsx', context);
|
|
371
|
+
expect(result).toBe(true);
|
|
372
|
+
});
|
|
373
|
+
it('should clear cache when clearImportCache is called', () => {
|
|
374
|
+
const code = `
|
|
375
|
+
import { clsx } from 'clsx';
|
|
376
|
+
`;
|
|
377
|
+
const context = createContext(code);
|
|
378
|
+
extractor.testIsImportedFrom('clsx', 'clsx', context);
|
|
379
|
+
extractor.clearImportCache();
|
|
380
|
+
// Should rebuild cache
|
|
381
|
+
const result = extractor.testIsImportedFrom('clsx', 'clsx', context);
|
|
382
|
+
expect(result).toBe(true);
|
|
383
|
+
});
|
|
384
|
+
});
|
|
385
|
+
describe('edge cases', () => {
|
|
386
|
+
it('should handle imports without import clause', () => {
|
|
387
|
+
const code = `
|
|
388
|
+
import 'side-effect-module';
|
|
389
|
+
`;
|
|
390
|
+
const context = createContext(code);
|
|
391
|
+
const result = extractor.testIsImportedFrom('anything', 'side-effect-module', context);
|
|
392
|
+
expect(result).toBe(false);
|
|
393
|
+
});
|
|
394
|
+
it('should handle non-string module specifiers', () => {
|
|
395
|
+
// This is technically invalid but should not crash
|
|
396
|
+
const code = `
|
|
397
|
+
import { clsx } from 'clsx';
|
|
398
|
+
`;
|
|
399
|
+
const context = createContext(code);
|
|
400
|
+
expect(() => extractor.testIsImportedFrom('clsx', 'clsx', context)).not.toThrow();
|
|
401
|
+
});
|
|
402
|
+
it('should handle mixed import types', () => {
|
|
403
|
+
const code = `
|
|
404
|
+
import defaultExport, { named } from 'module';
|
|
405
|
+
import * as ns from 'other-module';
|
|
406
|
+
`;
|
|
407
|
+
const context = createContext(code);
|
|
408
|
+
expect(extractor.testIsImportedFrom('defaultExport', 'module', context)).toBe(true);
|
|
409
|
+
expect(extractor.testIsImportedFrom('named', 'module', context)).toBe(true);
|
|
410
|
+
expect(extractor.testIsNamespaceImportedFrom('ns', 'other-module', context)).toBe(true);
|
|
411
|
+
});
|
|
412
|
+
it('should handle call expression without identifier', () => {
|
|
413
|
+
const code = "(function() {})('flex')";
|
|
414
|
+
const context = createContext(code);
|
|
415
|
+
const callExpr = findCallExpression(context.sourceFile);
|
|
416
|
+
const result = extractor.testShouldValidateFunctionCall(callExpr, ['clsx']);
|
|
417
|
+
expect(result).toBe(false);
|
|
418
|
+
});
|
|
419
|
+
});
|
|
420
|
+
});
|
|
421
|
+
//# sourceMappingURL=BaseExtractor.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"BaseExtractor.spec.js","sourceRoot":"","sources":["../../src/extractors/BaseExtractor.spec.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"CvaExtractor.spec.d.ts","sourceRoot":"","sources":["../../src/extractors/CvaExtractor.spec.ts"],"names":[],"mappings":""}
|