1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677 |
- import browserslist from 'browserslist';
- import postcss from 'postcss';
- var index = postcss.plugin('postcss-browser-comments', opts => root => {
-
- const clientBrowserList = browserslist(Object(opts).browsers || null, {
- path: root.source && root.source.input && root.source.input.file
- });
- const references = root.nodes.slice(0);
- for (let node of references) {
-
- if (isBrowserCommentNode(node)) {
-
- const rule = node.next();
- const browserdata = getBrowserData(node.text);
- if (browserdata.isNumbered) {
- rule.nodes.filter(isBrowserReferenceCommentNode).map(comment => {
- const browserdataIndex = parseFloat(comment.text) - 1;
- const browserslistPart = browserdata.browserslist[browserdataIndex];
- const removeRule = !clientBrowserList.some(clientBrowser => browserslist(browserslistPart).some(commentBrowser => commentBrowser === clientBrowser));
- if (removeRule) {
- comment.prev().remove();
- comment.remove();
- }
- });
- if (!rule.nodes.length) {
- rule.remove();
- node.remove();
- }
- } else {
-
- const removeRule = !clientBrowserList.some(clientBrowser => browserslist(browserdata.browserslist).some(commentBrowser => commentBrowser === clientBrowser));
- if (removeRule) {
- rule.remove();
- node.remove();
- }
- }
- }
- }
- });
- const isBrowserCommentNode = node => node.type === 'comment' && isBrowserCommentNodeRegExp.test(node.text) && node.next().type === 'rule';
- const isBrowserCommentNodeRegExp = /^\*\n * /;
- const isBrowserReferenceCommentNode = node => node.type === 'comment' && isBrowserReferenceCommentNodeRegExp.test(node.text);
- const isBrowserReferenceCommentNodeRegExp = /^\d+$/;
- const getBrowserData = text => {
- const browserDataNumbered = text.match(browserDataMutliRegExp);
- const isNumbered = Boolean(browserDataNumbered);
- return {
- browserslist: isNumbered ? browserDataNumbered.map(browserslistPart => getBrowsersList(browserslistPart.replace(browserDataNumberedNewlineRegExp, '$1'))) : getBrowsersList(text.replace(browserDataNewlineRegExp, '')),
- isNumbered
- };
- };
- const browserDataMutliRegExp = /(\n \* \d+\. (?:[^\n]+|\n \* {4,})+)/g;
- const browserDataNewlineRegExp = /^\*\n \* ?|\n \*/g;
- const browserDataNumberedNewlineRegExp = /\n \* (?:( )\s*)?/g;
- const getBrowsersList = text => text.split(getBrowsersListInSplitRegExp).slice(1).map(part => part.split(getBrowsersListAndSplitRegExp).filter(part2 => part2)).reduce((acc, val) => acc.concat(val), []).map(part => part.replace(getBrowsersListQueryRegExp, ($0, browser, query) => browser === 'all' ? '> 0%' : `${browser}${query ? /^((?:\d*\.)?\d+)-$/.test(query) ? ` <= ${query.slice(0, -1)}` : ` ${query}` : ' > 0'}`).toLowerCase());
- const getBrowsersListInSplitRegExp = /\s+in\s+/;
- const getBrowsersListAndSplitRegExp = /(?: and|, and|,)/;
- const getBrowsersListQueryRegExp = /^\s*(\w+)(?: ((?:(?:\d*\.)?\d+-)?(?:\d*\.)?\d+[+-]?))?.*$/;
- export default index;
|