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