Spaces:
Configuration error
Configuration error
; | |
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; | |