lotoss/project-lvl2-s257

View on GitHub
src/render/json.js

Summary

Maintainability
A
0 mins
Test Coverage
import { getType, getKey, getChildren, getValue, getPrevValue, getNextValue } from '../ast';

const render = (node) => {
  const renders = {
    NotChangedNode: () => ({ type: getType(node), value: getValue(node) }),
    AddedNode: () => ({ type: getType(node), value: getValue(node) }),
    RemovedNode: () => ({ type: getType(node), value: getValue(node) }),
    ChangedNode: () => ({
      type: getType(node),
      before: getPrevValue(node),
      after: getNextValue(node),
    }),
    NestedNode: () => getChildren(node).reduce(
      (acc, child) => ({ ...acc, [getKey(child)]: render(child) }),
      {},
    ),
  };

  const renderNode = renders[getType(node)];
  if (!renderNode) {
    throw new Error(`Unknown node type: ${getType(node)}`);
  }

  return renderNode();
};

export default ast => JSON.stringify(render(ast));