Merge pull request #6079 from ooflorent/mock_hooks

Improve `PluginEnvironment` helper to support tapable's hooks
This commit is contained in:
Tobias Koppers 2017-12-07 09:22:27 +01:00 committed by GitHub
commit dc7460f9a5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 41 additions and 7 deletions

View File

@ -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;
}
})
};
};