GKoil/frontend-project-lvl2

View on GitHub
src/getAST.js

Summary

Maintainability
A
1 hr
Test Coverage
A
100%
import _ from 'lodash';

const getAST = (before, after) => {
  const keys = _.union(Object.keys(before), Object.keys(after));
  return keys.map((key) => {
    if (!_.has(before, key)) {
      return {
        key, status: 'added', value: after[key],
      };
    }
    if (!_.has(after, key)) {
      return {
        key, status: 'deleted', value: before[key],
      };
    }
    if (_.isPlainObject(before[key]) && _.isPlainObject(after[key])) {
      const children = getAST(before[key], after[key]);
      return {
        key, status: 'nested', children,
      };
    }
    if (!_.isEqual(before[key], after[key])) {
      return {
        key, status: 'updated', oldValue: before[key], newValue: after[key],
      };
    }
    return {
      key, status: 'unchanged', value: after[key],
    };
  });
};

export default getAST;