DynamicEntryPlugin.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Naoyuki Kanezawa @nkzawa
  4. */
  5. "use strict";
  6. const MultiEntryDependency = require("./dependencies/MultiEntryDependency");
  7. const SingleEntryDependency = require("./dependencies/SingleEntryDependency");
  8. const MultiModuleFactory = require("./MultiModuleFactory");
  9. const MultiEntryPlugin = require("./MultiEntryPlugin");
  10. const SingleEntryPlugin = require("./SingleEntryPlugin");
  11. /** @typedef {import("./Compiler")} Compiler */
  12. /** @typedef {import("./Compiler").EntryOptionValuesFunction} EntryOptionValuesFunction */
  13. class DynamicEntryPlugin {
  14. /**
  15. * @param {string} context the context path
  16. * @param {EntryOptionValuesFunction} entry the entry value
  17. */
  18. constructor(context, entry) {
  19. this.context = context;
  20. this.entry = entry;
  21. }
  22. /**
  23. * @param {Compiler} compiler the compiler instance
  24. * @returns {void}
  25. */
  26. apply(compiler) {
  27. compiler.hooks.compilation.tap(
  28. "DynamicEntryPlugin",
  29. (compilation, { normalModuleFactory }) => {
  30. const multiModuleFactory = new MultiModuleFactory();
  31. compilation.dependencyFactories.set(
  32. MultiEntryDependency,
  33. multiModuleFactory
  34. );
  35. compilation.dependencyFactories.set(
  36. SingleEntryDependency,
  37. normalModuleFactory
  38. );
  39. }
  40. );
  41. compiler.hooks.make.tapAsync(
  42. "DynamicEntryPlugin",
  43. (compilation, callback) => {
  44. /**
  45. * @param {string|string[]} entry entry value or array of entry values
  46. * @param {string} name name of entry
  47. * @returns {Promise<any>} returns the promise resolving the Compilation#addEntry function
  48. */
  49. const addEntry = (entry, name) => {
  50. const dep = DynamicEntryPlugin.createDependency(entry, name);
  51. return new Promise((resolve, reject) => {
  52. compilation.addEntry(this.context, dep, name, err => {
  53. if (err) return reject(err);
  54. resolve();
  55. });
  56. });
  57. };
  58. Promise.resolve(this.entry()).then(entry => {
  59. if (typeof entry === "string" || Array.isArray(entry)) {
  60. addEntry(entry, "main").then(() => callback(), callback);
  61. } else if (typeof entry === "object") {
  62. Promise.all(
  63. Object.keys(entry).map(name => {
  64. return addEntry(entry[name], name);
  65. })
  66. ).then(() => callback(), callback);
  67. }
  68. });
  69. }
  70. );
  71. }
  72. }
  73. module.exports = DynamicEntryPlugin;
  74. /**
  75. * @param {string|string[]} entry entry value or array of entry paths
  76. * @param {string} name name of entry
  77. * @returns {SingleEntryDependency|MultiEntryDependency} returns dep
  78. */
  79. DynamicEntryPlugin.createDependency = (entry, name) => {
  80. if (Array.isArray(entry)) {
  81. return MultiEntryPlugin.createDependency(entry, name);
  82. } else {
  83. return SingleEntryPlugin.createDependency(entry, name);
  84. }
  85. };