51 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
		
		
			
		
	
	
			51 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| 
								 | 
							
								module.exports = function targetEnvironments() {
							 | 
						||
| 
								 | 
							
								  var _targets = Object.create(null);
							 | 
						||
| 
								 | 
							
								  var _activeCount = 0;
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var checkAllowed = function(target) {
							 | 
						||
| 
								 | 
							
								    if (!(target in _targets)) {
							 | 
						||
| 
								 | 
							
								      throw new Error('Error accessing target "' + target + '". It is not in the list of allowed targets: ' + Object.keys(_targets));
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  var updateActiveCount = function() {
							 | 
						||
| 
								 | 
							
								    _activeCount = 0;
							 | 
						||
| 
								 | 
							
								    for(target in _targets) {
							 | 
						||
| 
								 | 
							
								      if (_targets[target]) _activeCount++;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  return {
							 | 
						||
| 
								 | 
							
								    addAllowed: function(target, isActive) {
							 | 
						||
| 
								 | 
							
								      _targets[target] = !!isActive;
							 | 
						||
| 
								 | 
							
								      updateActiveCount();
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    removeAllowed: function(target) {
							 | 
						||
| 
								 | 
							
								      delete _targets[target];
							 | 
						||
| 
								 | 
							
								      updateActiveCount();
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    activate: function(target) {
							 | 
						||
| 
								 | 
							
								      checkAllowed(target);
							 | 
						||
| 
								 | 
							
								      _targets[target] = true;
							 | 
						||
| 
								 | 
							
								      updateActiveCount();
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    deactivate: function(target) {
							 | 
						||
| 
								 | 
							
								      checkAllowed(target);
							 | 
						||
| 
								 | 
							
								      _targets[target] = false;
							 | 
						||
| 
								 | 
							
								      updateActiveCount();
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    isActive: function(target) {
							 | 
						||
| 
								 | 
							
								      checkAllowed(target);
							 | 
						||
| 
								 | 
							
								      return _targets[target];
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    hasActive: function() {
							 | 
						||
| 
								 | 
							
								      return _activeCount > 0;
							 | 
						||
| 
								 | 
							
								    },
							 | 
						||
| 
								 | 
							
								    someActive: function(targets) {
							 | 
						||
| 
								 | 
							
								      for(var i=0,ii=targets.length; i<ii; i++) {
							 | 
						||
| 
								 | 
							
								        if (this.isActive(targets[i])) return true;
							 | 
						||
| 
								 | 
							
								      }
							 | 
						||
| 
								 | 
							
								      return false;
							 | 
						||
| 
								 | 
							
								    }
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								};
							 |