var eventType = require('./eventType'); var diff = require('deep-diff').diff; var strategyTypes = [ eventType.strategyCreated, eventType.strategyDeleted ]; var featureTypes = [ eventType.featureCreated, eventType.featureUpdated, eventType.featureArchived, eventType.featureRevived ]; function baseTypeFor(event) { if (featureTypes.indexOf(event.type) !== -1) { return 'features'; } else if (strategyTypes.indexOf(event.type) !== -1) { return 'strategies'; } else { throw new Error('unknown event type: ' + JSON.stringify(event)); } } function groupByBaseTypeAndName(events) { var groups = {}; events.forEach(function (event) { var baseType = baseTypeFor(event); groups[baseType] = groups[baseType] || {}; groups[baseType][event.data.name] = groups[baseType][event.data.name] || []; groups[baseType][event.data.name].push(event); }); return groups; } function eachConsecutiveEvent(events, callback) { var groups = groupByBaseTypeAndName(events); Object.keys(groups).forEach(function (baseType) { var group = groups[baseType]; Object.keys(group).forEach(function (name) { var events = group[name]; var left, right, i, l; for (i = 0, l = events.length; i < l; i++) { left = events[i]; right = events[i + 1]; callback(left, right); } }); }); } function addDiffs(events) { eachConsecutiveEvent(events, function (left, right) { if (right) { left.diffs = diff(right.data, left.data); left.diffs = left.diffs || []; } else { left.diffs = null; } }); } module.exports = { addDiffs: addDiffs };