@@ -39,6 +39,19 @@ function getClassOrderPolyfill(classes, { env }) {
39
39
return classNamesWithOrder
40
40
}
41
41
42
+ function reorderClasses ( classList , { env } ) {
43
+ let orderedClasses = env . context . getClassOrder
44
+ ? env . context . getClassOrder ( classList )
45
+ : getClassOrderPolyfill ( classList , { env } )
46
+
47
+ return orderedClasses . sort ( ( [ , a ] , [ , z ] ) => {
48
+ if ( a === z ) return 0
49
+ if ( a === null ) return - 1
50
+ if ( z === null ) return 1
51
+ return bigSign ( a - z )
52
+ } )
53
+ }
54
+
42
55
/**
43
56
* @param {string } classStr
44
57
* @param {object } opts
@@ -75,10 +88,6 @@ export function sortClasses(
75
88
collapseWhitespace = false
76
89
}
77
90
78
- if ( env . options . tailwindPreserveDuplicates ) {
79
- removeDuplicates = false
80
- }
81
-
82
91
// This class list is purely whitespace
83
92
// Collapse it to a single space if the option is enabled
84
93
if ( / ^ [ \t \r \f \n ] + $ / . test ( classStr ) && collapseWhitespace ) {
@@ -108,22 +117,16 @@ export function sortClasses(
108
117
suffix = `${ whitespace . pop ( ) ?? '' } ${ classes . pop ( ) ?? '' } `
109
118
}
110
119
111
- if ( removeDuplicates ) {
112
- classes = classes . filter ( ( cls , index , arr ) => {
113
- if ( arr . indexOf ( cls ) === index ) {
114
- return true
115
- }
116
-
117
- whitespace . splice ( index - 1 , 1 )
118
-
119
- return false
120
- } )
121
- }
120
+ let { classList, removedIndices } = sortClassList ( classes , {
121
+ env,
122
+ removeDuplicates,
123
+ } )
122
124
123
- classes = sortClassList ( classes , { env } )
125
+ // Remove whitespace that appeared before a removed classes
126
+ whitespace = whitespace . filter ( ( _ , index ) => ! removedIndices . has ( index + 1 ) )
124
127
125
- for ( let i = 0 ; i < classes . length ; i ++ ) {
126
- result += `${ classes [ i ] } ${ whitespace [ i ] ?? '' } `
128
+ for ( let i = 0 ; i < classList . length ; i ++ ) {
129
+ result += `${ classList [ i ] } ${ whitespace [ i ] ?? '' } `
127
130
}
128
131
129
132
if ( collapseWhitespace ) {
@@ -138,17 +141,37 @@ export function sortClasses(
138
141
return prefix + result + suffix
139
142
}
140
143
141
- export function sortClassList ( classList , { env } ) {
142
- let classNamesWithOrder = env . context . getClassOrder
143
- ? env . context . getClassOrder ( classList )
144
- : getClassOrderPolyfill ( classList , { env } )
144
+ export function sortClassList ( classList , { env, removeDuplicates } ) {
145
+ // Re-order classes based on the Tailwind CSS configuration
146
+ let orderedClasses = reorderClasses ( classList , { env } )
145
147
146
- return classNamesWithOrder
147
- . sort ( ( [ , a ] , [ , z ] ) => {
148
- if ( a === z ) return 0
149
- if ( a === null ) return - 1
150
- if ( z === null ) return 1
151
- return bigSign ( a - z )
148
+ // Remove duplicate Tailwind classes
149
+ if ( env . options . tailwindPreserveDuplicates ) {
150
+ removeDuplicates = false
151
+ }
152
+
153
+ let removedIndices = new Set ( )
154
+
155
+ if ( removeDuplicates ) {
156
+ let seenClasses = new Set ( )
157
+
158
+ orderedClasses = orderedClasses . filter ( ( [ cls , order ] , index ) => {
159
+ if ( seenClasses . has ( cls ) ) {
160
+ removedIndices . add ( index )
161
+ return false
162
+ }
163
+
164
+ // Only consider known classes when removing duplicates
165
+ if ( order !== null ) {
166
+ seenClasses . add ( cls )
167
+ }
168
+
169
+ return true
152
170
} )
153
- . map ( ( [ className ] ) => className )
171
+ }
172
+
173
+ return {
174
+ classList : orderedClasses . map ( ( [ className ] ) => className ) ,
175
+ removedIndices,
176
+ }
154
177
}
0 commit comments