function _isMatchingMediaQuery (rule, matchConfig) { if (rule.type !== 'media') { // ignore (keep) all non media query rules return true } try { var mediaAST = cssMediaQuery.parse(rule.media) } catch (e) { // cant parse, most likely browser cant either return false } var keep = mediaAST.some(function (mq) { if (mq.type === 'print') { return false } return mq.expressions.some(function (expression, index) { if (expression.modifier === 'min') { return cssMediaQuery.match('(min-' + expression.feature + ':' + expression.value + ')', matchConfig) } else { return true } }) }) return keep }
function _isMatchingMediaQuery(rule, matchConfig) { if (rule.type !== 'media') { // ignore (keep) all non media query rules return true; } var mediaAST; try { mediaAST = cssMediaQuery.parse(rule.media); } catch (e) { // cant parse, most likely browser cant either return false; } var keep = mediaAST.some(function (mq) { if (mq.type === 'print') { return false; } // f.e. @media all {} // go for false positives over false negatives, // i.e. accept @media randomThing {} if (mq.expressions.length === 0) { return true; } return mq.expressions.some(function (expression) { if (expression.modifier === 'min') { return cssMediaQuery.match('(min-' + expression.feature + ':' + expression.value + ')', matchConfig); } else { return true; } }); }); return keep; }
function normalizeMediaQuery(mq, options) { mq = mq.trim(); var expand = options && options.expand; if (expand) { mq = 'screen and (min-width: ' + mq + ')'; } try { mediaQuery.parse(mq); return mq; } catch (e) { // When we've already expanded the short-hand MQ syntax, or when the // short-hand form doesn't look like a length value, re-throw the error. if (expand || !/^(\d|\.)/.test(mq)) { throw e; } } // Try again, this time expanding the `mq` assuming it's in the short-hand. return normalizeMediaQuery(mq, {expand: true}); }
const transform = (css, options) => { const { stylesheet } = parseCSS(css); const rules = sortRules(stylesheet.rules); const result = {}; for (const r in rules) { const rule = rules[r]; for (const s in rule.selectors) { if (rule.selectors[s] === ":export") { if (!result.__exportProps) { result.__exportProps = {}; } rule.declarations.forEach(({ property, value }) => { const isAlreadyDefinedAsClass = result[property] !== undefined && result.__exportProps[property] === undefined; if (isAlreadyDefinedAsClass) { throw new Error( `Failed to parse :export block because a CSS class in the same file is already using the name "${property}"`, ); } result.__exportProps[property] = value; }); continue; } if ( rule.selectors[s].indexOf(".") !== 0 || rule.selectors[s].indexOf(":") !== -1 || rule.selectors[s].indexOf("[") !== -1 || rule.selectors[s].indexOf("~") !== -1 || rule.selectors[s].indexOf(">") !== -1 || rule.selectors[s].indexOf("+") !== -1 || rule.selectors[s].indexOf(" ") !== -1 ) { continue; } const selector = rule.selectors[s].replace(/^\./, ""); const styles = (result[selector] = result[selector] || {}); transformDecls(styles, rule.declarations, result); } if ( rule.type == "media" && options != null && options.parseMediaQueries === true ) { const parsed = mediaQuery.parse(rule.media); parsed.forEach(mq => { if (mediaQueryTypes.indexOf(mq.type) === -1) { throw new Error(`Failed to parse media query type "${mq.type}"`); } mq.expressions.forEach(e => { const mf = e.modifier ? `${e.modifier}-${e.feature}` : e.feature; const val = e.value ? `: ${e.value}` : ""; if (mediaQueryFeatures.indexOf(e.feature) === -1) { throw new Error(`Failed to parse media query feature "${mf}"`); } if ( dimensionFeatures.indexOf(e.feature) > -1 && lengthRe.test(e.value) === false ) { throw new Error( `Failed to parse media query expression "(${mf}${val})"`, ); } }); }); const media = "@media " + rule.media; result.__mediaQueries = result.__mediaQueries || {}; result.__mediaQueries[media] = parsed; for (const r in rule.rules) { const ruleRule = rule.rules[r]; for (const s in ruleRule.selectors) { result[media] = result[media] || {}; const selector = ruleRule.selectors[s].replace(/^\./, ""); const mediaStyles = (result[media][selector] = result[media][selector] || {}); transformDecls(mediaStyles, ruleRule.declarations, result); } } } } if (result.__exportProps) { Object.assign(result, result.__exportProps); delete result.__exportProps; } return result; };