all files / src/ chunk.js

100% Statements 39/39
100% Branches 8/8
100% Functions 3/3
100% Lines 28/28
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58   58×                     172× 36×       208×       172× 22× 22× 22×     172× 172×     36×     36× 36× 36× 36×   58× 58× 58× 58× 29× 29×   29×       36×    
import css from 'css';
import { count } from './count';
import { SELECTOR_LIMIT } from './constants';
 
function createAst(rules, selectorCount) {
  return {
    ast: {
      type: 'stylesheet',
      stylesheet: {
        rules: rules
      }
    },
    selectorCount: selectorCount
  };
}
 
function *chunks(ast) {
  let rules = ast.stylesheet.rules;
  let splitRules = [];
  let selectorCount = 0;
 
  for(let i = 0; i < rules.length; i++) {
    let rule = rules[i];
    let ruleSelectorCount = count(rule);
 
    if (selectorCount + ruleSelectorCount > SELECTOR_LIMIT) {
      yield createAst(splitRules, selectorCount);
      splitRules = [];
      selectorCount = 0;
    }
 
    splitRules.push(rule);
    selectorCount += ruleSelectorCount;
  }
 
  yield createAst(splitRules, selectorCount);
}
 
export default function chunk(code, options) {
  let fullAst = css.parse(code, { source: options.source });
  let totalSelectorCount = 0;
  let data = [];
  let maps = [];
 
  for(let { ast, selectorCount } of chunks(fullAst)) {
    let stringified = css.stringify(ast, { sourcemap: options.sourcemaps });
    totalSelectorCount += selectorCount;
    if (options.source && options.sourcemaps) {
      data.push(stringified.code);
      maps.push(stringified.map);
    } else {
      data.push(stringified);
    }
  }
 
  return { data, maps, totalSelectorCount };
}