@devflow-tools/plugin-tailwind 0.10.0 → 0.12.0

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.
@@ -1 +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;CAClB,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CAmB9D"}
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;CAClB,GAAG,OAAO,CAAC;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC,CA4F9D"}
@@ -1,18 +1,81 @@
1
1
  export async function optimizeClasses(params) {
2
- const suggestions = [
3
- "Use @apply in CSS for repeated class combinations",
4
- "Consider extracting common patterns to component variants",
5
- "Use arbitrary values (e.g. w-[300px]) sparingly — prefer config tokens",
6
- "Group responsive classes together for readability",
7
- ];
2
+ const { existsSync, readFileSync } = await import('fs');
3
+ const { extname, join } = await import('path');
4
+ const targetFile = params.filePath.startsWith('/') ? params.filePath : join(process.cwd(), params.filePath);
5
+ if (!existsSync(targetFile)) {
6
+ return {
7
+ content: [{
8
+ type: "text",
9
+ text: JSON.stringify({ file: params.filePath, error: "File not found", suggestions: [], classCount: 0 }, null, 2),
10
+ }],
11
+ };
12
+ }
13
+ const content = readFileSync(targetFile, 'utf-8');
14
+ const classNames = [];
15
+ // Extract from className="..." (static)
16
+ const stringMatches = content.match(/className="([^"]*)"/g) || [];
17
+ for (const m of stringMatches) {
18
+ const inner = m.match(/"([^"]*)"/)?.[1];
19
+ if (inner) {
20
+ const classes = inner.split(/\s+/).filter(Boolean);
21
+ classNames.push(...classes);
22
+ }
23
+ }
24
+ // Extract from className={'...'} or className={`...`} (dynamic)
25
+ const exprMatches = content.match(/className=\{['`]([^'`]+)['`]\}/g) || [];
26
+ for (const m of exprMatches) {
27
+ const inner = m.match(/\{['`](.+?)['`]\}/)?.[1];
28
+ if (inner) {
29
+ const classes = inner.split(/\s+/).filter(Boolean);
30
+ classNames.push(...classes);
31
+ }
32
+ }
33
+ const suggestions = [];
34
+ const classCount = classNames.length;
35
+ if (classCount === 0) {
36
+ suggestions.push("No Tailwind classes detected in className attributes");
37
+ return {
38
+ content: [{
39
+ type: "text",
40
+ text: JSON.stringify({ file: params.filePath, suggestions, classCount: 0, status: "no classes found" }, null, 2),
41
+ }],
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
+ }
8
70
  return {
9
71
  content: [{
10
72
  type: "text",
11
73
  text: JSON.stringify({
12
74
  file: params.filePath,
13
75
  suggestions,
14
- classCount: 0,
15
- status: "File analysis requires project context — run in project root",
76
+ classCount,
77
+ classList: classNames.slice(0, 50),
78
+ status: suggestions.length === 1 && suggestions[0]?.includes('clean') ? 'clean' : 'needs review',
16
79
  }, null, 2),
17
80
  }],
18
81
  };
@@ -1 +1 @@
1
- {"version":3,"file":"optimize-classes.js","sourceRoot":"","sources":["../../src/analyzers/optimize-classes.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,KAAK,UAAU,eAAe,CAAC,MAErC;IACC,MAAM,WAAW,GAAG;QAClB,mDAAmD;QACnD,2DAA2D;QAC3D,wEAAwE;QACxE,mDAAmD;KACpD,CAAC;IAEF,OAAO;QACL,OAAO,EAAE,CAAC;gBACR,IAAI,EAAE,MAAM;gBACZ,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;oBACnB,IAAI,EAAE,MAAM,CAAC,QAAQ;oBACrB,WAAW;oBACX,UAAU,EAAE,CAAC;oBACb,MAAM,EAAE,8DAA8D;iBACvE,EAAE,IAAI,EAAE,CAAC,CAAC;aACZ,CAAC;KACH,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"optimize-classes.js","sourceRoot":"","sources":["../../src/analyzers/optimize-classes.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@devflow-tools/plugin-tailwind",
3
- "version": "0.10.0",
3
+ "version": "0.12.0",
4
4
  "type": "module",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",
@@ -26,5 +26,5 @@
26
26
  "files": [
27
27
  "dist"
28
28
  ],
29
- "gitHead": "20444d2631e3d77c3b3a4c3afd9398b21d888a4f"
29
+ "gitHead": "b7b5606e419887fe8c1f921a8a5a564ce9afcbac"
30
30
  }