aboutsummaryrefslogtreecommitdiff
path: root/node_modules/webpack-chain/src/Plugin.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/webpack-chain/src/Plugin.js')
-rw-r--r--node_modules/webpack-chain/src/Plugin.js71
1 files changed, 71 insertions, 0 deletions
diff --git a/node_modules/webpack-chain/src/Plugin.js b/node_modules/webpack-chain/src/Plugin.js
new file mode 100644
index 00000000..418b32d4
--- /dev/null
+++ b/node_modules/webpack-chain/src/Plugin.js
@@ -0,0 +1,71 @@
+const ChainedMap = require('./ChainedMap');
+const Orderable = require('./Orderable');
+
+module.exports = Orderable(
+ class extends ChainedMap {
+ constructor(parent, name) {
+ super(parent);
+ this.name = name;
+ this.extend(['init']);
+
+ this.init((Plugin, args = []) => {
+ if (typeof Plugin === 'function') {
+ return new Plugin(...args);
+ }
+ return Plugin;
+ });
+ }
+
+ use(plugin, args = []) {
+ return this.set('plugin', plugin).set('args', args);
+ }
+
+ tap(f) {
+ this.set('args', f(this.get('args') || []));
+ return this;
+ }
+
+ merge(obj, omit = []) {
+ if ('plugin' in obj) {
+ this.set('plugin', obj.plugin);
+ }
+
+ if ('args' in obj) {
+ this.set('args', obj.args);
+ }
+
+ return super.merge(obj, [...omit, 'args', 'plugin']);
+ }
+
+ toConfig() {
+ const init = this.get('init');
+ let plugin = this.get('plugin');
+ const args = this.get('args');
+ let pluginPath = null;
+
+ // Support using the path to a plugin rather than the plugin itself,
+ // allowing expensive require()s to be skipped in cases where the plugin
+ // or webpack configuration won't end up being used.
+ if (typeof plugin === 'string') {
+ pluginPath = plugin;
+ // eslint-disable-next-line global-require, import/no-dynamic-require
+ plugin = require(pluginPath);
+ }
+
+ const constructorName = plugin.__expression
+ ? `(${plugin.__expression})`
+ : plugin.name;
+
+ const config = init(plugin, args);
+
+ Object.defineProperties(config, {
+ __pluginName: { value: this.name },
+ __pluginArgs: { value: args },
+ __pluginConstructorName: { value: constructorName },
+ __pluginPath: { value: pluginPath },
+ });
+
+ return config;
+ }
+ }
+);