|
|
@@ -233,16 +233,12 @@ function rewriteSelector(
|
|
|
|
|
|
if (rule.nodes.some(node => node.type === 'rule')) {
|
|
|
const deep = (rule as any).__deep
|
|
|
- const decls = rule.nodes.filter(node => node.type === 'decl')
|
|
|
- if (!deep && decls.length) {
|
|
|
- for (const decl of decls) {
|
|
|
- rule.removeChild(decl)
|
|
|
+ if (!deep) {
|
|
|
+ extractAndWrapNodes(rule)
|
|
|
+ const atruleNodes = rule.nodes.filter(node => node.type === 'atrule')
|
|
|
+ for (const atnode of atruleNodes) {
|
|
|
+ extractAndWrapNodes(atnode)
|
|
|
}
|
|
|
- const hostRule = new Rule({
|
|
|
- nodes: decls,
|
|
|
- selector: '&',
|
|
|
- })
|
|
|
- rule.prepend(hostRule)
|
|
|
}
|
|
|
shouldInject = deep
|
|
|
}
|
|
|
@@ -286,5 +282,22 @@ function isSpaceCombinator(node: selectorParser.Node) {
|
|
|
return node.type === 'combinator' && /^\s+$/.test(node.value)
|
|
|
}
|
|
|
|
|
|
+function extractAndWrapNodes(parentNode: Rule | AtRule) {
|
|
|
+ if (!parentNode.nodes) return
|
|
|
+ const nodes = parentNode.nodes.filter(
|
|
|
+ node => node.type === 'decl' || node.type === 'comment',
|
|
|
+ )
|
|
|
+ if (nodes.length) {
|
|
|
+ for (const node of nodes) {
|
|
|
+ parentNode.removeChild(node)
|
|
|
+ }
|
|
|
+ const wrappedRule = new Rule({
|
|
|
+ nodes: nodes,
|
|
|
+ selector: '&',
|
|
|
+ })
|
|
|
+ parentNode.prepend(wrappedRule)
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
scopedPlugin.postcss = true
|
|
|
export default scopedPlugin
|