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.
		
		
		
		
			
				
					57 lines
				
				1021 B
			
		
		
			
		
	
	
					57 lines
				
				1021 B
			| 
								 
											4 years ago
										 
									 | 
							
								/*
							 | 
						||
| 
								 | 
							
									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;
							 |