tailwind-canonical 0.1.3 → 0.2.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 (42) hide show
  1. package/README.md +252 -23
  2. package/dist/cli/index.js +253 -23
  3. package/dist/cli/index.js.map +1 -1
  4. package/dist/core/analyzer.d.ts.map +1 -1
  5. package/dist/core/analyzer.js +17 -11
  6. package/dist/core/analyzer.js.map +1 -1
  7. package/dist/core/class-strings.d.ts +14 -0
  8. package/dist/core/class-strings.d.ts.map +1 -0
  9. package/dist/core/class-strings.js +127 -0
  10. package/dist/core/class-strings.js.map +1 -0
  11. package/dist/core/consistency.d.ts +46 -0
  12. package/dist/core/consistency.d.ts.map +1 -0
  13. package/dist/core/consistency.js +252 -0
  14. package/dist/core/consistency.js.map +1 -0
  15. package/dist/core/deduplicator.d.ts +2 -1
  16. package/dist/core/deduplicator.d.ts.map +1 -1
  17. package/dist/core/deduplicator.js +341 -75
  18. package/dist/core/deduplicator.js.map +1 -1
  19. package/dist/core/fixer.d.ts.map +1 -1
  20. package/dist/core/fixer.js +14 -18
  21. package/dist/core/fixer.js.map +1 -1
  22. package/dist/core/merger.d.ts +2 -1
  23. package/dist/core/merger.d.ts.map +1 -1
  24. package/dist/core/merger.js +5 -14
  25. package/dist/core/merger.js.map +1 -1
  26. package/dist/core/rules.d.ts +4 -0
  27. package/dist/core/rules.d.ts.map +1 -1
  28. package/dist/core/rules.js +43 -55
  29. package/dist/core/rules.js.map +1 -1
  30. package/dist/core/scanner.d.ts +2 -1
  31. package/dist/core/scanner.d.ts.map +1 -1
  32. package/dist/core/scanner.js +105 -6
  33. package/dist/core/scanner.js.map +1 -1
  34. package/dist/core/sorter.d.ts +6 -0
  35. package/dist/core/sorter.d.ts.map +1 -0
  36. package/dist/core/sorter.js +166 -0
  37. package/dist/core/sorter.js.map +1 -0
  38. package/dist/index.d.ts +7 -1
  39. package/dist/index.d.ts.map +1 -1
  40. package/dist/index.js +4 -1
  41. package/dist/index.js.map +1 -1
  42. package/package.json +5 -3
@@ -1,4 +1,5 @@
1
1
  import { readFileSync, writeFileSync } from 'node:fs';
2
+ import { replaceClassStrings } from './class-strings.js';
2
3
  const DISPLAY_GROUP = new Set([
3
4
  'block',
4
5
  'inline-block',
@@ -29,84 +30,336 @@ const POSITION_GROUP = new Set([
29
30
  'relative',
30
31
  'sticky',
31
32
  ]);
32
- function expandSpacing(prefix, suffix) {
33
- if (prefix === 'p' || prefix === 'm')
34
- return { t: suffix, b: suffix, l: suffix, r: suffix };
35
- if (prefix === 'px' || prefix === 'mx')
36
- return { l: suffix, r: suffix };
37
- if (prefix === 'py' || prefix === 'my')
38
- return { t: suffix, b: suffix };
39
- if (prefix === 'pt' || prefix === 'mt')
40
- return { t: suffix };
41
- if (prefix === 'pb' || prefix === 'mb')
42
- return { b: suffix };
43
- if (prefix === 'pl' || prefix === 'ml')
44
- return { l: suffix };
45
- if (prefix === 'pr' || prefix === 'mr')
46
- return { r: suffix };
33
+ const SIDE_MAP = {
34
+ p: ['t', 'b', 'l', 'r'],
35
+ m: ['t', 'b', 'l', 'r'],
36
+ border: ['t', 'b', 'l', 'r'],
37
+ inset: ['t', 'b', 'l', 'r'],
38
+ gap: ['t', 'b', 'l', 'r'],
39
+ 'scroll-p': ['t', 'b', 'l', 'r'],
40
+ 'scroll-m': ['t', 'b', 'l', 'r'],
41
+ px: ['l', 'r'],
42
+ mx: ['l', 'r'],
43
+ 'border-x': ['l', 'r'],
44
+ 'inset-x': ['l', 'r'],
45
+ 'gap-x': ['l', 'r'],
46
+ 'scroll-px': ['l', 'r'],
47
+ 'scroll-mx': ['l', 'r'],
48
+ py: ['t', 'b'],
49
+ my: ['t', 'b'],
50
+ 'border-y': ['t', 'b'],
51
+ 'inset-y': ['t', 'b'],
52
+ 'gap-y': ['t', 'b'],
53
+ 'scroll-py': ['t', 'b'],
54
+ 'scroll-my': ['t', 'b'],
55
+ pt: ['t'],
56
+ mt: ['t'],
57
+ 'border-t': ['t'],
58
+ top: ['t'],
59
+ 'scroll-pt': ['t'],
60
+ 'scroll-mt': ['t'],
61
+ pb: ['b'],
62
+ mb: ['b'],
63
+ 'border-b': ['b'],
64
+ bottom: ['b'],
65
+ 'scroll-pb': ['b'],
66
+ 'scroll-mb': ['b'],
67
+ pl: ['l'],
68
+ ml: ['l'],
69
+ 'border-l': ['l'],
70
+ left: ['l'],
71
+ 'scroll-pl': ['l'],
72
+ 'scroll-ml': ['l'],
73
+ pr: ['r'],
74
+ mr: ['r'],
75
+ 'border-r': ['r'],
76
+ right: ['r'],
77
+ 'scroll-pr': ['r'],
78
+ 'scroll-mr': ['r'],
79
+ };
80
+ const FAMILIES = [
81
+ {
82
+ kind: 'p',
83
+ full: 'p',
84
+ x: 'px',
85
+ y: 'py',
86
+ t: 'pt',
87
+ b: 'pb',
88
+ l: 'pl',
89
+ r: 'pr',
90
+ regex: /^(p|px|py|pt|pb|pl|pr)-(.+)$/,
91
+ },
92
+ {
93
+ kind: 'm',
94
+ full: 'm',
95
+ x: 'mx',
96
+ y: 'my',
97
+ t: 'mt',
98
+ b: 'mb',
99
+ l: 'ml',
100
+ r: 'mr',
101
+ regex: /^(m|mx|my|mt|mb|ml|mr)-(.+)$/,
102
+ },
103
+ {
104
+ kind: 'border-width',
105
+ full: 'border',
106
+ x: 'border-x',
107
+ y: 'border-y',
108
+ t: 'border-t',
109
+ b: 'border-b',
110
+ l: 'border-l',
111
+ r: 'border-r',
112
+ regex: /^(border|border-x|border-y|border-t|border-b|border-l|border-r)-(\d.*)$/,
113
+ },
114
+ {
115
+ kind: 'inset',
116
+ full: 'inset',
117
+ x: 'inset-x',
118
+ y: 'inset-y',
119
+ t: 'top',
120
+ b: 'bottom',
121
+ l: 'left',
122
+ r: 'right',
123
+ regex: /^(inset-x|inset-y|inset|top|bottom|left|right)-(.+)$/,
124
+ },
125
+ {
126
+ kind: 'gap',
127
+ full: 'gap',
128
+ x: 'gap-x',
129
+ y: 'gap-y',
130
+ t: 'gap-y',
131
+ b: 'gap-y',
132
+ l: 'gap-x',
133
+ r: 'gap-x',
134
+ regex: /^(gap-x|gap-y|gap)-(.+)$/,
135
+ },
136
+ {
137
+ kind: 'scroll-p',
138
+ full: 'scroll-p',
139
+ x: 'scroll-px',
140
+ y: 'scroll-py',
141
+ t: 'scroll-pt',
142
+ b: 'scroll-pb',
143
+ l: 'scroll-pl',
144
+ r: 'scroll-pr',
145
+ regex: /^(scroll-p|scroll-px|scroll-py|scroll-pt|scroll-pb|scroll-pl|scroll-pr)-(.+)$/,
146
+ },
147
+ {
148
+ kind: 'scroll-m',
149
+ full: 'scroll-m',
150
+ x: 'scroll-mx',
151
+ y: 'scroll-my',
152
+ t: 'scroll-mt',
153
+ b: 'scroll-mb',
154
+ l: 'scroll-ml',
155
+ r: 'scroll-mr',
156
+ regex: /^(scroll-m|scroll-mx|scroll-my|scroll-mt|scroll-mb|scroll-ml|scroll-mr)-(.+)$/,
157
+ },
158
+ ];
159
+ function parseBoxClass(cls) {
160
+ for (const family of FAMILIES) {
161
+ const m = cls.match(family.regex);
162
+ if (!m)
163
+ continue;
164
+ const sides = {};
165
+ for (const side of SIDE_MAP[m[1]] ?? [])
166
+ sides[side] = m[2];
167
+ return { family, sides };
168
+ }
47
169
  return null;
48
170
  }
49
- function collapseBox(box, kind) {
171
+ function collapseBox(box, f) {
50
172
  const { t, b, l, r } = box;
173
+ const fmt = (pfx, val) => `${pfx}-${val}`;
51
174
  if (t && b && l && r) {
52
175
  if (t === b && b === l && l === r)
53
- return `${kind}-${t}`;
176
+ return fmt(f.full, t);
54
177
  if (t === b && l === r)
55
- return `${kind}y-${t} ${kind}x-${l}`;
178
+ return `${fmt(f.y, t)} ${fmt(f.x, l)}`;
56
179
  if (l === r)
57
- return `${kind}x-${l} ${kind}t-${t} ${kind}b-${b}`;
180
+ return `${fmt(f.x, l)} ${fmt(f.t, t)} ${fmt(f.b, b)}`;
58
181
  if (t === b)
59
- return `${kind}y-${t} ${kind}l-${l} ${kind}r-${r}`;
60
- return `${kind}t-${t} ${kind}b-${b} ${kind}l-${l} ${kind}r-${r}`;
182
+ return `${fmt(f.y, t)} ${fmt(f.l, l)} ${fmt(f.r, r)}`;
183
+ return `${fmt(f.t, t)} ${fmt(f.b, b)} ${fmt(f.l, l)} ${fmt(f.r, r)}`;
61
184
  }
62
185
  const parts = [];
63
186
  if (l && r) {
64
- parts.push(l === r ? `${kind}x-${l}` : `${kind}l-${l} ${kind}r-${r}`);
187
+ parts.push(l === r ? fmt(f.x, l) : `${fmt(f.l, l)} ${fmt(f.r, r)}`);
65
188
  }
66
189
  else {
67
190
  if (l)
68
- parts.push(`${kind}l-${l}`);
191
+ parts.push(fmt(f.l, l));
69
192
  if (r)
70
- parts.push(`${kind}r-${r}`);
193
+ parts.push(fmt(f.r, r));
71
194
  }
72
195
  if (t && b) {
73
- parts.push(t === b ? `${kind}y-${t}` : `${kind}t-${t} ${kind}b-${b}`);
196
+ parts.push(t === b ? fmt(f.y, t) : `${fmt(f.t, t)} ${fmt(f.b, b)}`);
74
197
  }
75
198
  else {
76
199
  if (t)
77
- parts.push(`${kind}t-${t}`);
200
+ parts.push(fmt(f.t, t));
78
201
  if (b)
79
- parts.push(`${kind}b-${b}`);
202
+ parts.push(fmt(f.b, b));
80
203
  }
81
204
  return parts.join(' ');
82
205
  }
83
- function parseSpacing(cls) {
84
- const m = cls.match(/^(p|px|py|pt|pb|pl|pr|m|mx|my|mt|mb|ml|mr)-(.+)$/);
85
- if (!m)
86
- return null;
87
- const kind = m[1].startsWith('p') ? 'p' : 'm';
88
- return { kind, prefix: m[1], suffix: m[2] };
206
+ function parseRoundedCorner(cls) {
207
+ const sideM = cls.match(/^rounded-(tl|tr|bl|br|t|b|l|r)(?:-(.+))?$/);
208
+ if (sideM) {
209
+ const side = sideM[1];
210
+ const val = sideM[2] ?? '';
211
+ const c = {};
212
+ if (side === 't') {
213
+ c.tl = val;
214
+ c.tr = val;
215
+ }
216
+ else if (side === 'b') {
217
+ c.bl = val;
218
+ c.br = val;
219
+ }
220
+ else if (side === 'l') {
221
+ c.tl = val;
222
+ c.bl = val;
223
+ }
224
+ else if (side === 'r') {
225
+ c.tr = val;
226
+ c.br = val;
227
+ }
228
+ else {
229
+ c[side] = val;
230
+ }
231
+ return { corners: c };
232
+ }
233
+ const allM = cls.match(/^rounded(?:-(.+))?$/);
234
+ if (allM) {
235
+ const val = allM[1] ?? '';
236
+ return { corners: { tl: val, tr: val, bl: val, br: val } };
237
+ }
238
+ return null;
239
+ }
240
+ function collapseCorners(c) {
241
+ const { tl, tr, bl, br } = c;
242
+ const mk = (pfx, val) => (val === '' ? pfx : `${pfx}-${val}`);
243
+ if (tl !== null && tr !== null && bl !== null && br !== null) {
244
+ if (tl === tr && tr === bl && bl === br)
245
+ return mk('rounded', tl);
246
+ if (tl === tr && bl === br)
247
+ return `${mk('rounded-t', tl)} ${mk('rounded-b', bl)}`;
248
+ if (tl === bl && tr === br)
249
+ return `${mk('rounded-l', tl)} ${mk('rounded-r', tr)}`;
250
+ const parts = [];
251
+ if (tl === tr)
252
+ parts.push(mk('rounded-t', tl));
253
+ else {
254
+ parts.push(mk('rounded-tl', tl));
255
+ parts.push(mk('rounded-tr', tr));
256
+ }
257
+ if (bl === br)
258
+ parts.push(mk('rounded-b', bl));
259
+ else {
260
+ parts.push(mk('rounded-bl', bl));
261
+ parts.push(mk('rounded-br', br));
262
+ }
263
+ return parts.join(' ');
264
+ }
265
+ const handled = { tl: false, tr: false, bl: false, br: false };
266
+ const parts = [];
267
+ if (tl !== null && bl !== null && tl === bl) {
268
+ parts.push(mk('rounded-l', tl));
269
+ handled.tl = true;
270
+ handled.bl = true;
271
+ }
272
+ if (tr !== null && br !== null && tr === br) {
273
+ parts.push(mk('rounded-r', tr));
274
+ handled.tr = true;
275
+ handled.br = true;
276
+ }
277
+ if (!(handled.tl || handled.tr) && tl !== null && tr !== null && tl === tr) {
278
+ parts.push(mk('rounded-t', tl));
279
+ handled.tl = true;
280
+ handled.tr = true;
281
+ }
282
+ if (!(handled.bl || handled.br) && bl !== null && br !== null && bl === br) {
283
+ parts.push(mk('rounded-b', bl));
284
+ handled.bl = true;
285
+ handled.br = true;
286
+ }
287
+ if (!handled.tl && tl !== null)
288
+ parts.push(mk('rounded-tl', tl));
289
+ if (!handled.tr && tr !== null)
290
+ parts.push(mk('rounded-tr', tr));
291
+ if (!handled.bl && bl !== null)
292
+ parts.push(mk('rounded-bl', bl));
293
+ if (!handled.br && br !== null)
294
+ parts.push(mk('rounded-br', br));
295
+ return parts.join(' ');
89
296
  }
90
- function processSpacingGroup(classes, box, kind) {
91
- if (classes.length === 0)
92
- return [];
93
- const collapsed = collapseBox(box, kind);
297
+ // ─── Responsive cascade collapse ─────────────────────────────────────────────
298
+ const RESPONSIVE_BREAKPOINTS = ['sm', 'md', 'lg', 'xl', '2xl'];
299
+ const BP_ORDER = [
300
+ '',
301
+ ...RESPONSIVE_BREAKPOINTS,
302
+ ];
303
+ function collapseResponsiveCascade(classes) {
304
+ const entries = classes.map((cls, idx) => {
305
+ for (const bp of RESPONSIVE_BREAKPOINTS) {
306
+ const prefix = `${bp}:`;
307
+ if (cls.startsWith(prefix) && !cls.slice(prefix.length).includes(':')) {
308
+ const base = cls.slice(prefix.length);
309
+ const dash = base.lastIndexOf('-');
310
+ return { bp, base, key: dash === -1 ? base : base.slice(0, dash), idx };
311
+ }
312
+ }
313
+ const dash = cls.lastIndexOf('-');
314
+ return {
315
+ bp: '',
316
+ base: cls,
317
+ key: dash === -1 ? cls : cls.slice(0, dash),
318
+ idx,
319
+ };
320
+ });
321
+ const groups = new Map();
322
+ for (const e of entries) {
323
+ const arr = groups.get(e.key);
324
+ if (arr)
325
+ arr.push(e);
326
+ else
327
+ groups.set(e.key, [e]);
328
+ }
329
+ const toRemove = new Set();
330
+ for (const group of groups.values()) {
331
+ if (group.length < 2 || !group.some((e) => e.bp !== ''))
332
+ continue;
333
+ const sorted = [...group].sort((a, b) => BP_ORDER.indexOf(a.bp) - BP_ORDER.indexOf(b.bp));
334
+ let prev = null;
335
+ for (const entry of sorted) {
336
+ if (entry.base === prev) {
337
+ toRemove.add(entry.idx);
338
+ }
339
+ else {
340
+ prev = entry.base;
341
+ }
342
+ }
343
+ }
344
+ return classes.filter((_, i) => !toRemove.has(i));
345
+ }
346
+ // ─── Public API ───────────────────────────────────────────────────────────────
347
+ function pushCollapsed(result, collapsed, classes) {
94
348
  const original = classes.filter((c, i) => classes.indexOf(c) === i).join(' ');
95
- return collapsed === original ? original.split(' ') : collapsed.split(' ');
349
+ result.push(...(collapsed === original ? original.split(' ') : collapsed.split(' ')));
96
350
  }
97
351
  export function deduplicateClasses(classStr) {
98
- const classes = classStr.split(/\s+/).filter(Boolean);
352
+ let classes = classStr.split(/\s+/).filter(Boolean);
99
353
  if (classes.length <= 1)
100
354
  return classStr;
101
- const result = [];
355
+ classes = collapseResponsiveCascade(classes);
102
356
  let displayWinner = null;
103
357
  let positionWinner = null;
104
358
  const seen = new Set();
105
- const pBox = { t: '', b: '', l: '', r: '' };
106
- const mBox = { t: '', b: '', l: '', r: '' };
107
- const pClasses = [];
108
- const mClasses = [];
109
359
  const others = [];
360
+ const boxGroups = new Map();
361
+ const corners = { tl: null, tr: null, bl: null, br: null };
362
+ const cornersClasses = [];
110
363
  for (const cls of classes) {
111
364
  if (DISPLAY_GROUP.has(cls)) {
112
365
  displayWinner = cls;
@@ -116,52 +369,65 @@ export function deduplicateClasses(classStr) {
116
369
  positionWinner = cls;
117
370
  continue;
118
371
  }
119
- const sp = parseSpacing(cls);
120
- if (sp) {
121
- const expansion = expandSpacing(sp.prefix, sp.suffix);
122
- if (expansion) {
123
- const box = sp.kind === 'p' ? pBox : mBox;
124
- (sp.kind === 'p' ? pClasses : mClasses).push(cls);
125
- if (expansion.t !== undefined)
126
- box.t = expansion.t;
127
- if (expansion.b !== undefined)
128
- box.b = expansion.b;
129
- if (expansion.l !== undefined)
130
- box.l = expansion.l;
131
- if (expansion.r !== undefined)
132
- box.r = expansion.r;
133
- continue;
372
+ const parsed = parseBoxClass(cls);
373
+ if (parsed) {
374
+ const { family, sides } = parsed;
375
+ let group = boxGroups.get(family.kind);
376
+ if (!group) {
377
+ group = { family, box: { t: '', b: '', l: '', r: '' }, classes: [] };
378
+ boxGroups.set(family.kind, group);
134
379
  }
380
+ group.classes.push(cls);
381
+ if (sides.t !== undefined)
382
+ group.box.t = sides.t;
383
+ if (sides.b !== undefined)
384
+ group.box.b = sides.b;
385
+ if (sides.l !== undefined)
386
+ group.box.l = sides.l;
387
+ if (sides.r !== undefined)
388
+ group.box.r = sides.r;
389
+ continue;
390
+ }
391
+ const roundedParsed = parseRoundedCorner(cls);
392
+ if (roundedParsed) {
393
+ cornersClasses.push(cls);
394
+ const { corners: c } = roundedParsed;
395
+ if (c.tl !== undefined)
396
+ corners.tl = c.tl;
397
+ if (c.tr !== undefined)
398
+ corners.tr = c.tr;
399
+ if (c.bl !== undefined)
400
+ corners.bl = c.bl;
401
+ if (c.br !== undefined)
402
+ corners.br = c.br;
403
+ continue;
135
404
  }
136
405
  if (!seen.has(cls)) {
137
406
  seen.add(cls);
138
407
  others.push(cls);
139
408
  }
140
409
  }
410
+ const result = [];
141
411
  if (displayWinner)
142
412
  result.push(displayWinner);
143
413
  if (positionWinner)
144
414
  result.push(positionWinner);
145
- result.push(...processSpacingGroup(pClasses, pBox, 'p'));
146
- result.push(...processSpacingGroup(mClasses, mBox, 'm'));
415
+ for (const { family, box, classes: groupClasses } of boxGroups.values()) {
416
+ if (groupClasses.length === 0)
417
+ continue;
418
+ pushCollapsed(result, collapseBox(box, family), groupClasses);
419
+ }
420
+ if (cornersClasses.length > 0) {
421
+ pushCollapsed(result, collapseCorners(corners), cornersClasses);
422
+ }
147
423
  result.push(...others);
148
424
  return result.join(' ');
149
425
  }
150
- export function dedupeFile(filePath) {
151
- let content = readFileSync(filePath, 'utf8');
152
- let count = 0;
153
- const CLASS_ATTR_REGEX = /className\s*=\s*(?:"([^"]+)"|'([^']+)'|`([^`]+)`)/g;
154
- content = content.replace(CLASS_ATTR_REGEX, (full, dq, sq, bt) => {
155
- const raw = dq ?? sq ?? bt ?? '';
156
- const quote = dq !== undefined ? '"' : sq !== undefined ? "'" : '`';
157
- const deduped = deduplicateClasses(raw);
158
- if (deduped === raw)
159
- return full;
160
- count++;
161
- return `className=${quote}${deduped}${quote}`;
162
- });
426
+ export function dedupeFile(filePath, opts = {}) {
427
+ const content = readFileSync(filePath, 'utf8');
428
+ const { result, count } = replaceClassStrings(content, deduplicateClasses, opts);
163
429
  if (count > 0)
164
- writeFileSync(filePath, content, 'utf8');
430
+ writeFileSync(filePath, result, 'utf8');
165
431
  return count;
166
432
  }
167
433
  //# sourceMappingURL=deduplicator.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"deduplicator.js","sourceRoot":"","sources":["../../src/core/deduplicator.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"deduplicator.js","sourceRoot":"","sources":["../../src/core/deduplicator.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"fixer.d.ts","sourceRoot":"","sources":["../../src/core/fixer.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,MAAM,EAAoB,MAAM,YAAY,CAAC;AAE3D,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAE,MAAW,GAAG,MAAM,CAyBrE"}
1
+ {"version":3,"file":"fixer.d.ts","sourceRoot":"","sources":["../../src/core/fixer.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,MAAM,EAAoB,MAAM,YAAY,CAAC;AAE3D,wBAAgB,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,GAAE,MAAW,GAAG,MAAM,CAqBrE"}
@@ -1,27 +1,23 @@
1
1
  import { readFileSync, writeFileSync } from 'node:fs';
2
+ import { replaceClassStrings } from './class-strings.js';
2
3
  import { suggestCanonical } from './rules.js';
3
4
  export function fixFile(filePath, config = {}) {
4
- let content = readFileSync(filePath, 'utf8');
5
+ const content = readFileSync(filePath, 'utf8');
5
6
  let count = 0;
6
- const CLASS_ATTR_REGEX = /className\s*=\s*(?:"([^"]+)"|'([^']+)'|`([^`]+)`)/g;
7
- content = content.replace(CLASS_ATTR_REGEX, (full, dq, sq, bt) => {
8
- const raw = dq ?? sq ?? bt ?? '';
9
- const quote = dq !== undefined ? '"' : sq !== undefined ? "'" : '`';
10
- const fixed = raw.replace(/[^\s]+/g, (cls) => {
11
- const suggestion = suggestCanonical(cls, config);
12
- if (suggestion) {
13
- count++;
14
- return suggestion.canonical;
15
- }
16
- return cls;
17
- });
18
- return full
19
- .replace(raw, fixed)
20
- .replace(/["'`]/, quote)
21
- .replace(/["'`]$/, quote);
7
+ const transform = (raw) => raw.replace(/[^\s]+/g, (cls) => {
8
+ const s = suggestCanonical(cls, config);
9
+ if (s) {
10
+ count++;
11
+ return s.canonical;
12
+ }
13
+ return cls;
14
+ });
15
+ const { result } = replaceClassStrings(content, transform, {
16
+ functionNames: config.functionNames,
17
+ attributeNames: config.attributeNames,
22
18
  });
23
19
  if (count > 0)
24
- writeFileSync(filePath, content, 'utf8');
20
+ writeFileSync(filePath, result, 'utf8');
25
21
  return count;
26
22
  }
27
23
  //# sourceMappingURL=fixer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"fixer.js","sourceRoot":"","sources":["../../src/core/fixer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAe,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE3D,MAAM,UAAU,OAAO,CAAC,QAAgB,EAAE,SAAiB,EAAE;IAC3D,IAAI,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7C,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,MAAM,gBAAgB,GAAG,oDAAoD,CAAC;IAE9E,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;QAC/D,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QACpE,MAAM,KAAK,GAAG,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,GAAW,EAAE,EAAE;YACnD,MAAM,UAAU,GAAG,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;YACjD,IAAI,UAAU,EAAE,CAAC;gBACf,KAAK,EAAE,CAAC;gBACR,OAAO,UAAU,CAAC,SAAS,CAAC;YAC9B,CAAC;YACD,OAAO,GAAG,CAAC;QACb,CAAC,CAAC,CAAC;QACH,OAAO,IAAI;aACR,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC;aACnB,OAAO,CAAC,OAAO,EAAE,KAAK,CAAC;aACvB,OAAO,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,IAAI,KAAK,GAAG,CAAC;QAAE,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACxD,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"fixer.js","sourceRoot":"","sources":["../../src/core/fixer.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAE,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AACzD,OAAO,EAAe,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAE3D,MAAM,UAAU,OAAO,CAAC,QAAgB,EAAE,SAAiB,EAAE;IAC3D,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC/C,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,MAAM,SAAS,GAAG,CAAC,GAAW,EAAE,EAAE,CAChC,GAAG,CAAC,OAAO,CAAC,SAAS,EAAE,CAAC,GAAW,EAAE,EAAE;QACrC,MAAM,CAAC,GAAG,gBAAgB,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACxC,IAAI,CAAC,EAAE,CAAC;YACN,KAAK,EAAE,CAAC;YACR,OAAO,CAAC,CAAC,SAAS,CAAC;QACrB,CAAC;QACD,OAAO,GAAG,CAAC;IACb,CAAC,CAAC,CAAC;IAEL,MAAM,EAAE,MAAM,EAAE,GAAG,mBAAmB,CAAC,OAAO,EAAE,SAAS,EAAE;QACzD,aAAa,EAAE,MAAM,CAAC,aAAa;QACnC,cAAc,EAAE,MAAM,CAAC,cAAc;KACtC,CAAC,CAAC;IAEH,IAAI,KAAK,GAAG,CAAC;QAAE,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACvD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -1,2 +1,3 @@
1
- export declare function mergeFile(filePath: string): Promise<number>;
1
+ import { type ClassStringOpts } from './class-strings.js';
2
+ export declare function mergeFile(filePath: string, opts?: ClassStringOpts): Promise<number>;
2
3
  //# sourceMappingURL=merger.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"merger.d.ts","sourceRoot":"","sources":["../../src/core/merger.ts"],"names":[],"mappings":"AAEA,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC,CAkBjE"}
1
+ {"version":3,"file":"merger.d.ts","sourceRoot":"","sources":["../../src/core/merger.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,KAAK,eAAe,EAAuB,MAAM,oBAAoB,CAAC;AAE/E,wBAAsB,SAAS,CAC7B,QAAQ,EAAE,MAAM,EAChB,IAAI,GAAE,eAAoB,GACzB,OAAO,CAAC,MAAM,CAAC,CAMjB"}
@@ -1,20 +1,11 @@
1
1
  import { readFileSync, writeFileSync } from 'node:fs';
2
- export async function mergeFile(filePath) {
2
+ import { replaceClassStrings } from './class-strings.js';
3
+ export async function mergeFile(filePath, opts = {}) {
3
4
  const { twMerge } = await import('tailwind-merge');
4
- let content = readFileSync(filePath, 'utf8');
5
- let count = 0;
6
- const CLASS_ATTR_REGEX = /className\s*=\s*(?:"([^"]+)"|'([^']+)'|`([^`]+)`)/g;
7
- content = content.replace(CLASS_ATTR_REGEX, (full, dq, sq, bt) => {
8
- const raw = dq ?? sq ?? bt ?? '';
9
- const quote = dq !== undefined ? '"' : sq !== undefined ? "'" : '`';
10
- const merged = twMerge(raw);
11
- if (merged === raw)
12
- return full;
13
- count++;
14
- return `className=${quote}${merged}${quote}`;
15
- });
5
+ const content = readFileSync(filePath, 'utf8');
6
+ const { result, count } = replaceClassStrings(content, twMerge, opts);
16
7
  if (count > 0)
17
- writeFileSync(filePath, content, 'utf8');
8
+ writeFileSync(filePath, result, 'utf8');
18
9
  return count;
19
10
  }
20
11
  //# sourceMappingURL=merger.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"merger.js","sourceRoot":"","sources":["../../src/core/merger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AAEtD,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAgB;IAC9C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACnD,IAAI,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC7C,IAAI,KAAK,GAAG,CAAC,CAAC;IAEd,MAAM,gBAAgB,GAAG,oDAAoD,CAAC;IAE9E,OAAO,GAAG,OAAO,CAAC,OAAO,CAAC,gBAAgB,EAAE,CAAC,IAAI,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE;QAC/D,MAAM,GAAG,GAAG,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QACjC,MAAM,KAAK,GAAG,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC;QACpE,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,CAAC;QAC5B,IAAI,MAAM,KAAK,GAAG;YAAE,OAAO,IAAI,CAAC;QAChC,KAAK,EAAE,CAAC;QACR,OAAO,aAAa,KAAK,GAAG,MAAM,GAAG,KAAK,EAAE,CAAC;IAC/C,CAAC,CAAC,CAAC;IAEH,IAAI,KAAK,GAAG,CAAC;QAAE,aAAa,CAAC,QAAQ,EAAE,OAAO,EAAE,MAAM,CAAC,CAAC;IACxD,OAAO,KAAK,CAAC;AACf,CAAC"}
1
+ {"version":3,"file":"merger.js","sourceRoot":"","sources":["../../src/core/merger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,aAAa,EAAE,MAAM,SAAS,CAAC;AACtD,OAAO,EAAwB,mBAAmB,EAAE,MAAM,oBAAoB,CAAC;AAE/E,MAAM,CAAC,KAAK,UAAU,SAAS,CAC7B,QAAgB,EAChB,OAAwB,EAAE;IAE1B,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,MAAM,CAAC,gBAAgB,CAAC,CAAC;IACnD,MAAM,OAAO,GAAG,YAAY,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;IAC/C,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,mBAAmB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACtE,IAAI,KAAK,GAAG,CAAC;QAAE,aAAa,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC,CAAC;IACvD,OAAO,KAAK,CAAC;AACf,CAAC"}
@@ -1,3 +1,4 @@
1
+ import type { SortCategory } from './sorter.js';
1
2
  export type Suggestion = {
2
3
  original: string;
3
4
  canonical: string;
@@ -7,6 +8,9 @@ export type Config = {
7
8
  customTextTokens?: Record<number, string>;
8
9
  customSpacingTokens?: Record<number, string>;
9
10
  ignorePatterns?: RegExp[];
11
+ functionNames?: string[];
12
+ attributeNames?: string[];
13
+ sortOrder?: SortCategory[];
10
14
  };
11
15
  export declare function suggestCanonical(cls: string, config?: Config): Suggestion | null;
12
16
  //# sourceMappingURL=rules.d.ts.map