@devflow-tools/plugin-tailwind 0.12.6 → 0.13.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/dist/analyzers/new-component.d.ts +16 -0
- package/dist/analyzers/new-component.d.ts.map +1 -0
- package/dist/analyzers/new-component.js +36 -0
- package/dist/analyzers/new-component.js.map +1 -0
- package/dist/analyzers/optimize-classes.d.ts +47 -0
- package/dist/analyzers/optimize-classes.d.ts.map +1 -0
- package/dist/analyzers/optimize-classes.js +91 -0
- package/dist/analyzers/optimize-classes.js.map +1 -0
- package/dist/analyzers/types.d.ts +5 -0
- package/dist/analyzers/types.d.ts.map +1 -0
- package/dist/analyzers/types.js +2 -0
- package/dist/analyzers/types.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +1177 -0
- package/dist/index.js.map +1 -0
- package/package.json +3 -3
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export declare function generateComponent(params: {
|
|
2
|
+
componentName: string;
|
|
3
|
+
variant?: string;
|
|
4
|
+
}): Promise<{
|
|
5
|
+
success: boolean;
|
|
6
|
+
summary: string;
|
|
7
|
+
data: {
|
|
8
|
+
componentName: string;
|
|
9
|
+
variant: string;
|
|
10
|
+
generatedCode: {
|
|
11
|
+
jsx: string;
|
|
12
|
+
};
|
|
13
|
+
suggestion: string;
|
|
14
|
+
};
|
|
15
|
+
}>;
|
|
16
|
+
//# sourceMappingURL=new-component.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"new-component.d.ts","sourceRoot":"","sources":["../../src/analyzers/new-component.ts"],"names":[],"mappings":"AAAA,wBAAsB,iBAAiB,CAAC,MAAM,EAAE;IAC9C,aAAa,EAAE,MAAM,CAAC;IACtB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;;;;;;;;;;;GAqCA"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
export async function generateComponent(params) {
|
|
2
|
+
const name = params.componentName || 'Component';
|
|
3
|
+
const variant = params.variant || 'flex';
|
|
4
|
+
const templates = {
|
|
5
|
+
flex: `<div class="flex items-center justify-between p-4 bg-white rounded-lg shadow-sm">
|
|
6
|
+
<div class="flex items-center gap-3">
|
|
7
|
+
<h3 class="text-lg font-semibold text-gray-900">Title</h3>
|
|
8
|
+
</div>
|
|
9
|
+
</div>`,
|
|
10
|
+
grid: `<div class="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-3 gap-4 p-4">
|
|
11
|
+
<div class="bg-white rounded-lg shadow-sm p-4">Item 1</div>
|
|
12
|
+
<div class="bg-white rounded-lg shadow-sm p-4">Item 2</div>
|
|
13
|
+
<div class="bg-white rounded-lg shadow-sm p-4">Item 3</div>
|
|
14
|
+
</div>`,
|
|
15
|
+
card: `<div class="max-w-sm bg-white rounded-xl shadow-md overflow-hidden">
|
|
16
|
+
<div class="p-6">
|
|
17
|
+
<h3 class="text-xl font-bold text-gray-900 mb-2">Card Title</h3>
|
|
18
|
+
<p class="text-gray-600 text-sm">Card description text.</p>
|
|
19
|
+
</div>
|
|
20
|
+
</div>`,
|
|
21
|
+
};
|
|
22
|
+
const templateContent = templates[variant] || templates.flex;
|
|
23
|
+
return {
|
|
24
|
+
success: true,
|
|
25
|
+
summary: `生成 Tailwind ${variant} 组件 ${name}`,
|
|
26
|
+
data: {
|
|
27
|
+
componentName: name,
|
|
28
|
+
variant,
|
|
29
|
+
generatedCode: {
|
|
30
|
+
jsx: templateContent,
|
|
31
|
+
},
|
|
32
|
+
suggestion: `Tailwind ${variant} component — adjust classes for your design system`,
|
|
33
|
+
},
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=new-component.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"new-component.js","sourceRoot":"","sources":["../../src/analyzers/new-component.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAGvC;IACC,MAAM,IAAI,GAAG,MAAM,CAAC,aAAa,IAAI,WAAW,CAAC;IACjD,MAAM,OAAO,GAAG,MAAM,CAAC,OAAO,IAAI,MAAM,CAAC;IAEzC,MAAM,SAAS,GAA2B;QACxC,IAAI,EAAE;;;;OAIH;QACH,IAAI,EAAE;;;;OAIH;QACH,IAAI,EAAE;;;;;OAKH;KACJ,CAAC;IAEF,MAAM,eAAe,GAAG,SAAS,CAAC,OAAO,CAAC,IAAI,SAAS,CAAC,IAAI,CAAC;IAE7D,OAAO;QACL,OAAO,EAAE,IAAI;QACb,OAAO,EAAE,eAAe,OAAO,OAAO,IAAI,EAAE;QAC5C,IAAI,EAAE;YACJ,aAAa,EAAE,IAAI;YACnB,OAAO;YACP,aAAa,EAAE;gBACb,GAAG,EAAE,eAAe;aACrB;YACD,UAAU,EAAE,YAAY,OAAO,oDAAoD;SACpF;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
export declare function optimizeClasses(params: {
|
|
2
|
+
filePath: string;
|
|
3
|
+
projectRoot?: string;
|
|
4
|
+
}): Promise<{
|
|
5
|
+
success: boolean;
|
|
6
|
+
summary: string;
|
|
7
|
+
error: string;
|
|
8
|
+
data: {
|
|
9
|
+
file: string;
|
|
10
|
+
suggestions: never[];
|
|
11
|
+
classCount: number;
|
|
12
|
+
status?: undefined;
|
|
13
|
+
classList?: undefined;
|
|
14
|
+
};
|
|
15
|
+
findings?: undefined;
|
|
16
|
+
} | {
|
|
17
|
+
success: boolean;
|
|
18
|
+
summary: string;
|
|
19
|
+
data: {
|
|
20
|
+
file: string;
|
|
21
|
+
suggestions: string[];
|
|
22
|
+
classCount: number;
|
|
23
|
+
status: string;
|
|
24
|
+
classList?: undefined;
|
|
25
|
+
};
|
|
26
|
+
error?: undefined;
|
|
27
|
+
findings?: undefined;
|
|
28
|
+
} | {
|
|
29
|
+
success: boolean;
|
|
30
|
+
summary: string;
|
|
31
|
+
findings: {
|
|
32
|
+
severity: "suggestion";
|
|
33
|
+
category: string;
|
|
34
|
+
title: string;
|
|
35
|
+
description: string;
|
|
36
|
+
file: string;
|
|
37
|
+
}[];
|
|
38
|
+
data: {
|
|
39
|
+
file: string;
|
|
40
|
+
suggestions: string[];
|
|
41
|
+
classCount: number;
|
|
42
|
+
classList: string[];
|
|
43
|
+
status: string;
|
|
44
|
+
};
|
|
45
|
+
error?: undefined;
|
|
46
|
+
}>;
|
|
47
|
+
//# sourceMappingURL=optimize-classes.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimize-classes.d.ts","sourceRoot":"","sources":["../../src/analyzers/optimize-classes.ts"],"names":[],"mappings":"AAAA,wBAAsB,eAAe,CAAC,MAAM,EAAE;IAC5C,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAoGA"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
export async function optimizeClasses(params) {
|
|
2
|
+
const { existsSync, readFileSync } = await import('fs');
|
|
3
|
+
const { extname, join } = await import('path');
|
|
4
|
+
const root = params.projectRoot || process.cwd();
|
|
5
|
+
const targetFile = params.filePath.startsWith('/') ? params.filePath : join(root, params.filePath);
|
|
6
|
+
if (!existsSync(targetFile)) {
|
|
7
|
+
return {
|
|
8
|
+
success: false,
|
|
9
|
+
summary: `${params.filePath} 不存在`,
|
|
10
|
+
error: 'File not found',
|
|
11
|
+
data: { file: params.filePath, suggestions: [], classCount: 0 },
|
|
12
|
+
};
|
|
13
|
+
}
|
|
14
|
+
const content = readFileSync(targetFile, 'utf-8');
|
|
15
|
+
const classNames = [];
|
|
16
|
+
// Extract from className="..." (static)
|
|
17
|
+
const stringMatches = content.match(/className="([^"]*)"/g) || [];
|
|
18
|
+
for (const m of stringMatches) {
|
|
19
|
+
const inner = m.match(/"([^"]*)"/)?.[1];
|
|
20
|
+
if (inner) {
|
|
21
|
+
const classes = inner.split(/\s+/).filter(Boolean);
|
|
22
|
+
classNames.push(...classes);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
// Extract from className={'...'} or className={`...`} (dynamic)
|
|
26
|
+
const exprMatches = content.match(/className=\{['`]([^'`]+)['`]\}/g) || [];
|
|
27
|
+
for (const m of exprMatches) {
|
|
28
|
+
const inner = m.match(/\{['`](.+?)['`]\}/)?.[1];
|
|
29
|
+
if (inner) {
|
|
30
|
+
const classes = inner.split(/\s+/).filter(Boolean);
|
|
31
|
+
classNames.push(...classes);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
const suggestions = [];
|
|
35
|
+
const classCount = classNames.length;
|
|
36
|
+
if (classCount === 0) {
|
|
37
|
+
suggestions.push("No Tailwind classes detected in className attributes");
|
|
38
|
+
return {
|
|
39
|
+
success: true,
|
|
40
|
+
summary: `${params.filePath} 未检测到 Tailwind 类名`,
|
|
41
|
+
data: { file: params.filePath, suggestions, classCount: 0, status: 'no classes found' },
|
|
42
|
+
};
|
|
43
|
+
}
|
|
44
|
+
// Detect repeated class combinations
|
|
45
|
+
const comboStr = classNames.join('|');
|
|
46
|
+
const combos = new Map();
|
|
47
|
+
for (let i = 0; i < classNames.length - 2; i++) {
|
|
48
|
+
const combo = classNames.slice(i, i + 3).join(' ');
|
|
49
|
+
if (combo.length > 5) {
|
|
50
|
+
combos.set(combo, (combos.get(combo) ?? 0) + 1);
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
const repeated = [...combos.entries()].filter(([, count]) => count >= 2);
|
|
54
|
+
if (repeated.length > 0) {
|
|
55
|
+
suggestions.push(`Found ${repeated.length} repeated class combos — use @apply in CSS for reuse`);
|
|
56
|
+
}
|
|
57
|
+
// Detect long class strings (>10 classes)
|
|
58
|
+
const longLines = classNames.filter(c => c.split(/\s+/).length > 10);
|
|
59
|
+
if (classNames.length > 0 && classNames.filter(c => c.includes(':')).length > classNames.length * 0.5) {
|
|
60
|
+
suggestions.push("High ratio of responsive/variant classes — consider extracting to component variants");
|
|
61
|
+
}
|
|
62
|
+
// Detect arbitrary values
|
|
63
|
+
const arbitraryCount = classNames.filter(c => /\[.*\]/.test(c)).length;
|
|
64
|
+
if (arbitraryCount > 0) {
|
|
65
|
+
suggestions.push(`${arbitraryCount} arbitrary value(s) detected — prefer config tokens when possible`);
|
|
66
|
+
}
|
|
67
|
+
if (suggestions.length === 0) {
|
|
68
|
+
suggestions.push("Classes look clean — no issues detected");
|
|
69
|
+
}
|
|
70
|
+
return {
|
|
71
|
+
success: true,
|
|
72
|
+
summary: `优化 ${params.filePath} 的 Tailwind 类名,生成 ${suggestions.length} 条建议`,
|
|
73
|
+
findings: suggestions
|
|
74
|
+
.filter((suggestion) => !suggestion.includes('clean'))
|
|
75
|
+
.map((suggestion) => ({
|
|
76
|
+
severity: 'suggestion',
|
|
77
|
+
category: 'tailwind-class-optimization',
|
|
78
|
+
title: suggestion,
|
|
79
|
+
description: suggestion,
|
|
80
|
+
file: params.filePath,
|
|
81
|
+
})),
|
|
82
|
+
data: {
|
|
83
|
+
file: params.filePath,
|
|
84
|
+
suggestions,
|
|
85
|
+
classCount,
|
|
86
|
+
classList: classNames.slice(0, 50),
|
|
87
|
+
status: suggestions.length === 1 && suggestions[0]?.includes('clean') ? 'clean' : 'needs review',
|
|
88
|
+
},
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=optimize-classes.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"optimize-classes.js","sourceRoot":"","sources":["../../src/analyzers/optimize-classes.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../src/analyzers/types.ts"],"names":[],"mappings":"AAAA,MAAM,WAAW,cAAc;IAC7B,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/analyzers/types.ts"],"names":[],"mappings":""}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAYxD,eAAO,MAAM,cAAc,EAAE,aAspC5B,CAAC"}
|