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.
		
		
		
		
			
				
					82 lines
				
				2.0 KiB
			
		
		
			
		
	
	
					82 lines
				
				2.0 KiB
			| 
								 
											4 years ago
										 
									 | 
							
								/*
							 | 
						||
| 
								 | 
							
									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");
							 |