@@ -187,11 +187,11 @@ export class UnoGenerator {
187
187
const rules = sorted
188
188
. reverse ( )
189
189
. map ( ( [ selector , body , noMerge ] , idx ) => {
190
- if ( selector && this . config . mergeSelectors ) {
190
+ if ( ! noMerge && selector && this . config . mergeSelectors ) {
191
191
// search for rules that has exact same body, and merge them
192
192
for ( let i = idx + 1 ; i < size ; i ++ ) {
193
193
const current = sorted [ i ]
194
- if ( ! noMerge && current && current [ 0 ] && current [ 1 ] === body ) {
194
+ if ( current && ! current [ 2 ] && current [ 0 ] && current [ 1 ] === body ) {
195
195
current [ 0 ] . push ( ...selector )
196
196
return null
197
197
}
@@ -414,7 +414,7 @@ export class UnoGenerator {
414
414
expanded : string [ ] ,
415
415
meta : RuleMeta = { layer : this . config . shortcutsLayer } ,
416
416
) : Promise < StringifiedUtil [ ] | undefined > {
417
- const selectorMap = new TwoKeyMap < string , string | undefined , [ CSSEntries [ ] , number ] > ( )
417
+ const selectorMap = new TwoKeyMap < string , string | undefined , [ [ CSSEntries , boolean ] [ ] , number ] > ( )
418
418
419
419
const parsed = (
420
420
await Promise . all ( uniq ( expanded )
@@ -437,22 +437,31 @@ export class UnoGenerator {
437
437
438
438
// find existing selector/mediaQuery pair and merge
439
439
const mapItem = selectorMap . getFallback ( selector , parent , [ [ ] , item [ 0 ] ] )
440
- // append entries
441
- mapItem [ 0 ] . push ( entries )
440
+ // add entries
441
+ mapItem [ 0 ] . push ( [ entries , ! ! item [ 3 ] ?. noMerge ] )
442
442
}
443
443
444
444
return selectorMap
445
445
. map ( ( [ e , index ] , selector , mediaQuery ) => {
446
- const split = e . filter ( entries => entries . some ( entry => entry [ 0 ] === CONTROL_SHORTCUT_NO_MERGE ) )
447
- const rest = e . filter ( entries => entries . every ( entry => entry [ 0 ] !== CONTROL_SHORTCUT_NO_MERGE ) )
448
- return [ ...split , rest . flat ( 1 ) ] . map ( ( entries ) : StringifiedUtil | undefined => {
446
+ const stringify = ( noMerge : boolean ) => ( entries : CSSEntries ) : StringifiedUtil | undefined => {
449
447
const body = entriesToCss ( entries )
450
448
if ( body )
451
- return [ index , selector , body , mediaQuery , meta ]
449
+ return [ index , selector , body , mediaQuery , { ... meta , noMerge } ]
452
450
return undefined
451
+ }
452
+
453
+ const merges = [
454
+ [ e . filter ( ( [ , noMerge ] ) => noMerge ) . map ( ( [ entries ] ) => entries ) , true ] ,
455
+ [ e . filter ( ( [ , noMerge ] ) => ! noMerge ) . map ( ( [ entries ] ) => entries ) , false ] ,
456
+ ] as [ CSSEntries [ ] , boolean ] [ ]
457
+
458
+ return merges . map ( ( [ e , noMerge ] ) => {
459
+ const splits = e . filter ( entries => entries . some ( entry => entry [ 0 ] === CONTROL_SHORTCUT_NO_MERGE ) )
460
+ const rests = e . filter ( entries => entries . every ( entry => entry [ 0 ] !== CONTROL_SHORTCUT_NO_MERGE ) )
461
+ return [ ...splits . map ( stringify ( noMerge ) ) , ...[ rests . flat ( 1 ) ] . map ( stringify ( noMerge ) ) ]
453
462
} )
454
463
} )
455
- . flat ( 1 )
464
+ . flat ( 2 )
456
465
. filter ( Boolean ) as StringifiedUtil [ ]
457
466
}
458
467
0 commit comments