import { walk, generate, keyword as resolveKeyword } from 'css-tree'; import createDeclarationIndexer from './createDeclarationIndexer.js'; import processSelector from './processSelector.js'; export default function prepare(ast, options) { const markDeclaration = createDeclarationIndexer(); walk(ast, { visit: 'Rule', enter(node) { node.block.children.forEach(markDeclaration); processSelector(node, options.usage); } }); walk(ast, { visit: 'Atrule', enter(node) { if (node.prelude) { node.prelude.id = null; // pre-init property to avoid multiple hidden class for generate node.prelude.id = generate(node.prelude); } // compare keyframe selectors by its values // NOTE: still no clarification about problems with keyframes selector grouping (issue #197) if (resolveKeyword(node.name).basename === 'keyframes') { node.block.avoidRulesMerge = true; /* probably we don't need to prevent those merges for @keyframes TODO: need to be checked */ node.block.children.forEach(function(rule) { rule.prelude.children.forEach(function(simpleselector) { simpleselector.compareMarker = simpleselector.id; }); }); } } }); return { declaration: markDeclaration }; };