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();