tailwind-typescript-plugin 0.0.2-beta.5 → 0.0.2-beta.6
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/README.md +17 -0
- package/lib/infrastructure/TailwindValidator.css-vars.spec.d.ts +2 -0
- package/lib/infrastructure/TailwindValidator.css-vars.spec.d.ts.map +1 -0
- package/lib/infrastructure/TailwindValidator.css-vars.spec.js +87 -0
- package/lib/infrastructure/TailwindValidator.css-vars.spec.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -198,6 +198,19 @@ Most editors that support TypeScript Language Service plugins should work automa
|
|
|
198
198
|
<p className="p-[20px] text-[14px]">Custom values</p>
|
|
199
199
|
</div>
|
|
200
200
|
|
|
201
|
+
// ✅ CSS variables (Tailwind v3.1+)
|
|
202
|
+
<div
|
|
203
|
+
className="
|
|
204
|
+
[--card-bg:#1e293b]
|
|
205
|
+
[--card-radius:16px]
|
|
206
|
+
bg-[var(--card-bg)]
|
|
207
|
+
rounded-[var(--card-radius)]
|
|
208
|
+
p-4
|
|
209
|
+
"
|
|
210
|
+
>
|
|
211
|
+
CSS custom properties
|
|
212
|
+
</div>
|
|
213
|
+
|
|
201
214
|
// ✅ Variants (responsive, state, etc.)
|
|
202
215
|
<div className="hover:bg-blue-500 md:flex lg:grid-cols-3 dark:text-white">
|
|
203
216
|
Responsive and state variants
|
|
@@ -474,6 +487,10 @@ const invalidVariant = cva(['font-semibold'], {
|
|
|
474
487
|
Validates parenthesized expressions and type assertions
|
|
475
488
|
Example: `className={(isError ? 'bg-red-500' : 'bg-blue-500')}`, `className={('flex' as string)}`, `className={expr!}`
|
|
476
489
|
|
|
490
|
+
- [X] **CSS Variables** → [`css-variables.tsx`](./example/src/css-variables.tsx)
|
|
491
|
+
Validates CSS custom properties (variables) using arbitrary property syntax
|
|
492
|
+
Example: `className="[--card-bg:#1e293b] bg-[var(--card-bg)]"`
|
|
493
|
+
|
|
477
494
|
- [ ] **Expression Variable**
|
|
478
495
|
Validates variable references
|
|
479
496
|
Example: `const dynamicClass = isActive ? 'bg-blue-500' : 'bg-gray-500'; <div className={dynamicClass}>Dynamic</div>`
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TailwindValidator.css-vars.spec.d.ts","sourceRoot":"","sources":["../../src/infrastructure/TailwindValidator.css-vars.spec.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
+
};
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
const fs_1 = __importDefault(require("fs"));
|
|
7
|
+
const os_1 = __importDefault(require("os"));
|
|
8
|
+
const path_1 = __importDefault(require("path"));
|
|
9
|
+
const TailwindValidator_1 = require("./TailwindValidator");
|
|
10
|
+
// Mock logger for testing
|
|
11
|
+
class MockLogger {
|
|
12
|
+
// eslint-disable-next-line @typescript-eslint/no-unused-vars
|
|
13
|
+
log(_message) {
|
|
14
|
+
// Silent during tests
|
|
15
|
+
}
|
|
16
|
+
}
|
|
17
|
+
describe('TailwindValidator - CSS Variables', () => {
|
|
18
|
+
let validator;
|
|
19
|
+
let tempCssFile;
|
|
20
|
+
beforeAll(async () => {
|
|
21
|
+
// Create a temporary CSS file for testing
|
|
22
|
+
const tempDir = fs_1.default.mkdtempSync(path_1.default.join(os_1.default.tmpdir(), 'tailwind-test-'));
|
|
23
|
+
tempCssFile = path_1.default.join(tempDir, 'global.css');
|
|
24
|
+
fs_1.default.writeFileSync(tempCssFile, '@import "tailwindcss";');
|
|
25
|
+
validator = new TailwindValidator_1.TailwindValidator(tempCssFile, new MockLogger());
|
|
26
|
+
await validator.initialize();
|
|
27
|
+
});
|
|
28
|
+
describe('CSS variable definitions', () => {
|
|
29
|
+
it('should validate CSS variable definition with color', () => {
|
|
30
|
+
expect(validator.isValidClass('[--card-bg:#1e293b]')).toBe(true);
|
|
31
|
+
});
|
|
32
|
+
it('should validate CSS variable definition with size', () => {
|
|
33
|
+
expect(validator.isValidClass('[--card-radius:16px]')).toBe(true);
|
|
34
|
+
});
|
|
35
|
+
it('should validate CSS variable definition with arbitrary name', () => {
|
|
36
|
+
expect(validator.isValidClass('[--my-custom-var:#ff0000]')).toBe(true);
|
|
37
|
+
});
|
|
38
|
+
it('should validate multiple CSS variable definitions', () => {
|
|
39
|
+
expect(validator.isValidClass('[--color-primary:#3b82f6]')).toBe(true);
|
|
40
|
+
expect(validator.isValidClass('[--color-secondary:#8b5cf6]')).toBe(true);
|
|
41
|
+
expect(validator.isValidClass('[--spacing:1rem]')).toBe(true);
|
|
42
|
+
});
|
|
43
|
+
});
|
|
44
|
+
describe('CSS variable usage', () => {
|
|
45
|
+
it('should validate var() in background color', () => {
|
|
46
|
+
expect(validator.isValidClass('bg-[var(--card-bg)]')).toBe(true);
|
|
47
|
+
});
|
|
48
|
+
it('should validate var() in border radius', () => {
|
|
49
|
+
expect(validator.isValidClass('rounded-[var(--card-radius)]')).toBe(true);
|
|
50
|
+
});
|
|
51
|
+
it('should validate var() in text color', () => {
|
|
52
|
+
expect(validator.isValidClass('text-[var(--my-color)]')).toBe(true);
|
|
53
|
+
});
|
|
54
|
+
it('should validate var() in width', () => {
|
|
55
|
+
expect(validator.isValidClass('w-[var(--my-size)]')).toBe(true);
|
|
56
|
+
});
|
|
57
|
+
it('should validate var() in height', () => {
|
|
58
|
+
expect(validator.isValidClass('h-[var(--my-size)]')).toBe(true);
|
|
59
|
+
});
|
|
60
|
+
});
|
|
61
|
+
describe('combined CSS variables', () => {
|
|
62
|
+
it('should validate all classes from user example', () => {
|
|
63
|
+
const classes = [
|
|
64
|
+
'[--card-bg:#1e293b]',
|
|
65
|
+
'[--card-radius:16px]',
|
|
66
|
+
'bg-[var(--card-bg)]',
|
|
67
|
+
'rounded-[var(--card-radius)]',
|
|
68
|
+
'p-4'
|
|
69
|
+
];
|
|
70
|
+
classes.forEach(className => {
|
|
71
|
+
expect(validator.isValidClass(className)).toBe(true);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
it('should have no invalid classes in combined example', () => {
|
|
75
|
+
const classes = [
|
|
76
|
+
'[--card-bg:#1e293b]',
|
|
77
|
+
'[--card-radius:16px]',
|
|
78
|
+
'bg-[var(--card-bg)]',
|
|
79
|
+
'rounded-[var(--card-radius)]',
|
|
80
|
+
'p-4'
|
|
81
|
+
];
|
|
82
|
+
const invalid = validator.getInvalidClasses(classes);
|
|
83
|
+
expect(invalid).toEqual([]);
|
|
84
|
+
});
|
|
85
|
+
});
|
|
86
|
+
});
|
|
87
|
+
//# sourceMappingURL=TailwindValidator.css-vars.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"TailwindValidator.css-vars.spec.js","sourceRoot":"","sources":["../../src/infrastructure/TailwindValidator.css-vars.spec.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "tailwind-typescript-plugin",
|
|
3
|
-
"version": "0.0.2-beta.
|
|
3
|
+
"version": "0.0.2-beta.6",
|
|
4
4
|
"description": "TypeScript Language Service plugin that validates Tailwind CSS class names in JSX/TSX files. Catches typos and invalid classes in real-time with support for tailwind-variants and class-variance-authority.",
|
|
5
5
|
"main": "lib/index.js",
|
|
6
6
|
"types": "lib/index.d.ts",
|