postcss-merge-longhand
Version:
Merge longhand properties into shorthand with PostCSS.
36 lines (30 loc) • 1.04 kB
JavaScript
const isCustomProp = require('./isCustomProp');
/** @type {(node: import('postcss').Declaration) => boolean} */
const important = (node) => node.important;
/** @type {(node: import('postcss').Declaration) => boolean} */
const unimportant = (node) => !node.important;
/* Cannot be combined with other values in shorthand
https://www.w3.org/TR/css-cascade-5/#shorthand */
const cssWideKeywords = ['inherit', 'initial', 'unset', 'revert'];
/**
* @type {(props: import('postcss').Declaration[], includeCustomProps?: boolean) => boolean}
*/
module.exports = (props, includeCustomProps = true) => {
const uniqueProps = new Set(props.map((node) => node.value.toLowerCase()));
if (uniqueProps.size > 1) {
for (const unmergeable of cssWideKeywords) {
if (uniqueProps.has(unmergeable)) {
return false;
}
}
}
if (
includeCustomProps &&
props.some(isCustomProp) &&
!props.every(isCustomProp)
) {
return false;
}
return props.every(unimportant) || props.every(important);
};
;