/* MIT License http://www.opensource.org/licenses/mit-license.php Author Naoyuki Kanezawa @nkzawa */ "use strict"; const MultiEntryDependency = require("./dependencies/MultiEntryDependency"); const SingleEntryDependency = require("./dependencies/SingleEntryDependency"); const MultiModuleFactory = require("./MultiModuleFactory"); const MultiEntryPlugin = require("./MultiEntryPlugin"); const SingleEntryPlugin = require("./SingleEntryPlugin"); /** @typedef {import("../declarations/WebpackOptions").EntryDynamic} EntryDynamic */ /** @typedef {import("../declarations/WebpackOptions").EntryStatic} EntryStatic */ /** @typedef {import("./Compiler")} Compiler */ class DynamicEntryPlugin { /** * @param {string} context the context path * @param {EntryDynamic} entry the entry value */ constructor(context, entry) { this.context = context; this.entry = entry; } /** * @param {Compiler} compiler the compiler instance * @returns {void} */ apply(compiler) { compiler.hooks.compilation.tap( "DynamicEntryPlugin", (compilation, { normalModuleFactory }) => { const multiModuleFactory = new MultiModuleFactory(); compilation.dependencyFactories.set( MultiEntryDependency, multiModuleFactory ); compilation.dependencyFactories.set( SingleEntryDependency, normalModuleFactory ); } ); compiler.hooks.make.tapAsync( "DynamicEntryPlugin", (compilation, callback) => { /** * @param {string|string[]} entry entry value or array of entry values * @param {string} name name of entry * @returns {Promise<EntryStatic>} returns the promise resolving the Compilation#addEntry function */ const addEntry = (entry, name) => { const dep = DynamicEntryPlugin.createDependency(entry, name); return new Promise((resolve, reject) => { compilation.addEntry(this.context, dep, name, err => { if (err) return reject(err); resolve(); }); }); }; Promise.resolve(this.entry()).then(entry => { if (typeof entry === "string" || Array.isArray(entry)) { addEntry(entry, "main").then(() => callback(), callback); } else if (typeof entry === "object") { Promise.all( Object.keys(entry).map(name => { return addEntry(entry[name], name); }) ).then(() => callback(), callback); } }); } ); } } module.exports = DynamicEntryPlugin; /** * @param {string|string[]} entry entry value or array of entry paths * @param {string} name name of entry * @returns {SingleEntryDependency|MultiEntryDependency} returns dep */ DynamicEntryPlugin.createDependency = (entry, name) => { if (Array.isArray(entry)) { return MultiEntryPlugin.createDependency(entry, name); } else { return SingleEntryPlugin.createDependency(entry, name); } };