mirror of
				https://github.com/Unleash/unleash.git
				synced 2025-10-27 11:02:16 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			79 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			79 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 'use strict';
 | |
| 
 | |
| const eventType = require('./event-type');
 | |
| const diff = require('deep-diff').diff;
 | |
| 
 | |
| const strategyTypes = [
 | |
|     eventType.strategyCreated,
 | |
|     eventType.strategyDeleted,
 | |
| ];
 | |
| 
 | |
| const 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';
 | |
|     }
 | |
|     throw new Error(`unknown event type: ${JSON.stringify(event)}`);
 | |
| }
 | |
| 
 | |
| function groupByBaseTypeAndName (events) {
 | |
|     const groups = {};
 | |
| 
 | |
|     events.forEach(event => {
 | |
|         const 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) {
 | |
|     const groups = groupByBaseTypeAndName(events);
 | |
| 
 | |
|     Object.keys(groups).forEach(baseType => {
 | |
|         const group = groups[baseType];
 | |
| 
 | |
|         Object.keys(group).forEach(name => {
 | |
|             const currentEvents = group[name];
 | |
|             let left;
 | |
|             let right;
 | |
|             let i;
 | |
|             let l;
 | |
|             for (i = 0, l = currentEvents.length; i < l; i++) {
 | |
|                 left  = currentEvents[i];
 | |
|                 right = currentEvents[i + 1];
 | |
| 
 | |
|                 callback(left, right);
 | |
|             }
 | |
|         });
 | |
|     });
 | |
| }
 | |
| 
 | |
| function addDiffs (events) {
 | |
|     eachConsecutiveEvent(events, (left, right) => {
 | |
|         if (right) {
 | |
|             left.diffs = diff(right.data, left.data);
 | |
|             left.diffs = left.diffs || [];
 | |
|         } else {
 | |
|             left.diffs = null;
 | |
|         }
 | |
|     });
 | |
| }
 | |
| 
 | |
| 
 | |
| module.exports = {
 | |
|     addDiffs,
 | |
| };
 |