'use strict';
const valueParser = require('postcss-value-parser');
const addToCache = require('./cache');
const RESERVED_KEYWORDS = new Set(['none', 'inherit', 'initial', 'unset']);
module.exports = function () {
let cache = {};
let atRules = [];
let decls = [];
return {
collect(node, encoder) {
const { type } = node;
if (
type === 'atrule' &&
/keyframes/i.test(node.name) &&
!RESERVED_KEYWORDS.has(node.params.toLowerCase())
) {
addToCache(node.params, encoder, cache);
atRules.push(node);
}
if (type === 'decl' && /animation/i.test(node.prop)) {
decls.push(node);
}
},
transform() {
const referenced = new Set();
decls.forEach((decl) => {
decl.value = valueParser(decl.value)
.walk((node) => {
if (node.type === 'word' && node.value in cache) {
if (!referenced.has(node.value)) {
referenced.add(node.value);
}
cache[node.value].count++;
node.value = cache[node.value].ident;
}
})
.toString();
});
atRules.forEach((rule) => {
const cached = cache[rule.params];
if (cached && cached.count > 0 && referenced.has(rule.params)) {
rule.params = cached.ident;
}
});
atRules = [];
decls = [];
},
};
};