58 lines
1.3 KiB
JavaScript
58 lines
1.3 KiB
JavaScript
'use strict';
|
|
const plugin = 'postcss-discard-empty';
|
|
/**
|
|
* @param {import('postcss').Root} css
|
|
* @param {import('postcss').Result} result
|
|
* @return {void}
|
|
*/
|
|
function discardAndReport(css, result) {
|
|
/**
|
|
* @param {import('postcss').AnyNode} node
|
|
* @return {void}
|
|
*/
|
|
function discardEmpty(node) {
|
|
const { type } = node;
|
|
/** @type {(import('postcss').ChildNode | import('postcss').ChildProps)[] | undefined} */
|
|
const sub = /** @type {any} */ (node).nodes;
|
|
if (sub) {
|
|
/** @type {import('postcss').Container} */ (node).each(discardEmpty);
|
|
}
|
|
|
|
if (
|
|
(type === 'decl' && !node.value && !node.prop.startsWith('--')) ||
|
|
(type === 'rule' && !node.selector) ||
|
|
(sub && !sub.length) ||
|
|
(type === 'atrule' &&
|
|
((!sub && !node.params) ||
|
|
(!node.params &&
|
|
!(/** @type {import('postcss').ChildNode[]}*/ (sub).length))))
|
|
) {
|
|
node.remove();
|
|
|
|
result.messages.push({
|
|
type: 'removal',
|
|
plugin,
|
|
node,
|
|
});
|
|
}
|
|
}
|
|
|
|
css.each(discardEmpty);
|
|
}
|
|
|
|
/**
|
|
* @type {import('postcss').PluginCreator<void>}
|
|
* @return {import('postcss').Plugin}
|
|
*/
|
|
function pluginCreator() {
|
|
return {
|
|
postcssPlugin: plugin,
|
|
OnceExit(css, { result }) {
|
|
discardAndReport(css, result);
|
|
},
|
|
};
|
|
}
|
|
|
|
pluginCreator.postcss = true;
|
|
module.exports = pluginCreator;
|