70 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
			
		
		
	
	
			70 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			JavaScript
		
	
	
	
	
	
| /*
 | |
| 	MIT License http://www.opensource.org/licenses/mit-license.php
 | |
| 	Author Tobias Koppers @sokra
 | |
| */
 | |
| "use strict";
 | |
| 
 | |
| const util = require("util");
 | |
| 
 | |
| const defaultFactory = (key, hook) => hook;
 | |
| 
 | |
| class HookMap {
 | |
| 	constructor(factory, name = undefined) {
 | |
| 		this._map = new Map();
 | |
| 		this.name = name;
 | |
| 		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: defaultFactory
 | |
| 				},
 | |
| 				interceptor
 | |
| 			)
 | |
| 		);
 | |
| 	}
 | |
| }
 | |
| 
 | |
| HookMap.prototype.tap = util.deprecate(function tap(key, options, fn) {
 | |
| 	return this.for(key).tap(options, fn);
 | |
| }, "HookMap#tap(key,…) is deprecated. Use HookMap#for(key).tap(…) instead.");
 | |
| 
 | |
| HookMap.prototype.tapAsync = util.deprecate(function tapAsync(
 | |
| 	key,
 | |
| 	options,
 | |
| 	fn
 | |
| ) {
 | |
| 	return this.for(key).tapAsync(options, fn);
 | |
| }, "HookMap#tapAsync(key,…) is deprecated. Use HookMap#for(key).tapAsync(…) instead.");
 | |
| 
 | |
| HookMap.prototype.tapPromise = util.deprecate(function tapPromise(
 | |
| 	key,
 | |
| 	options,
 | |
| 	fn
 | |
| ) {
 | |
| 	return this.for(key).tapPromise(options, fn);
 | |
| }, "HookMap#tapPromise(key,…) is deprecated. Use HookMap#for(key).tapPromise(…) instead.");
 | |
| 
 | |
| module.exports = HookMap;
 |