@@ -65,7 +65,12 @@ function getClassOrderPolyfill(classes, { env }) {
65
65
66
66
function sortClasses (
67
67
classStr ,
68
- { env, ignoreFirst = false , ignoreLast = false }
68
+ {
69
+ env,
70
+ ignoreFirst = false ,
71
+ ignoreLast = false ,
72
+ tidyWhitespace = { start : true , end : true } ,
73
+ }
69
74
) {
70
75
if ( typeof classStr !== 'string' || classStr === '' ) {
71
76
return classStr
@@ -77,6 +82,10 @@ function sortClasses(
77
82
return classStr
78
83
}
79
84
85
+ if ( classStr . includes ( '\n' ) ) {
86
+ tidyWhitespace = false
87
+ }
88
+
80
89
let result = ''
81
90
let parts = classStr . split ( / ( \s + ) / )
82
91
let classes = parts . filter ( ( _ , i ) => i % 2 === 0 )
@@ -86,6 +95,10 @@ function sortClasses(
86
95
classes . pop ( )
87
96
}
88
97
98
+ if ( tidyWhitespace ) {
99
+ whitespace = whitespace . map ( ( ) => ' ' )
100
+ }
101
+
89
102
let prefix = ''
90
103
if ( ignoreFirst ) {
91
104
prefix = `${ classes . shift ( ) ?? '' } ${ whitespace . shift ( ) ?? '' } `
@@ -96,6 +109,15 @@ function sortClasses(
96
109
suffix = `${ whitespace . pop ( ) ?? '' } ${ classes . pop ( ) ?? '' } `
97
110
}
98
111
112
+ // Remove duplicates
113
+ classes = classes . filter ( ( cls , index , arr ) => {
114
+ if ( arr . indexOf ( cls ) === index ) {
115
+ return true
116
+ }
117
+ whitespace . splice ( index - 1 , 1 )
118
+ return false
119
+ } )
120
+
99
121
let classNamesWithOrder = env . context . getClassOrder
100
122
? env . context . getClassOrder ( classes )
101
123
: getClassOrderPolyfill ( classes , { env } )
@@ -115,6 +137,12 @@ function sortClasses(
115
137
result += `${ classes [ i ] } ${ whitespace [ i ] ?? '' } `
116
138
}
117
139
140
+ if ( tidyWhitespace ) {
141
+ result = result
142
+ . replace ( / ^ \s + / , tidyWhitespace . start ? '' : ' ' )
143
+ . replace ( / \s + $ / , tidyWhitespace . end ? '' : ' ' )
144
+ }
145
+
118
146
return prefix + result + suffix
119
147
}
120
148
@@ -287,6 +315,10 @@ function sortTemplateLiteral(node, { env }) {
287
315
env,
288
316
ignoreFirst : i > 0 && ! / ^ \s / . test ( quasi . value . raw ) ,
289
317
ignoreLast : i < node . expressions . length && ! / \s $ / . test ( quasi . value . raw ) ,
318
+ tidyWhitespace : {
319
+ start : i === 0 ,
320
+ end : i >= node . expressions . length ,
321
+ } ,
290
322
} )
291
323
292
324
quasi . value . cooked = same
@@ -296,6 +328,10 @@ function sortTemplateLiteral(node, { env }) {
296
328
ignoreFirst : i > 0 && ! / ^ \s / . test ( quasi . value . cooked ) ,
297
329
ignoreLast :
298
330
i < node . expressions . length && ! / \s $ / . test ( quasi . value . cooked ) ,
331
+ tidyWhitespace : {
332
+ start : i === 0 ,
333
+ end : i >= node . expressions . length ,
334
+ } ,
299
335
} )
300
336
301
337
if (
@@ -444,6 +480,10 @@ function transformSvelte(ast, { env, changes }) {
444
480
env,
445
481
ignoreFirst : i > 0 && ! / ^ \s / . test ( value . raw ) ,
446
482
ignoreLast : i < attr . value . length - 1 && ! / \s $ / . test ( value . raw ) ,
483
+ tidyWhitespace : {
484
+ start : i === 0 ,
485
+ end : i >= attr . value . length - 1 ,
486
+ } ,
447
487
} )
448
488
value . data = same
449
489
? value . raw
@@ -452,6 +492,10 @@ function transformSvelte(ast, { env, changes }) {
452
492
ignoreFirst : i > 0 && ! / ^ \s / . test ( value . data ) ,
453
493
ignoreLast :
454
494
i < attr . value . length - 1 && ! / \s $ / . test ( value . data ) ,
495
+ tidyWhitespace : {
496
+ start : i === 0 ,
497
+ end : i >= attr . value . length - 1 ,
498
+ } ,
455
499
} )
456
500
} else if ( value . type === 'MustacheTag' ) {
457
501
visit ( value . expression , {
0 commit comments