@@ -99,41 +99,31 @@ const validation_visitors = {
9999 }
100100 }
101101
102- // ensure `:global(...)`contains a single selector
103- // (standalone :global() with multiple selectors is OK)
104- if ( node . children . length > 1 || node . children [ 0 ] . selectors . length > 1 ) {
105- for ( const relative_selector of node . children ) {
106- for ( const selector of relative_selector . selectors ) {
107- if (
108- selector . type === 'PseudoClassSelector' &&
109- selector . name === 'global' &&
110- selector . args !== null &&
111- selector . args . children . length > 1
112- ) {
113- error ( selector , 'invalid-css-global-selector' ) ;
114- }
115- }
116- }
117- }
118-
119- // ensure `:global(...)` is not part of a larger compound selector
102+ // ensure `:global(...)` do not lead to invalid css after `:global()` is removed
120103 for ( const relative_selector of node . children ) {
121104 for ( let i = 0 ; i < relative_selector . selectors . length ; i ++ ) {
122105 const selector = relative_selector . selectors [ i ] ;
123106
124107 if ( selector . type === 'PseudoClassSelector' && selector . name === 'global' ) {
125108 const child = selector . args ?. children [ 0 ] . children [ 0 ] ;
109+ // ensure `:global(element)` to be at the first position in a compound selector
110+ if ( child ?. selectors [ 0 ] . type === 'TypeSelector' && i !== 0 ) {
111+ error ( selector , 'invalid-css-global-selector-list' ) ;
112+ }
113+
114+ // ensure `:global(.class)` is not followed by a type selector, eg: `:global(.class)element`
115+ if ( relative_selector . selectors [ i + 1 ] ?. type === 'TypeSelector' ) {
116+ error ( relative_selector . selectors [ i + 1 ] , 'invalid-css-type-selector-placement' ) ;
117+ }
118+
119+ // ensure `:global(...)`contains a single selector
120+ // (standalone :global() with multiple selectors is OK)
126121 if (
127- child ?. selectors [ 0 ] . type === 'TypeSelector' &&
128- ! / [ . : # ] / . test ( child . selectors [ 0 ] . name [ 0 ] ) &&
129- ( i !== 0 ||
130- relative_selector . selectors
131- . slice ( 1 )
132- . some (
133- ( s ) => s . type !== 'PseudoElementSelector' && s . type !== 'PseudoClassSelector'
134- ) )
122+ selector . args !== null &&
123+ selector . args . children . length > 1 &&
124+ ( node . children . length > 1 || relative_selector . selectors . length > 1 )
135125 ) {
136- error ( selector , 'invalid-css-global-selector-list ' ) ;
126+ error ( selector , 'invalid-css-global-selector' ) ;
137127 }
138128 }
139129 }
0 commit comments