@@ -65,7 +65,12 @@ function getClassOrderPolyfill(classes, { env }) {
6565
6666function sortClasses (
6767 classStr ,
68- { env, ignoreFirst = false , ignoreLast = false }
68+ {
69+ env,
70+ ignoreFirst = false ,
71+ ignoreLast = false ,
72+ tidyWhitespace = { start : true , end : true } ,
73+ }
6974) {
7075 if ( typeof classStr !== 'string' || classStr === '' ) {
7176 return classStr
@@ -77,6 +82,10 @@ function sortClasses(
7782 return classStr
7883 }
7984
85+ if ( classStr . includes ( '\n' ) ) {
86+ tidyWhitespace = false
87+ }
88+
8089 let result = ''
8190 let parts = classStr . split ( / ( \s + ) / )
8291 let classes = parts . filter ( ( _ , i ) => i % 2 === 0 )
@@ -86,6 +95,10 @@ function sortClasses(
8695 classes . pop ( )
8796 }
8897
98+ if ( tidyWhitespace ) {
99+ whitespace = whitespace . map ( ( ) => ' ' )
100+ }
101+
89102 let prefix = ''
90103 if ( ignoreFirst ) {
91104 prefix = `${ classes . shift ( ) ?? '' } ${ whitespace . shift ( ) ?? '' } `
@@ -96,6 +109,15 @@ function sortClasses(
96109 suffix = `${ whitespace . pop ( ) ?? '' } ${ classes . pop ( ) ?? '' } `
97110 }
98111
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+
99121 let classNamesWithOrder = env . context . getClassOrder
100122 ? env . context . getClassOrder ( classes )
101123 : getClassOrderPolyfill ( classes , { env } )
@@ -115,6 +137,12 @@ function sortClasses(
115137 result += `${ classes [ i ] } ${ whitespace [ i ] ?? '' } `
116138 }
117139
140+ if ( tidyWhitespace ) {
141+ result = result
142+ . replace ( / ^ \s + / , tidyWhitespace . start ? '' : ' ' )
143+ . replace ( / \s + $ / , tidyWhitespace . end ? '' : ' ' )
144+ }
145+
118146 return prefix + result + suffix
119147}
120148
@@ -287,6 +315,10 @@ function sortTemplateLiteral(node, { env }) {
287315 env,
288316 ignoreFirst : i > 0 && ! / ^ \s / . test ( quasi . value . raw ) ,
289317 ignoreLast : i < node . expressions . length && ! / \s $ / . test ( quasi . value . raw ) ,
318+ tidyWhitespace : {
319+ start : i === 0 ,
320+ end : i >= node . expressions . length ,
321+ } ,
290322 } )
291323
292324 quasi . value . cooked = same
@@ -296,6 +328,10 @@ function sortTemplateLiteral(node, { env }) {
296328 ignoreFirst : i > 0 && ! / ^ \s / . test ( quasi . value . cooked ) ,
297329 ignoreLast :
298330 i < node . expressions . length && ! / \s $ / . test ( quasi . value . cooked ) ,
331+ tidyWhitespace : {
332+ start : i === 0 ,
333+ end : i >= node . expressions . length ,
334+ } ,
299335 } )
300336
301337 if (
@@ -444,6 +480,10 @@ function transformSvelte(ast, { env, changes }) {
444480 env,
445481 ignoreFirst : i > 0 && ! / ^ \s / . test ( value . raw ) ,
446482 ignoreLast : i < attr . value . length - 1 && ! / \s $ / . test ( value . raw ) ,
483+ tidyWhitespace : {
484+ start : i === 0 ,
485+ end : i >= attr . value . length - 1 ,
486+ } ,
447487 } )
448488 value . data = same
449489 ? value . raw
@@ -452,6 +492,10 @@ function transformSvelte(ast, { env, changes }) {
452492 ignoreFirst : i > 0 && ! / ^ \s / . test ( value . data ) ,
453493 ignoreLast :
454494 i < attr . value . length - 1 && ! / \s $ / . test ( value . data ) ,
495+ tidyWhitespace : {
496+ start : i === 0 ,
497+ end : i >= attr . value . length - 1 ,
498+ } ,
455499 } )
456500 } else if ( value . type === 'MustacheTag' ) {
457501 visit ( value . expression , {
0 commit comments