12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273 |
- /*
- 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 => str.substr(1).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 compatiblity 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");
|