Files
deerflow-code/frontend-web/scripts/postcss-firefox52-where.mjs
T

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;