| /* |
| 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(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(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(key, options, fn) { |
| return this.for(key).tapPromise(options, fn); |
| }, "HookMap#tapPromise(key,…) is deprecated. Use HookMap#for(key).tapPromise(…) instead."); |
| |
| module.exports = HookMap; |