postcss-merge-rules
Version:
Merge CSS rules with PostCSS.
44 lines (39 loc) • 1.01 kB
JavaScript
/** @import {Declaration, Rule} from 'postcss' */
/**
* @typedef {Object} RuleMeta
* @property {string[]} selectors
* @property {Declaration[]} declarations
*/
/**
* @param {import('postcss').ChildNode} node
* @return {node is Declaration}
*/
function isDeclaration(node) {
return node.type === 'decl';
}
/**
* @param {Rule} rule
* @param {WeakMap<Rule, RuleMeta>} [ruleMeta]
* @return {RuleMeta}
*/
export function getMeta(rule, ruleMeta) {
if (ruleMeta && rule) {
let meta = ruleMeta.get(rule);
if (!meta && rule.nodes) {
meta = {
selectors: rule.selectors,
declarations: rule.nodes.filter(isDeclaration),
};
ruleMeta.set(rule, meta);
}
return meta ?? { selectors: [], declarations: [] };
}
return {
selectors: rule?.selectors ?? [],
declarations: rule?.nodes?.filter(isDeclaration) ?? [],
};
}
/** @param {Rule} rule @return {Declaration[]} */
export function getDecls(rule) {
return rule.nodes.filter(isDeclaration);
}