@@ -85,12 +85,18 @@ function parseStyles(styles) {
8585 } )
8686}
8787
88- function getClasses ( selector ) {
88+ function getClasses ( selector , mutate ) {
8989 let parser = selectorParser ( ( selectors ) => {
9090 let allClasses = [ ]
91+
92+ if ( mutate ) {
93+ mutate ( selectors )
94+ }
95+
9196 selectors . walkClasses ( ( classNode ) => {
9297 allClasses . push ( classNode . value )
9398 } )
99+
94100 return allClasses
95101 } )
96102 return parser . transformSync ( selector )
@@ -101,8 +107,20 @@ function extractCandidates(node, state = { containsNonOnDemandable: false }, dep
101107
102108 // Handle normal rules
103109 if ( node . type === 'rule' ) {
110+ // Ignore everything inside a :not(...). This allows you to write code like
111+ // `div:not(.foo)`. If `.foo` is never found in your code, then we used to
112+ // not generated it. But now we will ignore everything inside a `:not`, so
113+ // that it still gets generated.
114+ function ignoreNot ( selectors ) {
115+ selectors . walkPseudos ( ( pseudo ) => {
116+ if ( pseudo . value === ':not' ) {
117+ pseudo . remove ( )
118+ }
119+ } )
120+ }
121+
104122 for ( let selector of node . selectors ) {
105- let classCandidates = getClasses ( selector )
123+ let classCandidates = getClasses ( selector , ignoreNot )
106124 // At least one of the selectors contains non-"on-demandable" candidates.
107125 if ( classCandidates . length === 0 ) {
108126 state . containsNonOnDemandable = true
@@ -117,9 +135,7 @@ function extractCandidates(node, state = { containsNonOnDemandable: false }, dep
117135 // Handle at-rules (which contains nested rules)
118136 else if ( node . type === 'atrule' ) {
119137 node . walkRules ( ( rule ) => {
120- for ( let classCandidate of rule . selectors . flatMap ( ( selector ) =>
121- getClasses ( selector , state , depth + 1 )
122- ) ) {
138+ for ( let classCandidate of rule . selectors . flatMap ( ( selector ) => getClasses ( selector ) ) ) {
123139 classes . push ( classCandidate )
124140 }
125141 } )
0 commit comments