UsmanAAV/project-lvl2-s225

View on GitHub
src/renderers/stylish.js

Summary

Maintainability
A
0 mins
Test Coverage
import fp from 'lodash/fp';

const renderDefault = (ast, depth = 0) => {
  const makeIndent = (count) => `${'  '.repeat(count * 2)}`;

  const printValue = (value) => {
    if (value instanceof Object) {
      const res = Object.keys(value).map((key) => `${makeIndent(depth + 2)}${key}: ${value[key]}`, []).join(', ');
      return `{\n${res}\n${makeIndent(depth + 1)}}`;
    }
    return value;
  };

  const makeEnt = (key, value) => `${key}: ${printValue(value)}`;

  const propertyActions = {
    added: (elem) => `${makeIndent(depth)}  + ${makeEnt(elem.keyName, elem.newValue)}`,
    deleted: (elem) => `${makeIndent(depth)}  - ${makeEnt(elem.keyName, elem.value)}`,
    unchanged: (elem) => `${makeIndent(depth)}    ${makeEnt(elem.keyName, elem.value)}`,
    updated: (elem) => [`${makeIndent(depth)}  - ${makeEnt(elem.keyName, elem.value)}`,
      `${makeIndent(depth)}  + ${makeEnt(elem.keyName, elem.newValue)}`],
    nested: (elem) => `${makeIndent(depth)}    ${elem.keyName}: ${renderDefault(elem.value, depth + 1)}`,
  };

  const result = fp.flatten(ast.map((node) => propertyActions[node.type](node)))
    .join('\n');
  return `{\n${result}\n${makeIndent(depth)}}`;
};

export default renderDefault;