56 lines
1.3 KiB
JavaScript
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;
|
|
};
|
|
};
|