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