mirror of https://github.com/webpack/webpack.git
				
				
				
			
		
			
				
	
	
		
			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;
 | |
| 	};
 | |
| };
 |