| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 | /*	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");
 |