You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							81 lines
						
					
					
						
							2.0 KiB
						
					
					
				
			
		
		
	
	
							81 lines
						
					
					
						
							2.0 KiB
						
					
					
				/* | 
						|
	MIT License http://www.opensource.org/licenses/mit-license.php | 
						|
	Author Tobias Koppers @sokra | 
						|
*/ | 
						|
"use strict"; | 
						|
 | 
						|
const util = require("util"); | 
						|
const SyncBailHook = require("./SyncBailHook"); | 
						|
 | 
						|
function Tapable() { | 
						|
	this._pluginCompat = new SyncBailHook(["options"]); | 
						|
	this._pluginCompat.tap( | 
						|
		{ | 
						|
			name: "Tapable camelCase", | 
						|
			stage: 100 | 
						|
		}, | 
						|
		options => { | 
						|
			options.names.add( | 
						|
				options.name.replace(/[- ]([a-z])/g, (str, ch) => ch.toUpperCase()) | 
						|
			); | 
						|
		} | 
						|
	); | 
						|
	this._pluginCompat.tap( | 
						|
		{ | 
						|
			name: "Tapable this.hooks", | 
						|
			stage: 200 | 
						|
		}, | 
						|
		options => { | 
						|
			let hook; | 
						|
			for (const name of options.names) { | 
						|
				hook = this.hooks[name]; | 
						|
				if (hook !== undefined) { | 
						|
					break; | 
						|
				} | 
						|
			} | 
						|
			if (hook !== undefined) { | 
						|
				const tapOpt = { | 
						|
					name: options.fn.name || "unnamed compat plugin", | 
						|
					stage: options.stage || 0 | 
						|
				}; | 
						|
				if (options.async) hook.tapAsync(tapOpt, options.fn); | 
						|
				else hook.tap(tapOpt, options.fn); | 
						|
				return true; | 
						|
			} | 
						|
		} | 
						|
	); | 
						|
} | 
						|
module.exports = Tapable; | 
						|
 | 
						|
Tapable.addCompatLayer = function addCompatLayer(instance) { | 
						|
	Tapable.call(instance); | 
						|
	instance.plugin = Tapable.prototype.plugin; | 
						|
	instance.apply = Tapable.prototype.apply; | 
						|
}; | 
						|
 | 
						|
Tapable.prototype.plugin = util.deprecate(function plugin(name, fn) { | 
						|
	if (Array.isArray(name)) { | 
						|
		name.forEach(function(name) { | 
						|
			this.plugin(name, fn); | 
						|
		}, this); | 
						|
		return; | 
						|
	} | 
						|
	const result = this._pluginCompat.call({ | 
						|
		name: name, | 
						|
		fn: fn, | 
						|
		names: new Set([name]) | 
						|
	}); | 
						|
	if (!result) { | 
						|
		throw new Error( | 
						|
			`Plugin could not be registered at '${name}'. Hook was not found.\n` + | 
						|
				"BREAKING CHANGE: There need to exist a hook at 'this.hooks'. " + | 
						|
				"To create a compatibility layer for this hook, hook into 'this._pluginCompat'." | 
						|
		); | 
						|
	} | 
						|
}, "Tapable.plugin is deprecated. Use new API on `.hooks` instead"); | 
						|
 | 
						|
Tapable.prototype.apply = util.deprecate(function apply() { | 
						|
	for (var i = 0; i < arguments.length; i++) { | 
						|
		arguments[i].apply(this); | 
						|
	} | 
						|
}, "Tapable.apply is deprecated. Call apply on the plugin directly instead");
 | 
						|
 |