diff options
Diffstat (limited to 'node_modules/csso/lib/restructure/2-initialMergeRuleset.js')
| -rw-r--r-- | node_modules/csso/lib/restructure/2-initialMergeRuleset.js | 53 |
1 files changed, 53 insertions, 0 deletions
diff --git a/node_modules/csso/lib/restructure/2-initialMergeRuleset.js b/node_modules/csso/lib/restructure/2-initialMergeRuleset.js new file mode 100644 index 00000000..c49abaa0 --- /dev/null +++ b/node_modules/csso/lib/restructure/2-initialMergeRuleset.js @@ -0,0 +1,53 @@ +import { walk } from 'css-tree'; +import { + unsafeToSkipNode, + isEqualSelectors, + isEqualDeclarations, + addSelectors, + hasSimilarSelectors +} from './utils.js'; + +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 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 (isEqualSelectors(prevSelectors, selectors)) { + prevDeclarations.appendList(declarations); + list.remove(item); + return true; + } + + // try to join by declarations + if (isEqualDeclarations(declarations, prevDeclarations)) { + addSelectors(prevSelectors, selectors); + list.remove(item); + return true; + } + } + + // go to prev ruleset if has no selector similarities + return 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 +export default function initialMergeRule(ast) { + walk(ast, { + visit: 'Rule', + enter: processRule + }); +}; |
