All files / style9/src create.js

100% Statements 41/41
100% Branches 4/4
100% Functions 5/5
100% Lines 41/41

Press n or j to go to the next uncovered block, b, p or k for the previous block.

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 59 60 61 62 63 64 65 66 67 68 69        8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x 8x     59x 36x   58x       5x 5x 5x 5x   5x         63x 63x   63x 62x 60x   60x   59x 59x   58x 58x 58x 58x 58x   58x 58x   58x       58x 58x   57x     8x  
const {
  mapObject,
  mapObjectValues,
  filterObjectKeys
} = require('./utils/helpers');
const { minifyProperty } = require('./utils/styles');
const getStyleObjectValue = require('./get-style-object-value');
const generateClasses = require('./generate-classes');
const listStaticKeys = require('./list-static-keys');
const listReferences = require('./list-references');
const listDynamicKeys = require('./list-dynamic-keys');
const listFunctionCalls = require('./list-function-calls');
const normalizeArguments = require('./normalize-arguments');
const listFunctionCallKeys = require('./list-function-call-keys');
const generateStyles = require('./generate-styles');
const { replaceCreateCall, replaceFunctionCalls } = require('./mutate-ast');
const { validateReferences } = require('./validate');
 
function normalizeFunctionCalls(callExpressions) {
  const entries = callExpressions.map(id => {
    return [id.parentPath, normalizeArguments(id.parentPath)];
  });
  return new Map(entries);
}
 
function minifyProperties(classes) {
  return mapObject(classes, ([key, value]) => {
    const minifiedName = minifyProperty(key);
    const isObject = typeof value === 'object';
    const minifiedValue = isObject ? minifyProperties(value) : value;
 
    return [minifiedName, minifiedValue];
  });
}
 
function transpileCreate(identifier, options) {
  const callExpr = identifier.parentPath.parentPath;
  const objExpr = callExpr.get('arguments.0');
 
  const styleDefinitions = getStyleObjectValue(objExpr);
  const styleClasses = generateClasses(styleDefinitions);
  const references = listReferences(callExpr.parentPath);
 
  validateReferences(references);
 
  const funcCalls = listFunctionCalls(references);
  const normalizedFuncCalls = normalizeFunctionCalls(funcCalls);
 
  const styleNames = Object.keys(styleDefinitions);
  const staticKeys = listStaticKeys(callExpr, styleNames);
  const dynamicKeys = listDynamicKeys(references, styleNames);
  const funcCallKeys = listFunctionCallKeys([...normalizedFuncCalls.values()]);
  const allKeys = [...staticKeys, ...dynamicKeys, ...funcCallKeys];
 
  const filteredDefinitions = filterObjectKeys(styleDefinitions, allKeys);
  const filteredStyleValues = filterObjectKeys(styleClasses, allKeys);
 
  const minifiedStyleValues = options.minifyProperties
    ? mapObjectValues(filteredStyleValues, minifyProperties)
    : filteredStyleValues;
 
  replaceCreateCall(callExpr, minifiedStyleValues);
  replaceFunctionCalls(normalizedFuncCalls, styleClasses);
 
  return generateStyles(filteredDefinitions);
}
 
module.exports = { transpileCreate };