Home Reference Source Repository

src/index.js

import validator from 'schema-mapper-validator';

/**
 * Invert changes
 */
class Inverter {
  /**
   * Invert Changes
   * @param  {Changes} changes
   * @return {Changes}
   */
  invert(changes) {
    var validationResult = validator.validateChanges(changes);
    if (!validationResult.success) {
      throw new Error(validationResult.message);
    }
    changes = changes.reverse();
    var result = [];
    changes.forEach((change) => {
      if (change.change === 'project.create') {
        result.push({
          change: 'project.remove',
          projectId: change.projectId,
          oldProject: change.project
        });
      }
      if (change.change === 'project.remove') {
        result.push({
          change: 'project.create',
          projectId: change.projectId,
          project: change.oldProject
        });
      }
      if (change.change === 'project.rename') {
        result.push({
          change: 'project.rename',
          projectId: change.projectId,
          name: change.oldName,
          oldName: change.name
        });
      }
      if (change.change === 'project.tag') {
        result.push({
          change: 'project.tag',
          projectId: change.projectId,
          version: change.oldVersion,
          oldVersion: change.version
        });
      }
      if (change.change === 'project.extend') {
        result.push({
          change: 'project.extend',
          projectId: change.projectId,
          extend: change.oldExtend,
          oldExtend: change.extend
        });
      }
      if (change.change === 'schema.create') {
        result.push({
          change: 'schema.remove',
          projectId: change.projectId,
          schemaId: change.schemaId,
          oldSchema: change.schema
        });
      }
      if (change.change === 'schema.remove') {
        result.push({
          change: 'schema.create',
          projectId: change.projectId,
          schemaId: change.schemaId,
          schema: change.oldSchema
        });
      }
      if (change.change === 'schema.rename') {
        result.push({
          change: 'schema.rename',
          projectId: change.projectId,
          schemaId: change.schemaId,
          name: change.oldName,
          oldName: change.name
        });
      }
      if (change.change === 'schema.extend') {
        result.push({
          change: 'schema.extend',
          projectId: change.projectId,
          schemaId: change.schemaId,
          extend: change.oldExtend,
          oldExtend: change.extend
        });
      }
      if (change.change === 'column.create') {
        result.push({
          change: 'column.remove',
          projectId: change.projectId,
          schemaId: change.schemaId,
          columnId: change.columnId,
          oldColumn: change.column
        });
      }
      if (change.change === 'column.remove') {
        result.push({
          change: 'column.create',
          projectId: change.projectId,
          schemaId: change.schemaId,
          columnId: change.columnId,
          column: change.oldColumn
        });
      }
      if (change.change === 'column.rename') {
        result.push({
          change: 'column.rename',
          projectId: change.projectId,
          schemaId: change.schemaId,
          columnId: change.columnId,
          name: change.oldName,
          oldName: change.name
        });
      }
      if (change.change === 'column.typechange') {
        result.push({
          change: 'column.typechange',
          projectId: change.projectId,
          schemaId: change.schemaId,
          columnId: change.columnId,
          columnName: change.columnName,
          type: change.oldType,
          oldType: change.type
        });
      }
    });
    return result;
  }
}

/**
 * An instance of the inverter class is exported, you can use it immediately
 */
export default new Inverter();