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.
61 lines
1.5 KiB
61 lines
1.5 KiB
/* |
|
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;
|
|
|