RequireIncludeDependencyParserPlugin.js 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  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("../errors/WebpackError");
  7. const {
  8. evaluateToString,
  9. toConstantDependency
  10. } = require("../javascript/JavascriptParserHelpers");
  11. const makeSerializable = require("../util/makeSerializable");
  12. const RequireIncludeDependency = require("./RequireIncludeDependency");
  13. /** @import { DependencyLocation } from "../Dependency" */
  14. /** @import JavascriptParser, { Range } from "../javascript/JavascriptParser" */
  15. const PLUGIN_NAME = "RequireIncludeDependencyParserPlugin";
  16. module.exports = class RequireIncludeDependencyParserPlugin {
  17. /**
  18. * Creates an instance of RequireIncludeDependencyParserPlugin.
  19. * @param {boolean} warn true: warn about deprecation, false: don't warn
  20. */
  21. constructor(warn) {
  22. /** @type {boolean} */
  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(parser.getLocation(expr))
  39. );
  40. }
  41. const dep = new RequireIncludeDependency(
  42. /** @type {string} */ (param.string),
  43. /** @type {Range} */ (expr.range)
  44. );
  45. dep.loc = parser.getLocation(expr);
  46. parser.state.current.addDependency(dep);
  47. return true;
  48. });
  49. parser.hooks.evaluateTypeof
  50. .for("require.include")
  51. .tap(PLUGIN_NAME, (expr) => {
  52. if (warn) {
  53. parser.state.module.addWarning(
  54. new RequireIncludeDeprecationWarning(parser.getLocation(expr))
  55. );
  56. }
  57. return evaluateToString("function")(expr);
  58. });
  59. parser.hooks.typeof.for("require.include").tap(PLUGIN_NAME, (expr) => {
  60. if (warn) {
  61. parser.state.module.addWarning(
  62. new RequireIncludeDeprecationWarning(parser.getLocation(expr))
  63. );
  64. }
  65. return toConstantDependency(parser, JSON.stringify("function"))(expr);
  66. });
  67. }
  68. };
  69. class RequireIncludeDeprecationWarning extends WebpackError {
  70. /**
  71. * Creates an instance of RequireIncludeDeprecationWarning.
  72. * @param {DependencyLocation} loc location
  73. */
  74. constructor(loc) {
  75. super("require.include() is deprecated and will be removed soon.");
  76. /** @type {string} */
  77. this.name = "RequireIncludeDeprecationWarning";
  78. /** @type {DependencyLocation} */
  79. this.loc = loc;
  80. }
  81. }
  82. makeSerializable(
  83. RequireIncludeDeprecationWarning,
  84. "webpack/lib/dependencies/RequireIncludeDependencyParserPlugin",
  85. "RequireIncludeDeprecationWarning"
  86. );