diff --git a/index.js b/index.js index 4b479b1..86a85ec 100644 --- a/index.js +++ b/index.js @@ -305,75 +305,81 @@ module.exports = (opts = {}) => { let preserveEmpty = opts.preserveEmpty return { - Once(root) { - root.walkAtRules(rootRuleName, node => { - normalizeRootRule(node) - root[hasRootRule] = true - }) - }, - postcssPlugin: 'postcss-nested', - RootExit(root) { - if (!root[hasRootRule]) return - - root.walkAtRules(rootRuleName, unwrapRootRule) - root[hasRootRule] = false - }, - - Rule(rule) { - let unwrapped = false - let after = rule - let copyDeclarations = false - let declarations = [] - - rule.each(child => { - switch (child.type) { - case 'atrule': - [after, declarations] = pickAndClearDeclarations(rule.selector, declarations, after) - - if (child.name === rootRuleName) { - unwrapped = true - atruleChilds(rule, child, true, child[rootRuleMergeSel]) - after = breakOut(child, after) - } else if (bubble[child.name]) { - copyDeclarations = true - unwrapped = true - atruleChilds(rule, child, true) - after = breakOut(child, after) - } else if (unwrap[child.name]) { - copyDeclarations = true - unwrapped = true - atruleChilds(rule, child, false) - after = breakOut(child, after) - } else if (copyDeclarations) { - declarations.push(child) - } - - break - case 'decl': - if (copyDeclarations) { - declarations.push(child) + prepare() { + return { + Once(root) { + root.walkAtRules(rootRuleName, node => { + normalizeRootRule(node) + root[hasRootRule] = true + }) + }, + + postcssPlugin: 'postcss-nested', + + RootExit(root) { + if (!root[hasRootRule]) return + + root.walkAtRules(rootRuleName, unwrapRootRule) + root[hasRootRule] = false + }, + + Rule(rule) { + let unwrapped = false + let after = rule + let copyDeclarations = false + let declarations = [] + + rule.each(child => { + switch (child.type) { + case 'atrule': + [after, declarations] = pickAndClearDeclarations(rule.selector, declarations, after) + + if (child.name === rootRuleName) { + unwrapped = true + atruleChilds(rule, child, true, child[rootRuleMergeSel]) + after = breakOut(child, after) + } else if (bubble[child.name]) { + copyDeclarations = true + unwrapped = true + atruleChilds(rule, child, true) + after = breakOut(child, after) + } else if (unwrap[child.name]) { + copyDeclarations = true + unwrapped = true + atruleChilds(rule, child, false) + after = breakOut(child, after) + } else if (copyDeclarations) { + declarations.push(child) + } + + break + case 'decl': + if (copyDeclarations) { + declarations.push(child) + } + + break + case 'rule': + [after, declarations] = pickAndClearDeclarations(rule.selector, declarations, after) + + copyDeclarations = true + unwrapped = true + child.selectors = mergeSelectors(rule, child) + after = breakOut(child, after) + + break } + }) - break - case 'rule': - [after, declarations] = pickAndClearDeclarations(rule.selector, declarations, after) + pickAndClearDeclarations(rule.selector, declarations, after, false) - copyDeclarations = true - unwrapped = true - child.selectors = mergeSelectors(rule, child) - after = breakOut(child, after) - - break + if (unwrapped && preserveEmpty !== true) { + rule.raws.semicolon = true + if (rule.nodes.length === 0) rule.remove() + } } - }) - - pickAndClearDeclarations(rule.selector, declarations, after, false) - - if (unwrapped && preserveEmpty !== true) { - rule.raws.semicolon = true - if (rule.nodes.length === 0) rule.remove() } } }