montana/Russian/Site/messenger/dev/postcss-remove-global.ts

47 lines
1.4 KiB
TypeScript
Raw Normal View History

2026-05-18 18:05:32 +03:00
import type { Plugin } from 'postcss';
const pluginName = 'postcss-remove-global';
function removeGlobalPlugin(): Plugin {
return {
postcssPlugin: pluginName,
Once(root, helpers) {
const file = helpers.result.opts.from || '';
const isModule = /\.module\.(css|scss|sass)$/i.test(file);
if (isModule) {
return;
}
// :global in rules
root.walkRules((rule) => {
// :global as nested selector
const globalReg = /:global(\s+)/;
// :global(.selector) as nested selector
const globalWithSelectorReg = /:global\(\s*((?:[a-zA-Z0-9.#:[\]_\-\s>+~]+))\s*\)/;
if (rule.selector === ':global') {
const parent = rule.parent || root;
parent.append(...rule.nodes);
rule.remove();
} else if (rule.selector.match(globalReg)) {
rule.selector = rule.selector.replace(globalReg, '');
} else if (rule.selector.match(globalWithSelectorReg)) {
rule.selector = rule.selector.replace(globalWithSelectorReg, '$1');
}
});
// :global in AtRules
root.walkAtRules((atRule) => {
const name = atRule.name;
const params = atRule.params;
const globalReg = /:global\((\w+)\)/;
if (name === 'keyframes' && params.match(globalReg)) {
atRule.params = params.replace(globalReg, '$1');
}
});
},
};
}
removeGlobalPlugin.postcss = true;
export default removeGlobalPlugin;