mirror of https://github.com/webpack/webpack.git
Merge pull request #6079 from ooflorent/mock_hooks
Improve `PluginEnvironment` helper to support tapable's hooks
This commit is contained in:
commit
dc7460f9a5
|
|
@ -1,14 +1,48 @@
|
|||
module.exports = function PluginEnvironment() {
|
||||
var events = [];
|
||||
const events = [];
|
||||
|
||||
function addEvent(name, handler) {
|
||||
events.push({
|
||||
name,
|
||||
handler
|
||||
});
|
||||
}
|
||||
|
||||
function getEventName(hookName) {
|
||||
// Convert a hook name to an event name.
|
||||
// e.g. `buildModule` -> `build-module`
|
||||
return hookName.replace(/[A-Z]/g, c => "-" + c.toLowerCase());
|
||||
}
|
||||
|
||||
this.getEnvironmentStub = function() {
|
||||
const hooks = new Map();
|
||||
return {
|
||||
plugin: function(name, handler) {
|
||||
events.push({
|
||||
name,
|
||||
handler
|
||||
});
|
||||
}
|
||||
plugin: addEvent,
|
||||
// TODO: Figure out a better way of doing this
|
||||
// In the meanwhile, `hooks` is a `Proxy` which creates fake hooks
|
||||
// on demand. Instead of creating a dummy object with a few `Hook`
|
||||
// method, a custom `Hook` class could be used.
|
||||
hooks: new Proxy({}, {
|
||||
get(target, hookName) {
|
||||
let hook = hooks.get(hookName);
|
||||
if (hook === undefined) {
|
||||
const eventName = getEventName(hookName);
|
||||
hook = {
|
||||
tap(_, handler) {
|
||||
addEvent(eventName, handler);
|
||||
},
|
||||
tapAsync(_, handler) {
|
||||
addEvent(eventName, handler);
|
||||
},
|
||||
tapPromise(_, handler) {
|
||||
addEvent(eventName, handler);
|
||||
}
|
||||
};
|
||||
hooks.set(hookName, hook);
|
||||
}
|
||||
return hook;
|
||||
}
|
||||
})
|
||||
};
|
||||
};
|
||||
|
||||
|
|
|
|||
Loading…
Reference in New Issue