tailwind-canonical 0.2.1 → 0.3.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.
Files changed (50) hide show
  1. package/README.md +19 -2
  2. package/dist/cli/cli.d.ts +25 -0
  3. package/dist/cli/cli.d.ts.map +1 -0
  4. package/dist/cli/cli.js +319 -0
  5. package/dist/cli/cli.js.map +1 -0
  6. package/dist/cli/index.js +4 -313
  7. package/dist/cli/index.js.map +1 -1
  8. package/dist/core/analyzer.d.ts.map +1 -1
  9. package/dist/core/analyzer.js +4 -0
  10. package/dist/core/analyzer.js.map +1 -1
  11. package/dist/core/class-strings.d.ts +1 -0
  12. package/dist/core/class-strings.d.ts.map +1 -1
  13. package/dist/core/class-strings.js +11 -7
  14. package/dist/core/class-strings.js.map +1 -1
  15. package/dist/core/config.d.ts +4 -0
  16. package/dist/core/config.d.ts.map +1 -0
  17. package/dist/core/config.js +82 -0
  18. package/dist/core/config.js.map +1 -0
  19. package/dist/core/consistency.d.ts +1 -1
  20. package/dist/core/consistency.d.ts.map +1 -1
  21. package/dist/core/consistency.js +14 -5
  22. package/dist/core/consistency.js.map +1 -1
  23. package/dist/core/deduplicator.d.ts.map +1 -1
  24. package/dist/core/deduplicator.js +5 -1
  25. package/dist/core/deduplicator.js.map +1 -1
  26. package/dist/core/fixer.d.ts.map +1 -1
  27. package/dist/core/fixer.js +2 -0
  28. package/dist/core/fixer.js.map +1 -1
  29. package/dist/core/merger.d.ts.map +1 -1
  30. package/dist/core/merger.js +5 -1
  31. package/dist/core/merger.js.map +1 -1
  32. package/dist/core/rules.d.ts.map +1 -1
  33. package/dist/core/rules.js +10 -0
  34. package/dist/core/rules.js.map +1 -1
  35. package/dist/core/sorter.d.ts.map +1 -1
  36. package/dist/core/sorter.js +2 -1
  37. package/dist/core/sorter.js.map +1 -1
  38. package/dist/core/suppressions.d.ts +4 -0
  39. package/dist/core/suppressions.d.ts.map +1 -0
  40. package/dist/core/suppressions.js +38 -0
  41. package/dist/core/suppressions.js.map +1 -0
  42. package/dist/eslint/plugin.d.ts +21 -0
  43. package/dist/eslint/plugin.d.ts.map +1 -1
  44. package/dist/eslint/plugin.js +4 -0
  45. package/dist/eslint/plugin.js.map +1 -1
  46. package/dist/index.d.ts +2 -0
  47. package/dist/index.d.ts.map +1 -1
  48. package/dist/index.js +2 -0
  49. package/dist/index.js.map +1 -1
  50. package/package.json +1 -1
package/README.md CHANGED
@@ -89,6 +89,22 @@ npx tailwind-canonical --fix --reporter json ./src
89
89
  npx tailwind-canonical --reporter sarif ./src > results.sarif
90
90
  ```
91
91
 
92
+ ## Suppression comments
93
+
94
+ Skip specific lines or blocks from check and all transforms (`--fix`, `--dedup`, `--merge`, `--sort`):
95
+
96
+ ```jsx
97
+ {/* tailwind-canonical-disable-next-line */}
98
+ <div className="text-[13px]" /> {/* left untouched */}
99
+
100
+ {/* tailwind-canonical-disable */}
101
+ <div className="text-[13px] p-[7px]" /> {/* whole block untouched */}
102
+ <div className="m-[9px]" />
103
+ {/* tailwind-canonical-enable */}
104
+ ```
105
+
106
+ The pragmas are matched as substrings, so any comment style works (`//`, `/* */`, `{/* */}`).
107
+
92
108
  ## Cross-file consistency (`--analyze`)
93
109
 
94
110
  Detects semantic inconsistencies visible only at project scale — it never modifies files.
@@ -228,7 +244,6 @@ export default {
228
244
  customTextTokens: {
229
245
  10: '3xs',
230
246
  11: '2xs',
231
- 13: 'xxs',
232
247
  },
233
248
  customSpacingTokens: {
234
249
  14: '3.5',
@@ -237,10 +252,12 @@ export default {
237
252
  attributeNames: ['className', 'class', ':class', 'tw'],
238
253
  // Support utility function wrappers
239
254
  functionNames: ['cn', 'clsx', 'cva'],
255
+ // Never suggest replacements for classes matching these patterns
256
+ ignorePatterns: [/^font-/, /-\[var\(/],
240
257
  }
241
258
  ```
242
259
 
243
- `customTextTokens` merges with the built-in text size map. `customSpacingTokens` supplements the default ÷4 spacing logic.
260
+ `customTextTokens` merges with the built-in text size map. `customSpacingTokens` supplements the default ÷4 spacing logic. `ignorePatterns` makes `suggestCanonical` skip matching classes everywhere — CLI, analyzer, and the ESLint plugin.
244
261
 
245
262
  `attributeNames` controls which HTML/JSX attributes are scanned (default: `['className']`). Use `['class']` for plain HTML/PHP/Jinja templates, `[':class']` for Vue, `['tw']` for styled-components.
246
263
 
@@ -0,0 +1,25 @@
1
+ export type Sink = {
2
+ log: (s: string) => void;
3
+ error: (s: string) => void;
4
+ write: (s: string) => void;
5
+ };
6
+ export declare const defaultSink: Sink;
7
+ export type RunResult = {
8
+ exitCode: number;
9
+ watching?: boolean;
10
+ };
11
+ type Reporter = 'text' | 'json' | 'sarif';
12
+ type Flags = {
13
+ fix: boolean;
14
+ merge: boolean;
15
+ dedup: boolean;
16
+ sort: boolean;
17
+ watch: boolean;
18
+ analyze: boolean;
19
+ reporter: Reporter;
20
+ targets: string[];
21
+ };
22
+ export declare function parseArgs(argv: string[]): Flags;
23
+ export declare function run(argv: string[], cwd: string, sink?: Sink): Promise<RunResult>;
24
+ export {};
25
+ //# sourceMappingURL=cli.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.d.ts","sourceRoot":"","sources":["../../src/cli/cli.ts"],"names":[],"mappings":"AAmBA,MAAM,MAAM,IAAI,GAAG;IACjB,GAAG,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IACzB,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;IAC3B,KAAK,EAAE,CAAC,CAAC,EAAE,MAAM,KAAK,IAAI,CAAC;CAC5B,CAAC;AAEF,eAAO,MAAM,WAAW,EAAE,IAIzB,CAAC;AAEF,MAAM,MAAM,SAAS,GAAG;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,QAAQ,CAAC,EAAE,OAAO,CAAA;CAAE,CAAC;AAEjE,KAAK,QAAQ,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,CAAC;AAE1C,KAAK,KAAK,GAAG;IACX,GAAG,EAAE,OAAO,CAAC;IACb,KAAK,EAAE,OAAO,CAAC;IACf,KAAK,EAAE,OAAO,CAAC;IACf,IAAI,EAAE,OAAO,CAAC;IACd,KAAK,EAAE,OAAO,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,QAAQ,CAAC;IACnB,OAAO,EAAE,MAAM,EAAE,CAAC;CACnB,CAAC;AAuBF,wBAAgB,SAAS,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,KAAK,CA2B/C;AAmJD,wBAAsB,GAAG,CACvB,IAAI,EAAE,MAAM,EAAE,EACd,GAAG,EAAE,MAAM,EACX,IAAI,GAAE,IAAkB,GACvB,OAAO,CAAC,SAAS,CAAC,CAgMpB"}
@@ -0,0 +1,319 @@
1
+ import { watch as fsWatch } from 'node:fs';
2
+ import { dirname, resolve } from 'node:path';
3
+ import { analyzeFile } from '../core/analyzer.js';
4
+ import { loadConfig } from '../core/config.js';
5
+ import { analyzeConsistencyFiles } from '../core/consistency.js';
6
+ import { dedupeFile } from '../core/deduplicator.js';
7
+ import { fixFile } from '../core/fixer.js';
8
+ import { mergeFile } from '../core/merger.js';
9
+ import { resolveTargets } from '../core/scanner.js';
10
+ import { sortFile } from '../core/sorter.js';
11
+ const SARIF_SCHEMA = 'https://raw.githubusercontent.com/oasis-tcs/sarif-spec/master/Schemata/sarif-schema-2.1.0.json';
12
+ const USAGE = 'Usage: tailwind-canonical [--fix] [--merge] [--dedup] [--sort] [--analyze] [--watch] [--reporter json|sarif] <dir|file> [dir|file...]';
13
+ export const defaultSink = {
14
+ log: (s) => console.log(s),
15
+ error: (s) => console.error(s),
16
+ write: (s) => process.stdout.write(s),
17
+ };
18
+ function errMsg(e) {
19
+ return e instanceof Error ? e.message : String(e);
20
+ }
21
+ function pluralize(n, word) {
22
+ return `${n} ${word}${n !== 1 ? 's' : ''}`;
23
+ }
24
+ function timestamp() {
25
+ const d = new Date();
26
+ const pad = (n) => n.toString().padStart(2, '0');
27
+ return `[${pad(d.getHours())}:${pad(d.getMinutes())}:${pad(d.getSeconds())}]`;
28
+ }
29
+ export function parseArgs(argv) {
30
+ const reporterIdx = argv.indexOf('--reporter');
31
+ const reporterValue = argv[reporterIdx + 1];
32
+ const reporter = reporterIdx !== -1 &&
33
+ (reporterValue === 'json' || reporterValue === 'sarif')
34
+ ? reporterValue
35
+ : 'text';
36
+ const targets = argv.filter((a, i) => !a.startsWith('--') &&
37
+ argv[i - 1] !== '--reporter' &&
38
+ a !== 'json' &&
39
+ a !== 'sarif');
40
+ return {
41
+ fix: argv.includes('--fix'),
42
+ merge: argv.includes('--merge'),
43
+ dedup: argv.includes('--dedup'),
44
+ sort: argv.includes('--sort'),
45
+ watch: argv.includes('--watch'),
46
+ analyze: argv.includes('--analyze'),
47
+ reporter,
48
+ targets,
49
+ };
50
+ }
51
+ function toClassStringOpts(config) {
52
+ return {
53
+ functionNames: config.functionNames,
54
+ attributeNames: config.attributeNames,
55
+ };
56
+ }
57
+ async function processFile(file, flags, config) {
58
+ const opts = toClassStringOpts(config);
59
+ const counts = { fixed: 0, deduped: 0, merged: 0, sorted: 0 };
60
+ if (flags.fix)
61
+ counts.fixed = fixFile(file, config);
62
+ if (flags.dedup)
63
+ counts.deduped = dedupeFile(file, opts);
64
+ if (flags.merge)
65
+ counts.merged = await mergeFile(file, opts);
66
+ if (flags.sort)
67
+ counts.sorted = sortFile(file, opts, config.sortOrder);
68
+ return counts;
69
+ }
70
+ function totalOf(c) {
71
+ return c.fixed + c.deduped + c.merged + c.sorted;
72
+ }
73
+ function runAnalyze(files, config, reporter, sink) {
74
+ let hadError = false;
75
+ const report = analyzeConsistencyFiles(files, config, {}, (file, err) => {
76
+ hadError = true;
77
+ sink.error(`${file}: ${errMsg(err)}`);
78
+ });
79
+ const issueCount = report.colorVariants.length +
80
+ report.scaleInconsistencies.length +
81
+ report.combinations.length;
82
+ if (reporter === 'json') {
83
+ sink.write(`${JSON.stringify(report, null, 2)}\n`);
84
+ return { exitCode: issueCount > 0 || hadError ? 1 : 0 };
85
+ }
86
+ for (const group of report.colorVariants) {
87
+ const tokens = group.variants
88
+ .map((v) => `${group.property}-${v.token} (${v.count})`)
89
+ .join(', ');
90
+ sink.log(` Warning: ${group.variants.length} ${group.family} color variants used for ${group.property}: ${tokens}`);
91
+ }
92
+ for (const scale of report.scaleInconsistencies) {
93
+ const values = scale.values
94
+ .map((v) => `${scale.property}-${v.value} (${pluralize(v.files.length, 'file')})`)
95
+ .join(' vs ');
96
+ sink.log(` Warning: ${scale.property} inconsistency: ${values}`);
97
+ }
98
+ for (const combo of report.combinations) {
99
+ sink.log(` Pattern: "${combo.classes.join(' ')}" repeated in ${pluralize(combo.files.length, 'file')}`);
100
+ }
101
+ if (issueCount === 0) {
102
+ sink.log('✓ No cross-file inconsistencies found');
103
+ }
104
+ else {
105
+ sink.log(`\n✖ Found ${pluralize(issueCount, 'consistency issue')} across ${pluralize(report.filesAnalyzed, 'file')}`);
106
+ }
107
+ return { exitCode: issueCount > 0 || hadError ? 1 : 0 };
108
+ }
109
+ function startWatch(files, flags, config, sink) {
110
+ const transforming = flags.fix || flags.dedup || flags.merge || flags.sort;
111
+ const fileSet = new Set(files);
112
+ const inFlight = new Set();
113
+ const timers = new Map();
114
+ const dirs = new Set(files.map((f) => dirname(f)));
115
+ sink.log(`Watching ${pluralize(files.length, 'file')}... (Ctrl+C to stop)`);
116
+ for (const dir of dirs) {
117
+ fsWatch(dir, { recursive: true }, (_, filename) => {
118
+ if (!filename)
119
+ return;
120
+ const full = resolve(dir, filename);
121
+ if (!fileSet.has(full) || inFlight.has(full))
122
+ return;
123
+ clearTimeout(timers.get(full));
124
+ timers.set(full, setTimeout(() => {
125
+ if (transforming) {
126
+ inFlight.add(full);
127
+ processFile(full, flags, config)
128
+ .then((counts) => {
129
+ const total = totalOf(counts);
130
+ if (total > 0) {
131
+ sink.log(`${timestamp()} ${full} — ${pluralize(total, 'change')} applied`);
132
+ }
133
+ })
134
+ .catch((err) => {
135
+ sink.error(`${timestamp()} ${full} — error: ${err instanceof Error ? err.message : String(err)}`);
136
+ })
137
+ .finally(() => inFlight.delete(full));
138
+ }
139
+ else {
140
+ const findings = analyzeFile(full, config);
141
+ if (findings.length > 0) {
142
+ sink.log(`${timestamp()} ${full} — ${pluralize(findings.length, 'finding')}`);
143
+ for (const f of findings) {
144
+ const tag = f.suggestion.isCustomToken ? ' [custom token]' : '';
145
+ sink.log(` ${f.line}:${f.col} ${f.suggestion.original} → ${f.suggestion.canonical}${tag}`);
146
+ }
147
+ }
148
+ }
149
+ }, 50));
150
+ });
151
+ }
152
+ process.on('SIGINT', () => {
153
+ sink.log('\nWatcher stopped.');
154
+ process.exit(0);
155
+ });
156
+ return { exitCode: 0, watching: true };
157
+ }
158
+ export async function run(argv, cwd, sink = defaultSink) {
159
+ const flags = parseArgs(argv);
160
+ if (flags.targets.length === 0) {
161
+ sink.error(USAGE);
162
+ return { exitCode: 1 };
163
+ }
164
+ if (flags.merge) {
165
+ try {
166
+ await import('tailwind-merge');
167
+ }
168
+ catch {
169
+ sink.error('--merge requires tailwind-merge: pnpm add -D tailwind-merge');
170
+ return { exitCode: 1 };
171
+ }
172
+ }
173
+ let config;
174
+ try {
175
+ config = await loadConfig(cwd);
176
+ }
177
+ catch (err) {
178
+ sink.error(`tailwind-canonical: ${err instanceof Error ? err.message : String(err)}`);
179
+ return { exitCode: 1 };
180
+ }
181
+ const files = await resolveTargets(flags.targets);
182
+ if (flags.analyze)
183
+ return runAnalyze(files, config, flags.reporter, sink);
184
+ const transforming = flags.fix || flags.dedup || flags.merge || flags.sort;
185
+ const totals = { fixed: 0, deduped: 0, merged: 0, sorted: 0 };
186
+ const allFindings = [];
187
+ const changedFiles = [];
188
+ let hadError = false;
189
+ if (!flags.watch) {
190
+ for (const file of files) {
191
+ try {
192
+ if (transforming) {
193
+ const counts = await processFile(file, flags, config);
194
+ totals.fixed += counts.fixed;
195
+ totals.deduped += counts.deduped;
196
+ totals.merged += counts.merged;
197
+ totals.sorted += counts.sorted;
198
+ if (totalOf(counts) > 0)
199
+ changedFiles.push(file);
200
+ if (flags.reporter === 'text') {
201
+ if (counts.fixed > 0)
202
+ sink.log(` fixed ${file} (${pluralize(counts.fixed, 'replacement')})`);
203
+ if (counts.deduped > 0)
204
+ sink.log(` deduped ${file} (${pluralize(counts.deduped, 'class string')})`);
205
+ if (counts.merged > 0)
206
+ sink.log(` merged ${file} (${pluralize(counts.merged, 'conflict')})`);
207
+ if (counts.sorted > 0)
208
+ sink.log(` sorted ${file} (${pluralize(counts.sorted, 'class string')})`);
209
+ }
210
+ }
211
+ else {
212
+ const findings = analyzeFile(file, config);
213
+ allFindings.push(...findings);
214
+ if (flags.reporter === 'text') {
215
+ for (const f of findings) {
216
+ const tag = f.suggestion.isCustomToken ? ' [custom token]' : '';
217
+ sink.log(` ${f.file}:${f.line}:${f.col} ${f.suggestion.original} → ${f.suggestion.canonical}${tag}`);
218
+ }
219
+ }
220
+ }
221
+ }
222
+ catch (err) {
223
+ hadError = true;
224
+ sink.error(`${file}: ${errMsg(err)}`);
225
+ }
226
+ }
227
+ }
228
+ if (flags.watch)
229
+ return startWatch(files, flags, config, sink);
230
+ if (transforming) {
231
+ if (flags.reporter === 'json') {
232
+ sink.write(`${JSON.stringify({
233
+ files: files.length,
234
+ changedFiles,
235
+ fixed: totals.fixed,
236
+ deduped: totals.deduped,
237
+ merged: totals.merged,
238
+ sorted: totals.sorted,
239
+ }, null, 2)}\n`);
240
+ return { exitCode: hadError ? 1 : 0 };
241
+ }
242
+ const parts = [];
243
+ if (flags.fix)
244
+ parts.push(pluralize(totals.fixed, 'replacement'));
245
+ if (flags.dedup)
246
+ parts.push(pluralize(totals.deduped, 'dedup'));
247
+ if (flags.merge)
248
+ parts.push(`${pluralize(totals.merged, 'conflict')} merged`);
249
+ if (flags.sort)
250
+ parts.push(`${totals.sorted} sorted`);
251
+ sink.log(`\n✓ Fixed ${parts.join(', ')} across ${pluralize(files.length, 'file')}`);
252
+ return { exitCode: hadError ? 1 : 0 };
253
+ }
254
+ const totalFindings = allFindings.length;
255
+ if (flags.reporter === 'json') {
256
+ sink.write(`${JSON.stringify({
257
+ files: files.length,
258
+ total: totalFindings,
259
+ findings: allFindings.map((f) => ({
260
+ file: f.file,
261
+ line: f.line,
262
+ col: f.col,
263
+ original: f.suggestion.original,
264
+ canonical: f.suggestion.canonical,
265
+ isCustomToken: f.suggestion.isCustomToken,
266
+ })),
267
+ }, null, 2)}\n`);
268
+ return { exitCode: totalFindings > 0 || hadError ? 1 : 0 };
269
+ }
270
+ if (flags.reporter === 'sarif') {
271
+ const sarifOutput = {
272
+ $schema: SARIF_SCHEMA,
273
+ version: '2.1.0',
274
+ runs: [
275
+ {
276
+ tool: {
277
+ driver: {
278
+ name: 'tailwind-canonical',
279
+ informationUri: 'https://github.com/peak-lab/tailwind-canonical',
280
+ rules: [
281
+ {
282
+ id: 'no-arbitrary-canonical',
283
+ name: 'NoArbitraryCanonical',
284
+ shortDescription: {
285
+ text: 'Arbitrary value has a canonical Tailwind equivalent',
286
+ },
287
+ },
288
+ ],
289
+ },
290
+ },
291
+ results: allFindings.map((f) => ({
292
+ ruleId: 'no-arbitrary-canonical',
293
+ message: {
294
+ text: `${f.suggestion.original} → ${f.suggestion.canonical}`,
295
+ },
296
+ locations: [
297
+ {
298
+ physicalLocation: {
299
+ artifactLocation: { uri: f.file },
300
+ region: { startLine: f.line, startColumn: f.col },
301
+ },
302
+ },
303
+ ],
304
+ })),
305
+ },
306
+ ],
307
+ };
308
+ sink.write(`${JSON.stringify(sarifOutput, null, 2)}\n`);
309
+ return { exitCode: totalFindings > 0 || hadError ? 1 : 0 };
310
+ }
311
+ if (totalFindings > 0) {
312
+ sink.log(`\n✖ Found ${totalFindings} non-canonical class${totalFindings !== 1 ? 'es' : ''}`);
313
+ sink.log(' Run with --fix to auto-replace\n');
314
+ return { exitCode: 1 };
315
+ }
316
+ sink.log('✓ No non-canonical classes found');
317
+ return { exitCode: hadError ? 1 : 0 };
318
+ }
319
+ //# sourceMappingURL=cli.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"cli.js","sourceRoot":"","sources":["../../src/cli/cli.ts"],"names":[],"mappings":"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"}