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