You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							56 lines
						
					
					
						
							1021 B
						
					
					
				
			
		
		
	
	
							56 lines
						
					
					
						
							1021 B
						
					
					
				/* | 
						|
	MIT License http://www.opensource.org/licenses/mit-license.php | 
						|
	Author Tobias Koppers @sokra | 
						|
*/ | 
						|
"use strict"; | 
						|
 | 
						|
class HookMap { | 
						|
	constructor(factory) { | 
						|
		this._map = new Map(); | 
						|
		this._factory = factory; | 
						|
		this._interceptors = []; | 
						|
	} | 
						|
 | 
						|
	get(key) { | 
						|
		return this._map.get(key); | 
						|
	} | 
						|
 | 
						|
	for(key) { | 
						|
		const hook = this.get(key); | 
						|
		if (hook !== undefined) { | 
						|
			return hook; | 
						|
		} | 
						|
		let newHook = this._factory(key); | 
						|
		const interceptors = this._interceptors; | 
						|
		for (let i = 0; i < interceptors.length; i++) { | 
						|
			newHook = interceptors[i].factory(key, newHook); | 
						|
		} | 
						|
		this._map.set(key, newHook); | 
						|
		return newHook; | 
						|
	} | 
						|
 | 
						|
	intercept(interceptor) { | 
						|
		this._interceptors.push( | 
						|
			Object.assign( | 
						|
				{ | 
						|
					factory: (key, hook) => hook | 
						|
				}, | 
						|
				interceptor | 
						|
			) | 
						|
		); | 
						|
	} | 
						|
 | 
						|
	tap(key, options, fn) { | 
						|
		return this.for(key).tap(options, fn); | 
						|
	} | 
						|
 | 
						|
	tapAsync(key, options, fn) { | 
						|
		return this.for(key).tapAsync(options, fn); | 
						|
	} | 
						|
 | 
						|
	tapPromise(key, options, fn) { | 
						|
		return this.for(key).tapPromise(options, fn); | 
						|
	} | 
						|
} | 
						|
 | 
						|
module.exports = HookMap;
 | 
						|
 |