Skip to content

Instantly share code, notes, and snippets.

@asvny
Last active July 30, 2016 08:05
Show Gist options
  • Save asvny/f703afbff7969f70809625479aa70a8c to your computer and use it in GitHub Desktop.
Save asvny/f703afbff7969f70809625479aa70a8c to your computer and use it in GitHub Desktop.
postcss-modules-normalize
const postcss = require('postcss');
const fs = require('fs');
const __isDEV__ = false;
const plugin = postcss.plugin('postcss-cssmodules-normalize', function (opts={}) {
return function (css, result) {
var selMap = new Map();
if(__isDEV__) {
css.walkComments(comment => {
comment.remove();
});
}
const traverse = (decl) => {
let parentSel = decl.parent.selector;
decl.value.split(' ').map((sel) => {
if(selMap.has(`.${sel}`)) {
let selDeclVal = selMap.get(`.${sel}`);
selMap.set(`.${sel}`,selDeclVal.concat(parentSel));
}
else {
selMap.set(`.${sel}`,[parentSel])
}
});
decl.remove();
};
css.walkDecls('composes', traverse );
for(let kls of selMap.keys()) {
for(let [cls,val] of selMap.entries()) {
let isComposed = val.some($cls => $cls === kls);
if(isComposed) {
let selDeclVal = selMap.get(kls);
selMap.set(cls,selDeclVal.concat(val));
}
}
}
// console.dir(selMap);
css.walkRules(rule => {
if(selMap.has(rule.selector)) {
rule.selectors = rule.selectors.concat(selMap.get(rule.selector))
}
})
};
});
var css =`
.c-code { composes: u-pv }
.u-pt { t:a };
.u-pb { b:a };
.u-pv { composes: u-pt u-pb };
`;
const test = postcss()
.use(plugin())
.process(css)
.css;
//console.log(test)
module.exports = plugin;
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment