@mapcss/config
Version:
Definition of MapCSS config, loader
60 lines (59 loc) • 1.94 kB
JavaScript
import valueParser from "../../deps/esm.sh/postcss-value-parser.js";
import { default as parseSelector } from "../../deps/deno.land/x/postcss_selector_parser@v6.0.2/mod.js";
const processor = (selectors) => {
selectors.walk((selector) => {
selector.spaces = { before: "", after: "" };
});
};
export function minifySelector(value) {
const selectorProcessor = parseSelector(processor);
return selectorProcessor.processSync(value, {});
}
function minifyValue(value) {
const parsed = valueParser(value.trim());
parsed.walk((node) => {
if (node.type === "div" || node.type === "function") {
node.before = "";
node.after = "";
}
if (node.type === "space")
node.value = " ";
});
return parsed.toString();
}
function plugin() {
return {
postcssPlugin: "postcss-minify",
AtRule: (atrule) => {
atrule.raws = { before: "", after: "", afterName: " " };
atrule.params = minifyValue(atrule.params);
},
Comment: (comment) => {
if (comment.text[0] === "!") {
comment.raws.before = "";
comment.raws.after = "";
}
else {
comment.remove();
}
},
Declaration: (decl) => {
// If custom variable of declaration value is ` `, keep it
decl.raws = {
before: "",
between: decl.variable && !decl.value ? ": " : ":",
value: decl.raws.value,
};
decl.value = minifyValue(decl.value);
},
Rule: (rule) => {
rule.raws = { before: "", between: "", after: "", semicolon: false };
rule.selector = minifySelector(rule.selector);
},
OnceExit: (css) => {
css.raws.after = "";
},
};
}
plugin.postcss = true;
export default plugin;