RequireIncludeDependencyParserPlugin.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  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. * @param {boolean} warn true: warn about deprecation, false: don't warn
  20. */
  21. constructor(warn) {
  22. this.warn = warn;
  23. }
  24. /**
  25. * @param {JavascriptParser} parser the parser
  26. * @returns {void}
  27. */
  28. apply(parser) {
  29. const { warn } = this;
  30. parser.hooks.call.for("require.include").tap(PLUGIN_NAME, expr => {
  31. if (expr.arguments.length !== 1) return;
  32. const param = parser.evaluateExpression(expr.arguments[0]);
  33. if (!param.isString()) return;
  34. if (warn) {
  35. parser.state.module.addWarning(
  36. new RequireIncludeDeprecationWarning(
  37. /** @type {DependencyLocation} */
  38. (expr.loc)
  39. )
  40. );
  41. }
  42. const dep = new RequireIncludeDependency(
  43. /** @type {string} */ (param.string),
  44. /** @type {Range} */ (expr.range)
  45. );
  46. dep.loc = /** @type {DependencyLocation} */ (expr.loc);
  47. parser.state.current.addDependency(dep);
  48. return true;
  49. });
  50. parser.hooks.evaluateTypeof
  51. .for("require.include")
  52. .tap(PLUGIN_NAME, expr => {
  53. if (warn) {
  54. parser.state.module.addWarning(
  55. new RequireIncludeDeprecationWarning(
  56. /** @type {DependencyLocation} */ (expr.loc)
  57. )
  58. );
  59. }
  60. return evaluateToString("function")(expr);
  61. });
  62. parser.hooks.typeof.for("require.include").tap(PLUGIN_NAME, expr => {
  63. if (warn) {
  64. parser.state.module.addWarning(
  65. new RequireIncludeDeprecationWarning(
  66. /** @type {DependencyLocation} */ (expr.loc)
  67. )
  68. );
  69. }
  70. return toConstantDependency(parser, JSON.stringify("function"))(expr);
  71. });
  72. }
  73. };
  74. class RequireIncludeDeprecationWarning extends WebpackError {
  75. /**
  76. * @param {DependencyLocation} loc location
  77. */
  78. constructor(loc) {
  79. super("require.include() is deprecated and will be removed soon.");
  80. this.name = "RequireIncludeDeprecationWarning";
  81. this.loc = loc;
  82. }
  83. }
  84. makeSerializable(
  85. RequireIncludeDeprecationWarning,
  86. "webpack/lib/dependencies/RequireIncludeDependencyParserPlugin",
  87. "RequireIncludeDeprecationWarning"
  88. );