48 lines
1.3 KiB
JavaScript
48 lines
1.3 KiB
JavaScript
import selectorParser from "postcss-selector-parser";
|
|
|
|
function firstWhere(selector) {
|
|
let found;
|
|
selector.walkPseudos((pseudo) => {
|
|
if (!found && pseudo.value.toLowerCase() === ":where") found = pseudo;
|
|
});
|
|
return found;
|
|
}
|
|
|
|
function expandWhere(selector) {
|
|
const pseudo = firstWhere(selector);
|
|
if (!pseudo) return [selector];
|
|
const alternatives = pseudo.nodes ?? [];
|
|
if (alternatives.length === 0) {
|
|
pseudo.remove();
|
|
return expandWhere(selector);
|
|
}
|
|
|
|
return alternatives.flatMap((alternative) => {
|
|
const clone = selector.clone();
|
|
const clonePseudo = firstWhere(clone);
|
|
if (!clonePseudo) return [clone];
|
|
clonePseudo.replaceWith(...alternative.nodes.map((node) => node.clone()));
|
|
return expandWhere(clone);
|
|
});
|
|
}
|
|
|
|
/** Expand :where() only in the Firefox 52 build, where the selector is invalid. */
|
|
export default function firefox52Where() {
|
|
return {
|
|
postcssPlugin: "postcss-firefox52-where",
|
|
Rule(rule) {
|
|
if (!rule.selector.includes(":where(")) return;
|
|
rule.selector = selectorParser((root) => {
|
|
const selectors = [...root.nodes];
|
|
root.removeAll();
|
|
for (const selector of selectors) {
|
|
for (const expanded of expandWhere(selector)) root.append(expanded);
|
|
}
|
|
}).processSync(rule.selector);
|
|
},
|
|
};
|
|
}
|
|
|
|
firefox52Where.postcss = true;
|
|
|