NMVikings/project-lvl2-s329

View on GitHub
src/renderers/renderPlain.js

Summary

Maintainability
A
0 mins
Test Coverage
import _ from 'lodash';

const createString = (parents, name, action) => `Property '${[...parents, name].join('.')}' was ${action}`;

const renderValue = (value) => {
  if (value instanceof Object) return '[complex value]';

  if (typeof value === 'string') return `'${value}'`;

  return value;
};

const renderPlain = (ast) => {
  const iter = (nodes, parents) => {
    const mapping = {
      'not updated': () => null,
      updated: ({ name, type, value }) => `${createString(parents, name, type)}. From ${renderValue(value.old)} to ${renderValue(value.new)}`,
      removed: ({ name, type }) => createString(parents, name, type),
      added: ({ name, type, value }) => `${createString(parents, name, type)} with value: ${renderValue(value)}`,
      nested: ({ name, children }) => iter(children, parents.concat(name)),
    };

    const newNodes = nodes.map(node => mapping[node.type](node)).filter(s => !!s);

    return _.flatten(newNodes).join('\n');
  };

  return iter(ast, []);
};

export default renderPlain;