RequireContextDependencyParserPlugin.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768
  1. /*
  2. MIT License http://www.opensource.org/licenses/mit-license.php
  3. Author Tobias Koppers @sokra
  4. */
  5. "use strict";
  6. const RequireContextDependency = require("./RequireContextDependency");
  7. /** @import { ContextMode } from "../ContextModule" */
  8. /** @import JavascriptParser, { Range } from "../javascript/JavascriptParser" */
  9. const PLUGIN_NAME = "RequireContextDependencyParserPlugin";
  10. module.exports = class RequireContextDependencyParserPlugin {
  11. /**
  12. * Applies the plugin by registering its hooks on the compiler.
  13. * @param {JavascriptParser} parser the parser
  14. * @returns {void}
  15. */
  16. apply(parser) {
  17. parser.hooks.call.for("require.context").tap(PLUGIN_NAME, (expr) => {
  18. let regExp = /^\.\/.*$/;
  19. let recursive = true;
  20. /** @type {ContextMode} */
  21. let mode = "sync";
  22. switch (expr.arguments.length) {
  23. case 4: {
  24. const modeExpr = parser.evaluateExpression(expr.arguments[3]);
  25. if (!modeExpr.isString()) return;
  26. mode = /** @type {ContextMode} */ (modeExpr.string);
  27. }
  28. // falls through
  29. case 3: {
  30. const regExpExpr = parser.evaluateExpression(expr.arguments[2]);
  31. if (!regExpExpr.isRegExp()) return;
  32. regExp = /** @type {RegExp} */ (regExpExpr.regExp);
  33. }
  34. // falls through
  35. case 2: {
  36. const recursiveExpr = parser.evaluateExpression(expr.arguments[1]);
  37. if (!recursiveExpr.isBoolean()) return;
  38. recursive = /** @type {boolean} */ (recursiveExpr.bool);
  39. }
  40. // falls through
  41. case 1: {
  42. const requestExpr = parser.evaluateExpression(expr.arguments[0]);
  43. if (!requestExpr.isString()) return;
  44. const dep = new RequireContextDependency(
  45. {
  46. request: /** @type {string} */ (requestExpr.string),
  47. recursive,
  48. regExp,
  49. mode,
  50. category: "commonjs"
  51. },
  52. /** @type {Range} */
  53. (expr.range)
  54. );
  55. dep.loc = parser.getLocation(expr);
  56. dep.optional = Boolean(parser.scope.inTry);
  57. parser.state.current.addDependency(dep);
  58. return true;
  59. }
  60. }
  61. });
  62. }
  63. };