RequireHeaderDependency.js 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Tobias Koppers @sokra
  4. */
  5. "use strict";
  6. const RuntimeGlobals = require("../RuntimeGlobals");
  7. const makeSerializable = require("../util/makeSerializable");
  8. const HarmonyImportGuard = require("./HarmonyImportGuard");
  9. const NullDependency = require("./NullDependency");
  10. /** @import { ReplaceSource } from "webpack-sources" */
  11. /** @import Dependency from "../Dependency" */
  12. /** @import { DependencyTemplateContext } from "../DependencyTemplate" */
  13. /** @import { Range } from "../javascript/JavascriptParser" */
  14. /** @import CommonJsRequireDependency from "./CommonJsRequireDependency" */
  15. /** @typedef {import("../serialization/ObjectMiddleware").ObjectDeserializerContext<[Range, CommonJsRequireDependency | undefined]>} ObjectDeserializerContext */
  16. /** @typedef {import("../serialization/ObjectMiddleware").ObjectSerializerContext<[Range, CommonJsRequireDependency | undefined]>} ObjectSerializerContext */
  17. class RequireHeaderDependency extends NullDependency {
  18. /**
  19. * Creates an instance of RequireHeaderDependency.
  20. * @param {Range} range range of the `require` callee
  21. * @param {CommonJsRequireDependency=} requireDependency paired require dep (unset for conditional `require(a ? b : c)`)
  22. */
  23. constructor(range, requireDependency) {
  24. super();
  25. if (!Array.isArray(range)) throw new Error("range must be valid");
  26. this.range = range;
  27. /** @type {CommonJsRequireDependency | undefined} */
  28. this.requireDependency = requireDependency;
  29. }
  30. /**
  31. * Serializes this instance into the provided serializer context.
  32. * @param {ObjectSerializerContext} context context
  33. */
  34. serialize(context) {
  35. context.write(this.range).write(this.requireDependency);
  36. super.serialize(context);
  37. }
  38. /**
  39. * Restores this instance from the provided deserializer context.
  40. * @param {ObjectDeserializerContext} context context
  41. * @returns {RequireHeaderDependency} RequireHeaderDependency
  42. */
  43. static deserialize(context) {
  44. const range = context.read();
  45. const c1 = context.rest;
  46. const obj = new RequireHeaderDependency(range, c1.read());
  47. obj.deserialize(c1.rest);
  48. return obj;
  49. }
  50. }
  51. makeSerializable(
  52. RequireHeaderDependency,
  53. "webpack/lib/dependencies/RequireHeaderDependency"
  54. );
  55. RequireHeaderDependency.Template = class RequireHeaderDependencyTemplate extends (
  56. NullDependency.Template
  57. ) {
  58. /**
  59. * Applies the plugin by registering its hooks on the compiler.
  60. * @param {Dependency} dependency the dependency for which the template should be applied
  61. * @param {ReplaceSource} source the current replace source which can be modified
  62. * @param {DependencyTemplateContext} templateContext the context object
  63. * @returns {void}
  64. */
  65. apply(
  66. dependency,
  67. source,
  68. { moduleGraph, runtime, runtimeRequirements, concatenationScope }
  69. ) {
  70. const dep = /** @type {RequireHeaderDependency} */ (dependency);
  71. // the paired require dependency already replaced the whole call
  72. if (
  73. concatenationScope !== undefined &&
  74. concatenationScope.isInsideReplacedRequire(dep.range[0])
  75. ) {
  76. return;
  77. }
  78. const requireDep = dep.requireDependency;
  79. // Skip when the paired call became `0`; dead-branch still needs the header.
  80. if (requireDep) {
  81. const connection = moduleGraph.getConnection(requireDep);
  82. if (
  83. connection &&
  84. !connection.isTargetActive(runtime) &&
  85. requireDep.isEvaluationOnly()
  86. ) {
  87. const guards = requireDep.branchGuards;
  88. if (
  89. guards === undefined ||
  90. !HarmonyImportGuard.isDeadByGuards(guards, moduleGraph, runtime)
  91. ) {
  92. return;
  93. }
  94. }
  95. }
  96. runtimeRequirements.add(RuntimeGlobals.require);
  97. source.replace(dep.range[0], dep.range[1] - 1, RuntimeGlobals.require);
  98. }
  99. };
  100. module.exports = RequireHeaderDependency;