@@ -85,6 +85,8 @@ function rewriteSelector(
85
85
slotted = false
86
86
) {
87
87
let node : selectorParser . Node | null = null
88
+ const nodes : ( selectorParser . Node | null ) [ ] = [ ]
89
+ const nextNodes = [ ] as typeof selector . nodes
88
90
let shouldInject = true
89
91
// find the last child node to insert attribute selector
90
92
selector . each ( n => {
@@ -111,9 +113,55 @@ function rewriteSelector(
111
113
// .foo ::v-deep(.bar) -> .foo[xxxxxxx] .bar
112
114
// replace the current node with ::v-deep's inner selector
113
115
let last : selectorParser . Selector [ 'nodes' ] [ 0 ] = n
114
- n . nodes [ 0 ] . each ( ss => {
115
- selector . insertAfter ( last , ss )
116
- last = ss
116
+ if ( node ) {
117
+ nodes . push ( node )
118
+ }
119
+ n . nodes . forEach ( ( _node , i ) => {
120
+ const index = selector . index ( n )
121
+ if ( i > 0 ) {
122
+ const prevList = selector . nodes
123
+ . slice ( 0 , index )
124
+ . concat ( _node . nodes )
125
+ if ( nextNodes . length ) {
126
+ prevList . push ( ...nextNodes )
127
+ nextNodes . forEach ( s => {
128
+ selector . removeChild ( s )
129
+ selector . insertAfter ( last , s )
130
+ last = s
131
+ } )
132
+ }
133
+ const newList = prevList . map ( s => {
134
+ const _newNode = s . clone (
135
+ { }
136
+ ) as selectorParser . Selector [ 'nodes' ] [ 0 ]
137
+ if ( nodes . includes ( s ) ) {
138
+ nodes . push ( _newNode )
139
+ }
140
+ return _newNode
141
+ } )
142
+ newList . unshift ( selectorParser . combinator ( { value : ',' } ) )
143
+ if ( ! nodes . length ) {
144
+ nodes . push ( null , newList [ 0 ] )
145
+ } else {
146
+ // :deep(.a,.b,.c) -> [xxx] .a,[xxx] .b,[xxx] .c
147
+ if ( nodes [ 0 ] === null ) {
148
+ nodes . push ( newList [ 0 ] )
149
+ }
150
+ }
151
+ if ( ! node ) {
152
+ newList . splice ( 1 , 0 , selectorParser . combinator ( { value : ' ' } ) )
153
+ }
154
+ newList . forEach ( s => {
155
+ selector . insertAfter ( last , s )
156
+ last = s
157
+ } )
158
+ } else {
159
+ nextNodes . push ( ...selector . nodes . slice ( index + 1 ) )
160
+ _node . each ( ss => {
161
+ selector . insertAfter ( last , ss )
162
+ last = ss
163
+ } )
164
+ }
117
165
} )
118
166
// insert a space combinator before if it doesn't already have one
119
167
const prev = selector . at ( selector . index ( n ) - 1 )
@@ -173,7 +221,9 @@ function rewriteSelector(
173
221
node = n
174
222
}
175
223
} )
176
-
224
+ if ( ! nodes . length ) {
225
+ nodes . push ( node )
226
+ }
177
227
if ( node ) {
178
228
; ( node as selectorParser . Node ) . spaces . after = ''
179
229
} else {
@@ -185,17 +235,19 @@ function rewriteSelector(
185
235
186
236
if ( shouldInject ) {
187
237
const idToAdd = slotted ? id + '-s' : id
188
- selector . insertAfter (
238
+ nodes . forEach ( n => {
189
239
// If node is null it means we need to inject [id] at the start
190
240
// insertAfter can handle `null` here
191
- node as any ,
192
- selectorParser . attribute ( {
193
- attribute : idToAdd ,
194
- value : idToAdd ,
195
- raws : { } ,
196
- quoteMark : `"`
197
- } )
198
- )
241
+ selector . insertAfter (
242
+ n as any ,
243
+ selectorParser . attribute ( {
244
+ attribute : idToAdd ,
245
+ value : idToAdd ,
246
+ raws : { } ,
247
+ quoteMark : `"`
248
+ } )
249
+ )
250
+ } )
199
251
}
200
252
}
201
253
0 commit comments