webpack/test/helpers/PluginEnvironment.js

56 lines
1.3 KiB
JavaScript

module.exports = function PluginEnvironment() {
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: 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;
}
}
)
};
};
this.getEventBindings = function () {
return events;
};
};