| 'use strict'; |
| |
| const cssTree = require('css-tree'); |
| const utils = require('./utils.cjs'); |
| |
| function processRule(node, item, list) { |
| const selectors = node.prelude.children; |
| const declarations = node.block.children; |
| |
| list.prevUntil(item.prev, function(prev) { |
| // skip non-ruleset node if safe |
| if (prev.type !== 'Rule') { |
| return utils.unsafeToSkipNode.call(selectors, prev); |
| } |
| |
| const prevSelectors = prev.prelude.children; |
| const prevDeclarations = prev.block.children; |
| |
| // try to join rulesets with equal pseudo signature |
| if (node.pseudoSignature === prev.pseudoSignature) { |
| // try to join by selectors |
| if (utils.isEqualSelectors(prevSelectors, selectors)) { |
| prevDeclarations.appendList(declarations); |
| list.remove(item); |
| return true; |
| } |
| |
| // try to join by declarations |
| if (utils.isEqualDeclarations(declarations, prevDeclarations)) { |
| utils.addSelectors(prevSelectors, selectors); |
| list.remove(item); |
| return true; |
| } |
| } |
| |
| // go to prev ruleset if has no selector similarities |
| return utils.hasSimilarSelectors(selectors, prevSelectors); |
| }); |
| } |
| |
| // NOTE: direction should be left to right, since rulesets merge to left |
| // ruleset. When direction right to left unmerged rulesets may prevent lookup |
| // TODO: remove initial merge |
| function initialMergeRule(ast) { |
| cssTree.walk(ast, { |
| visit: 'Rule', |
| enter: processRule |
| }); |
| } |
| |
| module.exports = initialMergeRule; |