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;
 |