AnastasiyaYS/project-lvl2-s475

View on GitHub
src/index.js

Summary

Maintainability
A
1 hr
Test Coverage
import path from 'path';
import _ from 'lodash/fp';
import fs from 'fs';
import parse from './parsers';
import formatProperties from './formatters';

const generateDiff = (beforeObj, afterObj) => {
  const unitedKeys = _.union(Object.keys(afterObj), Object.keys(beforeObj));
  return unitedKeys.map((key) => {
    if (_.has(key, beforeObj) && _.has(key, afterObj)) {
      if (beforeObj[key] instanceof Object && afterObj[key] instanceof Object) {
        return {
          key, type: 'parent', children: generateDiff(beforeObj[key], afterObj[key]),
        };
      }
      if (beforeObj[key] === afterObj[key]) {
        return {
          key, type: 'unchanged', beforeValue: beforeObj[key], afterValue: afterObj[key],
        };
      }
      return {
        key, type: 'updated', beforeValue: beforeObj[key], afterValue: afterObj[key],
      };
    }
    if (_.has(key, beforeObj) && !_.has(key, afterObj)) {
      return {
        key, type: 'removed', beforeValue: beforeObj[key],
      };
    }
    return {
      key, type: 'added', afterValue: afterObj[key],
    };
  });
};

export default (firstConfig, secondConfig, format = 'tree') => {
  const firstPath = path.resolve(process.cwd(), firstConfig);
  const secondPath = path.resolve(process.cwd(), secondConfig);

  const beforeObj = parse(path.extname(firstPath), fs.readFileSync(firstPath, 'utf8'));
  const afterObj = parse(path.extname(secondPath), fs.readFileSync(secondPath, 'utf8'));

  const ast = generateDiff(beforeObj, afterObj);
  return formatProperties(format, ast);
};