grigori-gru/project-lvl2-s90

View on GitHub
src/index.js

Summary

Maintainability
B
4 hrs
Test Coverage
import _ from 'lodash';
import path from 'path';
import parse from './parsers';
import getData from './reader';
import render from './renderers';

const getFormat = item => path.extname(item).slice(1);

const createNode = (type, key, oldValue, newValue, children) =>
  ({ type, key, oldValue, newValue, children });

const makeAst = (f1, f2) =>
  _.union(_.keys(f1), _.keys(f2)).map((key) => {
    if (_.has(f1, key) && _.has(f2, key)) {
      if (typeof f1[key] === 'object') {
        return createNode('unchanged', key, '', '', makeAst(f1[key], f2[key]));
      }
      return (f1[key] === f2[key]) ?
        createNode('unchanged', key, f1[key], '', []) :
        createNode('updated', key, f1[key], f2[key], []);
    }
    if (_.has(f1, key)) {
      return (typeof f1[key] === 'object') ?
        createNode('removed', key, '', '', makeAst(f1[key], f1[key])) :
        createNode('removed', key, '', f1[key], []);
    }
    return (typeof f2[key] === 'object') ?
      createNode('added', key, '', '', makeAst(f2[key], f2[key])) :
      createNode('added', key, '', f2[key], []);
  });

export default (firstName, secondName, option = 'stringify') => {
  const [f1, f2] = [firstName, secondName].map(item =>
    parse(getFormat(item), getData(item)));

  const ast = makeAst(f1, f2);

  return render(option, ast);
};