diff options
| author | littleblack111 <littleblack11111@gmail.com> | 2023-10-14 15:05:55 +0800 |
|---|---|---|
| committer | littleblack111 <littleblack11111@gmail.com> | 2023-10-14 15:05:55 +0800 |
| commit | c06f7ee0a40255214c477e13d9b956a7e07c2900 (patch) | |
| tree | f5982a568ef8fab865d0142e71c7494fea3e4c1b /node_modules/csso/cjs/restructure/2-initialMergeRuleset.cjs | |
| parent | 3fd9400d4dccc25aa29b5702216732e0b7542073 (diff) | |
postcss,(plugins): nanocss, postcss-preset-env
Diffstat (limited to 'node_modules/csso/cjs/restructure/2-initialMergeRuleset.cjs')
| -rw-r--r-- | node_modules/csso/cjs/restructure/2-initialMergeRuleset.cjs | 51 |
1 files changed, 51 insertions, 0 deletions
diff --git a/node_modules/csso/cjs/restructure/2-initialMergeRuleset.cjs b/node_modules/csso/cjs/restructure/2-initialMergeRuleset.cjs new file mode 100644 index 00000000..1a1f90ce --- /dev/null +++ b/node_modules/csso/cjs/restructure/2-initialMergeRuleset.cjs @@ -0,0 +1,51 @@ +'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; |
