@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.
@@ -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,5 @@
1
+ export interface ProjectContext {
2
+ projectRoot: string;
3
+ files: string[];
4
+ }
5
+ //# sourceMappingURL=types.d.ts.map
@@ -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,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../src/analyzers/types.ts"],"names":[],"mappings":""}
@@ -0,0 +1,3 @@
1
+ import type { DevFlowPlugin } from "@devflow-tools/sdk";
2
+ export declare const tailwindPlugin: DevFlowPlugin;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -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"}