webpack/test/helpers/PluginEnvironment.js

69 lines
1.5 KiB
JavaScript
Raw Normal View History

"use strict";
module.exports = function PluginEnvironment() {
2025-04-22 20:42:33 +08:00
/**
* @type {{ name: string, handler: EXPECTED_FUNCTION }[]}
*/
const events = [];
2025-04-22 20:42:33 +08:00
/**
* @param {string} name the name
* @param {EXPECTED_FUNCTION} handler the handler
*/
function addEvent(name, handler) {
events.push({
name,
handler
});
}
2025-04-22 20:42:33 +08:00
/**
* @param {string} hookName a hook name
* @returns {string} an event name
*/
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()}`);
}
2025-07-03 17:06:45 +08:00
this.getEnvironmentStub = function getEnvironmentStub() {
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.
2019-08-22 19:26:45 +08:00
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;
}
}
2019-08-22 19:26:45 +08:00
)
};
};
2025-07-03 17:06:45 +08:00
this.getEventBindings = function getEventBindings() {
return events;
};
};