RequireIncludeDependencyParserPlugin.js 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Tobias Koppers @sokra
  4. */
  5. "use strict";
  6. const WebpackError = require("../WebpackError");
  7. const {
  8. evaluateToString,
  9. toConstantDependency
  10. } = require("../javascript/JavascriptParserHelpers");
  11. const makeSerializable = require("../util/makeSerializable");
  12. const RequireIncludeDependency = require("./RequireIncludeDependency");
  13. /** @typedef {import("../Dependency").DependencyLocation} DependencyLocation */
  14. /** @typedef {import("../javascript/JavascriptParser")} JavascriptParser */
  15. /** @typedef {import("../javascript/JavascriptParser").Range} Range */
  16. const PLUGIN_NAME = "RequireIncludeDependencyParserPlugin";
  17. module.exports = class RequireIncludeDependencyParserPlugin {
  18. /**
  19. * Creates an instance of RequireIncludeDependencyParserPlugin.
  20. * @param {boolean} warn true: warn about deprecation, false: don't warn
  21. */
  22. constructor(warn) {
  23. this.warn = warn;
  24. }
  25. /**
  26. * Applies the plugin by registering its hooks on the compiler.
  27. * @param {JavascriptParser} parser the parser
  28. * @returns {void}
  29. */
  30. apply(parser) {
  31. const { warn } = this;
  32. parser.hooks.call.for("require.include").tap(PLUGIN_NAME, (expr) => {
  33. if (expr.arguments.length !== 1) return;
  34. const param = parser.evaluateExpression(expr.arguments[0]);
  35. if (!param.isString()) return;
  36. if (warn) {
  37. parser.state.module.addWarning(
  38. new RequireIncludeDeprecationWarning(
  39. /** @type {DependencyLocation} */
  40. (expr.loc)
  41. )
  42. );
  43. }
  44. const dep = new RequireIncludeDependency(
  45. /** @type {string} */ (param.string),
  46. /** @type {Range} */ (expr.range)
  47. );
  48. dep.loc = /** @type {DependencyLocation} */ (expr.loc);
  49. parser.state.current.addDependency(dep);
  50. return true;
  51. });
  52. parser.hooks.evaluateTypeof
  53. .for("require.include")
  54. .tap(PLUGIN_NAME, (expr) => {
  55. if (warn) {
  56. parser.state.module.addWarning(
  57. new RequireIncludeDeprecationWarning(
  58. /** @type {DependencyLocation} */ (expr.loc)
  59. )
  60. );
  61. }
  62. return evaluateToString("function")(expr);
  63. });
  64. parser.hooks.typeof.for("require.include").tap(PLUGIN_NAME, (expr) => {
  65. if (warn) {
  66. parser.state.module.addWarning(
  67. new RequireIncludeDeprecationWarning(
  68. /** @type {DependencyLocation} */ (expr.loc)
  69. )
  70. );
  71. }
  72. return toConstantDependency(parser, JSON.stringify("function"))(expr);
  73. });
  74. }
  75. };
  76. class RequireIncludeDeprecationWarning extends WebpackError {
  77. /**
  78. * Creates an instance of RequireIncludeDeprecationWarning.
  79. * @param {DependencyLocation} loc location
  80. */
  81. constructor(loc) {
  82. super("require.include() is deprecated and will be removed soon.");
  83. this.name = "RequireIncludeDeprecationWarning";
  84. this.loc = loc;
  85. }
  86. }
  87. makeSerializable(
  88. RequireIncludeDeprecationWarning,
  89. "webpack/lib/dependencies/RequireIncludeDependencyParserPlugin",
  90. "RequireIncludeDeprecationWarning"
  91. );